perso / index.html
Gabz8646's picture
Add 3 files
d5d25e7 verified
<!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">
<!-- Character Creation Form -->
<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">
<!-- Basic Info -->
<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>
<!-- Class Selection -->
<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>
<!-- Attributes Section -->
<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>
<!-- Skills Section -->
<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>
<!-- Submit Button -->
<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>
<!-- Character Display -->
<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">
<!-- Character Image -->
<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>
<!-- Character Info -->
<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>
<!-- Attributes -->
<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>
<!-- Skills -->
<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() {
// Character data
const character = {
name: '',
age: '',
gender: 'M',
class: '',
attributes: {
strength: 0,
agility: 0,
intelligence: 0,
resistance: 0
},
skills: []
};
let remainingPoints = 10;
// DOM Elements
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');
// Display elements
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');
// Event Listeners
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);
// Functions
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) {
// Remove active class from all buttons
classButtons.forEach(btn => {
btn.classList.remove('ring-2', 'ring-yellow-400');
});
// Add active class to clicked button
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) {
// Update the numeric value
const valueElement = document.querySelector(`.attribute-value[data-attribute="${attribute}"]`);
valueElement.textContent = character.attributes[attribute];
// Update the progress bar
const maxValue = 10; // Assuming max value is 10 for visualization
const percentage = (character.attributes[attribute] / maxValue) * 100;
const barElement = document.querySelector(`.stat-bar[data-attribute="${attribute}"]`);
barElement.style.width = `${percentage}%`;
// Update remaining points display
remainingPointsDisplay.textContent = remainingPoints;
// Disable increment buttons if no points left
incrementButtons.forEach(button => {
button.disabled = remainingPoints <= 0;
});
}
function addSkill() {
const skill = skillInput.value.trim();
if (skill && !character.skills.includes(skill)) {
character.skills.push(skill);
// Add to skills list in form
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);
// Add click event to remove button
skillElement.querySelector('button').addEventListener('click', function() {
removeSkill(skill);
skillElement.remove();
});
// Clear input
skillInput.value = '';
}
}
function removeSkill(skill) {
character.skills = character.skills.filter(s => s !== skill);
}
function createCharacter() {
// Validate inputs
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;
}
// Update display
displayName.textContent = character.name;
displayAge.textContent = character.age;
displayGender.textContent = character.gender === 'M' ? 'Masculino' : 'Feminino';
displayClass.textContent = character.class;
// Update attributes display
displayStrength.textContent = character.attributes.strength;
displayAgility.textContent = character.attributes.agility;
displayIntelligence.textContent = character.attributes.intelligence;
displayResistance.textContent = character.attributes.resistance;
// Update attribute bars
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}%`;
// Update skills display
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);
});
// Update character image based on class
updateCharacterImage();
// Switch to display view
creationForm.classList.add('hidden');
characterDisplay.classList.remove('hidden');
}
function editCharacter() {
// Switch back to creation form
creationForm.classList.remove('hidden');
characterDisplay.classList.add('hidden');
}
function updateCharacterImage() {
// Clear previous content
characterImage.innerHTML = '';
// Set different icons based on class
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;
}
// Update image element
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);
}
// Initialize attribute buttons
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>