aboutsummaryrefslogtreecommitdiff
path: root/src/macroknight/game.hy
blob: 53e6facdcaa7235bbe6d7bf1c8c3d2325abf6565 (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
(require hy)
(require hyrule *)
(import pygame
        pytmx.util_pygame [load_pygame]
        entities [Player LevelTile]
        tiles [TileSet draw-tile]
        utils [neg]
        text [render-text]
        systems [apply-gravity apply-collisions])

(pygame.init)

(setv TILE_SCALING 1)
(setv TILE_SIZE (* TILE_SCALING 16))

(setv screen (pygame.display.set_mode #((* TILE_SCALING 640) (* TILE_SCALING 480))))
(setv clock (pygame.time.Clock))
(setv running True)
(setv tileset (TileSet "assets/monochrome-transparent.png" TILE_SCALING TILE_SIZE TILE_SIZE 1))
(setv player (Player 1 (get tileset.tiles 28) TILE_SIZE 5 5))
(setv sprites-group [])
(.append sprites-group player)
(setv level (load_pygame "assets/level-0.tmx"))
(setv macro-input-mode False)
(setv macro-commands [None None None])

(for [tiledef (enumerate (.tiles (get level.layers 0)))]
  (.append sprites-group (LevelTile (get tiledef 0) TILE_SIZE TILE_SCALING #* (get tiledef 1))))

(setv ongoing_inputs [])

(while running
  (for [event (pygame.event.get)]
    (case event.type
          pygame.QUIT (setv running False)
          pygame.KEYDOWN (if (= event.key pygame.K_ESCAPE)
                             (setv running False)
                             (if macro-input-mode
                                 (when (in event.key [pygame.K_a pygame.K_w pygame.K_a pygame.K_s pygame.K_d])
                                   (setv (get macro-commands (.index macro-commands None)) event.key))
                                 (case event.key
                                       pygame.K_SPACE (setv macro-input-mode True)
                                       else (.append ongoing_inputs event.key))))
          pygame.KEYUP (when (in event.key ongoing_inputs)
                         (.remove ongoing_inputs event.key))))

  (.fill screen "#000000")

  (render-text screen tileset "USE A MACRO MOVE TO JUMP HIGHER" 1 10)
  (render-text screen tileset "HIT SPACE AND ENTER A COMBO" 1 11)

  (if macro-input-mode
      ;; If the commands list is full
      (if (get macro-commands -1)
          ;; Process commands
          (do
            (let [#(command-id command) (get (lfor command (enumerate macro-commands) :if (get command 1) command) 0)]
              (case command
                    pygame.K_a (.move player #((neg TILE_SIZE) 0))
                    pygame.K_s (.move player #(0 1))
                    pygame.K_w (.move player #(0 (neg (/ player.MAX_JUMPING 2))))
                    pygame.K_d (.move player #(TILE_SIZE 0)))
              (if (= command-id (- (len macro-commands) 1))
                  (do  (setv macro-commands [None None None])
                       (setv macro-input-mode False))
                  (setv (get macro-commands command-id) None))))

          ;; If there's still space in the commands list
          (for [#(num command) (enumerate macro-commands)]
            (let [x-pos (+ 4 num)]
              (case command
                    pygame.K_w (draw-tile screen tileset 1057 x-pos 5)
                    pygame.K_d (draw-tile screen tileset 1058 x-pos 5)
                    pygame.K_s (draw-tile screen tileset 1059 x-pos 5)
                    pygame.K_a (draw-tile screen tileset 1060 x-pos 5)
                    None (draw-tile screen tileset 725 x-pos 5)))))

      ;; Else
      (do (for [inp ongoing_inputs]
            (case inp
                  pygame.K_a (.move player #((neg player.SPEED) 0))
                  pygame.K_s (.move player #(0 1))
                  pygame.K_w (.jump player)
                  pygame.K_d (.move player #(player.SPEED 0))))

          (when (any ongoing_inputs)
            (for [sprite sprites-group]
              (apply-collisions sprite sprites-group)))

          (.flush player)

          ;; Apply systems
          (for [sprite sprites-group]
            (apply-gravity sprite sprites-group)
            (apply-collisions sprite sprites-group))

          (.flush player)))


  (for [sprite sprites-group]
    (.blit screen sprite.surf sprite.rect))

  (pygame.display.flip)
  (.tick clock 60))

(pygame.quit)