create project
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dungeons & Dragons Adventure</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">
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#dc2626',
secondary: '#ca8a04',
dark: '#0f172a',
light: '#f1f5f9',
dungeon: '#1e293b',
monster: '#991b1b',
treasure: '#f59e0b'
}
}
}
}
</script>
<style>
@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&family=Roboto:wght@300;400;700&display=swap');
body {
font-family: 'Roboto', sans-serif;
background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
min-height: 100vh;
overflow-x: hidden;
background-image:
radial-gradient(circle at 10% 20%, rgba(220, 38, 38, 0.1) 0%, transparent 20%),
radial-gradient(circle at 90% 80%, rgba(202, 138, 4, 0.1) 0%, transparent 20%);
}
.game-container {
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.7);
border-radius: 15px;
overflow: hidden;
animation: fadeIn 0.8s ease-out;
border: 2px solid #dc2626;
}
.character-card {
transition: all 0.3s ease;
border: 1px solid #334155;
}
.character-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.5);
border-color: #ca8a04;
}
.stats-bar {
height: 12px;
border-radius: 6px;
background: #374151;
overflow: hidden;
}
.health-bar {
background: linear-gradient(to right, #ef4444, #f87171);
}
.mana-bar {
background: linear-gradient(to right, #3b82f6, #60a5fa);
}
.xp-bar {
background: linear-gradient(to right, #10b981, #34d399);
}
.dice {
animation: roll 0.8s ease-out;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes roll {
0% { transform: rotate(0deg) scale(1); }
50% { transform: rotate(180deg) scale(1.2); }
100% { transform: rotate(360deg) scale(1); }
}
.roll-animation {
animation: roll 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.glow {
box-shadow: 0 0 15px rgba(220, 38, 38, 0.5);
}
.card-title {
font-family: 'MedievalSharp', cursive;
text-transform: uppercase;
letter-spacing: 1px;
}
.stat-name {
font-weight: 700;
}
.action-btn {
transition: all 0.2s ease;
position: relative;
overflow: hidden;
}
.action-btn::after {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
transition: 0.5s;
}
.action-btn:hover::after {
left: 100%;
}
.enemy-card {
background: linear-gradient(145deg, #1e293b, #0f172a);
border: 1px solid #991b1b;
}
.quest-item {
border-left: 3px solid #ca8a04;
}
.dice-result {
font-family: 'MedievalSharp', cursive;
font-size: 3rem;
text-shadow: 0 0 10px rgba(255, 215, 0, 0.5);
}
.event-log {
min-height: 200px;
background: rgba(15, 23, 42, 0.7);
border-radius: 10px;
border: 1px solid #334155;
}
.dungeon-bg {
background-image:
repeating-linear-gradient(
45deg,
transparent,
transparent 20px,
rgba(220, 38, 38, 0.05) 20px,
rgba(220, 38, 38, 0.05) 40px
);
}
</style>
</head>
<body class="min-h-screen flex items-center justify-center p-4">
<div id="gameContainer" class="game-container bg-dungeon w-full max-w-6xl">
<!-- Header -->
<div class="bg-gradient-to-r from-primary to-monster p-6 text-center border-b-4 border-secondary">
<h1 class="text-3xl md:text-4xl font-bold text-white mb-2 flex items-center justify-center gap-3">
<i class="fas fa-dragon"></i>
Dungeons & Dragons
<i class="fas fa-dragon"></i>
</h1>
<p class="text-light/80 font-light">Embark on an epic medieval adventure!</p>
</div>
<!-- Game Area -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 p-6">
<!-- Character Panel -->
<div class="lg:col-span-1">
<div class="bg-gray-900 rounded-xl p-6 shadow-lg character-card">
<div class="flex justify-center mb-4">
<div class="w-32 h-32 rounded-full bg-gradient-to-br from-primary to-secondary flex items-center justify-center text-white text-4xl border-2 border-secondary">
<i class="fas fa-user-astronaut"></i>
</div>
</div>
<h2 class="text-xl font-bold text-center mb-4 card-title">Hero's Journal</h2>
<div class="space-y-4">
<div>
<div class="flex justify-between mb-1">
<span class="stat-name">Name:</span>
<span id="heroName" class="font-bold text-light">Adventurer</span>
</div>
</div>
<div>
<div class="flex justify-between mb-1">
<span class="stat-name">Level:</span>
<span id="level" class="font-bold text-light">1</span>
</div>
</div>
<div>
<div class="flex justify-between mb-1">
<span class="stat-name">Class:</span>
<span id="class" class="font-bold text-light">Warrior</span>
</div>
</div>
<div>
<div class="flex justify-between mb-1">
<span class="stat-name">Gold:</span>
<span id="goldValue" class="font-bold text-treasure">100</span>
</div>
</div>
<div class="pt-4">
<h3 class="font-bold mb-2 card-title">Stats</h3>
<div class="space-y-3">
<div>
<div class="flex justify-between mb-1">
<span>Health</span>
<span id="healthValue" class="font-bold text-red-400">100</span>
</div>
<div class="stats-bar">
<div id="healthBar" class="health-bar h-full w-3/4"></div>
</div>
</div>
<div>
<div class="flex justify-between mb-1">
<span>Mana</span>
<span id="manaValue" class="font-bold text-blue-400">50</span>
</div>
<div class="stats-bar">
<div id="manaBar" class="mana-bar h-full w-1/2"></div>
</div>
</div>
<div>
<div class="flex justify-between mb-1">
<span>Experience</span>
<span id="xpValue" class="font-bold text-green-400">0</span>
</div>
<div class="stats-bar">
<div id="xpBar" class="xp-bar h-full w-1/3"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Actions -->
<div class="mt-6 bg-gray-900 rounded-xl p-6 shadow-lg">
<h3 class="font-bold text-lg mb-4 text-center card-title">Actions</h3>
<div class="grid grid-cols-2 gap-3">
<button id="attackBtn" class="action-btn bg-red-600 hover:bg-red-700 text-white py-3 px-4 rounded-lg font-bold transition transform hover:scale-105">
<i class="fas fa-fist-raised mr-2"></i>Attack
</button>
<button id="defendBtn" class="action-btn bg-blue-600 hover:bg-blue-700 text-white py-3 px-4 rounded-lg font-bold transition transform hover:scale-105">
<i class="fas fa-shield-alt mr-2"></i>Defend
</button>
<button id="healBtn" class="action-btn bg-green-600 hover:bg-green-700 text-white py-3 px-4 rounded-lg font-bold transition transform hover:scale-105">
<i class="fas fa-heartbeat mr-2"></i>Heal
</button>
<button id="magicBtn" class="action-btn bg-purple-600 hover:bg-purple-700 text-white py-3 px-4 rounded-lg font-bold transition transform hover:scale-105">
<i class="fas fa-magic mr-2"></i>Magic
</button>
</div>
</div>
</div>
<!-- Main Game Area -->
<div class="lg:col-span-2">
<div class="dungeon-bg bg-gradient-to-br from-dungeon to-gray-900 rounded-xl p-6 shadow-lg text-white h-full">
<div class="flex justify-between items-center mb-6">
<h2 class="text-xl font-bold card-title">Adventure Log</h2>
<div class="flex gap-2">
<button id="newGameBtn" class="bg-secondary hover:bg-yellow-600 text-white py-2 px-4 rounded-lg font-bold transition">
New Game
</button>
<button id="saveBtn" class="bg-primary hover:bg-red-700 text-white py-2 px-4 rounded-lg font-bold transition">
Save
</button>
</div>
</div>
<!-- Event Display -->
<div id="eventDisplay" class="event-log rounded-lg p-6 mb-6">
<p class="text-center text-lg mb-4">Welcome to the Dungeons & Dragons realm!</p>
<p class="text-center">Your adventure begins now...</p>
</div>
<!-- Quest Area -->
<div class="bg-black/30 backdrop-blur-sm rounded-lg p-6">
<h3 class="font-bold text-lg mb-4 card-title">Current Quests</h3>
<div class="space-y-4">
<div class="flex items-start gap-4 quest-item">
<div class="bg-yellow-500/20 p-3 rounded-lg">
<i class="fas fa-scroll text-yellow-400 text-xl"></i>
</div>
<div>
<h4 class="font-bold">The Lost Artifact</h4>
<p class="text-sm opacity-80">Find the ancient artifact hidden in the Whispering Woods.</p>
</div>
</div>
<div class="flex items-start gap-4 quest-item">
<div class="bg-red-500/20 p-3 rounded-lg">
<i class="fas fa-bullseye text-red-400 text-xl"></i>
</div>
<div>
<h4 class="font-bold">Defeat the Goblin King</h4>
<p class="text-sm opacity-80">Collect 3 magical gems to weaken the goblin king's armor.</p>
</div>
</div>
<div class="flex items-start gap-4 quest-item">
<div class="bg-purple-500/20 p-3 rounded-lg">
<i class="fas fa-crown text-purple-400 text-xl"></i>
</div>
<div>
<h4 class="font-bold">Dragon's Hoard</h4>
<p class="text-sm opacity-80">Retrieve the dragon's treasure from its lair near the mountain peaks.</p>
</div>
</div>
</div>
</div>
<!-- Dice Roll -->
<div class="mt-6 bg-black/20 backdrop-blur-sm rounded-lg p-6">
<div class="flex flex-col items-center">
<h3 class="font-bold text-lg mb-4 card-title">Dice Roll</h3>
<div class="flex gap-4 items-center">
<div class="text-center">
<div id="diceResult" class="dice-result mb-2">?</div>
<span class="text-sm opacity-75">Roll Result</span>
</div>
<button id="rollDiceBtn" class="bg-treasure hover:bg-yellow-600 text-white py-3 px-6 rounded-full font-bold text-xl transition transform hover:scale-110">
<i class="fas fa-dice"></i>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Footer -->
<div class="bg-gray-800 text-white text-center p-4 border-t-2 border-secondary">
<p>Dungeons & Dragons RPG © 2023 | Made with <i class="fas fa-heart text-red-500"></i> and <i class="fas fa-dragon text-yellow-400"></i></p>
</div>
</div>
<script>
// Game state
const gameState = {
hero: {
name: 'Adventurer',
level: 1,
class: 'Warrior',
health: 100,
maxHealth: 100,
mana: 50,
maxMana: 50,
experience: 0,
gold: 100
},
enemies: [
{ name: 'Goblin', health: 30, attack: 5, reward: 15, type: 'monster' },
{ name: 'Orc', health: 60, attack: 10, reward: 25, type: 'monster' },
{ name: 'Dragon', health: 150, attack: 20, reward: 100, type: 'boss' }
],
currentEnemy: null,
quests: ['The Lost Artifact', 'Defeat the Goblin King', 'Dragon\'s Hoard'],
diceRolled: false
};
// DOM Elements
const heroNameEl = document.getElementById('heroName');
const levelEl = document.getElementById('level');
const classEl = document.getElementById('class');
const healthValueEl = document.getElementById('healthValue');
const manaValueEl = document.getElementById('manaValue');
const xpValueEl = document.getElementById('xpValue');
const goldValueEl = document.getElementById('goldValue');
const healthBarEl = document.getElementById('healthBar');
const manaBarEl = document.getElementById('manaBar');
const xpBarEl = document.getElementById('xpBar');
const eventDisplayEl = document.getElementById('eventDisplay');
const diceResultEl = document.getElementById('diceResult');
const rollDiceBtn = document.getElementById('rollDiceBtn');
// Initialize game
function initGame() {
updateUI();
setupEventListeners();
}
// Update UI based on game state
function updateUI() {
heroNameEl.textContent = gameState.hero.name;
levelEl.textContent = gameState.hero.level;
classEl.textContent = gameState.hero.class;
goldValueEl.textContent = gameState.hero.gold;
healthValueEl.textContent = gameState.hero.health;
manaValueEl.textContent = gameState.hero.mana;
xpValueEl.textContent = gameState.hero.experience;
// Update bars
const healthPercent = (gameState.hero.health / gameState.hero.maxHealth) * 100;
const manaPercent = (gameState.hero.mana / gameState.hero.maxMana) * 100;
const xpPercent = (gameState.hero.experience / (gameState.hero.level * 50)) * 100;
healthBarEl.style.width = `${healthPercent}%`;
manaBarEl.style.width = `${manaPercent}%`;
xpBarEl.style.width = `${xpPercent}%`;
}
// Setup event listeners
function setupEventListeners() {
document.getElementById('attackBtn').addEventListener('click', attack);
document.getElementById('defendBtn').addEventListener('click', defend);
document.getElementById('healBtn').addEventListener('click', heal);
document.getElementById('magicBtn').addEventListener('click', magic);
document.getElementById('rollDiceBtn').addEventListener('click', rollDice);
document.getElementById('newGameBtn').addEventListener('click', newGame);
document.getElementById('saveBtn').addEventListener('click', saveGame);
}
// Game actions
function attack() {
const damage = Math.floor(Math.random() * 15) + 5;
let message = `You strike the enemy for ${damage} damage!`;
if (gameState.currentEnemy) {
gameState.currentEnemy.health -= damage;
if (gameState.currentEnemy.health <= 0) {
message += ` You defeated the ${gameState.currentEnemy.name}!`;
gameState.hero.experience += gameState.currentEnemy.reward;
gameState.hero.gold += Math.floor(gameState.currentEnemy.reward / 2);
gameState.currentEnemy = null;
eventDisplayEl.innerHTML = `<p class="text-green-400">${message}</p>`;
} else {
eventDisplayEl.innerHTML = `<p>${message}</p>`;
}
} else {
eventDisplayEl.innerHTML = `<p class="text-yellow-400">No enemy to attack!</p>`;
}
updateUI();
}
function defend() {
eventDisplayEl.innerHTML = `<p class="text-blue-400">You take a defensive stance, reducing incoming damage by half!</p>`;
gameState.hero.mana = Math.min(gameState.hero.maxMana, gameState.hero.mana + 5);
updateUI();
}
function heal() {
if (gameState.hero.mana >= 10) {
const healAmount = Math.floor(Math.random() * 20) + 10;
gameState.hero.health = Math.min(gameState.hero.maxHealth, gameState.hero.health + healAmount);
gameState.hero.mana -= 10;
eventDisplayEl.innerHTML = `<p class="text-green-400">You heal yourself for ${healAmount} hit points!</p>`;
updateUI();
} else {
eventDisplayEl.innerHTML = `<p class="text-red-400">Not enough mana to heal!</p>`;
}
}
function magic() {
const spellDamage = Math.floor(Math.random() * 25) + 10;
if (gameState.hero.mana >= 15) {
if (gameState.currentEnemy) {
gameState.currentEnemy.health -= spellDamage;
gameState.hero.mana -= 15;
eventDisplayEl.innerHTML = `<p class="text-purple-400">You cast a powerful spell dealing ${spellDamage} damage!</p>`;
if (gameState.currentEnemy.health <= 0) {
eventDisplayEl.innerHTML += `<p class="text-green-400"> You defeated the ${gameState.currentEnemy.name}!</p>`;
gameState.hero.experience += gameState.currentEnemy.reward;
gameState.hero.gold += Math.floor(gameState.currentEnemy.reward / 2);
gameState.currentEnemy = null;
}
updateUI();
}
} else {
eventDisplayEl.innerHTML = `<p class="text-red-400">Not enough mana for magic!</p>`;
}
}
function rollDice() {
if (!gameState.diceRolled) {
gameState.diceRolled = true;
const result = Math.floor(Math.random() * 6) + 1;
diceResultEl.textContent = result;
diceResultEl.classList.add('roll-animation');
setTimeout(() => {
diceResultEl.classList.remove('roll-animation');
gameState.diceRolled = false;
}, 500);
// Special effects based on roll
let message = '';
switch(result) {
case 1:
message = 'Critical failure! You trip and hurt yourself.';
gameState.hero.health = Math.max(1, gameState.hero.health - 5);
break;
case 2:
message = 'Minor setback, but you survive.';
break;
case 3:
message = 'Lucky roll! You gain a small boost.';
gameState.hero.health = Math.min(gameState.hero.maxHealth, gameState.hero.health + 5);
break;
case 4:
message = 'Lucky roll! You find a healing potion.';
gameState.hero.mana += 10;
break;
case 5:
message = 'Excellent roll! You discover treasure!';
gameState.hero.gold += 20;
break;
case 6:
message = 'Perfect roll! Double fortune strikes!';
gameState.hero.experience += 20;
break;
}
eventDisplayEl.innerHTML = `<p class="text-yellow-400">${message}</p>`;
updateUI();
}
}
function newGame() {
gameState.hero = {
name: 'Adventurer',
level: 1,
class: 'Warrior',
health: 100,
maxHealth: 100,
mana: 50,
maxMana: 50,
experience: 0,
gold: 100
};
gameState.currentEnemy = null;
gameState.diceRolled = false;
eventDisplayEl.innerHTML = '<p class="text-green-400">New game started! Adventure begins again...</p>';
updateUI();
}
function saveGame() {
eventDisplayEl.innerHTML = '<p class="text-blue-400">Game saved successfully!</p>';
}
// Initialize the game when page loads
window.addEventListener('DOMContentLoaded', initGame);
</script>
</body>
</html>