@@ -1,64 +1,92 @@
import { Creature } from "../creature"
import { Creature } from "../creature"
import { Damage, DamageType, ConstantDamageFormula, Vigor, Side, StatDamageFormula, Stat, Action, DamageFormula } from '../combat'
import { Damage, DamageType, ConstantDamageFormula, Vigor, Side, StatDamageFormula, Stat, Action, DamageFormula } from '../combat'
import { ImproperNoun, ProperNoun, FemalePronouns, MalePronouns, Verb, PairLineArgs, PairLine } from '../language'
import { VoreType, Stomach, Bowels, NormalContainer, InnerContainer, VoreContainer, Container } from '../vore'
import { AttackAction, TransferAction, FeedAction, StruggleAction } from '../combat/actions'
import { ImproperNoun, ProperNoun, FemalePronouns, MalePronouns, Verb, PairLineArgs, PairLine, TextLike } from '../language'
import { VoreType, Stomach, Bowels, NormalContainer, InnerContainer, VoreContainer, Container, Vore } from '../vore'
import { AttackAction, TransferAction, FeedAction, StruggleAction, DamageAction } from '../combat/actions'
import { LogLine, LogEntry, LogLines } from '../interface'
import { LogLine, LogEntry, LogLines } from '../interface'
import { ContainsCondition, CapableCondition, EnemyCondition } from '../combat/conditions'
import { ContainsCondition, CapableCondition, EnemyCondition } from '../combat/conditions'
import { StatTest } from '../combat/tests'
import { StatTest } from '../combat/tests'
class Hand extends NormalContainer {
consumeVerb: Verb = new Verb('grab', 'grabs', 'grabbing', 'grabbed')
releaseVerb: Verb = new Verb('release', 'releases', 'releasing', 'released')
struggleVerb: Verb = new Verb('squirm', 'squirms', 'squirming', 'squirmed')
constructor (owner: Creature) {
super(new ImproperNoun('hand', 'hands'), owner, new Set(), 100)
}
}
export class ChewAction extends Action {
export class TrappedAction extends DamageAction {
protected test: StatTest
protected test: StatTest
constructor (protected damage: DamageFormula, protected verb: Verb = new Verb('smack') , container: Container) {
constructor (name: TextLike, desc: TextLike, protected verb: Verb, protected damage: DamageFormula, container: Container) {
super(
super(
verb.root.capital,
'Chew your victim',
name,
desc,
damage,
[new CapableCondition(), new ContainsCondition(container), new EnemyCondition()]
[new CapableCondition(), new ContainsCondition(container), new EnemyCondition()]
)
)
this.test = new StatTest(Stat.Power)
this.test = new StatTest(Stat.Power)
}
}
execute (user: Creature, target: Creature): LogEntry {
const effectResults = target.effects.map(effect => effect.preAttack(target, user))
if (effectResults.some(result => result.prevented)) {
return new LogLines(...effectResults.map(result => result.log))
}
if (this.test.test(user, target)) {
const damage = this.damage.calc(user, target)
const targetResult = target.takeDamage(damage)
const ownResult = this.successLine(user, target, { damage: damage })
return new LogLines(ownResult, targetResult)
} else {
return this.failLine(user, target)
}
}
describe (user: Creature, target: Creature): LogEntry {
describe (user: Creature, target: Creature): LogEntry {
return new LogLine(`Attack ${target.name}. `, this.damage.describe(user, target), '. ', this.test.explain(user, target))
return new LogLine(`Chew on ${target.name}. `, this.damage.describe(user, target), '. ', this.test.explain(user, target))
}
}
protected successLine: PairLineArgs<Creature, { damage: Damage }> = (user, target, args) => new LogLine(
successLine: PairLineArgs<Creature, { damage: Damage }> = (user, target, args) => new LogLine(
`${user.name.capital} ${user.name.conjugate(this.verb)} ${target.name.objective} for `,
`${user.name.capital} ${user.name.conjugate(this.verb)} ${target.name.objective} for `,
target.effectiveDamage(args.damage).renderShort()
target.effectiveDamage(args.damage).renderShort()
)
)
protected failLine: PairLine<Creature> = (user, target) => new LogLine(
`${user.name.capital} ${user.name.conjugate(new Verb('miss', 'misses'))} ${target.name.objective} `
failLine: PairLine<Creature> = (user, target) => new LogLine(
`${user.name.capital} can't quite get ${user.pronouns.possessive} teeth around ${target.name.objective}.`
)
)
}
}
class Hand extends NormalContainer {
consumeVerb: Verb = new Verb('grab', 'grabs', 'grabbing', 'grabbed')
releaseVerb: Verb = new Verb('release', 'releases', 'releasing', 'released')
struggleVerb: Verb = new Verb('squirm', 'squirms', 'squirming', 'squirmed')
constructor (owner: Creature) {
super(new ImproperNoun('hand', 'hands'), owner, new Set(), 100)
this.actions.push(new TrappedAction(
"Grip",
"Give your victim the squeeze",
new Verb(
'squeeze'
),
new ConstantDamageFormula(
new Damage(
{ amount: 200, target: Vigor.Health, type: DamageType.Crush }
)
),
this
))
}
}
class Paw extends NormalContainer {
consumeVerb: Verb = new Verb('pin', 'pins', 'pinning', 'pinbed')
releaseVerb: Verb = new Verb('release', 'releases', 'releasing', 'released')
struggleVerb: Verb = new Verb('squirm', 'squirms', 'squirming', 'squirmed')
constructor (owner: Creature) {
super(new ImproperNoun('paw', 'paws'), owner, new Set([VoreType.Oral]), 100)
this.actions.push(new TrappedAction(
"Smother",
"Bury your victim under your ties",
new Verb(
'smother'
),
new ConstantDamageFormula(
new Damage(
{ amount: 10, target: Stat.Toughness, type: DamageType.Crush },
{ amount: 10, target: Stat.Power, type: DamageType.Crush },
{ amount: 10, target: Stat.Speed, type: DamageType.Crush }
)
),
this
))
}
consumeLine: PairLineArgs<Vore, { container: Container }> = (user, target, args) => {
return new LogLine(`${user.name.capital} ${user.name.conjugate(this.consumeVerb)} ${target.name.objective} beneath ${user.pronouns.possessive} ${args.container.name}.`)
}
}
class Maw extends NormalContainer {
class Maw extends NormalContainer {
consumeVerb: Verb = new Verb('grab', 'grabs', 'grabbing', 'grabbed')
consumeVerb: Verb = new Verb('grab', 'grabs', 'grabbing', 'grabbed')
releaseVerb: Verb = new Verb('release', 'releases', 'releasing', 'released')
releaseVerb: Verb = new Verb('release', 'releases', 'releasing', 'released')
@@ -69,13 +97,20 @@ class Maw extends NormalContainer {
this.actions = []
this.actions = []
this.actions.push(new StruggleAction(this))
this.actions.push(new StruggleAction(this))
this.actions.push(new ChewAction(
this.actions.push(new TrappedAction(
"Chew",
"Chew on your victim",
new Verb(
'bite down on',
'bites down on',
'biting down on',
'bit down on'
),
new ConstantDamageFormula(
new ConstantDamageFormula(
new Damage(
new Damage(
{ amount: 200, target: Vigor.Health, type: DamageType.Crush }
{ amount: 200, target: Vigor.Health, type: DamageType.Crush }
)
)
),
),
new Verb('chew'),
this
this
))
))
}
}
@@ -133,5 +168,7 @@ export class Shingo extends Creature {
`${user.name.capital} ${user.name.conjugate(gulp.verb)} ${target.name.objective} down ${user.pronouns.possessive} tight, inescapable gullet, sending ${target.pronouns.objective} down to ${user.pronouns.possessive} ${args.to.name}`
`${user.name.capital} ${user.name.conjugate(gulp.verb)} ${target.name.objective} down ${user.pronouns.possessive} tight, inescapable gullet, sending ${target.pronouns.objective} down to ${user.pronouns.possessive} ${args.to.name}`
)
)
this.actions.push(gulp)
this.actions.push(gulp)
this.otherContainers.push(new Paw(this))
}
}
}
}