Answer the anime questions
Choose the options that feel most “you.” There are no wrong answers — this is a playful vibe test. For the most accurate chaos, answer like you would on your messiest day.
Are you the main character with plot armor… or the legendary sidekick who secretly carries the whole team? This free test gives you a 0–100 Protagonist Score, a fun anime role archetype, and a shareable breakdown you can drop in your group chat. No AI. No signup. 100% free.
Choose the options that feel most “you.” There are no wrong answers — this is a playful vibe test. For the most accurate chaos, answer like you would on your messiest day.
In anime storytelling, “protagonist energy” isn’t just about being loud or powerful. It’s about who the story bends around: the person who acts first, grows on screen, and changes the world (or at least changes the friend group). Meanwhile, sidekicks are not “less” — they’re often the most beloved characters because they’re consistent, clever, and emotionally grounded.
This calculator turns that idea into a playful score. We ask about a few classic anime drivers: leadership (do you step up?), training arc energy (do you grind?), friendship power (do you build alliances?), and plot armor (do you somehow survive the consequences of your decisions?). We also include backstory intensity because let’s be real: main characters usually have lore. Finally, we add chaos tolerance and monologue habit to capture the difference between “quiet competent” and “cinematic.”
Your final result includes (1) a Protagonist Score (0–100), (2) a role archetype, and (3) a short story-s " + id); const shell = document.getElementById("shell-" + id); if (err) err.textContent = ""; if (shell) shell.style.borderColor = "var(--border-subtle)"; }); } function calculate() { clearErrors(); const yourNameEl = document.getElementById("yourName"); const theirNameEl = document.getElementById("theirName"); const vibeEl = document.getElementById("vibe"); const name1 = cleanName(yourNameEl.value); const name2 = cleanName(theirNameEl.value); const vibe = vibeEl.value || ""; let valid = true; if (!name1) { valid = false; document.getElementById("error-yourName").textContent = "Please enter your name."; document.getElementById("shell-yourName").style.borderColor = "var(--danger)"; } if (!name2) { valid = false; document.getElementById("error-theirName").textContent = "Please enter their name."; document.getElementById("shell-theirName").style.borderColor = "var(--danger)"; } if (!valid) { document.getElementById("status-message").textContent = "Enter both names to see your soulmate score."; return; } const score = computeSoulmateScore(name1, name2, vibe); lastScore = score; lastLabel = getScoreLabel(score); lastNamesText = `${name1} + ${name2}`; const titleEl = document.getElementById("result-title"); const mainEl = document.getElementById("result-main"); const metaEl = document.getElementById("result-meta"); const meterFill = document.getElementById("relative-meter-fill"); const meterLabel = document.getElementById("relative-meter-label"); if (titleEl) { titleEl.textContent = `Soulmate Match Score: ${score}%`; } if (mainEl) { mainEl.textContent = getScoreDescription(score, name1, name2, vibe); } let meta = `On this fun name-based scale, 0% means low soulmate match, 50% means mixed vibes and 100% means intense soulmate energy.`; const extra = vibeFlavorText(vibe); if (extra) meta += " " + extra; if (metaEl) { metaEl.textContent = meta; } if (meterFill) { meterFill.style.width = score + "%"; } if (meterLabel) { meterLabel.textContent = `Current soulmate score: ${score}% · ${lastLabel}.`; } const status = document.getElementById("status-message"); if (status) { status.textContent = "Soulmate score updated. You can now save or share your result."; } } function clearCalculator() { const fields = ["yourName", "theirName"]; fields.forEach(id => { const el = document.getElementById(id); if (el) el.value = ""; const err = document.getElementById("error-" + id); const shell = document.getElementById("shell-" + id); if (err) err.textContent = ""; if (shell) shell.style.borderColor = "var(--border-subtle)"; }); const vibeEl = document.getElementById("vibe"); if (vibeEl) vibeEl.selectedIndex = 0; lastScore = null; lastLabel = ""; lastNamesText = ""; document.getElementById("result-title").textContent = "Your soulmate result will appear here"; document.getElementById("result-main").textContent = "Enter both names and tap “Find Soulmate Match” to see your score."; document.getElementById("result-meta").textContent = "This is a light-hearted name-based soulmate fun tool for sharing with friends."; document.getElementById("relative-meter-fill").style.width = "0%"; document.getElementById("relative-meter-label").textContent = "Scale: 0 = low match · 50 = mixed vibes · 100 = intense soulmate energy."; document.getElementById("status-message").textContent = ""; } function formatShareText() { if (lastScore === null || !lastNamesText) { return "I tried the Soulmate Finder on MaximCalculator – enter two names and see your soulmate score!"; } return `${lastNamesText} got a Soulmate Match Score of ${lastScore}% (${lastLabel}) on the Soulmate Finder.\n` + "Try it here: https://maximcalculator.com/calculators/soulmate-finder.html"; } function saveResult() { if (lastScore === null || !lastNamesText) { const status = document.getElementById("status-message"); if (status) { status.textContent = "Find your soulmate score first, then you can save it."; } return; } const now = new Date(); const record = { score: lastScore, label: lastLabel, names: lastNamesText, timestamp: now.toISOString() }; let history = []; try { const raw = localStorage.getItem("soulmateHistory"); if (raw) history = JSON.parse(raw); } catch (e) { history = []; } history.unshift(record); if (history.length > 20) history = history.slice(0, 20); localStorage.setItem("soulmateHistory", JSON.stringify(history)); renderHistory(history); const status = document.getElementById("status-message"); if (status) { status.textContent = "Result saved on this device."; } } function renderHistory(history) { const block = document.getElementById("saved-results-block"); if (!block) return; if (!history || history.length === 0) { block.innerHTML = ""; return; } let html = "