torntrader-exchange / script.js
Cairo303's picture
refactor to include a graph/plot that shows the entire history of all the trains ever done
b585bfd verified
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();
}
});