diff --git a/src/modules/game/game.ts b/src/modules/game/game.ts
index 0c5ea6b..2a10536 100644
--- a/src/modules/game/game.ts
+++ b/src/modules/game/game.ts
@@ -25,7 +25,6 @@ import {
} from "../../services/game/location.js";
import { getLevel } from "../../services/game/entity.js";
import {
- fightEntity,
getFullItemName,
getTotalStats,
type IEntity,
@@ -80,10 +79,6 @@ const registerModuleGame = (
startConditions: [`${gamePrefix} entity `],
callbackFunc: onEntity,
});
- callbackStore.messageCallbacks.push({
- startConditions: [`${gamePrefix} fight `],
- callbackFunc: onFight,
- });
};
const onHelp = (_text: string, roomId: string) => {
@@ -102,7 +97,7 @@ const onHelp = (_text: string, roomId: string) => {
!game entities - Shows entities at your location
!game entity {entity} - Shows information about an entity
(WIP) !game talk {entity} - Talk to an entity
- !game fight {entity} - Fight an entity
+ (WIP) !game fight {entity} - Fight an entity
(WIP) !game work {action} - Start work
`,
);
@@ -348,22 +343,4 @@ const onEntity = (text: string, roomId: string, sender: string) => {
onStatusName(roomId, entity.name);
};
-const onFight = (text: string, roomId: string, sender: string) => {
- const player = getPlayer(sender);
-
- const entityName = text.replace(`${gamePrefix} entity `, "").trim();
- if (!existsEntity(entityName)) {
- client.sendTextMessage(roomId, "No such entity exists");
- return;
- }
-
- const entity = getEntityByName(entityName);
- if (!entitiesShareLocation(player, entity)) {
- client.sendTextMessage(roomId, "No such entity in your vicinity");
- return;
- }
-
- fightEntity(client, roomId, player, entity);
-};
-
export { registerModuleGame };
diff --git a/src/services/game/entity.ts b/src/services/game/entity.ts
index e464fd1..b5ba05b 100644
--- a/src/services/game/entity.ts
+++ b/src/services/game/entity.ts
@@ -1,12 +1,8 @@
import { getUserNameById } from "../../helpers.js";
import { state } from "../../store/store.js";
import {
- Attack,
- attackPunch,
- attacks,
npcBecky,
npcs,
- type IAttack,
type IEntity,
type INPC,
type INPCData,
@@ -20,7 +16,6 @@ import { Race, raceHuman, races, type IRace } from "./structures/races.js";
import type { ILevel } from "./types.js";
const createPlayer = (name: string): IPlayer => ({
- isPlayer: true,
name: name,
description: "",
race: Race.HUMAN,
@@ -40,7 +35,6 @@ const createPlayer = (name: string): IPlayer => ({
stealth: 0,
charisma: 0,
lockpicking: 0,
- attacks: [Attack.PUNCH, Attack.KICK],
});
const createNpcData = (npc: INPC): INPCData => ({
@@ -49,10 +43,6 @@ const createNpcData = (npc: INPC): INPCData => ({
dead: false,
});
-const isPlayer = (entity: IEntity): boolean => {
- return "isPlayer" in entity;
-};
-
const existsPlayer = (name: string): boolean => {
return (
state.game.players.find(
@@ -72,12 +62,6 @@ const existsEntity = (name: string): boolean => {
return existsPlayer(name) || existsNpc(name);
};
-const getAttack = (id: Attack): IAttack => {
- const attack = attacks.find((attack) => attack.id === id);
-
- return attack ? attack : attackPunch;
-};
-
const getPlayer = (userId: string): IPlayer => {
return getPlayerByName(getUserNameById(userId));
};
@@ -192,11 +176,9 @@ const getSpeed = (entity: IEntity) => {
export {
createPlayer,
createNpcData,
- isPlayer,
existsPlayer,
existsNpc,
existsEntity,
- getAttack,
getPlayer,
getPlayerByName,
getEntityByName,
diff --git a/src/services/game/game.ts b/src/services/game/game.ts
index 7f70916..473a0f4 100644
--- a/src/services/game/game.ts
+++ b/src/services/game/game.ts
@@ -1,160 +0,0 @@
-import type { MatrixClient } from "matrix-js-sdk";
-import type {
- Attack,
- IEntity,
- INPC,
- IPlayer,
- TFullNPC,
-} from "./structures/entities.js";
-import { locationFarlands } from "./structures/locations.js";
-import { getAttack, getMaxHealth, getNpcData, isPlayer } from "./entity.js";
-import { sleep } from "matrix-js-sdk/lib/utils.js";
-
-const fightEntity = async (
- client: MatrixClient,
- roomId: string,
- attacker: IPlayer | TFullNPC,
- defender: IPlayer | TFullNPC,
-) => {
- let attackerAttacks: Attack[] = [];
- let attackerDamage = 0;
- let attackerDefense = 0;
- attacker.inventory.items.forEach((item) => {
- item.attacks.forEach((attack) => {
- attackerAttacks.push(attack);
- });
- item.stats.forEach((stat) => {
- attackerDamage += stat.damage;
- attackerDefense += stat.defense;
- });
- });
- attackerDamage *= 1 + attacker.strength / 10;
- attackerDefense *= 1 + attacker.strength / 10;
-
- let defenderAttacks: Attack[] = [];
- let defenderDamage = 0;
- let defenderDefense = 0;
- defender.inventory.items.forEach((item) => {
- item.attacks.forEach((attack) => {
- defenderAttacks.push(attack);
- });
- item.stats.forEach((stat) => {
- defenderDamage += stat.damage;
- defenderDefense += stat.defense;
- });
- });
- defenderDamage *= 1 + defender.strength / 10;
- defenderDefense *= 1 + defender.strength / 10;
-
- let winner: IPlayer | TFullNPC | undefined = undefined;
- let loser: IPlayer | TFullNPC | undefined = undefined;
-
- while (true) {
- await sleep(5000);
-
- const attackerWon = fightRound(
- client,
- roomId,
- attackerAttacks,
- attackerDamage,
- defender,
- defenderDefense,
- );
-
- if (attackerWon) {
- winner = attacker;
- loser = defender;
- break;
- }
-
- const defenderWon = fightRound(
- client,
- roomId,
- defenderAttacks,
- defenderDamage,
- attacker,
- attackerDefense,
- );
-
- if (defenderWon) {
- winner = defender;
- loser = attacker;
- break;
- }
- }
-
- client.sendTextMessage(
- roomId,
- `${attacker.name} has won the fight against ${defender.name}!`,
- );
-
- if (isPlayer(loser)) {
- respawnPlayer(client, roomId, loser as IPlayer);
- } else {
- const npcData = getNpcData((loser as INPC).id);
- npcData.dead = true;
- }
-};
-
-const fightRound = (
- client: MatrixClient,
- roomId: string,
- attackerAttacks: Attack[],
- attackerDamage: number,
- defender: IPlayer | TFullNPC,
- defenderDefense: number,
-): boolean => {
- const attackerAttack =
- attackerAttacks[Math.floor(Math.random() * attackerAttacks.length)];
-
- if (!attackerAttack) {
- return false;
- }
-
- const attackerAttackInfo = getAttack(attackerAttack);
-
- const attackerAttackDamage =
- attackerDamage *
- attackerAttackInfo.damageMultiplier *
- (0.5 + Math.random() * 0.5);
-
- defender.health -= attackerAttackDamage;
-
- if (defender.health <= 0) {
- const msg = getRandomAttackMessage(
- defender.health <= -getMaxHealth(defender)
- ? attackerAttackInfo.messagesOverpower
- : attackerAttackInfo.messagesDead,
- );
- client.sendTextMessage(roomId, msg);
-
- return true;
- }
-
- const msg = getRandomAttackMessage(attackerAttackInfo.messages);
- client.sendTextMessage(roomId, msg);
-
- return false;
-};
-
-const respawnPlayer = (
- client: MatrixClient,
- roomId: string,
- player: IPlayer,
-) => {
- const defaultRespawn = locationFarlands;
-
- player.location = defaultRespawn.id;
- player.health = getMaxHealth(player);
-
- client.sendTextMessage(
- roomId,
- `${player.name} has been respawned in ${defaultRespawn.name}`,
- );
-};
-
-const getRandomAttackMessage = (messages: string[]): string => {
- return messages[Math.floor(Math.random() * messages.length)] ?? "";
-};
-
-export { fightEntity, fightRound, respawnPlayer, getRandomAttackMessage };
diff --git a/src/services/game/structures/entities.ts b/src/services/game/structures/entities.ts
index afe2ef0..c3fdec7 100644
--- a/src/services/game/structures/entities.ts
+++ b/src/services/game/structures/entities.ts
@@ -1,7 +1,6 @@
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;
@@ -20,11 +19,9 @@ export interface IEntity {
stealth: number;
charisma: number;
lockpicking: number;
- attacks: Attack[];
}
export interface IPlayer extends IEntity {
- isPlayer: true;
health: number;
}
@@ -52,120 +49,6 @@ export enum NpcType {
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",
@@ -187,7 +70,6 @@ export const npcBecky: INPC = {
charisma: 5,
lockpicking: 50,
type: NpcType.QUEST_GIVER,
- attacks: [Attack.KICK, Attack.STOMP, Attack.SIT, Attack.RIP],
};
export const npcTato: INPC = {
@@ -211,7 +93,6 @@ export const npcTato: INPC = {
charisma: 20,
lockpicking: 0,
type: NpcType.QUEST_GIVER,
- attacks: [Attack.PUNCH],
};
export const npcs = [npcBecky, npcTato];
diff --git a/src/services/game/structures/items.ts b/src/services/game/structures/items.ts
index 72c0ba1..bf00f11 100644
--- a/src/services/game/structures/items.ts
+++ b/src/services/game/structures/items.ts
@@ -1,4 +1,3 @@
-import { Attack } from "./entities.js";
import { Rarity } from "./rarities.js";
export interface IItem {
@@ -9,7 +8,6 @@ export interface IItem {
type: ItemType;
rarity: Rarity;
stats: IStat[];
- attacks: Attack[];
}
export interface IStat {
@@ -58,5 +56,4 @@ export const itemShortsword: IItem = {
defense: 0,
},
],
- attacks: [Attack.CUT, Attack.STAB],
};