1local entity = ...
2local game = entity:get_game()
3local map = entity:get_map()
4local hero = map:get_hero()
5
6local collision_mode = "center"
7
8-- Event called when the custom entity is initialized.
9function entity:on_created()
10  -- HACK: https://gitlab.com/solarus-games/solarus/issues/1339
11  self:set_size(14, 14)
12  self:set_origin(7, 12)
13  self:set_level(self:get_property("levels") or 1)
14  map.tile_puzzles = map.tile_puzzles or {}
15  local puzzle_id = self:get_property("puzzle_id") or "map"
16  local puzzle = map:get_puzzle(puzzle_id)
17  puzzle:add_tile(self)
18end
19
20-- Get the Tile Puzzle associated with this tile
21function entity:get_puzzle()
22  return map.tile_puzzles[self:get_property("puzzle_id") or "map"]
23end
24
25-- Runs on each call of the game loop
26function entity:on_update()
27  if hero:overlaps(self, collision_mode) then
28    if not self._stepped then
29      self:on_stepped()
30      self._stepped = true
31    end
32  else
33    if self._stepped then
34      self:on_left()
35      self._stepped = false
36    end
37  end
38end
39
40-- Get and set the level
41function entity:get_level()
42  return self._level
43end
44function entity:set_level(level)
45  self._level = level
46  self:get_sprite():set_direction(level)
47  log("Maze tile: level set to ", level)
48end
49
50-- Called when the hero steps on
51function entity:on_stepped()
52  log("Maze tile: stepped on")
53  local puzzle = self:get_puzzle()
54  if puzzle:is_frozen() then return end
55  local level = self:get_level()
56  if level > 0 then
57    self:set_level(level - 1)
58    self:get_sprite():set_animation("stepped_on")
59  else
60    if not puzzle:is_solved() then
61      puzzle:on_failure()
62      return
63    end
64  end
65  if puzzle:is_solved() then
66    puzzle:on_solved()
67  end
68end
69
70-- Called when the hero steps off
71function entity:on_left()
72  log("Maze tile: left")
73  self:get_sprite():set_animation("normal")
74  -- Reset the puzzle when left
75  local x, y, z = hero:get_position()
76  local ox, oy = hero:get_origin()
77  for entity in map:get_entities_in_rectangle(x-ox-16, y-oy-16, 48, 48) do
78    if entity.get_model and entity:get_model() == "maze_tile" and hero:overlaps(entity, collision_mode) then
79      return
80    end
81  end
82  self:get_puzzle():on_left()
83end
84