| summaryrefslogtreecommitdiff |
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2019-09-30 18:16:34 +0200 |
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2019-09-30 18:16:34 +0200 |
| commit | bf48073c96d0c6866bb2edf944ba19be62ff9136 (patch) | |
| tree | d68ccd8570e810abd627666f038649b8faa19705 | |
| parent | 346c1d6645d6470875074f6193b88bfd5fb50b4b (diff) | |
Moves tacticians-server/other to 'misc'
| -rw-r--r-- | misc/attrib_stats.txt | 155 | ||||
| -rw-r--r-- | misc/db_bounty.txt | 18 | ||||
| -rw-r--r-- | misc/demo_map0.map | 32 | ||||
| -rw-r--r-- | misc/erl_module_template.erl | 17 | ||||
| -rw-r--r-- | misc/luck.txt | 97 | ||||
| -rw-r--r-- | misc/magic.txt | 75 | ||||
| -rw-r--r-- | misc/skills.txt | 92 |
7 files changed, 486 insertions, 0 deletions
diff --git a/misc/attrib_stats.txt b/misc/attrib_stats.txt new file mode 100644 index 0000000..cc06824 --- /dev/null +++ b/misc/attrib_stats.txt @@ -0,0 +1,155 @@ +{Attributes + Constitution + Dexterity + Intelligence + Mind + Speed + Strength +} +{Stats + {Movement Points + Controlled by: Speed + ((Speed)^1.8)/20 + } + {Health + Controlled by: Constitution + ((Constitution)^1.8)/20 + } + {Dodges + Controlled by: average(Dexterity, Mind, Speed) + Max: 75% + Min: 5% + min(75,max(5,(4^(x/25)))) + ((average(Dexterity, Mind, Speed))^1.8)/40 + } + {Parries + Controlled by: average(Dexterity, Speed, Strength) + Melee only + Max: 75% + Min: 0% + min(75,(4^(x/25))) + } + {Physical Weapons + {Damage + Controlled by: Strength + limits + (((Strength - 50)/75) limits) + } + {Accuracy + Controlled by: Dexterity + Max: 100% + Min: 0% + (30 * (log((x + 5)/4))) // Might be too generous + Note: failing that roll halves the damages. + } + {Double Hits + Controlled by: Speed + Max: 100% + Min: 0% + (x^2.5)/1000 + } + {Critical Hits + Controlled by: Intelligence + Max: 100% + Min: 0% + (x^2.5)/1000 + } + } + {Magical Weapons + {Damage + Controlled by: Intelligence + limits + (((Strength - 50)/75) limits) + } + {Accuracy + Controlled by: Mind + Max: 100% + Min: 0% + (30 * (log((x + 5)/4))) // Might be too generous + Note: failing that roll halves the damages. + } + {Double Hits + Controlled by: Speed + Max: 100% + Min: 0% + (x^2.5)/1000 + } + {Critical Hits + Controlled by: Dexterity + Max: 100% + Min: 0% + (x^2.5)/1000 + } + } +} +{Physical Attack + {Damage Type + Bludgeoning + Piercing + Slashing + } + {Ranged + {Short Bow + Minimal Range: 2 + Maximal Range: 4 + Damage Type: Arrow dependent + } + {Long Bow + Minimal Range: 2 + Maximal Range: 6 + Damage Type: Arrow dependent + Attribute Penalty: Speed + } + {Crossbow + Minimal Range: 2 + Maximal Range: 4 + Damage Type: Bolt dependent + Attribute Penalty: Dexterity + Misc: High damage + } + {Arbalest + Minimal Range: 2 + Maximal Range: 6 + Damage Type: Bolt dependent + Attribute Penalty: Dexterity, Speed + Misc: High damage + } + } + {Melee + {Sword + Minimal Range: 1 + Maximal Range: 1 + Damage Type: Slashing + } + {Claymore + Minimal Range: 1 + Maximal Range: 2 + Damage Type: Slashing + Attribute Penalty: Speed + } + {Mace + Minimal Range: 1 + Maximal Range: 1 + Damage Type: Bludgeoning + } + {War Hammer + Minimal Range: 1 + Maximal Range: 2 + Damage Type: Bludgeoning + Attribute Penalty: Speed + } + {Dagger + Minimal Range: 1 + Maximal Range: 1 + Damage Type: Piercing + } + {Spear + Minimal Range: 1 + Maximal Range: 2 + Damage Type: Piercing + Attribute Penalty: Speed + } + } +} +{Base Accuracy + Melee: Base Accuracy bonus. + Ranged: No Base Accuracy bonus. +} diff --git a/misc/db_bounty.txt b/misc/db_bounty.txt new file mode 100644 index 0000000..d31226a --- /dev/null +++ b/misc/db_bounty.txt @@ -0,0 +1,18 @@ +Designing with a "it can crash at any point" mentality ++ can't combine DB queries in an atomic manner += Potential for partially completed tasks, "corrupting" the global DB. + +A solution could be having "bounty" entries, which work as follows: +A process P0 needs to do tasks T0, then T1, then T2. +P0 creates a bounty B0: +{ + not_before: 60s. + task: T0_T1_T2. + params: [{T0.id, T1.id, 20] +} +P0 adds B0 to the Bounty DB. +P0 attempts T0, T1, and T2. +P0 removes B0 from the Bounty DB. + +There are other processes trying to access available bounties (i.e. bounties +for which the "not_before" has expired) to complete them. diff --git a/misc/demo_map0.map b/misc/demo_map0.map new file mode 100644 index 0000000..8a66d8e --- /dev/null +++ b/misc/demo_map0.map @@ -0,0 +1,32 @@ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2; + 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2; + 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 6, 6, 6, 6, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2; + 2, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, 3, 3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 2; + 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 2; + 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2; + 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 3, 3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 3, 3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 4, 3, 3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,11, 7, 7, 7, 7,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 6, 6, 6, 6, 6, 6, 6, 6, 9, 0, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 3, 3, 3, 3, 3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 3, 3, 3, 3, 3, 3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 3, 3, 3, 3, 3, 3, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 4, 3, 3, 3, 3, 3, 3, 3, 3, 5, 0, 0, 0, 0, 0, 1, 0, 2; + 2, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0,11, 7, 7, 7, 7, 7, 7, 7, 7,10, 0, 0, 0, 0, 0, 1, 0, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 6, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2; + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2; + 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,11, 7, 7,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2; + 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2; + 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2; + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6; + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3; diff --git a/misc/erl_module_template.erl b/misc/erl_module_template.erl new file mode 100644 index 0000000..01c79bd --- /dev/null +++ b/misc/erl_module_template.erl @@ -0,0 +1,17 @@ +-module(name). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/misc/luck.txt b/misc/luck.txt new file mode 100644 index 0000000..33d7fc2 --- /dev/null +++ b/misc/luck.txt @@ -0,0 +1,97 @@ +Hitting your target, parrying, critical hits, double hits, and elemental status +are controlled by random chance. On the one hand, this adds depth through +management of risks and rewards, and it forces unexpected events on the players. +On the other hand, it can quickly make combats feel unfair (e.g. good tactics +failing due to bad luck) or infuriate players (e.g. missing a 95% chance shot in +XCOM). + +To mitigate the drawbacks, TO should balance the impact of luck. + +During a battle, each players has a Luck meter. Luck in between -200 and 200. It +starts at 0. + +When a player makes a roll with X% chance, the result is as follows: +Roll = rand(100); +IsSuccess = ((X + Luck) >= Roll); +if (IsSuccess) +{ + if (X > 50) + { + // It was likely to succeed, pay just what you used. + MissingPoints = max(0, (Roll - X)) + Luck' = (Luck - MissingPoints) + } + else if (X =< 50) + { + // It was unlikely to succeed, pay a lot. + Cost = (55 - X) // How far was it from being reasonable? + Luck' = (Luck - Cost) + } +} +else +{ + // Failure due to bad roll. + if (X >= 50) + { + // It was likely to succeed, you're owed a lot. + OwedPoints = (X - 45) + Luck' = (Luck + OwedPoints) + } +} + +For example: + +A/ The character of a player with 15 Luck attempts a 10% chance parry: +if (Roll <= 25) +{ + // Unlikely Success. + Cost = (55 - 10) = 45 + Luck' = 15 - 45 = -30 +} +else if (Roll > 25) +{ + // Expected Failure. +} + +B/ The character of a player with 20 Luck attempts a 45% chance parry: +if (Roll <= 60) +{ + // Unlikely Success. + Cost = (55 - 45) = 10 + Luck' = 20 - 10 = 10 +} +else if (Roll > 60) +{ + // Expected Failure. +} + +D/ The character of a player with 20 Luck attempts a 55% chance parry: +if (Roll <= 70) +{ + // Likely Success. + UsedUpLuck = max(0, (55 - Roll)) = [0, 20] + Luck' = 20 - UsedUpLuck = [0, 20] +} +else if (Roll > 70) +{ + // Unlucky dice roll. + OwedPoints = (55 - 45) = 10 + Luck' = 20 + 10 = 30 +} + +D/ The character of a player with -35 Luck attempts a 15% chance parry: +No roll required. This fails. No luck update. + +E/ The character of a player with -35 Luck attempts a 75% chance parry: +if (Roll <= 40) +{ + // Without the negative luck, it was likely to succeed + // Luck clearly didn't help, so none is to be payed. +} +else if (Roll > 40) +{ + // If not for that negative luck, you were likely to make it. + // You're owed some luck back. + OwedPoints = (75 - 45) = 30 + Luck' = -35 + 30 = -5 +} diff --git a/misc/magic.txt b/misc/magic.txt new file mode 100644 index 0000000..d414d65 --- /dev/null +++ b/misc/magic.txt @@ -0,0 +1,75 @@ +Elements: + + Wind + Lightning Snow +Fire Water + Magma Plant + Earth + +Omnimods for each element: +- Damage (>0) +- Defense (any) +- Status Chance (0-100) +- Status Def (any) + +Chance to inflict status calculated similarly to evasion: + min(100, max(0, {attacker status chance} - {defender status def})) + +Status Def > 100 -> ({defender status def} - 100)% of {attacker damage} are + actually healing defender. + +Omnimods are manually set so that gaining X in an element leads to: +* X/2 in the elements next to it. +* -X in the opposite element +* -(X/2) in the elements next to its opposite element + +Having this done manually allows for exception. + +The element chosen for the status that can be triggered is chosen randomly among +the ones the character, with weights depending on the percentage of the damage +caused by that element. For each element, there are two variants: Alpha, which +inflicts a status on the character getting hit, and Beta, which grants one for +the character doing the hitting. Status are taken into consideration only after +the attack that generated them. Characters may have multiple elemental status in +effect. + +Characters affected by the status of element, be it antagonistic or not, gain +affinity in that element (i.e. omnimods for that element, and all the associated +{X/2,-X,-(X/2)} stuff). + +* Wind: + Alpha: Reduces max movement points. + Beta: Increases max movement points. + +* Lightning: + Alpha: Character is disabled for a turn. + Beta: + Attacking this character, regardless of range, will result in taking + lightning damage. + +* Fire: + Alpha: + Character suffer fire damage over time (don't forget to make it worth it + despite the affinity gain). + Beta: + Character deals more damage. + +* Magma: + Alpha: TBD + Beta: TBD + Inflict magma damage when attacked by melee. + +* Earth: + Alpha: Lowers the character's defense + Beta: Increases the character's defense. + +* Plant: + Alpha: Character cannot be healed, nor gain SPs (not even with skill). + Beta: Character gains life-steal. + +* Water: + Alpha: Halves the character's HP. + Beta: The character receives some healing. + +* Snow: + Alpha: Character loses all evasion. + Beta: Character gets max evasion. diff --git a/misc/skills.txt b/misc/skills.txt new file mode 100644 index 0000000..9794967 --- /dev/null +++ b/misc/skills.txt @@ -0,0 +1,92 @@ +Characters have an SP gauge. It starts empty. +To be decided: is the capacity of the gauge linked to a (new) stat, or is it + simply a way to measure how much SP is required before the skill can be cast + (i.e. it has exactly enough for one cast). + +SPs are gained from participation in an attack. The attacker gets 1 point per +attack (which should make being able to do two attacks per turn worthwhile), +1 point for a parry, and, possibly (to be decided), 1 point when defending +(maybe % chance? This reduces the importance of double hits). + +Each character has exactly one skill, which is chosen like any other part of +their equipment. Skills have infinite range, and are casted on a single target +(faction is not taken into account), which is either a character or a tile +(that may actually place the skill on a pattern around itself). +The use of a skill counts as an action (i.e. it replaces either switching +weapons or attacking). + +Multiple variants of the same skill allow players to select a more costly skill +for an increase in either power (Alpha variant), duration (Beta variant), or +both (Gamma variant). The increase should not be linear (e.g. 2 times the power +costs 175% of the default version). The X Gamma variant combines the advantages +of the Beta and the Alpha versions. It obviously costs way more than either of +them. Another variation could be to have the skill triggered later, by +targeting a tile. Depending on the variant, a character (ally, enemy, or +either) would trigger the effect upon walking on the tile. This could for +example be used for a self-resurrection skill. + +Ideas for some skills: +* Attack Anywhere: + The caster performs an attack on the target with their current weapon, + regardless of where that target is. + +* Shields Up {D, A0, A1, B0, B1, G0, G1}: + Target benefits from {D: 25, A0: 50, A1: 75}% damage reduction for + {D: 1, B0: 2, B1: 3} turns. + +* Static Heal {D, A0, A1, A2, A3}: + Target heals for {D: 20, A0: 40, A1: 60, A2: 80, A3: 100} HPs, if nothing + prevents it. + +* Percentage Heal {D, A0, A1, A2, A3}: + Target heals for {D: 15, A0: 25, A1: 35, A2: 50, A3: 65} percent of their + maximum HPs, if nothing prevents it. + +* Healing Over Time {D, A0, A1, A2, A3, B0, B1, B2, B3, G0, G1, G2, G3}: + Target gains a {D: 4, B0: 6, B2: 8, B3: 10} turns duration status that heals + them for {D: 6, A0: 12, A1: 18, A2: 24, A3: 30} HPs. + +* Dispel {D, A0}: + Target loses {D: a random, A0: all} active status(es). + +* Redirection: + Target and caster swaps all their active status. + +* Overload {D, A0, A1, B0, B1, G0, G1}: + Target gains a {D: 1, B0: 2, B1: 3} status providing a {D: 5, A0: 10, A1: + 20}% damage increase per active status (including this one) when attacking. + The count is done during the attack, not during the cast. + +* Trickster {D, A0, A1}: + Target and caster swaps {D: secondary, A0: active, A1: all} weapon(s). + +* Confusion: + The target equips their secondary weapon. + +* Vampire {D, A0, A1, A2, B0, B1, B2, G0, G1, G2}: + Caster gains the "Vampire" active status. The Vampire status lasts + {D: 3, B0: 6, B1: 9, B2: 12} turns and, for melee attacks: grants + {D: 10, A0: 15, A1: 20, A2: 25}% life-steal, and adds the Vampire status + to the defender (with a reset duration). + +* Teleportation: + The caster is teleported to the target tile, if applicable. + +* Switch: + Caster and target swap locations. + +* Mark Target {D, A0, A1, A2, B0, B1, B2, G0, G1, G2}: + The target gains an active status, "Target", that increases the critical + chance and precision of attacks it receives. The status lasts {D: 1, B0: 2, + B1: 3, B2: 4} turns, and increases chances by {D: 15, A0: 25, A1: 35, A2: 45} + points. + +* Petrify {D, B0, B1}: + The target becomes inactive and invulnerable for {D: 1, B0: 2, B1: 3} turns. + +* Sacrifice {D, A0, A1, A2, A3}: + Target gains <cost of the skill> SP points. + +* Denial {D, B0, B1, B2}: + Target is unable to gain SP points from attacks, parries, or defenses for + {D: 2, B0: 4, B1: 6} turns. |


