Flashlight - 3D Platformer

Instructions: Arrow keys to move the camera, wasd to move, space to jump, and 1 and 2 to move the flashlight.\nThis is a normal 3D platformer but with limited eyesight.

@Stage\n\nwhen flag clicked\nforever\n    play sound [unity v] until done\nend\n\n@3D\n\ndefine Sort Lists\nset [passes v] to [0]\nset [switches v] to [0]\nrepeat until <<(Passes) > [0]> and <(Switches) = [0]>>\n    set [list_item v] to [0]\n    change [passes v] by (1)\n    set [switches v] to [0]\n    repeat ((length of [block distances v]) - (1))\n        change [list_item v] by (1)\n        if <(item ((List_Item) + (1)) of [block distances v]) > (item (List_Item) of [block distances v])> then\n            set [value v] to (item ((List_Item) + (1)) of [block distances v])\n            replace item ((List_Item) + (1)) of [block distances v] with (item (List_Item) of [block distances v])\n            replace item (List_Item) of [block distances v] with (value)\n            set [value v] to (item ((List_Item) + (1)) of [cube y pos v])\n            replace item ((List_Item) + (1)) of [cube y pos v] with (item (List_Item) of [cube y pos v])\n            replace item (List_Item) of [cube y pos v] with (value)\n            set [value v] to (item ((List_Item) + (1)) of [cube x pos v])\n            replace item ((List_Item) + (1)) of [cube x pos v] with (item (List_Item) of [cube x pos v])\n            replace item (List_Item) of [cube x pos v] with (value)\n            set [value v] to (item ((List_Item) + (1)) of [cube z pos v])\n            replace item ((List_Item) + (1)) of [cube z pos v] with (item (List_Item) of [cube z pos v])\n            replace item (List_Item) of [cube z pos v] with (value)\n            set [value v] to (item ((List_Item) + (1)) of [platform type v])\n            replace item ((List_Item) + (1)) of [platform type v] with (item (List_Item) of [platform type v])\n            replace item (List_Item) of [platform type v] with (value)\n            change [switches v] by (1)\n        end\n    end\nend\n\ndefine Distance\ndelete all of [block distances v]\nset [iii v] to [0]\nrepeat (length of [cube x pos v])\n    change [iii v] by (1)\n    add (round ([sqrt v] of ((((cam z) - (item (iii) of [cube z pos v])) * ((cam z) - (item (iii) of [cube z pos v]))) + ((((cam y) - (item (iii) of [cube y pos v])) * ((cam y) - (item (iii) of [cube y pos v]))) + (((cam x) - (item (iii) of [cube x pos v])) * ((cam x) - (item (iii) of [cube x pos v]))))) )) to [block distances v]\nend\n\ndefine Set Point 1: (x1) (y1) (z1)\nset [x1 v] to (x1)\nset [y1 v] to (y1)\nset [z1 v] to (z1)\n\ndefine Set Point 2: (x2) (y2) (z2)\nset [x2 v] to (x2)\nset [y2 v] to (y2)\nset [z2 v] to (z2)\n\ndefine Draw Line (x1) (y1) (z1) to (x2) (y2) (z2)\nSet Point 1: ((x1) - (cam x)) ((y1) - (cam y)) ((z1) - (cam z))\nSet Point 2: ((x2) - (cam x)) ((y2) - (cam y)) ((z2) - (cam z))\nSet Point 1: (((z1) * (sin Y)) + ((x1) * (cos Y))) (y1) (((z1) * (cos Y)) - ((x1) * (sin Y)))\nSet Point 2: (((z2) * (sin Y)) + ((x2) * (cos Y))) (y2) (((z2) * (cos Y)) - ((x2) * (sin Y)))\nSet Point 1: (x1) (((y1) * (cos X)) - ((z1) * (sin X))) (((y1) * (sin X)) + ((z1) * (cos X)))\nSet Point 2: (x2) (((y2) * (cos X)) - ((z2) * (sin X))) (((y2) * (sin X)) + ((z2) * (cos X)))\nif <not <<(z1) < (near plane)> and <(z2) < (near plane)>>> then\n    Z Clipping\n    Set Screen Point 1: ((view factor) * ((x1) / (z1))) ((view factor) * ((y1) / (z1)))\n    Set Screen Point 2: ((view factor) * ((x2) / (z2))) ((view factor) * ((y2) / (z2)))\n    XY Clipping\n    go to x: (x1) y: (y1)\n    pen down\n    go to x: (x2) y: (y2)\n    pen up\nend\n\ndefine Set Screen Point 1: (x1) (y1)\nset [x1 v] to (x1)\nset [y1 v] to (y1)\n\ndefine Set Screen Point 2: (x2) (y2)\nset [x2 v] to (x2)\nset [y2 v] to (y2)\n\ndefine Put Cube at (x) (y) (z) (platform type)\nCalculate Trig Values\nSelect color (platform type)\nset pen (brightness v) to (((600) - (item (ii) of [block distances v])) / (3))\nDraw Square ((x) * (100)) ((y) * (100)) ((50) + ((z) * (100)))\nDraw Line ((50) + ((x) * (100))) ((50) + ((y) * (100))) ((50) + ((z) * (100))) to ((50) + ((x) * (100))) ((50) + ((y) * (100))) ((-50) + ((z) * (100)))\nDraw Line ((50) + ((x) * (100))) ((-50) + ((y) * (100))) ((50) + ((z) * (100))) to ((50) + ((x) * (100))) ((-50) + ((y) * (100))) ((-50) + ((z) * (100)))\nDraw Line ((-50) + ((x) * (100))) ((-50) + ((y) * (100))) ((50) + ((z) * (100))) to ((-50) + ((x) * (100))) ((-50) + ((y) * (100))) ((-50) + ((z) * (100)))\nDraw Line ((-50) + ((x) * (100))) ((50) + ((y) * (100))) ((50) + ((z) * (100))) to ((-50) + ((x) * (100))) ((50) + ((y) * (100))) ((-50) + ((z) * (100)))\nDraw Square ((x) * (100)) ((y) * (100)) ((-50) + ((z) * (100)))\n\ndefine Calculate Trig Values\nset [sin x v] to ([sin v] of (rot Y) )\nset [cos x v] to ([cos v] of (rot Y) )\nset [sin y v] to ([sin v] of (rot X) )\nset [cos y v] to ([cos v] of (rot X) )\n\ndefine Z Clipping\nif <<(z1) < (near plane)> or <(z2) < (near plane)>> then\n    set [percent v] to (((near plane) - (z1)) / ((z2) - (z1)))\n    if <(z1) < (near plane)> then\n        Set Point 1: ((x1) + (((x2) - (x1)) * (percent))) ((y1) + (((y2) - (y1)) * (percent))) (near plane)\n    else\n        if <(z2) < (near plane)> then\n            Set Point 2: ((x1) + (((x2) - (x1)) * (percent))) ((y1) + (((y2) - (y1)) * (percent))) (near plane)\n        end\n    end\nend\n\ndefine XY Clipping\nset [m v] to (((y2) - (y1)) / ((x2) - (x1)))\nif <(x1) > [240]> then\n    if <(x2) > [240]> then\n        stop [this script v]\n    else\n        Set Screen Point 1: (240) ((y1) + (((240) - (x1)) * (m)))\n    end\nend\nif <(y1) > [180]> then\n    if <(y2) > [180]> then\n        stop [this script v]\n    else\n        Set Screen Point 1: ((x1) + (((180) - (y1)) / (m))) (180)\n    end\nend\nif <(x1) < [-240]> then\n    if <(x2) < [-240]> then\n        stop [this script v]\n    else\n        Set Screen Point 1: (-240) ((y1) + (((-240) - (x1)) * (m)))\n    end\nend\nif <(y1) < [-180]> then\n    if <(y2) < [-180]> then\n        stop [this script v]\n    else\n        Set Screen Point 1: ((x1) + (((-180) - (y1)) / (m))) (-180)\n    end\nend\nif <(x2) > [240]> then\n    Set Screen Point 2: (240) ((y1) + (((240) - (x1)) * (m)))\nend\nif <(y2) > [180]> then\n    Set Screen Point 2: ((x1) + (((180) - (y1)) / (m))) (180)\nend\nif <(x2) < [-240]> then\n    Set Screen Point 2: (-240) ((y1) + (((-240) - (x1)) * (m)))\nend\nif <(y2) < [-180]> then\n    Set Screen Point 2: ((x1) + (((-180) - (y1)) / (m))) (-180)\nend\n\ndefine Turn and Move\nif <key (up arrow v) pressed?> then\n    change [rot y v] by (4)\nend\nif <key (left arrow v) pressed?> then\n    change [rot x v] by (4)\nend\nif <key (right arrow v) pressed?> then\n    change [rot x v] by (-4)\nend\nif <key (down arrow v) pressed?> then\n    change [rot y v] by (-4)\nend\nif <key (w v) pressed?> then\n    change [zvel v] by ((2) * (cos Y))\n    change [xvel v] by ((-2) * (sin Y))\nend\nif <key (s v) pressed?> then\n    change [zvel v] by ((-2) * (cos Y))\n    change [xvel v] by ((2) * (sin Y))\nend\nif <key (a v) pressed?> then\n    change [zvel v] by ((-2) * (sin Y))\n    change [xvel v] by ((-2) * (cos Y))\nend\nif <key (d v) pressed?> then\n    change [zvel v] by ((2) * (sin Y))\n    change [xvel v] by ((2) * (cos Y))\nend\nif <<mouse down?> and <<<(mouse y) < [-80]> and <(mouse y) > [-110]>> and <<(mouse x) < [-175]> and <(mouse x) > [-205]>>>> then\n    change [zvel v] by ((2) * (cos Y))\n    change [xvel v] by ((-2) * (sin Y))\nend\nif <<mouse down?> and <<<(mouse y) < [-150]> and <(mouse y) > [-180]>> and <<(mouse x) < [-175]> and <(mouse x) > [-205]>>>> then\n    change [zvel v] by ((-2) * (cos Y))\n    change [xvel v] by ((2) * (sin Y))\nend\nif <<mouse down?> and <<<(mouse y) < [-115]> and <(mouse y) > [-145]>> and <<(mouse x) < [-140]> and <(mouse x) > [-170]>>>> then\n    change [zvel v] by ((2) * (sin Y))\n    change [xvel v] by ((2) * (cos Y))\nend\nif <<mouse down?> and <<<(mouse y) < [-115]> and <(mouse y) > [-145]>> and <<(mouse x) < [-210]> and <(mouse x) > [-240]>>>> then\n    change [zvel v] by ((-2) * (sin Y))\n    change [xvel v] by ((-2) * (cos Y))\nend\nif <(rot Y) < [-90]> then\n    set [rot y v] to [-90]\nend\nif <[90] < (rot Y)> then\n    set [rot y v] to [90]\nend\nPhysics\n\ndefine Collisions!\nset [touching platform? v] to [no]\nset [touching end v] to [no]\nset [i v] to [0]\nrepeat (length of [cube x pos v])\n    change [i v] by (1)\n    if <<<not <(cam y) < ((item (i) of [cube y pos v]) - (90))>> and <not <(cam y) > ((item (i) of [cube y pos v]) + (130))>>> and <<<not <(cam z) < ((item (i) of [cube z pos v]) - (60))>> and <not <(cam z) > ((item (i) of [cube z pos v]) + (60))>>> and <<not <(cam x) < ((item (i) of [cube x pos v]) - (60))>> and <not <(cam x) > ((item (i) of [cube x pos v]) + (60))>>>>> then\n        if <(item (i) of [platform type v]) = [Platform]> then\n            set [touching platform? v] to [yes]\n        else\n            if <(item (i) of [platform type v]) = [Lava]> then\n                Reset\n            else\n                if <(item (i) of [platform type v]) = [Trampoline]> then\n                    start sound [Boing v]\n                    set [y vel v] to [40]\n                else\n                    set [touching end v] to [yes]\n                end\n            end\n        end\n        stop [this script v]\n    end\nend\n\ndefine Physics\nchange [falling? v] by (1)\nchange [y vel v] by (-1)\nchange [cam y v] by (Y vel)\nCollisions!\nif <(Touching platform?) = [yes]> then\n    Y collision (Y vel)\nend\nchange [cam z v] by (Zvel)\nCollisions!\nif <(Touching platform?) = [yes]> then\n    Z Collision (Zvel)\nend\nchange [cam x v] by (Xvel)\nCollisions!\nif <(Touching platform?) = [yes]> then\n    X Collisions (Xvel)\nend\nset [zvel v] to ((Zvel) * (0.7))\nset [xvel v] to ((Xvel) * (0.7))\nif <<key (space v) pressed?> and <(Falling?) < [5]>> then\n    set [y vel v] to [14]\nend\nif <<<mouse down?> and <<<<(mouse y) < [-115]> and <(mouse y) > [-145]>> and <<(mouse x) < [-175]> and <(mouse x) > [-205]>>> or <<<(mouse y) < [-115]> and <(mouse y) > [-145]>> and <<(mouse x) < [175]> and <(mouse x) > [205]>>>>> and <(Falling?) < [5]>> then\n    set [y vel v] to [14]\nend\nif <(cam y) < [-500]> then\n    Reset\nend\nRender\n\ndefine Y collision (y)\nrepeat until <not <(Touching platform?) = [yes]>>\n    if <(y) > [0]> then\n        change [cam y v] by (-1)\n    else\n        change [cam y v] by (1)\n        set [falling? v] to [0]\n    end\n    set [y vel v] to [0]\n    Collisions!\nend\n\ndefine Z Collision (z)\nrepeat until <not <(Touching platform?) = [yes]>>\n    if <(z) > [0]> then\n        change [cam z v] by (-1)\n    else\n        change [cam z v] by (1)\n    end\n    set [zvel v] to [0]\n    Collisions!\nend\n\ndefine X Collisions (x)\nrepeat until <not <(Touching platform?) = [yes]>>\n    if <(x) > [0]> then\n        change [cam x v] by (-1)\n    else\n        change [cam x v] by (1)\n    end\n    set [xvel v] to [0]\n    Collisions!\nend\n\ndefine Reset\nset [view factor v] to [200]\nset [cam speed v] to [6]\nset [cam x v] to [0]\nset [cam y v] to [150]\nset [cam z v] to [0]\nset [rot x v] to [0]\nset [rot y v] to [0]\nset [near plane v] to [1]\nset [y vel v] to [0]\n\nwhen flag clicked\nreset timer\nerase all\nset [level v] to [1]\n\ndefine Level\ndelete all of [cube y pos v]\ndelete all of [cube x pos v]\ndelete all of [cube z pos v]\ndelete all of [platform type v]\nif <(Level) = [1]> then\n    Level design [0] [0] [0] [Platform]\n    Level design [0] [0] [1] [Lava]\n    Level design [0] [0] [2] [Platform]\n    Level design [0] [0] [3] [End]\nelse\n    if <(Level) = [2]> then\n        Level design [0] [0] [0] [Platform]\n        Level design [0] [1] [1] [Platform]\n        Level design [0] [2] [2] [Platform]\n        Level design [0] [2] [3] [Platform]\n        Level design [0] [0] [4] [End]\n    else\n        if <(Level) = [3]> then\n            Level design [0] [0] [0] [Platform]\n            Level design [0] [0] [1] [Lava]\n            Level design [0] [0] [2] [Trampoline]\n            Level design [0] [5] [3] [Platform]\n            Level design [0] [5] [4] [End]\n        else\n            if <(Level) = [4]> then\n                Level design [0] [0] [0] [Platform]\n                Level design [1] [0] [0] [Lava]\n                Level design [2] [0] [0] [Platform]\n                Level design [2] [0] [1] [Trampoline]\n                Level design [2] [5] [2] [End]\n            else\n                if <(Level) = [5]> then\n                    Level design [0] [0] [0] [Platform]\n                    Level design [1] [0] [0] [Lava]\n                    Level design [2] [0] [0] [Platform]\n                    Level design [2] [0] [1] [Lava]\n                    Level design [2] [0] [2] [Platform]\n                    Level design [2] [1] [3] [Platform]\n                    Level design [1] [1] [3] [Lava]\n                    Level design [0] [1] [3] [Trampoline]\n                    Level design [-1] [4] [4] [Platform]\n                    Level design [-1] [4] [5] [End]\n                else\n                    if <(Level) = [6]> then\n                        Level design [0] [0] [0] [Platform]\n                        Level design [0] [0] [1] [Platform]\n                        Level design [0] [1] [1] [Platform]\n                        Level design [0] [0] [2] [End]\n                        Level design [0] [1] [-1] [Platform]\n                        Level design [0] [2] [-2] [Trampoline]\n                        Level design [0] [7] [0] [Platform]\n                        Level design [0] [2] [1] [Platform]\n                    else\n                        if <(Level) = [7]> then\n                            Level design [0] [0] [0] [Platform]\n                            Level design [0] [0] [1] [Platform]\n                            Level design [0] [1] [1] [Platform]\n                            Level design [0] [1] [2] [Lava]\n                            Level design [0] [0] [2] [End]\n                            Level design [0] [-2] [3] [Platform]\n                        else\n                            if <(Level) = [8]> then\n                                Level design [0] [0] [0] [Platform]\n                                Level design [0] [0] [1] [Platform]\n                                Level design [0] [1] [1] [Platform]\n                                Level design [0] [0] [2] [Lava]\n                                Level design [0] [0] [3] [Lava]\n                                Level design [0] [0] [4] [Trampoline]\n                                Level design [0] [5] [5] [End]\n                            else\n                                broadcast (message1 v)\n                            end\n                        end\n                    end\n                end\n            end\n        end\n    end\nend\n\ndefine Render\nDistance\nSort Lists\nset pen size to (8)\nset [ii v] to [0]\nrepeat (length of [cube x pos v])\n    change [ii v] by (1)\n    if <(item (ii) of [block distances v]) < [700]> then\n        Put Cube at ((item (ii) of [cube x pos v]) / (100)) ((item (ii) of [cube y pos v]) / (100)) ((item (ii) of [cube z pos v]) / (100)) (item (ii) of [platform type v])\n    end\nend\nDraw Frame\nDraw Controls\nset pen color to (#ffffff)\nset pen size to (5)\ngo to x: (-10) y: (0)\npen down\ngo to x: (10) y: (0)\npen up\ngo to x: (0) y: (-10)\npen down\ngo to x: (0) y: (10)\npen up\n\ndefine Draw Frame\nset pen size to (10)\nset pen color to (#000000)\ngo to x: (-240) y: (-180)\npen down\ngo to x: (-240) y: (180)\ngo to x: (240) y: (180)\ngo to x: (240) y: (-180)\ngo to x: (-240) y: (-180)\npen up\n\nwhen flag clicked\nforever\n    if <mouse down?> then\n        set [old mouse x v] to (mouse x)\n        set [old mouse y v] to (mouse y)\n        wait (0.000001) seconds\n        if <not <<<(mouse y) < [-80]> and <(mouse x) < [-140]>> and <(mouse y) < [-80]>>> then\n            change [rot y v] by (((mouse y) - (Old Mouse Y)) / (0.7))\n            change [rot x v] by (((Old Mouse X) - (mouse x)) / (0.7))\n        end\n    end\nend\n\ndefine Select color (current platform type)\nif <(current platform type) = [Platform]> then\n    set pen color to (#327af7)\nelse\n    if <(current platform type) = [Lava]> then\n        set pen color to (#ff3333)\n    else\n        if <(current platform type) = [Trampoline]> then\n            set pen color to (#fff830)\n        else\n            set pen color to (#33ff30)\n        end\n    end\nend\n\ndefine Level design (x) (y) (z) (type)\nadd ((x) * (100)) to [cube x pos v]\nadd ((y) * (100)) to [cube y pos v]\nadd ((z) * (100)) to [cube z pos v]\nadd (type) to [platform type v]\n\ndefine --- (label)\n\ndefine Draw Square (x) (y) (z)\nDraw Line ((50) + (x)) ((50) + (y)) (z) to ((50) + (x)) ((-50) + (y)) (z)\nDraw Line ((50) + (x)) ((-50) + (y)) (z) to ((-50) + (x)) ((-50) + (y)) (z)\nDraw Line ((-50) + (x)) ((-50) + (y)) (z) to ((-50) + (x)) ((50) + (y)) (z)\nDraw Line ((-50) + (x)) ((50) + (y)) (z) to ((50) + (x)) ((50) + (y)) (z)\n\nwhen flag clicked\n\nforever\nend\n\ndefine Draw Controls\n\nif  then\n    change [rot y v] by (((mouse y) - (Old Mouse Y)) / (0.7))\n    change [rot x v] by (((Old Mouse X) - (mouse x)) / (0.7))\nend\nreset timer\nwait until <mouse down?>\nif <<<not <(mouse y) < [-80]>> and <not <(mouse x) < [-140]>>> and <mouse down?>> then\n    if <<<not <(mouse y) < [-80]>> and <not <(mouse x) < [-140]>>> and <mouse down?>> then\n        wait until <not <mouse down?>>\n    end\n    wait until <mouse down?>\n    if <<<not <(mouse y) < [-80]>> and <not <(mouse x) < [-140]>>> and <mouse down?>> then\n        wait until <not <mouse down?>>\n    end\n    wait until <mouse down?>\n    if <<<not <(mouse y) < [-80]>> and <not <(mouse x) < [-140]>>> and <mouse down?>> then\n        wait until <not <mouse down?>>\n    end\nend\n\nwhen [0 v] key pressed\nchange [level v] by (1)\nLevel\nReset\n\nwhen I receive [start v]\nLevel\nReset\nforever\n    erase all\n    Turn and Move\n    change [ticks in a time v] by (1)\n    if <(Touching end) = [yes]> then\n        change [level v] by (1)\n        Level\n        Reset\n    end\nend\n\n@Sprite1\n\nwhen flag clicked\nhide\n\nwhen I receive [start v]\nshow\ngo to x: (0) y: (0)\npoint in direction (90)\nforever\n    if <key (1 v) pressed?> then\n        change x by (-3)\n    end\n    if <key (2 v) pressed?> then\n        change x by (3)\n    end\n    if <(x position) < [-115]> then\n        set x to (-115)\n    end\n    if <[115] < (x position)> then\n        set x to (115)\n    end\nend\n\n@Sprite2\n\nwhen flag clicked\ngo to x: (0) y: (0)\nshow\ngo to [front v] layer\nset [ghost v] effect to (100)\n\nwhen I receive [message1 v]\nrepeat (20)\n    change [ghost v] effect by (-5)\nend\n\n@Sprite3\n\nwhen flag clicked\ngo to x: (0) y: (0)\nshow\nset [ghost v] effect to (100)\nforever\n    go to [front v] layer\nend\n\n@intro\n\nwhen flag clicked\nset volume to (100) %\nstart sound [Super intro v]\nswitch costume to (screen shot 2020-07-06 at 3 v)\nset size to (100) %\nerase all\nhide\nset [ghost v] effect to (0)\npen up\ngo to x: (-231) y: (-240)\nset pen size to (100)\nset pen color to (#00f307)\npen down\nrepeat (3)\n    point in direction (0)\n    repeat (20)\n        move (20) steps\n    end\n    point in direction (90)\n    repeat (5)\n        move (20) steps\n    end\n    point in direction (180)\n    repeat (20)\n        move (20) steps\n    end\n    point in direction (90)\n    repeat (5)\n        move (20) steps\n    end\nend\npen up\nshow\ngo to x: (0) y: (0)\nset [ghost v] effect to (100)\nrepeat (10)\n    change [ghost v] effect by (-10)\nend\nset size to (200) %\npoint in direction (90)\nshow\nrepeat (20)\n    change size by (-10)\n    turn right (10) degrees\nend\nrepeat (10)\n    change size by (20)\n    turn right (10) degrees\nend\npoint in direction (90)\nrepeat (10)\n    change size by (-10)\nend\nwait (.5) seconds\nrepeat (20)\n    turn right (18) degrees\n    create clone of (_myself_ v)\nend\nrepeat (10)\n    change [ghost v] effect by (10)\nend\nhide\nerase all\nbroadcast (start v)\nerase all\ndelete this clone\n\nwhen flag clicked\nforever\n    set pen color to (#00f307)\n    wait (.5) seconds\n    repeat (17)\n        change pen (color v) by (-1)\n    end\n    set pen color to (#ffe900)\n    wait (.5) seconds\n    repeat (14)\n        change pen (color v) by (-1)\n    end\n    set pen color to (#ff0000)\n    wait (.5) seconds\n    repeat (32)\n        change pen (color v) by (1)\n    end\nend\n\nwhen I start as a clone\nswitch costume to (costume1 v)\nset pen size to (100)\nset pen color to (#ffffff)\npen down\nrepeat until <touching (_edge_ v)?>\n    move (15) steps\nend\ndelete this clone\n\n