| @@ -44,7 +44,8 @@ export type Vigors = {[key in Vigor]: number} | |||||
| export enum Stat { | export enum Stat { | ||||
| Toughness = "Toughness", | Toughness = "Toughness", | ||||
| Power = "Power", | Power = "Power", | ||||
| Speed = "Speed", | |||||
| Reflexes = "Reflexes", | |||||
| Agility = "Agility", | |||||
| Willpower = "Willpower", | Willpower = "Willpower", | ||||
| Charm = "Charm" | Charm = "Charm" | ||||
| } | } | ||||
| @@ -54,15 +55,17 @@ export type Stats = {[key in Stat]: number} | |||||
| export const StatIcons: {[key in Stat]: string} = { | export const StatIcons: {[key in Stat]: string} = { | ||||
| Toughness: 'fas fa-heartbeat', | Toughness: 'fas fa-heartbeat', | ||||
| Power: 'fas fa-fist-raised', | Power: 'fas fa-fist-raised', | ||||
| Speed: 'fas fa-feather', | |||||
| Reflexes: 'fas fa-stopwatch', | |||||
| Agility: 'fas fa-feather', | |||||
| Willpower: 'fas fa-book', | Willpower: 'fas fa-book', | ||||
| Charm: 'fas fa-comments' | Charm: 'fas fa-comments' | ||||
| } | } | ||||
| export const StatDescs: {[key in Stat]: string} = { | export const StatDescs: {[key in Stat]: string} = { | ||||
| Toughness: 'Your physical resistance', | |||||
| Power: 'Your physical power', | |||||
| Speed: 'How quickly you can act', | |||||
| Toughness: 'Your brute resistance', | |||||
| Power: 'Your brute power', | |||||
| Reflexes: 'Your ability to dodge', | |||||
| Agility: 'Your ability to move quickly', | |||||
| Willpower: 'Your mental resistance', | Willpower: 'Your mental resistance', | ||||
| Charm: 'Your mental power' | Charm: 'Your mental power' | ||||
| } | } | ||||
| @@ -599,7 +602,7 @@ export class Encounter { | |||||
| this.combatants.forEach(combatant => { | this.combatants.forEach(combatant => { | ||||
| // this should never be undefined | // this should never be undefined | ||||
| const currentProgress = this.initiatives.get(combatant) ?? 0 | const currentProgress = this.initiatives.get(combatant) ?? 0 | ||||
| const remaining = (this.turnTime - currentProgress) / Math.sqrt(Math.max(combatant.stats.Speed, 1)) | |||||
| const remaining = (this.turnTime - currentProgress) / Math.sqrt(Math.max(combatant.stats.Agility, 1)) | |||||
| times.set(combatant, remaining) | times.set(combatant, remaining) | ||||
| }) | }) | ||||
| @@ -609,12 +612,12 @@ export class Encounter { | |||||
| return closestTime <= nextTime ? closest : next | return closestTime <= nextTime ? closest : next | ||||
| }, this.combatants[0]) | }, this.combatants[0]) | ||||
| const closestRemaining = (this.turnTime - (this.initiatives.get(this.currentMove) ?? 0)) / Math.sqrt(Math.max(this.currentMove.stats.Speed, 1)) | |||||
| const closestRemaining = (this.turnTime - (this.initiatives.get(this.currentMove) ?? 0)) / Math.sqrt(Math.max(this.currentMove.stats.Agility, 1)) | |||||
| this.combatants.forEach(combatant => { | this.combatants.forEach(combatant => { | ||||
| // still not undefined... | // still not undefined... | ||||
| const currentProgress = this.initiatives.get(combatant) ?? 0 | const currentProgress = this.initiatives.get(combatant) ?? 0 | ||||
| this.initiatives.set(combatant, currentProgress + closestRemaining * Math.sqrt(Math.max(combatant.stats.Speed, 1))) | |||||
| this.initiatives.set(combatant, currentProgress + closestRemaining * Math.sqrt(Math.max(combatant.stats.Agility, 1))) | |||||
| }) | }) | ||||
| // TODO: still let the creature use drained-vigor moves | // TODO: still let the creature use drained-vigor moves | ||||
| @@ -76,7 +76,8 @@ export class Cafat extends Creature { | |||||
| super(new ProperNoun('Cafat'), new ImproperNoun('taur', 'taurs'), [TheyPronouns, FemalePronouns][Math.floor(Math.random() * 2)], { | super(new ProperNoun('Cafat'), new ImproperNoun('taur', 'taurs'), [TheyPronouns, FemalePronouns][Math.floor(Math.random() * 2)], { | ||||
| [Stat.Toughness]: 30, | [Stat.Toughness]: 30, | ||||
| [Stat.Power]: 30, | [Stat.Power]: 30, | ||||
| [Stat.Speed]: 15, | |||||
| [Stat.Agility]: 15, | |||||
| [Stat.Reflexes]: 15, | |||||
| [Stat.Willpower]: 25, | [Stat.Willpower]: 25, | ||||
| [Stat.Charm]: 20 | [Stat.Charm]: 20 | ||||
| }, new Set([VoreType.Oral, VoreType.Anal]), new Set([VoreType.Oral, VoreType.Anal]), 150) | }, new Set([VoreType.Oral, VoreType.Anal]), new Set([VoreType.Oral, VoreType.Anal]), 150) | ||||
| @@ -118,7 +119,7 @@ export class Cafat extends Creature { | |||||
| this.actions.push(new BelchAction(new Damage( | this.actions.push(new BelchAction(new Damage( | ||||
| { amount: 10, target: Stat.Toughness, type: DamageType.Acid }, | { amount: 10, target: Stat.Toughness, type: DamageType.Acid }, | ||||
| { amount: 10, target: Stat.Power, type: DamageType.Acid }, | { amount: 10, target: Stat.Power, type: DamageType.Acid }, | ||||
| { amount: 10, target: Stat.Speed, type: DamageType.Acid }, | |||||
| { amount: 10, target: Stat.Agility, type: DamageType.Acid }, | |||||
| { amount: 10, target: Stat.Willpower, type: DamageType.Acid }, | { amount: 10, target: Stat.Willpower, type: DamageType.Acid }, | ||||
| { amount: 10, target: Stat.Charm, type: DamageType.Acid } | { amount: 10, target: Stat.Charm, type: DamageType.Acid } | ||||
| ))) | ))) | ||||
| @@ -6,7 +6,7 @@ import { AttackAction, TransferAction, FeedAction } from '../combat/actions' | |||||
| export class Dragon extends Creature { | export class Dragon extends Creature { | ||||
| constructor () { | constructor () { | ||||
| super(new ImproperNoun('dragon', 'dragons'), new ImproperNoun('wolf', 'wolves'), FemalePronouns, { Toughness: 35, Power: 35, Speed: 15, Willpower: 30, Charm: 20 }, new Set([VoreType.Oral, VoreType.Anal]), new Set([VoreType.Oral, VoreType.Anal]), 300) | |||||
| super(new ImproperNoun('dragon', 'dragons'), new ImproperNoun('wolf', 'wolves'), FemalePronouns, { Toughness: 35, Power: 35, Reflexes: 15, Agility: 15, Willpower: 30, Charm: 20 }, new Set([VoreType.Oral, VoreType.Anal]), new Set([VoreType.Oral, VoreType.Anal]), 300) | |||||
| this.actions.push( | this.actions.push( | ||||
| new AttackAction( | new AttackAction( | ||||
| new ConstantDamageFormula( | new ConstantDamageFormula( | ||||
| @@ -15,7 +15,7 @@ export class Geta extends Creature { | |||||
| new ProperNoun('Geta'), | new ProperNoun('Geta'), | ||||
| new ImproperNoun('fox', 'foxes'), | new ImproperNoun('fox', 'foxes'), | ||||
| MalePronouns, | MalePronouns, | ||||
| { Toughness: 10, Power: 10, Speed: 30, Willpower: 15, Charm: 40 }, | |||||
| { Toughness: 10, Power: 10, Reflexes: 30, Agility: 30, Willpower: 15, Charm: 40 }, | |||||
| new Set([VoreType.Oral, VoreType.Anal, VoreType.Cock]), | new Set([VoreType.Oral, VoreType.Anal, VoreType.Cock]), | ||||
| new Set([VoreType.Oral, VoreType.Anal, VoreType.Cock]), | new Set([VoreType.Oral, VoreType.Anal, VoreType.Cock]), | ||||
| 40 | 40 | ||||
| @@ -125,7 +125,7 @@ export class Goldeneye extends Creature { | |||||
| new ProperNoun("Goldeneye"), | new ProperNoun("Goldeneye"), | ||||
| new ImproperNoun('gryphon', 'gryphons'), | new ImproperNoun('gryphon', 'gryphons'), | ||||
| MalePronouns, | MalePronouns, | ||||
| { Toughness: 200, Power: 200, Speed: 200, Willpower: 200, Charm: 200 }, | |||||
| { Toughness: 200, Power: 200, Reflexes: 200, Agility: 200, Willpower: 200, Charm: 200 }, | |||||
| new Set(), | new Set(), | ||||
| new Set([VoreType.Oral]), | new Set([VoreType.Oral]), | ||||
| 2000 | 2000 | ||||
| @@ -17,7 +17,7 @@ export class Human extends Creature { | |||||
| vigors = { Health: 100, Stamina: 100, Resolve: 100 } | vigors = { Health: 100, Stamina: 100, Resolve: 100 } | ||||
| } | } | ||||
| if (options.stats === undefined) { | if (options.stats === undefined) { | ||||
| stats = { Toughness: 20, Power: 20, Speed: 20, Willpower: 20, Charm: 20 } | |||||
| stats = { Toughness: 20, Power: 20, Reflexes: 20, Agility: 20, Willpower: 20, Charm: 20 } | |||||
| } else { | } else { | ||||
| stats = options.stats | stats = options.stats | ||||
| } | } | ||||
| @@ -31,7 +31,7 @@ export class Kenzie extends Creature { | |||||
| new ProperNoun('Kenzie'), | new ProperNoun('Kenzie'), | ||||
| new ImproperNoun('lycanroc', 'lycanrocs'), | new ImproperNoun('lycanroc', 'lycanrocs'), | ||||
| FemalePronouns, | FemalePronouns, | ||||
| { Toughness: 25, Power: 35, Speed: 20, Willpower: 20, Charm: 30 }, | |||||
| { Toughness: 25, Power: 35, Reflexes: 20, Agility: 20, Willpower: 20, Charm: 30 }, | |||||
| new Set([VoreType.Oral]), | new Set([VoreType.Oral]), | ||||
| new Set([VoreType.Oral]), | new Set([VoreType.Oral]), | ||||
| 1000 | 1000 | ||||
| @@ -10,7 +10,7 @@ export class Kuro extends Creature { | |||||
| new ProperNoun('Kuro'), | new ProperNoun('Kuro'), | ||||
| new ProperNoun('Luxray'), | new ProperNoun('Luxray'), | ||||
| MalePronouns, | MalePronouns, | ||||
| { Toughness: 20, Power: 30, Speed: 50, Willpower: 30, Charm: 50 }, | |||||
| { Toughness: 20, Power: 30, Reflexes: 50, Agility: 50, Willpower: 30, Charm: 50 }, | |||||
| new Set(), | new Set(), | ||||
| new Set([VoreType.Oral, VoreType.Anal, VoreType.Cock]), | new Set([VoreType.Oral, VoreType.Anal, VoreType.Cock]), | ||||
| 100 | 100 | ||||
| @@ -10,7 +10,7 @@ export class Player extends Creature { | |||||
| new ProperNoun('Player'), | new ProperNoun('Player'), | ||||
| new ImproperNoun('player', 'players'), | new ImproperNoun('player', 'players'), | ||||
| TheyPronouns, | TheyPronouns, | ||||
| { Toughness: 25, Power: 25, Speed: 25, Willpower: 25, Charm: 25 }, | |||||
| { Toughness: 25, Power: 25, Reflexes: 25, Agility: 25, Willpower: 25, Charm: 25 }, | |||||
| anyVore, | anyVore, | ||||
| anyVore, | anyVore, | ||||
| 50 | 50 | ||||
| @@ -74,7 +74,7 @@ class Paw extends NormalContainer { | |||||
| { amount: 100, target: Vigor.Stamina, type: DamageType.Crush }, | { amount: 100, target: Vigor.Stamina, type: DamageType.Crush }, | ||||
| { amount: 3, target: Stat.Toughness, type: DamageType.Crush }, | { amount: 3, target: Stat.Toughness, type: DamageType.Crush }, | ||||
| { amount: 5, target: Stat.Power, type: DamageType.Crush }, | { amount: 5, target: Stat.Power, type: DamageType.Crush }, | ||||
| { amount: 10, target: Stat.Speed, type: DamageType.Crush } | |||||
| { amount: 10, target: Stat.Agility, type: DamageType.Crush } | |||||
| ) | ) | ||||
| ), | ), | ||||
| this | this | ||||
| @@ -90,7 +90,7 @@ class Paw extends NormalContainer { | |||||
| [ | [ | ||||
| { fraction: 1, target: Stat.Toughness, type: DamageType.Pure }, | { fraction: 1, target: Stat.Toughness, type: DamageType.Pure }, | ||||
| { fraction: 1, target: Stat.Power, type: DamageType.Pure }, | { fraction: 1, target: Stat.Power, type: DamageType.Pure }, | ||||
| { fraction: 1, target: Stat.Speed, type: DamageType.Pure }, | |||||
| { fraction: 1, target: Stat.Agility, type: DamageType.Pure }, | |||||
| { fraction: 1, target: Stat.Willpower, type: DamageType.Pure }, | { fraction: 1, target: Stat.Willpower, type: DamageType.Pure }, | ||||
| { fraction: 1, target: Stat.Charm, type: DamageType.Pure } | { fraction: 1, target: Stat.Charm, type: DamageType.Pure } | ||||
| ] | ] | ||||
| @@ -140,7 +140,7 @@ export class Shingo extends Creature { | |||||
| new ProperNoun('Shingo'), | new ProperNoun('Shingo'), | ||||
| new ImproperNoun('red panda', 'red pandas'), | new ImproperNoun('red panda', 'red pandas'), | ||||
| MalePronouns, | MalePronouns, | ||||
| { Toughness: 40, Power: 50, Speed: 30, Willpower: 30, Charm: 60 }, | |||||
| { Toughness: 40, Power: 50, Reflexes: 30, Agility: 30, Willpower: 30, Charm: 60 }, | |||||
| new Set(), | new Set(), | ||||
| new Set([VoreType.Oral]), | new Set([VoreType.Oral]), | ||||
| 3000 | 3000 | ||||
| @@ -128,7 +128,7 @@ class BootContainer extends NormalContainer { | |||||
| new UniformRandomDamageFormula(new Damage( | new UniformRandomDamageFormula(new Damage( | ||||
| { target: Stat.Toughness, type: DamageType.Crush, amount: 10 }, | { target: Stat.Toughness, type: DamageType.Crush, amount: 10 }, | ||||
| { target: Stat.Power, type: DamageType.Crush, amount: 10 }, | { target: Stat.Power, type: DamageType.Crush, amount: 10 }, | ||||
| { target: Stat.Speed, type: DamageType.Crush, amount: 10 }, | |||||
| { target: Stat.Agility, type: DamageType.Crush, amount: 10 }, | |||||
| { target: Stat.Willpower, type: DamageType.Crush, amount: 30 }, | { target: Stat.Willpower, type: DamageType.Crush, amount: 30 }, | ||||
| { target: Stat.Charm, type: DamageType.Crush, amount: 10 } | { target: Stat.Charm, type: DamageType.Crush, amount: 10 } | ||||
| ), 0.5), | ), 0.5), | ||||
| @@ -306,7 +306,7 @@ export class Withers extends Creature { | |||||
| new ProperNoun('Withers'), | new ProperNoun('Withers'), | ||||
| new ImproperNoun('hellhound', 'hellhounds'), | new ImproperNoun('hellhound', 'hellhounds'), | ||||
| FemalePronouns, | FemalePronouns, | ||||
| { Toughness: 40, Power: 50, Speed: 30, Willpower: 40, Charm: 70 }, | |||||
| { Toughness: 40, Power: 50, Reflexes: 30, Agility: 30, Willpower: 40, Charm: 70 }, | |||||
| new Set(), | new Set(), | ||||
| new Set([VoreType.Oral]), | new Set([VoreType.Oral]), | ||||
| 5000 | 5000 | ||||
| @@ -11,7 +11,7 @@ export class Wolf extends Creature { | |||||
| new ImproperNoun('wolf', 'wolves'), | new ImproperNoun('wolf', 'wolves'), | ||||
| new ImproperNoun('wolf', 'wolves'), | new ImproperNoun('wolf', 'wolves'), | ||||
| [MalePronouns, FemalePronouns, TheyPronouns][Math.floor(Math.random() * 3)], | [MalePronouns, FemalePronouns, TheyPronouns][Math.floor(Math.random() * 3)], | ||||
| { Toughness: 20, Power: 20, Speed: 20, Willpower: 20, Charm: 20 }, | |||||
| { Toughness: 20, Power: 20, Reflexes: 20, Agility: 20, Willpower: 20, Charm: 20 }, | |||||
| anyVore, | anyVore, | ||||
| anyVore, | anyVore, | ||||
| 25 | 25 | ||||
| @@ -65,7 +65,7 @@ export abstract class Mortal extends Entity { | |||||
| return { | return { | ||||
| Health: this.stats.Toughness * 10 + this.stats.Power * 5, | Health: this.stats.Toughness * 10 + this.stats.Power * 5, | ||||
| Resolve: this.stats.Willpower * 10 + this.stats.Charm * 5, | Resolve: this.stats.Willpower * 10 + this.stats.Charm * 5, | ||||
| Stamina: this.stats.Speed * 10 + this.stats.Power * 2.5 + this.stats.Charm * 2.5 | |||||
| Stamina: this.stats.Agility * 5 + this.stats.Reflexes * 5 | |||||
| } | } | ||||
| } | } | ||||
| @@ -96,8 +96,8 @@ export class Dagger extends Weapon { | |||||
| new ImproperNoun('dagger', 'daggers'), | new ImproperNoun('dagger', 'daggers'), | ||||
| 'A pointy dagger', | 'A pointy dagger', | ||||
| new StatDamageFormula([ | new StatDamageFormula([ | ||||
| { fraction: 0.50, stat: Stat.Speed, target: Vigor.Health, type: DamageType.Pierce }, | |||||
| { fraction: 0.05, stat: Stat.Speed, target: Vigor.Health, type: DamageType.Slash } | |||||
| { fraction: 0.50, stat: Stat.Agility, target: Vigor.Health, type: DamageType.Pierce }, | |||||
| { fraction: 0.05, stat: Stat.Agility, target: Vigor.Health, type: DamageType.Slash } | |||||
| ]), | ]), | ||||
| new Verb('stab', 'stabs', 'stabbing', 'stabbed') | new Verb('stab', 'stabs', 'stabbing', 'stabbed') | ||||
| ) | ) | ||||
| @@ -219,7 +219,7 @@ export class HealthPotion extends Consumable { | |||||
| ), | ), | ||||
| new StatDamageFormula([ | new StatDamageFormula([ | ||||
| { fraction: 2, stat: Stat.Toughness, target: Vigor.Health, type: DamageType.Heal }, | { fraction: 2, stat: Stat.Toughness, target: Vigor.Health, type: DamageType.Heal }, | ||||
| { fraction: 2, stat: Stat.Speed, target: Vigor.Stamina, type: DamageType.Heal }, | |||||
| { fraction: 2, stat: Stat.Agility, target: Vigor.Stamina, type: DamageType.Heal }, | |||||
| { fraction: 2, stat: Stat.Willpower, target: Vigor.Resolve, type: DamageType.Heal } | { fraction: 2, stat: Stat.Willpower, target: Vigor.Resolve, type: DamageType.Heal } | ||||
| ]) | ]) | ||||
| ]) | ]) | ||||
| @@ -15,7 +15,8 @@ function makeParty (): Creature[] { | |||||
| stats: { | stats: { | ||||
| Toughness: 20, | Toughness: 20, | ||||
| Power: 20, | Power: 20, | ||||
| Speed: 15, | |||||
| Reflexes: 15, | |||||
| Agility: 15, | |||||
| Willpower: 15, | Willpower: 15, | ||||
| Charm: 10 | Charm: 10 | ||||
| } | } | ||||
| @@ -26,7 +27,8 @@ function makeParty (): Creature[] { | |||||
| stats: { | stats: { | ||||
| Toughness: 10, | Toughness: 10, | ||||
| Power: 15, | Power: 15, | ||||
| Speed: 20, | |||||
| Reflexes: 20, | |||||
| Agility: 20, | |||||
| Willpower: 15, | Willpower: 15, | ||||
| Charm: 20 | Charm: 20 | ||||
| } | } | ||||
| @@ -37,7 +39,8 @@ function makeParty (): Creature[] { | |||||
| stats: { | stats: { | ||||
| Toughness: 10, | Toughness: 10, | ||||
| Power: 10, | Power: 10, | ||||
| Speed: 15, | |||||
| Reflexes: 15, | |||||
| Agility: 15, | |||||
| Willpower: 20, | Willpower: 20, | ||||
| Charm: 25 | Charm: 25 | ||||
| } | } | ||||
| @@ -48,7 +51,8 @@ function makeParty (): Creature[] { | |||||
| stats: { | stats: { | ||||
| Toughness: 15, | Toughness: 15, | ||||
| Power: 15, | Power: 15, | ||||
| Speed: 10, | |||||
| Reflexes: 10, | |||||
| Agility: 10, | |||||
| Willpower: 20, | Willpower: 20, | ||||
| Charm: 15 | Charm: 15 | ||||
| } | } | ||||