# Grid Proto
### Game Engine for Prototyping on a Grid
Quickly prototype a graphical program with basic input, colors, shapes, and text.
Grid Proto follows an 'anti-polished' philosophy. It exposes a heavily limited API over SDL2 which doesn't allow for any user media.
*No images, fonts, or audio can be loaded.*
This usage is one step above prototyping within the terminal. So, just write a function for updating state, a pure function for rendering, and a pure function for sound effects.
---
### Hello World
```haskell
import GridProto
main :: IO ()
main = runGridProto helloWorld ()
helloWorld :: GridProto ()
helloWorld = defaultGridProto
{ title = "Hello World"
, viewFn = \_ ->
drawString wh1 (0,0) "hello" <> drawString wh1 (0,1) "world"
}
````
## API
```haskell
-- The main type with config and callbacks
data GridProto state = GridProto
-- Window name
{ title :: String
-- Grid size
, rows :: Int -- Default: 18
, cols :: Int -- Default: 32
-- Scaling and clear color
, tilePixelSize :: Int -- Default: 24 minimum for readable text
, backgroundColor :: Color -- Default: Black2
-- Callbacks which are called each frame
, updateFn :: Input -> state -> IO (state, [String]) -- [String] is user logging
, viewFn :: state -> View
, sfxFn :: state -> [Sfx]
, quitFn :: state -> Bool
}
defaultGridProto :: GridProto s -- Easy to update fields
runGridProto -- Loops until exited
:: GridProto s -- Main type
-> s -- Initial state
-> IO ()
--
-- View
--
type View = Map (Int, Int) Tile -- Map (X,Y) Tile
emptyView :: View
data Tile = Tile
{ symbol :: Maybe (Char, Color) -- At front
, shape :: Maybe (Shape, Color) -- In middle
, fill :: Maybe Color -- At back
}
data Color -- 15 base colors with 3 variations from tint, regular, and shaded. 45 Total.
-- Shorten constructors
-- Tint Reg. Shade
rd0, rd1, rd2 -- Red
or0, or1, or2 -- Orange
yw0, yw1, yw2 -- Yellow
ch0, ch1, ch2 -- Chartreuse
gn0, gn1, gn2 -- Green
sp0, sp1, sp2 -- Spring
cn0, cn1, cn2 -- Cyan
az0, az1, az2 -- Azure
bu0, bu1, bu2 -- Blue
vt0, vt1, vt2 -- Violet
mg0, mg1, mg2 -- Magenta
rs0, rs1, rs2 -- Rose
br0, br1, br2 -- Brown
gy0, gy1, gy2 -- Gray
wh0, wh1, wh2 -- White
bk0, bk1, bk2 -- Black
data Shape
= Circle | FillCircle
| Triangle | FillTriangle
| Square | FillSquare
| Plus | Dash
| Bar | Cross
drawString :: Color -> (Int, Int) -> String -> View
drawTile :: View -> (Int, Int) -> Tile -> View
drawView :: View -> (Int, Int) -> View -> View
mergeViews :: View -> View -> View
rainbow, warms, cools, colorWheel0, colorWheel1, colorWheel2 :: [Color]
shade, tint :: Color -> Color
data Viewport = Viewport
{ vpView :: View
, vpXY :: (Int, Int)
, vpDim :: (Int, Int)
}
mergeViewport :: View -> Viewport -> View
mergeViewports :: View -> [Viewport] -> View
-- instances of MapTile on Tile, View, Viewport
mapTile :: MapTile a
=> ((Char, Color) -> (Char, Color)) -> ((Shape, Color) -> (Shape, Color))
-> (Color -> Color) -> a -> a
mapSymbol :: MapTile a => ((Char, Color) -> (Char, Color)) -> a -> a
mapShape :: MapTile a => ((Shape, Color) -> (Shape, Color)) -> a -> a
mapFill :: MapTile a => (Color -> Color) -> a -> a
--
-- Input
--
data Input = Input
{ mouse :: Mouse, keys :: Keys
, controller1, controller2, controller3, controller4 :: Controller
}
data Key
= Char Char
| UpArrow | DownArrow | LeftArrow | RightArrow
| Enter | Escape
| LeftShift | RightShift | LeftControl | RightControl
| LeftAlt | RightAlt
| Tab | Backspace | Meta
data KeyState = Pressed | Held | Released | Untouched
newtype Keys
lookupKey :: Keys -> Key -> KeyState
data Mouse = Mouse { mousePosition :: (Int, Int), mouseButton :: KeyState }
data Controller = Controller
{ isConnected :: Bool
, startButton, backButton :: KeyState
, dpadUp, dpadDown, dpadLeft, dpadRight :: KeyState
, aButton, bButton, xButton, yButton :: KeyState
, leftStick , rightStick :: KeyState
, leftShoulder, rightShoulder :: KeyState
, leftAxis, rightAxis :: Axis
}
data Axis = Axis { xAxis :: Float, yAxis :: Float }
--
-- Sfx
--
data Sfx
= SfxSuccess | SfxBell | SfxSelect
| SfxNoSelect | SfxScroll | SfxChimes
| SfxLaser | SfxPowerUp | SfxJump
| SfxDamage | SfxExplosion | SfxNoise
```