Files
destruction-of-legacy/text_horror/app.js
2023-06-23 14:59:45 +02:00

217 lines
6.9 KiB
JavaScript

var speed = 50
var typeindex = 0
var dlgPointer = 0
var dlgFile
var dlgKeyMain = "main"
let dlgLines
var skipDlg = false
var answers
var keys
var allowNextDlg = true
var voice
var playerName
var enemyHealth = 0, enemyDamage = 1, enemyStartsHit = false;
var health = 25
var weaponName = "Fäuste", continueCount = true
let weaponDamage = 1
var counttx = 0, countup = true;
//TODO
//simple fights
//save file in local storage
window.addEventListener('contextmenu', (event) => {
event.preventDefault()
speed = 0
})
function load() {
fetch("text_horror/dialogue.json") //Load json file here
.then(Response => Response.json())
.then(data => {
dlgFile = data
changeDlg(dlgKeyMain) //Set "start" key from dialogue.json
skipDlg = true //Allow skipping to next dialogue
nextDlg(false) //Skip to first
});
}
function changeDlg(dlgKey) {
dlgPointer = 0;
if (typeof dlgFile[dlgKey] === "string") {
var oneline = [dlgFile[dlgKey]]
dlgLines = oneline
}
else if (Array.isArray(dlgFile[dlgKey]))
dlgLines = dlgFile[dlgKey]
}
function updateDlg() {
typeindex = 0
document.getElementById("dlg-text").innerHTML = ""
document.getElementById("triangle").hidden = true
typeWriter()
}
function typeWriter() {
if (typeindex < dlgLines[dlgPointer].length) {
document.getElementById("dlg-text").innerHTML += dlgLines[dlgPointer].charAt(typeindex)
if (voice != null && typeindex % 3 == 1) {
voice.load()
voice.play()
}
typeindex++;
setTimeout(typeWriter, speed)
} else if (allowNextDlg)
document.getElementById("triangle").hidden = false
}
function nextDlg(dlgPointerIncrease = true) {
speed = 50
if (document.getElementById("dlg-text").innerHTML.length == dlgLines[dlgPointer].length && allowNextDlg || skipDlg) {
skipDlg = false;
if (dlgPointerIncrease)
dlgPointer++
if (dlgPointer < dlgLines.length) {
if (typeof dlgLines[dlgPointer] === 'number') {
speed = 50 / dlgLines[dlgPointer]
skipDlg = true
nextDlg();
}
else if (typeof dlgLines[dlgPointer] === 'string') {
if (dlgLines[dlgPointer].startsWith("_")) {
skipDlg = true
if (dlgLines[dlgPointer].split(":")[0] === "_title") {
document.getElementById("title").innerHTML = dlgLines[dlgPointer].split(':')[1]
nextDlg();
}
else if (dlgLines[dlgPointer].split(":")[0] === "_voice") {
if (dlgLines[dlgPointer].split(':')[1].length != 0)
voice = new Audio("text_horror/assets/voices/" + dlgLines[dlgPointer].split(':')[1] + ".wav")
else
voice = null
nextDlg();
}
else if (dlgLines[dlgPointer].split(":")[0] === "_playsound") {
var sound
if (dlgLines[dlgPointer].split(':')[1].length != 0) {
sound = new Audio("text_horror/assets/sounds/" + dlgLines[dlgPointer].split(':')[1] + ".wav")
sound.load()
sound.play()
}
else
sound = null;
nextDlg();
}
else if (dlgLines[dlgPointer].split(":")[0] === "_jump") {
dlgKeyMain = dlgLines[dlgPointer].split(':')[1]
load()
}
else if (dlgLines[dlgPointer].split(":")[0] === "_lock") {
nextDlg();
}
else if (dlgLines[dlgPointer].split(":")[0] === "_weapon") {
weaponName = dlgLines[dlgPointer].split(':')[1]
weaponDamage = dlgLines[dlgPointer].split(':')[2]
console.log(weaponDamage)
nextDlg();
}
else if (dlgLines[dlgPointer].split(":")[0] === "_enemy") {
document.getElementById("enemy-name").innerHTML = dlgLines[dlgPointer].split(":")[1]
document.getElementById("enemy-texture").src = "text_horror/assets/textures/" + dlgLines[dlgPointer].split(":")[2] + ".png"
enemyHealth = dlgLines[dlgPointer].split(":")[3]
enemyDamage = dlgLines[dlgPointer].split(":")[4]
countWeaponDamage()
document.getElementById("enemy-health").innerHTML = enemyHealth
document.getElementById("weapon").innerHTML = weaponName
document.getElementById("health").innerHTML = health
document.getElementById("fight").style.visibility = "unset"
document.getElementById("dlg-text").innerHTML = ""
document.getElementById("bubble").hidden = true
document.getElementById("answer-box").hidden = true
document.getElementById("triangle").hidden = true
}
} else
updateDlg();
}
else if (typeof dlgLines[dlgPointer] === 'object') {
allowNextDlg = false;
document.getElementById("triangle").hidden = true
document.getElementById("answer-box").hidden = false
answers = document.getElementsByClassName("answer")
keys = Object.keys(dlgLines[dlgPointer])
for (let j = 0; j < keys.length; j++) {
answers.item(j).innerHTML = keys[j]
}
}
}
else {
document.getElementById("bubble").hidden = true
document.getElementById("answer-box").hidden = true
document.getElementById("triangle").hidden = true
}
}
}
function answered(answerId) {
dlgFile = dlgLines[dlgPointer]
document.getElementById("answer-box").hidden = true
changeDlg(document.getElementById(answerId).innerHTML)
allowNextDlg = true
skipDlg = true
nextDlg(false)
for (let j = 0; j < keys.length; j++) {
answers.item(j).innerHTML = ""
}
}
function fight() {
continueCount = false
if (!enemyStartsHit) {
if (!continueCount) {
enemyStartsHit = true
setTimeout(() => {
enemyHealth = enemyHealth - counttx
if (enemyHealth < 1) {
setTimeout(() => {
document.getElementById("fight").style.visibility = "hidden"
document.getElementById("bubble").hidden = false
document.getElementById("triangle").hidden = false
nextDlg()
}, 1000)
}
document.getElementById("enemy-health").innerHTML = enemyHealth
document.getElementById("weapon-damage").innerHTML = weaponDamage
setTimeout(() => {
health = health - enemyDamage
document.getElementById("health").innerHTML = health
if (health > 0) {
enemyStartsHit = false
continueCount = true
countWeaponDamage()
}
else
setTimeout(() => { document.getElementById("fight").style.visibility = "hidden" }, 1000)
}, 2000)
}, 100)
} else
countWeaponDamage()
}
}
function countWeaponDamage() {
if (countup) {
++counttx;
if (counttx >= weaponDamage)
countup = false;
}
else {
--counttx;
if (counttx <= 0)
countup = true;
}
document.getElementById("weapon-damage").innerHTML = counttx
if (continueCount)
setTimeout(countWeaponDamage, 100)
}