| <!DOCTYPE html> |
| <html lang="pt-br"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Criador de Personagem RPG</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| <style> |
| .stat-bar { |
| height: 8px; |
| border-radius: 4px; |
| transition: width 0.3s ease; |
| } |
| .character-card { |
| transform-style: preserve-3d; |
| transition: transform 0.5s; |
| } |
| .character-card:hover { |
| transform: translateY(-5px); |
| } |
| @keyframes pulse { |
| 0% { transform: scale(1); } |
| 50% { transform: scale(1.05); } |
| 100% { transform: scale(1); } |
| } |
| .animate-pulse { |
| animation: pulse 2s infinite; |
| } |
| </style> |
| </head> |
| <body class="bg-gray-900 text-white min-h-screen"> |
| <div class="container mx-auto px-4 py-8"> |
| <h1 class="text-4xl font-bold text-center mb-8 text-yellow-400"> |
| <i class="fas fa-dragon mr-2"></i> Criador de Personagem RPG |
| </h1> |
|
|
| <div class="max-w-3xl mx-auto bg-gray-800 rounded-xl shadow-2xl overflow-hidden"> |
| |
| <div id="creation-form" class="p-6"> |
| <h2 class="text-2xl font-semibold mb-6 text-center text-blue-300">Crie seu Personagem</h2> |
| |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-6"> |
| |
| <div class="space-y-4"> |
| <div> |
| <label for="name" class="block text-sm font-medium text-gray-300 mb-1">Nome do Personagem</label> |
| <input type="text" id="name" class="w-full px-4 py-2 bg-gray-700 border border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" placeholder="Ex: João"> |
| </div> |
| |
| <div> |
| <label for="age" class="block text-sm font-medium text-gray-300 mb-1">Idade</label> |
| <input type="number" id="age" class="w-full px-4 py-2 bg-gray-700 border border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" placeholder="Ex: 25"> |
| </div> |
| |
| <div> |
| <label class="block text-sm font-medium text-gray-300 mb-1">Sexo</label> |
| <div class="flex space-x-4"> |
| <label class="inline-flex items-center"> |
| <input type="radio" name="gender" value="M" class="h-5 w-5 text-blue-500" checked> |
| <span class="ml-2">Masculino</span> |
| </label> |
| <label class="inline-flex items-center"> |
| <input type="radio" name="gender" value="F" class="h-5 w-5 text-pink-500"> |
| <span class="ml-2">Feminino</span> |
| </label> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div> |
| <label class="block text-sm font-medium text-gray-300 mb-1">Classe</label> |
| <div class="grid grid-cols-3 gap-3"> |
| <button type="button" data-class="Guerreiro" class="class-btn px-4 py-3 bg-red-900 hover:bg-red-800 rounded-lg flex flex-col items-center transition"> |
| <i class="fas fa-shield-alt text-2xl mb-1"></i> |
| <span>Guerreiro</span> |
| </button> |
| <button type="button" data-class="Mago" class="class-btn px-4 py-3 bg-blue-900 hover:bg-blue-800 rounded-lg flex flex-col items-center transition"> |
| <i class="fas fa-hat-wizard text-2xl mb-1"></i> |
| <span>Mago</span> |
| </button> |
| <button type="button" data-class="Arqueiro" class="class-btn px-4 py-3 bg-green-900 hover:bg-green-800 rounded-lg flex flex-col items-center transition"> |
| <i class="fas fa-bow-arrow text-2xl mb-1"></i> |
| <span>Arqueiro</span> |
| </button> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div class="mt-8"> |
| <h3 class="text-xl font-semibold mb-4 text-center text-purple-300">Atributos</h3> |
| <p class="text-sm text-gray-400 mb-4 text-center">Você tem 10 pontos para distribuir</p> |
| |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-4"> |
| <div class="attribute-control"> |
| <div class="flex justify-between mb-1"> |
| <label class="font-medium">Força</label> |
| <span class="attribute-value" data-attribute="strength">0</span> |
| </div> |
| <div class="flex items-center"> |
| <button class="decrement-btn px-3 py-1 bg-red-600 rounded-l-lg hover:bg-red-700" data-attribute="strength">-</button> |
| <div class="flex-1 bg-gray-700 h-8 mx-1 rounded"> |
| <div class="stat-bar bg-red-500 h-full" data-attribute="strength" style="width: 0%"></div> |
| </div> |
| <button class="increment-btn px-3 py-1 bg-green-600 rounded-r-lg hover:bg-green-700" data-attribute="strength">+</button> |
| </div> |
| </div> |
| |
| <div class="attribute-control"> |
| <div class="flex justify-between mb-1"> |
| <label class="font-medium">Agilidade</label> |
| <span class="attribute-value" data-attribute="agility">0</span> |
| </div> |
| <div class="flex items-center"> |
| <button class="decrement-btn px-3 py-1 bg-red-600 rounded-l-lg hover:bg-red-700" data-attribute="agility">-</button> |
| <div class="flex-1 bg-gray-700 h-8 mx-1 rounded"> |
| <div class="stat-bar bg-yellow-500 h-full" data-attribute="agility" style="width: 0%"></div> |
| </div> |
| <button class="increment-btn px-3 py-1 bg-green-600 rounded-r-lg hover:bg-green-700" data-attribute="agility">+</button> |
| </div> |
| </div> |
| |
| <div class="attribute-control"> |
| <div class="flex justify-between mb-1"> |
| <label class="font-medium">Inteligência</label> |
| <span class="attribute-value" data-attribute="intelligence">0</span> |
| </div> |
| <div class="flex items-center"> |
| <button class="decrement-btn px-3 py-1 bg-red-600 rounded-l-lg hover:bg-red-700" data-attribute="intelligence">-</button> |
| <div class="flex-1 bg-gray-700 h-8 mx-1 rounded"> |
| <div class="stat-bar bg-blue-500 h-full" data-attribute="intelligence" style="width: 0%"></div> |
| </div> |
| <button class="increment-btn px-3 py-1 bg-green-600 rounded-r-lg hover:bg-green-700" data-attribute="intelligence">+</button> |
| </div> |
| </div> |
| |
| <div class="attribute-control"> |
| <div class="flex justify-between mb-1"> |
| <label class="font-medium">Resistência</label> |
| <span class="attribute-value" data-attribute="resistance">0</span> |
| </div> |
| <div class="flex items-center"> |
| <button class="decrement-btn px-3 py-1 bg-red-600 rounded-l-lg hover:bg-red-700" data-attribute="resistance">-</button> |
| <div class="flex-1 bg-gray-700 h-8 mx-1 rounded"> |
| <div class="stat-bar bg-purple-500 h-full" data-attribute="resistance" style="width: 0%"></div> |
| </div> |
| <button class="increment-btn px-3 py-1 bg-green-600 rounded-r-lg hover:bg-green-700" data-attribute="resistance">+</button> |
| </div> |
| </div> |
| </div> |
| |
| <div class="mt-4 text-center"> |
| <p class="text-sm font-medium">Pontos restantes: <span id="remaining-points" class="text-yellow-400">10</span></p> |
| </div> |
| </div> |
| |
| |
| <div class="mt-8"> |
| <h3 class="text-xl font-semibold mb-4 text-center text-green-300">Habilidades</h3> |
| <div class="flex"> |
| <input type="text" id="skill-input" class="flex-1 px-4 py-2 bg-gray-700 border border-gray-600 rounded-l-lg focus:ring-2 focus:ring-green-500 focus:border-green-500" placeholder="Ex: Luta corpo a corpo"> |
| <button id="add-skill-btn" class="px-4 py-2 bg-green-600 hover:bg-green-700 rounded-r-lg transition"> |
| <i class="fas fa-plus"></i> Adicionar |
| </button> |
| </div> |
| <div id="skills-list" class="mt-4 flex flex-wrap gap-2"></div> |
| </div> |
| |
| |
| <div class="mt-10 text-center"> |
| <button id="create-character-btn" class="px-8 py-3 bg-yellow-600 hover:bg-yellow-700 rounded-lg font-bold text-lg transition transform hover:scale-105 animate-pulse"> |
| <i class="fas fa-user-plus mr-2"></i> Criar Personagem |
| </button> |
| </div> |
| </div> |
| |
| |
| <div id="character-display" class="hidden p-6"> |
| <div class="flex justify-between items-center mb-6"> |
| <h2 class="text-2xl font-semibold text-blue-300">Seu Personagem</h2> |
| <button id="edit-character-btn" class="px-4 py-2 bg-gray-700 hover:bg-gray-600 rounded-lg"> |
| <i class="fas fa-edit mr-1"></i> Editar |
| </button> |
| </div> |
| |
| <div class="character-card bg-gray-700 rounded-xl p-6 shadow-lg"> |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-6"> |
| |
| <div class="flex justify-center"> |
| <div id="character-image" class="w-40 h-40 rounded-full bg-gray-600 flex items-center justify-center text-6xl"> |
| <i class="fas fa-user"></i> |
| </div> |
| </div> |
| |
| |
| <div class="md:col-span-2"> |
| <div class="grid grid-cols-2 gap-4 mb-6"> |
| <div> |
| <p class="text-sm text-gray-400">Nome</p> |
| <p id="display-name" class="text-xl font-bold">-</p> |
| </div> |
| <div> |
| <p class="text-sm text-gray-400">Idade</p> |
| <p id="display-age" class="text-xl">-</p> |
| </div> |
| <div> |
| <p class="text-sm text-gray-400">Sexo</p> |
| <p id="display-gender" class="text-xl">-</p> |
| </div> |
| <div> |
| <p class="text-sm text-gray-400">Classe</p> |
| <p id="display-class" class="text-xl">-</p> |
| </div> |
| </div> |
| |
| |
| <div class="mb-6"> |
| <h4 class="text-lg font-semibold mb-3">Atributos</h4> |
| <div class="space-y-2"> |
| <div> |
| <div class="flex justify-between mb-1"> |
| <span>Força</span> |
| <span id="display-strength">0</span> |
| </div> |
| <div class="w-full bg-gray-600 rounded-full h-2.5"> |
| <div id="display-strength-bar" class="h-2.5 rounded-full bg-red-500" style="width: 0%"></div> |
| </div> |
| </div> |
| <div> |
| <div class="flex justify-between mb-1"> |
| <span>Agilidade</span> |
| <span id="display-agility">0</span> |
| </div> |
| <div class="w-full bg-gray-600 rounded-full h-2.5"> |
| <div id="display-agility-bar" class="h-2.5 rounded-full bg-yellow-500" style="width: 0%"></div> |
| </div> |
| </div> |
| <div> |
| <div class="flex justify-between mb-1"> |
| <span>Inteligência</span> |
| <span id="display-intelligence">0</span> |
| </div> |
| <div class="w-full bg-gray-600 rounded-full h-2.5"> |
| <div id="display-intelligence-bar" class="h-2.5 rounded-full bg-blue-500" style="width: 0%"></div> |
| </div> |
| </div> |
| <div> |
| <div class="flex justify-between mb-1"> |
| <span>Resistência</span> |
| <span id="display-resistance">0</span> |
| </div> |
| <div class="w-full bg-gray-600 rounded-full h-2.5"> |
| <div id="display-resistance-bar" class="h-2.5 rounded-full bg-purple-500" style="width: 0%"></div> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div> |
| <h4 class="text-lg font-semibold mb-3">Habilidades</h4> |
| <div id="display-skills" class="flex flex-wrap gap-2"></div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <script> |
| document.addEventListener('DOMContentLoaded', function() { |
| |
| const character = { |
| name: '', |
| age: '', |
| gender: 'M', |
| class: '', |
| attributes: { |
| strength: 0, |
| agility: 0, |
| intelligence: 0, |
| resistance: 0 |
| }, |
| skills: [] |
| }; |
| |
| let remainingPoints = 10; |
| |
| |
| const nameInput = document.getElementById('name'); |
| const ageInput = document.getElementById('age'); |
| const genderInputs = document.querySelectorAll('input[name="gender"]'); |
| const classButtons = document.querySelectorAll('.class-btn'); |
| const incrementButtons = document.querySelectorAll('.increment-btn'); |
| const decrementButtons = document.querySelectorAll('.decrement-btn'); |
| const attributeValues = document.querySelectorAll('.attribute-value'); |
| const statBars = document.querySelectorAll('.stat-bar'); |
| const remainingPointsDisplay = document.getElementById('remaining-points'); |
| const skillInput = document.getElementById('skill-input'); |
| const addSkillBtn = document.getElementById('add-skill-btn'); |
| const skillsList = document.getElementById('skills-list'); |
| const createCharacterBtn = document.getElementById('create-character-btn'); |
| const editCharacterBtn = document.getElementById('edit-character-btn'); |
| const creationForm = document.getElementById('creation-form'); |
| const characterDisplay = document.getElementById('character-display'); |
| const characterImage = document.getElementById('character-image'); |
| |
| |
| const displayName = document.getElementById('display-name'); |
| const displayAge = document.getElementById('display-age'); |
| const displayGender = document.getElementById('display-gender'); |
| const displayClass = document.getElementById('display-class'); |
| const displayStrength = document.getElementById('display-strength'); |
| const displayAgility = document.getElementById('display-agility'); |
| const displayIntelligence = document.getElementById('display-intelligence'); |
| const displayResistance = document.getElementById('display-resistance'); |
| const displayStrengthBar = document.getElementById('display-strength-bar'); |
| const displayAgilityBar = document.getElementById('display-agility-bar'); |
| const displayIntelligenceBar = document.getElementById('display-intelligence-bar'); |
| const displayResistanceBar = document.getElementById('display-resistance-bar'); |
| const displaySkills = document.getElementById('display-skills'); |
| |
| |
| nameInput.addEventListener('input', updateName); |
| ageInput.addEventListener('input', updateAge); |
| |
| genderInputs.forEach(input => { |
| input.addEventListener('change', updateGender); |
| }); |
| |
| classButtons.forEach(button => { |
| button.addEventListener('click', selectClass); |
| }); |
| |
| incrementButtons.forEach(button => { |
| button.addEventListener('click', incrementAttribute); |
| }); |
| |
| decrementButtons.forEach(button => { |
| button.addEventListener('click', decrementAttribute); |
| }); |
| |
| addSkillBtn.addEventListener('click', addSkill); |
| skillInput.addEventListener('keypress', function(e) { |
| if (e.key === 'Enter') addSkill(); |
| }); |
| |
| createCharacterBtn.addEventListener('click', createCharacter); |
| editCharacterBtn.addEventListener('click', editCharacter); |
| |
| |
| function updateName() { |
| character.name = nameInput.value.trim(); |
| } |
| |
| function updateAge() { |
| character.age = ageInput.value.trim(); |
| } |
| |
| function updateGender() { |
| character.gender = document.querySelector('input[name="gender"]:checked').value; |
| } |
| |
| function selectClass(e) { |
| |
| classButtons.forEach(btn => { |
| btn.classList.remove('ring-2', 'ring-yellow-400'); |
| }); |
| |
| |
| const button = e.currentTarget; |
| button.classList.add('ring-2', 'ring-yellow-400'); |
| |
| character.class = button.dataset.class; |
| } |
| |
| function incrementAttribute(e) { |
| const attribute = e.currentTarget.dataset.attribute; |
| |
| if (remainingPoints > 0) { |
| character.attributes[attribute]++; |
| remainingPoints--; |
| updateAttributeDisplay(attribute); |
| } |
| } |
| |
| function decrementAttribute(e) { |
| const attribute = e.currentTarget.dataset.attribute; |
| |
| if (character.attributes[attribute] > 0) { |
| character.attributes[attribute]--; |
| remainingPoints++; |
| updateAttributeDisplay(attribute); |
| } |
| } |
| |
| function updateAttributeDisplay(attribute) { |
| |
| const valueElement = document.querySelector(`.attribute-value[data-attribute="${attribute}"]`); |
| valueElement.textContent = character.attributes[attribute]; |
| |
| |
| const maxValue = 10; |
| const percentage = (character.attributes[attribute] / maxValue) * 100; |
| const barElement = document.querySelector(`.stat-bar[data-attribute="${attribute}"]`); |
| barElement.style.width = `${percentage}%`; |
| |
| |
| remainingPointsDisplay.textContent = remainingPoints; |
| |
| |
| incrementButtons.forEach(button => { |
| button.disabled = remainingPoints <= 0; |
| }); |
| } |
| |
| function addSkill() { |
| const skill = skillInput.value.trim(); |
| |
| if (skill && !character.skills.includes(skill)) { |
| character.skills.push(skill); |
| |
| |
| const skillElement = document.createElement('div'); |
| skillElement.className = 'px-3 py-1 bg-gray-700 rounded-full flex items-center'; |
| skillElement.innerHTML = ` |
| <span>${skill}</span> |
| <button class="ml-2 text-red-400 hover:text-red-300" data-skill="${skill}"> |
| <i class="fas fa-times"></i> |
| </button> |
| `; |
| skillsList.appendChild(skillElement); |
| |
| |
| skillElement.querySelector('button').addEventListener('click', function() { |
| removeSkill(skill); |
| skillElement.remove(); |
| }); |
| |
| |
| skillInput.value = ''; |
| } |
| } |
| |
| function removeSkill(skill) { |
| character.skills = character.skills.filter(s => s !== skill); |
| } |
| |
| function createCharacter() { |
| |
| if (!character.name) { |
| alert('Por favor, insira o nome do personagem'); |
| return; |
| } |
| |
| if (!character.age) { |
| alert('Por favor, insira a idade do personagem'); |
| return; |
| } |
| |
| if (!character.class) { |
| alert('Por favor, selecione uma classe para o personagem'); |
| return; |
| } |
| |
| if (remainingPoints > 0) { |
| const confirmUse = confirm(`Você ainda tem ${remainingPoints} pontos não distribuídos. Deseja continuar assim?`); |
| if (!confirmUse) return; |
| } |
| |
| |
| displayName.textContent = character.name; |
| displayAge.textContent = character.age; |
| displayGender.textContent = character.gender === 'M' ? 'Masculino' : 'Feminino'; |
| displayClass.textContent = character.class; |
| |
| |
| displayStrength.textContent = character.attributes.strength; |
| displayAgility.textContent = character.attributes.agility; |
| displayIntelligence.textContent = character.attributes.intelligence; |
| displayResistance.textContent = character.attributes.resistance; |
| |
| |
| const maxValue = 10; |
| displayStrengthBar.style.width = `${(character.attributes.strength / maxValue) * 100}%`; |
| displayAgilityBar.style.width = `${(character.attributes.agility / maxValue) * 100}%`; |
| displayIntelligenceBar.style.width = `${(character.attributes.intelligence / maxValue) * 100}%`; |
| displayResistanceBar.style.width = `${(character.attributes.resistance / maxValue) * 100}%`; |
| |
| |
| displaySkills.innerHTML = ''; |
| character.skills.forEach(skill => { |
| const skillElement = document.createElement('span'); |
| skillElement.className = 'px-3 py-1 bg-gray-600 rounded-full'; |
| skillElement.textContent = skill; |
| displaySkills.appendChild(skillElement); |
| }); |
| |
| |
| updateCharacterImage(); |
| |
| |
| creationForm.classList.add('hidden'); |
| characterDisplay.classList.remove('hidden'); |
| } |
| |
| function editCharacter() { |
| |
| creationForm.classList.remove('hidden'); |
| characterDisplay.classList.add('hidden'); |
| } |
| |
| function updateCharacterImage() { |
| |
| characterImage.innerHTML = ''; |
| |
| |
| let iconClass = 'fas fa-user'; |
| let bgColor = 'bg-gray-600'; |
| |
| switch(character.class) { |
| case 'Guerreiro': |
| iconClass = 'fas fa-shield-alt'; |
| bgColor = 'bg-red-600'; |
| break; |
| case 'Mago': |
| iconClass = 'fas fa-hat-wizard'; |
| bgColor = 'bg-blue-600'; |
| break; |
| case 'Arqueiro': |
| iconClass = 'fas fa-bow-arrow'; |
| bgColor = 'bg-green-600'; |
| break; |
| } |
| |
| |
| characterImage.className = `w-40 h-40 rounded-full ${bgColor} flex items-center justify-center text-6xl`; |
| const icon = document.createElement('i'); |
| icon.className = iconClass; |
| characterImage.appendChild(icon); |
| } |
| |
| |
| incrementButtons.forEach(button => { |
| button.disabled = remainingPoints <= 0; |
| }); |
| }); |
| </script> |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Gabz8646/perso" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
| </html> |