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