@@ -1,64 +1,92 @@  
		
	
		
			
			import { Creature } from "../creature"  
		
	
		
			
			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 { ContainsCondition, CapableCondition, EnemyCondition } from '../combat/conditions'  
		
	
		
			
			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  
		
	
		
			
			 
		
	
		
			
			  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(  
		
	
		
			
			      verb.root.capital,  
		
	
		
			
			      'Chew your victim',  
		
	
		
			
			      name,  
		
	
		
			
			      desc,  
		
	
		
			
			      damage,  
		
	
		
			
			      [new CapableCondition(), new ContainsCondition(container), new EnemyCondition()]  
		
	
		
			
			    )  
		
	
		
			
			    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 {  
		
	
		
			
			    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 `,  
		
	
		
			
			    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 {  
		
	
		
			
			  consumeVerb: Verb = new Verb('grab', 'grabs', 'grabbing', 'grabbed')  
		
	
		
			
			  releaseVerb: Verb = new Verb('release', 'releases', 'releasing', 'released')  
		
	
	
		
			
				
				
				
				
					 
			
			@@ -69,13 +97,20 @@ class Maw extends NormalContainer {  
		
	
		
			
			 
		
	
		
			
			    this.actions = []  
		
	
		
			
			    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 Damage(  
		
	
		
			
			          { amount: 200, target: Vigor.Health, type: DamageType.Crush }  
		
	
		
			
			        )  
		
	
		
			
			      ),  
		
	
		
			
			      new Verb('chew'),  
		
	
		
			
			      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}`  
		
	
		
			
			    )  
		
	
		
			
			    this.actions.push(gulp)  
		
	
		
			
			 
		
	
		
			
			    this.otherContainers.push(new Paw(this))  
		
	
		
			
			  }  
		
	
		
			
			}