chore(release): 0.2.17
[risinglegends.git] / src / server / player.ts
1 import { db } from './lib/db';
2 import {Player, maxHp} from "../shared/player";
3 import { random } from 'lodash';
4 import { Skills } from '../shared/skills';
5 import {Profession} from 'shared/profession';
6 import {logger} from './lib/logger';
7
8 export async function loadPlayer(authToken: string): Promise<Player> {
9   const res = await db.first()
10             .select('players.*', 'profession_levels.level', 'profession_levels.exp')
11             .from<Player>('players')
12             .join('profession_levels', function() {
13               this.on(function() {
14                 this.on('profession_levels.player_id', '=', 'players.id')
15                 this.andOn('profession_levels.profession', '=', 'players.profession')
16               })
17             })
18             .where({
19               'players.id': authToken
20             });
21
22     return res;
23 }
24
25 export async function createPlayer(): Promise<Player> {
26   const raw: Partial<Player> = {
27     username: `Player${Date.now().toString().substr(-7)}`,
28     strength: random(3, 5),
29     constitution: random(3, 5),
30     dexterity: random(3, 5),
31     intelligence: random(3, 5),
32   };
33
34   raw.hp = maxHp(raw.constitution, 1);
35
36   const res  = await db('players').insert(raw).returning<Player[]>('*');
37   const player = res.pop();
38
39   logger.log(`Created player [${player.id}]`);
40
41   // await skills!
42   const pairs = [];
43   const values = [];
44   const sql = `insert into player_skills (id, player_id) values `;
45
46   logger.log(`Inserted base skills for [${player.id}]`)
47
48   Skills.forEach(skill => {
49     pairs.push('(?,?)');
50     values.push(skill.id, player.id);
51   });
52
53   await db.raw(sql + pairs.join(','), values);
54
55   // create the profession level
56   await db('profession_levels').insert({
57     player_id: player.id,
58     profession: 'Wanderer',
59     level: 1,
60     exp: 0
61   });
62
63   logger.log(`Inserted base profession level [${player.id}]`);
64
65   return player;
66 }
67
68
69 export async function updatePlayer(player: Player) {
70   return Promise.all([
71     db('players').where({
72       id: player.id
73     }).update({
74       hp: player.hp,
75       strength: player.strength,
76       constitution: player.constitution,
77       dexterity: player.dexterity,
78       intelligence: player.intelligence,
79       stat_points: player.stat_points,
80       gold: player.gold
81     }),
82     db('profession_levels').where({
83       player_id: player.id,
84       profession: player.profession
85     }).update({
86       exp: player.exp,
87       level: player.level
88     })
89   ]);
90 }
91
92 export async function movePlayer(cityId: number, playerId: string) {
93   return db('players').where({
94     id: playerId
95   }).update({city_id: cityId})
96 }
97
98 export async function changeProfession(player_id: string, newProfession: Profession): Promise<{level: number, exp: number}> {
99   let level = 1;
100   let exp = 0;
101   try {
102     await db('profession_levels').insert({
103       player_id,
104       profession: newProfession,
105       level,
106       exp
107     });
108   }
109   catch(e) {
110     console.log(e);
111     const res = await db.first().select('*').from('profession_levels').where({
112       player_id,
113       profession: newProfession
114     })
115
116     level = res.level;
117     exp = res.exp;
118     // profession already exists, wahtever yo!
119   }
120
121   await db('players').where({
122     id: player_id
123   }).update({ profession: newProfession });
124
125   return {
126     level,
127     exp
128   };
129 }