MMF2Game:C:\Users\Xinister\Documents\Projects\MMF2\Game\Game006.mfa4(@09999999999999999999999999999999999999999999@@@@99999999999999@@@@9999999999999999@@@@999999999999999999@@@@99999999999999999999@@@A9999999999999999999999@@@@999999999999999999999999@@@@9999999999999999999999999999999999999999999999999999999999@@@@99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999!9999999999999999999999999999999999999999999999999999999999999!AA9999999999999999999999999999999999999999999999999999999999999A999999999999999999999999999999999999999999999999999999999@99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999)99!9!99999999999999999999999999999999999999999999999999999999)999)9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999ATNFJArialAPMSASUMAGMI """)))UUUMMMBBB999|PP3f333f3333f3ffffff3f̙3ff333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffff3ffff̙fff3fffff3fff333f3f3ff3ff33f̙̙3̙ff̙̙̙3f̙3f333f3333f3ffffff3f̙3f3f3f333f3333f3ffffff3f̙3f3ffffffffff!___wwwB00 h hpppph`@qxaxaxExpp`xÀI,0Qqqiph0$À$(mq4U444Uep`$IŽqUUuq$pHiÀ0YYYY888 xXDZmu8YY8U444UuuYyyyya`eÀm88Uqq4u8Y4ahÀDZ840Q4uY4aP,UMMIzizzzz {,{M{U<}}<yx8ax0uUQ ,m``E)}}Y $#W 51uO ~% ,;@= /&{m?S 5#P +*S}D 1U4_ Mk"8X )Th{> ){~L3jخvQ) 8WeO1  $&''&"  xAxAxAx㐂pppX$Ү0QqMAxhHÀiUUuUax`〆4YY8u$hu8U488puUQӎ0Ӽ<<$`axMUm)s͞c  `[  q= P2pO-AhppqmEumx4QӮq `@eE%e)R{C#ü¼AN`. $A1Z{0{A^> $ @ A9R,cmk,cA^> $ @ դՄA1IJiJbA @ դ̈́cA¼A$!1BAgGrdC#A¼ABAgGޡri@`@ dC#AA!AgG悠ޡri@``@cC#übAAG'hXPH@`@dC#übA!A' @übBA$!A Ѡ`؊@ sS@übB"A$!A Ѡ`@ؐ sS@ü¼bB!!A$!A sS@bB!!AE)Ae`O bBA!A!1Ae`O`bB!᫄11Ae`O`bB!!1e)AeE`@`bB!᫆!AeE%þb1IJR(Be)AAE%ƃþb AA%ƂþbAA bB!Aդ̈́dC#übB!!Aդ̈́dC#übB!!A+@0=9=9?92999)9)92999)9!9!9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?9?99"9?9 9@59 9A 9&9 9!AA09 9!199*9?9 9@/9 9@.9 9@@# 9 9@A$ 9 9@% 99@& 99@'99@(99499699899:99<9>9>9AGMI{׻kϻ[ǻwwwcccSSSCCC333oSKC;{3k+Ww#G_7K'3 kWCw;k3_+S#C7g+K 3ssccSSGG;;33s++_##K7#ۧϏ{gWG7{+osccW WGK;;//ssKK##kS;#ۻÓoG#gc[WO;/s_K ;CϳÛscSwGg7W+K#ߧϏwwggSWCG3;w'/g#[K ; +ӃkgSK73# o_SC7'{cK7'o _##'#'#'#'##skkSS??ۧןϓLJsgߏ[ӃSsKgCW;K3?+{3#o+_OC3 '{k_OC3' w ^:K|| || || | ||X|pL6| | || || || || | |6|h ||| |||||||||||/||||X||||X||||/|||||| |||| | | | |||| | |||||||| |||| ||||||||| | |||| | | | T@ @yB~@|BzDxFvHtJrLpNnPlRjThVfXdZb\`b^`\bZdXfVhTjRlPnNpLrJtHvFxDzB|@><:86 4 2 0.,*(&$" #!#%')+-/1 3 579;= &90 0 0|3|~~||~}|~}|~}|~}|~}|~}|~}|~}|~}|~}|~}|~}|~}|~}||~9~~ ||~9~ |~}||}}B|||~9~|~}||}B|||D| "0 0 0|v||~|||}}||~~||}~|||~}||~~||}~|||~| ||~}|||}}|~~|~}||}~}||~}|~}||~}||}}|~}||}B||||| =0 0 0|||||~|~~||~}||~~|~~~||~}|~}||}}B||~9~|~}|~}B||~|||9|9 0 0 0|{|~~||~9}|}}|B|}}|B|}}|}}|~9}} |B|}9~|~9} |}}|}} |~9}B||B|}B| |B|}9~|}}|~9}B||~99~|}}|B|}B|||||90 0 0|3|~~||B|}}||}~|~9~| |B|}}| |} ~ |B|}}}||~}|~}|~}|~}|~}|~}|~}|~}|~}|~}|~}|~}|~}|~}||}B|||D|B BBBBBBBBBBBBBBBBBBBBBB B BRB B BRB BO@\(vd&U2K:CB;J4P.V($!$#$!0!8!@!H! N! R!"!1"!!$1!~!.1!z!61!w!>1!t!F1!q!J1!o!P1!l!"1B"1!i!1"B1!g !1,B1! e !12B1! c !1:B1! ` !1@B1! ] !1FB1! [ !1LB1! Y !1BRB1! W  !1B RB1 ! T  !1B*RB1 ! Q  !1B0RB1 ! O  !1B8RB1 ! M  !1B>RB1 ! K  !1BDRB1 ! I  !1BJRB1 ! G  ! 1B"R c"RB 1 ! E  ! 1BRcRB 1 ! C  ! 1BR(cRB 1 ! B  ! 1BR.cRB 1 ! A  ! 1BR4cRB 1 ! ?  ! 1BR<cRB 1 ! =  ! 1BRBcRB 1 ! ;  ! 1 BRFcR B 1 ! :  ! 1 BR c s cR B 1 ! 9  ! 1 BRcscR B 1 ! 7  ! 1 BRc&scR B 1 ! 5  ! 1 BRc,scR B 1 ! 3  ! 1 BRc2scR B 1 ! 1  ! 1 BRc:scR B 1 ! 0  ! 1 B Rc>sc R B 1 ! /  ! 1 B RcBsc R B 1 ! -  ! 1 B Rcs {sc R B 1 ! +  ! 1 B Rcs{sc R B 1 ! *  ! 1 B Rcs${sc R B 1 ! )  ! 1 B R cs*{s c R B 1 ! '  ! 1 B Rcs0{sc R B 1 ! &  ! 1 B R cs6{s c R B 1 ! %  ! 1 B R cs:{s c R B 1 ! $  ! 1 B R cs>{s c R B 1 ! #  ! 1 B R cs{ {s c R B 1 ! !  ! 1 B R cs{{s c R B 1 !    ! 1 B R c s{"{ s c R B 1 !   ! 1 B R c s{({ s c R B 1 !   ! 1 B R c s{.{ s c R B 1 !   ! 1 B R c s{4{ s c R B 1 !   ! 1 B R c s{6{ s c R B 1 !   ! 1 B R c s{:{ s c R B 1 !   ! 1 B R c s{>{ s c R B 1 !   ! 1 B R c s {B { s c R B 1 !   ! 1 B R c s {F { s c R B 1 !   ! 1 B R c s {H { s c R B 1 !   ! 1 B R c s {J { s c R B 1 !   ! 1 B R c s {N { s c R B 1 !   ! 1 B R c s {P { s c R B 1 !  ! 1 B R c s {R { s c R B 1 !  ! 1 B R c s {T { s c R B 1 !  ! 1 B R c s {X { s c R B 1 ! ! 1 B R c s {Z { s c R B 1 ! ! 1 B R c s {\ { s c R B 1!  ! 1 B R c s {^ { s c R B 1 ! ! 1 B R c s {^ { s c R B 1!  ! 1 B R c s {` { s c R B 1!  !1 B R c s {b { s c R B1 !  ! 1 B R c s {d { s c R B 1!   ! 1B R c s {f { s c RB 1 !  !1 B R c s {h { s c R B1 !  ! 1B R c s {h { s c RB 1!   ! 1B R c s {j { s c RB 1 !  !1 BR c s {l { s cR B1 ! ! 1B R c s {l { s c RB 1!  ! 1BR c s {n { s cRB 1!  !1 BR c s {n { s cR B1 !! 1B Rc s {p { sc RB 1!! 1BR c s {p { s cRB 1! !1 BRc s {r { scR B1!  !1 BRc s {r { scR B1 !! 1B Rcs {t {sc RB 1!! 1BR cs{v{s cRB 1! !1 BRc s{v{ scR B1!  !1B Rcs {v {sc RB1 !! 1BR cs{x{s cRB 1!!1 BRc s{x{ scR B1!!1B Rcs {x {sc RB1!!1BR cs{z{s cRB1!!1BRc s{z{ scRB1!! 1BRcs {z {scRB 1!!1 BRcs{|{scR B1!!1B Rcs{|{sc RB1!!1BRcs {| {scRB1!!1BRcs {| {scRB1!!1BRcs{~{scRB1!!1BRcs{~{scRB1!!1BRcs{~{scRB1!! 1B Rcs{~{sc RB 1!!1B Rcs{~{sc RB1!!1B Rcs{~{sc RB1!!1B Rcs{~{sc RB1!!1B Rcs{~{sc RB1!!1BRcs{{scRB1!!1BRcs{{scRB1!!1BRcs{{scRB1!!1BRcs{{scRB1!!1BRcs{{scRB1!!1BRcs{{scRB1!!1BRcs{{scRB1!!1BRcs{{scRB1!!1BRcs{{scRB1!!1BRcs{{scRB1!!1B Rcs{~{sc RB1!!1B Rcs{~{sc RB1!!1B Rcs{~{sc RB1!!1B Rcs{~{sc RB1!! 1B Rcs{~{sc RB 1!!1BRcs{~{scRB1!!1BRcs{~{scRB1!!1BRcs{~{scRB1!!1BRcs {| {scRB1!!1BRcs {| {scRB1!!1B Rcs{|{sc RB1!!1 BRcs{|{scR B1!! 1BRcs {z {scRB 1!!1BRc s{z{ scRB1!!1BR cs{z{s cRB1!!1B Rcs {x {sc RB1!!1 BRc s{x{ scR B1!! 1BR cs{x{s cRB 1! !1B Rcs {v {sc RB1 ! !1 BRc s{v{ scR B1! ! 1BR cs{v{s cRB 1!! 1B Rcs {t {sc RB 1! !1 BRc s {r { scR B1 ! !1 BRc s {r { scR B1! ! 1BR c s {p { s cRB 1!! 1B Rc s {p { sc RB 1! !1 BR c s {n { s cR B1 ! ! 1BR c s {n { s cRB 1!  ! 1B R c s {l { s c RB 1!  !1 BR c s {l { s cR B1 !  ! 1B R c s {j { s c RB 1 !  ! 1B R c s {h { s c RB 1!   !1 B R c s {h { s c R B1 !  ! 1B R c s {f { s c RB 1 !  ! 1 B R c s {d { s c R B 1!   !1 B R c s {b { s c R B1 ! ! 1 B R c s {` { s c R B 1!  ! 1 B R c s {^ { s c R B 1!  ! 1 B R c s {^ { s c R B 1 ! ! 1 B R c s {\ { s c R B 1!  ! 1 B R c s {Z { s c R B 1 ! ! 1 B R c s {X { s c R B 1 !  ! 1 B R c s {T { s c R B 1 !  ! 1 B R c s {R { s c R B 1 !  ! 1 B R c s {P { s c R B 1 !   ! 1 B R c s {N { s c R B 1 !   ! 1 B R c s {J { s c R B 1 !   ! 1 B R c s {H { s c R B 1 !   ! 1 B R c s {F { s c R B 1 !   ! 1 B R c s {B { s c R B 1 !   ! 1 B R c s{>{ s c R B 1 !   ! 1 B R c s{:{ s c R B 1 !   ! 1 B R c s{6{ s c R B 1 !   ! 1 B R c s{4{ s c R B 1 !   ! 1 B R c s{.{ s c R B 1 !   ! 1 B R c s{({ s c R B 1 !   ! 1 B R c s{"{ s c R B 1 !    ! 1 B R cs{{s c R B 1 ! !  ! 1 B R cs{ {s c R B 1 ! #  ! 1 B R cs>{s c R B 1 ! $  ! 1 B R cs:{s c R B 1 ! %  ! 1 B R cs6{s c R B 1 ! &  ! 1 B Rcs0{sc R B 1 ! '  ! 1 B R cs*{s c R B 1 ! )  ! 1 B Rcs${sc R B 1 ! *  ! 1 B Rcs{sc R B 1 ! +  ! 1 B Rcs {sc R B 1 ! -  ! 1 B RcBsc R B 1 ! /  ! 1 B Rc>sc R B 1 ! 0  ! 1 BRc:scR B 1 ! 1  ! 1 BRc2scR B 1 ! 3  ! 1 BRc,scR B 1 ! 5  ! 1 BRc&scR B 1 ! 7  ! 1 BRcscR B 1 ! 9  ! 1 BR c s cR B 1 ! :  ! 1 BRFcR B 1 ! ;  ! 1BRBcRB 1 ! =  ! 1BR<cRB 1 ! ?  ! 1BR4cRB 1 ! A  ! 1BR.cRB 1 ! B  ! 1BR(cRB 1 ! C  ! 1BRcRB 1 ! E  ! 1B"R c"RB 1 ! G  !1BJRB1 ! I  !1BDRB1 ! K  !1B>RB1 ! M  !1B8RB1 ! O  !1B0RB1 ! Q  !1B*RB1 ! T  !1B RB1 ! W !1BRB1! Y !1LB1! [ !1FB1! ] !1@B1! ` !1:B1! c !12B1! e !1,B1! g!1"B1!i!"1B"1!l!P1!o!J1!q!F1!t!>1!w!61!z!.1!~!$1!"!1"!R! N! H!@!8!0!$!$#!#)V.P4J;BC:K2U&ewGame@2&(%' &(%' &(%' &(%' &H&File&New F2Pass&word&Pause Ctrl+PPla&yers Ctrl+Y&Quit Alt+F4&OptionsPlay &samples Ctrl+SPlay &musics Ctrl+M&Hide the menu F8&Full Screen Alt+Enter&Help&Contents F1&About...  P Y S MpqswviewXviewY renderValue memoryValue renderMode scrollMode BinaryArray.mfx Binary array%Y kcini.mfxIni%Y kcpica.mfxActive Picture%YMoveSafely2.mfxMove Safely 2 Object%YParallaxer.mfx Parallaxer%Y Overlay.mfx Overlay Redux%Y Layer.mfx Layer object%YpFrame 12%~{׻kϻ[ǻwwwcccSSSCCC333oSKC;{3k+Ww#G_7K'3 kWCw;k3_+S#C7g+K 3ssccSSGG;;33s++_##K7#ۧϏ{gWG7{+osccW WGK;;//ssKK##kS;#ۻÓoG#gc[WO;/s_K ;CϳÛscSwGg7W+K#ߧϏwwggSWCG3;w'/g#[K ; +ӃkgSK73# o_SC7'{cK7'o _##'#'#'#'##skkSS??ۧןϓLJsgߏ[ӃSsKgCW;K3?+{3#o+_OC3 '{k_OC3' wSky Background?? Play Area??Menus Map Array  Movement #1 Binary arrayBinaryArray.mfx%Y !Ini  Movement #1Ini kcini.mfx%Y player.hitbox4 xMoveyMovexAddyAddjStatemDirxPosyPosmaxSpeedmaxGrav Movement #122 222222 22 "tileset # Movement #1Active Picture kcpica.mfx%Y,, Dev: d.FPS  Movement #10FPS: 0 Dev: c.FPS Movement #16eɚ;` Savegame Array  Movement #1 Binary arrayBinaryArray.mfx%Y "prop # Movement #1Active Picture kcpica.mfx%Y,,sprite4spriteIDmemoryIDValue1Value2Value3Value4 lightRadiusString1String2 Movement #122 scroller4 Movement #122# Move Safely 2 Object  Movement #1Move Safely 2 ObjectMoveSafely2.mfx%Y  player.controller4 Movement #1&2dd222$ Parallaxerj Movement #1 ParallaxerParallaxer.mfx%Y::@ " sky  Movement #1Active Picture kcpica.mfx%Y,,@" player.sprite # Movement #1Active Picture kcpica.mfx%Y,, test.light4spriteIDmemoryIDX1Y1X2Y2 lightRadiusString1String2 Movement #122%overlay.shadow Movement #1 Overlay Redux Overlay.mfx%Y00R % overlay.light Movement #1 Overlay Redux Overlay.mfx%Y00R`& Layer object Movement #1 Layer object Layer.mfx%Y p Extensions pMenusp Play Area p Background pSky ppppp   J ( `  H@Evtslh|l%"Arial _$ \- TILES$ T- TILES" Z $ \- PROPS$ T- PROPS" Z S& \-SPRITES& T-SPRITES" Z $ \- CELLS$ T- CELLS" Z @@ c2-Data\Maps\Default.mapB"P4-Data\Tiles\tiletest.tsh|l%"Arial@h`|l%"Arial @@ c2-Data\Maps\Default.map& \-MEMORY& T-MEMORY" Z @!V2-Data\Maps\Default.dat"Px-Data\Tiles\!S  MAPTileset .ts.#S   h|l%"Arialf ~n&Gamef ~n&Playerh  |l%"Arialh  |l%"Arial      $     $  $     $    $  $   h |l%"Arialh |l%"Arialt $  .  2 , 2 t $  .  2 , 2 h |l%"Arialh |l%"Arial $  .  2 $  .  2 ,  2  $  .  2 $  .  2 $  ,! 2  0  2 . 2  .  2 , 2 h |l%"Arial%T .  2 , 2 , 2 h |l%"Arial"h |l%"Arial j < 2$  d< 2$  dh |l%"Arial!D   ^ 2F   @ 2(  h ! |l%"Arialh "!|l%"Arial$h #"|l%"Arial)f $# ,#  2 #P 4&  d#Q  %$# .#  2 8 #R   #R < 2$  d, 2 h &%|l%"Arial+f '& ,#  2 #P 4&  d#Q  ('# .#  2 8 #R   #R < 2$  d, 2 , 2 h )(|l%"Arial&h *)|l%"Arial( +* ,  2  ,+0  2  . 2  h -,|l%"Arial# .- .  2 ,  2 h /.|l%"Arial 0/ *  10 21h32|l%"Arialf 43~n&Scrollingh 54|l%"Arialh 65|l%"Arial\ 76$  r d   ?=\ 87$  r d   ?=0 984 $       ?=0 :94 $       ?=h ;:|l%"Arial( <; $ T- CELLS  P   @   (h =<|l%"Arialh >=|l%"Arial ?>  33l \  @ @ j \  @ @ h @?|l%"Arial A@  l \  @ @ j \  @ @ h BA|l%"Arial CB  UUl \    xj \    xh DC|l%"Arial ED  l \    xj \    xh FE|l%"Arial GF *  HGhIH|l%"ArialJIb  <  b  <  " T 1<  T 1<   'KJ " T 1<  T 1<   'f LK~n&Renderh ML|l%"Arial  NM :-renderY  ON(-renderY:-renderX h PO|l%"Arialr QP(-renderXZ 6 .renderX Z 6 .renderY $ T- TILES 1 P  .renderX .renderY  1 P  .renderX .renderY  Sh RQ|l%"Arial' R(-renderX.  1 .  1 "jR .renderX R .renderY B    |        +, 1 h TS|l%"Arial- T(-renderX.  1 .  1 "jR .renderX R .renderY B    |        +, 1 h VU|l%"Arial Z WV(-renderXZ 6 .renderX Z 6 .renderY & T-SPRITES 1 P  .renderX .renderY & T-MEMORY 1 P  .renderX .renderY  XW(-renderX.  1 .  1 2$  . 2  2 .renderX .renderY |n .renderX  |n .renderY  & T-SPRITES!P- P  .renderX .renderY  @ 2(!R Value1@ 2(!R Value2@ 2(!R Value3@ 2(!R Value4@1 =(-!T String1@1 =(-!T String2& T-MEMORY U .renderX .renderY  , 1 h YX|l%"Arial ZY <-renderYp  [Z*-renderYp<-renderXp %h \[|l%"Arial  ]\*-renderXpl H  .renderXp l H  .renderYp $ T- PROPS 1 P   .renderXp  .renderYp  ^]*-renderXp.  1 f"PX-Data\Props\  .prop0"jd  .renderXp d  .renderYp   "Q "R  +, 1 h _^|l%"Arial `_  ' a`f a~n&Dynamic Lighth b|l%"Arial c h d|l%"Arialx f %R "%e "%f % %^     8 8   h g|l%"Arial0 h $ T- TILES:-shadowY  i(-shadowY:-shadowX  j(-shadowX 1 P P  .shadowX  .shadowY @ 1( P  1 P P   .shadowX  .shadowY  Sh k|l%"Arial7 }(-shadowX.  1 P 28    .shadowX    .shadowX P 28    .shadowY    .shadowY . 2 . 2 h m|l%"Arial8 n(-shadowX.  2 .  2 J 22  J 22  h o|l%"Arial9  p(-shadowX.  2 > 2&  > 2&  h q|l%"Arial:  r(-shadowX.  2 > 2&  > 2&  h s|l%"Arial;  t(-shadowX.  1  2  .shadowX     2  .shadowX     2  .shadowY     2  .shadowY    %y        :%y  *%y  .shadowX       .shadowX    .shadowX    .shadowY       .shadowY    .shadowY  :%y  %y        v%z@*      uhbv|l%"Arial@,hcw|l%"Arial*dx@"P2-Data\Tiles\player.png2ey "j$  $  0 0  0 0 +hz|l%"Arial r{  @X2- FPS: P "P | "Q Rems4Close render group when done.Initial setup. (WIP)sInsert tiles. Avoid loading tiles from non-existant array positions (causes crashing). Reset renderValue after use. Calculate and display FPS. (DEV)Start prop render loops.BRender when a change in view position is detected. (Clear screen.) Start tile/sprite render loops. Insert sprites. )Insert props. Second loop = resource hog? Remember to create a memory workspace every time a new map has been loaded. Memory is used to remember what sprites have been loaded, to avoid duplicates. Gave it some extra space that I don't know what to do with yet. Note: INI object seems to be unable to insert a string into another string. But loading it as a value and converting it with Str$() seems to work. Good thing I decided to use numbers for names.My most optimized room scrolling yet. Note that concave corners are not handled well (they DO work, but not smoothly), so stick with square/rectangular rooms.8Move scroller. Floor and Ceil used to correct precision.Load scrolling shape/limits.$Correct scroller position at limits.Blocked right. Blocked left. Blocked up. Blocked down.Center screen on scroller.CScroll before rendering to avoid flashing white edges while moving.IOld init. Keeping this in case I need to revert back to it. Probably not.gGame stuff before rendering might cause glitches? Doing otherwise might cause slightly worse scrolling.Reset controller position.&Reset aim and check for new direction.1Check for movement input and limit max/min speed.-Set movement direction and "scale direction".Remember: Use active picture object for custom player animations and the ability to flip the image. (Or maybe have inverted animations at a lower Y coordinate in the animation image.) (Might have to insert the player sprite after rendering?)FNote that these are only guide directions for the final aim direction. GNote that all player movements and coordinates use two decimals. (x100)!&Add movement to precision coordinates.$jFound out there was no need to change the number rounding to get the correct speed and position. Remember."[Get xPos/yPos. Need to be able to call this later, when the player hits an obstacle. Maybe. Move player.Walking.%Jumping.&Apply gravity.(\Should preferably be done after all Y movements, or one movement cycle will be skipped over.)Move horizontally.+Move vertically.#Variable jump height.,.Render and animate the player sprite. (To do.)*OSprites need to be drawn after the map, or they will be hidden under the tiles.Position the test light.Draw shadow overlay.0 Draw shadows.7LGet the tile-sized grid distance from the light to the tile. Divide by its absolute to get 0, 1 or -1. Invert. You now have some useful relative coordinates. It took me a whole day and about 16 pages of experiments and calculations in my notebook to come up with this. The result is rendering each shadow once instead of four times!8Invert X1 and Y2 if the coordinates are a corner. (When neither is 0.) This gets you the correct points for drawing the shadow. (Might need to add Y1.)9aIf the coordinates are not a corner, then move each X coordinate one step in opposite directions.:*Same as above, except with Y instead of X.;After all the correct inverts have been done, we convert the values into actual coordinates, relative to the screen, for easy use with the overlay redux object. Then, SHADOWS!' Obstacle.- Not obstacle.EvOb Map ArrayaNiB!Ini0INI player.hitboxSprite"tilesetACIP Dev: d.FPSText Dev: c.FPSCounter Savegame ArrayaNiB"propACIPspriteSprite scrollerSprite #Move Safely 2 Objectllet player.controllerSprite $ Parallaxerxlap "skyACIP " player.spriteACIP test.lightSprite%overlay.shadowYLVO% overlay.lightYLVO& Layer objectRYALEvEd !""""#$%%&   EvTsEvLsEvCs,!DNE!2%#&'208 ACHKr AW<@DHT