2019-03-15 12:38:35 +03:00
|
|
|
import {JSONEncoder} from "../node_modules/assemblyscript-json/assembly/encoder";
|
|
|
|
import {ErrorResponse, GetBalanceResponse, JoinResponse, Response, RollResponse} from "./response";
|
2019-03-14 17:35:54 +03:00
|
|
|
|
2019-03-15 17:02:29 +03:00
|
|
|
const PLAYERS_MAX_COUNT: i32 = 1024;
|
2019-03-15 18:30:31 +03:00
|
|
|
const SEED: u64 = 123456;
|
2019-03-14 17:35:54 +03:00
|
|
|
// the account balance of new players
|
|
|
|
const INIT_ACCOUNT_BALANCE: u64 = 100;
|
|
|
|
// if win, player receives bet_amount * PAYOUT_RATE money
|
|
|
|
const PAYOUT_RATE: u64 = 5;
|
2019-03-15 12:38:35 +03:00
|
|
|
const DICE_LINE_COUNT: u8 = 6;
|
2019-03-14 17:35:54 +03:00
|
|
|
|
2019-03-15 12:38:35 +03:00
|
|
|
export class GameManager {
|
2019-03-14 17:35:54 +03:00
|
|
|
|
2019-03-15 12:38:35 +03:00
|
|
|
registeredPlayers: u64 = 0;
|
2019-03-15 19:01:55 +03:00
|
|
|
playerIds: u64[] = new Array(PLAYERS_MAX_COUNT);
|
2019-03-15 12:38:35 +03:00
|
|
|
playerBalance: Map<u64, u64> = new Map<u64, u64>();
|
|
|
|
encoder: JSONEncoder = new JSONEncoder();
|
|
|
|
|
2019-03-18 13:27:10 +03:00
|
|
|
constructor() {
|
|
|
|
NativeMath.seedRandom(SEED);
|
|
|
|
}
|
|
|
|
|
2019-03-15 18:30:31 +03:00
|
|
|
join(): string {
|
2019-03-15 12:38:35 +03:00
|
|
|
// delete the oldest player, if maximum players reach
|
|
|
|
if (this.playerIds.length >= PLAYERS_MAX_COUNT) {
|
|
|
|
let lastPlayer = this.playerIds.pop();
|
|
|
|
this.playerBalance.delete(lastPlayer);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.playerIds.push(this.registeredPlayers);
|
2019-03-15 19:01:55 +03:00
|
|
|
|
2019-03-15 12:38:35 +03:00
|
|
|
this.playerBalance.set(this.registeredPlayers, INIT_ACCOUNT_BALANCE);
|
|
|
|
|
|
|
|
let response = new JoinResponse(this.registeredPlayers);
|
|
|
|
|
|
|
|
this.registeredPlayers += 1;
|
|
|
|
|
2019-03-15 18:30:31 +03:00
|
|
|
return response.serialize();
|
2019-03-15 12:38:35 +03:00
|
|
|
}
|
|
|
|
|
2019-03-15 18:30:31 +03:00
|
|
|
roll(playerId: u64, betPlacement: u8, betSize: u64): string {
|
2019-03-15 12:38:35 +03:00
|
|
|
|
|
|
|
if (betPlacement > DICE_LINE_COUNT) {
|
2019-03-15 18:30:31 +03:00
|
|
|
let error = new ErrorResponse("Incorrect placement, please choose number from 1 to 6");
|
|
|
|
return error.serialize();
|
2019-03-15 12:38:35 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!this.playerBalance.has(playerId)) {
|
2019-03-15 18:30:31 +03:00
|
|
|
let error = new ErrorResponse("There is no player with such id: " + playerId.toString());
|
|
|
|
return error.serialize();
|
2019-03-15 12:38:35 +03:00
|
|
|
}
|
|
|
|
|
2019-03-15 18:30:31 +03:00
|
|
|
let balance: u64 = this.playerBalance.get(playerId);
|
2019-03-15 12:38:35 +03:00
|
|
|
|
|
|
|
if (betSize > balance) {
|
2019-03-15 18:30:31 +03:00
|
|
|
let error = new ErrorResponse(`Player hasn't enough money: player's current balance is ${balance.toString()} while the bet is ${betSize.toString()}`);
|
|
|
|
return error.serialize();
|
2019-03-15 12:38:35 +03:00
|
|
|
}
|
|
|
|
|
2019-03-18 13:27:10 +03:00
|
|
|
let outcome = ((Math.random() * 1000000) % DICE_LINE_COUNT + 1) as u8;
|
2019-03-15 12:38:35 +03:00
|
|
|
|
2019-03-15 18:30:31 +03:00
|
|
|
let newBalance: u64 = 0;
|
|
|
|
|
|
|
|
if (betPlacement == outcome) {
|
|
|
|
newBalance = balance + (betSize * PAYOUT_RATE);
|
2019-03-15 12:38:35 +03:00
|
|
|
} else {
|
2019-03-15 18:30:31 +03:00
|
|
|
newBalance = balance - betSize;
|
2019-03-15 12:38:35 +03:00
|
|
|
}
|
|
|
|
|
2019-03-15 18:30:31 +03:00
|
|
|
this.playerBalance.delete(playerId);
|
|
|
|
this.playerBalance.set(playerId, newBalance);
|
2019-03-15 12:38:35 +03:00
|
|
|
|
2019-03-15 18:30:31 +03:00
|
|
|
let response = new RollResponse(outcome, newBalance);
|
|
|
|
return response.serialize();
|
2019-03-15 12:38:35 +03:00
|
|
|
}
|
|
|
|
|
2019-03-15 18:30:31 +03:00
|
|
|
getBalance(playerId: u64): string {
|
2019-03-15 15:41:14 +03:00
|
|
|
if (!this.playerBalance.has(playerId)) {
|
2019-03-15 18:30:31 +03:00
|
|
|
let error = new ErrorResponse("There is no player with id: " + playerId.toString());
|
|
|
|
return error.serialize();
|
2019-03-15 15:41:14 +03:00
|
|
|
}
|
2019-03-15 18:30:31 +03:00
|
|
|
let response = new GetBalanceResponse(this.playerBalance.get(playerId));
|
|
|
|
return response.serialize();
|
2019-03-15 12:38:35 +03:00
|
|
|
}
|
2019-03-14 17:35:54 +03:00
|
|
|
}
|