chore(release): 0.0.3
[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       gold: player.gold
80     }),
81     db('profession_levels').where({
82       player_id: player.id,
83       profession: player.profession
84     }).update({
85       exp: player.exp,
86       level: player.level
87     })
88   ]);
89 }
90
91 export async function movePlayer(cityId: number, playerId: string) {
92   return db('players').where({
93     id: playerId
94   }).update({city_id: cityId})
95 }
96
97 export async function changeProfession(player_id: string, newProfession: Profession): Promise<{level: number, exp: number}> {
98   let level = 1;
99   let exp = 0;
100   try {
101     await db('profession_levels').insert({
102       player_id,
103       profession: newProfession,
104       level,
105       exp
106     });
107   }
108   catch(e) {
109     console.log(e);
110     const res = await db.first().select('*').from('profession_levels').where({
111       player_id,
112       profession: newProfession
113     })
114
115     level = res.level;
116     exp = res.exp;
117     // profession already exists, wahtever yo!
118   }
119
120   await db('players').where({
121     id: player_id
122   }).update({ profession: newProfession });
123
124   return {
125     level,
126     exp
127   };
128 }