chore(release): 0.3.0
[risinglegends.git] / src / server / inventory.ts
1 import {InventoryItem, ShopEquipment} from "../shared/inventory";
2 import { v4 as uuid } from 'uuid';
3 import { db} from './lib/db';
4 import {EquippedItemDetails} from "../shared/equipped";
5 import { unequipItems } from "./equipment";
6
7
8 export async function addInventoryItem(playerId: string, item: ShopEquipment) {
9   const inventoryItem: InventoryItem = {
10     player_id: playerId,
11     item_id: uuid(),
12     name: item.name,
13     type: item.type,
14     equipment_slot: item.equipment_slot,
15     cost: item.cost,
16     count: item.count,
17     profession:  item.profession,
18     icon: item.icon,
19     requirements: {
20       level: item.requirements.level,
21       strength: item.requirements.strength,
22       constitution: item.requirements.constitution,
23       dexterity: item.requirements.dexterity,
24       intelligence: item.requirements.intelligence
25     },
26     boosts: {
27       strength: item.boosts.strength,
28       constitution: item.boosts.constitution,
29       dexterity: item.boosts.dexterity,
30       intelligence: item.boosts.intelligence,
31       damage: item.boosts.damage,
32       damage_mitigation: item.boosts.damage_mitigation,
33       defence: item.boosts.defence
34     },
35     maxAp: item.maxAp,
36     currentAp: item.currentAp,
37     affectedSkills: item.affectedSkills
38   };
39   return db('inventory').insert(inventoryItem);
40 }
41
42 export async function getInventory(player_id: string): Promise<EquippedItemDetails[]> {
43   const res = await db.raw(`
44                 select i.*, 
45                 coalesce(e.equipment_slot, i.equipment_slot) as equipment_slot,
46                 e.item_id is not null as is_equipped 
47                 from inventory i 
48                 left outer join equipped e on e.item_id = i.item_id 
49                 where i.player_id = ?
50                 `, [
51                   player_id
52                 ]);
53
54   return res.rows.map(row => {
55     row.affectedSkills = JSON.parse(row.affectedSkills);
56     return row;
57   });
58 }
59
60 export async function getInventoryItem(player_id: string, item_id: string): Promise<InventoryItem> {
61   return db.select('*').from<InventoryItem>('inventory').where({
62     player_id,
63     item_id
64   }).first();
65 }
66
67 export async function getEquippedItems(player_id: string): Promise<EquippedItemDetails[]> {
68   const res = await db.raw(`
69                            select i.*, e.equipment_slot, true as is_equipped
70                            from inventory i
71                            join equipped e on e.item_id = i.item_id 
72                            where i.player_id = ?
73                            `, [player_id])
74
75     return res.rows.map(row => {
76       row.affectedSkills = JSON.parse(row.affectedSkills);
77       return row;
78     });
79 }
80
81 export async function updateAp(player_id: string, apDamage: number, itemIds: string[]) {
82   const res: {item_id: string, currentAp: number, name: string}[] = await db('inventory').where({
83     player_id
84   }).whereIn('item_id', itemIds).update({
85       'currentAp': db.raw(`GREATEST("currentAp" - ${apDamage}, 0)`)
86     }).returning(['item_id', 'name', 'currentAp']);
87   
88   const itemsToUnequip = res.filter(i => i.currentAp <= 0);
89
90   if(itemsToUnequip.length) {
91     await unequipItems(player_id, itemsToUnequip.map(i => i.item_id));
92   }
93
94   return itemsToUnequip;
95 }
96
97 export async function repair(player_id: string, item_id: string) {
98   return db('inventory').where({
99     player_id,
100     item_id
101   }).update({
102       'currentAp': db.raw('"maxAp"')
103     });
104 }
105
106 export async function deleteInventoryItem(player_id: string, item_id: string) {
107   await db('equipped').where({
108     player_id,
109     item_id
110   }).delete();
111
112   await db('inventory').where({
113     player_id,
114     item_id
115   }).delete();
116 }