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