aboutsummaryrefslogtreecommitdiffstats
path: root/alv/copilot/love/init.moon
blob: 6941da68abb4f11051efa7ff84876c03ac4102aa (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
----
-- löve Copilot entrypoint.
--
-- @classmod LoveCopilot
import CLICopilot from require 'alv.copilot.cli'
import T, Struct, Array from require 'alv.base'

export COPILOT

vec2 = Array 2, T.num
mouse_evt = Struct pos: vec2, button: T.num

class LoveCopilot extends CLICopilot
  new: (arg) =>
    table.remove arg, 1
    super arg

    @drawlist = {}
    @mouse_pos = vec2\mk_sig { love.mouse.getPosition! }
    @mouse_delta = vec2\mk_evt!
    @mouse_presses = mouse_evt\mk_evt!
    @mouse_releases = mouse_evt\mk_evt!
    @wheel_delta = vec2\mk_evt!
    @key_presses = T.str\mk_evt!
    @key_releases = T.str\mk_evt!
    @textinput = T.str\mk_evt!

    w, h = love.window.getMode!
    @window_size = vec2\mk_sig { w, h }

  draw: =>
    love.graphics.reset!
    love.graphics.clear!

    for id, list in pairs @drawlist
      for fn in *list
        fn!

    love.graphics.present!

  run: =>
    @setup!

    love.run = ->
      return ->
        love.event.pump!
        did_tick = false
        for name, a,b,c,d,e,f in love.event.poll!
          COPILOT = @
          switch name
            when 'quit'
              return a or 0
            when 'mousemoved'
              @mouse_pos\set { a, b }
              @mouse_delta\set { c, d }, true
            when 'mousepressed'
              @mouse_presses\set { pos: { a, b }, button: c }, true
            when 'mousereleased'
              @mouse_releases\set { pos: { a, b }, button: c }, true
            when 'wheelmoved'
              @wheel_delta\set { a, b }, true
            when 'keypressed'
              @key_presses\set a, true
            when 'textinput'
              @textinput\set a, true
            when 'keyreleased'
              @key_releases\set a, true
            when 'resize'
              @window_size\set  { a, b }
            --else
            --  print "unhandled: '#{name}'", a,b,c,d,e,f

          COPILOT = nil
          did_tick = true
          @tick!

        @tick! unless did_tick
        @draw!

        love.timer.sleep 0.001 if love.timer

{
  :LoveCopilot
}