chore(release): 0.2.4
[risinglegends.git] / src / events / equipping-items / server.ts
1 import {SocketEvent} from "../../server/socket-event.server";
2 import { Socket } from 'socket.io';
3 import {EquipmentSlot} from '../../shared/inventory';
4 import {getEquippedItems, getInventory, getInventoryItem} from '../../server/inventory';
5 import { equip, unequip } from '../../server/equipment';
6 import { logger } from '../../server/lib/logger';
7 import {EquippedItemDetails} from '../../shared/equipped';
8
9 class EquipmentInSlotError extends Error {
10   code: number;
11   constructor() {
12     super('You already have something in that slot');
13     this.code = 23505;
14   }
15 }
16
17
18 function calcAp(inventoryItem: EquippedItemDetails[], socket: Socket) {
19   const ap: Record<any | EquipmentSlot, {currentAp: number, maxAp: number}> = {};
20   inventoryItem.forEach(item => {
21     if(item.is_equipped && item.type === 'ARMOUR') {
22       ap[item.equipment_slot] = {
23         currentAp: item.currentAp,
24         maxAp: item.maxAp
25       };
26     }
27   });
28
29   socket.emit('calc:ap', {ap});
30 }
31
32 export const equipItem: SocketEvent = {
33   eventName: 'equip',
34   handler: async (api, data: {id: string, slot: EquipmentSlot}) => {
35     const inventoryItem = await getInventoryItem(api.player.id, data.id);
36     const equippedItems = await getEquippedItems(api.player.id);
37     let desiredSlot: EquipmentSlot = inventoryItem.equipment_slot;
38
39     try {
40       // handes the situation where you're trying to equip an item 
41       // that can be equipped to any hand
42       if(inventoryItem.equipment_slot === 'ANY_HAND') {
43         if(data.slot === 'LEFT_HAND' || data.slot === 'RIGHT_HAND') {
44           // get the players current equipment in that slot!
45           if(equippedItems.some(v => {
46             return v.equipment_slot === data.slot || v.equipment_slot === 'TWO_HANDED';
47           })) {
48             throw new EquipmentInSlotError();
49           }
50           else {
51             desiredSlot = data.slot;
52           }
53         }
54       }
55
56       if(data.slot === 'TWO_HANDED') {
57         if(equippedItems.some(v => {
58           return v.equipment_slot === 'LEFT_HAND' || v.equipment_slot === 'RIGHT_HAND';
59         })) {
60           throw new EquipmentInSlotError();
61         }
62       }
63
64
65       await equip(api.player.id, inventoryItem, desiredSlot);
66       api.socket.emit('alert', {
67         type: 'success', 
68         text: `You equipped your ${inventoryItem.name}`
69       });
70     }
71     catch(e) {
72       if(e.code.toString() === '23505') {
73         api.socket.emit('alert', {
74           type: 'error',
75           text: 'You already have an item equipped in that slot'
76         });
77       }
78       else {
79         logger.log(e);
80       }
81     }
82
83     const inventory = await getInventory(api.player.id);
84     calcAp(inventory, api.socket);
85     api.socket.emit('inventory', {
86       inventory
87     });
88
89   }
90 }
91
92 export const unequipItem: SocketEvent = {
93   eventName: 'unequip',
94   handler: async (api, data: {id: string}) => {
95     await unequip(api.player.id, data.id);
96
97     const inventory = await getInventory(api.player.id);
98     calcAp(inventory, api.socket);
99     api.socket.emit('inventory', {
100       inventory
101     });
102   }
103 }