Changeset ace7865 for pages/api/roulette


Ignore:
Timestamp:
06/25/22 11:30:19 (3 years ago)
Author:
anastasovv <simon@…>
Branches:
main
Children:
b13f93b
Parents:
9bd09b0
Message:

Finished Roulette

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pages/api/roulette/index.js

    r9bd09b0 race7865  
    33require('dotenv').config();
    44
    5 const COUNTDOWN_FROM = 90;
    6 const WAIT_BEFORE = 30;
     5function getWinningBets(magicNumber) {
     6    let winningBets = [];
     7    winningBets.push(magicNumber);
     8   
     9    if (magicNumber != 0) {
     10        if ((magicNumber <= 9 && magicNumber % 2 == 1) || (magicNumber > 10 && magicNumber <= 18 && magicNumber % 2 == 0) ||
     11            (magicNumber > 19 && magicNumber <= 27 && magicNumber % 2 == 1) || (magicNumber > 27 && magicNumber % 2 == 0)) {
     12
     13            winningBets.push('Red');
     14        }
     15        else {
     16            winningBets.push('Black');
     17        }
     18
     19        if (magicNumber % 2 === 0)      winningBets.push('Even');
     20        else                            winningBets.push('Odd');
     21
     22        if (magicNumber <= 12)          winningBets.push('1-12');
     23        else if (magicNumber <= 24)     winningBets.push('13-24');
     24        else                            winningBets.push('25-36');
     25
     26        if (magicNumber <= 18)          winningBets.push('1-18');
     27        else                            winningBets.push('19-36');
     28
     29        if (magicNumber % 3 === 0)      winningBets.push('Remainder3');
     30        else if (magicNumber % 3 === 2) winningBets.push('Remainder2');
     31        else                            winningBets.push('Remainder1');
     32    }
     33
     34    return winningBets;
     35}
     36
     37function updateGameWithWinners() {
     38    const winningBets = getWinningBets(magicNumber);
     39
     40    for (let i = 0; i < game.players.length; i++) {
     41        const player = game.players[i];
     42
     43        let playerWon = false;
     44        player.whichBets.forEach(bet => {
     45            if (winningBets.indexOf(bet) !== -1) {
     46                playerWon = true;
     47            }
     48        })
     49
     50        if (playerWon) {
     51            game.players[i].outcome = 'won';
     52        }
     53        else {
     54            game.players[i].outcome = 'lost';
     55        }
     56    }
     57}
     58
     59function resetPlayers() {
     60    game.players.forEach(player => {
     61        player.whichBets = [];
     62        player.betAmount = 0;
     63        player.outcome = 'none';
     64        player.status = '_1_no_placed_bet';
     65    })
     66}
     67
     68function calculateWinnings(player) {
     69    if (player.outcome === 'lost') return 0;
     70
     71    let bets = player.whichBets;
     72    let bet = player.betAmount;
     73
     74    if (bets[0] === 'Even' || bets[0] === 'Odd') return 2 * bet;
     75    else if (bets[0] === 'Red' || bets[0] === 'Black') return 2 * bet;
     76    else if (bets[0].contains('Remainder')) return 3 * bet;
     77    else if (bets[0] === '1-12' || bets[0] === '13-24' || bets[0] === '25-36') return 3 * bet;
     78    else if (bets[0] === '1-18' || bets[0] === '19-36') return 2 * bet;
     79    else if (bets.length === 4) return 9 * bet;
     80    else if (bets.length === 2) return 18 * bet;
     81    else if (bets.length === 1) return 36 * bet;
     82
     83    return 0;
     84}
     85
     86const COUNTDOWN_FROM = 30;
     87const WAIT_BEFORE = 20;
     88
     89let magicNumber = -1;
    790
    891(function() {
    992    setInterval(() => {
    10 
    1193        game.timeToStart--;
    1294
    13         // 30 seconds is the time to spin and see the results.
     95        // WAIT_BEFORE seconds is the time allocated for spinning the wheel and seeing the results.
    1496        if (game.timeToStart == 0) {
    1597            game.timeToStart = COUNTDOWN_FROM + WAIT_BEFORE;
    1698        }
     99        else if (game.timeToStart == 10) {
     100            magicNumber = Math.floor(Math.random() * 37);
     101            game.status = '_2_spinning';
     102        }
     103        else if (game.timeToStart == COUNTDOWN_FROM) {
     104            game.status = '_1_ongoing_timer';
     105        }
     106        else if (game.timeToStart == COUNTDOWN_FROM + 5) {
     107            resetPlayers();
     108        }
    17109
    18110    }, 1000);
     
    20112
    21113let game = {
    22     status: '_1_ongoing_timer',     // statuses: _1_ongoing_timer, _2_spinning, _3_results
     114    status: '_1_ongoing_timer',     // statuses: _1_ongoing_timer, _2_spinning,
    23115    timeToStart: COUNTDOWN_FROM,    // in seconds
    24     players: [] ,                   // example player -> { session_id, name, whichBet, betAmount, status }  // statuses: _1_no_placed_bet, _2_placed_bet
     116    players: [] ,                   // example player -> { session_id, name, whichBet, betAmount, status, outcome }  // statuses: _1_no_placed_bet, _2_placed_bet
    25117}
    26118
     
    33125            betAmount: 0,
    34126            status: '_1_no_placed_bet',
     127            outcome: 'none',
    35128        })
    36129    }
     
    45138     */
    46139    if (req.method === 'GET') {
     140       
     141        /**
     142         * /---------------------- GET ----------------------/
     143         * Return to the user info for starting a new game.
     144         * @action reset_game
     145         * @param session_id
     146         */
     147        if (req.query.action === 'reset_game' && req.query?.session_id) {
     148            const session_id = req.query.session_id;
     149            const playerIdx = game.players.map(e=>e.session_id).indexOf(session_id);
     150
     151            if (playerIdx !== -1) {
     152                res.json({
     153                    success: true,
     154                    game: game,
     155                })
     156            }
     157            else {
     158                res.json({
     159                    success: false,
     160                })
     161            }
     162        }
     163
     164        /**
     165         * /---------------------- GET ----------------------/
     166         * Timer done on client side.
     167         * @action timer_done
     168         * @param session_id
     169         */
     170         if (req.query.action === 'timer_done' && req.query?.session_id) {
     171            const session_id = req.query.session_id;
     172            const playerIdx = game.players.map(e=>e.session_id).indexOf(session_id);
     173
     174            if (playerIdx !== -1 && game.status.substr(1, 1) === '2') {
     175                updateGameWithWinners();
     176
     177                const playerWinnings = calculateWinnings(game.players[playerIdx]);
     178
     179                axios.get(`${process.env.HOME_URL}/api/postgre/?action=add_credits&session_id=${session_id}&credits=${playerWinnings}&game=roulette&outcome=${game.players[playerIdx].outcome}`).then(postgreRes => {
     180                    if (postgreRes.data?.success) {
     181                        res.json({
     182                            success: true,
     183                            game: game,
     184                            magicNumber: magicNumber,
     185                            winningBets: getWinningBets(magicNumber),
     186                            credits: postgreRes.data?.credits,
     187                        })
     188                    }
     189                    else {
     190                        res.json({
     191                            success: false,
     192                        })
     193                    }
     194                });
     195            }
     196            else {
     197                res.json({
     198                    success: false,
     199                })
     200            }
     201        }
     202
    47203        /**
    48204         * /---------------------- GET ----------------------/
     
    57213            const playerIdx = game.players.map(e=>e.session_id).indexOf(session_id);
    58214
    59             if (playerIdx !== -1 && game.players[playerIdx].status.substr(1, 1) === '1') {
     215            if (playerIdx !== -1 && game.status.substr(1, 1) === '1' && game.players[playerIdx].status.substr(1, 1) === '1') {
    60216                game.players[playerIdx].betAmount = parseInt(req.query.betAmount);
    61217                game.players[playerIdx].whichBets = req.query.whichBets.split(',');
Note: See TracChangeset for help on using the changeset viewer.