Skip to content

Rpg #19

@pd470101-jpg

Description

@pd470101-jpg

// --- Definições do Jogo ---
const player = {
name: "Andarilho",
level: 1,
maxHP: 100,
currentHP: 100,
attack: 10,
defense: 5,
isDefending: false,
};

let enemy = {
name: "Gnomo Bandido",
maxHP: 30,
currentHP: 30,
attack: 6,
defense: 2,
};

let isCombatActive = true;

// --- Elementos do DOM ---
const log = document.getElementById('text-log');
const promptText = document.getElementById('current-prompt');
const btnAttack = document.getElementById('action-attack');
const btnDefend = document.getElementById('action-defend');
const btnNext = document.getElementById('action-next');

// Barras de Status
const playerHPBar = document.getElementById('player-health-bar');
const playerHPText = document.getElementById('player-hp-text');
const enemyHPContainer = document.getElementById('enemy-hp-container');
const enemyHPLabel = document.getElementById('enemy-hp-label');

// --- Funções de Atualização da UI ---

/**

  • Adiciona uma nova linha de texto ao log de forma estilizada.
  • @param {string} text - O texto a ser adicionado.
    */
    function appendToLog(text) {
    const p = document.createElement('p');
    p.textContent = text;
    // Remove o efeito 'new-text' do texto anterior
    const lastP = log.querySelector('.new-text');
    if (lastP) {
    lastP.classList.remove('new-text');
    }
    // Adiciona o efeito de máquina de escrever ao novo texto
    p.classList.add('new-text');
    log.appendChild(p);
    // Rola para o final
    log.scrollTop = log.scrollHeight;
    }

/**

  • Atualiza todas as barras de status e textos.
    */
    function updateStatus() {
    // 1. Jogador HP
    const playerHealthPercent = (player.currentHP / player.maxHP) * 100;
    playerHPBar.style.width = ${playerHealthPercent}%;
    playerHPText.textContent = ${player.currentHP}/${player.maxHP};

    // 2. Inimigo HP (usando o estilo RPGUI progress)
    const enemyHealthPercent = (enemy.currentHP / enemy.maxHP) * 100;
    enemyHPContainer.style.setProperty('--progress-value', ${enemyHealthPercent}%);
    enemyHPLabel.textContent = ${enemy.currentHP}/${enemy.maxHP} HP (${enemy.name});

    // 3. Status superior
    document.getElementById('player-level').textContent = player.level;
    document.getElementById('player-attack').textContent = player.attack;
    document.getElementById('player-defense').textContent = player.defense;
    }

// --- Funções de Combate ---

function enemyTurn() {
if (!isCombatActive) return;

const damageTaken = Math.max(0, enemy.attack - (player.isDefending ? player.defense * 2 : player.defense));
player.currentHP = Math.max(0, player.currentHP - damageTaken);

if (player.isDefending) {
    appendToLog(`O ${enemy.name} ataca! Sua defesa o protege, mas você leva ${damageTaken} de dano.`);
} else {
    appendToLog(`O ${enemy.name} ataca e causa ${damageTaken} de dano.`);
}

player.isDefending = false; // A defesa dura apenas um turno

updateStatus();

if (player.currentHP === 0) {
    endGame(false);
} else {
    promptText.textContent = "O que você fará no próximo turno?";
    enableCombatButtons();
}

}

function playerAttack() {
// 1. Dano do Jogador
const damageDealt = Math.max(1, player.attack - enemy.defense); // Garante dano mínimo de 1
enemy.currentHP = Math.max(0, enemy.currentHP - damageDealt);

appendToLog(`Você ataca o ${enemy.name} e causa ${damageDealt} de dano.`);

updateStatus();
disableCombatButtons();

// 2. Verifica vitória
if (enemy.currentHP === 0) {
    endCombat(true);
} else {
    // 3. Turno do inimigo após 1.5s
    setTimeout(enemyTurn, 1500); 
}

}

function playerDefend() {
player.isDefending = true;
appendToLog("Você se prepara e aumenta sua defesa!");
disableCombatButtons();

// Turno do inimigo após 1.5s
setTimeout(enemyTurn, 1500); 

}

// --- Funções de Controle do Jogo ---

function disableCombatButtons() {
btnAttack.disabled = true;
btnDefend.disabled = true;
btnAttack.style.opacity = 0.5;
btnDefend.style.opacity = 0.5;
}

function enableCombatButtons() {
btnAttack.disabled = false;
btnDefend.disabled = false;
btnAttack.style.opacity = 1;
btnDefend.style.opacity = 1;
}

function endCombat(isVictory) {
isCombatActive = false;
disableCombatButtons();
enemyHPContainer.style.display = 'none';

if (isVictory) {
    player.level++;
    player.attack += 2;
    player.defense += 1;
    player.maxHP += 10;
    player.currentHP = Math.min(player.maxHP, player.currentHP + 15); // Cura parcial e aumenta o limite
    
    appendToLog(`\n*** VITÓRIA! ***`);
    appendToLog(`Você derrotou o ${enemy.name}! Você sobe para o Nível ${player.level} e se sente mais forte.`);
    promptText.textContent = "Seu caminho está livre. Pressione AVANÇAR para continuar.";
    btnNext.style.display = 'inline-block';
    updateStatus();

} else {
    endGame(false);
}

}

function endGame(isWon) {
isCombatActive = false;
disableCombatButtons();
btnNext.style.display = 'none';

if (isWon) {
    appendToLog("🎉 Você alcançou o final do nosso pequeno demo! Parabéns, Andarilho!");
    promptText.textContent = "FIM DE JOGO: VITÓRIA. Obrigado por jogar!";
} else {
    appendToLog("💀 Você caiu na batalha. A floresta escura te reclama.");
    promptText.textContent = "FIM DE JOGO: DERROTA. Atualize para tentar novamente.";
}

}

function nextEncounter() {
// Lógica simples para o próximo evento/inimigo
if (player.level === 2) {
// Define o próximo inimigo
enemy = {
name: "Grande Lobo Faminto",
maxHP: 50,
currentHP: 50,
attack: 12,
defense: 4,
};

    // Configura a UI para o novo combate
    isCombatActive = true;
    enemyHPContainer.style.display = 'block';
    btnNext.style.display = 'none';
    
    appendToLog(`\nVocê se aprofunda na floresta. Um ${enemy.name} rosnando aparece bloqueando o caminho!`);
    promptText.textContent = "Um novo inimigo o aguarda. O que você fará?";
    enableCombatButtons();
    updateStatus(); // Atualiza a barra do novo inimigo
} else {
    endGame(true); // Fim da demonstração
}

}

// --- Inicialização e Event Listeners ---

document.addEventListener('DOMContentLoaded', () => {
updateStatus(); // Inicializa as barras e stats
enemyHPContainer.style.setProperty('--progress-value', '100%'); // Inicializa a barra RPGUI

btnAttack.addEventListener('click', playerAttack);
btnDefend.addEventListener('click', playerDefend);
btnNext.addEventListener('click', nextEncounter);

});

<title>A Lenda do Último Andarilho</title>

A Lenda do Último Andarilho

Um jogo de texto e escolhas.

    <div class="status-bar">
        <div class="stat">
            <span id="player-name" class="stat-value">Andarilho</span>
            <p class="stat-label">Nome</p>
        </div>
        <div class="stat">
            <span id="player-level" class="stat-value">1</span>
            <p class="stat-label">Nível</p>
        </div>
        <div class="stat">
            <span id="player-attack" class="stat-value">10</span>
            <p class="stat-label">Ataque</p>
        </div>
        <div class="stat">
            <span id="player-defense" class="stat-value">5</span>
            <p class="stat-label">Defesa</p>
        </div>
    </div>

    <div id="text-log">
        <p class="new-text">Você acorda em uma floresta escura, a memória turva. À sua frente, um Gnomo Bandido fareja o ar...</p>
    </div>

    <div class="rpgui-content">
        <div id="action-area" class="rpgui-container framed">
            <p id="current-prompt">O que você fará?</p>
            <button id="action-attack" class="rpgui-button action-button">Ataque</button>
            <button id="action-defend" class="rpgui-button action-button">Defesa</button>
            <button id="action-next" class="rpgui-button action-button" style="display:none;">Avançar</button>
        </div>
        
        <div id="enemy-hp-container" class="rpgui-progress" data-value="100" data-max="100">
            <div class="rpgui-progress-label" id="enemy-hp-label">100/100 HP (Gnomo Bandido)</div>
        </div>

        <p>Sua Vida:</p>
        <div class="health-bar-container">
            <div id="player-health-bar" class="health-bar" style="width: 100%;"></div>
        </div>
        <span id="player-hp-text">100/100</span>

    </div>
</div>

<script src="script.js"></script>

Bem-vindo ao reino! O que deseja fazer?

Ataque Defesa
<div class="rpgui-progress" data-value="75" data-max="100">
    <div class="rpgui-progress-label">75/100 HP</div>
</div>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions