CharakterCreator: Unterschied zwischen den Versionen
Aus Dunkelherzen Wiki
DRP (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
DRP (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
||
| Zeile 1: | Zeile 1: | ||
<html> | <!DOCTYPE html> | ||
< | <html lang="de"> | ||
<head> | |||
<meta charset="UTF-8"> | |||
<title>Charakter Creator</title> | |||
<style> | |||
body { | |||
font-family: sans-serif; | |||
max-width: 800px; | |||
margin: auto; | |||
padding: 20px; | |||
} | |||
label { | |||
font-weight: bold; | |||
display: block; | |||
margin-top: 10px; | |||
} | |||
input, select { | |||
width: 100%; | |||
padding: 5px; | |||
margin-bottom: 10px; | |||
} | |||
table { | |||
width: 100%; | |||
border-collapse: collapse; | |||
margin-top: 20px; | |||
} | |||
th, td { | |||
border: 1px solid #ccc; | |||
padding: 5px; | |||
text-align: center; | |||
} | |||
.output { | |||
margin-top: 20px; | |||
white-space: pre-wrap; | |||
background: #f8f8f8; | |||
padding: 10px; | |||
border: 1px solid #ccc; | |||
} | |||
.button { | |||
margin-top: 15px; | |||
padding: 10px; | |||
width: 100%; | |||
} | |||
</style> | </style> | ||
</head> | |||
<body> | |||
<h2>Charakter Creator</h2> | <h2>Charakter Creator</h2> | ||
| Zeile 55: | Zeile 60: | ||
<label for="klasse">Klasse:</label> | <label for="klasse">Klasse:</label> | ||
<select id="klasse"> | <select id="klasse"> | ||
<option value=""> | <option value="">Wähle...</option> | ||
<option value="Arbeiter">Arbeiter</option> | |||
<option value="Barde">Barde</option> | |||
<option value="Bote">Bote</option> | |||
<option value="Gelehrter">Gelehrter</option> | |||
<option value="Gläubiger">Gläubiger</option> | |||
<option value="Kind">Kind</option> | |||
<option value="Krieger">Krieger</option> | <option value="Krieger">Krieger</option> | ||
<option value=" | <option value="Schurke">Schurke</option> | ||
<option value="Schütze">Schütze</option> | |||
<option value="Seelenkünstler">Seelenkünstler</option> | |||
<option value="Soldat">Soldat</option> | |||
<option value="Techniker">Techniker</option> | |||
<option value="Vagabunde">Vagabunde</option> | |||
</select> | </select> | ||
<label for="subklasse">Subklasse:</label> | <label for="subklasse">Subklasse:</label> | ||
<select id="subklasse"> | <select id="subklasse"> | ||
<option value="">Keine | <option value="">Keine Subklasse</option> | ||
<option value=" | <option value="Auserwählter">Auserwählter</option> | ||
<option value=" | <option value="Diener">Diener</option> | ||
<option value="Drogenjunkie">Drogenjunkie</option> | |||
<option value="Dummkopf">Dummkopf</option> | |||
<option value="Dunkler Künstler">Dunkler Künstler</option> | |||
<option value="Gesetzloser">Gesetzloser</option> | |||
<option value="Glücksspieler">Glücksspieler</option> | |||
<option value="Händler">Händler</option> | |||
<option value="Koch">Koch</option> | |||
<option value="Kopfgeldjäger">Kopfgeldjäger</option> | |||
<option value="Ödländer">Ödländer</option> | |||
<option value="Okkultist">Okkultist</option> | |||
<option value="Pazifist">Pazifist</option> | |||
<option value="Politiker">Politiker</option> | |||
<option value="Revolutionär">Revolutionär</option> | |||
<option value="Seefahrer">Seefahrer</option> | |||
<option value="Spion">Spion</option> | |||
<option value="Mutant">Mutant</option> | |||
</select> | </select> | ||
<label for="rasse">Rasse:</label> | <label for="rasse">Rasse:</label> | ||
<select id="rasse"> | <select id="rasse"> | ||
<option value=""> | <option value="">Wähle...</option> | ||
<option value="Mensch">Mensch</option> | <option value="Mensch">Mensch</option> | ||
<option value="Elf">Elf</option> | <option value="Elf">Elf</option> | ||
</select> | </select> | ||
<label for=" | <label for="subrasse">Subrasse:</label> | ||
<select id=" | <select id="subrasse"> | ||
<option value="">Keine | <option value="">Keine Subrasse</option> | ||
<option value=" | <option value="Hochelf">Hochelf</option> | ||
<option value=" | <option value="Wüstenmensch">Wüstenmensch</option> | ||
</select> | </select> | ||
<label for=" | <label for="items">Anzahl gewählter Gegenstände:</label> | ||
<select id=" | <select id="items"> | ||
<option value="0"> | <option value="0">0 Gegenstände (+0 Punkte)</option> | ||
<option value="1">1 Gegenstand ( | <option value="1">1 Gegenstand (−10 Punkte)</option> | ||
<option value="2">2 Gegenstände ( | <option value="2">2 Gegenstände (−20 Punkte)</option> | ||
<option value="3">3 Gegenstände ( | <option value="3">3 Gegenstände (−30 Punkte)</option> | ||
</select> | </select> | ||
< | <table> | ||
<thead> | |||
<tr> | |||
<th>Attribut</th> | |||
<th>Wert</th> | |||
</tr> | |||
</thead> | |||
<tbody id="attributeTabelle"></tbody> | |||
</table> | |||
< | <p><strong>Verbleibende Punkte:</strong> <span id="remainingPoints">160</span></p> | ||
<button onclick=" | <button class="button" onclick="berechneWerte()">Charakterdaten anzeigen</button> | ||
<button onclick=" | <button class="button" onclick="exportiereDaten()">Charakterdaten exportieren</button> | ||
<div class="output" id="ausgabe"></div> | <div class="output" id="ausgabe"></div> | ||
<script> | <script> | ||
const attributeListe = [ | |||
"Agilität", "Ausdauer", "Charisma", "Geschick", "Intelligenz", | |||
"Konstitution", "Resistenz", "Stärke", "Wahrnehmung" | |||
]; | |||
const MAX_PUNKTE = 160; | |||
const basisBoni = () => { | |||
const boni = {}; | |||
attributeListe.forEach(attr => boni[attr] = 0); | |||
return boni; | |||
}; | |||
// Alle Klassen/Subklassen/Rassen/Subrassen starten mit 0 für alle Attribute | |||
const klassenBoni = { | |||
"Arbeiter": basisBoni(), | |||
"Barde": basisBoni(), | |||
"Bote": basisBoni(), | |||
"Gelehrter": basisBoni(), | |||
"Gläubiger": basisBoni(), | |||
"Kind": basisBoni(), | |||
"Krieger": basisBoni(), | |||
"Schurke": basisBoni(), | |||
"Schütze": basisBoni(), | |||
"Seelenkünstler": basisBoni(), | |||
"Soldat": basisBoni(), | |||
"Techniker": basisBoni(), | |||
"Vagabunde": basisBoni() | |||
}; | |||
const subklassenBoni = { | |||
"Auserwählter": basisBoni(), | |||
"Diener": basisBoni(), | |||
"Drogenjunkie": basisBoni(), | |||
"Dummkopf": basisBoni(), | |||
"Dunkler Künstler": basisBoni(), | |||
"Gesetzloser": basisBoni(), | |||
"Glücksspieler": basisBoni(), | |||
"Händler": basisBoni(), | |||
"Koch": basisBoni(), | |||
"Kopfgeldjäger": basisBoni(), | |||
"Ödländer": basisBoni(), | |||
"Okkultist": basisBoni(), | |||
"Pazifist": basisBoni(), | |||
"Politiker": basisBoni(), | |||
"Revolutionär": basisBoni(), | |||
"Seefahrer": basisBoni(), | |||
"Spion": basisBoni(), | |||
"Mutant": basisBoni() | |||
}; | |||
const rassenBoni = { | |||
"Mensch": basisBoni(), | |||
"Elf": basisBoni() | |||
}; | |||
const subrassenBoni = { | |||
"Hochelf": basisBoni(), | |||
"Wüstenmensch": basisBoni() | |||
}; | |||
function erstelleTabelle() { | |||
const tbody = document.getElementById("attributeTabelle"); | |||
tbody.innerHTML = ""; | |||
attributeListe.forEach(attr => { | |||
const tr = document.createElement("tr"); | |||
tr.innerHTML = `<td>${attr}</td> | |||
<td><input type="number" id="attr_${attr}" value="0" min="0" onchange="updateRemainingPoints()"></td>`; | |||
tbody.appendChild(tr); | |||
}); | |||
} | |||
function getBoni() { | |||
let bonus = {}; | |||
attributeListe.forEach(attr => bonus[attr] = 0); | |||
const klasse = document.getElementById("klasse").value; | |||
const subklasse = document.getElementById("subklasse").value; | |||
const rasse = document.getElementById("rasse").value; | |||
const subrasse = document.getElementById("subrasse").value; | |||
[klassenBoni[klasse], subklassenBoni[subklasse], rassenBoni[rasse], subrassenBoni[subrasse]].forEach(obj => { | |||
if (obj) { | |||
for (let key in obj) { | |||
bonus[key] += obj[key] || 0; | |||
} | |||
} | |||
}); | |||
return bonus; | |||
} | |||
function berechnePunkteBonus() { | |||
let bonus = 0; | |||
if (!document.getElementById("subklasse").value) bonus += 15; | |||
if (!document.getElementById("subrasse").value) bonus += 20; | |||
const gegenstände = parseInt(document.getElementById("items").value); | |||
bonus -= (gegenstände * 10); | |||
return bonus; | |||
} | |||
function updateRemainingPoints() { | |||
let summe = 0; | |||
attributeListe.forEach(attr => { | |||
summe += parseInt(document.getElementById("attr_" + attr).value) || 0; | |||
}); | |||
const verbleibend = MAX_PUNKTE + berechnePunkteBonus() - summe; | |||
document.getElementById("remainingPoints").textContent = verbleibend; | |||
} | |||
} | |||
const daten = { | function berechneWerte() { | ||
const name = document.getElementById("name").value; | |||
const daten = { | |||
Name: name, | |||
Klasse: document.getElementById("klasse").value, | |||
Subklasse: document.getElementById("subklasse").value, | |||
Rasse: document.getElementById("rasse").value, | |||
Subrasse: document.getElementById("subrasse").value, | |||
Gegenstände: document.getElementById("items").value, | |||
Attribute: {} | |||
}; | |||
attributeListe.forEach(attr => { | |||
daten.Attribute[attr] = parseInt(document.getElementById("attr_" + attr).value) || 0; | |||
}); | |||
document.getElementById("ausgabe").textContent = JSON.stringify(daten, null, 2); | |||
} | } | ||
function exportiereDaten() { | |||
const ausgabe = document.getElementById("ausgabe").textContent; | |||
if (!ausgabe) return alert("Bitte erst Charakter berechnen!"); | |||
const blob = new Blob([ausgabe], { type: "application/json" }); | |||
const url = URL.createObjectURL(blob); | |||
const a = document.createElement("a"); | |||
a.href = url; | |||
a.download = "charakter.json"; | |||
a.click(); | |||
URL.revokeObjectURL(url); | |||
} | |||
document.addEventListener("DOMContentLoaded", () => { | |||
document.addEventListener("DOMContentLoaded", | erstelleTabelle(); | ||
document.querySelectorAll("select").forEach(el => { | |||
el.addEventListener("change", updateRemainingPoints); | |||
}); | |||
}); | |||
</script> | |||
}); | </body> | ||
</ | |||
</html> | </html> | ||
Version vom 26. Juli 2025, 11:32 Uhr
<!DOCTYPE html>
Charakter Creator
| Attribut | Wert |
|---|
Verbleibende Punkte: 160
