summaryrefslogtreecommitdiff
path: root/app/Scratchy/Syntax.hs
blob: c77e51aca37bb3ff319f475fdbf1fa7418789bd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
module Scratchy.Syntax where

import Graphics.Gloss.Interface.Pure.Game


-- Types
------------------------------------------------------------

type Duration  = Int
type Pos       = (Float, Float)
type Cell      = (Int, Int)
type SpritePtr = Int


-- Constants
------------------------------------------------------------

cellsPerSec :: Float
cellsPerSec = 5

gridW, gridH :: Int
gridW = 30
gridH = 30 -- FIXME: move.

inBounds :: (Int,Int) -> Bool
inBounds (x,y) = x >= 0 && x < gridW && y >= 0 && y < gridH

cellSize :: Float
cellSize = 30

winW, winH :: Int
winW = round (fromIntegral gridW * cellSize)
winH = round (fromIntegral gridH * cellSize)


-- Direction
------------------------------------------------------------

data Dir = U | D | L | R deriving (Eq,Ord,Show)

dirVec :: Dir -> (Int, Int)
dirVec U = (0, 1)
dirVec D = (0,-1)
dirVec L = (-1,0)
dirVec R = (1, 0)

nextCell :: Dir -> (Int, Int) -> (Int, Int)
nextCell d (cx,cy) =
  let (dx,dy) = dirVec d
  in (cx + dx, cy + dy)


-- Syntax
------------------------------------------------------------

data InspectionResult
  = HasBarrier | HasSprite | IsFree

data SProg a
  = Pure a

  -- Event listening
  | OnKeyEvent Key (SProg ()) (SProg a) -- Listener for a specific key
  | OnTargetReached SpritePtr (Cell -> SProg ()) (SProg a) -- Listener for a specific sprite
  | OnTargetUpdated SpritePtr (Cell -> Cell -> SProg ()) (SProg a) -- Listener for a specific sprite
  | OnBarrierHit SpritePtr (Cell -> Cell -> SProg ()) (SProg a)

  -- Sprite and grid actions
  | NewSprite Cell Picture (SpritePtr -> SProg a)
  | SetColor SpritePtr Color (SProg a)
  | SetTarget SpritePtr Cell (SProg a)
  | GetTarget SpritePtr (Cell -> SProg a)
  | SetBackgroundColor Color (SProg a)
  | InspectCell Cell (InspectionResult -> SProg a)

  -- Timer
  | After Duration (SProg ()) (SProg a)
  deriving Functor


-- Combining programs
------------------------------------------------------------

combine :: SProg () -> SProg () -> SProg ()
combine = undefined -- Fill this in