@spinningpanda/srv-warloot 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,60 @@
1
+ import BigNumber from "bignumber.js";
2
+ import { Game, GameContext, GamePlayResult } from "@spinningpanda/srv-game-lib/Game";
3
+ import { Rng } from "@spinningpanda/srv-rng/Rng";
4
+ import { GameProtocol as prtcl } from "@spinningpanda/srv-game-lib/GameProtocol";
5
+ export declare class WarLoot96Game<SC extends WarLootContext> implements Game<GameContext> {
6
+ protected totalBetMultipliers: number[];
7
+ protected defaultBetMultiplier: number;
8
+ protected rewardMultiplier: number[];
9
+ protected counterAttackProbabilities: number[];
10
+ protected counterAttackImpacts: number[];
11
+ version: string;
12
+ getConfig(betConfig: prtcl.BetConfigResponse): prtcl.Config;
13
+ validateRequest(request: prtcl.PlayRequest): boolean;
14
+ play(request: prtcl.PlayRequest, context: WarLootContext, rng: Rng): Promise<GamePlayResult<WarLootContext>>;
15
+ protected getLineAndTotalBet(spinRequest: WarLootRequest): BetValues;
16
+ protected static isValidNumber(input: any): boolean;
17
+ isFreeBetApplicable(request: prtcl.PlayRequest): boolean;
18
+ isBetDeductible(context: SC): boolean;
19
+ restore(context: SC): prtcl.State;
20
+ getJackpotContributionAmount(request: prtcl.PlayRequest, context: GameContext): BigNumber;
21
+ onExposureLimit(result: GamePlayResult<WarLootContext>, winLimit: number): GamePlayResult<WarLootContext>;
22
+ createContext(context: WarLootContext): WarLootContext;
23
+ defaultContext(): WarLootContext;
24
+ }
25
+ export declare class WarLootContext implements GameContext {
26
+ availableActions: string[];
27
+ private _lastState;
28
+ private _lastBet;
29
+ betInfo: BetValues;
30
+ setBets(bets: BetValues): void;
31
+ cleanupContext(): void;
32
+ get lastState(): prtcl.State;
33
+ set lastState(state: prtcl.State);
34
+ get lastBet(): BetValues;
35
+ set lastBet(bet: BetValues);
36
+ }
37
+ export interface BetValues {
38
+ bet: BigNumber;
39
+ totalBet: BigNumber;
40
+ multiplier: number;
41
+ coin: number;
42
+ }
43
+ export interface WarLootRound {
44
+ round: number;
45
+ isAttacked: boolean;
46
+ multiplierAwarded: number;
47
+ attackImpact: number;
48
+ finalMultiplier: number;
49
+ }
50
+ export interface WarLootState extends prtcl.State {
51
+ win: number;
52
+ totalRounds: number;
53
+ currentRound: number;
54
+ totalMultiplier: number;
55
+ attackCount: number;
56
+ rounds: WarLootRound[];
57
+ }
58
+ export interface WarLootRequest extends prtcl.PlayRequest {
59
+ stake: number;
60
+ }
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WarLootContext = exports.WarLoot96Game = void 0;
7
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
+ const version_1 = __importDefault(require("./version"));
9
+ class WarLoot96Game {
10
+ constructor() {
11
+ this.totalBetMultipliers = [1];
12
+ this.defaultBetMultiplier = 1;
13
+ this.rewardMultiplier = [1.01, 1.1, 1.5, 2, 2.5];
14
+ this.counterAttackProbabilities = [0.12, 0.40, 0.70];
15
+ this.counterAttackImpacts = [0.4, 0.7, 1];
16
+ this.version = version_1.default;
17
+ }
18
+ getConfig(betConfig) {
19
+ return {
20
+ bets: betConfig,
21
+ totalBetMultipliers: this.totalBetMultipliers,
22
+ defaultBetMultiplier: this.defaultBetMultiplier,
23
+ rewardMultiplier: this.rewardMultiplier,
24
+ counterAttack: this.counterAttackImpacts,
25
+ };
26
+ }
27
+ validateRequest(request) {
28
+ const cfreq = request;
29
+ const stake = new bignumber_js_1.default(cfreq.stake);
30
+ if (stake.isNaN() || stake.isNegative()) {
31
+ return false;
32
+ }
33
+ return true;
34
+ }
35
+ async play(request, context, rng) {
36
+ context.setBets(this.getLineAndTotalBet(request));
37
+ const currentRound = 1;
38
+ let attackCount = 0;
39
+ const attackProbability = this.counterAttackProbabilities[attackCount];
40
+ const isAttacked = rng.random() < attackProbability;
41
+ if (isAttacked) {
42
+ attackCount++;
43
+ }
44
+ const multiplierAwarded = this.rewardMultiplier[currentRound - 1];
45
+ const attackImpact = isAttacked ? this.counterAttackImpacts[attackCount - 1] : 0;
46
+ const finalMultiplier = multiplierAwarded * (isAttacked ? (1 - attackImpact) : 1);
47
+ const newState = {
48
+ totalRounds: 5,
49
+ currentRound: currentRound,
50
+ totalMultiplier: finalMultiplier,
51
+ attackCount: attackCount,
52
+ rounds: [
53
+ {
54
+ round: currentRound,
55
+ isAttacked: isAttacked,
56
+ multiplierAwarded: multiplierAwarded,
57
+ attackImpact: attackImpact,
58
+ finalMultiplier: finalMultiplier,
59
+ }
60
+ ],
61
+ win: new bignumber_js_1.default(finalMultiplier).multipliedBy(context.betInfo.totalBet).toNumber(),
62
+ roundFinished: false,
63
+ };
64
+ return {
65
+ state: newState,
66
+ context: context,
67
+ winAmount: new bignumber_js_1.default(0),
68
+ };
69
+ }
70
+ getLineAndTotalBet(spinRequest) {
71
+ const bet = new bignumber_js_1.default(spinRequest.stake);
72
+ const coin = new bignumber_js_1.default(1);
73
+ const multiplier = 1;
74
+ return {
75
+ bet: bet,
76
+ multiplier,
77
+ totalBet: bet.multipliedBy(multiplier).multipliedBy(coin),
78
+ coin: 1
79
+ };
80
+ }
81
+ static isValidNumber(input) {
82
+ const s = new bignumber_js_1.default(input);
83
+ return !(s.isNaN() || s.isNegative());
84
+ }
85
+ isFreeBetApplicable(request) {
86
+ return false;
87
+ }
88
+ isBetDeductible(context) {
89
+ return context.lastState.roundFinished;
90
+ }
91
+ restore(context) {
92
+ return context.lastState;
93
+ }
94
+ getJackpotContributionAmount(request, context) {
95
+ return new bignumber_js_1.default(0);
96
+ }
97
+ onExposureLimit(result, winLimit) {
98
+ return result;
99
+ }
100
+ createContext(context) {
101
+ let ctx = new WarLootContext();
102
+ ctx = { ...ctx, ...context };
103
+ return ctx;
104
+ }
105
+ defaultContext() {
106
+ return new WarLootContext();
107
+ }
108
+ }
109
+ exports.WarLoot96Game = WarLoot96Game;
110
+ class WarLootContext {
111
+ constructor() {
112
+ this.availableActions = [];
113
+ this._lastState = null;
114
+ this._lastBet = null;
115
+ this.betInfo = { bet: new bignumber_js_1.default(0), totalBet: new bignumber_js_1.default(0), multiplier: 0, coin: 1 };
116
+ }
117
+ setBets(bets) {
118
+ if (this.lastState.roundFinished) {
119
+ this.betInfo.bet = bets.bet;
120
+ this.betInfo.totalBet = bets.totalBet;
121
+ this.betInfo.multiplier = bets.multiplier;
122
+ this.betInfo.coin = bets.coin;
123
+ }
124
+ else {
125
+ this.betInfo.bet = this.lastBet ? this.lastBet.bet : bets.bet;
126
+ this.betInfo.totalBet = this.lastBet ? this.lastBet.totalBet : bets.totalBet;
127
+ this.betInfo.multiplier = this.lastBet ? this.lastBet.multiplier : bets.multiplier;
128
+ this.betInfo.coin = this.lastBet ? this.lastBet.coin : bets.coin;
129
+ }
130
+ }
131
+ cleanupContext() {
132
+ this._lastState = null;
133
+ this._lastBet = null;
134
+ }
135
+ get lastState() {
136
+ return this._lastState;
137
+ }
138
+ set lastState(state) {
139
+ this._lastState = state;
140
+ }
141
+ get lastBet() {
142
+ return this._lastBet;
143
+ }
144
+ set lastBet(bet) {
145
+ this._lastBet = bet;
146
+ }
147
+ }
148
+ exports.WarLootContext = WarLootContext;
149
+ //# sourceMappingURL=WarLoot96Game.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarLoot96Game.js","sourceRoot":"","sources":["../src/WarLoot96Game.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@spinningpanda/srv-warloot",
3
+ "version": "1.0.0",
4
+ "description": "Backend - War Loot",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "cross-env NODE_ENV=test mocha --timeout 10000 -r dotenv/config test/**/*.spec.ts",
8
+ "lint": "eslint src/*",
9
+ "prebuild": "node -e \"require('fs').rmSync('out', {recursive: true, force: true})\"",
10
+ "build": "tsc --build",
11
+ "postbuild": "more < package.json > out/package.json",
12
+ "build-dev": "npm run build && cp package.json out/",
13
+ "publish:out": "npm publish out/",
14
+ "clean": "rm -Rf out/*",
15
+ "checksums": "node node_modules/@spinningpanda/srv-game-lib/checksums.js",
16
+ "release": "npm run build && npm run checksums && cp package.json ./out/package.json && npm publish out/",
17
+ "preversion": "node node_modules/@spinningpanda/srv-game-lib/version.js --version $npm_package_version --file src/version.ts && git commit src/version.ts -m 'Version update'"
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "author": "Spinning Panda",
23
+ "license": "UNLICENSED",
24
+ "dependencies": {
25
+ "@spinningpanda/srv-game-lib": "1.0.0",
26
+ "@spinningpanda/srv-rng": "1.0.1",
27
+ "bignumber.js": "8.1.1",
28
+ "dotenv": "8.2.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/bignumber.js": "^5.0.0",
32
+ "@types/chai": "^4.1.7",
33
+ "@types/chai-spies": "^1.0.0",
34
+ "@types/lodash": "^4.14.123",
35
+ "@types/mocha": "^5.2.6",
36
+ "@types/node": "^13.9.2",
37
+ "@typescript-eslint/eslint-plugin": "^2.23.0",
38
+ "@typescript-eslint/parser": "^2.23.0",
39
+ "chai": "^4.2.0",
40
+ "chai-spies": "^1.0.0",
41
+ "cross-env": "^5.2.0",
42
+ "dotenv": "^8.2.0",
43
+ "eslint": "^6.8.0",
44
+ "mocha": "^6.1.4",
45
+ "source-map-support": "^0.5.12",
46
+ "ts-node": "^8.0.2"
47
+ },
48
+ "nyc": {
49
+ "extension": [
50
+ ".ts",
51
+ ".tsx"
52
+ ],
53
+ "reporter": [
54
+ "text",
55
+ "html"
56
+ ],
57
+ "include": [
58
+ "src/**"
59
+ ],
60
+ "exclude": [
61
+ "**/*.d.ts"
62
+ ],
63
+ "all": true
64
+ }
65
+ }
package/version.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ declare const version = "1.0.0";
2
+ export default version;
package/version.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const version = "1.0.0";
4
+ exports.default = version;
5
+ //# sourceMappingURL=version.js.map
package/version.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;AAAA,MAAM,OAAO,GAAG,OAAO,CAAC;AACxB,kBAAe,OAAO,CAAC"}