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