import { Location } from "./locations.js"; import { Race } from "./races.js"; import type { IInventory } from "../types.js"; import { DamageType } from "./items.js"; export interface IEntity { name: string; description: string; race: Race; location: Location; inventory: IInventory; experience: number; vitality: number; strength: number; endurance: number; agility: number; dexterity: number; intelligence: number; wisdom: number; stealth: number; charisma: number; lockpicking: number; attacks: Attack[]; } export interface IPlayer extends IEntity { isPlayer: true; health: number; } export interface INPC extends IEntity { id: NPC; type: NpcType; } export interface INPCData { id: NPC; health: number; dead: boolean; } export type TFullNPC = INPC & INPCData; export enum NPC { BECKY = "BECKY", TATO = "TATO", } export enum NpcType { QUEST_GIVER = "QUEST_GIVER", PASSIVE = "PASSIVE", AGGRESIVE = "AGGRESIVE", } export interface IAttack { id: Attack; damageType: DamageType; damageMultiplier: number; messages: string[]; messagesDead: string[]; messagesOverpower: string[]; } export enum Attack { PUNCH = "PUNCH", CUT = "CUT", STAB = "STAB", KICK = "KICK", STOMP = "STOMP", SIT = "SIT", RIP = "RIP", } export const attackPunch: IAttack = { id: Attack.PUNCH, damageType: DamageType.PHYSICAL, damageMultiplier: 0.5, messages: ["ATTACKER punches DEFENDER"], messagesDead: [ "ATTACKER punches DEFENDER to death", "ATTACKER beats DEFENDER to death", ], messagesOverpower: ["ATTACKER punches DEFENDER into mush"], }; export const attackCut: IAttack = { id: Attack.CUT, damageType: DamageType.PHYSICAL, damageMultiplier: 1, messages: ["ATTACKER cuts DEFENDER"], messagesDead: [ "ATTACKER cuts DEFENDER in half", "ATTACKER cuts DEFENDER's head off", "ATTACKER cuts DEFENDER, instantly killing them", ], messagesOverpower: ["ATTACKER cuts DEFENDER in half"], }; export const attackStab: IAttack = { id: Attack.STAB, damageType: DamageType.PHYSICAL, damageMultiplier: 1.5, messages: ["ATTACKER stabs DEFENDER"], messagesDead: [ "ATTACKER stabs DEFENDER to death", "ATTACKER stabs DEFENDER, instantly killing them", ], messagesOverpower: ["ATTACKER stabs DEFENDER, instantly killing them"], }; export const attackKick: IAttack = { id: Attack.KICK, damageType: DamageType.PHYSICAL, damageMultiplier: 0.75, messages: [ "ATTACKER kick DEFENDER", "ATTACKER kick DEFENDER in their face", ], messagesDead: ["ATTACKER kicks DEFENDER to death"], messagesOverpower: ["ATTACKER kicks DEFENDER into mush"], }; export const attackStomp: IAttack = { id: Attack.STOMP, damageType: DamageType.PHYSICAL, damageMultiplier: 0.75, messages: [ "ATTACKER stomps DEFENDER", "ATTACKER stomps DEFENDER in their face", ], messagesDead: ["ATTACKER stomps DEFENDER to death"], messagesOverpower: [ "ATTACKER stomps DEFENDER into mush", "DEFENDER explodes after ATTACKER stomps them into bloody mush", ], }; export const attackSit: IAttack = { id: Attack.SIT, damageType: DamageType.PHYSICAL, damageMultiplier: 0.65, messages: ["ATTACKER sits on DEFENDER"], messagesDead: ["ATTACKER sits on DEFENDER and crushes them to death"], messagesOverpower: [ "ATTACKER sits on DEFENDER and crushes them into mush and goo", "DEFENDER explodes after ATTACKER sits on them with their full weight", ], }; export const attackRip: IAttack = { id: Attack.RIP, damageType: DamageType.PHYSICAL, damageMultiplier: 0.3, messages: ["ATTACKER tries to rip DEFENDER's limbs off"], messagesDead: ["ATTACKER rips DEFENDER's head off"], messagesOverpower: ["ATTACKER effortlessly rips DEFENDER's body in half"], }; export const attacks = [ attackPunch, attackCut, attackStab, attackKick, attackStomp, attackSit, attackRip, ]; export const npcBecky: INPC = { id: NPC.BECKY, name: "Becky", description: "A 50 meter tall giantess. Might be a bad idea to attack", race: Race.GIANT, location: Location.NIGHTROOT_FOREST, inventory: { items: [], }, experience: 10000, vitality: 250, strength: 250, endurance: 50, agility: 5, dexterity: 10, intelligence: 20, wisdom: 30, stealth: 0, charisma: 5, lockpicking: 50, type: NpcType.QUEST_GIVER, attacks: [Attack.KICK, Attack.STOMP, Attack.SIT, Attack.RIP], }; export const npcTato: INPC = { id: NPC.TATO, name: "Tato", description: "A drunk troll", race: Race.TROLL, location: Location.HIGHMERE_TAVERN, inventory: { items: [], }, experience: 500, vitality: 25, strength: 25, endurance: 5, agility: 15, dexterity: 30, intelligence: 5, wisdom: 10, stealth: 5, charisma: 20, lockpicking: 0, type: NpcType.QUEST_GIVER, attacks: [Attack.PUNCH], }; export const npcs = [npcBecky, npcTato];