summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2019-09-30 18:16:34 +0200
committernsensfel <SpamShield0@noot-noot.org>2019-09-30 18:16:34 +0200
commitbf48073c96d0c6866bb2edf944ba19be62ff9136 (patch)
treed68ccd8570e810abd627666f038649b8faa19705
parent346c1d6645d6470875074f6193b88bfd5fb50b4b (diff)
downloadtacticians-design-bf48073c96d0c6866bb2edf944ba19be62ff9136.zip
tacticians-design-bf48073c96d0c6866bb2edf944ba19be62ff9136.tar.bz2
Moves tacticians-server/other to 'misc'
-rw-r--r--misc/attrib_stats.txt155
-rw-r--r--misc/db_bounty.txt18
-rw-r--r--misc/demo_map0.map32
-rw-r--r--misc/erl_module_template.erl17
-rw-r--r--misc/luck.txt97
-rw-r--r--misc/magic.txt75
-rw-r--r--misc/skills.txt92
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.