3D platformer

Instructions: w,a,s,d,Arrow keys

@Stage\n\n@.\n\n@3d\n\ndefine 선 긋기 (리스트 번호1) (리스트 번호2)\nset [색깔 v] to (item ((((리스트 번호1) - (((리스트 번호1) mod (8)) + (<((리스트 번호1) mod (8)) = [0]> * (8)))) / (8)) + (1)) of [정육면체 번호 v])\nif <not <((length of [x v]) - (8)) < (리스트 번호1)>> then\n    set pen size to (3)\n    if <(색깔) = [1]> then\n        set pen color to (#ffffff)\n    else\n        if <(색깔) = [2]> then\n            set pen color to (#ff0000)\n        else\n            if <(색깔) = [3]> then\n                set pen color to (#f6ff00)\n            else\n                if <(색깔) = [4]> then\n                    set pen color to (#00bfff)\n                else\n                    if <(색깔) = [5]> then\n                        set pen color to (#d400ff)\n                    end\n                end\n            end\n        end\n    end\n    set pen (brightness v) to (((((item (리스트 번호1) of [z v]) + (item (리스트 번호2) of [z v])) * (0.15)) + (100)) * (2))\nelse\n    set pen color to (#1dff00)\n    set pen size to (5)\n    set pen (brightness v) to ((((item (리스트 번호1) of [z v]) + (item (리스트 번호2) of [z v])) + (90)) * (2))\nend\nif <[0] < (((((item (리스트 번호1) of [z v]) + (item (리스트 번호2) of [z v])) * (0.15)) + (100)) * (2))> then\n    pen up\n    3d그리기 (item (리스트 번호1) of [x v]) (item (리스트 번호1) of [y v]) (item (리스트 번호1) of [z v])\n    pen down\n    3d그리기 (item (리스트 번호2) of [x v]) (item (리스트 번호2) of [y v]) (item (리스트 번호2) of [z v])\n    pen up\nend\n\ndefine 추가 (x) (y) (z)\nadd (x) to [x v]\nadd (y) to [y v]\nadd (z) to [z v]\n\ndefine 3d그리기 (x좌표) (y좌표) (z좌표)\ngo to x: (((x좌표) * (((z좌표) * (0.002)) + (1.5))) * (0.7)) y: (((y좌표) * (((z좌표) * (0.002)) + (1.5))) * (0.7))\n\ndefine 리스트 초기화\ndelete all of [정육면체 번호 v]\ndelete all of [x v]\ndelete all of [y v]\ndelete all of [z v]\ndelete all of [선 번호 v]\ndelete all of [선 z좌표 v]\ndelete all of [정육면체 x좌표 v]\ndelete all of [정육면체 y좌표 v]\ndelete all of [정육면체 z좌표 v]\ndelete all of [정육면체 한 변의 길이 v]\n정육면체 추가하기 [0] [0] [-100] [100] [1]\n정육면체 추가하기 [0] [100] [0] [100] [1]\n정육면체 추가하기 [0] [100] [200] [100] [3]\n정육면체 추가하기 [0] [-100] [0] [100] [4]\n정육면체 추가하기 [-100] [0] [0] [100] [1]\n정육면체 추가하기 [100] [0] [0] [100] [2]\n정육면체 추가하기 [0] [300] [100] [100] [1]\n\ndefine 이동하기\nset [이동하기 v] to [1]\nrepeat ((length of [선 번호 v]) / (2))\n    선 긋기 (item (이동하기) of [선 번호 v]) (item ((이동하기) + (1)) of [선 번호 v])\n    change [이동하기 v] by (2)\nend\n\ndefine 회전 (x회전) (y회전) (z회전) (현재)\n변환 모음 (item (현재) of [x v]) (item (현재) of [y v]) (item (현재) of [z v]) (x회전) (y회전) (z회전)\nreplace item (현재) of [x v] with (x변환)\nreplace item (현재) of [y v] with (y변환)\nreplace item (현재) of [z v] with (z변환)\nif <(현재) < (length of [z v])> then\n    회전 (x회전) (y회전) (z회전) ((현재) + (1))\nend\n\ndefine x좌표 변환 행렬 (x)\ndelete all of [회전 v]\nadd ([cos v] of (x) ) to [회전 v]\nadd [0] to [회전 v]\nadd ([sin v] of (x) ) to [회전 v]\nadd [0] to [회전 v]\nadd [1] to [회전 v]\nadd [0] to [회전 v]\nadd ((0) - ([sin v] of (x) )) to [회전 v]\nadd [0] to [회전 v]\nadd ([cos v] of (x) ) to [회전 v]\n\ndefine y좌표 변환 행렬 (y)\ndelete all of [회전 v]\nadd [1] to [회전 v]\nadd [0] to [회전 v]\nadd [0] to [회전 v]\nadd [0] to [회전 v]\nadd ([cos v] of (y) ) to [회전 v]\nadd ((0) - ([sin v] of (y) )) to [회전 v]\nadd [0] to [회전 v]\nadd ([sin v] of (y) ) to [회전 v]\nadd ([cos v] of (y) ) to [회전 v]\n\ndefine z좌표 변환 행렬 (z)\ndelete all of [회전 v]\nadd ([cos v] of (z) ) to [회전 v]\nadd ((0) - ([sin v] of (z) )) to [회전 v]\nadd [0] to [회전 v]\nadd ([sin v] of (z) ) to [회전 v]\nadd ([cos v] of (z) ) to [회전 v]\nadd [0] to [회전 v]\nadd [0] to [회전 v]\nadd [0] to [회전 v]\nadd [1] to [회전 v]\n\ndefine 변환 (x) (y) (z)\nset [x변환 v] to (((item (1) of [회전 v]) * (x)) + (((item (2) of [회전 v]) * (y)) + ((item (3) of [회전 v]) * (z))))\nset [y변환 v] to (((item (4) of [회전 v]) * (x)) + (((item (5) of [회전 v]) * (y)) + ((item (6) of [회전 v]) * (z))))\nset [z변환 v] to (((item (7) of [회전 v]) * (x)) + (((item (8) of [회전 v]) * (y)) + ((item (9) of [회전 v]) * (z))))\n\ndefine 변환 모음 (x) (y) (z) (x변화) (y변화) (z변화)\nx좌표 변환 행렬 (x변화)\n변환 (x) (y) (z)\ny좌표 변환 행렬 (y변화)\n변환 (x변환) (y변환) (z변환)\nz좌표 변환 행렬 (z변화)\n변환 (x변환) (y변환) (z변환)\n\ndefine 정육면체 추가하기 (x) (y) (z) (한변의 길이) (번호)\n추가 ((x) + ((한변의 길이) / (-2))) ((y) + ((한변의 길이) / (2))) ((z) + ((한변의 길이) / (2)))\n추가 ((x) + ((한변의 길이) / (2))) ((y) + ((한변의 길이) / (2))) ((z) + ((한변의 길이) / (2)))\n추가 ((x) + ((한변의 길이) / (2))) ((y) + ((한변의 길이) / (-2))) ((z) + ((한변의 길이) / (2)))\n추가 ((x) + ((한변의 길이) / (-2))) ((y) + ((한변의 길이) / (-2))) ((z) + ((한변의 길이) / (2)))\n추가 ((x) + ((한변의 길이) / (-2))) ((y) + ((한변의 길이) / (2))) ((z) + ((한변의 길이) / (-2)))\n추가 ((x) + ((한변의 길이) / (2))) ((y) + ((한변의 길이) / (2))) ((z) + ((한변의 길이) / (-2)))\n추가 ((x) + ((한변의 길이) / (2))) ((y) + ((한변의 길이) / (-2))) ((z) + ((한변의 길이) / (-2)))\n추가 ((x) + ((한변의 길이) / (-2))) ((y) + ((한변의 길이) / (-2))) ((z) + ((한변의 길이) / (-2)))\n선 추가 ((length of [z v]) - (7)) ((length of [z v]) - (6))\n선 추가 ((length of [z v]) - (6)) ((length of [z v]) - (5))\n선 추가 ((length of [z v]) - (5)) ((length of [z v]) - (4))\n선 추가 ((length of [z v]) - (4)) ((length of [z v]) - (7))\n선 추가 ((length of [z v]) - (3)) ((length of [z v]) - (2))\n선 추가 ((length of [z v]) - (2)) ((length of [z v]) - (1))\n선 추가 ((length of [z v]) - (1)) ((length of [z v]) - (0))\n선 추가 ((length of [z v]) - (0)) ((length of [z v]) - (3))\n선 추가 ((length of [z v]) - (7)) ((length of [z v]) - (3))\n선 추가 ((length of [z v]) - (6)) ((length of [z v]) - (2))\n선 추가 ((length of [z v]) - (5)) ((length of [z v]) - (1))\n선 추가 ((length of [z v]) - (4)) ((length of [z v]) - (0))\nadd (x) to [정육면체 x좌표 v]\nadd (y) to [정육면체 y좌표 v]\nadd (z) to [정육면체 z좌표 v]\nadd (한변의 길이) to [정육면체 한 변의 길이 v]\nadd (번호) to [정육면체 번호 v]\n\ndefine 검은색 배경\npen up\ngo to x: (0) y: (0)\nset pen color to (#000000)\nset pen size to (10000)\npen down\npen down\npen up\n\nwhen flag clicked\nbroadcast (시작 v)\n\nwhen I receive [시작 v]\n완전 초기화\nforever\n    pen up\n    조작키\n    리스트 초기화\n    물리엔진\n    좌표 바꾸기 (x좌표) (y좌표) (z좌표) [1]\n    정육면체 추가하기 [0] [0] [0] [50] []\n    회전 [0] [0] (x회전) [1]\n    회전 [0] (y회전) [0] [1]\n    선 긋는 순서 정하기\n    if <[1000] < (z좌표)> then\n        broadcast (게임끝 v)\n    end\n    erase all\n    검은색 배경\n    이동하기\n    wait (0.01) seconds\nend\n\ndefine 완전 초기화\nset [x회전 v] to [0]\nset [y회전 v] to [-45]\nset [x회전량 v] to [0]\nset [y회전량 v] to [0]\nset [x변환 v] to [0]\nset [x좌표 v] to [0]\nset [y좌표 v] to [0]\nset [z좌표 v] to [25]\nset [x좌표 이동량 v] to [0]\nset [y좌표 이동량 v] to [0]\nset [z좌표 이동량 v] to [0]\nset [점프가능? v] to [0]\nset [게임오버 v] to [0]\nset [단계 v] to [1]\n\ndefine 좌표 바꾸기 (x) (y) (z) (현재)\nreplace item (현재) of [x v] with ((item (현재) of [x v]) + (x))\nreplace item (현재) of [y v] with ((item (현재) of [y v]) + (y))\nreplace item (현재) of [z v] with ((item (현재) of [z v]) + (z))\nif <(현재) < (length of [x v])> then\n    좌표 바꾸기 (x) (y) (z) ((현재) + (1))\nend\n\ndefine 조작키\nif <key (up arrow v) pressed?> then\n    change [y회전량 v] by (-1)\nend\nif <key (down arrow v) pressed?> then\n    change [y회전량 v] by (1)\nend\nif <key (left arrow v) pressed?> then\n    change [x회전량 v] by (-1)\nend\nif <key (right arrow v) pressed?> then\n    change [x회전량 v] by (1)\nend\nif <key (w v) pressed?> then\n    change [x좌표 이동량 v] by (([sin v] of (x회전) ) * (1.5))\n    change [y좌표 이동량 v] by (([cos v] of (x회전) ) * (1.5))\nend\nif <key (s v) pressed?> then\n    change [x좌표 이동량 v] by (([sin v] of (x회전) ) * (-1.5))\n    change [y좌표 이동량 v] by (([cos v] of (x회전) ) * (-1.5))\nend\nif <key (a v) pressed?> then\n    change [x좌표 이동량 v] by (([cos v] of (x회전) ) * (-1.5))\n    change [y좌표 이동량 v] by (([sin v] of (x회전) ) * (1.5))\nend\nif <key (d v) pressed?> then\n    change [x좌표 이동량 v] by (([cos v] of (x회전) ) * (1.5))\n    change [y좌표 이동량 v] by (([sin v] of (x회전) ) * (-1.5))\nend\nif <key (space v) pressed?> then\n    if <(점프가능?) = [1]> then\n        set [z좌표 이동량 v] to [15]\n        set [점프가능? v] to [0]\n    end\nend\nif <(y회전) < [-180]> then\n    set [y회전 v] to [-180]\n    set [y회전량 v] to [0]\nend\nif <[0] < (y회전)> then\n    set [y회전 v] to [0]\n    set [y회전량 v] to [0]\nend\nchange [x회전 v] by (x회전량)\nchange [y회전 v] by (y회전량)\nset [x회전량 v] to ((x회전량) * (0.8))\nset [y회전량 v] to ((y회전량) * (0.8))\n\ndefine 선 추가 (선1) (선2)\nadd (선1) to [선 번호 v]\nadd (선2) to [선 번호 v]\n\ndefine 선 긋는 순서 정하기\n선 z좌표 구하기 [1]\n버블정렬 [1]\n\ndefine 선 z좌표 구하기 (현재)\nadd (((item (item (현재) of [선 번호 v]) of [z v]) + (item (item ((현재) + (1)) of [선 번호 v]) of [z v])) / (2)) to [선 z좌표 v]\nif <<[0] < (((((item (item (현재) of [선 번호 v]) of [z v]) + (item (item ((현재) + (1)) of [선 번호 v]) of [z v])) * (0.15)) + (100)) * (2))> and <(item (length of [선 z좌표 v]) of [선 z좌표 v]) < [3000]>> then\n    if <((현재) + (1)) < (length of [선 번호 v])> then\n        선 z좌표 구하기 ((현재) + (2))\n    end\nelse\n    delete (현재) of [선 번호 v]\n    delete (현재) of [선 번호 v]\n    delete (length of [선 z좌표 v]) of [선 z좌표 v]\n    if <[0] < ((현재) + (-1))> then\n        선 z좌표 구하기 (현재)\n    end\nend\n\ndefine 버블정렬 (현재)\nif <(item (현재) of [선 z좌표 v]) > (item ((현재) + (1)) of [선 z좌표 v])> then\n    insert (item (현재) of [선 z좌표 v]) at ((현재) + (2)) of [선 z좌표 v] \n    delete (현재) of [선 z좌표 v]\n    insert (item (((현재) * (2)) - (1)) of [선 번호 v]) at (((현재) * (2)) + (3)) of [선 번호 v] \n    insert (item ((현재) * (2)) of [선 번호 v]) at (((현재) * (2)) + (4)) of [선 번호 v] \n    delete (((현재) * (2)) - (1)) of [선 번호 v]\n    delete (((현재) * (2)) - (1)) of [선 번호 v]\n    버블정렬 ((현재) - (1))\nelse\n    if <((현재) + (1)) < (length of [선 z좌표 v])> then\n        버블정렬 ((현재) + (1))\n    end\nend\n\ndefine 물리엔진\nchange [z좌표 v] by ((0) - (z좌표 이동량))\nchange [z좌표 이동량 v] by (-1)\n플레이어와 장애물 닿았는지 전체 다 확인 [1]\nif <<<not <[닿은것 번호 v] contains [4]?>> or <[닿은것 번호 v] contains [1]?>> and <[0] < (length of [닿은것 번호 v])>> then\n    if <(z좌표 이동량) < [0]> then\n        repeat until <not <[닿은것 번호 v] contains [1]?>>\n            change [z좌표 v] by (-1)\n            플레이어와 장애물 닿았는지 전체 다 확인 [1]\n        end\n        set [z좌표 이동량 v] to [0]\n        set [점프가능? v] to [1]\n    else\n        repeat until <not <[닿은것 번호 v] contains [1]?>>\n            change [z좌표 v] by (1)\n            플레이어와 장애물 닿았는지 전체 다 확인 [1]\n        end\n        set [z좌표 이동량 v] to [-1]\n        set [점프가능? v] to [0]\n    end\nend\n플레이어와 장애물 닿았는지 전체 다 확인 [1]\nif <<(z좌표 이동량) < [-5]> and <not <[닿은것 번호 v] contains [4]?>>> then\n    set [점프가능? v] to [0]\nend\nchange [x좌표 v] by ((0) - (x좌표 이동량))\n플레이어와 장애물 닿았는지 전체 다 확인 [1]\nif <<<not <[닿은것 번호 v] contains [4]?>> or <[닿은것 번호 v] contains [1]?>> and <[0] < (length of [닿은것 번호 v])>> then\n    if <[0] < (x좌표 이동량)> then\n        repeat until <not <[닿은것 번호 v] contains [1]?>>\n            change [x좌표 v] by (1)\n            플레이어와 장애물 닿았는지 전체 다 확인 [1]\n        end\n    else\n        repeat until <not <[닿은것 번호 v] contains [1]?>>\n            change [x좌표 v] by (-1)\n            플레이어와 장애물 닿았는지 전체 다 확인 [1]\n        end\n    end\n    set [x좌표 이동량 v] to [0]\nend\nset [x좌표 이동량 v] to ((x좌표 이동량) * (0.8))\nchange [y좌표 v] by ((0) - (y좌표 이동량))\n플레이어와 장애물 닿았는지 전체 다 확인 [1]\nif <<<not <[닿은것 번호 v] contains [4]?>> or <[닿은것 번호 v] contains [1]?>> and <[0] < (length of [닿은것 번호 v])>> then\n    if <[0] < (y좌표 이동량)> then\n        repeat until <not <[닿은것 번호 v] contains [1]?>>\n            change [y좌표 v] by (1)\n            플레이어와 장애물 닿았는지 전체 다 확인 [1]\n        end\n    else\n        repeat until <not <[닿은것 번호 v] contains [1]?>>\n            change [y좌표 v] by (-1)\n            플레이어와 장애물 닿았는지 전체 다 확인 [1]\n        end\n    end\n    set [y좌표 이동량 v] to [0]\nend\nset [y좌표 이동량 v] to ((y좌표 이동량) * (0.8))\nset [닿은 것 번호 v] to [0]\nchange [z좌표 v] by (1)\n플레이어와 장애물 닿았는지 전체 다 확인 [1]\n닿은거에 따른 행동\nchange [z좌표 v] by (-2)\n플레이어와 장애물 닿았는지 전체 다 확인 [1]\n닿은거에 따른 행동\nchange [z좌표 v] by (1)\nchange [y좌표 v] by (1)\n플레이어와 장애물 닿았는지 전체 다 확인 [1]\n닿은거에 따른 행동\nchange [y좌표 v] by (-2)\n플레이어와 장애물 닿았는지 전체 다 확인 [1]\n닿은거에 따른 행동\nchange [y좌표 v] by (1)\nchange [x좌표 v] by (1)\n플레이어와 장애물 닿았는지 전체 다 확인 [1]\n닿은거에 따른 행동\nchange [x좌표 v] by (-2)\n플레이어와 장애물 닿았는지 전체 다 확인 [1]\n닿은거에 따른 행동\nchange [x좌표 v] by (1)\nset [닿은 것 번호 v] to [0]\n\ndefine 닿았는지 확인 (현재 리스트 번호) (x) (y) (z)\nset [다았는가? v] to [0]\nif <((x) + (-25)) < ((item (현재 리스트 번호) of [정육면체 x좌표 v]) + ((item (현재 리스트 번호) of [정육면체 한 변의 길이 v]) / (2)))> then\n    if <((item (현재 리스트 번호) of [정육면체 x좌표 v]) + ((item (현재 리스트 번호) of [정육면체 한 변의 길이 v]) / (-2))) < ((x) + (25))> then\n        if <((y) + (-25)) < ((item (현재 리스트 번호) of [정육면체 y좌표 v]) + ((item (현재 리스트 번호) of [정육면체 한 변의 길이 v]) / (2)))> then\n            if <((item (현재 리스트 번호) of [정육면체 y좌표 v]) + ((item (현재 리스트 번호) of [정육면체 한 변의 길이 v]) / (-2))) < ((y) + (25))> then\n                if <((z) + (-25)) < ((item (현재 리스트 번호) of [정육면체 z좌표 v]) + ((item (현재 리스트 번호) of [정육면체 한 변의 길이 v]) / (2)))> then\n                    if <((item (현재 리스트 번호) of [정육면체 z좌표 v]) + ((item (현재 리스트 번호) of [정육면체 한 변의 길이 v]) / (-2))) < ((z) + (25))> then\n                        set [다았는가? v] to [1]\n                    end\n                end\n            end\n        end\n    end\nend\n\ndefine 플레이어와 장애물 닿았는지 확인 (리스트 번호)\nset [. v] to [0]\nrepeat until <not <<(다았는가?) = [0]> and <(리스트 번호) < (length of [정육면체 번호 v])>>>\n    change [. v] by (1)\n    닿았는지 확인 (리스트 번호) ((x좌표) * (-1)) ((y좌표) * (-1)) ((z좌표) * (-1))\nend\n\ndefine 닿은거에 따른 행동\nif <[닿은것 번호 v] contains [2]?> then\n    set [게임오버 v] to [1]\n    broadcast (게임끝 v)\nelse\n    if <[닿은것 번호 v] contains [4]?> then\n        set [물에 닿았는가? v] to [1]\n    else\n        set [물에 닿았는가? v] to [0]\n    end\n    if <[닿은것 번호 v] contains [3]?> then\n        set [점프가능? v] to [0]\n        set [z좌표 이동량 v] to [30]\n        repeat until <not <[닿은것 번호 v] contains [3]?>>\n            change [z좌표 v] by (-1)\n            플레이어와 장애물 닿았는지 전체 다 확인 [1]\n        end\n        start sound [스프링_소리 v]\n    else\n        if <[닿은것 번호 v] contains [4]?> then\n            set [점프가능? v] to [1]\n            set [y좌표 이동량 v] to ((y좌표 이동량) * (0.9))\n            set [x좌표 이동량 v] to ((x좌표 이동량) * (0.9))\n            set [z좌표 이동량 v] to ((z좌표 이동량) * (0.9))\n        else\n            if <[닿은것 번호 v] contains [5]?> then\n                change [단계 v] by (1)\n                stop [other scripts in sprite v]\n                broadcast (시작 v)\n                stop [this script v]\n            end\n        end\n    end\nend\n\ndefine 플레이어와 장애물 닿았는지 전체 다 확인 (현재)\nset [장애물 닿았는지 확인 진행 v] to [0]\nrepeat (length of [정육면체 번호 v])\n    change [장애물 닿았는지 확인 진행 v] by (1)\n    if <(장애물 닿았는지 확인 진행) = [1]> then\n        delete all of [닿은것 번호 v]\n    end\n    닿았는지 확인 (장애물 닿았는지 확인 진행) ((x좌표) * (-1)) ((y좌표) * (-1)) ((z좌표) * (-1))\n    if <(다았는가?) = [1]> then\n        add (item (장애물 닿았는지 확인 진행) of [정육면체 번호 v]) to [닿은것 번호 v]\n    end\nend\n\nwhen I receive [게임끝 v]\nstop [other scripts in sprite v]\nset language to (en v)::tts\nset voice to (tenor v)::tts\nspeak [game over]::tts\nbroadcast (시작 v)\n\nwhen I receive [시작 v]\nset [fps측정기 v] to [0]\nreset timer\nforever\n    set [fps v] to ((1) / ((timer) - (fps측정기)))\n    set [fps측정기 v] to (timer)\nend\n\n@물소리\n\nwhen flag clicked\nforever\n    play sound [수량 적은 계곡 물소리 - 조용한 편 v] until done\nend\n\nwhen flag clicked\nforever\n    if <(물에 닿았는가?) = [1]> then\n        set volume to (((([abs v] of (x좌표 이동량) ) + ([abs v] of (y좌표 이동량) )) + (([abs v] of (z좌표 이동량) ) / (3))) * (50)) %\n    else\n        set volume to (0) %\n    end\nend\n\n