Halloween || A mobile Scrolling Platformer
@Stage\n\nwhen [m v] key pressed\nset [mouse v] to (join ((mouse x) + (SCROLL X)) (join [, ] ((mouse y) + (SCROLL Y))))\nshow variable [mouse v]\n\nwhen flag clicked\nswitch backdrop to (bühnenbild2 v)\n\nwhen I receive [play game v]\nswitch backdrop to (bühnenbild1 v)\n\nwhen I receive [go v]\nshow variable [time: v]\nforever\n    if <not <(LEVEL) = [3]>> then\n        show variable [time: v]\n        wait (1) seconds\n        change [time: v] by (-1)\n        if <(Time:) = [0]> then\n            broadcast (TimeUp v)\n        end\n    end\nend\n\n@blank\n\n@Player\n\nwhen flag clicked\nhide variable [time: v]\nset [time: v] to [60]\nbroadcast (Green v) and wait\nset [game v] to [non]\nhide\n\nwhen I receive [go v]\nset [game v] to [on]\nbroadcast (Play Game v) and wait\n\n\n\nif <(round (sx)) = [0]> then\nif <boolean> then\nswitch costume to (run-01 v)\n\nswitch costume to (stand v)\n\nstop [this script v]\n\nwhen I receive [green v]\nhide\ngo to [front v] layer\n\nwhen I receive [play game v]\nset [level v] to [1]\nforever\n    broadcast (reset v) and wait\n    broadcast (setup v) and wait\n    Game on\n    repeat until <(EXIT) > []>\n        Tick\n        broadcast (Tick v) and wait\n    end\n    if <(EXIT) = [win]> then\n        Game win\n    else\n        Game - Die\n    end\nend\n\ndefine Game on\nswitch costume to (stand v)\nset [x v] to [0]\nset [y v] to [0]\nset [scroll x v] to [0]\nset [scroll y v] to [0]\nset [sy v] to [0]\nset [sx v] to [0]\nset [in air v] to [0]\nset [exit v] to []\nset size to (60) %\nset [ghost v] effect to (0)\nshow\n\ndefine Tick\nbroadcast (musik v)\nif <<(round (sx)) = [1]> or <(round (sx)) = [0]>> then\n    switch costume to (stand v)\nend\nif <<key (left arrow v) pressed?> or <<mouse down?> and <(mouse x) < (x position)>>> then\n    change [sx v] by (-2)\n    point in direction (-90)\n    next costume\nend\nif <<key (right arrow v) pressed?> or <<mouse down?> and <(mouse x) > (x position)>>> then\n    change [sx v] by (2)\n    point in direction (90)\n    next costume\nend\nset [sx v] to ((sx) * (0.8))\nif <([abs v] of (sx) ) > [0.8]> then\n    Change Player X by (round (sx))\nend\nif <<key (up arrow v) pressed?> or <<mouse down?> and <(mouse y) > ((y position) + (20))>>> then\n    if <(in air) < [4]> then\n        set [sy v] to [16]\n        switch costume to (jump2 v)\n    end\nend\nif <(sy) > [-20]> then\n    change [sy v] by (-2)\nend\nChange Player Y by (sy)\nTest - Die\nchange [scroll x v] by (round (((x) - (SCROLL X)) / (10)))\nif <(SCROLL X) < [0]> then\n    set [scroll x v] to [0]\nend\nchange [scroll y v] by (round (((y) - (SCROLL Y)) / (10)))\nif <(SCROLL Y) < [-103]> then\n    set [scroll y v] to [-103]\nend\nPosition\nif <(y) < [-180]> then\n    set [exit v] to [die]\nend\nif <(SCROLL X) > [28800]> then\n    set [scroll x v] to [28800]\nend\nif <(LEVEL) = [2]> then\n    if <(SCROLL X) > [551]> then\n        set [scroll x v] to [551]\n    end\nend\nif <(LEVEL) = [3]> then\n    set [scroll x v] to [0]\n    set [scroll y v] to [-6]\nend\nif <(Time:) = [0]> then\n    stop [other scripts in sprite v]\n    stop [this script v]\nend\n\ndefine Change Player Y by (sy)\nchange [y v] by (sy)\nchange [in air v] by (1)\nPosition\nrepeat until <not <touching (platforms v)?>>\n    if <(sy) > [0]> then\n        change [y v] by (-1)\n        switch costume to (jump2 v)\n    else\n        change [y v] by (1)\n        set [in air v] to [0]\n    end\n    Position\n    set [sy v] to [0]\nend\n\ndefine Position\ngo to x: ((x) - (SCROLL X)) y: ((y) - (SCROLL Y))\n\ndefine Change Player X by (sx)\nchange [x v] by (sx)\nPosition\nif <touching (platforms v)?> then\n    repeat (30)\n        change [y v] by (1)\n        Position\n        if <not <touching (platforms v)?>> then\n            stop [this script v]\n        end\n    end\n    change [y v] by (-12)\n    if <<key (up arrow v) pressed?> or <<mouse down?> and <(mouse y) > ((y position) + (20))>>> then\n        if <(sx) > [0]> then\n            set [sx v] to [-16]\n        else\n            set [sx v] to [16]\n        end\n        set [in air v] to [0]\n    else\n        set [sx v] to [0]\n    end\n    repeat until <not <touching (platforms v)?>>\n        if <(sx) > [0]> then\n            change [x v] by (-1)\n        else\n            change [x v] by (1)\n        end\n        Position\n    end\nend\n\ndefine Game - Die\nset [exit v] to []\nrepeat (5)\n    hide\n    wait (0.1) seconds\n    show\n    wait (0.1) seconds\nend\nhide\nwait (0.5) seconds\n\ndefine Test - Die\nif <touching (danger v)?> then\n    set [exit v] to [die]\nend\nif <<touching (danger2 v)?> and <not <([y position v] of [danger2 v]) > (y position)>>> then\n    set [exit v] to [die]\nend\nif <key (r v) pressed?> then\n    set [exit v] to [die]\nend\n\ndefine Game win\nrepeat (50)\n    point towards (exit v)\n    turn right (65) degrees\n    move ((distance to [exit v]) / (2)) steps\n    change size by (-1)\n    change [ghost v] effect by (2)\nend\nhide\nchange [level v] by (1)\nwait (1) seconds\n\nwhen flag clicked\nclear sound effects\nset volume to (100) %\nstop all sounds\nif <not <(Time:) = [0]>> then\n    repeat until <(GAME) = [on]>\n        play sound [Movie 2 v] until done\n    end\n    change volume by (20)\n    forever\n        if <(LEVEL) < [3]> then\n            play sound [Movie 2 v] until done\n        else\n            play sound [Triumph v] until done\n        end\n    end\nend\n\nwhen flag clicked\nhide variable [lautstärke v]\nforever\n    if <key ((join [] [+]) v) pressed?> then\n        wait until <not <key ((join [] [+]) v) pressed?>>\n        change volume by (20)\n        broadcast (showl v)\n    else\n        if <key ((join [] [-]) v) pressed?> then\n            wait until <not <key ((join [] [-]) v) pressed?>>\n            change volume by (-20)\n            broadcast (showl v)\n        end\n    end\nend\n\nwhen I receive [showl v]\nshow variable [lautstärke v]\nwait (3) seconds\nhide variable [lautstärke v]\n\nwhen flag clicked\nforever\n    set [lautstärke v] to (join (volume) [%])\nend\n\nif <(Time:) = [0]> then\n\n@Platforms\n\nwhen I receive [green v]\nhide\n\nwhen I receive [tick v]\nPosition ((x) - (SCROLL X)) ((y) - (SCROLL Y))\n\nwhen I receive [setup v]\nhide\nset [x v] to [0]\nset [y v] to [0]\nif <(LEVEL) = [1]> then\n    switch costume to (level 1 1 v)\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\nelse\n    if <(LEVEL) = [2]> then\n        switch costume to (level 2 1 v)\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        switch costume to (level 2 3 v)\n        Clone at x [-360] y [100]\n        Clone at x [-360] y [100]\n        Clone to [139] [251]\n    else\n        switch costume to (level 3 1 v)\n    end\nend\n\ndefine Position (x) (y)\ngo to x: (x) y: (y)\nif <<(x) = (x position)> and <(y) = (y position)>> then\n    show\nelse\n    hide\nend\n\nwhen I receive [reset v]\ndelete this clone\n\ndefine Clone at x (x) y (y)\ncreate clone of (_myself_ v)\nchange [x v] by (x)\nchange [y v] by (y)\nnext costume\n\nwhen flag clicked\n\ndefine Clone to (x) (y)\ncreate clone of (_myself_ v)\nset [x v] to (x)\nset [y v] to (y)\nnext costume\n\n@Exit\n\nwhen I receive [green v]\nhide\n\nwhen I receive [tick v]\nPosition ((x) - (SCROLL X)) ((y) - (SCROLL Y))\nif <<(costume [number v]) = [2]> and <touching (player v)?>> then\n    set [exit v] to [win]\nend\n\nwhen I receive [setup v]\nhide\nset [collected v] to [0]\nset [x v] to [0]\nset [y v] to [0]\nif <(LEVEL) = [1]> then\n    switch costume to (closed v)\n    Clone at x [1962] y [-140]\nelse\n    if <(LEVEL) = [2]> then\n        switch costume to (closed v)\n        Clone at x [-147] y [335]\n    else\n        set [x v] to [-99999]\n    end\nend\n\ndefine Position (x) (y)\ngo to x: (x) y: (y)\nif <<(x) = (x position)> and <(y) = (y position)>> then\n    show\nelse\n    hide\nend\n\nwhen I receive [reset v]\ndelete this clone\n\ndefine Clone at x (x) y (y)\nset [x v] to (x)\nset [y v] to (y)\n\nwhen I receive [open portal v]\nswitch costume to (open v)\n\n@Danger\n\nwhen I receive [green v]\nhide\n\nwhen I receive [tick v]\nPosition ((x) - (SCROLL X)) ((y) - (SCROLL Y))\n\nwhen I receive [setup v]\nhide\nset [x v] to [0]\nset [y v] to [0]\nif <(LEVEL) = [1]> then\n    switch costume to (level 1 1 v)\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\nelse\n    if <(LEVEL) = [2]> then\n        switch costume to (level 2 1 v)\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        switch costume to (level 2 3 v)\n        Clone at x [-360] y [100]\n        Clone at x [-360] y [100]\n        Clone to [139] [251]\n    else\n        switch costume to (level 3 1 v)\n    end\nend\n\ndefine Position (x) (y)\ngo to x: (x) y: (y)\nif <<(x) = (x position)> and <(y) = (y position)>> then\n    show\nelse\n    hide\nend\n\nwhen I receive [reset v]\ndelete this clone\n\ndefine Clone at x (x) y (y)\ncreate clone of (_myself_ v)\nchange [x v] by (x)\nchange [y v] by (y)\nnext costume\n\n@Collectables\n\nwhen I receive [green v]\nhide\n\nwhen I receive [tick v]\nPosition ((x) - (SCROLL X)) ((y) - (SCROLL Y))\nif <touching (player v)?> then\n    change [collected v] by (1)\n    if <(COLLECTED) = (COLLECTED MAX)> then\n        broadcast (Open Portal v)\n    end\n    delete this clone\nend\n\nwhen I receive [setup v]\nhide\nset [collected v] to [0]\nset [collected max v] to [0]\nset [x v] to [0]\nset [y v] to [0]\nif <(LEVEL) = [1]> then\n    switch costume to ( v)\n    Clone at x [-195] y [-6]\n    Clone at x [674] y [133]\n    Clone at x [1028] y [-166]\n    Clone at x [1319] y [56]\n    Clone at x [1610] y [42]\nelse\n    if <(LEVEL) = [2]> then\n        switch costume to ( v)\n        Clone at x [-202] y [-10]\n        Clone at x [503] y [44]\n        Clone at x [692] y [353]\n        Clone at x [243] y [413]\n        Clone at x [9] y [371]\n    end\nend\nset [x v] to [-999999]\n\ndefine Position (x) (y)\ngo to x: (x) y: (y)\nif <<(x) = (x position)> and <(y) = (y position)>> then\n    show\nelse\n    hide\nend\n\nwhen I receive [reset v]\ndelete this clone\n\ndefine Clone at x (x) y (y)\nset [x v] to (x)\nset [y v] to (y)\nchange [collected max v] by (1)\ncreate clone of (_myself_ v)\n\n@INTRO3\n\nwhen flag clicked\nset [cstat v] to [Background]\nset [stat v] to [Background]\nhide\nset [v1 v] to [0]\nswitch costume to (1 v)\nrepeat (3)\n    set [v1 v] to [0]\n    create clone of (_myself_ v)\n    wait (0.2) seconds\n    next costume\nend\nset [cstat v] to [SideBackground]\nset [stat v] to [SideBackground]\nhide\nwait (0.2) seconds\nset [v1 v] to [0]\nswitch costume to (1b v)\nrepeat (3)\n    set [v1 v] to [0]\n    create clone of (_myself_ v)\n    wait (0.2) seconds\n    next costume\nend\nset [cstat v] to [BigBack]\nset [stat v] to [BigBack]\nhide\nwait (0.09) seconds\nset [v1 v] to [0]\nswitch costume to (back1 v)\nset [v1 v] to [0]\ncreate clone of (_myself_ v)\nset [cstat v] to [Raster]\nset [stat v] to [Raster]\nhide\nwait (0.09) seconds\nset [v1 v] to [0]\nswitch costume to (raster v)\nset [v1 v] to [0]\ncreate clone of (_myself_ v)\nset [cstat v] to [Logo]\nset [stat v] to [Logo]\nhide\nset [v1 v] to [0]\nswitch costume to (logo3 v)\nset [v1 v] to [0]\ncreate clone of (_myself_ v)\n\nwhen flag clicked\nforever\n\nset size to (100) %\n\nwhen I start as a clone\nif < (cSTAT) contains [Background]?> then\n    show\n    set [v1 v] to [0]\n    set size to (1) %\n    go to x: (0) y: (0)\n    set [v1 v] to [23]\n    repeat (50)\n        change size by (v1)\n        set [v1 v] to ((v1) * (0.8))\n        if <not < (STAT) contains [Background]?>> then\n            delete this clone\n        end\n    end\n    forever\n        if <not < (STAT) contains [Background]?>> then\n            delete this clone\n        end\n    end\nend\n\nstop [other scripts in sprite v]\ndelete this clone\n\nwhen I start as a clone\nif < (cSTAT) contains [BigBack]?> then\n    go to [front v] layer\n    show\n    set [v2 v] to [0]\n    set size to (100) %\n    go to x: (0) y: (0)\n    set [v2 v] to [70]\n    repeat (15)\n        change y by (v2)\n        set [v2 v] to ((v2) * (0.8))\n    end\n    delete this clone\nend\n\nchange size by (10)\n\nwhen I start as a clone\nif < (cSTAT) contains [Raster]?> then\n    clear graphic effects\n    go to [back v] layer\n    show\n    set [v2 v] to [0]\n    switch costume to (point v)\n    set size to (200) %\n    switch costume to (raster v)\n    go to x: (0) y: (0)\n    set [v2 v] to [70]\n    forever\n        change x by (-2)\n        change y by (-2)\n    end\nend\n\nchange y by (v2)\nset [v2 v] to ((v2) * (0.8))\n\ndelete this clone\n\nwait (0.09) seconds\n\nwhen I start as a clone\nif < (cSTAT) contains [Logo]?> then\n    set size to (200) %\n    clear graphic effects\n    go to [front v] layer\n    show\n    go to x: (0) y: (0)\n    forever\n        point in direction ((([tan v] of ((timer) * (100)) ) * (10)) + (90))\n    end\nend\n\nset [v2 v] to [70]\n\nchange x by (2)\nchange y by (-2)\n\nwhen I start as a clone\nif < (cSTAT) contains [Logo]?> then\n    wait (3) seconds\n    repeat (10)\n        change size by (10)\n        change [ghost v] effect by (10)\n        change [brightness v] effect by (10)\n    end\n    stop [other scripts in sprite v]\n    broadcast (Start v)\n    delete this clone\nend\n\nwhen I start as a clone\nif < (cSTAT) contains [Raster]?> then\n    wait (3) seconds\n    repeat (10)\n        change [ghost v] effect by (10)\n        change [brightness v] effect by (10)\n    end\n    stop [other scripts in sprite v]\n    delete this clone\nend\n\nchange size by (-10)\n\n@Story\n\nwhen I receive [start v]\nset [val v] to [0]\nset size to (1) %\nswitch costume to (1 v)\nwait (1) seconds\nshow\nforever\n    if <(costume [number v]) = [4]> then\n        show variable [time: v]\n    end\n    set [val v] to [23]\n    wait until <<key (space v) pressed?> or <mouse down?>>\n    set [val v] to [-23]\n    if <not <(costume [number v]) = [4]>> then\n        wait (1) seconds\n        hide\n        next costume\n        show\n    else\n        wait (1) seconds\n        hide\n        broadcast (Go v)\n        stop [this script v]\n    end\nend\n\nwhen flag clicked\nset [val v] to [0]\nhide\nforever\n    set [val v] to ((val) * (0.8))\n    change size by (val)\nend\n\nwhen I receive [start v]\nforever\n    if <key (s v) pressed?> then\n        set [val v] to [-23]\n        hide\n        broadcast (Go v)\n    end\nend\n\n@Platforms2\n\nwhen I receive [green v]\nhide\n\nwhen I receive [tick v]\ngo to [back v] layer\nPosition ((x) - ((SCROLL X) / (2))) ((y) - ((SCROLL Y) / (2)))\n\nwhen I receive [setup v]\nhide\nset [x v] to [0]\nset [y v] to [0]\nif <(LEVEL) = [1]> then\n    switch costume to (level 1 1 v)\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\nelse\n    if <(LEVEL) = [2]> then\n        switch costume to (level 2 1 v)\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n    else\n        switch costume to (level 1 1 v)\n    end\nend\n\ndefine Position (x) (y)\ngo to x: (x) y: (y)\nif <<(x) = (x position)> and <(y) = (y position)>> then\n    show\nelse\n    hide\nend\n\nwhen I receive [reset v]\ndelete this clone\n\ndefine Clone at x (x) y (y)\ncreate clone of (_myself_ v)\nchange [x v] by (x)\nchange [y v] by (y)\nnext costume\n\nwhen I receive [intro? v]\nhide\n\nwhen flag clicked\nhide\n\n@Platforms3\n\nwhen I receive [green v]\nhide\n\nwhen I receive [tick v]\ngo to [back v] layer\nPosition ((x) - ((SCROLL X) / (3))) (y)\n\nwhen I receive [setup v]\nhide\nset [x v] to [0]\nset [y v] to [0]\nif <(LEVEL) = [1]> then\n    switch costume to (level 1 1 v)\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\nelse\n    if <(LEVEL) = [2]> then\n        switch costume to (level 2 1 v)\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n        Clone at x [360] y [0]\n    else\n        switch costume to (level 1 1 v)\n    end\nend\n\ndefine Position (x) (y)\ngo to x: (x) y: (y)\nif <<(x) = (x position)> and <(y) = (y position)>> then\n    show\nelse\n    hide\nend\n\nwhen I receive [reset v]\ndelete this clone\n\ndefine Clone at x (x) y (y)\ncreate clone of (_myself_ v)\nchange [x v] by (x)\nchange [y v] by (y)\nnext costume\n\nwhen I receive [intro? v]\nhide\n\nwhen flag clicked\nhide\n\n@Info\n\nwhen I receive [green v]\nhide\n\nwhen I receive [tick v]\nPosition ((x) - (SCROLL X)) ((y) - (SCROLL Y))\n\nwhen I receive [setup v]\nhide\nset [x v] to [0]\nset [y v] to [0]\nif <(LEVEL) = [1]> then\n    switch costume to (level 1 1 v)\n    Clone at x [360] y [0]\n    Clone at x [360] y [0]\nelse\n    if <(LEVEL) = [2]> then\n        switch costume to (level 2 1 v)\n        Clone at x [0] y [300]\n        Clone at x [460] y [0]\n    else\n        switch costume to (level 3 1 v)\n    end\nend\n\ndefine Position (x) (y)\ngo to x: (x) y: (y)\nif <<(x) = (x position)> and <(y) = (y position)>> then\n    show\nelse\n    hide\nend\n\nwhen I receive [reset v]\ndelete this clone\n\ndefine Clone at x (x) y (y)\ncreate clone of (_myself_ v)\nchange [x v] by (x)\nchange [y v] by (y)\nnext costume\n\nwhen flag clicked\n\n@particles\n\nwhen I start as a clone\nshow\nswitch costume to (pick random (1) to (7))\nset [val v] to [0]\nset [val2 v] to [0]\nset [val v] to [15]\nset [val2 v] to (pick random (-100) to (100))\nrepeat (40)\n    change y by (val)\n    change [val v] by (-1)\n    change x by (val2)\n    set [val2 v] to ((val2) * (0.8))\nend\ndelete this clone\n\nwhen flag clicked\nhide\nset [game v] to [non]\nforever\n    if <<(LEVEL) = [3]> and <not <(GAME) = [non]>>> then\n        wait (2) seconds\n        repeat (10)\n            create clone of (_myself_ v)\n        end\n    end\nend\n\n@TimeUp\n\nwhen flag clicked\nclear graphic effects\nhide\n\nwhen I receive [timeup v]\nshow\nset [ghost v] effect to (100)\nrepeat (10)\n    go to [front v] layer\n    change [ghost v] effect by (-10)\nend\nstop [all v]\n\n@Thumb\n\nwhen flag clicked\nhide\nset [ghost v] effect to (100)\n\n
        Halloween || A mobile Scrolling Platformer\n-------------------------------------------------------------------------\n                          - Happy Halloween! - \n\n                                       Story\n                                    ----------------\nIt's Halloween and the Scratch cat got lost in the woods! Help her find her way out of the forest! You have 60 seconds!\n\nEs ist Halloween und die Scratch Katze hat sich im Wald verlaufen! Hilf ihr, aus dem Wald herauzufinden! Du hast 60 Sekunden Zeit!\n\n                                    Instructions \n                                    ----------------\n- Jump over the dangers (Pumpkins) and collect the coins to open checkpoints!\n- You have 60 sec!\n- Change volume: + and -\n- Have fun!\n\n- Springe über die Gefahren (Kürbisse) und sammele die Münzen ein, um Checkpoints zu öffnen!\n- Du hast 60 sek. Zeit!\n- Lautstärke ändern: + und -\n- Viel Spaß!\n\n                                        News\n                                    ----------------\n17.11.20 - 200+ Likes!!!\n29.10.20 - Bug fixes and 83 Likes\n25.10.20 - 1st on German trends and 37 Likes: Yeah\n20.10.20 - share\n\n                                      Credits\n                                    ----------------\n- @griffpatch for the scrolling Platformer Tutorial\n\nPlease Like, Fav and Follow if you like it :)\nBitte Liken, Faven und folgen, wenn du dieses Spiel magst :)\n\n@AsterixDavid @Scrolling @Platformer @Game @Fun @Speedrun @AsterixDavid @Scrolling @Platformer @Game @Fun @Speedrun @AsterixDavid @Scrolling @Platformer @Game @Fun @Speedrun @AsterixDavid @Scrolling @Platformer @Game @Fun @Speedrun @AsterixDavid @Scrolling @Platformer @Game @Fun @Speedrun @AsterixDavid @Scrolling @Platformer @Game @Fun @Speedrun @AsterixDavid @Scrolling @Platformer @Game @Fun @Speedrun @AsterixDavid @Scrolling @Platformer @Game @Fun @Speedrun