chore(release): 0.3.5
[risinglegends.git] / src / shared / player.ts
1 import { Profession } from './profession'; 
2 import { Stat } from './stats';
3 import { SkillDefinition, Skill } from './skills';
4 import { EquippedItemDetails } from './equipped';
5
6 export type Player = {
7   id: string,
8   account_type: 'session' | 'auth',
9   create_date: Date,
10   profession: Profession,
11   username: string,
12   strength: number;
13   constitution: number;
14   dexterity: number;
15   intelligence: number;
16   stamina: number;
17   exp: number;
18   level: number;
19   gold: number;
20   hp: number;
21   city_id: number;
22   stat_points: number;
23   vigor: number;
24 }
25
26 export type PlayerWithSkills = Player & {
27   skills: (SkillDefinition & Skill)[]
28 }
29
30 export function maxHp(constitution: number, playerLevel: number): number {
31   return Math.ceil((constitution * 1.7) + (playerLevel * 1.3));
32 }
33
34 export function maxVigor(constitution: number, playerLevel: number): number {
35   return Math.ceil((constitution * 3.8) + (playerLevel * 1.5));
36 }
37
38 export function expToLevel(level: number): number {
39   if(level < 10) {
40     return level * 10 - 10;
41   }
42   else {
43     return level * 13;
44   }
45 }
46
47 export function totalDefence(equippedItems: EquippedItemDetails[], player: Player, accountForVigor: boolean = true): number {
48   const vigorPercent = player.vigor / maxVigor(player.constitution, player.level);
49
50   const totalDefence = equippedItems.reduce((acc, curr) => {
51     let defence = curr.boosts.defence ?? 0;
52     return acc += defence;
53   }, 0);
54
55   if(accountForVigor) {
56     return Math.ceil(totalDefence * vigorPercent);
57   }
58   else {
59     return totalDefence;
60   }
61 }
62
63
64 export type StatDisplay = {
65   id: Stat,
66   display: string;
67   abbrv: string;
68   description: string;
69 }
70
71 export const StatDef: Map<Stat, StatDisplay> = new Map<Stat, StatDisplay>();
72
73 StatDef.set(Stat.strength, {
74   id: Stat.strength,
75   display: 'Strength',
76   abbrv: 'STR',
77   description: 'Affects your melee damage'
78 });
79
80 StatDef.set(Stat.constitution, {
81   id: Stat.constitution,
82   display: 'Constitution',
83   abbrv: 'CON',
84   description: 'Affects your max HP and Vigor'
85 });
86
87 StatDef.set(Stat.dexterity, {
88   id: Stat.dexterity,
89   display: 'Dexterity',
90   abbrv: 'DEX',
91   description: 'Affects you ability to dodge attacks double-hit'
92 });
93
94 StatDef.set(Stat.intelligence, {
95   id: Stat.intelligence,
96   display: 'Intelligence',
97   abbrv: 'INT',
98   description: 'Affects your magical damage'
99 });