Lexer to tokenize Super Auto Pets effect text and parse into an effect.
| Text | Tokens | Effect |
|---|---|---|
If it was a Faint pet,
activate its ability again.
Works 1 time per turn. |
SAPTokens([
Token {
ttype: Logic(If),
text: "If",
metadata: Scanner { start: 0, current: 2, line: 1 }
},
Token {
ttype: Position(Trigger),
text: "it",
metadata: Scanner { start: 3, current: 5, line: 1 }
},
...
]) |
Effect {
cond_trigger: Some(EffectTrigger {
entity: Some(EntityType::Pet {
number: None, name: None, attr: Some("Faint")
}),
logic: Some(LogicType::If),
prim_pos: Some(PositionType::Trigger),
..Default::default()
}),
entities: vec![EntityType::Ability(None)],
position: vec![PositionType::Trigger],
action: Some(ActionType::Activate),
uses: Some(1),
..Default::default()
} |
cargo add --git https://github.com/koisland/SuperAutoLexCreate an effect without an effect trigger.
use saplex::{SAPText, Effect};
// Tokenize some SAP related text.
let effect_txt = SAPText::new("If this has a level 3 friend, gain +1 attack and +2 health.");
let tokens = effect_txt.tokenize().unwrap();
// Pass effect tokens and optionally, an effect trigger, to generate an effect.
let effects: Vec<Effect> = Effect::new(None, &tokens).unwrap();Create an effect trigger.
use saplex::{SAPText, EffectTrigger};
let trigger_txt = SAPText::new("End turn & Start of battle");
let trigger_tokens = trigger_txt.tokenize().unwrap();
let effect_trigger: Vec<EffectTrigger> = trigger_tokens.try_into().unwrap();Create an effect.
use saplex::{SAPText, EffectTrigger, Effect};
// Define effect text.
let trigger_txt = SAPText::new("Enemy summoned");
let effect_txt =
SAPText::new("Deal 100% attack damage to the least healthy enemy and itself.");
// Create tokens.
let effect_tokens = effect_txt.tokenize().unwrap();
let trigger_tokens = trigger_txt.tokenize().unwrap();
// Create effect trigger.
let effect_trigger = {
let mut effect_trigger: Vec<EffectTrigger> = trigger_tokens.try_into().unwrap();
effect_trigger.remove(0)
};
// And finally, create the effect.
let effect = Effect::new(Some(effect_trigger), &effect_tokens).unwrap();Enable the serde feature flag to serialize and deserialize effects.
cargo add --git https://github.com/koisland/SuperAutoLex --features serdeTo serialize and deserialize effects:
use saplex::{SAPText, EffectTrigger, Effect};
let effect_txt = SAPText::new("If in battle, gain +1 attack and +2 health.");
let tokens = effect_txt.tokenize().unwrap();
let effects = Effect::new(None, &tokens).unwrap();
let effect_txt_json: String = serde_json::to_string(&effects[0]).unwrap();
let effect: Effect = serde_json::from_str(&effect_txt_json).unwrap();Item names are always uppercase.
- Pets can be one or two words long.
DogLizard Tail
- Foods end with
Perk.Melon Perk- Can also omitted if prior word is
with.Dog with Melon.
The first word of a text must be either a if condition or an action.
If ..., ...Gain ...
If statements should also contain an action.
If ..., gain ...
- Declarative macro to construct effects.