Difference between pages "Effect modifier" and "Modifier eval"

From Kolmafia
(Difference between pages)
Jump to navigation Jump to search
imported>Bale
(Created page with '{{ #vardefine:name|effect_modifier}}{{ #vardefine:return_type|effect}}{{ FunctionPage| name={{#var:name}}| function_category=Modifier Functions| function1={{Function| name={{#v…')
 
imported>Slyz
(add all the modifier variables)
 
Line 1: Line 1:
 
{{
 
{{
#vardefine:name|effect_modifier}}{{
+
#vardefine:name|modifier_eval}}{{
#vardefine:return_type|effect}}{{
+
#vardefine:return_type|float}}{{
  
 
FunctionPage|
 
FunctionPage|
 
name={{#var:name}}|
 
name={{#var:name}}|
function_category=Modifier Functions|
 
  
 
function1={{Function|
 
function1={{Function|
Line 12: Line 11:
 
return_type={{#var:return_type}}|
 
return_type={{#var:return_type}}|
 
return_also={{#var:return_also}}|
 
return_also={{#var:return_also}}|
parameter1={{Param|string|check_me}}|
+
parameter1={{Param|string|expression}}|
parameter2={{Param|string|modifier_name}}|
+
p1desc={{pspan|expression}} is a mathematical expression to be solved.|
 
}}|
 
}}|
  
function2={{Function|
+
function_description= Evaluates an expression in the format used by variable modifiers:
name={{#var:name}}|
+
 
aggregate={{#var:aggregate}}|
+
* No spaces are allowed within the expression, except as part of a zone/location name.
return_type={{#var:return_type}}|
+
* + - * / ( ) have their usual mathematical meaning and precedence.
return_also={{#var:return_also}}|
+
* ^ is exponentiation, with the highest precedence.
parameter1={{Param|item|check_me}}|
+
* Functions available: ceil(x) floor(x) sqrt(x) min(x,y) max(x,y)
parameter2={{Param|string|modifier_name}}|
+
* Location functions: loc(text) zone(text)
}}|
+
** These have a value of 1 if the current adventure location or zone contains the specified text, 0 elsewhere.
function_description=Returns an effect if {{pspan|check_me}} is effect specific. {{pspan|modifier_name}} is the modifier to check for.|
+
* Familiar function: fam(text)
 +
** This has a value of 1 if the player's familiar type contains the text, else 0.
 +
* Preferences function: pref(text)
 +
** This must be used on preferences with a float value ONLY - merely retrieving an integer pref will corrupt it!
 +
* There could be at most one of each text function in an expression.
 +
** This is no longer the case however and multiple of the same text functions should now work properly.
 +
* All upper-case letters are reserved for internally-used variables. The available variables are:
 +
** A - number of Ascensions
 +
** B - Blood of Wereseal effect
 +
** C - Clancy's level
 +
** D - Drunkenness
 +
** E - active (nonintrinsic) Effects
 +
** F - Fullness
 +
** G - Grimace darkness (0..5)
 +
** H - Hobo Power
 +
** J - 1 on Festival of Jarlsberg, 0 otherwise
 +
** L - player Level
 +
** M - total Moonlight (0..9)
 +
** R - Reagent potion duration
 +
** S - Spleenness
 +
** T - Turns remaining of this effect
 +
** U - telescope Upgrades
 +
** W - familiar Weight
 +
** X - gender (-1=male, 1=female)
 +
* This wrapper allows user-defined variables to be used as well, which must have names starting with a lower-case letter (or underscore) to distinguish them from built-in variables.  Variables are supplied as a float[string] map.
 +
 |
  
 
code1={{CodeSample|
 
code1={{CodeSample|
 
title=Code Sample|
 
title=Code Sample|
description=Prints a list of all items that have intrinsic effects|
+
description=This script expands modifier_eval() to include support for user-defined variables. It is extremely complex, but it is extremely useful to anyone who wants to use modifier_eval().|
 
code=
 
code=
 
<syntaxhighlight>
 
<syntaxhighlight>
effect eff;
+
float eval(string expr, float[string] vars) {
foreach doodad in $items[] {
+
   buffer b;
   eff = effect_modifier( doodad , "Intrinsic Effect" );
+
  matcher m = create_matcher( "\\b[a-z_][a-zA-Z0-9_]*\\b", expr );
   if(eff != $effect[none])
+
   while (m.find()) {
       print(doodad +" grants "+ eff);
+
      string var = m.group(0);
 +
      if (vars contains var) {
 +
        m.append_replacement(b, vars[var].to_string());
 +
      }
 +
       // could implement functions, pref access, etc. here
 +
  }
 +
  m.append_tail(b);
 +
  return modifier_eval(b.to_string());
 
}
 
}
 +
 +
# Everything below this line shows how to make use of eval().
 +
# TESTING:
 +
 +
float[string] v;
 +
v["pi"] = 3.14159265;
 +
v["ten"] = 10;
 +
print(eval("2+3", v));
 +
print(eval("max(pi^ten,ten^pi)", v));
 +
print(eval("sqrt(pi)*L", v));
 +
print(eval("undefined/2", v));
 +
 
</syntaxhighlight>}}|
 
</syntaxhighlight>}}|
 +
special=Note that modifier_eval '''never''' generates errors - a malformed expression will just print a message, and return an arbitrary value.|
 +
}}
  
more_info= See [http://kolmafia.us/showthread.php?802 this thread] for details.|
+
[[Category:Math and Numbers]]
}}
 

Revision as of 20:25, 25 September 2012

Function Syntax

float modifier_eval(string expression )

  • expression is a mathematical expression to be solved.

Evaluates an expression in the format used by variable modifiers:

  • No spaces are allowed within the expression, except as part of a zone/location name.
  • + - * / ( ) have their usual mathematical meaning and precedence.
  • ^ is exponentiation, with the highest precedence.
  • Functions available: ceil(x) floor(x) sqrt(x) min(x,y) max(x,y)
  • Location functions: loc(text) zone(text)
    • These have a value of 1 if the current adventure location or zone contains the specified text, 0 elsewhere.
  • Familiar function: fam(text)
    • This has a value of 1 if the player's familiar type contains the text, else 0.
  • Preferences function: pref(text)
    • This must be used on preferences with a float value ONLY - merely retrieving an integer pref will corrupt it!
  • There could be at most one of each text function in an expression.
    • This is no longer the case however and multiple of the same text functions should now work properly.
  • All upper-case letters are reserved for internally-used variables. The available variables are:
    • A - number of Ascensions
    • B - Blood of Wereseal effect
    • C - Clancy's level
    • D - Drunkenness
    • E - active (nonintrinsic) Effects
    • F - Fullness
    • G - Grimace darkness (0..5)
    • H - Hobo Power
    • J - 1 on Festival of Jarlsberg, 0 otherwise
    • L - player Level
    • M - total Moonlight (0..9)
    • R - Reagent potion duration
    • S - Spleenness
    • T - Turns remaining of this effect
    • U - telescope Upgrades
    • W - familiar Weight
    • X - gender (-1=male, 1=female)
  • This wrapper allows user-defined variables to be used as well, which must have names starting with a lower-case letter (or underscore) to distinguish them from built-in variables. Variables are supplied as a float[string] map.

 

Code Sample

This script expands modifier_eval() to include support for user-defined variables. It is extremely complex, but it is extremely useful to anyone who wants to use modifier_eval().

float eval(string expr, float[string] vars) {
   buffer b;
   matcher m = create_matcher( "\\b[a-z_][a-zA-Z0-9_]*\\b", expr );
   while (m.find()) {
      string var = m.group(0);
      if (vars contains var) {
         m.append_replacement(b, vars[var].to_string());
      }
      // could implement functions, pref access, etc. here
   }
   m.append_tail(b);
   return modifier_eval(b.to_string());
}

# Everything below this line shows how to make use of eval().
# TESTING:

float[string] v;
v["pi"] = 3.14159265;
v["ten"] = 10;
print(eval("2+3", v));
print(eval("max(pi^ten,ten^pi)", v));
print(eval("sqrt(pi)*L", v));
print(eval("undefined/2", v));

Special

Note that modifier_eval never generates errors - a malformed expression will just print a message, and return an arbitrary value.