Spaces:
Running
Running
File size: 5,718 Bytes
7e0a9d1 b585bfd 7e0a9d1 b585bfd 7e0a9d1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
document.addEventListener('DOMContentLoaded', function() {
// Item selection
const itemCards = document.querySelectorAll('.item-card');
let selectedItem = null;
itemCards.forEach(card => {
card.addEventListener('click', function() {
itemCards.forEach(c => c.classList.remove('selected'));
this.classList.add('selected');
selectedItem = this.dataset.item;
});
});
// Form submission
const statsForm = document.getElementById('stats-form');
const resultsSection = document.getElementById('results');
const resultContent = document.getElementById('result-content');
statsForm.addEventListener('submit', function(e) {
e.preventDefault();
if (!selectedItem) {
alert('Please select an item first');
return;
}
const attack = parseInt(document.getElementById('attack').value) || 0;
const defense = parseInt(document.getElementById('defense').value) || 0;
const luck = parseInt(document.getElementById('luck').value) || 0;
if (attack < 1 || defense < 1 || luck < 1) {
alert('Please enter valid stats (minimum 1)');
return;
}
// Simulate effects
const results = simulateEffects(selectedItem, attack, defense, luck);
displayResults(results);
// Store in history
const history = JSON.parse(localStorage.getItem('simulationHistory')) || [];
history.push({
date: new Date().toISOString().split('T')[0],
item: selectedItem,
stats: {
attack: parseInt(document.getElementById('attack').value),
defense: parseInt(document.getElementById('defense').value),
luck: parseInt(document.getElementById('luck').value)
},
effects: results
});
localStorage.setItem('simulationHistory', JSON.stringify(history));
resultsSection.classList.remove('hidden');
resultsSection.scrollIntoView({ behavior: 'smooth' });
});
function simulateEffects(item, attack, defense, luck) {
// Deterministic rules with some randomness
const seed = attack + defense + luck;
const randomFactor = (Math.sin(seed) + 1) / 2; // Pseudo-random based on stats
let effects = {};
switch(item) {
case 'sword':
effects.damageBoost = Math.round((attack * 0.5 + luck * 0.2) * (0.8 + randomFactor * 0.4));
effects.criticalChance = Math.round((luck * 0.3 + attack * 0.1) * (0.5 + randomFactor * 0.5));
effects.description = "Your attacks become more powerful, with increased chance to land critical hits.";
break;
case 'shield':
effects.damageReduction = Math.round((defense * 0.6 + luck * 0.1) * (0.7 + randomFactor * 0.3));
effects.blockChance = Math.round((defense * 0.4 + attack * 0.05) * (0.6 + randomFactor * 0.4));
effects.description = "Your defenses are strengthened, allowing you to mitigate more damage and block attacks.";
break;
case 'star':
effects.luckMultiplier = Math.round((luck * 0.8 + attack * 0.1 + defense * 0.1) * (0.5 + randomFactor * 0.5));
effects.itemFindChance = Math.round((luck * 0.5) * (0.6 + randomFactor * 0.4));
effects.description = "Fortune smiles upon you, increasing your chances for favorable outcomes.";
break;
}
effects.itemName = getItemName(item);
effects.icon = item;
return effects;
}
function getItemName(item) {
switch(item) {
case 'sword': return 'Blade of Might';
case 'shield': return 'Aegis Barrier';
case 'star': return 'Talisman of Fortune';
default: return 'Mysterious Artifact';
}
}
function displayResults(results) {
resultContent.innerHTML = '';
// Header with item info
const header = document.createElement('div');
header.className = 'flex items-center mb-6';
header.innerHTML = `
<i data-feather="${results.icon}" class="w-12 h-12 mr-4"></i>
<div>
<h3 class="text-xl font-semibold">${results.itemName}</h3>
<p class="text-gray-600">${results.description}</p>
</div>
`;
resultContent.appendChild(header);
// Display all effects
for (const [key, value] of Object.entries(results)) {
if (key === 'itemName' || key === 'description' || key === 'icon') continue;
const effectDiv = document.createElement('div');
effectDiv.className = 'result-card mb-4';
const label = key.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase());
const percentage = key.includes('Chance') || key.includes('Multiplier') || key.includes('Reduction');
effectDiv.innerHTML = `
<h3>${label}</h3>
<div class="flex items-center mt-2">
<div class="progress-bar mr-4">
<div class="progress-fill" style="width: ${Math.min(value, 100)}%"></div>
</div>
<span class="font-medium">${value}${percentage ? '%' : ''}</span>
</div>
`;
resultContent.appendChild(effectDiv);
}
// Re-render feather icons
feather.replace();
}
}); |