diff --git a/src/components/Statblock.vue b/src/components/Statblock.vue index 7334ef6..4bbde9e 100644 --- a/src/components/Statblock.vue +++ b/src/components/Statblock.vue @@ -44,8 +44,9 @@
Status: {{subject.status}}
- - + + + @@ -63,6 +64,11 @@ import 'tippy.js/dist/tippy.css' components: { ContainerView }, + data () { + return { + POV: POV + } + }, methods: { vigorColor (value: number, max: number) { if (value * 5 <= max) { diff --git a/src/game/combat/actions.ts b/src/game/combat/actions.ts index e0a9e11..1f4d4f5 100644 --- a/src/game/combat/actions.ts +++ b/src/game/combat/actions.ts @@ -10,11 +10,11 @@ export class AttackAction extends Action { protected test: StatTest protected successLines: POVPairArgs = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new LogLine( + [[POV.Second, POV.Third], (user, target, args) => new LogLine( `You ${this.verb} ${target.name} for `, args.damage.renderShort() )], - [[POV.Third, POV.First], (user, target, args) => new LogLine( + [[POV.Third, POV.Second], (user, target, args) => new LogLine( `${user.name.capital} ${this.verb.singular} you for `, args.damage.renderShort() )], @@ -25,8 +25,8 @@ export class AttackAction extends Action { ]) protected failLines: POVPair = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You try to ${this.verb.present} ${target.name}, but you miss`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} misses you`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You try to ${this.verb.present} ${target.name}, but you miss`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} misses you`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} misses ${target.name}`)] ]) @@ -59,8 +59,8 @@ export class DevourAction extends Action { private test: StatVigorTest protected failLines: POVPairArgs = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new LogLine(`You fail to ${args.container.consumeVerb} ${target.name}`)], - [[POV.Third, POV.First], (user, target, args) => new LogLine(`${user.name.capital} tries to ${args.container.consumeVerb} you, but fails`)], + [[POV.Second, POV.Third], (user, target, args) => new LogLine(`You fail to ${args.container.consumeVerb} ${target.name}`)], + [[POV.Third, POV.Second], (user, target, args) => new LogLine(`${user.name.capital} tries to ${args.container.consumeVerb} you, but fails`)], [[POV.Third, POV.Third], (user, target, args) => new LogLine(`${user.name.capital} unsuccessfully tries to ${args.container.consumeVerb} ${target.name}`)] ]) @@ -102,8 +102,8 @@ export class FeedAction extends Action { private test: StatTest protected failLines: POVPair = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You fail to feed yourself to ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} tries to feed ${user.pronouns.possessive} to you, but fails`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You fail to feed yourself to ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} tries to feed ${user.pronouns.possessive} to you, but fails`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} unsuccessfully tries to feed ${user.pronouns.possessive} to ${target.name}`)] ]) @@ -142,8 +142,8 @@ export class StruggleAction extends Action { private test: StatVigorTest protected failLines: POVPair = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You fail to escape from ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} tries to escape from you, but fails`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You fail to escape from ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} tries to escape from you, but fails`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} unsuccessfully struggles against ${target.name}`)] ]) @@ -250,8 +250,8 @@ export class ReleaseAction extends Action { export class TransferAction extends Action { lines: POVPairArgs = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new LogLine(`You squeeze ${target.name} from your ${args.from.name} to your ${args.to.name}`)], - [[POV.Third, POV.First], (user, target, args) => new LogLine(`You're squeezed from ${user.name}'s ${args.from.name} to ${user.pronouns.possessive} ${args.to.name}`)], + [[POV.Second, POV.Third], (user, target, args) => new LogLine(`You squeeze ${target.name} from your ${args.from.name} to your ${args.to.name}`)], + [[POV.Third, POV.Second], (user, target, args) => new LogLine(`You're squeezed from ${user.name}'s ${args.from.name} to ${user.pronouns.possessive} ${args.to.name}`)], [[POV.Third, POV.Third], (user, target, args) => new LogLine(`${user.name} sends ${target.name} from ${user.pronouns.possessive} ${args.from.name.all} to ${user.pronouns.possessive} ${args.to.name.all}`)] ]) diff --git a/src/game/combat/effects.ts b/src/game/combat/effects.ts index 255fc76..9196236 100644 --- a/src/game/combat/effects.ts +++ b/src/game/combat/effects.ts @@ -5,7 +5,7 @@ import { POVSolo } from '../language' export class InstantKill implements Effect { lines = new POVSolo([ - [[POV.First], (target: Creature) => new LogLine(`You're killed instantly! `, new FAElem('fas fa-skull'))], + [[POV.Second], (target: Creature) => new LogLine(`You're killed instantly! `, new FAElem('fas fa-skull'))], [[POV.Third], (target: Creature) => new LogLine(`${target.name.capital} is killed instantly! `, new FAElem('fas fa-skull'))] ]) diff --git a/src/game/creatures/cafat.ts b/src/game/creatures/cafat.ts index 0401e11..0d71071 100644 --- a/src/game/creatures/cafat.ts +++ b/src/game/creatures/cafat.ts @@ -8,11 +8,11 @@ import { InstantKill } from '../combat/effects' class BellyCrushAction extends AttackAction { successLines = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new CompositeLog(new LogLine( + [[POV.Second, POV.Third], (user, target, args) => new CompositeLog(new LogLine( `You crush on ${target.name} with your belly for `, args.damage.renderShort() ), new ImgElem('./media/cafat/images/belly-crush.webp'))], - [[POV.Third, POV.First], (user, target, args) => new CompositeLog(new LogLine( + [[POV.Third, POV.Second], (user, target, args) => new CompositeLog(new LogLine( `${user.name.capital} crushes on you with ${user.pronouns.possessive} belly for `, args.damage.renderShort() ), new ImgElem('./media/cafat/images/belly-crush.webp'))], @@ -39,11 +39,11 @@ class BellyCrushAction extends AttackAction { class BelchAction extends AttackAction { successLines = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new CompositeLog(new LogLine( + [[POV.Second, POV.Third], (user, target, args) => new CompositeLog(new LogLine( `You belch on ${target.name} for `, args.damage.renderShort() ), new ImgElem('./media/cafat/images/belch.webp'))], - [[POV.Third, POV.First], (user, target, args) => new CompositeLog(new LogLine( + [[POV.Third, POV.Second], (user, target, args) => new CompositeLog(new LogLine( `${user.name.capital} belches on you for `, args.damage.renderShort() ), new ImgElem('./media/cafat/images/belch.webp'))], @@ -62,8 +62,8 @@ class BelchAction extends AttackAction { class CrushAction extends EatenAction { lines: POVPair = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You crush ${target.name} `)], - [[POV.Third, POV.First], (user) => new CompositeLog(new LogLine(`${user.name.capital} crushes you; ${user.pronouns.subjective} ${user.pronouns.isPlural ? 'belch' : 'belches'} as ${user.pronouns.possessive} gut lets out a fatal CRUNCH `), new ImgElem('./media/cafat/images/crunch.webp'))], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You crush ${target.name} `)], + [[POV.Third, POV.Second], (user) => new CompositeLog(new LogLine(`${user.name.capital} crushes you; ${user.pronouns.subjective} ${user.pronouns.isPlural ? 'belch' : 'belches'} as ${user.pronouns.possessive} gut lets out a fatal CRUNCH `), new ImgElem('./media/cafat/images/crunch.webp'))], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} crushes ${target.name}; ${user.pronouns.subjective} ${user.pronouns.isPlural ? 'belch' : 'belches'} as ${user.pronouns.possessive} gut lets out a fatal CRUNCH `, new ImgElem('./media/cafat/images/crunch.webp'))] ]) @@ -110,8 +110,8 @@ export class Cafat extends Creature { lowerStomach.name = new ImproperNoun("lower stomach", "lower stomachs").all stomach.consumeLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You devour ${target.name}`)], - [[POV.Third, POV.First], (user) => new CompositeLog(new LogLine(`${user.name.capital} devours you`), new ImgElem('./media/cafat/images/stomach.webp'))], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You devour ${target.name}`)], + [[POV.Third, POV.Second], (user) => new CompositeLog(new LogLine(`${user.name.capital} devours you`), new ImgElem('./media/cafat/images/stomach.webp'))], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} munches ${target.name.capital}`)] ]) const crush = new CrushAction(lowerStomach) @@ -122,8 +122,8 @@ export class Cafat extends Creature { const transfer = new TransferAction(stomach, lowerStomach) transfer.lines = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new LogLine(`You squeeze ${target.name} from your ${args.from.name} to your ${args.to.name}`)], - [[POV.Third, POV.First], (user, target, args) => new CompositeLog(new LogLine(`You're squeezed from ${user.name}'s ${args.from.name} to ${user.pronouns.possessive} ${args.to.name}`), new ImgElem('./media/cafat/images/lower-stomach.webp'))], + [[POV.Second, POV.Third], (user, target, args) => new LogLine(`You squeeze ${target.name} from your ${args.from.name} to your ${args.to.name}`)], + [[POV.Third, POV.Second], (user, target, args) => new CompositeLog(new LogLine(`You're squeezed from ${user.name}'s ${args.from.name} to ${user.pronouns.possessive} ${args.to.name}`), new ImgElem('./media/cafat/images/lower-stomach.webp'))], [[POV.Third, POV.Third], (user, target, args) => new LogLine(`${user.name} squeezes ${target.name} from ${user.pronouns.possessive} ${args.from.name} to ${user.pronouns.possessive} ${args.to.name}`)] ]) this.actions.push(transfer) diff --git a/src/game/creatures/player.ts b/src/game/creatures/player.ts index c8c5a1c..fc58939 100644 --- a/src/game/creatures/player.ts +++ b/src/game/creatures/player.ts @@ -16,6 +16,6 @@ export class Player extends Creature { const bowels = new Bowels(this, 100, new Damage({ amount: 20, type: DamageType.Crush, target: Vigor.Health })) this.containers.push(bowels) - this.perspective = POV.First + this.perspective = POV.Second } } diff --git a/src/game/creatures/withers.ts b/src/game/creatures/withers.ts index 9058d10..02ddfa2 100644 --- a/src/game/creatures/withers.ts +++ b/src/game/creatures/withers.ts @@ -30,7 +30,7 @@ class LevelDrain extends Action { const targetResult = target.takeDamage(damage) return new LogLines( - new LogLine(`${user.name.capital.possessive} ${this.container.name} drains power from ${target.name}, siphoning `, damage.renderShort(), ` from ${target.pronouns.possessive} body!`), + new LogLine(`${user.name.capital.possessive} ${this.container.name} drains power from ${target.name.objective}, siphoning `, damage.renderShort(), ` from ${target.pronouns.possessive} body!`), targetResult ) } @@ -52,8 +52,8 @@ class LevelDrain extends Action { } class HypnotizeAction extends Action { lines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`Your hypnotic gaze enthralls ${target.name}, putting ${target.pronouns.objective} under your control!`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital}'s hypnotic gaze enthralls you, putting you under ${user.pronouns.possessive} control!`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`Your hypnotic gaze enthralls ${target.name}, putting ${target.pronouns.objective} under your control!`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital}'s hypnotic gaze enthralls you, putting you under ${user.pronouns.possessive} control!`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital}'s hypnotic gaze enthralls ${target.name}, putting ${target.pronouns.objective} under ${user.pronouns.possessive} control!`)] ]) @@ -84,20 +84,20 @@ class MawContainer extends NormalContainer { struggleVerb = new Verb('struggle', 'struggles', 'struggling', 'struggled') consumeLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You snatch ${target.name} up in your jaws`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} snatches you up in ${user.pronouns.possessive} maw`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You snatch ${target.name} up in your jaws`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} snatches you up in ${user.pronouns.possessive} maw`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} snatches ${target.name} up in ${user.pronouns.possessive} maw`)] ]) releaseLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You let out ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} lets you out `)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You let out ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} lets you out `)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} lets out ${target.name}`)] ]) struggleLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You claw your way free of ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} forces ${user.pronouns.possessive} way free!`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You claw your way free of ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} forces ${user.pronouns.possessive} way free!`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} escapes from ${target.name}`)] ]) @@ -110,8 +110,8 @@ class MawContainer extends NormalContainer { class FlexToesAction extends GroupAction { lines = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new LogLine(`Your toes crush ${target.name} for `, args.damage.renderShort(), ` damage!`)], - [[POV.Third, POV.First], (user, target, args) => new LogLine(`${user.name.capital}'s toes crush you for `, args.damage.renderShort(), ` damage!`)], + [[POV.Second, POV.Third], (user, target, args) => new LogLine(`Your toes crush ${target.name} for `, args.damage.renderShort(), ` damage!`)], + [[POV.Third, POV.Second], (user, target, args) => new LogLine(`${user.name.capital}'s toes crush you for `, args.damage.renderShort(), ` damage!`)], [[POV.Third, POV.Third], (user, target, args) => new LogLine(`${user.name.capital}'s toes crush ${target.name} for `, args.damage.renderShort(), ` damage!`)] ]) @@ -138,20 +138,20 @@ class FlexToesAction extends GroupAction { class BootContainer extends NormalContainer { consumeLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You stuff ${target.name} into your boot.`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} stuffs you in ${user.pronouns.possessive} boot, pinning you between toes and insole.`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You stuff ${target.name} into your boot.`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} stuffs you in ${user.pronouns.possessive} boot, pinning you between toes and insole.`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} stuffs ${target.name} in ${user.pronouns.possessive} boot.`)] ]) releaseLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You dump ${target.name} out from your boot.`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} dumps you out from ${user.pronouns.possessive} boot.`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You dump ${target.name} out from your boot.`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} dumps you out from ${user.pronouns.possessive} boot.`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} dumps ${target.name} out from ${user.pronouns.possessive} boot.`)] ]) struggleLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You slip out from ${target.name}'s boot.`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} squeezes ${user.pronouns.possessive} way free of your footwear!`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You slip out from ${target.name}'s boot.`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} squeezes ${user.pronouns.possessive} way free of your footwear!`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} escapes from ${target.name}'s boot.`)] ]) @@ -198,8 +198,8 @@ class BiteAction extends AttackAction { class ChewAction extends GroupAction { lines: POVPairArgs = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args: { damage: Damage }) => new LogLine(`You chew on ${target.name} for `, args.damage.renderShort(), `!`)], - [[POV.Third, POV.First], (user, target, args: { damage: Damage }) => new LogLine(`${user.name.capital} chews on you for `, args.damage.renderShort(), `!`)], + [[POV.Second, POV.Third], (user, target, args: { damage: Damage }) => new LogLine(`You chew on ${target.name} for `, args.damage.renderShort(), `!`)], + [[POV.Third, POV.Second], (user, target, args: { damage: Damage }) => new LogLine(`${user.name.capital} chews on you for `, args.damage.renderShort(), `!`)], [[POV.Third, POV.Third], (user, target, args: { damage: Damage }) => new LogLine(`${user.name.capital} chews on ${target.name} for `, args.damage.renderShort(), `!`)] ]) @@ -237,8 +237,8 @@ class ChewAction extends GroupAction { class StompAction extends GroupAction { lines: POVPair = new POVPair([ - [[POV.First, POV.Third], (user: Creature, target: Creature) => new LogLine(`You flatten ${target.name} under your foot!`)], - [[POV.Third, POV.First], (user: Creature) => new LogLine(`${user.name.capital} flattens you under ${user.pronouns.possessive} ${huge} foot!`)], + [[POV.Second, POV.Third], (user: Creature, target: Creature) => new LogLine(`You flatten ${target.name} under your foot!`)], + [[POV.Third, POV.Second], (user: Creature) => new LogLine(`${user.name.capital} flattens you under ${user.pronouns.possessive} ${huge} foot!`)], [[POV.Third, POV.Third], (user: Creature, target: Creature) => new LogLine(`${user.name.capital} flattens ${target.name} under ${user.pronouns.possessive} ${huge} foot!`)] ]) @@ -265,8 +265,8 @@ class StompAction extends GroupAction { class StompAllyAction extends Action { lines: POVPair = new POVPair([ - [[POV.First, POV.Third], (user: Creature, target: Creature) => new LogLine(`You flatten ${target.name} under your boot!`)], - [[POV.Third, POV.First], (user: Creature) => new LogLine(`${user.name.capital} flattens you under ${user.pronouns.possessive} ${huge} boot!`)], + [[POV.Second, POV.Third], (user: Creature, target: Creature) => new LogLine(`You flatten ${target.name} under your boot!`)], + [[POV.Third, POV.Second], (user: Creature) => new LogLine(`${user.name.capital} flattens you under ${user.pronouns.possessive} ${huge} boot!`)], [[POV.Third, POV.Third], (user: Creature, target: Creature) => new LogLine(`${user.name.capital} flattens ${target.name} under ${user.pronouns.possessive} ${huge} boot!`)] ]) @@ -369,14 +369,14 @@ export class Withers extends Creature { )) stomach.tickLines = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new LogLine(`Your stomach ${Words.Churns.singular} ${target.name} for `, args.damage.renderShort())], - [[POV.Third, POV.First], (user, target, args) => new LogLine(`${user.name.capital}'s stomach ${Words.Churns.singular} you for `, args.damage.renderShort())], + [[POV.Second, POV.Third], (user, target, args) => new LogLine(`Your stomach ${Words.Churns.singular} ${target.name} for `, args.damage.renderShort())], + [[POV.Third, POV.Second], (user, target, args) => new LogLine(`${user.name.capital}'s stomach ${Words.Churns.singular} you for `, args.damage.renderShort())], [[POV.Third, POV.Third], (user, target, args) => new LogLine(`${user.name.capital} ${Words.Churns.singular} ${target.name} for `, args.damage.renderShort())] ]) stomach.digestLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`Your stomach ${Words.Digests.singular} ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital}'s stomach ${Words.Digests.singular} you`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`Your stomach ${Words.Digests.singular} ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital}'s stomach ${Words.Digests.singular} you`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${target.name.capital}'s ${Words.Struggles.present} fades as the ${target.kind.all} is ${Words.Digests.past} by the ${user.kind.all}'s ${stomach.name}.`)] ]) diff --git a/src/game/creatures/wolf.ts b/src/game/creatures/wolf.ts index ba1b517..bcf9111 100644 --- a/src/game/creatures/wolf.ts +++ b/src/game/creatures/wolf.ts @@ -15,11 +15,11 @@ class BiteAction extends AttackAction { class HypnoAction extends AttackAction { protected successLines: POVPairArgs = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new LogLine( + [[POV.Second, POV.Third], (user, target, args) => new LogLine( `You hypnotize ${target.name} for `, args.damage.renderShort() )], - [[POV.Third, POV.First], (user, target, args) => new LogLine( + [[POV.Third, POV.Second], (user, target, args) => new LogLine( `${user.name.capital} hypnotizes you for `, args.damage.renderShort() )], @@ -30,8 +30,8 @@ class HypnoAction extends AttackAction { ]) protected failLines: POVPair = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You try to hypnotize ${target.name}, but you miss`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} misses you`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You try to hypnotize ${target.name}, but you miss`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} misses you`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${target.name} misses ${target.name}`)] ]) diff --git a/src/game/entity.ts b/src/game/entity.ts index 925ded0..28e29a4 100644 --- a/src/game/entity.ts +++ b/src/game/entity.ts @@ -4,7 +4,7 @@ import { LogEntry, LogLine } from './interface' import { Vore, VoreContainer, VoreType, Container } from './vore' import { Item } from './items' -export enum POV {First, Third} +export enum POV {First, Second, Third} export interface Entity { name: Noun; diff --git a/src/game/language.ts b/src/game/language.ts index b4f5565..d82a563 100644 --- a/src/game/language.ts +++ b/src/game/language.ts @@ -82,6 +82,7 @@ interface WordOptions { vowel: VowelSound; count: boolean; possessive: boolean; + objective: boolean; } const emptyConfig: WordOptions = { @@ -93,7 +94,8 @@ const emptyConfig: WordOptions = { plural: false, proper: false, vowel: VowelSound.Default, - possessive: false + possessive: false, + objective: false } export type TextLike = { toString: () => string } @@ -221,9 +223,9 @@ export abstract class Word { return this.configure(opts) as this } - get nonpossessive (): this { + get objective (): this { const opts: WordOptions = Object.assign({}, this.opt) - opts.possessive = false + opts.objective = true return this.configure(opts) as this } } @@ -322,13 +324,13 @@ export class Noun extends Word { export class ImproperNoun extends Noun { constructor (singularNoun: string, pluralNoun: string = singularNoun, possessiveNoun: string = singularNoun + "'s") { - super(singularNoun, pluralNoun, null, { plural: false, allCaps: false, capital: false, proper: false, nounKind: NounKind.Specific, verbKind: VerbKind.Root, vowel: VowelSound.Default, count: true, possessive: false }) + super(singularNoun, pluralNoun, null, { plural: false, allCaps: false, capital: false, proper: false, nounKind: NounKind.Specific, verbKind: VerbKind.Root, vowel: VowelSound.Default, count: true, possessive: false, objective: false }) } } export class ProperNoun extends Noun { constructor (singularNoun: string) { - super(singularNoun, null, null, { plural: false, allCaps: false, capital: false, proper: true, nounKind: NounKind.Specific, verbKind: VerbKind.Root, vowel: VowelSound.Default, count: true, possessive: false }) + super(singularNoun, null, null, { plural: false, allCaps: false, capital: false, proper: true, nounKind: NounKind.Specific, verbKind: VerbKind.Root, vowel: VowelSound.Default, count: true, possessive: false, objective: false }) } } @@ -435,6 +437,14 @@ export class PronounAsNoun extends Noun { configure (opts: WordOptions): Word { return new PronounAsNoun(this.pronouns, opts) } + + toString (): string { + if (this.options.objective) { + return new Noun(this.pronouns.objective, this.pronouns.objective, this.pronouns.possessive, this.options).toString() + } else { + return super.toString() + } + } } export const MalePronouns = new Pronoun({ diff --git a/src/game/vore.ts b/src/game/vore.ts index a4376df..1fda727 100644 --- a/src/game/vore.ts +++ b/src/game/vore.ts @@ -1,7 +1,7 @@ import { Entity, Mortal, POV, Creature } from './entity' import { Damage, DamageType, Stats, Actionable, Action, Vigor, VoreStats } from './combat' import { LogLines, LogEntry, CompositeLog, LogLine } from './interface' -import { Noun, Pronoun, POVPair, POVPairArgs, ImproperNoun, POVSolo, TextLike, Verb, SecondPersonPronouns, PronounAsNoun } from './language' +import { Noun, Pronoun, POVPair, POVPairArgs, ImproperNoun, POVSolo, TextLike, Verb, SecondPersonPronouns, PronounAsNoun, FirstPersonPronouns } from './language' import { DigestAction, DevourAction, ReleaseAction, StruggleAction } from './combat/actions' import * as Words from './words' @@ -22,6 +22,8 @@ export abstract class Vore implements Mortal { get name (): Noun { if (this.perspective === POV.First) { + return new PronounAsNoun(FirstPersonPronouns) + } else if (this.perspective === POV.Second) { return new PronounAsNoun(SecondPersonPronouns) } else { return this.baseName @@ -30,6 +32,8 @@ export abstract class Vore implements Mortal { get pronouns (): Pronoun { if (this.perspective === POV.First) { + return FirstPersonPronouns + } else if (this.perspective === POV.Second) { return SecondPersonPronouns } else { return this.basePronouns @@ -53,7 +57,7 @@ export abstract class Vore implements Mortal { abstract otherContainers: Array; destroy (): LogEntry { const lines = new POVSolo([ - [[POV.First], (target: Vore) => new LogLine('You die!')], + [[POV.Second], (target: Vore) => new LogLine('You die!')], [[POV.Third], (target: Vore) => new LogLine(`${target.name.capital} dies!`)] ]) @@ -268,44 +272,44 @@ export class Stomach extends NormalVoreContainer { } consumeLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You devour ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} munches you`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You devour ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} munches you`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} munches ${target.name}`)] ]) releaseLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You hork up ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} horks you up`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You hork up ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} horks you up`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} horks up ${target.name}`)] ]) struggleLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You claw your way out of ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} forces ${user.pronouns.possessive} way up your throat!`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You claw your way out of ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} forces ${user.pronouns.possessive} way up your throat!`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} escapes from the gut of ${target.name}`)] ]) tickLines = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new LogLine(`Your stomach ${Words.Churns.singular} ${target.name} for `, args.damage.renderShort())], - [[POV.Third, POV.First], (user, target, args) => new LogLine(`${user.name.capital}'s stomach ${Words.Churns.singular} you for `, args.damage.renderShort())], + [[POV.Second, POV.Third], (user, target, args) => new LogLine(`Your stomach ${Words.Churns.singular} ${target.name} for `, args.damage.renderShort())], + [[POV.Third, POV.Second], (user, target, args) => new LogLine(`${user.name.capital}'s stomach ${Words.Churns.singular} you for `, args.damage.renderShort())], [[POV.Third, POV.Third], (user, target, args) => new LogLine(`${user.name.capital} ${Words.Churns.singular} ${target.name} for `, args.damage.renderShort())] ]) digestLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`Your stomach ${Words.Digests.singular} ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital}'s stomach ${Words.Digests.singular} you`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`Your stomach ${Words.Digests.singular} ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital}'s stomach ${Words.Digests.singular} you`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${target.name.capital}'s ${Words.Struggles.present} fades as the ${target.kind.all} is ${Words.Digests.past} by the ${user.kind.all}'s ${this.name}.`)] ]) absorbLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} finishes absorbing the remains of ${target.name}`)] ]) disposeLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} finishes absorbing the remains of ${target.name}`)] ]) @@ -335,44 +339,44 @@ export class InnerStomach extends InnerContainer { } consumeLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You devour ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} munches you`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You devour ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} munches you`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} munches ${target.name.capital}`)] ]) releaseLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You hork up ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} horks you up`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You hork up ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} horks you up`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} horks up ${target.name.capital}`)] ]) struggleLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You claw your way out of ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} forces ${user.pronouns.possessive} way up your throat!`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You claw your way out of ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} forces ${user.pronouns.possessive} way up your throat!`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} escapes from the gut of ${target.name}`)] ]) tickLines = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new LogLine(`Your stomach gurgles ${target.name} for `, args.damage.renderShort())], - [[POV.Third, POV.First], (user, target, args) => new LogLine(`${user.name.capital}'s stomach churns you for `, args.damage.renderShort())], + [[POV.Second, POV.Third], (user, target, args) => new LogLine(`Your stomach gurgles ${target.name} for `, args.damage.renderShort())], + [[POV.Third, POV.Second], (user, target, args) => new LogLine(`${user.name.capital}'s stomach churns you for `, args.damage.renderShort())], [[POV.Third, POV.Third], (user, target, args) => new LogLine(`${user.name.capital} churns ${target.name} for `, args.damage.renderShort())] ]) digestLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`Your stomach overwhelms ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital}'s stomach finishes you off`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`Your stomach overwhelms ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital}'s stomach finishes you off`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${target.name.capital}'s squirms fade, overwhelmed by the stomach of ${user.name}`)] ]) absorbLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} finishes absorbing the remains of ${target.name}`)] ]) disposeLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} finishes absorbing the remains of ${target.name}`)] ]) } @@ -383,44 +387,44 @@ export class Bowels extends NormalVoreContainer { } consumeLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You force ${target.name} into your bowels`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} works you into ${user.pronouns.possessive} ass`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You force ${target.name} into your bowels`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} works you into ${user.pronouns.possessive} ass`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} anal-vores ${target.name.capital}`)] ]) releaseLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You let out ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} lets you out `)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You let out ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} lets you out `)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} lets out ${target.name.capital}`)] ]) struggleLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`You claw your way out of ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital} forces ${user.pronouns.possessive} way out your rump!`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`You claw your way out of ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital} forces ${user.pronouns.possessive} way out your rump!`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} escapes from the bowels of ${target.name}`)] ]) tickLines = new POVPairArgs([ - [[POV.First, POV.Third], (user, target, args) => new LogLine(`Your bowels gurgle ${target.name} for `, args.damage.renderShort())], - [[POV.Third, POV.First], (user, target, args) => new LogLine(`${user.name.capital}'s bowels churn you for `, args.damage.renderShort())], + [[POV.Second, POV.Third], (user, target, args) => new LogLine(`Your bowels gurgle ${target.name} for `, args.damage.renderShort())], + [[POV.Third, POV.Second], (user, target, args) => new LogLine(`${user.name.capital}'s bowels churn you for `, args.damage.renderShort())], [[POV.Third, POV.Third], (user, target, args) => new LogLine(`${target.name.capital} churns ${user.name} for `, args.damage.renderShort())] ]) digestLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`Your bowels overwhelm ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital}'s bowels finish you off`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`Your bowels overwhelm ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital}'s bowels finish you off`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${target.name.capital}'s squirms fade, overwhelmed by the bowels of ${user.name}`)] ]) absorbLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} finishes absorbing the remains of ${target.name}`)] ]) disposeLines = new POVPair([ - [[POV.First, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], - [[POV.Third, POV.First], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], + [[POV.Second, POV.Third], (user, target) => new LogLine(`Your guts completely absorb ${target.name}`)], + [[POV.Third, POV.Second], (user, target) => new LogLine(`${user.name.capital}'s guts soak you up like water in a sponge`)], [[POV.Third, POV.Third], (user, target) => new LogLine(`${user.name.capital} finishes absorbing the remains of ${target.name}`)] ]) }