Advertisement
Guest User

Untitled

a guest
Nov 25th, 2014
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 81.48 KB | None | 0 0
  1. @@ CSYS CODE
  2.  
  3. @switch/inline isdbref(u(csc))=0,{@tel create(Combat System Configurator <CSC>)=config(master_room)}
  4. &csc u(coi)=locate(config(master_room),Combat System Configurator <CSC>,TXxi)
  5. @parent u(csc)=u(coi)
  6. @set u(csc)=WIZARD !NO_COMMAND SAFE
  7. @lock/Command u(csc)=@[u(sgo)]/Command
  8.  
  9. @switch/inline isdbref(u(csdb))=0,{@tel create(Combat System Database <CSDB>)=u(csc)}
  10. &csdb u(coi)=locate(u(csc),Combat System Database <CSDB>,TXxi)
  11. @parent u(csdb)=u(coi)
  12. @set u(csdb)=WIZARD !NO_COMMAND SAFE
  13. @power u(csdb)=many_attribs
  14.  
  15. &VAR`MSGHEAD u(csc)=CSYSEDIT
  16. &RFN`HEADER u(csc)=header(%0,,CSYSEDIT`BORDER,CSYSEDIT`BORDERDOT,CSYSEDIT`BORDERTEXT)
  17. &RFN`SUBHEADER u(csc)=subheader(%0,,CSYSEDIT`BORDER,CSYSEDIT`BORDERDOT,CSYSEDIT`BORDERTEXT)
  18.  
  19. &MAINDB u(csc)=u(csdb)
  20.  
  21. @@ ******** Validation
  22. @@ %0 = data, %1 = target, %2 = attribute
  23.  
  24. &VAL`FORMSLOT u(csc)=@assert regmatchi(trim(%0),^(\\d+|\[a-z\])$)=@nspemit %#=msghead(v(VAR`MSGHEAD)) ERROR: Forms must be addressed by a positive integer value or single alphabetical character.;th setq(return,trim(%0))
  25. &VAL`FORMNAME u(csc)=th setq(return,trim(%0))
  26. &VAL`STAT u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: No stat entered.};@include u(ccs)/INC`PARTIAL=before(%0,=),u(RET`STATLIST),|,v(VAR`MSGHEAD),stat,stat;th setq(statnum,u(RET`STATNUM,%q<stat>))
  27. &VAL`STATNUM u(csc)=@assert isint(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Stats must be Integers!};th setq(return,abs(trim(%0)))
  28. &VAL`POINT u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: No stat entered.};@include u(ccs)/INC`PARTIAL=before(%0,=),u(RET`POILIST),|,v(VAR`MSGHEAD),point,point;th setq(pointnum,u(RET`POINUM,%q<point>))
  29. &VAL`CLASS u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: No class entered.};@include u(ccs)/INC`PARTIAL=%0,u(RET`CLALIST),|,v(VAR`MSGHEAD),class,class;th setq(clanum,u(RET`CLANUM,%q<class>))
  30. &VAL`ATKSLOT u(csc)=@assert valnum(setr(slot,add(%0,0)))=@include u(csc)/INC`PMSG=%#,{ERROR: Slot not entered or invalid. Must be a whole positive number!}
  31. &VAL`ATKNAME u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Attack requires a name!};th setq(return,trim(%0))
  32. &VAL`ATKPOWER u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Power level required!};@assert isint(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Power Level must be an integer!};th setq(return,abs(trim(%0)))
  33. &VAL`ATKACC u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Accuracy required!};@assert isint(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Accuracy must be an integer!};th setq(return,abs(trim(%0)))
  34. &VAL`ATKTYPE u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Type empty!};@include u(ccs)/INC`PARTIAL=%0,u(RET`TYPLIST),|,v(VAR`MSGHEAD),type,type;th setq(typnum,u(RET`TYPNUM,%q<type>))
  35. &VAL`ELEMENT u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Element empty!};@include u(ccs)/INC`PARTIAL=%0,u(RET`ELELIST),|,v(VAR`MSGHEAD),element,element;th setq(elenum,u(RET`ELENUM,%q<element>))
  36. &VAL`ELEMENT`LIST u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Element list empty!};@dolist/inline %0={@include u(csc)/VAL`ELEMENT=%i0;th setq(elelist,trim(cat(%q<elelist>,%q<element>)),elenumlist,trim(cat(%q<elenumlist>,%q<elenum>)))}
  37.  
  38. &VAL`ATKSTRING u(csc)=@include u(csc)/VAL`ATKNAME=elements(%0,1,/);th setq(atkname,%q<return>);@include u(csc)/VAL`ATKTYPE=elements(%0,2,/);th setq(atktype,%q<typnum>);@include u(csc)/VAL`ELEMENT`LIST=elements(%0,3,/);th setq(atkele,%q<elenumlist>);@include u(csc)/VAL`ATKPOWER=elements(%0,4,/);th setq(atkpower,%q<return>);@include u(csc)/VAL`ATKACC=elements(%0,5,/);th setq(atkacc,%q<return>)
  39.  
  40. &VAL`CATEGORY u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Category empty!};@include u(ccs)/INC`PARTIAL=%0,u(RET`CATLIST,%1,|),|,v(VAR`MSGHEAD),category,category;th setq(catnum,u(RET`CATNUM,%q<category>,%1))
  41. &VAL`CATEGORY`LIST u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Category list empty!};@dolist/inline %0={@include u(csc)/VAL`CATEGORY=%i0,%1;th setq(catlist,trim(cat(%q<catlist>,%q<category>)));th setq(catnumlist,trim(cat(%q<catnumlist>,%q<catnum>)))}
  42.  
  43. &VAL`TAG u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Tag empty!};@include u(ccs)/INC`PARTIAL=%0,u(RET`TAGLIST,%1,|),|,v(VAR`MSGHEAD),tag,tag;th setq(tagnum,u(RET`TAGNUM,%q<tag>,%1))
  44. &VAL`TAG`LIST u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Tag list empty!};@dolist/inline %0={@include u(csc)/VAL`TAG=%i0,%1;th setq(taglist,trim(cat(%q<taglist>,%q<tag>)));th setq(tagnumlist,trim(cat(%q<tagnumlist>,%q<tagnum>)))}
  45.  
  46. &VAL`PARASTRING u(csc)=th setq(options,iter(lattr(u(csc)/VAL`PARA`*),last(%i0,`),%b,|));@dolist/inline/delimit , %2={@include u(ccs)/INC`PARTIAL=before(%i0,/),%q<options>,|,v(VAR`MSGHEAD),para,para;@include u(csc)/VAL`PARA`%q<para>=after(%i0,/)}
  47.  
  48. &VAL`PARA`INFLICTS u(csc)=@include u(csc)/DB`SEARCH=elements(%0,1,/),E,1;@assert cor(not(strlen(elements(%0,2,/))),regmatchi(elements(%0,2,/),^(X|\\d+)$))=@include u(csc)/INC`PMSG=%#,{ERROR: Status Effect chance must be blank, an integer, or X.};@switch/inline t(strlen(elements(%0,2,/)))[t(isint(elements(%0,2,/)))]=11,{th setq(return,abs(trim(elements(%0,2,/))))},10,{th setq(return,trim(elements(%0,2,/)))},00,{th setq(return,)}
  49. &VAL`PARA`CLEARS u(csc)=@include u(csc)/VAL`TAG`LIST=elements(%0,1,/),E;@assert cor(not(strlen(elements(%0,2,/))),regmatchi(elements(%0,2,/),^(X|\\d+)$))=@include u(csc)/INC`PMSG=%#,{ERROR: Status Effect chance must be blank, an integer, or X.};@switch/inline t(strlen(elements(%0,2,/)))[t(isint(elements(%0,2,/)))]=11,{th setq(return,abs(trim(elements(%0,2,/))))},10,{th setq(return,trim(elements(%0,2,/)))},00,{th setq(return,)}
  50. &VAL`PARA`PURGES u(csc)=@include u(csc)/VAL`PARA`CLEARS
  51. &VAL`PARA`ADOPTS u(csc)=@include u(csc)/VAL`PARA`INFLICTS
  52. &VAL`PARA`AOE u(csc)=@assert strlen(elements(%0,1,/))=@include u(csc)/INC`PMSG=%#,{ERROR: No AOE value entered.};@assert valnum(elements(%0,1,/))=@include u(csc)/INC`PMSG=%#,{ERROR: AOE must be a positive integer.};th setq(return,abs(trim(elements(%0,1,/))))
  53.  
  54. &VAL`PARA`BUST u(csc)=@include u(csc)/VAL`POINT=elements(%0,1,/);@include u(csc)/VAL`PERSTRING=elements(%0,2,/),BUST
  55. &VAL`PARA`SIPHON u(csc)=@include u(csc)/VAL`POINT=elements(%0,1,/);@include u(csc)/VAL`PERSTRING=elements(%0,2,/),SIPHON
  56.  
  57. &VAL`PARA`REVIVE u(csc)=@include u(csc)/VAL`PERSTRING=elements(%0,1,/),REVIVE
  58. &VAL`PARA`DAMAGE u(csc)=@include u(csc)/VAL`PERSTRING=elements(%0,1,/),DAMAGE
  59. &VAL`PARA`COST u(csc)=@include u(csc)/VAL`POINT=elements(%0,1,/);@include u(csc)/VAL`PERSTRING=elements(%0,2,/),COST
  60.  
  61. &VAL`PERSTRING u(csc)=@assert cor(regmatchi(%0,^(\\d+(:\\d+)?)$),regmatchi(%0,^(\\d+p(:\\d+p)?)$))=@include u(csc)/INC`PMSG=%#,{ERROR: %1 Entry must be in <val>, <valP>, <min>:<max>, or <minP>:<maxP> format.};th setq(return,regeditalli(ucstr(trim(%0)),\\d+,abs($0)))
  62.  
  63. &VAL`EFFPARA u(csc)=th setq(options,iter(lattr(u(csc)/VAL`EFFPARA`*),last(%i0,`),%b,|));@dolist/inline/delimit , %2={@include u(ccs)/INC`PARTIAL=before(%i0,/),%q<options>,|,v(VAR`MSGHEAD),para,para;@include u(csc)/VAL`EFFPARA`%q<para>=after(%i0,/)}
  64.  
  65. &VAL`EFFPARA`STACKABLE u(csc)=@assert cor(not(strlen(%0)),regmatchi(%0,^(X|\\d+)$))=@include u(csc)/INC`PMSG=%#,{ERROR: Stackable must be blank, an integer, or X.};th setq(return,trim(%0))
  66. &VAL`EFFPARA`DURATION u(csc)=@assert cor(not(strlen(%0)),regmatchi(%0,^(X|\\d+)$))=@include u(csc)/INC`PMSG=%#,{ERROR: Duration must be blank, an integer, or X.};th setq(return,trim(%0))
  67. &VAL`EFFPARA`DOT u(csc)=@include u(csc)/VAL`POINT=elements(%0,1,/);@include u(csc)/VAL`PERSTRING=elements(%0,2,/),DOT
  68. &VAL`EFFPARA`REGEN u(csc)=@include u(csc)/VAL`POINT=elements(%0,1,/);@include u(csc)/VAL`PERSTRING=elements(%0,2,/),REGEN
  69. &VAL`EFFPARA`SIPHON u(csc)=@include u(csc)/VAL`POINT=elements(%0,1,/);@include u(csc)/VAL`PERSTRING=elements(%0,2,/),SIPHON
  70. &VAL`EFFPARA`EVAMOD u(csc)=@include u(csc)/VAL`INTMOD=%0,EVAMOD
  71. &VAL`EFFPARA`ACCMOD u(csc)=@include u(csc)/VAL`INTMOD=%0,ACCMOD
  72. &VAL`EFFPARA`STATMOD u(csc)=@include u(csc)/VAL`STAT=elements(%0,1,/);@include u(csc)/VAL`INTMOD=elements(%0,2,/),STATMOD
  73. &VAL`EFFPARA`ELERESMOD u(csc)=@include u(csc)/VAL`ELEMENT=elements(%0,1,/);@include u(csc)/VAL`INTMOD=elements(%0,2,/),ELERESMOD
  74. &VAL`EFFPARA`ELEPOWMOD u(csc)=@include u(csc)/VAL`ELEMENT=elements(%0,1,/);@include u(csc)/VAL`INTMOD=elements(%0,2,/),ELEPOWMOD
  75. &VAL`EFFPARA`COSTMOD u(csc)=@include u(csc)/VAL`INTMOD=%0,COSTMOD
  76. &VAL`EFFPARA`HEALMOD u(csc)=@include u(csc)/VAL`INTMOD=%0,HEALMOD
  77. &VAL`EFFPARA`FORMLOCK u(csc)=@include u(csc)/VAL`INTMOD=%0,FORMLOCK
  78. &VAL`EFFPARA`BACKLASH u(csc)=@include u(csc)/VAL`PERSTRING=%0,BACKLASH
  79. &VAL`EFFPARA`NOCRIT u(csc)=@include u(csc)/VAL`INTMOD=%0,NOCRIT
  80.  
  81. &VAL`INTMOD u(csc)=@assert isint(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: %1 Must be an integer.};th setq(return,trim(%0))
  82.  
  83. @@ ****** ELEMENT SECTION
  84. &ELE`1 u(maindb)=Sword
  85. &ELE`1`COLOR u(maindb)=n
  86. &ELE`2 u(maindb)=Gun
  87. &ELE`2`COLOR u(maindb)=n
  88. &ELE`3 u(maindb)=Force
  89. &ELE`3`COLOR u(maindb)=g
  90. &ELE`4 u(maindb)=Fire
  91. &ELE`4`COLOR u(maindb)=hr
  92. &ELE`5 u(maindb)=Ice
  93. &ELE`5`COLOR u(maindb)=hc
  94. &ELE`6 u(maindb)=Elec
  95. &ELE`6`COLOR u(maindb)=hy
  96. &ELE`7 u(maindb)=Mind
  97. &ELE`7`COLOR u(maindb)=m
  98. &ELE`8 u(maindb)=Expel
  99. &ELE`8`COLOR u(maindb)=hm
  100. &ELE`9 u(maindb)=Death
  101. &ELE`9`COLOR u(maindb)=hx
  102. &ELE`10 u(maindb)=Almighty
  103. &ELE`10`COLOR u(maindb)=hw
  104. &ELE`11 u(maindb)=Heal
  105. &ELE`11`COLOR u(maindb)=hg
  106.  
  107. @@ ******** STAT SECTION
  108. &STA`1 u(maindb)=PHY
  109. &STA`1`FULLNAME u(maindb)=Physical
  110. &STA`2 u(maindb)=END
  111. &STA`2`FULLNAME u(maindb)=Endurance
  112. &STA`3 u(maindb)=MAG
  113. &STA`3`FULLNAME u(maindb)=Magic
  114. &STA`4 u(maindb)=WIL
  115. &STA`4`FULLNAME u(maindb)=Willpower
  116. &STA`5 u(maindb)=AGI
  117. &STA`5`FULLNAME u(maindb)=Agility
  118. &STA`6 u(maindb)=LUK
  119. &STA`6`FULLNAME u(maindb)=Luck
  120.  
  121. @@ ******** ATK TYPE SECTION
  122. &TYP`1 u(maindb)=Physical
  123. &TYP`1`ATK u(maindb)=1
  124. &TYP`1`DEF u(maindb)=2
  125. &TYP`1`ACC u(maindb)=5
  126. &TYP`1`EVA u(maindb)=5
  127. &TYP`2 u(maindb)=Magical
  128. &TYP`2`ATK u(maindb)=3
  129. &TYP`2`DEF u(maindb)=4
  130. &TYP`2`ACC u(maindb)=5
  131. &TYP`2`EVA u(maindb)=5
  132. &TYP`3 u(maindb)=Elemental
  133. &TYP`3`ATK u(maindb)=1 3
  134. &TYP`3`DEF u(maindb)=2 4
  135. &TYP`3`ACC u(maindb)=5
  136. &TYP`3`EVA u(maindb)=5
  137. &TYP`4 u(maindb)=Healing
  138. &TYP`4`ATK u(maindb)=3
  139. &TYP`4`DEF u(maindb)=
  140. &TYP`4`ACC u(maindb)=
  141. &TYP`4`EVA u(maindb)=
  142. &TYP`4`AUTOHIT u(maindb)=1
  143. &TYP`4`HEALING u(maindb)=1
  144. &TYP`4`NOCOUNTER u(maindb)=1
  145. &TYP`5 u(maindb)=Crippling
  146. &TYP`5`ATK u(maindb)=
  147. &TYP`5`DEF u(maindb)=
  148. &TYP`5`ACC u(maindb)=5
  149. &TYP`5`EVA u(maindb)=5
  150. &TYP`5`NODAMAGE u(maindb)=1
  151.  
  152. @@ ******** CLASS SECTION
  153. &CLA`1 u(maindb)=Human
  154. &CLA`2 u(maindb)=Demon
  155. &CLA`3 u(maindb)=Persona User
  156. &CLA`4 u(maindb)=Avatar Tuner
  157. &CLA`5 u(maindb)=Devil Summoner
  158.  
  159. @@ ******** POINTS SECTION
  160. &POI`1 u(maindb)=HP
  161. &POI`1`COLOR u(maindb)=hr
  162. &POI`1`FULLNAME u(maindb)=Hit Points
  163. &POI`1`RESET u(maindb)=1
  164. &POI`2 u(maindb)=SP
  165. &POI`2`COLOR u(maindb)=hb
  166. &POI`2`FULLNAME u(maindb)=Special Points
  167. &POI`2`RESET u(maindb)=0.25
  168.  
  169. @@ ******** Data Retrieval
  170. &RET`FORMNAME u(csc)=switch(%0,u(maindb),default(u(maindb)/F`%1,Unknown Form),strfirstof(get(%0/D`CSYS`FORM`%1),Unset Form))
  171. &RET`FORMNAME`FORMAL u(csc)=Form %1: '[u(RET`FORMNAME,%0,%1)]'
  172.  
  173. &RET`ATKNAME u(csc)=switch(%0,u(maindb),if(gt(%+,2),default(u(maindb)/F`%1`ATK`%2,Unknown Attack),default(u(maindb)/A`%1,Unknown Attack)),strfirstof(get(%0/D`CSYS`FORM`%1`ATK`%2),Unset Attack))
  174. &RET`ATKNAME`FORMAL u(csc)=Attack [if(gt(%+,2),%2,%1)]: '[if(gt(%+,2),u(RET`ATKNAME,%0,%1,%2),u(RET`ATKNAME,%0,%1))]'
  175.  
  176. &RET`EFFNAME u(csc)=default(u(maindb)/E`%1,Unknown Effect)
  177. &RET`EFFNAME`FORMAL u(csc)=Effect %1: '[u(RET`EFFNAME,%0,%1)]'
  178.  
  179. &RET`ELENAME u(csc)=localize(switch(isint(%0),1,if(strlen(get(u(maindb)/ELE`%0`COLOR)),ansi(get(u(maindb)/ELE`%0`COLOR),get(u(maindb)/ELE`%0)),get(u(maindb)/ELE`%0)),0,if(setr(elenum,u(RET`ELENUM,%0)),u(RET`ELENAME,%q<elenum>),*UNKNOWN*)))
  180. &RET`ELELIST u(csc)=iter(sortkey(#lambda/last(\%0,`),lattr(u(maindb)/ELE`*),n),get(u(maindb)/%i0),%b,strfirstof(%0,|))
  181. &RET`ELELIST`COLOR u(csc)=iter(sortkey(#lambda/last(\%0,`),lattr(u(maindb)/ELE`*),n),ansi(strfirstof(get(u(maindb)/%i0`COLOR),n),get(u(maindb)/%i0)),%b,strfirstof(%0,|))
  182. &RET`ELELISTNUM u(csc)=sort(iter(lattr(u(maindb)/ELE`*),last(%i0,`),%b,strfirstof(%0,|)),n,strfirstof(%0,|))
  183. &RET`ELENUM u(csc)=elements(filterbool(#lambda/strmatch(%0,get(u(maindb)/\%0)),lattr(u(maindb)/ELE`*)),2,`)
  184.  
  185. &RET`POINAME u(csc)=localize(switch(isint(%0),1,if(strlen(get(u(maindb)/POI`%0`COLOR)),ansi(get(u(maindb)/POI`%0`COLOR),get(u(maindb)/POI`%0)),get(u(maindb)/POI`%0)),0,if(setr(POInum,u(RET`POINUM,%0)),u(RET`POINAME,%q<POInum>),*UNKNOWN*)))
  186. &RET`POILIST u(csc)=iter(sortkey(#lambda/last(\%0,`),lattr(u(maindb)/POI`*),n),get(u(maindb)/%i0),%b,strfirstof(%0,|))
  187. &RET`POILIST`COLOR u(csc)=iter(sortkey(#lambda/last(\%0,`),lattr(u(maindb)/POI`*),n),ansi(strfirstof(get(u(maindb)/%i0`COLOR),n),get(u(maindb)/%i0)),%b,strfirstof(%0,|))
  188. &RET`POILISTNUM u(csc)=sort(iter(lattr(u(maindb)/POI`*),last(%i0,`),%b,strfirstof(%0,|)),n,strfirstof(%0,|))
  189. &RET`POINUM u(csc)=elements(filterbool(#lambda/strmatch(%0,get(u(maindb)/\%0)),lattr(u(maindb)/POI`*)),2,`)
  190.  
  191. &RET`TYPNAME u(csc)=localize(switch(isint(%0),1,if(strlen(get(u(maindb)/TYP`%0`COLOR)),ansi(get(u(maindb)/TYP`%0`COLOR),get(u(maindb)/TYP`%0)),get(u(maindb)/TYP`%0)),0,if(setr(typnum,u(RET`TYPNUM,%0)),u(RET`TYPNAME,%q<typnum>),*UNKNOWN*)))
  192. &RET`TYPLIST u(csc)=iter(sortkey(#lambda/last(\%0,`),lattr(u(maindb)/TYP`*),n),get(u(maindb)/%i0),%b,strfirstof(%0,|))
  193. &RET`TYPLISTNUM u(csc)=sort(iter(lattr(u(maindb)/TYP`*),last(%i0,`),%b,strfirstof(%0,|)),n,strfirstof(%0,|))
  194. &RET`TYPNUM u(csc)=elements(filterbool(#lambda/strmatch(%0,get(u(maindb)/\%0)),lattr(u(maindb)/TYP`*)),2,`)
  195.  
  196. &RET`CLANAME u(csc)=localize(switch(isint(%0),1,if(strlen(get(u(maindb)/CLA`%0`COLOR)),ansi(get(u(maindb)/CLA`%0`COLOR),get(u(maindb)/CLA`%0)),get(u(maindb)/CLA`%0)),0,if(setr(clanum,u(RET`CLANUM,%0)),u(RET`CLANAME,%q<typnum>),*UNKNOWN*)))
  197. &RET`CLALIST u(csc)=iter(sortkey(#lambda/last(\%0,`),lattr(u(maindb)/CLA`*),n),get(u(maindb)/%i0),%b,strfirstof(%0,|))
  198. &RET`CLALISTNUM u(csc)=sort(iter(lattr(u(maindb)/CLA`*),last(%i0,`),%b,strfirstof(%0,|)),n,strfirstof(%0,|))
  199. &RET`CLANUM u(csc)=elements(filterbool(#lambda/strmatch(%0,get(u(maindb)/\%0)),lattr(u(maindb)/CLA`*)),2,`)
  200.  
  201. &RET`CATNAME u(csc)=localize(switch(isint(%0),1,if(strlen(get(u(maindb)/CAT`%1`%0`COLOR)),ansi(get(u(maindb)/CAT`%1`%0`COLOR),get(u(maindb)/CAT`%1`%0)),get(u(maindb)/CAT`%1`%0)),0,if(setr(clanum,u(RET`CATNUM,%0,%1)),u(RET`CATNAME,%q<catnum>,%1),*UNKNOWN*)))
  202. &RET`CATLIST u(csc)=iter(sortkey(#lambda/last(\%0,`),lattr(u(maindb)/CAT`%0`*),n),get(u(maindb)/%i0),%b,strfirstof(%1,|))
  203. &RET`CATLISTNUM u(csc)=sort(iter(lattr(u(maindb)/CAT`%0`*),last(%i0,`),%b,strfirstof(%0,|)),n,strfirstof(%0,|))
  204. &RET`CATNUM u(csc)=elements(filterbool(#lambda/strmatch(%0,get(u(maindb)/\%0)),lattr(u(maindb)/CAT`%1`*)),3,`)
  205.  
  206. &RET`TAGNAME u(csc)=localize(switch(isint(%0),1,if(strlen(get(u(maindb)/TAG`%1`%0`COLOR)),ansi(get(u(maindb)/TAG`%1`%0`COLOR),get(u(maindb)/TAG`%1`%0)),get(u(maindb)/TAG`%1`%0)),0,if(setr(tagnum,u(RET`TAGNUM,%0,%1)),u(RET`TAGNAME,%q<tagnum>,%1),*UNKNOWN*)))
  207. &RET`TAGLIST u(csc)=iter(sortkey(#lambda/last(\%0,`),lattr(u(maindb)/TAG`%0`*),n),get(u(maindb)/%i0),%b,strfirstof(%1,|))
  208. &RET`TAGLISTNUM u(csc)=sort(iter(lattr(u(maindb)/TAG`%0`*),last(%i0,`),%b,strfirstof(%0,|)),n,strfirstof(%0,|))
  209. &RET`TAGNUM u(csc)=elements(filterbool(#lambda/strmatch(%0,get(u(maindb)/\%0)),lattr(u(maindb)/TAG`%1`*)),3,`)
  210.  
  211. &RET`STATNAME u(csc)=localize(switch(isint(%0),1,if(strlen(get(u(maindb)/STA`%0`COLOR)),ansi(get(u(maindb)/STA`%0`COLOR),get(u(maindb)/STA`%0)),get(u(maindb)/STA`%0)),0,if(setr(statnum,u(RET`STATNUM,%0)),u(RET`STATNAME,%q<statnum>),*UNKNOWN*)))
  212. &RET`STATLIST u(csc)=iter(sortkey(#lambda/last(\%0,`),lattr(u(maindb)/STA`*),n),get(u(maindb)/%i0),%b,strfirstof(%0,|))
  213. &RET`STATLISTNUM u(csc)=sort(iter(lattr(u(maindb)/STA`*),last(%i0,`),%b,strfirstof(%0,|)),n,strfirstof(%0,|))
  214. &RET`STATNUM u(csc)=elements(filterbool(#lambda/strmatch(%0,get(u(maindb)/\%0)),lattr(u(maindb)/STA`*)),2,`)
  215.  
  216. @@ ******** Data Setting
  217.  
  218. &SET`FORM`NAME u(csc)=@include u(csc)/VAL`FORMNAME=%2;@switch/inline %0=u(maindb),{&F`%1 u(maindb)=%q<return>},{@include u(csc)/INC`PMSG=%#,setr(msg,Renamed [name(%0)]'s [u(RET`FORMNAME`FORMAL,%0,%1)] to: %q<return>);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/INC`PMSG=%0,{Your [u(RET`FORMNAME`FORMAL,%0,%1)] was renamed to: %q<return>},%0;&D`CSYS`FORM`%1 %0=%q<return>;&D`CSYS`FORM`%1`ID %0=X}
  219.  
  220. &SET`FORM`ID u(csc)=@switch/inline %0=u(maindb),{@include u(csc)/INC`PMSG=%#,setr(msg,Changed ID of [u(RET`FORMNAME`FORMAL,%0,%1)] to %2);@include u(csc)/INC`AMSG=%q<msg>;@wipe u(maindb)/F`%2;@include u(ccs)/INC`CPTREE=u(maindb),F`%1,u(maindb),F`%2},{@wipe %0/D`CSYS`FORM`%1;@include u(ccs)/INC`CPTREE=u(maindb),F`%2,%0,D`CSYS`FORM`%1;&D`CSYS`FORM`%1`ID %0=%2;@include u(csc)/INC`PMSG=%#,setr(msg,name(%0) now has database form [u(RET`FORMNAME`FORMAL,u(maindb),%2)] in Form Slot %1);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/INC`PMSG=%0,{New Form Obtained: [u(RET`FORMNAME`FORMAL,%0,%1)]}}
  221.  
  222. &SET`FORM`STAT u(csc)=@include u(csc)/VAL`STAT=%2;@include u(csc)/VAL`STATNUM=%3;@switch/inline %0=u(maindb),{@include u(csc)/INC`PMSG=%#,setr(msg,Changed DB [u(RET`FORMNAME`FORMAL,%0,%1)]'s %q<stat> Stat to: %q<return>);@include u(csc)/INC`AMSG=%q<msg>;&F`%1`STAT`%q<statnum> %0=%q<return>},{@include u(csc)/INC`PMSG=%#,setr(msg,Changed [name(%0)]'s [u(RET`FORMNAME`FORMAL,%0,%1)]'s %q<stat> Stat to: %q<return>);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/INC`PMSG=%0,{[u(RET`FORMNAME`FORMAL,%0,%1)] Stat %q<stat> Changed to: %q<return>};&D`CSYS`FORM`%1`STAT`%q<statnum> %0=%q<return>;&D`CSYS`FORM`%1`ID %0=X}
  223.  
  224. &SET`FORM`CLASS u(csc)=@include u(csc)/VAL`CLASS=%2;@switch/inline %0=u(maindb),{@include u(csc)/INC`PMSG=%#,setr(msg,Changed DB [u(RET`FORMNAME`FORMAL,%0,%1)]'s Class to: %q<class>);@include u(csc)/INC`AMSG=%q<msg>;&F`%1`CLASS %0=%q<clanum>},{@include u(csc)/INC`PMSG=%#,setr(msg,Changed [name(%0)]'s [u(RET`FORMNAME`FORMAL,%0,%1)]'s Class to: %q<class>);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/INC`PMSG=%0,{[u(RET`FORMNAME`FORMAL,%0,%1)] Class Changed to: %q<class>};&D`CSYS`FORM`%1`CLASS %0=%q<class>;&D`CSYS`FORM`%1`ID %0=X}
  225.  
  226. &SET`FORM`ELELIKE u(csc)=@include u(csc)/VAL`ELEMENT`LIST=%2;@switch/inline %0=u(maindb),{@include u(csc)/INC`PMSG=%#,setr(msg,Changed DB [u(RET`FORMNAME`FORMAL,%0,%1)]'s Element %3 to: %q<elelist>);@include u(csc)/INC`AMSG=%q<msg>;&F`%1`%3 %0=%q<elenumlist>},{@include u(csc)/INC`PMSG=%#,setr(msg,Changed [name(%0)]'s [u(RET`FORMNAME`FORMAL,%0,%1)]'s Element %3 to: %q<elelist>);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/INC`PMSG=%0,{[u(RET`FORMNAME`FORMAL,%0,%1)] Element %2 Changed to: %q<elelist>};&D`CSYS`FORM`%1`%3 %0=%q<elenumlist>;&D`CSYS`FORM`%1`ID %0=X}
  227.  
  228. &SET`FORM`ATK`ID u(csc)=@switch/inline %0=u(maindb),{@include u(csc)/INC`PMSG=%#,setr(msg,Changed DB [u(RET`FORMNAME`FORMAL,u(maindb),%1)]'s ATK %2 to: [u(RET`ATKNAME`FORMAL,u(maindb),%3)]);@include u(csc)/INC`AMSG=%q<msg>;@wipe u(maindb)/F`%2`ATK`%3;@include u(ccs)/INC`CPTREE=u(maindb),A`%3,u(maindb),F`%1`ATK`%2;&F`%1`ATK`%2`ID u(maindb)=%3},{@wipe %0/D`CSYS`FORM`%1`ATK`%3;@include u(ccs)/INC`CPTREE=u(maindb),A`%3,%0,D`CSYS`FORM`%1`ATK`%2;@include u(csc)/INC`PMSG=%#,setr(msg,name(%0)'s [u(RET`FORMNAME`FORMAL,u(maindb),%2)] now has [u(RET`ATKNAME`FORMAL,u(maindb),%3)] in Slot %2);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/INC`PMSG=%0,{[u(RET`FORMNAME`FORMAL,%0,%1)] now has [u(RET`ATKNAME`FORMAL,%0,%1,%2)]}}
  229.  
  230. &SET`FORM`ATK`STRING u(csc)=@include u(csc)/VAL`ATKSTRING=%3;@switch/inline %0=u(maindb),{@include u(csc)/INC`PMSG=%#,setr(msg,Changed DB [u(RET`FORMNAME`FORMAL,%0,%1)]'s [u(RET`ATKNAME`FORMAL,u(maindb),%1,%2)] to: %3);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/SET`ATK=u(maindb),F`%1`ATK`%2,%q<atkname>,%q<atktype>,%q<atkele>,%q<atkpower>,%q<atkacc>},{@include u(csc)/SET`ATK=%0,D`CSYS`FORM`%1`ATK`%2,%q<atkname>,%q<atktype>,%q<atkele>,%q<atkpower>,%q<atkacc>;@include u(csc)/INC`PMSG=%#,setr(msg,name(%0)'s [u(RET`FORMNAME`FORMAL,%0,%1)] now has [u(RET`ATKNAME`FORMAL,%0,%1,%2)]);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/INC`PMSG=%0,{[u(RET`FORMNAME`FORMAL,%0,%1)] now has [u(RET`ATKNAME`FORMAL,%0,%1,%2)]}}
  231.  
  232. &SET`ATK`ID u(csc)=@include u(csc)/INC`PMSG=%#,setr(msg,Changed ID of [u(RET`ATKNAME`FORMAL,%0,%1)]' to %2);@include u(csc)/INC`AMSG=%q<msg>;@wipe %0/A`%2;@include u(ccs)/INC`MVTREE=%0,A`%1,%0,A`%2
  233.  
  234. &SET`ATK`STRING u(csc)=@include u(csc)/VAL`ATKSTRING=%2;@include u(csc)/INC`PMSG=%#,setr(msg,Changed DB [u(RET`ATKNAME`FORMAL,%0,%1)] to: %2);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/SET`ATK=u(maindb),A`%1,%q<atkname>,%q<atktype>,%q<atkele>,%q<atkpower>,%q<atkacc>
  235.  
  236. &SET`ATK u(csc)=@wipe %0/%1;&%1 %0=%2;&%1`TYPE %0=%3;&%1`ELEMENT %0=%4;&%1`POWER %0=%5;&%1`ACCURACY %0=%6
  237.  
  238. &SET`FORM`ATK`PARA u(csc)=@include u(csc)/VAL`PARASTRING=%3;@switch/inline %0=u(maindb),{@include u(csc)/INC`PMSG=%#,setr(msg,Changed DB [u(RET`FORMNAME`FORMAL,%0,%1)]'s ATK [u(RET`ATKNAME`FORMAL,u(maindb),%1,%2)] PARAMETERS to: %3);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/SET`PARA=u(maindb),F`%1`ATK`%2,%3},{@include u(csc)/SET`PARA=%0,D`CSYS`FORM`%1`ATK`%2,%3;@include u(csc)/INC`PMSG=%#,setr(msg,name(%0)'s [u(RET`FORMNAME`FORMAL,%0,%1)] now has [u(RET`ATKNAME`FORMAL,%0,%1,%2)]);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/INC`PMSG=%0,{[u(RET`FORMNAME`FORMAL,%0,%1)] now has [u(RET`ATKNAME`FORMAL,%0,%1,%2)]}}
  239.  
  240. &SET`ATK`PARA u(csc)=@include u(csc)/VAL`PARASTRING=%2;@include u(csc)/INC`PMSG=%#,setr(msg,Changed DB [u(RET`ATKNAME`FORMAL,%0,%1)] PARAMETERS to: %2);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/SET`PARA=u(maindb),A`%1,%2
  241.  
  242. &SET`PARA u(csc)=@dolist/inline INFLICTS CLEARS ADOPTS PURGES AOE BUST SIPHON REVIVE DAMAGE HPCOST MPCOST={@wipe %0/%1`%i0};th setq(options,iter(lattr(u(csc)/SET`PARA`DO`*),last(%i0,`),%b,|));@dolist/inline/delimit , %2={@include u(ccs)/INC`PARTIAL=before(%i0,/),%q<options>,|,v(VAR`MSGHEAD),para,para;@include u(csc)/SET`PARA`DO`%q<para>=%0,%1,after(%i0,/)}
  243.  
  244. &SET`PARA`DO`INFLICTS u(csc)=@include u(csc)/VAL`PARA`INFLICTS=%2;&%1`INFLICTS`%q<id> %0=%q<return>
  245. &SET`PARA`DO`ADOPTS u(csc)=@include u(csc)/VAL`PARA`ADOPTS=%2;&%1`ADOPTS`%q<id> %0=%q<return>
  246. &SET`PARA`DO`CLEARS u(csc)=@include u(csc)/VAL`PARA`CLEARS=%2;&%1`CLEARS %0=%q<tagnumlist>;&%1`CLEARS`CHANCE %0=%q<return>
  247. &SET`PARA`DO`PURGES u(csc)=@include u(csc)/VAL`PARA`PURGES=%2;&%1`PURGES %0=%q<tagnumlist>;&%1`PURGES`CHANCE %0=%q<return>
  248. &SET`PARA`DO`AOE u(csc)=@include u(csc)/VAL`PARA`AOE=%2;&%1`AOE %0=%q<return>
  249. &SET`PARA`DO`BUST u(csc)=@include u(csc)/VAL`PARA`MPBUST=%2;&%1`BUST`%q<pointnum> %0=%q<return>
  250. &SET`PARA`DO`SIPHON u(csc)=@include u(csc)/VAL`PARA`SIPHON=%2;&%1`SIPHON`%q<pointnum> %0=%q<return>
  251.  
  252. &SET`PARA`DO`REVIVE u(csc)=@include u(csc)/VAL`PARA`REVIVE=%2;&%1`REVIVE %0=%q<return>
  253. &SET`PARA`DO`DAMAGE u(csc)=@include u(csc)/VAL`PARA`DAMAGE=%2;&%1`DAMAGE %0=%q<return>
  254. &SET`PARA`DO`COST u(csc)=@include u(csc)/VAL`PARA`HPCOST=%2;&%1`COST`%q<pointnum> %0=%q<return>
  255.  
  256. &SET`EFF`PARA u(csc)=@include u(csc)/VAL`EFFPARA=%2;@include u(csc)/INC`PMSG=%#,setr(msg,Changed DB [u(RET`EFFNAME`FORMAL,%0,%1)] PARAMETERS to: %2);@include u(csc)/INC`AMSG=%q<msg>;@include u(csc)/SET`EFFPARA=u(maindb),E`%1,%2
  257.  
  258. &SET`EFFPARA u(csc)=@dolist/inline STACKABLE DURATION DOT REGEN SIPHON EVAMOD ACCMOD STATMOD ELERESMOD ELEPOWMOD={@wipe %0/%1`%i0};th setq(options,iter(lattr(u(csc)/SET`EFF`PARA`DO`*),last(%i0,`),%b,|));@dolist/inline/delimit , %2={@include u(ccs)/INC`PARTIAL=before(%i0,/),%q<options>,|,v(VAR`MSGHEAD),para,para;@include u(csc)/SET`EFF`PARA`DO`%q<para>=%0,%1,after(%i0,/)}
  259.  
  260. &SET`EFF`PARA`DO`STACKABLE u(csc)=@include u(csc)/VAL`EFFPARA`STACKABLE=%2;&%1`STACKABLE %0=%q<return>
  261. &SET`EFF`PARA`DO`DURATION u(csc)=@include u(csc)/VAL`EFFPARA`DURATION=%2;&%1`DURATION %0=%q<return>
  262. &SET`EFF`PARA`DO`DOT u(csc)=@include u(csc)/VAL`EFFPARA`DOT=%2;&%1`DOT`%q<pointnum> %0=%q<return>
  263. &SET`EFF`PARA`DO`REGEN u(csc)=@include u(csc)/VAL`EFFPARA`REGEN=%2;&%1`REGEN`%q<pointnum> %0=%q<return>
  264. &SET`EFF`PARA`DO`SIPHON u(csc)=@include u(csc)/VAL`EFFPARA`SIPHON=%2;&%1`SIPHON`%q<pointnum> %0=%q<return>
  265. &SET`EFF`PARA`DO`EVAMOD u(csc)=@include u(csc)/VAL`EFFPARA`EVAMOD=%2;&%1`EVAMOD %0=%q<return>
  266. &SET`EFF`PARA`DO`ACCMOD u(csc)=@include u(csc)/VAL`EFFPARA`ACCMOD=%2;&%1`ACCMOD %0=%q<return>
  267. &SET`EFF`PARA`DO`STATMOD u(csc)=@include u(csc)/VAL`EFFPARA`STATMOD=%2;&%1`STATMOD`%q<statnum> %0=%q<return>
  268. &SET`EFF`PARA`DO`ELERESMOD u(csc)=@include u(csc)/VAL`EFFPARA`ELERESMOD=%2;&%1`ELERESMOD`%q<elenum> %0=%q<return>
  269. &SET`EFF`PARA`DO`ELEPOWMOD u(csc)=@include u(csc)/VAL`EFFPARA`ELEPOWMOD=%2;&%1`ELEPOWMOD`%q<elenum> %0=%q<return>
  270. &SET`EFF`PARA`DO`COSTMOD u(csc)=@include u(csc)/VAL`EFFPARA`SIPHON=%2;&%1`COSTMOD`%q<pointnum> %0=%q<return>
  271. &SET`EFF`PARA`DO`HEALMOD u(csc)=@include u(csc)/VAL`EFFPARA`SIPHON=%2;&%1`HEALMOD`%q<pointnum> %0=%q<return>
  272. &SET`EFF`PARA`DO`FORMLOCK u(csc)=@include u(csc)/VAL`EFFPARA`FORMLOCK=%2;&%1`FORMLOCK %0=%q<return>
  273. &SET`EFF`PARA`DO`BACKLASH u(csc)=@include u(csc)/VAL`EFFPARA`BACKLASH=%2;&%1`BACKLASH %0=%q<return>
  274. &SET`EFF`PARA`DO`NOCRIT u(csc)=@include u(csc)/VAL`EFFPARA`NOCRIT=%2;&%1`NOCRIT %0=%q<return>
  275.  
  276. @@ ******** Messaging
  277. &INC`AMSG u(csc)=@nscemit/noisy u(CMO`STAFFREP)=ansi(h,\[[name(firstof(%1,%#))]\]) %0
  278.  
  279. &INC`PMSG u(csc)=@nspemit %0=msghead(v(VAR`MSGHEAD)) %1
  280.  
  281. @@ ******** Character Editor
  282. &CMD`+SELECT u(csc)=$^\+select(?\: +(.+?))?(?\:=(.*))?$:@include u(ccs)/INC`CHECKPC=%1,1,v(VAR`MSGHEAD);@include u(csc)/VAL`FORMSLOT=%2;&D`SELECT %#=%q<t1objid> %2 [secs()];@nspemit %#=announce(v(VAR`MSGHEAD)) You are now managing %q<t1name>'s Form %2: '[default(%q<t1>/D`CSYS`FORM`%2,Unset Form)]'
  283. @set u(csc)/CMD`+SELECT=regexp
  284.  
  285. &CMD`+SET u(csc)=$^\+(add|set|rem)(\S+)(?\: +(.*))?$:@assert hasattrval(%#/D`SELECT)=@include u(csc)/INC`PMSG=%#,{ERROR: You are not managing anyone's forms!};@assert isobjid(setr(target,elements(setr(select,get(%#/D`SELECT)),1)))=@include u(csc)/INC`PMSG=%#,{ERROR: Your selection is invalid. This could happen if the character was nuked?};@break gte(sub(secs(),last(elements(%q<select>,3))),mul(60,60))=@include u(csc)/INC`PMSG=%#,{ERROR: Selection has timed out. Please Choose again with +select!};@include u(ccs)/INC`CHECKPC=%q<target>,1,v(VAR`MSGHEAD);th setq(form,elements(%q<select>,2));@include u(ccs)/INC`PARTIAL=%2,v(VAR`SET`%1),|,v(VAR`MSGHEAD),option,option;@include/nobreak u(csc)/CHAR`%1`%q<option>=trim(%3);&D`SELECT %#=elements(%q<select>,1 2) [secs()]
  286. @set u(csc)/CMD`+SET=regexp
  287.  
  288. &VAR`SET`ADD u(csc)=TRAIT
  289. &VAR`SET`SET u(csc)=NAME|ID|STAT|ATK|PARA|CLASS|WEAK|RESIST|NULL
  290. &VAR`SET`REM u(csc)=FORM|ATK|TRAIT
  291.  
  292. &CHAR`SET`NAME u(csc)=@include u(csc)/SET`FORM`NAME=%q<t1>,%q<form>,%0
  293.  
  294. &CHAR`SET`ID u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: What form will you link?};@include u(csc)/DB`SEARCH=%0,F,,1;@switch/inline t(nattr(%q<t1>/D`CSYS`FORM`%q<form>`**))=1,{@include u(ccs)/INC`VERIFY={[ansi(hr,WARNING:)] This will copy the form from the database to %q<t1name>'s slot [u(RET`FORMNAME`FORMAL,%q<t1>,%q<form>)], overwriting it. Is this okay? Enter the same command again within ten seconds to verify!},CSYS SET ID %q<t1> %q<form> %0,v(VAR`MSGHEAD)};@include u(csc)/SET`FORM`ID=%q<t1>,%q<form>,%q<id>
  295.  
  296. &CHAR`SET`STAT u(csc)=@include u(csc)/SET`FORM`STAT=%q<t1>,%q<form>,before(%0,=),after(%0,=)
  297.  
  298. &CHAR`SET`CLASS u(csc)=@include u(csc)/SET`FORM`CLASS=%q<t1>,%q<form>,%0
  299.  
  300. &CHAR`SET`ATK u(csc)=@include u(csc)/VAL`ATKSLOT=before(%0,=);@switch/inline words(after(%0,=),/)=1,{@include u(csc)/DB`SEARCH=before(after(%0,=),/),A,,1;@include u(csc)/SET`FORM`ATK`ID=%q<t1>,%q<form>,%q<slot>,%q<id>},{@include u(csc)/SET`FORM`ATK`STRING=%q<t1>,%q<form>,%q<slot>,after(%0,=)}
  301. &CHAR`SET`PARA u(csc)=@include u(csc)/VAL`ATKSLOT=before(%0,=);@include u(csc)/SET`FORM`PARA=%q<t1>,%q<form>,%q<slot>,after(%0,=)
  302.  
  303.  
  304. &CHAR`SET`WEAK u(csc)=@include u(csc)/SET`FORM`ELELIKE=%q<t1>,%q<form>,%0,WEAK
  305. &CHAR`SET`RESIST u(csc)=@include u(csc)/SET`FORM`ELELIKE=%q<t1>,%q<form>,%0,RESIST
  306. &CHAR`SET`NULL u(csc)=@include u(csc)/SET`FORM`ELELIKE=%q<t1>,%q<form>,%0,NULL
  307.  
  308. @@ ******* CSYS EDIT
  309. &CMD`+CSYSEDIT u(csc)=$^\+(eff|atk|def|frm|tra)(?\:/(\S+)?)?(?\: +(.+?))?$:@include u(ccs)/INC`PARTIAL=%2,setunion(get(u(csc)/VAR`%1`PLAYFLAGS),if(isadmin(%#),get(u(csc)/VAR`%1`ADMINFLAGS)),|,|),|,%1,switch,switch;@include u(csc)/[ucstr(%1)]`[strfirstof(%q<switch>,MAIN)]=before(%3,=),after(%3,=),%3,switch(%1,EFF,Effect,ATK,Attack,DEF,Defense,FRM,Form,CHAR,Character,TRA,Trait),switch(%1,EFF,E,ATK,A,DEF,D,FRM,F,CHAR,C,TRA,T),switch(%1,ATK,ATK,EFF,EFF,DEF,DEF,FRM,FRM,TRA,TRA)
  310. @set u(csc)/CMD`+CSYSEDIT=regexp
  311. @@ %0 - lsargs, %1 - rsargs, %2 - args, %3 - mode name, %4 - mode attribute root, %5 - code root
  312.  
  313. &VAR`ATK`ADMINFLAGS u(csc)=SET|RENAME|PARA|WIPE|UPDATE|CATEGORY|MAKECATEGORY|RENCATEGORY|DELCATEGORY|DESC|SEARCH|CATDESC|MAKETAG|RENTAG|DELTAG|TAGDESC|TAGS|ADDTAG
  314. &VAR`EFF`ADMINFLAGS u(csc)=ADD|PARA|WIPE|UPDATE|CATEGORY|MAKECATEGORY|RENCATEGORY|DELCATEGORY|DESC|SEARCH|CATDESC|MAKETAG|RENTAG|DELTAG|TAGDESC|TAGS|ADDTAG
  315. &VAR`TRA`ADMINFLAGS u(csc)=ADD|SET|WIPE|CATEGORY|MAKECATEGORY|RENCATEGORY|DELCATEGORY|DESC|SEARCH|CATDESC|MAKETAG|RENTAG|DELTAG|TAGDESC|TAGS|ADDTAG
  316. &VAR`FRM`ADMINFLAGS u(csc)=ADD|SET|ATK|WIPE|UPDATE|CATEGORY|MAKECATEGORY|RENCATEGORY|DELCATEGORY|DESC|SEARCH|CATDESC|MAKETAG|RENTAG|DELTAG|TAGDESC|TAGS|ADDTAG
  317. &VAR`DEF`ADMINFLAGS u(csc)=SET|PARA|WIPE|UPDATE|CATEGORY|MAKECATEGORY|RENCATEGORY|DELCATEGORY|DESC|SEARCH|CATDESC|MAKETAG|RENTAG|DELTAG|TAGDESC|TAGS|ADDTAG
  318.  
  319. &DB`SEARCH u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Nothing entered to search for.};@switch/inline valnum(%0)=1,{th if(if(hasattr(u(maindb)/%1`[add(%0,0)]),setr(strfirstof(%6,id),add(%0,0))),setq(strfirstof(%4,res),%1`%q<[strfirstof(%6,id)]>)[setq(strfirstof(%5,reslist),%q<res>)][setq(strfirstof(%7,idlist),%q<[strfirstof(%6,id)]>)])},{th if(words(setr(strfirstof(%5,reslist),if(%3,wildgrepi(u(maindb),%1`*,%0*),filterbool(#lambda/strmatch(%0,get(u(maindb)/\%0)),lattr(u(maindb)/%1`*))))),setq(strfirstof(%4,res),first(sortkey(#lambda/last(\%0,`),%q<[strfirstof(%5,reslist)]>)))[setq(strfirstof(%7,idlist),sort(iter(%q<[strfirstof(%5,reslist)]>,last(%i0,`))))][setq(strfirstof(%6,id),first(%q<[strfirstof(%7,idlist)]>))])};@break cand(%3,gt(words(%q<[strfirstof(%5,reslist)]>),1))=@include u(csc)/INC`PMSG=%#,{ERROR: '%0' matched multiple items: [itemize(iter(%q<[strfirstof(%5,reslist)]>,last(%i0,`) '[get(u(maindb)/%i0)]',%b,|),|,and,\,)]};@switch/inline t(%2)[t(%q<[strfirstof(%6,id)]>)]=00,{@break 1=@include u(csc)/INC`PMSG=%#,{ERROR: '%0' did not match anything.}},10,{th setq(strfirstof(%8,nres),1)}
  320.  
  321. @@ %0 - text/id to search, %1 - attribute root to search, %2 - True for Continue mode, %3 - True for partial match mode, %4 - register to save single result to, %5 - register to save result list to, %6 - register to save ID to, %7 - register to save ID list to, %8 - register to save 'no result' flag to
  322.  
  323. &DBFUN`CATSEARCH u(csc)=sortkey(#lambda/abs(last(\%0,`)),iter(regrepi(u(maindb),%0`*`CATEGORY,\\b%1\\b),elements(%i0,2,`)),n)
  324.  
  325. &DBFUN`TAGSEARCH u(csc)=sortkey(#lambda/abs(last(\%0,`)),iter(regrepi(u(maindb),%0`*`TAGS,\\b%1\\b),elements(%i0,2,`)),n)
  326.  
  327. &DBFUN`UNCATSEARCH u(csc)=sortkey(#lambda/abs(last(\%0,`)),filterbool(#lambda/not(words(get(u(maindb)/\%0`CATEGORY))),lattr(u(maindb)/%0`*)),n)
  328.  
  329. @@ ****** Category section
  330. &CAT`MAKE u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Category name field is empty.};@assert regmatchi(%0,^(\\w+)$)=@include u(csc)/INC`PMSG=%#,{ERROR: Category names must be simple words.};@break strmatch(%0,None)=@include u(csc)/INC`PMSG=%#,{ERROR: 'None' is not an acceptable category name.};@include u(csc)/DB`SEARCH=%0,CAT`%4,1,,,,eid;@break %q<eid>=@include u(csc)/INC`PMSG=%#,{ERROR: Category names must be unique.};&[setr(newcat,CAT`%4`[nextslot(u(maindb),CAT`%4)])] u(maindb)=%0;@include u(csc)/INC`PMSG=%#,{%3 Category '%0' Created!};@include u(csc)/INC`AMSG={%3 Category '%0' Created}
  331. &CAT`RENAME u(csc)=@include u(csc)/VAL`CATEGORY=%0,%4;@assert strlen(%1)=@include u(csc)/INC`PMSG=%#,{ERROR: New name field empty.};@assert regmatchi(%1,^(\\w+)$)=@include u(csc)/INC`PMSG=%#,{ERROR: Category names must be simple words.};@break strmatch(%1,None)=@include u(csc)/INC`PMSG=%#,{ERROR: 'None' is not an acceptable category name.};@include u(csc)/DB`SEARCH=%1,CAT`%4,1,,,,eid;@break %q<eid>=@include u(csc)/INC`PMSG=%#,{ERROR: Category names must be unique.};&CAT`%4`%q<catnum> u(maindb)=%1;@include u(csc)/INC`PMSG=%#,{%3 Category '%q<category>' Renamed to: %1};@include u(csc)/INC`AMSG={%3 Category '%q<category>' Renamed to: %1}
  332. &CAT`DEL u(csc)=@include u(csc)/VAL`CATEGORY=%0,%4;@include u(ccs)/INC`VERIFY={ansi(hr,WARNING:) This will Delete %3 Category %q<category>. Any %3s depending on it will become uncategorized. Are you sure? Enter the same command again to verify!},%3 DELETE %q<category>,v(VAR`MSGHEAD);@wipe u(maindb)/CAT`%4`%q<catnum>;@switch/inline setr(count,words(setr(itmlist,u(DBFUN`CATSEARCH,%4,%q<catnum>))))=>0,{@dolist/inline %q<itmlist>={&%4`%i0`CATEGORY u(maindb)=setdiff(get(u(maindb)/%i0),%q<catnum>)}};@include u(csc)/INC`PMSG=%#,{%3 Category %q<category> deleted![if(%q<count>,%b%q<count> %3s were unlinked.)]};@include u(csc)/INC`AMSG={%3 Category %q<category> deleted![if(%q<count>,%b%q<count> %3s were unlinked.)]},%#
  333. &CAT`DESC u(csc)=@include u(csc)/VAL`CATEGORY=%0,%4;@assert strlen(%1)=@include u(csc)/INC`PMSG=%#,{ERROR: New Description field empty.};&CAT`%4`%q<catnum>`DESC u(maindb)=%1;@include u(csc)/INC`PMSG=%#,{%3 Category '%q<category>' Description changed to: %1};@include u(csc)/INC`AMSG={%3 Category '%q<category>' Description changed to: %1}
  334.  
  335. &CAT`LIST u(csc)=@nspemit %#=u(RFN`HEADER,%3 Database: Categories);@nspemit %#=align(4 13 40 10,ID,NAME,DESC,COUNT);@dolist/inline sortkey(#lambda/last(\%0,`),lattr(u(maindb)/CAT`%4`*))={@nspemit %#=align(4 13 40 5,pueblize(last(%i0,`),setr(pueblo,+%5 [get(u(maindb)/%i0)])),pueblize(get(u(maindb)/%i0),%q<pueblo>),get(u(maindb)/%i0`DESC),setr(count,words(setr(list,u(DBFUN`CATSEARCH,%4,last(%i0,`))))));th setq(total,add(%q<total>,%q<count>));th setq(tlist,setunion(%q<tlist>,%q<list>))};@nspemit %#=align(4 13 40 5,pueblize(???,setr(pueblo,+%5 Uncategorized)),pueblize(Uncategorized,%q<pueblo>),For all entries without a category.,setr(count,words(setr(list,filterbool(#lambda/not(strlen(get(u(maindb)/\%0`CATEGORY))),lattr(u(maindb)/%4`*))))));th setq(total,add(%q<total>,%q<count>));th setq(tlist,setunion(%q<tlist>,%q<list>));@nspemit %#=u(RFN`HEADER,Total %3 Entries: %q<total> ([words(%q<tlist>)] Unique))
  336.  
  337. @@ ****** Tag section
  338. &TAG`MAKE u(csc)=@assert strlen(%0)=@include u(csc)/INC`PMSG=%#,{ERROR: Tag name field is empty.};@assert regmatchi(%0,^(\\w+)$)=@include u(csc)/INC`PMSG=%#,{ERROR: Tag names must be simple words.};@break strmatch(%0,None)=@include u(csc)/INC`PMSG=%#,{ERROR: 'None' is not an acceptable Tag name.};@include u(csc)/DB`SEARCH=%0,TAG`%4,1,,,,eid;@break %q<eid>=@include u(csc)/INC`PMSG=%#,{ERROR: Tag names must be unique.};&[setr(newtag,TAG`%4`[nextslot(u(maindb),TAG`%4)])] u(maindb)=%0;@include u(csc)/INC`PMSG=%#,{%3 Tag '%0' Created!};@include u(csc)/INC`AMSG={%3 Tag '%0' Created}
  339. &TAG`RENAME u(csc)=@include u(csc)/VAL`TAG=%0,%4;@assert strlen(%1)=@include u(csc)/INC`PMSG=%#,{ERROR: New name field empty.};@assert regmatchi(%1,^(\\w+)$)=@include u(csc)/INC`PMSG=%#,{ERROR: Tag names must be simple words.};@break strmatch(%1,None)=@include u(csc)/INC`PMSG=%#,{ERROR: 'None' is not an acceptable Tag name.};@include u(csc)/DB`SEARCH=%1,TAG`%4,1,,,,eid;@break %q<eid>=@include u(csc)/INC`PMSG=%#,{ERROR: Tag names must be unique.};&TAG`%4`%q<tagnum> u(maindb)=%1;@include u(csc)/INC`PMSG=%#,{%3 Tag '%q<tag>' Renamed to: %1};@include u(csc)/INC`AMSG={%3 Tag '%q<tag>' Renamed to: %1}
  340. &TAG`DEL u(csc)=@include u(csc)/VAL`TAG=%0,%4;@include u(ccs)/INC`VERIFY={ansi(hr,WARNING:) This will Delete %3 Tag %q<tag>. Any %3s depending on it will become untagged. Are you sure? Enter the same command again to verify!},%3 DELETE %q<tag>,v(VAR`MSGHEAD);@wipe u(maindb)/TAG`%4`%q<tagnum>;@switch/inline setr(count,words(setr(itmlist,u(DBFUN`TAGSEARCH,%4,%q<tagnum>))))=>0,{@dolist/inline %q<itmlist>={&%4`%i0`TAG u(maindb)=setdiff(get(u(maindb)/%i0),%q<tagnum>)}};@include u(csc)/INC`PMSG=%#,{%3 Tag %q<tag> deleted![if(%q<count>,%b%q<count> %3s were unlinked.)]};@include u(csc)/INC`AMSG={%3 Tag %q<tag> deleted![if(%q<count>,%b%q<count> %3s were unlinked.)]},%#
  341. &TAG`DESC u(csc)=@include u(csc)/VAL`TAG=%0,%4;@assert strlen(%1)=@include u(csc)/INC`PMSG=%#,{ERROR: New Description field empty.};&TAG`%4`%q<tagnum>`DESC u(maindb)=%1;@include u(csc)/INC`PMSG=%#,{%3 Tag '%q<tag>' Description changed to: %1};@include u(csc)/INC`AMSG={%3 Tag '%q<tag>' Description changed to: %1}
  342.  
  343. &TAG`LIST u(csc)=@nspemit %#=u(RFN`HEADER,%3 Database: Tags);@nspemit %#=align(4 13 40 10,ID,NAME,DESC,COUNT);@dolist/inline sortkey(#lambda/last(\%0,`),lattr(u(maindb)/TAG`%4`*))={@nspemit %#=align(4 13 40 5,pueblize(last(%i0,`),setr(pueblo,+%5/tags [get(u(maindb)/%i0)])),pueblize(get(u(maindb)/%i0),%q<pueblo>),get(u(maindb)/%i0`DESC),setr(count1,words(setr(list1,u(DBFUN`TAGSEARCH,%4,last(%i0,`))))));th setq(total1,add(%q<total1>,%q<count1>));th setq(alist1,setunion(%q<alist1>,%q<list1>))};th setq(total1,add(%q<total1>,%q<count1>));th setq(tlist1,setunion(%q<tlist1>,%q<list1>));@nspemit %#=u(RFN`HEADER,Total %3 Tag Entries: %q<total1> ([words(%q<alist1>)] Unique))
  344.  
  345.  
  346. @@ ******* Item Section
  347. &ITM`ADD u(csc)=@include u(csc)/VAL`ATKSLOT=%0;@include u(csc)/DB`SEARCH=%1,%4,1;@break %q<id>=@include u(csc)/INC`PMSG=%#,{ERROR: Name is already taken.};&%4`%q<slot> u(maindb)=%1;@include u(csc)/INC`PMSG=%#,{%3 '%1' Created!};@include u(csc)/INC`AMSG={DB [u(RET`%5NAME`FORMAL,u(maindb),%q<slot>)] Created!},%#
  348. &ITM`RENAME u(csc)=@include u(csc)/DB`SEARCH=%0,%4;@assert strlen(%1)=@include u(csc)/INC`PMSG=%#,{};
  349. &ITM`WIPE u(csc)=@include u(csc)/DB`SEARCH=%0,%4;
  350. &ITM`CATEGORY u(csc)=@include u(csc)/DB`SEARCH=%0,%4;@assert strlen(%1)=@include u(csc)/INC`PMSG=%#,{ERROR: No categories entered to assign!};@include u(csc)/VAL`CATEGORY`LIST=%1,%4;&%4`%q<id>`CATEGORY u(maindb)=%q<catnumlist>
  351. &ITM`DESC u(csc)=@include u(csc)/DB`SEARCH=%0,%4;@assert strlen(%1)=@include u(csc)/INC`PMSG=%#,{ERROR: Description field empty.};&%4`%q<id>`DESC u(maindb)=%1;@include u(csc)/INC`PMSG=%#,{You set DB [u(RET`%5NAME`FORMAL,u(maindb),%q<id>)]'s Description to: %1};@include u(csc)/INC`AMSG={DB [u(RET`%5NAME`FORMAL,u(maindb),%q<id>)]'s Description set to: %1},%#
  352. &ITM`TAG u(csc)=@include u(csc)/DB`SEARCH=%0,%4;@assert strlen(%1)=@include u(csc)/INC`PMSG=%#,{ERROR: No Tags entered to assign!};@include u(csc)/VAL`TAG`LIST=%1,%4;&%4`%q<id>`TAGS u(maindb)=%q<tagnumlist>
  353.  
  354. @@ ******* ATTACK SECTION
  355. &ATK`MAIN u(csc)=@switch/inline t(strlen(%0))[valnum(%0)]=11,{@include u(csc)/%5`MAIN`ITEM},0*,{@include u(csc)/%5`MAIN`CATLIST},10,{@include u(csc)/%5`MAIN`CATEGORY}
  356.  
  357. &ATK`MAIN`CATLIST u(csc)=@include u(csc)/CAT`LIST
  358.  
  359. &ATK`MAIN`UNCATEGORIZED u(csc)=@nspemit %#=u(RFN`HEADER,%3 Database: Uncategorized Entries);@nspemit %#=align(4 12 8 3 3 3 10,ID,NAME,ELE,POW,ACC,STA,DESC);@include u(csc)/%5`CASCADE=%0,%1,%2,%3,%4,%5,u(DBFUN`UNCATSEARCH,%4);@nspemit %#=u(RFN`HEADER)
  360.  
  361. &ATK`MAIN`ITEM u(csc)=@include u(csc)/DB`SEARCH=%0,%4;@nspemit %#=u(RFN`HEADER,u(RET`ATKNAME`FORMAL,u(maindb),%q<id>));@nspemit %#=align(31 31,iter(ELEMENT TYPE POWER ACCURACY AOE,align(>10 20,%i0:,switch(%i0,ELEMENT,iter(get(u(maindb)/%4`%q<id>`ELEMENT),u(RET`ELENAME,%i0)),TYPE,u(RET`TYPNAME,get(u(maindb)/%4`%q<id>`TYPE)),get(u(maindb)/%4`%q<id>`%i0))),%b,%r),iter(HPSIPHON SPSIPHON MPBUST,align(>10 20,%i0:,switch(%i0,ELEMENT,iter(get(u(maindb)/%4`%q<id>`ELEMENT),u(RET`ELENAME,%i0)),TYPE,u(RET`TYPNAME,get(u(maindb)/%4`%q<id>`TYPE)),get(u(maindb)/%4`%q<id>`%i0))),%b,%r));@switch/inline or(strlen(setr(inflicts,u(ATK`FUN`STATUSCOLADM,u(maindb),%4`%q<id>,INFLICTS))),strlen(setr(adopts,u(ATK`FUN`STATUSCOLADM,u(maindb),%4`%q<id>,ADOPTS))))=1,{@nspemit %#=%R[align(36 36,if(strlen(%q<inflicts>),INFLICTS%R%q<inflicts>),if(strlen(%q<adopts>),ADOPTS%R%q<adopts>))]};@switch/inline or(strlen(setr(clears,u(ATK`FUN`STATUSCOLADM2,u(maindb),%4`%q<id>,CLEARS))),strlen(setr(purges,u(ATK`FUN`STATUSCOLADM2,u(maindb),%4`%q<id>,PURGES))))=1,{@nspemit %#=%R[align(36 36,if(strlen(%q<clears>),CLEARS%R%q<clears>),if(strlen(%q<purges>),PURGES%R%q<purges>))]};@nspemit %#=u(RFN`HEADER)
  362.  
  363. &ATK`FUN`STATUSCOLADM u(csc)=trim(iter(sortkey(#lambda/last(\%0,`),lattr(%0/%1`%2`*),n),align(20 4,pueblize([last(%i0,`)]: '[u(RET`EFFNAME,u(maindb),last(%i0,`))]',+eff [last(%i0,`)]),strfirstof(get(%0/%i0),DEF)\%),%b,%r),%r)
  364. &ATK`FUN`STATUSCOLADM2 u(csc)=align(20 4,trim(iter(setr(set,sort(get(%0/%1`%2))),pueblize(%i0: '[u(RET`TAGNAME,%i0,E)]',+eff/tags %i0),%b,%r),%r),get(%0/%1`%2`CHANCE)[if(%q<set>,\%)])
  365.  
  366. &ATK`CASCADE u(csc)=@nspemit %#=align(4 16 12 4 4 4 4 23,ID,NAME,ELE,POW,ACC,EFF,AOE,DESC);@dolist/inline iter(%6,last(%i0,`))={@nspemit %#=align(4 16 12 4 4 4 4 23,pueblize(%i0,setr(pueblo,+%5 %i0)),pueblize(get(u(maindb)/%4`%i0),%q<pueblo>),iter(get(u(maindb)/%4`%i0`ELEMENT),u(RET`ELENAME,%i0)),get(u(maindb)/%4`%i0`POWER),get(u(maindb)/%4`%i0`ACCURACY),if(words(reglattr(u(maindb)/^%4`%i0`(INFLICTS|CLEARS|ADOPTS|PURGES)`\\d+$)),Yes,No),add(get(u(maindb)/%4`%i0`AOE),0),get(u(maindb)/%4`%i0`DESC))}
  367.  
  368. &ATK`MAIN`CATEGORY u(csc)=@switch/inline %0=Uncategorized,{@include u(csc)/%5`MAIN`UNCATEGORIZED},{@include u(csc)/VAL`CATEGORY=%0,%4;@nspemit %#=u(RFN`HEADER,%3 Database: %q<category> Entries);@include u(csc)/%5`CASCADE=%0,%1,%2,%3,%4,%5,u(DBFUN`CATSEARCH,%4,%q<catnum>);@nspemit %#=u(RFN`HEADER)}
  369.  
  370. &ATK`SET u(csc)=@include u(csc)/VAL`ATKSLOT=%0;@include u(csc)/DB`SEARCH=%q<slot>,%4,1,1;@switch/inline words(%1,/)=1,{@include u(csc)/DB`SEARCH=%1,%4;@include u(ccs)/INC`VERIFY={ansi(hr,WARNING:) This will copy DB [u(RET`ATKNAME`FORMAL,u(maindb),%q<slot>)] to ID Slot %q<id>. Current attack there: [u(RET`ATKNAME`FORMAL,u(maindb),%q<id>)]. Are you sure? enter the same command again to continue.},DB %4 %q<slot> %q<id>,v(VAR`MSGHEAD);@include u(csc)/SET`ATK`ID=u(maindb),%q<slot>,%q<id>},{@include u(csc)/SET`ATK`STRING=u(maindb),%q<slot>,%1}
  371.  
  372. &ATK`PARA u(csc)=@include u(csc)/VAL`ATKSLOT=%0;@include u(csc)/DB`SEARCH=%q<slot>,%4;@include u(csc)/SET`ATK`PARA=u(maindb),A`%q<id>,%1
  373.  
  374. &ATK`RENAME u(csc)=@include u(csc)/ITM`RENAME
  375. &ATK`WIPE u(csc)=@include u(csc)/ITM`WIPE
  376. &ATK`CATEGORY u(csc)=@include u(csc)/ITM`CATEGORY;@include u(csc)/INC`PMSG=%#,{Changed DB [u(RET`ATKNAME`FORMAL,u(maindb),%q<id>)]'s Category to: %q<catlist>};@include u(csc)/INC`AMSG={Changed DB [u(RET`ATKNAME`FORMAL,u(maindb),%q<id>)]'s Category to: %q<catlist>},%#
  377. &ATK`DESC u(csc)=@include u(csc)/ITM`DESC
  378.  
  379. &ATK`MAKECATEGORY u(csc)=@include u(csc)/CAT`MAKE
  380. &ATK`RENCATEGORY u(csc)=@include u(csc)/CAT`RENAME
  381. &ATK`DELCATEGORY u(csc)=@include u(csc)/CAT`DEL
  382. &ATK`CATDESC u(csc)=@include u(csc)/CAT`DESC
  383.  
  384. &ATK`TAGS u(csc)=@switch/inline t(strlen(%0))[valnum(%0)]=11,{@include u(csc)/%5`TAG`TAGLIST},0*,{@include u(csc)/%5`TAG`TAGS},10,{@include u(csc)/%5`TAG`TAGLIST}
  385. &ATK`TAG`TAGS u(csc)=@include u(csc)/TAG`LIST
  386. &ATK`TAG`TAGLIST u(csc)=@include u(csc)/VAL`TAG=%0,%4;@nspemit %#=u(RFN`HEADER,%3 Database: %q<tag> Tagged Entries);@include u(csc)/%5`CASCADE=%0,%1,%2,%3,%4,%5,u(DBFUN`TAGSEARCH,%4,%q<tagnum>);@nspemit %#=u(RFN`HEADER)
  387.  
  388. &ATK`ADDTAG u(csc)=@include u(csc)/ITM`TAG;@include u(csc)/INC`PMSG=%#,{Changed DB [u(RET`ATKNAME`FORMAL,u(maindb),%q<id>)]'s Tags to: %q<taglist>};@include u(csc)/INC`AMSG={Changed DB [u(RET`ATKNAME`FORMAL,u(maindb),%q<id>)]'s Tags to: %q<taglist>},%#
  389. &ATK`MAKETAG u(csc)=@include u(csc)/TAG`MAKE
  390. &ATK`RENTAG u(csc)=@include u(csc)/TAG`RENAME
  391. &ATK`DELTAG u(csc)=@include u(csc)/TAG`DEL
  392. &ATK`TAGDESC u(csc)=@include u(csc)/TAG`DESC
  393.  
  394. @@ ****** EFFECT SECTION
  395. &EFF`MAIN u(csc)=@switch/inline t(strlen(%0))[valnum(%0)]=11,{@include u(csc)/%5`MAIN`ITEM},0*,{@include u(csc)/%5`MAIN`CATLIST},10,{@include u(csc)/%5`MAIN`CATEGORY}
  396.  
  397. &EFF`MAIN`CATLIST u(csc)=@include u(csc)/CAT`LIST
  398.  
  399. &EFF`MAIN`UNCATEGORIZED u(csc)=@nspemit %#=u(RFN`HEADER,%3 Database: Uncategorized Entries);@include u(csc)/%5`CASCADE=%0,%1,%2,%3,%4,%5,u(DBFUN`UNCATSEARCH,%4);@nspemit %#=u(RFN`HEADER)
  400.  
  401. &EFF`CASCADE u(csc)=@nspemit %#=align(4 12 10,ID,NAME,DESC);@dolist/inline iter(%6,last(%i0,`))={@nspemit %#=align(4 12 10,pueblize(%i0,setr(pueblo,+%5 %i0)),pueblize(get(u(maindb)/%4`%i0),%q<pueblo>),get(u(maindb)/%4`%i0`DESC))}
  402.  
  403. &EFF`MAIN`ITEM u(csc)=@include u(csc)/DB`SEARCH=%0,%4;@nspemit %#=u(RFN`HEADER,u(RET`EFFNAME`FORMAL,u(maindb),%q<id>));@nspemit %#=align(25 25 25,iter(STACKABLE DURATION DOT REGEN DRAIN GAIN,align(>10 10,%i0:,udefault(u(csc)/EFF`MAIN`ITEM`%i0,get(u(maindb)/%4`%q<id>`%i0),u(maindb),%4`%q<id>)),%b,%r),iter(HPSIPHON SPSIPHON EVAMOD ACCMOD STATMOD ELERESMOD,align(>10 10,%i0:,udefault(u(csc)/EFF`MAIN`ITEM`%i0,get(u(maindb)/%4`%q<id>`%i0),u(maindb),%4`%q<id>)),%b,%r),iter(ELEPOWMOD COSTMOD HEALMOD FORMLOCK BACKLASH,align(>10 10,%i0:,udefault(u(csc)/EFF`MAIN`ITEM`%i0,get(u(maindb)/%4`%q<id>`%i0),u(maindb),%4`%q<id>)),%b,%r));@nspemit %#=u(RFN`HEADER)
  404.  
  405. &EFF`MAIN`ITEM`STATMOD u(csc)=trim(iter(sortkey(#lambda/last(\%0,`),lattr(%0/%1`STATMOD`*)),u(RET`STATNAME,last(%i0,`)): [get(%0/%i0)],%b,%r),%r)
  406. &EFF`MAIN`ITEM`ELERESMOD u(csc)=trim(iter(sortkey(#lambda/last(\%0,`),lattr(%0/%1`ELERESMOD`*)),u(RET`ELENAME,last(%i0,`)): [get(%0/%i0)],%b,%r),%r)
  407. &EFF`MAIN`ITEM`ELEPOWMOD u(csc)=trim(iter(sortkey(#lambda/last(\%0,`),lattr(%0/%1`ELEPOWMOD`*)),u(RET`ELENAME,last(%i0,`)): [get(%0/%i0)],%b,%r),%r)
  408.  
  409. &EFF`FUN`STATUSCOLADM u(csc)=trim(iter(sortkey(#lambda/last(\%0,`),lattr(%0/%1`%2`*),n),align(20 4,pueblize([last(%i0,`)]: '[u(RET`EFFNAME,u(maindb),last(%i0,`))]',+eff [last(%i0,`)]),strfirstof(get(%0/%i0),DEF)\%),%b,%r),%r)
  410.  
  411. &EFF`MAIN`CATEGORY u(csc)=@switch/inline %0=Uncategorized,{@include u(csc)/%5`MAIN`UNCATEGORIZED},{@include u(csc)/VAL`CATEGORY=%0,%4;@nspemit %#=u(RFN`HEADER,%3 Database: %q<category> Entries);@include u(csc)/%5`CASCADE=%0,%1,%2,%3,%4,%5,u(DBFUN`CATSEARCH,%4,%q<catnum>);@nspemit %#=u(RFN`HEADER)}
  412.  
  413. &EFF`ADD u(csc)=@include u(csc)/ITM`ADD
  414.  
  415. &EFF`PARA u(csc)=@include u(csc)/VAL`ATKSLOT=%0;@include u(csc)/DB`SEARCH=%q<slot>,%4;@include u(csc)/SET`EFF`PARA=u(maindb),%q<id>,%1
  416.  
  417. &EFF`RENAME u(csc)=@include u(csc)/ITM`RENAME
  418. &EFF`WIPE u(csc)=@include u(csc)/ITM`WIPE
  419. &EFF`CATEGORY u(csc)=@include u(csc)/ITM`CATEGORY;@include u(csc)/INC`PMSG=%#,{Changed DB [u(RET`EFFNAME`FORMAL,u(maindb),%q<id>)]'s Category to: %q<catlist>};@include u(csc)/INC`AMSG={Changed DB [u(RET`EFFNAME`FORMAL,u(maindb),%q<id>)]'s Category to: %q<catlist>},%#
  420. &EFF`DESC u(csc)=@include u(csc)/ITM`DESC
  421.  
  422. &EFF`MAKECATEGORY u(csc)=@include u(csc)/CAT`MAKE
  423. &EFF`RENCATEGORY u(csc)=@include u(csc)/CAT`RENAME
  424. &EFF`DELCATEGORY u(csc)=@include u(csc)/CAT`DEL
  425. &EFF`CATDESC u(csc)=@include u(csc)/CAT`DESC
  426.  
  427. &EFF`TAGS u(csc)=@switch/inline t(strlen(%0))[valnum(%0)]=11,{@include u(csc)/%5`TAG`TAGLIST},0*,{@include u(csc)/%5`TAG`TAGS},10,{@include u(csc)/%5`TAG`TAGLIST}
  428. &EFF`TAG`TAGS u(csc)=@include u(csc)/TAG`LIST
  429. &EFF`TAG`TAGLIST u(csc)=@include u(csc)/VAL`TAG=%0,%4;@nspemit %#=u(RFN`HEADER,%3 Database: %q<tag> Tagged Entries);@include u(csc)/%5`CASCADE=%0,%1,%2,%3,%4,%5,u(DBFUN`TAGSEARCH,%4,%q<tagnum>);@nspemit %#=u(RFN`HEADER)
  430.  
  431. &EFF`ADDTAG u(csc)=@include u(csc)/ITM`TAG;@include u(csc)/INC`PMSG=%#,{Changed DB [u(RET`EFFNAME`FORMAL,u(maindb),%q<id>)]'s Tags to: %q<taglist>};@include u(csc)/INC`AMSG={Changed DB [u(RET`EFFNAME`FORMAL,u(maindb),%q<id>)]'s Tags to: %q<taglist>},%#
  432. &EFF`MAKETAG u(csc)=@include u(csc)/TAG`MAKE
  433. &EFF`RENTAG u(csc)=@include u(csc)/TAG`RENAME
  434. &EFF`DELTAG u(csc)=@include u(csc)/TAG`DEL
  435. &EFF`TAGDESC u(csc)=@include u(csc)/TAG`DESC
  436.  
  437. @@ ****** FORM SECTION
  438. &FRM`MAIN u(csc)=@switch/inline t(strlen(%0))[valnum(%0)]=11,{@include u(csc)/%5`MAIN`ITEM},0*,{@include u(csc)/%5`MAIN`CATLIST},10,{@include u(csc)/%5`MAIN`CATEGORY}
  439.  
  440. &FRM`MAIN`CATLIST u(csc)=@include u(csc)/CAT`LIST
  441.  
  442. &FRM`MAIN`UNCATEGORIZED u(csc)=@nspemit %#=u(RFN`HEADER,%3 Database: Uncategorized Entries);@include u(csc)/%5`CASCADE=%0,%1,%2,%3,%4,%5,u(DBFUN`UNCATSEARCH,%4);@nspemit %#=u(RFN`HEADER)
  443.  
  444. &FRM`CASCADE u(csc)=@nspemit %#=align(4 12 20,ID,NAME,DESC);@dolist/inline iter(%6,last(%i0,`))={@nspemit %#=align(4 12 20,pueblize(%i0,setr(pueblo,+%5 %i0)),pueblize(get(u(maindb)/%4`%i0),%q<pueblo>),get(u(maindb)/%4`%i0`DESC))}
  445.  
  446. &FRM`MAIN`ITEM u(csc)=@include u(csc)/DB`SEARCH=%0,%4;@nspemit %#=u(RFN`HEADER,u(RET`FORMNAME`FORMAL,u(maindb),%q<id>));@nspemit %#=align(25 25 25,iter(CLASS RACE,align(>10 14,%i0:,udefault(u(csc)/FRM`MAIN`ITEM`%i0,get(u(maindb)/%4`%q<id>`%i0),u(maindb),%4`%q<id>)),%b,%r),iter(WEAK RESIST NULL,align(>10 14,%i0:,udefault(u(csc)/FRM`MAIN`ITEM`%i0,get(u(maindb)/%4`%q<id>`%i0),u(maindb),%4`%q<id>)),%b,%r),iter(STAT,align(>10 14,%i0:,udefault(u(csc)/FRM`MAIN`ITEM`%i0,get(u(maindb)/%4`%q<id>`%i0),u(maindb),%4`%q<id>)),%b,%r));@switch/inline t(words(setr(atks,sortkey(#lambda/last(\%0,`),lattr(u(maindb)/%4`%q<id>`ATK`*)))))=1,{@nspemit %#=u(RFN`SUBHEADER,Attacks);@nspemit %#=align(2 4 16 12 4 4 4 4 20,#,ID,NAME,ELE,POW,ACC,EFF,AOE,DESC);@dolist/inline %q<atks>={@nspemit %#=align(2 4 16 12 4 4 4 4 20,pueblize(last(%i0,`),setr(pueblo,+%5 %q<id>=[last(%i0,`)])),if(valnum(get(u(maindb)/%i0`ID)),pueblize(get(u(maindb)/%i0`ID),+atk [get(u(maindb)/%i0`ID)]),get(u(maindb)/%i0`ID)),pueblize(get(u(maindb)/%i0),%q<pueblo>),iter(get(u(maindb)/%i0`ELEMENT),u(RET`ELENAME,%i0)),get(u(maindb)/%i0`POWER),get(u(maindb)/%i0`ACCURACY),if(words(reglattr(u(maindb)/^%i0`(INFLICTS|CLEARS|ADOPTS|PURGES)`\\d+$)),Yes,No),add(get(u(maindb)/%i0`AOE),0),get(u(maindb)/%i0`DESC))}};@nspemit %#=u(RFN`HEADER)
  447.  
  448. &FRM`MAIN`ITEM`CLASS u(csc)=u(RET`CLANAME,get(%0/%1`CLASS))
  449. &FRM`MAIN`ITEM`STAT u(csc)=trim(iter(sortkey(#lambda/last(\%0,`),lattr(%0/%1`STAT`*)),u(RET`STATNAME,last(%i0,`)): [get(%0/%i0)],%b,%r),%r)
  450. &FRM`MAIN`ITEM`WEAK u(csc)=trim(iter(sortkey(#lambda/last(\%0,`),lattr(%0/%1`WEAK`*)),u(RET`ELENAME,last(%i0,`)): [get(%0/%i0)],%b,%r),%r)
  451. &FRM`MAIN`ITEM`RESIST u(csc)=
  452. &FRM`MAIN`ITEM`NULL u(csc)=
  453.  
  454.  
  455.  
  456. &FRM`FUN`STATUSCOLADM u(csc)=trim(iter(sortkey(#lambda/last(\%0,`),lattr(%0/%1`%2`*),n),align(20 4,pueblize([last(%i0,`)]: '[u(RET`EFFNAME,u(maindb),last(%i0,`))]',+eff [last(%i0,`)]),strfirstof(get(%0/%i0),DEF)\%),%b,%r),%r)
  457.  
  458. &FRM`MAIN`CATEGORY u(csc)=@switch/inline %0=Uncategorized,{@include u(csc)/%5`MAIN`UNCATEGORIZED},{@include u(csc)/VAL`CATEGORY=%0,%4;@nspemit %#=u(RFN`HEADER,%3 Database: %q<category> Entries);@include u(csc)/%5`CASCADE=%0,%1,%2,%3,%4,%5,u(DBFUN`CATSEARCH,%4,%q<catnum>);@nspemit %#=u(RFN`HEADER)}
  459.  
  460. &FRM`ADD u(csc)=@include u(csc)/ITM`ADD=%0,%1,%2,%3,%4,FORM
  461.  
  462. &FRM`ATK u(csc)=@include u(csc)/DB`SEARCH=before(%0,/),%4,,1;@include u(csc)/VAL`ATKSLOT=elements(%0,2,/);@switch/inline words(%1,/)=1,{@include u(csc)/DB`SEARCH=%1,A,,1,,,aid;@include u(csc)/SET`FORM`ATK`ID=u(maindb),%q<id>,%q<slot>,%q<aid>},{@include u(csc)/SET`FORM`ATK`STRING=u(maindb),%q<id>,%q<slot>,%1}
  463.  
  464. &FRM`SET u(csc)=@include u(csc)/VAL`ATKSLOT=before(%0,/);@include u(csc)/DB`SEARCH=%q<slot>,%4;@include u(ccs)/INC`PARTIAL=elements(%0,2,/),STAT|CLASS|WEAK|RESIST|NULL|ATK|PARA,|,v(VAR`MSGHEAD),choice,choice;@include u(csc)/FRM`SET`%q<choice>=elements(%0,3 4 5 6 7 8 9,/,/),%1
  465.  
  466. &FRM`SET`STAT u(csc)=@include u(csc)/SET`FORM`STAT=u(maindb),%q<id>,%0,%1
  467. &FRM`SET`CLASS u(csc)=@include u(csc)/SET`FORM`CLASS=u(maindb),%q<id>,%1
  468. &FRM`SET`PARA u(csc)=@include u(csc)/VAL`ATKSLOT=%0;@include u(csc)/SET`ATK`PARA=u(maindb),%q<id>,%q<slot>,%1
  469.  
  470. &FRM`SET`WEAK u(csc)=@include u(csc)/SET`FORM`ELELIKE=u(maindb),%q<id>,%1,WEAK
  471. &FRM`SET`RESIST u(csc)=@include u(csc)/SET`FORM`ELELIKE=u(maindb),%q<id>,%1,RESIST
  472. &FRM`SET`NULL u(csc)=@include u(csc)/SET`FORM`ELELIKE=u(maindb),%q<id>,%1,NULL
  473.  
  474. &FRM`SET`STAT u(csc)=@include u(csc)/SET`FORM`STAT=u(maindb),%q<id>,%0,%1
  475.  
  476. &FRM`RENAME u(csc)=@include u(csc)/ITM`RENAME=%0,%1,%2,%3,%4,FORM
  477. &FRM`WIPE u(csc)=@include u(csc)/ITM`WIPE=%0,%1,%2,%3,%4,FORM
  478. &FRM`CATEGORY u(csc)=@include u(csc)/ITM`CATEGORY=%0,%1,%2,%3,%4,FORM;@include u(csc)/INC`PMSG=%#,{Changed DB [u(RET`FORMNAME`FORMAL,u(maindb),%q<id>)]'s Category to: %q<catlist>};@include u(csc)/INC`AMSG={Changed DB [u(RET`FORMNAME`FORMAL,u(maindb),%q<id>)]'s Category to: %q<catlist>},%#
  479. &FRM`DESC u(csc)=@include u(csc)/ITM`DESC=%0,%1,%2,%3,%4,FORM
  480.  
  481. &FRM`MAKECATEGORY u(csc)=@include u(csc)/CAT`MAKE
  482. &FRM`RENCATEGORY u(csc)=@include u(csc)/CAT`RENAME
  483. &FRM`DELCATEGORY u(csc)=@include u(csc)/CAT`DEL
  484. &FRM`CATDESC u(csc)=@include u(csc)/CAT`DESC
  485.  
  486. &FRM`TAGS u(csc)=@switch/inline t(strlen(%0))[valnum(%0)]=11,{@include u(csc)/%5`TAG`TAGLIST},0*,{@include u(csc)/%5`TAG`TAGS},10,{@include u(csc)/%5`TAG`TAGLIST}
  487. &FRM`TAG`TAGS u(csc)=@include u(csc)/TAG`LIST
  488. &FRM`TAG`TAGLIST u(csc)=@include u(csc)/VAL`TAG=%0,%4;@nspemit %#=u(RFN`HEADER,%3 Database: %q<tag> Tagged Entries);@include u(csc)/%5`CASCADE=%0,%1,%2,%3,%4,%5,u(DBFUN`TAGSEARCH,%4,%q<tagnum>);@nspemit %#=u(RFN`HEADER)
  489.  
  490. &FRM`ADDTAG u(csc)=@include u(csc)/ITM`TAG;@include u(csc)/INC`PMSG=%#,{Changed DB [u(RET`FRMNAME`FORMAL,u(maindb),%q<id>)]'s Tags to: %q<taglist>};@include u(csc)/INC`AMSG={Changed DB [u(RET`FRMNAME`FORMAL,u(maindb),%q<id>)]'s Tags to: %q<taglist>},%#
  491. &FRM`MAKETAG u(csc)=@include u(csc)/TAG`MAKE
  492. &FRM`RENTAG u(csc)=@include u(csc)/TAG`RENAME
  493. &FRM`DELTAG u(csc)=@include u(csc)/TAG`DEL
  494. &FRM`TAGDESC u(csc)=@include u(csc)/TAG`DESC
  495.  
  496.  
  497. @@ ************ ENGINE SECTION
  498. @switch/inline isdbref(u(cso))=0,{@tel create(Combat System Object <CSO>)=config(master_room)}
  499. &cso u(coi)=locate(config(master_room),Combat System Object <CSO>,TXxi)
  500. @parent u(cso)=u(coi)
  501. @set u(cso)=WIZARD SAFE !NO_COMMAND
  502.  
  503. &maindb u(cso)=u(csdb)
  504.  
  505. @@ *********** RETRIEVAL SECTION
  506. &RET`CURFORM u(cso)=get(%0/D`CSYS`FORM)
  507. &RET`CURPOI u(cso)=bound(sub(u(RET`MAXPOI,%0,strfirstof(%1,u(RET`CURFORM,%0)),%2),u(RET`POIDAMAGE,%0,strfirstof(%1,u(RET`CURFORM,%0)),%2)),0)
  508. &RET`MAXPOI u(cso)=u(RET`MAXPOI`%2,%0,strfirstof(%1,u(RET`CURFORM,%0)))
  509. &RET`MAXPOI`1 u(cso)=floor(add(fdiv(mul(add(mul(u(RET`STAT,%0,%1,2),2.75),100),mul(u(RET`ALLSTATS,%0,%1),1)),100),10))
  510.  
  511. &RET`MAXPOI`1 u(cso)=floor(add(fdiv(mul(add(mul(u(RET`STAT,%0,%1,2),4),100),fdiv(u(RET`ALLSTATS,%0,%1),5)),100),250))
  512.  
  513. &RET`MAXPOI`1 u(cso)=floor(add(100,fdiv(u(RET`ALLSTATS,%0,%1),2),mul(u(RET`STAT,%0,%1,2),4)))
  514.  
  515.  
  516. &RET`MAXPOI`2 u(cso)=150
  517.  
  518. &RET`ALLSTATS u(cso)=lmath(add,iter(u(u(csc)/RET`STATLISTNUM),u(RET`STAT,%0,%1,%i0),|,%b))
  519.  
  520. &RET`POIDAMAGE u(cso)=add(get(%0/D`CSYS`DAMAGE`%2),0)
  521. &RET`FORM`NAME u(cso)=default(%0/D`CSYS`FORM`[strfirstof(%1,get(%0/D`CSYS`FORM))],*Unknown Form*)
  522. &RET`STAT u(cso)=add(get(%0/D`CSYS`FORM`[strfirstof(%1,u(RET`CURFORM,%0))]`STAT`%2),0)
  523. &RET`ELETYPE u(cso)=switch(1,t(match(get(%0/D`CSYS`FORM`%1`WEAK),%2)),1,t(match(get(%0/D`CSYS`FORM`%1`RESIST),%2)),2,t(match(get(%0/D`CSYS`FORM`%1`NULL),%2)),3,0)
  524.  
  525. &RET`ATK`TYPE u(cso)=get(%0/%1`TYPE)
  526. &RET`ATK`TYPENAME u(cso)=u(u(csc)/RET`TYPNAME,u(RET`ATK`TYPE,%0,%1))
  527. &RET`ATK`ELENUMLIST u(cso)=get(%0/%1`ELEMENT)
  528. &RET`ATK`ELENAMES u(cso)=iter(u(RET`ATK`ELENUMLIST,%0,%1),u(u(csc)/RET`ELENAME,%i0))
  529. &RET`ATK`POWER u(cso)=add(get(%0/%1`POWER),0)
  530. &RET`ATK`ACCURACY u(cso)=add(get(%0/%1`ACCURACY),0)
  531. &RET`ATK`AOE u(cso)=bound(add(get(%0/%1`AOE),0),1)
  532.  
  533. &RET`DEF`EVASION u(cso)=add(get(%0/%1`EVASION),0)
  534. &RET`DEF`DEFENSE u(cso)=add(get(%0/%1`DEFENSE),0)
  535.  
  536. @@ *********** VALIDATION SECTION
  537. &VAL`INFORM u(cso)=@assert hasattr(%0/D`CSYS`FORM`[strfirstof(%1,u(RET`CURFORM,%0))])=@include u(cso)/MSG`P={ERROR: [if(strmatch(%0,%#),You are,name(%0) is)] not in a valid form.},%#
  538.  
  539. @@ ****** STATS SECTION
  540.  
  541. &CMD`+STATS u(cso)=$^\+stats(?\:/(\S+)?)?(?\: +(.+?))?$:@switch/inline and(gt(strlen(%2),0),or(isadmin(%#),1))=1,{@include u(ccs)/INC`CHECKPC=%2,1,CSYS;@include u(cso)/STATS`MAIN=%q<t1>},{@include u(cso)/STATS`MAIN=%#}
  542. @set u(cso)/CMD`+STATS=regexp
  543.  
  544. &STATS`MAIN u(cso)=@include u(cso)/STATS`INIT=%0;@include u(cso)/STATS`HEADER=%0,%q<form>;@include u(cso)/STATS`BODY=%0,%q<form>;@include u(cso)/STATS`STATUS=%0,%q<form>;@include u(cso)/STATS`EFFECTS=%0,%q<form>;@include u(cso)/STATS`FOOTER=%0,%q<form>
  545.  
  546. &STATS`INIT u(cso)=th setq(form,u(RET`CURFORM,%0));@include u(cso)/VAL`INFORM=%0,%q<form>
  547.  
  548. &STATS`HEADER u(cso)=@nspemit %#=ansi(hm,+---------+)[center(ansi(h,* [name(%0)]'s [u(RET`FORM`NAME,%0,%1)] Form *),53,ansi(hm,-))][ansi(hm,+------------+)]%R[align(1. 74 1.,ansi(hm,|),center(ansi(c,STATS),8)[ansi(hm,|)][center(ansi(c,SKILLS),53)][ansi(hm,|)]%B[center(ansi(c,RESISTANCE),11)],ansi(hm,|)%R)]%R[ansi(hm,+)][repeat(ansi(hm,-),9)][ansi(hm,+)][repeat(ansi(hm,-),53)][ansi(hm,+)][repeat(ansi(hm,-),12)][ansi(hm,+)]
  549.  
  550. &STATS`BODY u(cso)=@nspemit %#=align(1. 7 1. 51 1. 10 1.,ansi(hm,|),u(STATFUN`STATS,%0,%1),ansi(hm,|),u(STATFUN`ATTACKS,%0,%1),ansi(hm,|),u(STATFUN`ELEMENTS,%0,%1),ansi(hm,|)%R)
  551.  
  552. &STATS`STATUS u(cso)=@nspemit %#=[ansi(hm,+)][repeat(ansi(hm,-),9)][ansi(hm,+)][repeat(ansi(hm,-),53)][ansi(hm,+)][repeat(ansi(hm,-),12)][ansi(hm,+)];@nspemit %#=align(1. 35 1. 36 1.,ansi(hm,|),center(u(u(csc)/RET`POINAME,1): [u(RET`CURPOI,%0,%1,1)]/[u(RET`MAXPOI,%0,%1,1)],35),ansi(hm,|),center(u(u(csc)/RET`POINAME,2): [u(RET`CURPOI,%0,%1,2)]/[u(RET`MAXPOI,%0,%1,2)],35),ansi(hm,|)%R)
  553.  
  554. &STATS`EFFECTS u(cso)=@switch/inline gt(nattr(%0/D`CSYS`EFF`*),0)=1,{@nspemit %#=ansi(hm,+)[center(ansi(h,* Effects *),76,ansi(hm,-))][ansi(hm,+)];th setq(effs,sortkey(#lambda/last(\%0,`),lattr(%0/D`CSYS`EFF`*)));@dolist/inline lnum(1,bound(div(words(%q<effs>),2),1))={th setq(num,add(%q<num>,1));@nspemit %#=align(1. 35 1. 36 1.,ansi(hm,|),u(FUN`SHOWEFF,%0,elements(%q<effs>,sub(mul(%i0,2),1))),ansi(hm,|),u(FUN`SHOWEFF,%0,elements(%q<effs>,mul(%i0,2))),ansi(hm,|))}}
  555.  
  556. &STATS`FOOTER u(cso)=@nspemit %#=ansi(hm,+)[repeat(ansi(hm,-),76)][ansi(hm,+)]
  557.  
  558. &STATFUN`STATS u(cso)=iter(u(u(csc)/RET`STATLISTNUM),u(u(csc)/RET`STATNAME,%i0): [u(RET`STAT,%0,%1,%i0)],|,%R%R%R)
  559.  
  560. &STATFUN`ATTACKS u(cso)=iter(sortkey(#lambda/last(\%0,`),lattr(%0/D`CSYS`FORM`%1`ATK`*)),align(18 18 >13,ansi(h,u(u(csc)/RET`ATKNAME,%0,%1,last(%i0,`))),default(%0/%i0`DESC,Undesced Attack!),if(setr(cost,u(FUN`GET`COST,%0,%q<form>,,%i0,1)),rjust(%q<cost>,2,0) [ansi(hb,SP)])),%b,%R%R)
  561.  
  562. &STATFUN`ELEMENTS u(cso)=iter(1|2|3|4|5|6|7|8|9,rjust(left(u(u(csc)/RET`ELENAME,%i0),5):,6) [switch(u(RET`ELETYPE,%0,%1,%i0),0,--,1,ansi(hr,Wk),2,ansi(hg,Rs),3,ansi(hx,Nu))],|,%R%R)
  563.  
  564. &FUN`SHOWEFF u(cso)=if(and(isdbref(%0),words(%1,`)),rjust(last(%1,`),2). [default(%0/%1,Unnamed Effect)] [if(get(%0/%1`DURATION),%B\([if(strmatch(get(%0/%1`DURATION),X),Indefinite,get(%0/%1`DURATION) [if(gt(get(%0/%1`DURATION),1),Turns,Turn)] Remaining)]\))])
  565.  
  566.  
  567. &CMD`+TALK u(cso)=$^(?\:\+)?talk(?\: +(.+?))?$:@assert strlen(%1)=@nspemit %#=announce(COMBAT) Who will you talk with?;@include u(ccs)/INC`CHECKPC=%1,1,COMBAT;@assert strmatch(loc(%q<t1>),%l)=@nspemit %#=announce(COMBAT) They're not in the room!;@nspemit %#=It's no use! They're out for blood!
  568. @set u(cso)/CMD`+TALK=regexp
  569.  
  570. &CMD`+FORM u(cso)=$^\+form(?\: +(.+?))?$:@switch/inline strlen(%1)=0,{@nspemit %#=header(Your Forms);@nspemit %#=table(iter(sortkey(#lambda/last(\%0,`),lattr(%#/D`CSYS`FORM`*)),rjust(pueblize(last(%i0,`),+form [last(%i0,`)]),2). [pueblize(get(%#/%i0),+form [last(%i0,`)])],%B,|),25,78,|);@nspemit %#=header()},{@assert strlen(%1)=@nspemit %#=announce(COMBAT) What form will you take?;@switch/inline regmatchi(%1,^(\\d+|\[a-z\])$)=1,{@assert hasattr(%#/D`CSYS`FORM`%1)=@nspemit %#=announce(COMBAT) You don't have a form in that slot!;th setq(slot,%1)},0,{@assert gt(words(setr(attr,grepi(%#,D`CSYS`?,%1))),0)=@nspemit %#=announce(COMBAT) You don't have a form named '%1';@break gt(words(%q<attr>),1)=@nspemit %#=announce(COMBAT) [words(%q<attr>)] Forms share that name: [itemize(iter(%q<attr>,last(%i0,`),%B,|),|,and,\,)]. Please select by the slot.;th setq(slot,last(%q<attr>,`))};&D`CINFO`FORMS`LASTFORM %#=u(RET`CURFORM,%#);&D`CSYS`FORM %#=%q<slot>;@nsremit %l=roomannounce(COMBAT) [ansi(h,%n)] changed forms to: [ansi(h,get(%#/D`CSYS`FORM`%q<slot>))]}
  571. @set u(cso)/CMD`+FORM=regexp
  572.  
  573. &CMD`+QUEUE u(cso)=$+queue:@assert words(setr(atks,sortkey(#lambda/last(\%0,`),lattr(%#/D`CSYS`INCOMING`*))))=@nspemit %#=announce(COMBAT) You have no incoming attacks!;@nspemit %#=header(Your Incoming Attacks);@dolist/inline %q<atks>={@nspemit %#=rjust(last(%i0,`),2). [name(get(%#/%i0))]%RAttack: [get(%#/%i0`ATK)]};@nspemit %#=header()
  574.  
  575. &CMD`+RESET u(cso)=$+reset:@wipe %#/D`CSYS`EFF;@dolist/inline/delimit | [u(u(csc)/RET`POILISTNUM)]={&D`CSYS`DAMAGE`%i0 %#=floor(sub(setr(maxpoi,u(RET`MAXPOI,%#,,%i0)),mul(%q<maxpoi>,strfirstof(get(u(maindb)/POI`%i0`RESET),1))))};@wipe %#/D`CSYS`Q;@include u(cso)/MSG`R=[ansi(h,%n)] has Reset!,%l
  576.  
  577.  
  578.  
  579. @@ ******* MESSAGE SECTION
  580. &VAR`MSGHEAD u(cso)=COMBAT
  581.  
  582. &MSG`P u(cso)=@nspemit %1=msghead(v(VAR`MSGHEAD)) %0
  583. &MSG`A u(cso)=@nscemit/noisy u(CMO`STAFFREP)=ansi(h,\[[name(firstof(%1,%#))]\]) %0
  584. &MSG`R u(cso)=@message lplayers(%1)=FORMATTING ERROR,u(cso)/MSG`R`FORMAT,##,%0
  585. &MSG`R`FORMAT u(cso)=msghead(v(VAR`MSGHEAD)) %1
  586.  
  587. @@ ******* ATTACK SECTION
  588. &CMD`+ATTACK u(cso)=$^(?s)(?\:\+)?(attack)(?\:/(\S+)?)?(?\: +(.+?))?(?\:=(.*))?$:@include u(ccs)/INC`PARTIAL=%2,setunion(get(u(cso)/VAR`ATTACK`PLAYFLAGS),if(isadmin(%#),get(u(cso)/VAR`ATTACK`ADMINFLAGS)),|,|),|,COMBAT,switch,switch;th setq(form,u(RET`CURFORM,%#));@include u(cso)/VAL`INFORM=%#,%q<form>;@include u(cso)/VAL`NOTKO;@switch/inline t(nattr(%#/D`CSYS`Q`*))=1,{@include u(ccs)/INC`VERIFY={ansi(hr,WARNING:) You have attacks pending in your [pueblize(+queue,+queue)] that should be responded to first. If you want to launch your attack anyways enter the same command again quickly.},ATTACK OVERRIDE 1,v(VAR`MSGHEAD)};@include u(cso)/ATK`[strfirstof(%q<switch>,MAIN)]=trim(%3),trim(%4),capnames(%1)
  589. @set u(cso)/CMD`+ATTACK=regexp
  590.  
  591. &ATK`MAIN u(cso)=@include u(cso)/ATK`CHECKTARGET;@include u(cso)/ATK`CHECKATTACK;@include u(cso)/ATK`CHECKCOST;@include u(cso)/ATK`LAUNCHATTACK;@include u(cso)/ATK`RUNCOSTS;@include u(cso)/ATK`RUNPURGES;@include u(cso)/ATK`TICKER;@include u(cso)/ATK`RUNADOPTS;@include u(cso)/ATK`RECORD
  592.  
  593. &ATK`CHECKTARGET u(cso)=@assert strlen(%0)=@include u(cso)/MSG`P={Who will you attack?},%#;@dolist/inline/delimit \, %0={@include u(ccs)/INC`CHECKPC=trim(%i0),inum(0),v(VAR`MSGHEAD);@assert strmatch(%l,loc(%q<t[inum(0)]>))=@include u(cso)/MSG`P={%q<t[inum(0)]name> is not in the room!},%#;@assert hasflag(%q<t[inum(0)]>,CONNECTED)=@include u(cso)/MSG`P={%q<t[inum(0)]name> isn't online!},%#;@break strlen(grepi(%q<t[inum(0)]>,D`CSYS`Q`*,%#))=@include u(cso)/MSG`P={You already attacked %q<t[inum(0)]name>!},%#;th setq(targetsnum,add(1,%q<targetsnum>));th setq(targets,setunion(%q<targets>,%q<t[inum(0)]>))}
  594.  
  595. &ATK`CHECKATTACK u(cso)=@assert strlen(before(%1,:))=@include u(cso)/MSG`P={What attack will you use?},%#;th setq(atksource,%#);@assert strlen(setr(atkroot,u(u(cso)/FUN`FINDATTACK,%#,%q<form>,before(%1,:))))=@include u(cso)/MSG`P={You don't have an attack named [before(%1,:)]!},%#;@break gt(%q<targetsnum>,setr(aoe,u(RET`ATK`AOE,%q<atksource>,%q<atkroot>)))=@include u(cso)/MSG`P={That attack does not support more than %q<aoe> target(s)!},%#;th setq(altatkname,after(%1,:));th setq(atkname,u(u(csc)/RET`ATKNAME,%#,%q<form>,setr(atkslot,last(%q<atkroot>,`))))
  596.  
  597. &FUN`FINDATTACK u(cso)=strfirstof(first(filterbool(#lambda/strmatch(get(%0/\%0),%2),sortkey(#lambda/last(\%0,`),reglattr(%0/^D`CSYS`FORM`%1`(F|D)?ATK`\\d+$)))),first(filterbool(#lambda/strmatch(get(%0/\%0),%2*),sortkey(#lambda/last(\%0,`),reglattr(%0/^D`CSYS`FORM`%1`(F|D)?ATK`\\d+$)))))
  598.  
  599. &ATK`CHECKCOST u(cso)=@assert gte(u(RET`CURPOI,%#,%q<form>,2),setr(cost,u(RET`ATK`COST,%#,%q<form>,%q<atkslot>)))=@include u(cso)/MSG`P={You lack the %q<cost> SP required to use %q<atkname>!},%#
  600.  
  601. &ATK`LAUNCHATTACK u(cso)=@dolist/inline %q<targets>={th setq(incslot,nextslot(%i0,D`CSYS`Q));&[setr(fullslot,D`CSYS`Q`%q<incslot>)] %i0=%#;@include u(ccs)/INC`CPTREE=%q<atksource>,%q<atkroot>,%i0,%q<fullslot>`ATK;@include u(ccs)/INC`CPTREE=%#,D`CSYS`EFF,%i0,%q<fullslot>`EFF;@include u(ccs)/INC`CPTREE=%#,D`CSYS`FORM`%q<form>`STAT,%i0,%q<fullslot>`STAT;@dolist/inline/delimit | [u(u(csc)/RET`POILISTNUM)]={&%q<fullslot>`CURPOI`%i0 %i1=u(RET`CURPOI,%#,%q<form>,%i0);&%q<fullslot>`MAXPOI`%i0 %i1=u(RET`MAXPOI,%#,%q<form>,%i0)}};@include u(cso)/MSG`R=ansi(h,%n) targeted [itemize(iter(%q<targets>,name(%i0),%b,|),|,and,\,)] with [setr(dispname,[strfirstof(%q<altatkname>,%q<atkname>)][if(strlen(%q<altatkname>),%B\(%q<atkname>\))])];@dolist/inline %q<targets>={@include u(cso)/MSG`P={ansi(h,%n)'s %q<dispname> has been added to your [pueblize(+queue,+queue)]},%i0}
  602.  
  603. &ATK`RUNCOSTS u(cso)=@switch/inline t(%q<cost>)=1,{th u(POI`DEDUCT,%#,2,%q<cost>)}
  604.  
  605. &ATK`ADOPTS u(cso)=@dolist/inline/nobreak lattr(%q<atksource>/%q<atkroot>`INFLICTS`*)={@switch/inline or(strmatch(setr(effchance,get(%q<atksource>/%i0)),X),lte(setr(effrand,rand(1,100)),%q<effchance>))=1,{@include u(cso)/EFF`ADD=%#,%#,last(%i0,`);th setq(effslots,setunion(%q<effslot>,%q<effslots>));@include u(cso)/DEF`DEBUG={ADOPTS: [get(u(maindb)/E`[last(%i0,`)])] - IS SEED %q<effrand> <= CHANCE %q<effchance>: YES! Applied [switch(%q<dur>,X,indefinitely,for %q<dur> turns.)]}},0,{th setq(efffailed,setunion(last(%i0,`),%q<efffailed>));@include u(cso)/DEF`DEBUG={ADOPTS: [get(u(maindb)/E`[last(%i0,`)])] - IS SEED %q<effrand> <= CHANCE %q<effchance>: NO! Resisted.}}};@include u(cso)/DEF`INFLICTS`SUCCESS;@include u(cso)/DEF`INFLICTS`FAILURE
  606.  
  607. &ATK`ADOPTS`SUCCESS u(cso)=@switch/inline t(words(%q<effslots>))=1,{@include u(cso)/MSG`R={ansi(h,%n) is now affected by: [itemize(iter(%q<effslots>,ansi(h,get(%#/%i0)) [switch(get(%#/%i0`DURATION),X,indefinitely,for [get(%#/%i0`DURATION)] turns)],%b,|),|,and,\,)].},%l}
  608.  
  609. &DEF`ADOPTS`FAIL u(cso)=@switch/inline t(words(%q<efffailed>))=1,{@include u(cso)/MSG`R={ansi(h,%n) shrugged off: [itemize(iter(%q<efffailed>,ansi(h,get(%0/E`%i0)),%b,|),|,and,\,)].},%l}
  610.  
  611. &DEF`PURGES u(cso)=@switch/inline t(words(setr(clears,get(%q<atksource>/%q<incslot>`PURGES))))=1,{@switch/inline or(strmatch(setr(clrchance,get(%q<atksource>/%q<atkroot>`PURGES`CHANCE)),X),lte(setr(clrrand,rand(1,100)),%q<clrchance>))=1,{@switch/inline gt(words(setr(clearing,filterbool(#lambda/words(setinter(get(%#/\%0`TAGS),%q<clears>)),lattr(%#/D`CSYS`EFF`*)))),0)=1,{@include u(cso)/MSG`R={ansi(h,%n) was cleared of: [itemize(iter(%q<clearing>,name(get(%#/%i0`SOURCE))'s [get(%#/%i0)],%b,|),|,and,\,)] by %q<atkname>.},%l;@dolist/inline %q<clearing>={@wipe %#/%i0}},0,{@include u(cso)/MSG`R={ansi(h,%n) is not affected by %q<atkname>'s Status Clearing!},%l}},0,{@include u(cso)/MSG`R={ansi(h,%n) resisted %q<atkname>'s Status Clearing!,%l}}
  612.  
  613.  
  614. @@ ******** DEFENSE SECTION
  615. &CMD`+DEFEND u(cso)=$^(?s)(?\:\+)?(guard|evade|accept|counter)(?\:/(\S+)?)?(?\: +(.+?))?(?\:=(.*))?$:@include u(ccs)/INC`PARTIAL=%2,setunion(get(u(cso)/VAR`DEFENSE`PLAYFLAGS),if(isadmin(%#),get(u(cso)/VAR`DEFENSE`ADMINFLAGS)),|,|),|,COMBAT,switch,switch;th setq(form,u(RET`CURFORM,%#));@include u(cso)/VAL`INFORM=%#,%q<form>;@assert nattr(%#/D`CSYS`Q`*)=@include u(cso)/MSG`P={You have no incoming attacks to respond to!},%#;@include u(cso)/DEF`[strfirstof(%q<switch>,MAIN)]=trim(%3),trim(%4),capnames(%1)
  616. @set u(cso)/CMD`+DEFEND=regexp
  617.  
  618. &DEF`MAIN u(cso)=@include u(cso)/DEF`QUEUECHECK;@include u(cso)/DEF`PREPDEFENSE;@include u(cso)/DEF`CHECKCOSTS;@include u(cso)/DEF`HITCHECK;@include u(cso)/DEF`DEBUG`1;@switch/inline %q<hitresult>=1,{@include u(cso)/DEF`HIT},0,{@include u(cso)/DEF`MISS};@include u(cso)/DEF`DEBUG`%q<debmode>;@include u(cso)/DEF`KOCHECK;@switch/inline default(%#/VAR`WIPEATTACKS,1)=0,{},{@wipe %#/%q<incslot>}
  619.  
  620. &DEF`HIT u(cso)=@switch/inline t(u(GET`NODAMAGE,%#,%q<incslot>))[t(u(GET`HEALING,%#,%q<incslot>))]=01,{@include u(cso)/DEF`HEALING},11,{@include u(cso)/DEF`HEALING},10,{@include u(cso)/DEF`NODAMAGE},00,{@include u(cso)/DEF`DAMAGE};@include u(cso)/DEF`INFLICTS;@include u(cso)/DEF`CLEARS
  621.  
  622. &DEF`QUEUECHECK u(cso)=@assert strlen(%0)=@include u(cso)/MSG`P={What attack will you respond to?},%#;@switch/inline valnum(%0)=1,{@assert hasattr(%#/[setr(incslot,D`CSYS`Q`[setr(inc,add(%0,0))])])=@include u(cso)/MSG`P={No attack in Slot %q<inc>.},%#},{@assert words(setr(atker,namegrab(iter(lattr(%#/D`CSYS`Q`*),get(%#/%i0)),%0)))=@include u(cso)/MSG`P={No incoming attack from them.},%#;@break gt(words(setr(incslot,grepi(%#,D`CSYS`Q`*,%q<atker>))),1)=@include u(cso)/MSG`P={You have multiple attacks from [name(%q<atker>)]. Target them by their slot number instead.},%#;th setq(inc,last(%q<incslot>,`))};th setq(atker,get(%#/%q<incslot>));th setq(atkname,get(%#/%q<incslot>`ATK))
  623.  
  624. &DEF`PREPDEFENSE u(cso)=@switch/inline t(match(GUARD|EVADE|ACCEPT|COUNT,%2,|))=1,{@include u(cso)/DEF`PREPBASIC},0,{};@include u(ccs)/INC`CPTREE=%q<defsource>,%q<defroot>,%#,%q<incslot>`DEF
  625.  
  626. &DEF`PREPBASIC u(cso)=@assert hasattr(setr(defsource,u(cso))/[setr(defroot,BASICDEFENSE`%2)])=@nspemit %#=announce(COMBAT) Basic [capnames(%2)]s of that level are not allowed.
  627.  
  628. &BASICDEFENSE`GUARD u(cso)=Guard
  629. &BASICDEFENSE`GUARD`DEFENSE u(cso)=10
  630.  
  631. &BASICDEFENSE`EVADE u(cso)=Evade
  632. &BASICDEFENSE`EVADE`EVASION u(cso)=10
  633.  
  634. &BASICDEFENSE`ACCEPT u(cso)=Accept
  635. &BASICDEFENSE`COUNTER u(cso)=Counter
  636. &BASICDEFENSE`COUNTER`ELEMENT u(cso)=SWORD
  637. &BASICDEFENSE`COUNTER`TYPE u(cso)=ATK
  638. &BASICDEFENSE`COUNTER`LEVEL u(cso)=20
  639. &BASICDEFENSE`COUNTER`ATKSTAT u(cso)=STR
  640. &BASICDEFENSE`COUNTER`DEFSTAT u(cso)=END
  641. &BASICDEFENSE`COUNTER`ATKMOD u(cso)=1.2
  642.  
  643. &DEF`HITCHECK u(cso)=@include u(cso)/MSG`R={[ansi(h,%n)] [switch(%2,Guard,attempts to block,Evade,attempts to dodge,Accept,does nothing to stop,Counter,attempts to counter)] [name(%q<atker>)]'s %q<atkname>},%l;@switch/inline setr(autohit,t(u(GET`AUTOHIT,%#,%q<incslot>)))=1,{th setq(hitresult,1,hitchance,100,seed,1)},{th setq(hitresult,lte(setr(seed,rand(1,100)),setr(hitchance,u(CALC`HIT,%#,%q<form>,%q<incslot>))))}
  644.  
  645. &GET`AUTOHIT u(cso)=get(u(maindb)/TYP`[get(%0/%1`ATK`TYPE)]`AUTOHIT)
  646. &GET`NODAMAGE u(cso)=get(u(maindb)/TYP`[get(%0/%1`ATK`TYPE)]`NODAMAGE)
  647. &GET`HEALING u(cso)=get(u(maindb)/TYP`[get(%0/%1`ATK`TYPE)]`HEALING)
  648.  
  649. &CALC`HIT u(cso)=add(setr(basehit,ceil(mul(u(RET`ATK`ACCURACY,%0,%2`ATK),ceil(fdiv(u(CALC`TYPE`ASTAT,%0,%1,%2,ACC),u(CALC`TYPE`DSTAT,%0,%1,%2,EVA)))))),setr(accmod,u(GET`ACCMOD`EFF,%0,%2)),mul(setr(evamod,u(GET`EVAMOD`EFF,%0)),-1))
  650.  
  651. &GET`ACCMOD`EFF u(cso)=lmath(add,iter(setr(accmodlist,lattr(%0/%1`EFF`*`ACCMOD)),setr(accmodlist[inum(0)],get(%0/%i0))))
  652. &GET`EVAMOD`EFF u(cso)=lmath(add,iter(setr(evamodlist,lattr(%0/D`CSYS`EFF`*`EVAMOD)),setr(evamodlist[inum(0)],get(%0/%i0))))
  653.  
  654. &GET`DEFMOD`EFF u(cso)=lmath(add,iter(lattr(%0/D`CSYS`EFF`*`DEFMOD),get(%0/%i0)))
  655. &GET`ATKMOD`EFF u(cso)=lmath(add,iter(lattr(%0/%1`EFF`*`ATKMOD),get(%0/%i0)))
  656.  
  657. &GET`ACCTYPE u(cso)=get(u(maindb)/TYP`[get(%0/%1`ATK`TYPE)]`ACC)
  658. &GET`EVATYPE u(cso)=get(u(maindb)/TYP`[get(%0/%1`ATK`TYPE)]`EVA)
  659. &GET`ATKTYPE u(cso)=get(u(maindb)/TYP`[get(%0/%1`ATK`TYPE)]`ATK)
  660. &GET`DEFTYPE u(cso)=get(u(maindb)/TYP`[get(%0/%1`ATK`TYPE)]`DEF)
  661.  
  662. &CALC`TYPE`ASTAT u(cso)=setr(%3tot,mul(setr(%3statmean,ceil(lmath(mean,iter(setr(%3stats,u(GET`%3TYPE,%0,%2)),setr(%3stat[inum(0)]tot,u(CALC`ASTAT,%0,%1,%2,%3,%i0,inum(0))))))),setr(%3statmul,switch(words(%q<%3stats>),1,1,2,1.1,3,1.2,1))))
  663.  
  664. &CALC`ASTAT u(cso)=mul(add(setr(%3stat%5base,add(get(%0/%2`STAT`%4),0)),setr(%3stat%5mod,u(CALC`ASTAT`MOD,%0,%1,%2,%3,%4))),1)
  665. &CALC`ASTAT`MOD u(cso)=lmath(add,iter(setr(%3stat%5modlist,lattr(%0/%2`EFF`*`STATMOD`%2)),setr(%3stat%5mod[inum(0)],get(%0/%i0))))
  666.  
  667. &CALC`TYPE`DSTAT u(cso)=setr(%3tot,mul(setr(%3statmean,ceil(lmath(mean,iter(setr(%3stats,u(GET`%3TYPE,%0,%2)),setr(%3stat[inum(0)]tot,u(CALC`DSTAT,%0,%1,%2,%3,%i0,inum(0))))))),setr(%3statmul,switch(words(%q<%3stats>),1,1,2,1.1,3,1.2,1))))
  668.  
  669. &CALC`DSTAT u(cso)=mul(add(setr(%3stat%5base,add(get(%0/D`CSYS`FORM`%1`STAT`%4),0)),setr(%3stat%5mod,u(CALC`DSTAT`MOD,%0,%1,%2,%3,%4,%5))),1)
  670. &CALC`DSTAT`MOD u(cso)=lmath(add,iter(setr(%3stat%5modlist,lattr(%0/D`CSYS`EFF`*`STATMOD`%4)),setr(%3stat%5mod[inum(0)],get(%0/%i0))))
  671.  
  672. &DEB u(cso)=nscemit(Csys Debug,ansi(h,%n): %0,1)
  673.  
  674. &DEF`DEBUG u(cso)=@nscemit/noisy Csys Debug=[ansi(h,\[%n\])]: %0
  675.  
  676. &DEF`DEBUG`1 u(cso)=@include u(cso)/DEF`DEBUG={ATK: [ansi(h,get(%#/%q<incslot>`ATK))] from [ansi(h,name(get(%#/%q<incslot>)))] in Slot %q<inc>, TYPE [u(RET`ATK`TYPENAME,%#,%q<incslot>`ATK)], ELEMENT [u(RET`ATK`ELENAMES,%#,%q<incslot>`ATK)], ACCURACY [u(RET`ATK`ACCURACY,%#,%q<incslot>`ATK)], POWER [u(RET`ATK`POWER,%#,%q<incslot>`ATK)]};@include u(cso)/DEF`DEBUG={DEF: [get(%#/%q<incslot>`DEF)], DEFENSE [u(RET`DEF`DEFENSE,%#,%q<incslot>`DEF)], EVASION [u(RET`DEF`EVASION,%#,%q<incslot>`DEF)]};@switch/inline %q<autohit>=0,{@include u(cso)/DEF`DEBUG={ATTACKER ACC: [u(DEB`ACCSTATS)]};@include u(cso)/DEF`DEBUG={DEFENDER EVA: [u(DEB`EVASTATS)]};@include u(cso)/DEF`DEBUG={ACCMOD: [u(DEB`ACCMOD)] | EVAMOD: [u(DEB`EVAMOD)]};@include u(cso)/DEF`DEBUG=HITCHECK: Is Seed (%q<seed>) <= Hitchance (%q<hitchance>): [if(%q<hitresult>,ansi(hg,YES! HIT!),ansi(hr,NO! MISS!))]},1,{@include u(cso)/DEF`DEBUG={HITCHECK: Autohit is on, assuming Seed 1 and Hitchance 100}};th unsetq(accstat* evastat*)
  677.  
  678. &DEB`ACCSTATS u(cso)=iter(%q<accstats>,u(u(csc)/RET`STATNAME,%i0) - %q<accstat[inum(0)]base> - MODS [strfirstof(u(DEB`ACCSTATS`MODS,inum(0)),None)]) | TOTAL: %q<accstatmean>
  679. &DEB`ACCSTATS`MODS u(cso)=iter(%q<accstat%0modlist>,elements(%i0,5,`)-[get(%#/[elements(%i0,1 2 3 4 5 6,`,`)])] \(%q<accstat[inum(1)]mod%0\))
  680.  
  681. &DEB`ACCMOD u(cso)=[words(%q<accmodlist>)] MODS[if(words(%q<accmodlist>),%b[u(DEB`ACCMOD`LIST)])] Totaling: %q<accmod>
  682. &DEB`ACCMOD`LIST u(cso)=iter(%q<accmodlist>,elements(%i0,5,`)-[get(%#/[elements(%i0,1 2 3 4 5,`,`)])] \(%q<accmod[inum(0)]>\))
  683.  
  684. &DEB`EVASTATS u(cso)=iter(%q<evastats>,u(u(csc)/RET`STATNAME,%i0) - %q<evastat[inum(0)]base> - MODS [strfirstof(u(DEB`EVASTATS`MODS,inum(0)),None)]) | TOTAL: %q<evastatmean>
  685. &DEB`EVASTATS`MODS u(cso)=iter(%q<evastat%0modlist>,elements(%i0,6,`)-[get(%#/[elements(%i0,1 2 3 4 5 6,`,`)])] \(%q<evastat[inum(1)]mod%0\))
  686.  
  687. &DEB`EVAMOD u(cso)=[words(%q<evamodlist>)] MODS[if(words(%q<evamodlist>),%b[u(DEB`EVAMOD`LIST)])] Totaling: %q<evamod>
  688. &DEB`EVAMOD`LIST u(cso)=iter(%q<evamodlist>,elements(%i0,4,`)-[get(%#/[elements(%i0,1 2 3 4,`,`)])] \(%q<evamod[inum(0)]>\))
  689.  
  690. &DEF`DAMAGE u(cso)=th setq(debmode,2);@switch/inline gt(setr(damage,u(CALC`DAMAGE,%#,%q<form>,%q<incslot>)),0)=1,{@include u(cso)/DEF`DAMAGE`SPLIT;@include u(cso)/DEF`DAMAGE`MESSAGE;@include u(cso)/DEF`DAMAGE`APPLY},0,{@include u(cso)/DEF`DAMAGE`NODAMAGE}
  691.  
  692. &CALC`DAMAGE u(cso)=floor(mul(add(mul(setr(dm1,fdiv(add(mul(setr(levelmul,v(FORMULA`LEVELMUL)),setr(level,v(FORMULA`LEVEL))),setr(levelplus,v(FORMULA`LEVELPLUS))),setr(leveldiv,v(FORMULA`LEVELDIV)))),setr(atkdef,fdiv(u(CALC`TYPE`ASTAT,%0,%1,%2,ATK),u(CALC`TYPE`DSTAT,%0,%1,%2,DEF))),setr(atkpower,u(RET`ATK`POWER,%0,%2`ATK))),setr(atkextr,2)),add(1.0,setr(elementmul,u(CALC`ELEMENTMUL,%0,%1,%2)),setr(rand,fdiv(rand(0,-22),100)))))
  693.  
  694. &FORMULA`LEVELMUL u(cso)=2
  695. &FORMULA`LEVEL u(cso)=40
  696. &FORMULA`LEVELPLUS u(cso)=10
  697. &FORMULA`LEVELDIV u(cso)=250
  698.  
  699. &CALC`ELEMENTMUL u(cso)=if(setr(element,first(u(RET`ATK`ELENUMLIST,%0,%2`ATK))),add(sub(setr(elepowmod,add(u(CALC`ELEPOWMOD,%0,%2,%q<element>),0)),setr(eleresmod,add(u(CALC`ELERESMOD,%0,%q<element>),0))),setr(elerps,add(v(FORMULA`ELE`[setr(eletype,u(RET`ELETYPE,%0,%1,%q<element>))]),0))),0)
  700.  
  701. &CALC`ELERESMOD u(cso)=lmath(add,iter(setr(eleresmodlist,lattr(%0/D`CSYS`EFF`*`ELERESMOD`%1)),setr(eleresmod-[inum(0)],get(%0/%i0))))
  702. &CALC`ELEPOWMOD u(cso)=lmath(add,iter(setr(elepowmodlist,lattr(%0/%1`EFF`*`ELERESMOD`%2)),setr(elepowmod-[inum(0)],get(%0/%i0))))
  703.  
  704. &FORMULA`ELE`1 u(cso)=-0.25
  705. &FORMULA`ELE`2 u(cso)=0.25
  706. &FORMULA`ELE`3 u(cso)=0.5
  707.  
  708. &DEF`DAMAGE`SPLIT u(cso)=th setq(remdamage,%q<damage>);@dolist/inline/nobreak lattr(%#/%q<incslot>`ATK`BUST`*)={@break eq(last(%i0,`),v(DEF`DAMAGE`DEFAULT));th setq(remdamage,bound(sub(%q<remdamage>,setr(dsplit-[last(%i0,`)],mul(%q<damage>,fdiv(u(CALC`DORAND,get(%#/%i0)),100)))),0));th setq(dtypes,setunion(last(%i0,`),%q<dtypes>,,n))};@dolist/inline lattr(%#/%q<incslot>`ATK`SIPHON`*)={th setq(dsiph-[last(%i0,`)],mul(%q<damage>,fdiv(u(CALC`DORAND,get(%#/%i0)),100)));th setq(siphtypes,setunion(last(%i0,`),%q<siphtypes>))}
  709.  
  710. &DEF`DAMAGE`DEFAULT u(cso)=1
  711.  
  712. &DEF`DAMAGE`MESSAGE u(cso)=@include u(cso)/MSG`R={ansi(h,%n) is struck by [name(%q<atker>)]'s %q<atkname> for [itemize(iter(setunion(%q<dtypes>,v(DEF`DAMAGE`DEFAULT),,n),ansi(hr,switch(%i0,v(DEF`DAMAGE`DEFAULT),%q<remdamage>,%q<dsplit-%i0>)) [u(u(csc)/RET`POINAME,%i0)] Damage,%b,|),|,and,\,)]},%l;@switch/inline t(words(%q<siphtypes>))=1,{@include u(cso)/MSG`R={ansi(h,name(%q<atker>)) gains [itemize(iter(sort(%q<siphtypes>),ansi(hg,%q<dsiph-%i0>) [u(u(csc)/RET`POINAME,%i0)],%b,|),|,and,\,)]}}
  713.  
  714. &DEF`DAMAGE`APPLY u(cso)=th u(POI`SUBTRACT,%#,v(DEF`DAMAGE`DEFAULT),%q<remdamage>);@dolist/inline %q<dtypes>={th u(POI`SUBTRACT,%#,%i0,%q<dsplit-%i0>)};@dolist/inline %q<siphtypes>={th u(POI`SUBTRACT,%#,%i0,%q<dsiph-%i0>);th u(POI`ADD,%q<atker>,%i0,%q<dsiph-%i0>)}
  715.  
  716. &DEF`NODAMAGE u(cso)=th setq(debmode,3);@include u(cso)/MSG`R={ansi(h,%n) is affected by [name(%q<atker>)]'s %q<atkname>!},%l;th setq(damage,0)
  717.  
  718. &DEF`HEALING u(cso)=th setq(debmode,4);
  719.  
  720. &DEF`MISS u(cso)=@include u(cso)/MSG`R={ansi(h,%n) avoided [name(%q<atker>)]'s %q<atkname>!},%l;th setq(damage,0)
  721.  
  722. &CALC`DORAND u(cso)=switch(1,isint(%0),%0,regmatchi(%0,^\(\\d+\:\\d+\)$),rand(before(%0,:),after(%0,:)),regmatchi(%0,^\(\\d+P\:\\d+P\)$),mul(%1,fdiv(rand(before(ucstr(elements(%0,1,:)),P),before(ucstr(elements(%0,2,:)),P)),100)),0)
  723.  
  724. &DEF`DEBUG`2 u(cso)=@include u(cso)/DEF`DEBUG={ATTACKER ATK: [u(DEB`ATKSTATS)]};@include u(cso)/DEF`DEBUG={DEFENDER DEF: [u(DEB`DEFSTATS)]};@include u(cso)/DEF`DEBUG={ATKMOD: [u(DEB`ATKMOD)] | DEFMOD: [u(DEB`DEFMOD)]};@include u(cso)/DEF`DEBUG={ELEMENT DAMAGE: [switch(%q<eletype>,1,Weak,Resist,Null,Normal)] ([if(strmatch(left(%q<elerps>,1),-),-,+)][mul(abs(%q<elerps>),100)]\%) | ELEPOWMOD: [u(DEB`ELEPOWMOD)] | ELERESMOD: [u(DEB`ELERESMOD)]};@include u(cso)/DEF`DEBUG={((LMUL(%q<levelmul>) * LVL(%q<level> + LVLADD(%q<levelplus>)) / LVLDIV(%q<leveldiv>)) * (ATK(%q<atkstatmean>) / DEF(%q<defstatmean>)) * POWER(%q<atkpower>) + EXT(%q<atkextr>)) * (1.0 + ELERPS(%q<elerps>) + ELEPOW(%q<elepowmod>) - ELERES(%q<eleresmod>) + RAND(%q<rand>)) = %q<damage>};
  725.  
  726. &DEF`DEBUG`3 u(cso)=@include u(cso)/DEF`DEBUG={NODAMAGE mode is on, skipping damage checks.};
  727.  
  728. &DEF`DEBUG`4 u(cso)=@include u(cso)/DEF`DEBUG={HEALING};
  729.  
  730. &DEB`ATKSTATS u(cso)=iter(%q<atkstats>,u(u(csc)/RET`STATNAME,%i0) - %q<atkstat[inum(0)]base> - MODS [strfirstof(u(DEB`atkSTATS`MODS,inum(0)),None)]) | TOTAL: %q<atkstatmean>
  731. &DEB`atkSTATS`MODS u(cso)=iter(%q<atkstat%0modlist>,elements(%i0,5,`)-[get(%#/[elements(%i0,1 2 3 4 5 6,`,`)])] \(%q<atkstat[inum(1)]mod%0\))
  732.  
  733. &DEB`atkMOD u(cso)=[words(%q<atkmodlist>)] MODS[if(words(%q<atkmodlist>),%b[u(DEB`atkMOD`LIST)])] Totaling: %q<atkmod>
  734. &DEB`atkMOD`LIST u(cso)=iter(%q<atkmodlist>,elements(%i0,5,`)-[get(%#/[elements(%i0,1 2 3 4 5,`,`)])] \(%q<atkmod[inum(0)]>\))
  735.  
  736. &DEB`DEFSTATS u(cso)=iter(%q<defstats>,u(u(csc)/RET`STATNAME,%i0) - %q<defstat[inum(0)]base> - MODS [strfirstof(u(DEB`DEFSTATS`MODS,inum(0)),None)]) | TOTAL: %q<defstatmean>
  737. &DEB`DEFSTATS`MODS u(cso)=iter(%q<defstat%0modlist>,elements(%i0,6,`)-[get(%#/[elements(%i0,1 2 3 4 5 6,`,`)])] \(%q<defstat[inum(1)]mod%0\))
  738.  
  739. &DEB`DEFMOD u(cso)=[words(%q<defmodlist>)] MODS[if(words(%q<defmodlist>),%b[u(DEB`DEFMOD`LIST)])] Totaling: %q<defmod>
  740. &DEB`DEFMOD`LIST u(cso)=iter(%q<defmodlist>,elements(%i0,4,`)-[get(%#/[elements(%i0,1 2 3 4,`,`)])] \(%q<defmod[inum(0)]>\))
  741.  
  742. &DEB`ELEPOWMOD u(cso)=[words(%q<elepowmodlist>)] MODS[if(words(%q<elepowmodlist>),%b[u(DEB`ELEPOWMOD`LIST)])] Totaling: %q<elepowmod>
  743. &DEB`ELEPOWMOD`LIST u(cso)=iter(%q<elepowmodlist>,elements(%i0,6,`)-[get(%#/[elements(%i0,1 2 3 4 5 6,`,`)])] \(%q<elepowmod-[inum(0)]>\))
  744.  
  745. &DEB`ELERESMOD u(cso)=[words(%q<eleresmodlist>)] MODS[if(words(%q<eleresmodlist>),%b[u(DEB`ELERESMOD`LIST)])] Totaling: %q<eleresmod>
  746. &DEB`ELERESMOD`LIST u(cso)=iter(%q<eleresmodlist>,elements(%i0,6,`)-[get(%#/[elements(%i0,1 2 3 4 5 6,`,`)])] \(%q<eleresmod-[inum(0)]>\))
  747.  
  748. &EFF`ADD u(cso)=th setq(haseff,iter(wildgrepi(%0,D`CSYS`EFF`*`ID,%2),elements(%i0,1 2 3 4,`,`)));@switch/inline cor(strmatch(setr(stack,strfirstof(get(u(maindb)/E`%2`STACKABLE),1)),X),lt(words(%q<haseff>),%q<stack>))=1,{th setq(effslot,D`CSYS`EFF`[nextslot(%0,D`CSYS`EFF)])},0,{th setq(effslot,first(sortkey(#lambda/get(%0/\%0`APPLIED),%q<haseff>)));@wipe %0/%q<effslot>};@include u(ccs)/INC`CPTREE=u(maindb),E`%2,%0,%q<effslot>;&%q<effslot>`SOURCE %0=%1;&%q<effslot>`DURATION %0=setr(dur,if(not(strmatch(setr(dur,get(%0/%q<effslot>`DURATION)),X)),u(CALC`DORAND,%q<dur>),X));&%q<effslot>`ID %0=%2;&%q<effslot>`APPLIED %0=secs()
  749. @@ %0 - target, %1 - person adding, %2 - ID of Effect being added, %3 - order of adding
  750.  
  751. &DEF`INFLICTS u(cso)=@dolist/inline/nobreak lattr(%#/%q<incslot>`ATK`INFLICTS`*)={@switch/inline or(strmatch(setr(effchance,get(%#/%i0)),X),lte(setr(effrand,rand(1,100)),%q<effchance>))=1,{@include u(cso)/EFF`ADD=%#,%q<atker>,last(%i0,`);th setq(effslots,setunion(%q<effslot>,%q<effslots>));@include u(cso)/DEF`DEBUG={INFLICTS: [get(u(maindb)/E`[last(%i0,`)])] - IS SEED %q<effrand> <= CHANCE %q<effchance>: YES! Applied [switch(%q<dur>,X,indefinitely,for %q<dur> turns.)]}},0,{th setq(efffailed,setunion(last(%i0,`),%q<efffailed>));@include u(cso)/DEF`DEBUG={INFLICTS: [get(u(maindb)/E`[last(%i0,`)])] - IS SEED %q<effrand> <= CHANCE %q<effchance>: NO! Resisted.}}};@include u(cso)/DEF`INFLICTS`SUCCESS;@include u(cso)/DEF`INFLICTS`FAILURE
  752.  
  753. &DEF`INFLICTS`SUCCESS u(cso)=@switch/inline t(words(%q<effslots>))=1,{@include u(cso)/MSG`R={ansi(h,%n) is now affected by: [itemize(iter(%q<effslots>,ansi(h,get(%#/%i0)) [switch(get(%#/%i0`DURATION),X,indefinitely,for [get(%#/%i0`DURATION)] turns)],%b,|),|,and,\,)].},%l}
  754.  
  755. &DEF`INFLICTS`FAIL u(cso)=@switch/inline t(words(%q<efffailed>))=1,{@include u(cso)/MSG`R={ansi(h,%n) shrugged off: [itemize(iter(%q<efffailed>,ansi(h,get(%0/E`%i0)),%b,|),|,and,\,)].},%l}
  756.  
  757. &DEF`CLEARS u(cso)=@switch/inline t(words(setr(clears,get(%#/%q<incslot>`ATK`CLEARS))))=1,{@switch/inline or(strmatch(setr(clrchance,get(%#/%q<incslot>`ATK`CLEARS`CHANCE)),X),lte(setr(clrrand,rand(1,100)),%q<clrchance>))=1,{@switch/inline gt(words(setr(clearing,filterbool(#lambda/words(setinter(get(%#/\%0`TAGS),%q<clears>)),lattr(%#/D`CSYS`EFF`*)))),0)=1,{@include u(cso)/MSG`R={ansi(h,%n) was cleared of: [itemize(iter(%q<clearing>,name(get(%#/%i0`SOURCE))'s [get(%#/%i0)],%b,|),|,and,\,)].},%l;@dolist/inline %q<clearing>={@wipe %#/%i0}},0,{@include u(cso)/MSG`R={ansi(h,%n) is not affected by %q<atkname>'s Status Clearing!},%l}},0,{@include u(cso)/MSG`R={ansi(h,%n) resisted %q<atkname>'s Status Clearing!,%l}}
  758.  
  759. @@ ***** Points Management
  760.  
  761. &POI`SUBTRACT u(cso)=attrib_set(%0/D`CSYS`DAMAGE`%2,bound(add(%3,u(RET`POIDAMAGE,%0,%1,%2)),0,u(RET`MAXPOI,%0,%1,%2)))
  762.  
  763. &POI`ADD u(cso)=attrib_set(%0/D`CSYS`DAMAGE`%2,bound(sub(u(RET`POIDAMAGE,%0,%1,%2),%3),0,u(RET`MAXPOI,%0,%1,%2)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement