# taal: nl

# LASERDOOLHOF 3D — bouw een wereld en verken hem daarna door een camera.
# Klik Uitvoeren en klik in Live preview om te schieten. W/S of OMHOOG/OMLAAG: lopen; A/D of LINKS/RECHTS: draaien.
# Q/E: opzij; LINKERMUISKNOP of SPATIE: schieten; R: opnieuw; ESC of Stop in de IDE: afsluiten.
# Schakel alle zes oranje oefendrones uit. Stevige muren blokkeren lopen en schieten.
# X gaat opzij over de kaart, Y gaat omhoog en Z gaat naar beneden over de kaart.
# Verander muurhoogten, droneposities, turnSpeed of moveSpeed.

laat world = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1],
    [1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1],
    [1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1],
    [1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1],
    [1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1],
    [1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
laat targetX = [5.5, 8.5, 10.5, 2.5, 6.5, 9.5]
laat targetZ = [2.5, 2.5, 6.5, 7.5, 6.5, 8.5]
# Elke drone is een klein model van dozen en vier cilindervormige motoren.
# Bewaar alle onderdeelnamen samen zodat een treffer de hele drone verwijdert.
laat partSuffixes = [
    "", "-canopy",
    "-arm-0", "-arm-1", "-arm-2", "-arm-3",
    "-motor-0", "-motor-1", "-motor-2", "-motor-3",
    "-blade-0-0", "-blade-0-1", "-blade-1-0", "-blade-1-1",
    "-blade-2-0", "-blade-2-1", "-blade-3-0", "-blade-3-1"
]
laat motorX = [-0.27, 0.27, -0.27, 0.27]
laat motorZ = [-0.27, -0.27, 0.27, 0.27]
laat rotorDirections = [1, 1, -1, -1, -1, -1, 1, 1]
laat droneParts = herhaalLijst(6, [])
laat droneRotors = herhaalLijst(6, [])
laat hitTargets = herhaalLijst(6, onwaar)
laat score = 0
laat shots = 0
laat moveSpeed = 0.10
laat turnSpeed = 3
laat flashFrames = 0
laat hitFlash = onwaar
laat spaceWasDown = onwaar
laat restartWasDown = onwaar

functie finishPart(name, x, y, z, color):
    plaats3D(name, x, y, z)
    kleur3D(name, color)
    stevig3D(name, onwaar)

functie createDrone(index):
    laat name = "drone-" + tekst(index)
    laat x = targetX[index]
    laat z = targetZ[index]
    laat parts = herhaalLijst(lengte(partSuffixes), "")
    laat part = 0
    zolang part < lengte(partSuffixes):
        zet parts[part] = name + partSuffixes[part]
        zet part = part + 1
    zet droneParts[index] = parts
    laat rotors = herhaalLijst(8, "")
    # De romp blijft op ooghoogte; zijn oorspronkelijke naam blijft het eerste doel.
    doos3D(name, 0.38, 0.20, 0.30)
    finishPart(name, x, 1.5, z, "#ffad52")
    doos3D(name + "-canopy", 0.23, 0.09, 0.21)
    finishPart(name + "-canopy", x, 1.625, z, "#55e6df")
    # Vier diagonale armen verbinden de romp met rechtopstaande cilindermotoren.
    laat motor = 0
    zolang motor < 4:
        laat arm = name + "-arm-" + tekst(motor)
        doos3D(arm, 0.39, 0.06, 0.065)
        finishPart(arm, x + motorX[motor] / 2, 1.60, z + motorZ[motor] / 2, "#e8b56a")
        laat angle = -45
        als motorX[motor] * motorZ[motor] > 0:
            zet angle = 45
        draai3D(arm, angle)
        laat hub = name + "-motor-" + tekst(motor)
        cilinder3D(hub, 0.075, 0.12)
        finishPart(hub, x + motorX[motor], 1.66, z + motorZ[motor], "#b7d1e6")
        # Twee dunne gekruiste bladen draaien boven elke motor, in tegengestelde paren.
        laat blade = 0
        zolang blade < 2:
            laat rotor = name + "-blade-" + tekst(motor) + "-" + tekst(blade)
            doos3D(rotor, 0.36, 0.025, 0.045)
            finishPart(rotor, x + motorX[motor], 1.735, z + motorZ[motor], "#f3f7ff")
            draai3D(rotor, motor * 17 + blade * 90)
            zet rotors[motor * 2 + blade] = rotor
            zet blade = blade + 1
        zet motor = motor + 1
    zet droneRotors[index] = rotors

functie resetGame():
    wis3D("#101c30")
    zet score = 0
    zet shots = 0
    zet flashFrames = 0
    zet hitFlash = onwaar
    zet hitTargets = herhaalLijst(lengte(targetX), onwaar)
    # De vloer is decoratie: hij blokkeert het lopen niet.
    doos3D("floor", 12, 0.2, 10)
    plaats3D("floor", 6, -0.1, 5)
    kleur3D("floor", "#263b51")
    textuur3D("floor", "checker", 1)
    stevig3D("floor", onwaar)
    laat row = 0
    zolang row < lengte(world):
        laat column = 0
        zolang column < lengte(world[row]):
            als world[row][column] != 0:
                laat name = "wall-" + tekst(row) + "-" + tekst(column)
                doos3D(name, 1, 3, 1)
                plaats3D(name, column + 0.5, 1.5, row + 0.5)
                kleur3D(name, "#527a96")
                textuur3D(name, "brick", 2)
                als world[row][column] == 2:
                    kleur3D(name, "#7863ac")
            zet column = column + 1
        zet row = row + 1
    laat index = 0
    zolang index < lengte(targetX):
        createDrone(index)
        zet index = index + 1
    camera3D(2.5, 1.5, 2.5)
    kijkNaar3D(5.5, 1.5, 2.5)

functie fireLaser():
    als score == lengte(targetX):
        geef
    zet shots = shots + 1
    zet flashFrames = 3
    zet hitFlash = onwaar
    # Het dichtstbijzijnde object telt: een muur voor een drone blokkeert de laser.
    laat target = richt3D(30)
    laat index = 0
    zolang index < lengte(targetX):
        als niet hitTargets[index]:
            # Elk zichtbaar onderdeel hoort bij een drone, maar muren blokkeren de straal nog steeds.
            voor part in droneParts[index]:
                als target == part:
                    voor piece in droneParts[index]:
                        verwijder3D(piece)
                    zet hitTargets[index] = waar
                    zet score = score + 1
                    zet hitFlash = waar
                    geef
        zet index = index + 1

functie updatePlayer():
    laat turn = 0
    als toetsIngedrukt("left") of toetsIngedrukt("a"):
        zet turn = turn - 1
    als toetsIngedrukt("right") of toetsIngedrukt("d"):
        zet turn = turn + 1
    # Draaien verandert de richting, bewegen verandert de positie.
    draaiCamera3D(turn * turnSpeed)
    laat forwardMove = 0
    laat sidewaysMove = 0
    als toetsIngedrukt("w") of toetsIngedrukt("up"):
        zet forwardMove = forwardMove + 1
    als toetsIngedrukt("s") of toetsIngedrukt("down"):
        zet forwardMove = forwardMove - 1
    als toetsIngedrukt("q"):
        zet sidewaysMove = sidewaysMove - 1
    als toetsIngedrukt("e"):
        zet sidewaysMove = sidewaysMove + 1
    laat speed = moveSpeed
    als forwardMove != 0 en sidewaysMove != 0:
        zet speed = speed * 0.707107
    # Pliro controleert stevige objecten en laat ons langs muren glijden.
    beweegCamera3D(forwardMove * speed, sidewaysMove * speed)

functie drawGame():
    laat index = 0
    zolang index < lengte(targetX):
        als niet hitTargets[index]:
            # Alleen de propellers draaien. De romp en armen behouden hun positie.
            laat rotor = 0
            zolang rotor < lengte(droneRotors[index]):
                draai3D(droneRotors[index][rotor], 18 * rotorDirections[rotor])
                zet rotor = rotor + 1
        zet index = index + 1
    # teken3D begint een volledig beeld. Gewone 2D-vormen tonen informatie erbovenop.
    teken3D()
    tekenLijn(307, 180, 315, 180, 2, "#ffffff")
    tekenLijn(325, 180, 333, 180, 2, "#ffffff")
    tekenLijn(320, 167, 320, 175, 2, "#ffffff")
    tekenLijn(320, 185, 320, 193, 2, "#ffffff")
    rechthoek(294, 280, 52, 54, "#17263c")
    rechthoek(309, 259, 22, 60, "#a6bbd2")
    als flashFrames > 0:
        tekenLijn(320, 260, 320, 180, 3, "#a8fff4")
        als hitFlash:
            tekenTekst(320, 209, "DRONE UITGESCHAKELD", 13, "#a8fff4", "sans", "center")
    rechthoek(0, 0, 640, 34, "#101828")
    tekenTekst(14, 9, "LASERDOOLHOF 3D", 16, "#8ffff0", "pixel")
    tekenTekst(292, 10, "DRONES " + tekst(score) + "/6", 13, "#ffffff")
    tekenTekst(469, 10, "SCHOTEN " + tekst(shots), 13, "#ffcf8d")
    rechthoek(0, 334, 640, 26, "#101828")
    tekenTekst(320, 342, "W/S lopen | A/D draaien | Q/E opzij | KLIK/SPATIE schieten | R opnieuw | ESC einde", 11, "#c9d7e8", "sans", "center")
    als score == lengte(targetX):
        rechthoek(124, 114, 392, 113, "#101828")
        tekenTekst(320, 133, "DOOLHOF VOLTOOID!", 23, "#8ffff0", "pixel", "center")
        tekenTekst(320, 175, "Zes drones uitgeschakeld in " + tekst(shots) + " schoten.", 14, "#ffffff", "sans", "center")
        tekenTekst(320, 204, "R: opnieuw spelen     ESC: afsluiten", 13, "#ffcf8d", "sans", "center")

# Spellus
wanneer aanwijzerGeklikt("primary"):
    fireLaser()

wanneer gestart():
    resetGame()
    zolang waar:
        als toetsIngedrukt("escape"):
            sluitApp()
        laat restartIsDown = toetsIngedrukt("r")
        als restartIsDown en niet restartWasDown:
            resetGame()
        laat spaceIsDown = toetsIngedrukt("space")
        als score < lengte(targetX):
            updatePlayer()
            als spaceIsDown en niet spaceWasDown:
                fireLaser()
        drawGame()
        als flashFrames > 0:
            zet flashFrames = flashFrames - 1
        zet spaceWasDown = spaceIsDown
        zet restartWasDown = restartIsDown
        wacht(0.04)
