Difference between pages "Effect modifier" and "Modifier eval"
(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| | + | #vardefine:name|modifier_eval}}{{ |
− | #vardefine:return_type| | + | #vardefine:return_type|float}}{{ |
FunctionPage| | FunctionPage| | ||
name={{#var:name}}| | name={{#var:name}}| | ||
− | |||
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| | + | parameter1={{Param|string|expression}}| |
− | + | p1desc={{pspan|expression}} is a mathematical expression to be solved.| | |
}}| | }}| | ||
− | + | function_description= Evaluates an expression in the format used by variable modifiers: | |
− | name | + | |
− | + | * 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. | ||
+ | | | ||
code1={{CodeSample| | code1={{CodeSample| | ||
title=Code Sample| | title=Code Sample| | ||
− | description= | + | 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> | ||
− | + | float eval(string expr, float[string] vars) { | |
− | + | buffer b; | |
− | + | matcher m = create_matcher( "\\b[a-z_][a-zA-Z0-9_]*\\b", expr ); | |
− | if( | + | 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)); | ||
+ | |||
</syntaxhighlight>}}| | </syntaxhighlight>}}| | ||
+ | special=Note that modifier_eval '''never''' generates errors - a malformed expression will just print a message, and return an arbitrary value.| | ||
+ | }} | ||
− | + | [[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.