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