fable-compiler / repl-legacy

http://fable.io/repl
MIT License
14 stars 10 forks source link

Fix mario sample code #40

Closed zaaack closed 6 years ago

zaaack commented 6 years ago

see: [repl](http://fable.io/repl/#?code=module%20Ozmo%0A%0Amodule%20Keyboard%20%3D%0A%0A%20%20%20%20open%20Fable.Import%0A%0A%20%20%20%20let%20mutable%20keysPressed%20%3D%20Set.empty%0A%0A%20%20%20%20let%20code%20x%20%3D%20if%20keysPressed.Contains(x)%20then%201%20else%200%0A%0A%20%20%20%20let%20arrows%20()%20%3D%20(code%2039%20-%20code%2037%2C%20code%2038%20-%20code%2040)%0A%0A%20%20%20%20let%20update%20(e%20%3A%20Browser.KeyboardEvent%2C%20pressed)%20%3D%0A%20%20%20%20%20%20%20%20let%20keyCode%20%3D%20int%20e.keyCode%0A%20%20%20%20%20%20%20%20let%20op%20%3D%20if%20pressed%20then%20Set.add%20else%20Set.remove%0A%20%20%20%20%20%20%20%20keysPressed%20%3C-%20op%20keyCode%20keysPressed%0A%20%20%20%20%20%20%20%20null%0A%0A%20%20%20%20let%20init%20()%20%3D%0A%20%20%20%20%20%20%20%20Browser.window.addEventListener_keydown(fun%20e%20-%3E%20update(e%2C%20true))%0A%20%20%20%20%20%20%20%20Browser.window.addEventListener_keyup(fun%20e%20-%3E%20update(e%2C%20false))%0A%0A%2F%2F%20Main%0A%0Aopen%20Fable.Import%0Aopen%20Fable.Core.JsInterop%0A%0A%2F%2F%2F%20The%20width%20of%20the%20canvas%0Alet%20width%20%3D%20900.%0A%2F%2F%2F%20The%20height%20of%20the%20canvas%0Alet%20height%20%3D%20668.%0A%2F%2F%2F%20Height%20of%20the%20floor%20-%20the%20bottom%20black%20part%0Alet%20floorHeight%20%3D%20100.%0A%2F%2F%2F%20Height%20of%20the%20atmosphere%20-%20the%20yellow%20gradient%0Alet%20atmosHeight%20%3D%20300.%0A%0AKeyboard.init()%0A%0Alet%20canvas%20%3D%20Browser.document.getElementsByTagName_canvas().%5B0%5D%0Alet%20ctx%20%3D%20canvas.getContext_2d()%0Acanvas.width%20%3C-%20width%0Acanvas.height%20%3C-%20height%0A%0A%0A%2F%2F%2F%20Draw%20gradient%20between%20two%20Y%20offsets%20and%20two%20colours%0Alet%20drawGrd%20(ctx%3ABrowser.CanvasRenderingContext2D)%0A%20%20%20%20(canvas%3ABrowser.HTMLCanvasElement)%20(y0%2Cy1)%20(c0%2Cc1)%20%3D%0A%20%20%20%20let%20grd%20%3D%20ctx.createLinearGradient(0.%2Cy0%2C0.%2Cy1)%0A%20%20%20%20grd.addColorStop(0.%2Cc0)%0A%20%20%20%20grd.addColorStop(1.%2Cc1)%0A%20%20%20%20ctx.fillStyle%20%3C-%20!%5E%20grd%0A%20%20%20%20ctx.fillRect(0.%2Cy0%2C%20canvas.width%2C%20y1-%20y0)%0A%0A%0A%2F%2F%2F%20Draw%20background%20of%20the%20Ozmo%20game%0Alet%20drawBg%20ctx%20canvas%20%3D%0A%20%20%20%20drawGrd%20ctx%20canvas%0A%20%20%20%20%20%20%20%20(0.%2CatmosHeight)%20(%22yellow%22%2C%22orange%22)%0A%20%20%20%20drawGrd%20ctx%20canvas%0A%20%20%20%20%20%20%20%20(atmosHeight%2C%20canvas.height-floorHeight)%0A%20%20%20%20%20%20%20%20(%22grey%22%2C%22white%22)%0A%20%20%20%20ctx.fillStyle%20%3C-%20!%5E%20%22black%22%0A%20%20%20%20ctx.fillRect%0A%20%20%20%20%20%20%20%20(%200.%2Ccanvas.height-floorHeight%2C%0A%20%20%20%20%20%20%20%20%20%20canvas.width%2CfloorHeight%20)%0A%0A%2F%2F%2F%20Draw%20the%20specified%20text%20(when%20game%20finishes)%0Alet%20drawText(text%2Cx%2Cy)%20%3D%0A%20%20%20%20ctx.fillStyle%20%3C-%20!%5E%20%22white%22%0A%20%20%20%20ctx.font%20%3C-%20%22bold%2040pt%22%3B%0A%20%20%20%20ctx.fillText(text%2C%20x%2C%20y)%0A%0A%0Atype%20Blob%20%3D%0A%20%20%20%20%7B%20X%3Afloat%3B%20Y%3Afloat%3B%0A%20%20%20%20%20%20vx%3Afloat%3B%20vy%3Afloat%3B%0A%20%20%20%20%20%20Radius%3Afloat%3B%20color%3Astring%20%7D%0A%0Alet%20drawBlob%20(ctx%3ABrowser.CanvasRenderingContext2D)%0A%20%20%20%20(canvas%3ABrowser.HTMLCanvasElement)%20(blob%3ABlob)%20%3D%0A%20%20%20%20ctx.beginPath()%0A%20%20%20%20ctx.arc%0A%20%20%20%20%20%20%20%20(%20blob.X%2C%20canvas.height%20-%20(blob.Y%20%2B%20floorHeight%20%2B%20blob.Radius)%2C%0A%20%20%20%20%20%20%20%20%20%20blob.Radius%2C%200.%2C%202.%20*%20System.Math.PI%2C%20false%20)%0A%20%20%20%20ctx.fillStyle%20%3C-%20!%5E%20blob.color%0A%20%20%20%20ctx.fill()%0A%20%20%20%20ctx.lineWidth%20%3C-%203.%0A%20%20%20%20ctx.strokeStyle%20%3C-%20!%5E%20blob.color%0A%20%20%20%20ctx.stroke()%0A%0A%0A%2F%2F%2F%20Apply%20key%20effects%20on%20Player's%20blob%20-%20changes%20X%20speed%0Alet%20direct%20(dx%2Cdy)%20(blob%3ABlob)%20%3D%0A%20%20%20%20%7B%20blob%20with%20vx%20%3D%20blob.vx%20%2B%20(float%20dx)%2F4.0%20%7D%0A%0A%2F%2F%2F%20Apply%20gravity%20on%20falling%20blobs%20-%20gets%20faster%20every%20step%0Alet%20gravity%20(blob%3ABlob)%20%3D%0A%20%20%20%20if%20blob.Y%20%3E%200.%20then%20%7B%20blob%20with%20vy%20%3D%20blob.vy%20-%200.1%20%7D%0A%20%20%20%20else%20blob%0A%0A%2F%2F%2F%20Bounde%20Player's%20blob%20off%20the%20wall%20if%20it%20hits%20it%0Alet%20bounce%20(blob%3ABlob)%20%3D%0A%20%20%20%20let%20n%20%3D%20width%0A%20%20%20%20if%20blob.X%20%3C%200.%20then%0A%20%20%20%20%20%20%20%20%7B%20blob%20with%20X%20%3D%20-blob.X%3B%20vx%20%3D%20-blob.vx%20%7D%0A%20%20%20%20elif%20(blob.X%20%3E%20n)%20then%0A%20%20%20%20%20%20%20%20%7B%20blob%20with%20X%20%3D%20n%20-%20(blob.X%20-%20n)%3B%20vx%20%3D%20-blob.vx%20%7D%0A%20%20%20%20else%20blob%0A%0A%0A%2F%2F%2F%20Move%20blob%20by%20one%20step%20-%20adds%20X%20and%20Y%0A%2F%2F%2F%20velocities%20to%20the%20X%20and%20Y%20coordinates%0Alet%20move%20(blob%3ABlob)%20%3D%0A%20%20%20%20%7B%20blob%20with%0A%20%20%20%20%20%20%20%20X%20%3D%20blob.X%20%2B%20blob.vx%0A%20%20%20%20%20%20%20%20Y%20%3D%20max%200.0%20(blob.Y%20%2B%20blob.vy)%20%7D%0A%0A%2F%2F%2F%20Apply%20step%20on%20Player's%20blob.%20Composes%20above%20functions.%0Alet%20step%20dir%20blob%20%3D%0A%20%20%20%20blob%20%7C%3E%20direct%20dir%20%7C%3E%20move%20%7C%3E%20bounce%0A%0A%2F%2F%2F%20Check%20whether%20two%20blobs%20collide%0Alet%20collide%20(a%3ABlob)%20(b%3ABlob)%20%3D%0A%20%20%20%20let%20dx%20%3D%20(a.X%20-%20b.X)*(a.X%20-%20b.X)%0A%20%20%20%20let%20dy%20%3D%20(a.Y%20-%20b.Y)*(a.Y%20-%20b.Y)%0A%20%20%20%20let%20dist%20%3D%20sqrt(dx%20%2B%20dy)%0A%20%20%20%20dist%20%3C%20abs(a.Radius%20-%20b.Radius)%0A%0A%2F%2F%2F%20Remove%20all%20falling%20blobs%20that%20hit%20Player's%20blob%0Alet%20absorb%20(blob%3ABlob)%20(drops%3ABlob%20list)%20%3D%0A%20%20%20%20drops%0A%20%20%20%20%7C%3E%20List.filter%20(fun%20drop%20-%3E%0A%20%20%20%20%20%20%20%20collide%20blob%20drop%20%7C%3E%20not%20)%0A%0A%0A%2F%2F%20Game%20helpers%0A%2F%2F%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Alet%20grow%20%3D%20%22black%22%0Alet%20shrink%20%3D%20%22white%22%0A%0Alet%20newDrop%20color%20%3D%0A%20%20%20%20%7B%20X%20%3D%20JS.Math.random()*width*0.8%20%2B%20(width*0.1)%0A%20%20%20%20%20%20Y%3D600.%3B%20Radius%3D10.%3B%20vx%3D0.%3B%20vy%20%3D%200.0%0A%20%20%20%20%20%20color%3Dcolor%20%7D%0A%0Alet%20newGrow%20()%20%3D%20newDrop%20grow%0Alet%20newShrink%20()%20%3D%20newDrop%20shrink%0A%0A%2F%2F%2F%20Update%20drops%20and%20countdown%20in%20each%20step%0Alet%20updateDrops%20drops%20countdown%20%3D%0A%20%20%20%20if%20countdown%20%3E%200%20then%0A%20%20%20%20%20%20%20%20drops%2C%20countdown%20-%201%0A%20%20%20%20elif%20floor(JS.Math.random()*8.)%20%3D%200.%20then%0A%20%20%20%20%20%20%20%20let%20drop%20%3D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20floor(JS.Math.random()*3.)%20%3D%200.%20then%20newGrow()%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20newShrink()%0A%20%20%20%20%20%20%20%20drop%3A%3Adrops%2C%208%0A%20%20%20%20else%20drops%2C%20countdown%0A%0A%0A%2F%2F%2F%20Count%20growing%20and%20shrinking%20drops%20in%20the%20list%0Alet%20countDrops%20drops%20%3D%0A%20%20%20%20let%20count%20color%20%3D%0A%20%20%20%20%20%20%20%20drops%0A%20%20%20%20%20%20%20%20%7C%3E%20List.filter%20(fun%20drop%20-%3E%20drop.color%20%3D%20color)%0A%20%20%20%20%20%20%20%20%7C%3E%20List.length%0A%20%20%20%20count%20grow%2C%20count%20shrink%0A%0A%2F%2F%20Asynchronous%20game%20loop%0A%2F%2F%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Alet%20rec%20game%20()%20%3D%20async%20%7B%0A%20%20%20%20let%20blob%20%3D%0A%20%20%20%20%20%20%20%20%7B%20X%20%3D%20300.%3B%20Y%3D0.%3B%20Radius%3D50.%3B%0A%20%20%20%20%20%20%20%20%20%20vx%3D0.%3B%20vy%3D0.%3B%20color%3D%22black%22%20%7D%0A%20%20%20%20return!%20update%20blob%20%5BnewGrow%20()%5D%200%20%7D%0A%0Aand%20completed%20()%20%3D%20async%20%7B%0A%20%20%20%20drawText%20(%22COMPLETED%22%2C320.%2C300.)%0A%20%20%20%20do!%20Async.Sleep%2010000%0A%20%20%20%20return!%20game%20()%20%7D%0A%0A%2F%2F%2F%20Keeps%20current%20state%20for%20Player's%20blob%2C%20falling%0A%2F%2F%2F%20drops%20and%20the%20countdown%20since%20last%20drop%20was%20generated%0Aand%20update%20blob%20drops%20countdown%20%3D%20async%20%7B%0A%20%20%20%20%2F%2F%20Update%20the%20drops%20%26%20countdown%0A%20%20%20%20let%20drops%2C%20countdown%20%3D%20updateDrops%20drops%20countdown%0A%0A%20%20%20%20%2F%2F%20Count%20drops%2C%20apply%20physics%20and%20count%20them%20again%0A%20%20%20%20let%20beforeGrow%2C%20beforeShrink%20%3D%20countDrops%20drops%0A%20%20%20%20let%20drops%20%3D%0A%20%20%20%20%20%20%20%20drops%0A%20%20%20%20%20%20%20%20%7C%3E%20List.map%20(gravity%20%3E%3E%20move)%0A%20%20%20%20%20%20%20%20%7C%3E%20absorb%20blob%0A%20%20%20%20let%20afterGrow%2C%20afterShrink%20%3D%20countDrops%20drops%0A%20%20%20%20let%20drops%20%3D%20drops%20%7C%3E%20List.filter%20(fun%20blob%20-%3E%20blob.Y%20%3E%200.)%0A%0A%20%20%20%20%2F%2F%20Calculate%20new%20player's%20size%20based%20on%20absorbed%20drops%0A%20%20%20%20let%20radius%20%3D%20blob.Radius%20%2B%20float%20(beforeGrow%20-%20afterGrow)%20*4.%0A%20%20%20%20let%20radius%20%3D%20radius%20-%20float%20(beforeShrink%20-%20afterShrink)%20*%204.%0A%20%20%20%20let%20radius%20%3D%20max%205.0%20radius%0A%0A%20%20%20%20%2F%2F%20Update%20radius%20and%20apply%20keyboard%20events%0A%20%20%20%20let%20blob%20%3D%20%7B%20blob%20with%20Radius%20%3D%20radius%20%7D%0A%20%20%20%20let%20blob%20%3D%20blob%20%7C%3E%20step%20(Keyboard.arrows())%0A%0A%20%20%20%20%2F%2F%20Render%20the%20new%20game%20state%0A%20%20%20%20drawBg%20ctx%20canvas%0A%20%20%20%20for%20drop%20in%20drops%20do%20drawBlob%20ctx%20canvas%20drop%0A%20%20%20%20drawBlob%20ctx%20canvas%20blob%0A%0A%20%20%20%20%2F%2F%20If%20the%20game%20completed%2C%20switch%20state%0A%20%20%20%20%2F%2F%20otherwise%20sleep%20and%20update%20recursively!%0A%20%20%20%20if%20blob.Radius%20%3E%20150.%20then%0A%20%20%20%20%20%20%20%20return!%20completed()%0A%20%20%20%20else%0A%20%20%20%20%20%20%20%20do!%20Async.Sleep(int%20(1000.%20%2F%2060.))%0A%20%20%20%20%20%20%20%20return!%20update%20blob%20drops%20countdown%20%7D%0A%0Agame%20()%20%7C%3E%20Async.StartImmediate%0A&html=%3Chtml%3E%0A%0A%3Chead%3E%0A%20%20%20%20%3Cmeta%20http-equiv%3D%22Content-Type%22%20content%3D%22text%2Fhtml%3Bcharset%3Dutf-8%22%3E%0A%3C%2Fhead%3E%0A%0A%3Cbody%3E%0A%20%20%20%20%3Ccanvas%20id%3D%22canvas%22%20width%3D%22800%22%20height%3D%22600%22%3E%3C%2Fcanvas%3E%0A%3C%2Fbody%3E%0A%0A%3C%2Fhtml%3E%0A)

@alfonsogarciacaro I guess it's caused by setTimeout's type signature change.

alfonsogarciacaro commented 6 years ago

Good catch, thank you!