about summary refs log blame commit diff stats
path: root/js/puzzle-dungeon/commandHandler.js
blob: 21193e5d9584cda8259a89af8a8666bb9e089a3e (plain) (tree)
1
2
3
4
5
6
7
8
9
                                                                                                            
 

                               
 


                                                     
                                                                                                 




















                                                           

                                               










                                                           
                                                           















                                                                                               
                                                                                    
                                
                                                     
                                                                        
                                 
                                  
                                        
                                                                                                                                                                               
                                                                      
                                 
                                  
                



                           
                                                                                                            







                                 
















                                                                                                 























                                                                                                        
                                                                                                         
                                    
                                   
                                                                              




                                         
                                                                         
         
 


                             
                                                                 
 
 









                                 
 


                                                            
import { player, grid, drawGrid, updatePlayerPosition, updatePlayerStatus, alertGameOver } from './game.js';

let commandQueue = [];
let processingCommands = false;

export function handleCommand(command) {
    const [action, itemOrSteps] = command.split(' ');

    if (action === 'get' || action === 'use' || action === 'scan' || isMovementCommand(action)) {
        commandQueue.push({ action, itemOrSteps });
    }

    if (!processingCommands) {
        processCommandQueue();
    }
}

function processCommandQueue() {
    if (commandQueue.length === 0) {
        processingCommands = false;
        return;
    }

    processingCommands = true;
    const { action, itemOrSteps } = commandQueue.shift();

    if (action === 'get') {
        handleGetCommand(itemOrSteps, processCommandQueue);
    } else if (action === 'use') {
        handleUseCommand(itemOrSteps, processCommandQueue);
    } else if (action === 'scan') {
        handleScanCommand(processCommandQueue);
    } else if (isMovementCommand(action)) {
        const steps = parseInt(itemOrSteps, 10) || 1;
        handleMovement(action, steps, processCommandQueue);
    }
}

function handleGetCommand(item, callback) {
    const { x, y } = player.position;
    const cell = grid[x][y];
    if (cell && cell.type === item) {
        player.inventory.push(cell.type);
        grid[x][y] = null; // remove the item from the grid
        console.log(`Picked up ${item}`);
        flashPlayer(callback);
    } else {
        player.health -= 1;
        console.log(`Tried to get ${item} but it's not there, health is now ${player.health}`);
        if (player.health <= 0) {
            alertGameOver();
            return;
        }
        flashPlayer(callback);
    }
}

function handleUseCommand(item, callback) {
    const itemIndex = player.inventory.indexOf(item);
    if (itemIndex > -1) {
        player.inventory.splice(itemIndex, 1); // remove the item from the inventory
        if (item === 'potion') {
            player.health += 1; // MOAR HEALTH (by 1)
            console.log(`Used ${item}, health is now ${player.health}`);
            updatePlayerStatus();
            flashPlayer(callback);
        } else if (item === 'battery') {
            player.power = Math.min(player.power + 2, (10 + player.level)); // Increase power by 2, up to a max of 10 + the current level. This may be tooooo gigantic a number
            console.log(`Used ${item}, power is now ${player.power}`);
            updatePlayerStatus();
            flashPlayer(callback);
        } else {
            callback();
        }
    } else {
        player.health -= 1;
        console.log(`Tried to use ${item} but it's not in inventory. Ouch! Health is now ${player.health}`);
        if (player.health <= 0) {
            alertGameOver();
            return;
        }
        flashPlayer(callback);
    }
}

function handleScanCommand(callback) {
    if (player.power > 0) {
        player.didScan = true;
        player.power -= 3;
        drawGrid(grid); // redraw the grid to show the revealed traps
        updatePlayerStatus();
    } else {
        player.health -= 1;
        console.log(`Tried to scan but power is depleted, ouch! Health is now ${player.health}`);
        if (player.health <= 0) {
            alertGameOver();
            return;
        }
    }
    callback(); // continue processing commands
}

function handleMovement(direction, steps, callback) {
    let stepCount = 0;

    const moveInterval = setInterval(() => {
        if (stepCount >= steps) {
            clearInterval(moveInterval);
            callback();
            return;
        }

        const { x, y } = player.position;
        if (direction === 'up' && y > 0) {
            updatePlayerPosition(x, y - 1);
        } else if (direction === 'down' && y < grid[0].length - 1) {
            updatePlayerPosition(x, y + 1);
        } else if (direction === 'left' && x > 0) {
            updatePlayerPosition(x - 1, y);
        } else if (direction === 'right' && x < grid.length - 1) {
            updatePlayerPosition(x + 1, y);
        }
        console.log(`Moved ${direction}, new position is (${player.position.x}, ${player.position.y})`);

        player.steps += 1;
        if (player.steps % 8 === 0) {
            player.power = Math.max(player.power - 1, 0);  // decrease power but, don't let it go below 0
            if (player.power <= 0) {
                player.health -= 1;
                console.log(`Power depleted, health is now ${player.health}`);
                if (player.health <= 0) {
                    alertGameOver();
                    return;
                }
            }
            console.log(`Power decreased, power is now ${player.power}`);
        }

        drawGrid(grid);
        updatePlayerStatus();
        stepCount++;
    }, 500); // this interval controls the speed of the animation
}

function flashPlayer(callback) {
    player.flashing = true;
    drawGrid(grid);
    setTimeout(() => {
        player.flashing = false;
        drawGrid(grid);
        updatePlayerStatus();
        if (callback) callback();
    }, 250); // Flash duration
}

function isMovementCommand(action) {
    return ['up', 'down', 'left', 'right'].includes(action);
}