From f32c19dc3de77eb410b9c20f1f879a90f6e0450e Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Thu, 9 Nov 2023 15:46:35 +0100 Subject: [PATCH] Overhaul tilemap, add building ownership layer --- assets/buildings.png | Bin 8159 -> 8306 bytes assets/maps/test.tmj | 65 ++++++++++++++- engine/breeze/game.h | 8 +- engine/breeze/map/map.c | 141 +++++++++++++++++++++----------- engine/breeze/map/map.h | 83 +++++++++++-------- engine/breeze/map/tileset.c | 4 +- engine/breeze/map/tileset.h | 6 +- engine/breeze/utils/string.h | 2 +- game/components.h | 11 +++ game/main.c | 51 +++++++++--- rawAssets/buildings.kra | Bin 207203 -> 229533 bytes rawAssets/buildings.png | Bin 8159 -> 8306 bytes rawAssets/buildings/owner_0.kra | Bin 0 -> 31564 bytes rawAssets/buildings/owner_1.kra | Bin 0 -> 31783 bytes tiled/test.tmx | 56 ++++++++++++- 15 files changed, 324 insertions(+), 103 deletions(-) create mode 100644 game/components.h create mode 100644 rawAssets/buildings/owner_0.kra create mode 100644 rawAssets/buildings/owner_1.kra diff --git a/assets/buildings.png b/assets/buildings.png index 3fd9e7177a0b4197e6bbb5f3ed960ac17852bb63..0ebf60a1b254c25dc8616213eb916551ec5c31e8 100644 GIT binary patch literal 8306 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 literal 8159 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 diff --git a/assets/maps/test.tmj b/assets/maps/test.tmj index 3d0f636..6d6b698 100644 --- a/assets/maps/test.tmj +++ b/assets/maps/test.tmj @@ -309,6 +309,67 @@ "x":0, "y":0 }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, 329, 329, 0, 0, 329, 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, 329, 329, 0, 0, 329, 329, 329, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, 329, 329, 0, 0, 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, 329, 329, 329, 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":50, + "id":32, + "name":"BuildingOwnership", + "opacity":0.6, + "type":"tilelayer", + "visible":true, + "width":80, + "x":0, + "y":0 + }, { "draworder":"topdown", "id":31, @@ -343,8 +404,8 @@ "x":0, "y":0 }], - "nextlayerid":32, - "nextobjectid":19727, + "nextlayerid":33, + "nextobjectid":19728, "orientation":"orthogonal", "renderorder":"right-down", "tiledversion":"1.10.2", diff --git a/engine/breeze/game.h b/engine/breeze/game.h index 5cb94ef..33dcf27 100644 --- a/engine/breeze/game.h +++ b/engine/breeze/game.h @@ -107,14 +107,18 @@ int main(int argc, const char **argv) { } while (!WindowShouldClose()) { + float dt = GetFrameTime(); if (NK) UpdateNuklear(NK); if (appDesc.update) - appDesc.update(0.0f, appDesc.userData); + appDesc.update(dt, appDesc.userData); + + if (ECS) + ecs_progress(ECS, dt); BeginDrawing(); if (appDesc.render) - appDesc.render(0.0f, appDesc.userData); + appDesc.render(dt, appDesc.userData); if (NK) DrawNuklear(NK); EndDrawing(); diff --git a/engine/breeze/map/map.c b/engine/breeze/map/map.c index 79bf46f..6e072dd 100644 --- a/engine/breeze/map/map.c +++ b/engine/breeze/map/map.c @@ -1,5 +1,6 @@ #include "map.h" +#include "../core/logger.h" #include "../core/memory.h" #include "../math/vec2i.h" @@ -8,6 +9,15 @@ BzTileMap BZ_TILEMAP_INVALID = {.isValid = false}; +bool bzTileLayerClear(BzTileLayer *layer, BzTile *data, i32 dataCount) { + return true; +} +bool bzTileObjectsClear(BzTileObjectGroup *objectGroup, BzTileObject *objects, i32 objectCount) { + return true; +} + +BzTileLayerFunc BZ_TILE_LAYER_CLEAR = bzTileLayerClear; +BzTileObjectsFunc BZ_TILE_OBJECTS_CLEAR = bzTileObjectsClear; int16_t bzTileLayerGetTile(BzTileLayer *layer, i32 x, i32 y) { return layer->data[layer->width * y + x]; @@ -19,9 +29,9 @@ static void handleTileLayer(BzTileLayer *layer, cute_tiled_layer_t *cuteLayer) { layer->data = NULL; if (layer->dataCount > 0) { layer->data = bzAlloc(layer->dataCount * sizeof(*layer->data)); - layer->minData = layer->maxData = (i16) cuteLayer->data[0]; + layer->minData = layer->maxData = (BzTile) cuteLayer->data[0]; for (i32 i = 0; i < layer->dataCount; i++) { - layer->data[i] = (i16) cuteLayer->data[i]; + layer->data[i] = (BzTile) cuteLayer->data[i]; if (layer->data[i] < layer->minData) layer->minData = layer->data[i]; else if (layer->data[i] > layer->maxData) @@ -41,7 +51,7 @@ static void handleTileLayer(BzTileLayer *layer, cute_tiled_layer_t *cuteLayer) { // tileset.c BzTileShape bzCuteObjectToTileShape(cute_tiled_object_t *object); -static void handleTileObjectLayer(BzTileObjectLayer *layer, cute_tiled_layer_t *cuteLayer, +static void handleTileObjectLayer(BzTileObjectGroup *layer, cute_tiled_layer_t *cuteLayer, BzStringHashFunc hashFunc) { // Count objects layer->objectCount = 0; @@ -61,12 +71,9 @@ static void handleTileObjectLayer(BzTileObjectLayer *layer, cute_tiled_layer_t * } -static void createColliders(BzTileMap *map) { - map->collidersCount = map->width * map->height; - map->colliderMap = bzAlloc(map->collidersCount * sizeof(*map->colliderMap)); - for (i32 i = 0; i < map->collidersCount; i++) { - map->colliderMap[i] = (BzTileCollider) {{BZ_TILE_SHAPE_NONE}}; - } +static void updateColliders(BzTileMap *map, i32 startX, i32 startY, i32 endX, i32 endY) { + BZ_ASSERT(startX >= 0 && endX <= map->width && + startY >= 0 && endY <= map->height); // Top-most layer takes priority for (i32 i = map->layerCount - 1; i >= 0; i--) { @@ -74,8 +81,8 @@ static void createColliders(BzTileMap *map) { if (!layer->data) continue; if (layer->tilesetIdx == -1) continue; BzTileset *tileset = map->tilesets + layer->tilesetIdx; - for (i32 y = 0; y < map->height; y++) { - for (i32 x = 0; x < map->width; x++) { + for (i32 y = startY; y < endY; y++) { + for (i32 x = startX; x < endX; x++) { i32 tile = bzTileLayerGetTile(layer, x, y); BzTileShape tilesetShape = bzTilesetGetTileCollider(tileset, tile); if (tilesetShape.type == BZ_TILE_SHAPE_NONE || @@ -99,6 +106,16 @@ static void createColliders(BzTileMap *map) { } } +static void createColliders(BzTileMap *map) { + map->collidersCount = map->width * map->height; + map->colliderMap = bzAlloc(map->collidersCount * sizeof(*map->colliderMap)); + for (i32 i = 0; i < map->collidersCount; i++) { + map->colliderMap[i] = (BzTileCollider) {{BZ_TILE_SHAPE_NONE}}; + } + + updateColliders(map, 0, 0, map->width, map->height); +} + BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) { BzTileMap map = {}; // Auto detect tileset count. @@ -123,13 +140,13 @@ BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) { cute_tiled_layer_t *cuteLayer = cuteMap->layers; while (cuteLayer) { BZ_ASSERT(map.layerCount < BZ_MAX_MAP_LAYERS); - BZ_ASSERT(map.objectLayerCount < BZ_MAX_MAP_LAYERS); + BZ_ASSERT(map.objectGroupCount < BZ_MAX_MAP_LAYERS); // Find slot i32 slot = -1; for (i32 i = 0; i < BZ_MAX_MAP_LAYERS; i++) { const BzTileLayerDesc *layerDesc = desc->layers + i; - const BzTileObjectsDesc *objectsDesc = desc->objectLayers + i; + const BzTileObjectsDesc *objectsDesc = desc->objectGroups + i; if (layerDesc->name && strcmp(layerDesc->name, cuteLayer->name.ptr) == 0 || objectsDesc->name && strcmp(objectsDesc->name, cuteLayer->name.ptr) == 0) { slot = i; @@ -139,33 +156,25 @@ BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) { } } if (slot == -1) { + bzLogWarning("Dangling layer: %s", cuteLayer->name.ptr); cuteLayer = cuteLayer->next; continue; } if (cuteLayer->data) { BzTileLayer *layer = map.layers + slot; - const BzTileLayerDesc *layerDesc = desc->layers + slot; + layer->desc = desc->layers[slot]; handleTileLayer(layer, cuteLayer); - if (layerDesc->handler && !layerDesc->handler(layer)) { - bzFree(layer->data); - layer->data = NULL; - layer->dataCount = 0; - } + layer->hasOwnership = true; map.layerCount++; } else { - BzTileObjectLayer *objectLayer = map.objectLayers + slot; - const BzTileObjectsDesc *objectLayerDesc = desc->objectLayers + slot; - BzStringHashFunc *hashFunc = objectLayerDesc->hashFunc; - if (!hashFunc) - hashFunc = bzStringDefaultHash; - handleTileObjectLayer(objectLayer, cuteLayer, hashFunc); - if (objectLayerDesc->handler && !objectLayerDesc->handler(objectLayer)) { - bzFree(objectLayer->objects); - objectLayer->objects = NULL; - objectLayer->objectCount = 0; - } - map.objectLayerCount++; + BzTileObjectGroup *objectGroup = map.objectGroups + slot; + objectGroup->desc = desc->objectGroups[slot]; + if (!objectGroup->desc.hashFunc) + objectGroup->desc.hashFunc = bzStringDefaultHash; + handleTileObjectLayer(objectGroup, cuteLayer, objectGroup->desc.hashFunc); + + map.objectGroupCount++; } cuteLayer = cuteLayer->next; @@ -197,7 +206,6 @@ BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) { } } } - cute_tiled_free_map(cuteMap); createColliders(&map); @@ -206,28 +214,62 @@ BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) { return map; } -void bzTileMapDestroy(BzTileMap *tilemap) { - for (i32 i = 0; i < tilemap->layerCount; i++) { - BzTileLayer *layer = tilemap->layers + i; - if (layer->data) { +void bzTileMapDestroy(BzTileMap *map) { + for (i32 i = 0; i < map->layerCount; i++) { + BzTileLayer *layer = map->layers + i; + if (layer->hasOwnership && layer->data) { bzFree(layer->data); layer->data = NULL; layer->dataCount = 0; } } - for (i32 i = 0; i < tilemap->objectLayerCount; i++) { - BzTileObjectLayer *objectLayer = tilemap->objectLayers + i; - if (objectLayer->objects) { + for (i32 i = 0; i < map->objectGroupCount; i++) { + BzTileObjectGroup *objectLayer = map->objectGroups + i; + if (objectLayer->hasOwnership && objectLayer->objects) { bzFree(objectLayer->objects); objectLayer->objects = NULL; objectLayer->objectCount = 0; } } - bzFree(tilemap->colliderMap); - tilemap->collidersCount = 0; + bzFree(map->colliderMap); + map->collidersCount = 0; - *tilemap = BZ_TILEMAP_INVALID; + *map = BZ_TILEMAP_INVALID; +} + +void bzTileMapOverrideLayer(BzTileMap *map, i32 slotID, BzTileLayerFunc func) { + BZ_ASSERT(slotID >= 0 && slotID < map->layerCount); + BzTileLayer *layer = map->layers + slotID; + i32 dataCount = layer->dataCount; + BzTile *data = layer->data; + if (func(layer, data, dataCount)) { + if (!layer->hasOwnership) return; + bzFree(layer->data); + if (layer->data == data) { + layer->data = NULL; + layer->dataCount = 0; + } + layer->hasOwnership = false; + } else { + BZ_ASSERT(data == layer->data && dataCount == layer->dataCount); + } +} +void bzTileMapOverrideObjectGroup(BzTileMap *map, i32 slotID, BzTileObjectsFunc func) { + BZ_ASSERT(slotID >= 0 && slotID < map->objectGroupCount); + BzTileObjectGroup *objectGroup = map->objectGroups + slotID; + BzTileObject *objects = objectGroup->objects; + i32 objectCount = objectGroup->objectCount; + if (func(objectGroup, objects, objectCount)) { + bzFree(objectGroup->objects); + if (objectGroup->objects == objects) { + objectGroup->objects = NULL; + objectGroup->objectCount = 0; + } + objectGroup->hasOwnership = false; + } else { + BZ_ASSERT(objects == objectGroup->objects && objectCount == objectGroup->objectCount); + } } @@ -238,7 +280,7 @@ static void drawLayer(BzTileLayer *layer, BzTileset *tileset) { for (i32 y = 0; y < layer->height; y++) { for (i32 x = 0; x < layer->width; x++) { - i16 tile = bzTileLayerGetTile(layer, x, y); + BzTile tile = bzTileLayerGetTile(layer, x, y); if (tile - tileset->startID != -1) { Rectangle rec = bzTilesetGetTileRegion(tileset, tile); DrawTextureRec(tileset->tiles, rec, drawPos, WHITE); @@ -251,7 +293,7 @@ static void drawLayer(BzTileLayer *layer, BzTileset *tileset) { } -static void drawObjectLayer(BzTileObjectLayer *objectLayer) { +static void drawObjectLayer(BzTileObjectGroup *objectLayer) { Color color = ORANGE; for (int i = 0; i < objectLayer->objectCount; i++) { BzTileShape shape = objectLayer->objects[i].shape; @@ -282,8 +324,8 @@ void bzTileMapDraw(BzTileMap *map) { drawLayer(map->layers + i, tileset); } - for (i32 i = 0; i < map->objectLayerCount; i++) { - BzTileObjectLayer *objectLayer = map->objectLayers + i; + for (i32 i = 0; i < map->objectGroupCount; i++) { + BzTileObjectGroup *objectLayer = map->objectGroups + i; if (!objectLayer->objects) continue; drawObjectLayer(objectLayer); } @@ -324,6 +366,13 @@ void bzTileMapDrawColliders(BzTileMap *map) { } } +void bzTileMapUpdateCollider(BzTileMap *map, i32 x, i32 y) { + i32 idx = y * map->width + x; + BZ_ASSERT(idx >= 0 && idx < map->collidersCount); + map->colliderMap[idx] = (BzTileCollider){}; + updateColliders(map, x, y, x + 1, y + 1); +} + BzTileCollider bzTileMapGetCollider(BzTileMap *map, i32 x, i32 y) { i32 idx = y * map->width + x; if (idx < 0 || idx >= map->collidersCount) { diff --git a/engine/breeze/map/map.h b/engine/breeze/map/map.h index 8d42870..31fc91b 100644 --- a/engine/breeze/map/map.h +++ b/engine/breeze/map/map.h @@ -8,14 +8,38 @@ #define BZ_MAX_MAP_TILESETS 8 #define BZ_MAP_COLLIDER_DEPTH 2 +typedef struct BzTileLayer BzTileLayer; +typedef struct BzTileObject BzTileObject; +typedef struct BzTileObjectGroup BzTileObjectGroup; + +typedef void (*BzTileLayerRenderFunc)(BzTileLayer *layer); +typedef void (*BzTileObjectGroupRenderFunc)(BzTileObjectGroup *objectGroup); + +typedef struct BzTileLayerDesc { + const char *name; // Matches map layer names + BzTileLayerRenderFunc renderer; +} BzTileLayerDesc; +typedef struct BzTileObjectsDesc { + const char *name; // Matches map layer names + BzTileObjectGroupRenderFunc renderer; + BzStringHashFunc hashFunc; +} BzTileObjectsDesc; + +typedef struct BzTileMapDesc { + const char *path; + BzTileset tilesets[BZ_MAX_MAP_TILESETS]; + + BzTileLayerDesc layers[BZ_MAX_MAP_LAYERS]; + BzTileObjectsDesc objectGroups[BZ_MAX_MAP_LAYERS]; +} BzTileMapDesc; typedef struct BzTileLayer { i32 id; - int16_t *data; + BzTile *data; i32 dataCount; - i16 minData; - i16 maxData; + BzTile minData; + BzTile maxData; i32 width; i32 height; @@ -26,47 +50,23 @@ typedef struct BzTileLayer { i32 tilesetIdx; - void *userData; + BzTileLayerDesc desc; + bool hasOwnership; } BzTileLayer; typedef struct BzTileObject { u32 id; BzTileShape shape; - - void *userData; } BzTileObject; -typedef struct BzTileObjectLayer { +typedef struct BzTileObjectGroup { BzTileObject *objects; i32 objectCount; -} BzTileObjectLayer; -// Return true, if you want to keep data allocated -typedef bool BzTileLayerFunc(BzTileLayer *layer); -typedef bool BzTileObjectsFunc(BzTileObjectLayer *objectLayer); + BzTileObjectsDesc desc; + bool hasOwnership; +} BzTileObjectGroup; -typedef void BzTileLayerRenderFunc(BzTileLayer *layer); -typedef void BzTileObjectsRenderFunc(BzTileObjectLayer *objectLayer); - -typedef struct BzTileLayerDesc { - const char *name; // Matches map layer names - BzTileLayerFunc *handler; - BzTileLayerRenderFunc *renderer; -} BzTileLayerDesc; -typedef struct BzTileObjectsDesc { - const char *name; // Matches map layer names - BzTileObjectsFunc *handler; - BzTileObjectsRenderFunc *renderer; - BzStringHashFunc *hashFunc; -} BzTileObjectsDesc; - -typedef struct BzTileMapDesc { - const char *path; - BzTileset tilesets[BZ_MAX_MAP_TILESETS]; - - BzTileLayerDesc layers[BZ_MAX_MAP_LAYERS]; - BzTileObjectsDesc objectLayers[BZ_MAX_MAP_LAYERS]; -} BzTileMapDesc; typedef struct BzTileCollider { BzTileShape shapes[BZ_MAP_COLLIDER_DEPTH]; @@ -86,8 +86,8 @@ typedef struct BzTileMap { BzTileLayer layers[BZ_MAX_MAP_LAYERS]; i32 layerCount; - BzTileObjectLayer objectLayers[BZ_MAX_MAP_LAYERS]; - i32 objectLayerCount; + BzTileObjectGroup objectGroups[BZ_MAX_MAP_LAYERS]; + i32 objectGroupCount; BzTileset tilesets[BZ_MAX_MAP_TILESETS]; i32 tilesetCount; @@ -97,14 +97,25 @@ typedef struct BzTileMap { extern BzTileMap BZ_TILEMAP_INVALID; +// Return true, if you want to override data (you are responsible for cleanup, if you override) +typedef bool (*BzTileLayerFunc)(BzTileLayer *layer, BzTile *data, i32 dataCount); +typedef bool (*BzTileObjectsFunc)(BzTileObjectGroup *objectGroup, BzTileObject *objects, i32 objectsCount); + +extern BzTileLayerFunc BZ_TILE_LAYER_CLEAR; +extern BzTileObjectsFunc BZ_TILE_OBJECTS_CLEAR; + int16_t bzTileLayerGetTile(BzTileLayer *layer, i32 x, i32 y); BzTileMap bzTileMapCreate(const BzTileMapDesc *desc); -void bzTileMapDestroy(BzTileMap *tilemap); +void bzTileMapDestroy(BzTileMap *map); + +void bzTileMapOverrideLayer(BzTileMap *map, i32 slotID, BzTileLayerFunc func); +void bzTileMapOverrideObjectGroup(BzTileMap *map, i32 slotID, BzTileObjectsFunc func); void bzTileMapDraw(BzTileMap *map); void bzTileMapDrawColliders(BzTileMap *map); BzTileCollider bzTileMapGetCollider(BzTileMap *map, i32 x, i32 y); +void bzTileMapUpdateCollider(BzTileMap *map, i32 x, i32 y); diff --git a/engine/breeze/map/tileset.c b/engine/breeze/map/tileset.c index fac7cf5..5b37267 100644 --- a/engine/breeze/map/tileset.c +++ b/engine/breeze/map/tileset.c @@ -78,7 +78,7 @@ BzTileset bzTilesetCreate(const BzTilesetDesc *desc) { return tileset; } -Rectangle bzTilesetGetTileRegion(BzTileset *tileset, int tileID) { +Rectangle bzTilesetGetTileRegion(BzTileset *tileset, BzTile tileID) { tileID = tileID - tileset->startID; if (tileID < 0 || tileID >= tileset->tileCount) { return (Rectangle){}; @@ -88,7 +88,7 @@ Rectangle bzTilesetGetTileRegion(BzTileset *tileset, int tileID) { return (Rectangle) {posX * tileset->tileWidth, posY * tileset->tileHeight, tileset->tileWidth, tileset->tileHeight}; } -BzTileShape bzTilesetGetTileCollider(BzTileset *tileset, int tileID) { +BzTileShape bzTilesetGetTileCollider(BzTileset *tileset, BzTile tileID) { tileID = tileID - tileset->startID; if (tileID < 0 || tileID >= tileset->tileCount) { diff --git a/engine/breeze/map/tileset.h b/engine/breeze/map/tileset.h index a23bb5c..bc48bcb 100644 --- a/engine/breeze/map/tileset.h +++ b/engine/breeze/map/tileset.h @@ -5,6 +5,8 @@ #include +typedef i16 BzTile; + typedef struct BzTilesetDesc { const char *path; const char *texturePath; @@ -44,8 +46,8 @@ extern BzTileset BZ_TILESET_INVALID; BzTileset bzTilesetCreate(const BzTilesetDesc *desc); -Rectangle bzTilesetGetTileRegion(BzTileset *tileset, int tileID); -BzTileShape bzTilesetGetTileCollider(BzTileset *tileset, int tileID); +Rectangle bzTilesetGetTileRegion(BzTileset *tileset, BzTile tileID); +BzTileShape bzTilesetGetTileCollider(BzTileset *tileset, BzTile tileID); void bzTilesetDestroy(BzTileset *tileset); diff --git a/engine/breeze/utils/string.h b/engine/breeze/utils/string.h index ed60e6f..7e75243 100644 --- a/engine/breeze/utils/string.h +++ b/engine/breeze/utils/string.h @@ -3,7 +3,7 @@ #include "../defines.h" -typedef u32 BzStringHashFunc(const char *str); +typedef u32 (*BzStringHashFunc)(const char *str); // djb2 hash algorithm // From: https://stackoverflow.com/questions/7666509/hash-function-for-string diff --git a/game/components.h b/game/components.h new file mode 100644 index 0000000..6fb8286 --- /dev/null +++ b/game/components.h @@ -0,0 +1,11 @@ +#ifndef PIXELDEFENSE_COMPONENTS_H +#define PIXELDEFENSE_COMPONENTS_H + +#include + +typedef struct { + f32 x; + f32 y; +} Position, Velocity; + +#endif //PIXELDEFENSE_COMPONENTS_H diff --git a/game/main.c b/game/main.c index ae4228d..4d28d8d 100644 --- a/game/main.c +++ b/game/main.c @@ -15,7 +15,7 @@ typedef struct Game { static Game GAME = {}; -bool handleGameObjects(BzTileObjectLayer *objectLayer) { +bool handleGameObjects(BzTileObjectGroup *objectLayer, BzTileObject *objects, i32 objectCount) { for (i32 i = 0; i < objectLayer->objectCount; i++) { BzTileObject object = objectLayer->objects[i]; if (bzStringDefaultHash("camera") == object.id) { @@ -24,11 +24,19 @@ bool handleGameObjects(BzTileObjectLayer *objectLayer) { GAME.camera.target.y = object.shape.y; } } - return false; + return true; } -bool handleBuildLayer(BzTileLayer *layer) { - return false; +bool handleBuildLayer(BzTileLayer *layer, BzTile *data, i32 dataCount) { + for (i32 y = 0; y < layer->height; y++) { + for (i32 x = 0; x < layer->width; x++) { + BzTile *tile = data + y * layer->width + x; + if (*tile == 0) continue; + *tile = 0; + bzTileMapUpdateCollider(&GAME.map, x, y); + } + } + return true; } bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) { @@ -82,6 +90,20 @@ bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) { return true; } +typedef enum Layers { + LAYER_TERRAIN = 0, + LAYER_FOLIAGE, + LAYER_TREES, + LAYER_TREES2, + LAYER_BUILDINGS, + LAYER_BUILDING_OWNER, +} Layers; + +typedef enum ObjectGroup { + OBJECTS_GAME = 0, + OBJECTS_ENTITIES, +} ObjectGroup; + bool init(Game *game) { int screenWidth = 1280; int screenHeight = 720; @@ -106,16 +128,23 @@ bool init(Game *game) { .tilesets[0]=game->terrainTileset, .tilesets[1]=game->buildingsTileset, - .layers[0]=(BzTileLayerDesc) {"Terrain", NULL}, - .layers[1]=(BzTileLayerDesc) {"Foliage", NULL}, - .layers[2]=(BzTileLayerDesc) {"Trees", NULL}, - .layers[3]=(BzTileLayerDesc) {"TreesS", NULL}, - .layers[4]=(BzTileLayerDesc) {"Buildings", handleBuildLayer}, + .layers[LAYER_TERRAIN]=(BzTileLayerDesc) {"Terrain"}, + .layers[LAYER_FOLIAGE]=(BzTileLayerDesc) {"Foliage"}, + .layers[LAYER_TREES]=(BzTileLayerDesc) {"Trees"}, + .layers[LAYER_TREES2]=(BzTileLayerDesc) {"TreesS"}, + .layers[LAYER_BUILDINGS]=(BzTileLayerDesc) {"Buildings"}, + .layers[LAYER_BUILDING_OWNER]=(BzTileLayerDesc) {"BuildingOwnership"}, - .objectLayers[0]=(BzTileObjectsDesc) {"Game", handleGameObjects}, - .objectLayers[1]=(BzTileObjectsDesc ) {"Entities", NULL} + .objectGroups[OBJECTS_GAME]=(BzTileObjectsDesc) {"Game"}, + .objectGroups[OBJECTS_ENTITIES]=(BzTileObjectsDesc ) {"Entities"} }); + bzTileMapOverrideLayer(&game->map, LAYER_BUILDINGS, handleBuildLayer); + bzTileMapOverrideLayer(&game->map, LAYER_BUILDING_OWNER, BZ_TILE_LAYER_CLEAR); + + bzTileMapOverrideObjectGroup(&game->map, OBJECTS_GAME, handleGameObjects); + bzTileMapOverrideObjectGroup(&game->map, OBJECTS_ENTITIES, BZ_TILE_OBJECTS_CLEAR); + return true; } diff --git a/rawAssets/buildings.kra b/rawAssets/buildings.kra index df3c310ef26fc4002081fa31bf41dbb02e58b41c..97105c04c76fc5313f6268202b3d2b230e894b79 100644 GIT binary patch delta 15013 zcmcJ01yqz>*Y*V6h}6)agmjm5Dgq+i-6GOGHwXeMAreD~pp+oeAw7zKfC5q?Ih069 zOUE|@KCjQ?`~B-(@B06L)|xfLIcHzjK6~$T_FVh8M zlJMZ;4Qzsa5kbmeA98KnNO<=oZiVrnW$JN~TXjOFUSBzt)gy?bgCihaDXrAgQfF-V zwczn+MIp7MWNQGG%a^?h3%<>)sZ$1^@F>HO{~J)ZxAEx^ux$Q>l5RNK|0&lTl-Q(P z`E{4t-Ldk~F7;RaE7FOdg|B8b9WQjR%oi<-0U4ia#(ty;>+AC+O1kz}ATo(7@a%en z7cB4noaEfoseN?xC~#k5FiINHMk`5ys^V{8=iOXWOWUbg{rIVgEGD@nFyT`Ra5#N5 zF?O4>YrY7oueh~Bl?R#?A`+g;WlzyJn)}f**`)fs2y!5=laW%Rv0CiS*E>89Tg~{C zeexo{C2E3MT=Je9zA~et*Rmt_B_p4=q3AiA>n4{!hXExw%%iRtID94HgfZ2R5x;aNy5R_vB{&k_ zc(G!YqKCAZ;_)o8uGb_!8huqUSv#ov)tGI))A0}sa9!~2lg9e-wk6zlJm|2YvjTT& zhsqJx2(K`L8*3)@om?+%MFg%M)~BQ^se^A%0v``MYV3W`V+yNnkve3FAT9kifTWS( z5|kxl^W=ZpDI=(F<<6O-{#lU)upo<1;&JMYBP*egHM*h9lU^l@^Tm1AH74Z6R~C~P z0%u&)l!uR<3>fA5L%i|t$n(1BF#42{JIgXXfqHZ{Q{gHe zKDa%U`m-6`8kAT!&yLWpC|(WFon5LL{6I1IW~gGlpN$owNB#CfuK%3+1&Sn3Scgp! zr)fH0ar&~@Ra^&eKMO{iZ#*?cp?XAS^0Ctr0$y6Is#sAs2m03wU1E5#M!k@2j8h#| zhS>2i7*{v(%mvnu*KNtXVj{nXyybZH;g)S&5sy~TjVI;fUvO=^Jym!q021=f=NBKv zu*FUz_4LZ{GE7h|MJG-dxgEeD2JV z=yqUVTQ7q%VoS;!hs~Y^`ep;x^i_Dg-m|SK;hoq{K1UlGgOgrhmA}OPs;_RyLv8MX zuxIhlp|{76yk1nEIQ29oae$4*!Gqk~9uMwp@qRGjdmr)yhe=ja zTsxMWjw=U+56kRayyykC4?|YA7M=olv~BU!l z-*T|}Qohq^62CI%{767*ct2;NHz8oP`0>Mc$IV$hsVWbx?my+b%_-qOs_EjVgL z)O)IX(Cmx0zU|i6*2>d;dzTXmv(tQ(!mj3;sn}7AK&J8BLaSr>$YRSYm}}8i4ewab zpt*F{sa}b={>T99{iEdxz_LXwXOq0$cB+i0^q*E6X@PDsU>pX*jmvMrbB z68P*gVm&jtw|{#obN{w~%kENJuA$Pc&J*QIIKyyWiJ27fNp6 zMCK3D|JlO-p@K(JW_!o~FlC~)VedqnH)m?x==snU)oU;{GeL6#{ns;Y8??bOYn?<> zb8^FNy&al*F2jRnlFWk^YVl**Q_aOWlA-Ia&0&B5|0Xx~b+U+zwJoQUnQ@lzGPkh^ z9WE7nrx%)(o~TQ>drxz{=f}Tf!oLOS`%<3nY73^Rq^^3;UX3oJ(DJNsjUd|LiR567 zxPB*%9Cx8WUVy$uaZs$m@~I?~WDc@F(O2wZ;iD{3j*F;>7u*q}bOhx5Z2k+zXyOzEoHQGx1pS2xZ`>F|5f6 znnQql$Bud}@$ z-`zWo;6-w()dx4V)QAaSm{SMwHFf1%AP_nVKp+7;^oaw6bpqr9iRO6J0C~nWWd%L| zr#~_Sycvc9kbvJeH;=ZFnLKDfuz}*Yg(r7o}}X_;&-iZ7;p*BYS*Jjgf2WH#f99S)O;pSIk~y; zE$*I3em;ndY)EE^k&1gn8r9f1emP!le`RKLbo4`H?Xd8bdYK&Wh)=`qWj%b)hCL@M zyrSeb`@%nuxi`%7pomex!>R>$kQi$w2x)@ayyJExTGlt_4wi+aH_g@|8<6yC{y&+4 z9BkwwQghM+=P}{?uzL99tY_)#@Oh)9!_YKjzO8@r^eI;c%k9QHn!1 zj4H9e9VXp+V=}Azz{;U@>_(<2IJDNU+3jl}ypI~MY~_ehvB3`rxf_zA+dXoRXQwJY zJ9u1KsImfYFNBs&U&aw`OC#A@sWY~$XZ~2=dO|`1tpZjP8F_KCJj7{t^v&oY4>U4p z9(0O#u^`zJO8>kPY6POc!F@`V9aL=&Hs$n*fQ-P4zw`|05 z^y}Zf5N-98==Ro*kIBAXHj$jS51xs?~{QlC6{6CA~S%Ff|uaFb9%Ka;hJ> zeT}FT-p^$t46P`>RKu^zSrM-?+kQcNqn0|ZHwl_6nX?v( z#sWNbDUvI-9G53yJx>i3wXEo}R;PNyl!()!YXE@w&16uSYWo(mtzT@+#Fv6jB|5B zb8EA<;|N26g3})5*iC1-XBGP&P!wH_tt)t@q}7QVlXW$0 zg6`S;c8f$BwPm1WL`-;G61u=~MUUojdbew$lN~_{W02ffK6^ zTY(4hIPl25D@(XH`5*2Pm0+>6+&dz&`MEL+d{>Gel;M%e48>^`oPLsAE`D_hq3!r> zQm8V2$^Ly27OL=tu_L|H>xQq?@oltnaQf#cJCjkVREZM$yo(GBZcfA|+&9VA_nqR| zoo>fkn^Ki5Ltyt=7cZ?ZO4#4eiT19d;LKD~@ZfTL{W{Za|EhH8THv8fS|=52gdvn^ z7r5EXKz?%KGIFvGno(Yf-<8d5MG|}WK&k?>vWQT!q-<0lbiIACa9XqXU%9%{4(S!B zDU-J5c-1GpzWUQ5y@IeBmX$Bm%Y{^>U0<#U5^*NBkwv? zxph?$tD%T#${NRJW>+m7MieR1ZeH5@TFjPos<;SDQ1aPWVca!ozImhb$H|v1;KhO| zL&ArT_ujqxc2^=QrCm(QgtaOtW4Ye${yk-BsgY-?$|2cLzTxTB#!lzdOYF0$Ss4RV z2Qv<2EN*s?!eP*pXlLMx@T5Pr>v;{`IGF-Iqfqh~r zjtDqxFU|M$0C?#{zsXr8=d)B^(lCg?hU7g1D7Lre+RW@kJH4vG$Aah2A0RBvR2(`V z&{uIkkf5ruf6#s1Sb~q!o`s6%O$jhCU48k1|Ca(5$dBL$E#Ysi?vAgys$VgBu=>=x z^4;`ZxUFrXid%#2wPiE^P7Szfl&C1Op@MpNo{Tqf^JNd3ZmH@=DuWlY&DbGQ|| zm&{p(aMQBLxy5zYq~jU4-WySV(Dq{P8>JoVgc8V~!k>(G0k&52cKz~&)`OqTfcBu! zYv-Y^fxggWM3$w`;$`Y6LUthW%M!PdP-T(|N6IaRjE}2Mf@82qT>~@u+?-6Vfqbu> z3c~0%n-PL`&5S61Kq^4DMWvF$M%A8gO>`lryLTp%4(PGxHZY5pXrJ+RIi|^E+>)H2 za}l6v_IFv+`*AhziAh4Cw)B%s7EJC7<+o3-nYY4GSgOJ?IR9RQBj3UBq(pG zf@%?=Pc>Q1P`4gsh_lea8+HK8tb0M}(P8V=_XLup_|rd@C1n!A=7@7^R)6wlM@$X` zhexklu7%(P)s=|fL;83-+<+08_vt8h`IIt*#Gc%c-I zg=jg*@HW1$F*-DsIDGBIj^Tq{3pir12=u%>%gz3Tys8s#Kj+sFwUkwz zl@s-Dn57&vhU;z#E*&fGtdat|$5ThD>PCV(%K0b;CH3=RT zK1wUwy|c6u@l$E+q%qhC?mL3-qf=T3%Bf5oF`$d{O@-aDa!JU_HK4!qK)6mK+Fs4$ zf{q9o5th@#E2I6M;HP%Lg^T2uiig1^iZjcu3CwA+$SD@3@VHfCWt-jQP<5s$ouFMh zqC%rn>V#^XTLC{?A6vKCNeR=gtvzQTzofZudnwP4Tqrjh(xSxk%rs1c%x$8n`BAP2 zDHSz7wHQsH!eW!(E)P@C9ouGS8*+_BH8)|j1E0-gqWg40;!)P(Zy z=6XvS+?A-j;<-PUllexAeub!Lc3^*Yl71;T*$(F-?#_>#=g(R0`JYlV*L~=PB&(a9 zBuDRbFV524wzj$^8E#GSSM5o{@aMu$iO7)ci3hYq zmb6*(5ThTso#u^6_n!m2oXmbbMC|QZjs|ea&vB>o$9r}bd#%zdV=WH}`6ZIm+OB=; zP5X4{OSe%@`Bcc0wJk{Yg-sWhZ16Izmb9(d^5pnq6H?}fb0Y;QREJG|a6Xxg4ohqg zWnFINP*OJd!`9>CHHhxx5kUBp^PUOnQO8USoir72SLi3NM|%uFODG@W`n1cqfPB++ z($ex%TsoG%zP{0Q9g5BuZpxRR`#)^PHmkCenG*xYh|5a%F5MPZOkixODdsye* zsyh7IbWG5`D{1G)SZ!AH$Nl*Hqs z?D#S{30G9G{v0Ii@CpC$7*5Zj;Off#K>42a*Ven$aU3%n4ZzJSIQ^2LtYquBjvv!Q ze6Es{Ub=u^QBm>X<44v6bt_{kX}{GM<>ekj&y}LsA!}@~(_Qs^vo6~cfsmjU-Tjk} z0a5{KgTVd6h6OuNIJgNE$wd66!_Eenxvt50Jd)ajn0!cUcVzBUteD> zW->hX3lEf;$?ihKK(blAw^HW)%xf9aW}CB~QO|tmo)?vwI`#JjJ$iiq+MS$Npj{E+ z1T8Y-&%3Z(wmnMo*J*=SLoN=0X(9#qlMsk3_-7SrO&(r=x2YmGcTTMv!Jj1&w6h}Y z<>_f*QEsEs>^4TtrohW}{q|V1o-4zkNmP3rL(mUn$4t@VmMlQl@yF<{XA1x6>h@iU zU}7QPo`N-}=1DxZS4-QDMHFq^YYdnPa^1KD1D6IKF5g1211V3WCtc1zdN;tO5t ztHYVHguDv%3SDTb(Az7TPp)NC5b$6oB|m{hM&|Td33#{SK3)D{`oTz_h2gEYUCaqh zW?C>1@8AA>`IcGRhg&AVX30=+xrPrdQRHms{o1E$z^E!|N1^Ki%kr|H-=uTtk;_3` zx-boqQgj#*c$DnN8msHU{AVA$vX9(Bcxh_lN}zD-=vgI;jGyeRxdY_Zlkwi5twuK~ zp}b^*nNGF*Pc{A>9L(j%ZWCSNtUZdA?_R$Zz$#Cm_FPrHXUWd;?f}fXZOF1%Y;E^o znM!#%9+0m(bSG!wSF=IsZvCu_t}c7hL+wCA6v?6vzEEKKP`Ntqg3Yb1b^nE1TjSi1 zYxnc{tvn<%2O|6ra z0RbX~ddD(nyRRi;?$U}=@0Qg(p{w%2(88ptt0>>nkC&jdL`oMe`4`*{3aV|@c|w&8 zacw|Gghw5M)jd`M^oD`UARLz(x$B1RrwXVRoH5Sux9dYs-Xf=x(6b=IL7%7uXdc^Ue&c27+x6qge`DIyP-I!qKi&C&gM~q#U7!)(xWrROf`WD{8vaiRq*iQ`@FevmXpJs$^~vv}cmu6K z@*yZ;Ir*z7Q8^F@B_apvV{StU1E@E0%persDN6u)hW|(xIR2klWudZD;VKx4 zF3Tno&2uDvgt1`0SFXdPSV=Io+9mb+1|zhmbTOWy#}NkW;uQb(6;w=EFflC726%Hm zU2rQHJ!uFLis85Ye>s8?Z3Zh4ijfCJ0J4&@!b0)>_a8R0C|0R7BZ#>cZQ}ncZq}=41Rm*sXGdYxqND2%JMt@?*)ee)#!(rlM8SGyU_BZR zY!NUufPW$U znB>5g1kYo`FbD;ZO62slGd{#eKJdQ?Yi0S-=Q*!JG(gW++Lbj1t9Ji)B27v-Z8=Um(whR+Tu=Agt#gf?!t2#5u?W z4|wHoAS5h*g4_*7gPbjcu^U_C?bsmDTWmza3ouhHTnF5X{TKhW-?a95zvhY<4FGdu z3xgN1Y0f8GTM`V`IG^pA%3Gc1CPJL4E7$dxx*CYvTB2xm1awDF8P0jd zYT+wjp1<*iT>gU>(RUe&UCSW}Avp^sgg7~b6D(e9MGjH>o0t{*A7ZtH7JpGvH8j3d zMpMe2Q%cmDi$S#hCMz8eIg6rNw27q8NhD0sB$Bn(rV!!34V0*WP$W*lNPhbv0^M>h z!4eALz!eez*OI7jpmU6TZG0#s?0h8J4;&C7fkXi%=D#E{f7g11f-js4XO?4x1;G-a zj#Es6A{8L`MaoKdqqmb++!!5i-$JXxML#1@dZ0s z73AM5sv8qYVV!Cujk7)(VZ{yms!oF)Y{HWE9o2m$TOz1JCx)Ks0vR3lh52=xQmUX{ z2jP}9!zR(DiGc}WnE_!L%hngW4n@m`KYf<Ad%5O1u9BuKxhz=rI@_aTmVa;KQ2cfWSNvOL&ZY4EZ< zo}8O`bt-WvsqM8H#Bt!+I3g+g$iH0WV>Gqt`xt*NO#+eQV%-}L@X46vLqTD6^7D8| zI(G{`*o^zr)7W=c;9A7qxrL+Y`6NX<*8)@~fqDM~S=rJ@;>Y#D^G4!TbjHa82If9| zV=YhB^jGW+D-!%pj%!K-yN{GQN~PGxP5>{b@aMDcW2RRjSb-N_)*tjn?QIFnS8W^` z<%16Hj4YjSiu;fRN)<~dYU+oG8cBQkUyJ~OA+-cabcgj?3ZKDyi$9lD__Sp<_U7v3 zfTOnSU$z5s0~Y7qshm%CTmkXJ{V?2KKBCzIto`k`Ex`*}9B3Wy7-MG0=oNw6>>?|B z$`i|+q;_Gm*DFO9wtO`{S~pJSU2FDrEIcxr7WvO$|HH#msk-%_)DEI?)_b!|$NtVg z*ghq4#BT2Q$_Yz)t-1I1Bce8R+4q5M1(6wY{+j5t$YVs?4QEz|_jDU62J?th(-Kc} zrE#?!%MR0KTPunv>#s{kn|>KZt`i?RYG&Nu=|4lW8IjQ}Uz9JJD+0<6VM|kUL!Ofg zBg4)U2o2o;#Or0wskdc?TJiyNY{>z-8|gQKwb4GYzI2)=oEom>CPs;=vZeP>Oi?h)Te)My)IjhPC{t?V z)++Gn%HAuchF6|0%uGA(=~B_bn~R|pX73;I+Nd^;jLy~7s%1B$UWrw`TCI(_YifAX z;7zl<)VN48%ty;f2!^mx0ZuERm^Z6M!&+9+1z0uQUmbMQAS1=41I{gkED zsJmR;IK_=996|R^Ge*FBf66NHnRyorFBpQgV`4SU7pj*SJR%310YtRrOhbTvPPNtv zhoA7oo|QZI2v21-s50*jevM9Tb2%-ZC131kz!D80{VGpP-Y||Y5y8E~@-#!s{>&a6 zSWByi{M2`dbV19-Ri){@=EH9WUu#)bE4UomA(MdpmPP;JkY)-F+ur*|j$wAaDhUi| zB_b)JBb%4-0l@8g)jD735nm`xWXs`aYR7HZ^TS`yn5D--)XsW8C}AyK7yQpSA&|8(dY3x4&cE-r^y91PaT%sNQ<) zHbo%O{srtOBj84NAhuufWdp(Q9@7d$pq-+pg;yCi}i*wAi(T|>t>+Q4{r5ZgC|*>~*W@N98W z%kjd6`HyVqEeQ+>!51+2kBf`DlPi8;4!1r5J>xT#UCAmr z0!~R8c`N*nO$V3?azN!nnz%$|6`N3X-n^C}E44GQ>4`uATz&jR@pYqPzj z#3q>y)M8QB*PPVm&1F5>)q0W@ysleW+9UTXi5~63rOp7VzZp7n{g2n?s2A)kUj@aSs@qLPH%Xol#k1ke5|ek zFqe788zvVHM}q9kL_IVTvw&h){!g&Z{CyJnz;<{5r)*Q1<8+?f09WYt%(K+3mW9cw zH1hT`U?@Di#G*+G*ncFKA@^~i8#qBEc2CKX%NbLXwak04ISgq;!X}{t?^<7Cwl!w? z>`eKLNV$2DVXjc$Ter~n@93=rO8JJ(;8bm*<#0IoKK%9+e063{xVL8tdwry?SIgqK zzr#^3>u_n8ebM7>;$j1+{{!+q;!epY3s>;dq(fqjF&W=q@r%9Hj65Ua&) za^aaaD#4cH@gs9kR>1aconh^9zi;hNq``N%!bvfjoaYr-=wVhsvs3f{H^Am`^c40T zVR7CaW?u`i{neNb?%PzKYL{4M(Vu?rsPq;* z%Cej`BtBf|1;1JE?@rFa+ORgErx9ecxa|?8fZ6`?7bAl&p{Ao&^Rl zeVGD^16^`Qln~b6Z6&;qe0rY)`tdEtcw{5CVQ=P3yI-_477?yNqKAG`H=n#)Ii!iy zCJxEe%njJI(?3P0j>^Y8qTii=$Oi|Mc>5twn|I|ZLs%VPJC;$iIl3X2Qv$F-? z&-`UY7FK=(oLhJ7W`6DGF%{CB^R&-iVtX(A2uzlQo;#H~>4~#6aN)5W=gaS)tLvz* zHdxu*YAc7NQ+tPB?;!ZhO^iMuHoMe_7z5@KIv1WDCE8$FCHtH2ex2SPTdJDFQhL8~ zNH&*QroU9#B^xqq{e3TFSj7ShkBGUi=5z0(l(hi~2$|Q$Vwju{|Hd_9;HY+KT87L2 zVD;-4K1znr3gZ*+w*We;4tT#8>8v?T&G!$9$0E8*K*od&7Jf0Bdm&aCJ+m*-I)YI6)P??VGH6p{ zG8$N)ZsEE)88FLDm>K2SsGjO4#_CW$D!1&fTpzg$=5gihs%@(CH2YD-OXvR1V~C{9 zMYMt%3<0o6ZXhor!x-)kT}H*1W1M)c~J8I?SH{)Ocd1pt$O!csN3^wA8l;2ok3)C)};|YxTzJz zJ+$_Rm;3zbP;mW)lrgZlpm>wxC09yArADf(O!R@UtO25ei$Xs)Lzu^N%4o@_;kADN zq?g_tRIj^9@-B)?N9bLV7gTQyU|es}r^NLZxoF>EVh=ykJilsoRL?2~E7hm#v$D zXe$+8CIi$5TCV2U6TTf?(KUQ&54;&W(s568;3bnrpWD#eS~+1Zd1(9o;e`ml^7!MA zH{~$K1!$^6ML{{TjaSsp(q<7hdKXw80-osx)@d0|`9y6rapu2zvwfytcAoq|t5u4< z?j6(@w{=r0<8%MWXU8J>Wbwc9t6XCMs|OhoY*Swn1Ug-0KU-idiN!ecWf;#$_Kqu}u*h{cEF;a-he3+aCj>ziPwI3LrtVppi zD#@U9l`%Rqmt{em36KpVyIXr)qUUMbJlnaXSp!)UP<`zSyC$OIn#P$CNwm;Q`YnSe zB_^GKA&C!2LMzWY@aVJUnQFl$-8Eg0;mz6uZsEXkO7F?}bhEJxoKu%W4?Zqulice% z*IE;A zT1~~JZl0Y!`g3{u#Xr# zO=(MrIqQj0vqGqWZt%t|T-BvG^O<0nm@7!kd~P!tuG=~#dYs?Q51bpu57N*F{y=wB z(|V$r8POz7MsVY7x;0#7-MXMLZ}h?P%q>ZwBuE8@JIUue-7EatTYLyG4%Eoj6|!;T z*uHmaZ8`05EV^7&B0KM1;mOzG=be#>8$3;rkzQut?k|5-9q1d9T%0w88CF370aj-3fV=iGtlrLU_MX;v9PL?|9X#FL zWLO1i-%&xa&Wk^t)KKBGD%S5`cOVF8pxkG_`1tc-T#PoDr!p^vJwca!&mYbG{bcS< z4KRce`ukDdKcD!-NMl}?!W{Ab@%-nXf|wfs>hmiA5QzF*=$9lMK}HLO@%$-4Kc&oq zj~;@Bf&Yg{uh@!49#U(k4T{ZudHZ*#7O)n zD?UFP1w$Ou|FWVs9hz-&2I0Z*U$NDE$4LAqHt-^56bv!J@QaO~9?d38h|ppDuh>M$ zF%tiY4LBPGLo_k|Vk2chvo#7M1eyLTwlPVJ#D8LAm%@yKAu^eMEs1{>+|e5j%|BL; ztr=p24N6NU@W--5gt4I&d}DFei>brI&Vp@&72S$udEN?VhLWGHxPO)6{|#O-?0o14 zW+?F)z!_{-_<1Y3GXFQ&l z(U}$gRpI|PE12$L#>4(?QfJ0!-^X;)A?nzmG{0?p;Q-Tm$fC=@b49xpLM(hgiGxD+Z-8F216G8Agi`zx?-k-%~noMc)qm%|kuETG2NI zN7R0VhlY41qL<5F_re|J@Up?Pv&$`i94+v{^DD7`gh|HaJPznj~IosO) z8R|tGP&%k54io{-15=X=3I5r?j_IHO)sMNP_y;&t5cgb?Qb_QBLyzS|OS^MH5wAF* z?B5Xg%f1j0uTIo`8#y6 zjCiKPTl=xyq0>Z>bBB@%FiC`{lK;u&ta+9B#?6@)ioS2l2iZe;eSof0ifAgUK-A4j z_<(-N#)~ViSCoa>MM8t`!TCM+93~yO)OB^TOgU%2_y_nNEwD!w6{@!*)jhLC48JX3 ztu!WodwcoQx?n91$=ol=YLwPq9q1jkAA=q#k$>(hBK`>s{*FjH%ShJ8wFuaokd)c> zPF;f_e=8opEbHm$CL2H;r{q0kCM2aOoBMOQhX-}bmBLGM`MewD_U_CaaUP08by&h2 zUisz@-q0hv=MsYB<>ke14di_DH_GSVhgG{cT7)szKxo72FvR<74Y>-%oQ*3}KU$HI z7ldY`>bl*_glw@tE8&F{>JniCVFX5sREj~?ko5?Cmi`DPCsBaWm~z2oLyxwSa_Fmj z3_9(8#s!^>&v>gpubJCEU#1XHiq)~_B-!kQ2n5Ht8D{C=IwU5@<*Zy65W+AdoAxOc zhm2KoZ5qSvU&`pq704!BRk1Q<{1Nd!wXAi2>pGtl#;`6K&w_X5cqL!{IPd*9t4kfk z%nuat<`VDZ)b#?Pd~7$Car=fPloAMJb9He#j6aLBjx@kfZpkqbHtd%_GDm3#=ji7b{m(%iVCwa%&%0hOFoMvGdlMy{U@}!drw{-H=Z;56fY=1aq{Vxjg%rB-+l3 z*zR@7XZX7r)Dv}QcF!gsr9+Z&VdjJH$4mhmxRR`s{P+@p7pO=62;<`@S+{^=Htsb~ zy(+nzOcI|tvM^kbInN#ulwSJuvi!?!Y%6hwIqL$K%?G;gqL?V;2Z|q;YI?U--r`R& zRJep4)M6Keu|xY(L6k9~Rci5*xTq~hpxby1x#~`MLZ5y(K}Y{OM%(Als zY)PDx*#bCpLBKVgj+IdRp6>#7iXZC*RBVe$G#RVi3P>%U-2U;p%PWHidI@UF&CoDG ze(SBx+m~-MldodM#09f&Mle6UH%BUPkItH>?eR*Mpvu8ecwN%e(yLFSe&cNB`q!V4 zd}c^;#r^P;=i|%c;(gv0Ae(Q7tDfQQiZF<*Pg!#3>xt~7gz(zLyfu8xn z-Pq5R#g~WKRDqDotybS-?%!p`x4)m@6aKhbvZMy|BQMZ>OK!oghOJiSo^it71E&{3MQYrU zWi0myNxB}1(F~zVvO~IbUiz|$73`36eBW=!(8HCyK-wIr#>7}rxl$b*Ufal4aC>0) z)xoX2l;e`{n}sv4iZ^R-TWOapOMefy`nvLq$zXqWdrZ#AGaw^G>v8s?-=?8gU*(hz zBCXX;c%v2j~siw>izt915ihn;Jq_X9A5D1+}F?E$Cd1OPBgO~ zTx)k}?5YaU^mEOX2^B0hH6tu8zT51OGC{NaWoO?>N@gEY7y#K4;?!5L=Gn+HbR!$k zag^|)(J*pK`|xGFNDglGkm$$BJnYuTotC7CcR)RD1CSV@DMd@)uuF4#GLWJ-f1J~k zL67LmBxNQT1agIfKqP1>`Z#cRv~qH@bFy|mJr^SHlxei^kxU$rF{-h(sTzR`jG1l2 z9?3L4Bf_~}6GcN1WimpP1w^Oi+8I&~r%%;yPP`L$`(+X~9d6eWpZZvpGz1*0GiMBt zSHP1df>3LC#JvXl0zIbb6tcy(x;N~=NP98~UT382 zrR(x_nF_=65%FB7R+sP>bujZVu=fhcze^usNHN0P^E|#R*=v8vJ>Ar1sKnV>qrcB| z^HWu2|J&@H_6lQH)KicSzeW5Jv|e{=$W;7(4`l zh+0n{aQrnQ8W4!MUR6O>$18O?)%zLkpnsdRe`nc`r7TJ7XoJ@Rh4FU{gP%PnT5KYr z4Fbus>js&q@>N}?mFGiDw>CeHEe9-{Sh1tHA7a2o!P%5#uppe^NSRAwpergksw$b5 zS6|=lPp=TKn2?;TmUW8~%h*Dkpl_79#aFiAgE%GR*5nzL)t#C!jBO_)tNTf^P`*O9xs`&0pdqbL3q zKAazUO9HbqLWxF0S5Hqo>_rha`FctX#EZhq=F!Fnj=9Yc4zsvB4PJ>GeQO5OLrogf z;xh1vU%^e%5ZoQV>k9x4JnmE9tIbWaYodO;Dkrt>&imwgw0bVnT~(#^@IH%*s#-Dl zruq<@MrHL$$_va(30B#bx9{Esd_Fw9c9%!WWk$ho;3MHJm8I@{j{e~hnCnKNwcAw9 z)|2-(={`5s*W{<(k$d6S@V|tn1a{#tg1>-03Ff~wLh&c2CYr#RsQPsLCD8X8^ll;o zq9X_CL5XXIL}fV4L5@^aE+Jz>>oX3EQ+e0If|f;ohEcUU0wMDixu7+mJKa;KD~Z1M zC?H|d?IHZ6p?<2pLPN_ermd}BQGr$Pc?vRQD(^=edtS|VZA?;%@7YUE+M|$1TBNS7 zuCq90oH5M?M2RvbV~EO?x8&?@DDd&6S2sBtDMY$JFbYuHoeqFlD=@N&yNQm0IEf2p z{=(P6gP3@6qNOE+`H=&F5df}BZD#PnV8@2w*!+TgXjkClFIrX445$vkz2W^%Isc@z zICHIaR#R(k$!6Y)kyH_Ej{dq^zhx;D*EP4FBHeR51hiImUFP6vpZhc<)%*&l!e%vq zs2F&1ja4+0ltkEp6>0a)y=ac2$D`Nhg$dYi1r^2AYK-F`Ujy_6KP4Eae>W52c?`Ol||f! z&>y!rW{HG5Fat(a4zk(~t`DKR0)%XKUkCiZVf#O7xwpWoaq9{#8Do=CQyt?`Zw&aD zerI@gQtdUpd}|(-{)!~AP$`7*vy&$%8j2~?aBxUk9qCp|;&jNgwq+ZP3}RTLTVpRB ztPf~9%Izl@YnT1V{&Rc8WsH`rc2-0rDl+%Mqm756pOFBzjHBr#^;I@X>CP9bzbJE` zIEsq|=H?5;UG)YAX!Kt)(r(P(WZ%-4>VU8&=f=EoeEumX7=9b_^%DJ!Qc3y!EXImo zp}rG8CO4-U#N3}8AZ|}Tj@tmi@oZ&rmOWSN@yBuAFky6Gt@r8xvoh>gUF&)%|21bz zPgY?MDnq#kY~M0xc#;794067qKN^8EA#lqunm&)c?W5MFLFIs)w)rO=`aMxU zk0uSfZWo!`)0_Am-gdsc*Q(t5`4%5|1h}T!TkB{qO?~KNR<^Zs>`|;)8EO)KhHxi2 z!g_(CRX{qb%n$iYV_3)*G)2Q)>=}k~ZI=T_n>)Al1mmx&C1h^VW#3|b5By1?e!X0ehqT5-&;S*N4bHjU-blchR(_kYYT2kaK z82U5p06>@#dG8oMDg^;O)6EkR`jICQ@Y}?V`840bX3B0F4<@phY@talvYp#EA64)x zLi(~i!P+p3x5Q3yiaBWXW26Y z&4%XH6WzA9vhz8s9HB&bc&aD`Pl5;6*hp3vfe&WryKCMte7;OHK*6ZZ}iq~E%{ z$Pc`Ay33J!_0ca({M|hdFPA}7+LbHI!iEWzM7z{C26h-*N0MbvteIwR#3mh{kUub! z2ry8zveIMMx#g)G(Xb*?zjAL($h#Tzv_Z-vMO$>vIrAFPnB`^BUTZDWJC6zqw%Bf2 zq}8|9&TP4DTd;5)21uKjOrW??K9_H=-EQp#L}b6i5*+X2ig12bVCu_d51R$C_c|l) zfkl2MD_uf6^C3>*$H3&|r^1pVrt1AWQFer_++^yyiiFoV69~gzF!h5R#ugq<#VQmv zP~qGz!avGtL}|%qX?ZIv=kA;p=M5s0w zC_9>nT#_KQl-Gl{Y5aP2c?(wI;Bh57R*yu6Sr!0-`pd(NAGHQdJ5H-Atk~Rlw~C>9 zGph0}7MtEjB+f{`xUQ-&*87*1omQ z7ji8G(*R#wLhSO^6=O~Lw;50Hq>r$tEG$f}d`*6e5iI+F`4>x9Ku~Sh7FCzu!gIB< z=c*5w+<%s}_~kN&pz`AG&`5kL&d$5eo#G{NJLo=xA;Mjrips~9>AI0M%?Gs63{XI5CFYpEXXL4#< z5wEz*PZ{{FJI!Z5MzRn$biXg)*{;I2OO=Xc=H}j_-zCF;;Ddt^ocZ(HJQiXYJn7XK zDIXHOAnxH{FK7J7pM!T*F?H0QQO0`>)B)0VmF z>w;?GxUgBtFGc#@-)xyh!I7z%&cnlY>W;5>-k0qf)6pssi&rv2%Y12D zoKotyoBfcqUqB(QOBtHh@Mhq>)}{+>N>uFYakw|;TUq+Nhsh!)6$FA>?M1d6Aw)~f zRRq1R!%hO5jTxi^xx&vD^=w7`61TUvMJ(cZWLgJrW`dtuPCo8@KO=AjnD{sh>6>jP zXW?79nu(8ix#E3whFV=kdkTf!t*o%`gH^+cE1|Ui)a#4LWpQ2K=-ahkxcI?iT7mtd z{B{C&`3oiFUaac*ncte7qnMgqi_snT*^D>78-M>eb;K|81K&cnUv5rJK{PRmWAb}t z8nfwwo-XU7v6MPL3&^KFZvZ8c?z!4y<#qevb#n&VYz769r}uR=to5g`lF@m?bkB0j zo-)7VFWJx}py5t)D^;JkDW5L*iGdz$OVqFQo;W?7@JOxuwSpILiFD72I23O*#VghAHS%Fen>5d zcEtL@qa1{2mFB;?FB&{KI5@J`PE1G8mBg=noiGNHo~|QEsC)bAtz^~GhxAe=Z7#H~ zhnyNtnD$@lutbK@N4lMjtBzDgbeoW)_0hh&zq-15{X5Uq2GUQPgV*&#uI?_w4-ZK4 zNo2}lE<477Ki`s3y@>(L+bzoRG3%?Vcb=V+ z1R|8R;sQt@!9i22_?@YO2Xrk0hq-pokw|4HC%Rm_7X_TY+e_Km*_OKY_V&zc;P>7= z%&>r-=f25XcaxC35*a=&Jmp0*0Sa#lW!Rn%6EY>ts*Jy6v_1xisg8{xp(XF;Q+LEL zeVAg_>Ovl-5CpLq&FGTRn+yba@=9+UYaGyh*1B*miryQhYd!-_-Q_b z^46oTT;Fvtp2a@^c9>cZ8G~Qm1g(QFr`j+<>S&)T6gMnajZxb_c(77XTztG=ZiS+@ z=}GrjcX3%Stey(+eVc1%1}V^9(6LY6CTnwnM9pF>E-s#YAGI%WJT4h53?F*!+vqh? z&MOcim*opHxudcF3Z;U>II@0gt8avXVy~)QV&0@o^u zpvZ1d-kc0BSvty%U$gwm$(wiPC$$WfT+{5K2PJP~MK6M8e2SCl9oeJAuF!6u1jO)E z1|vBQfhqZI;4zoI*M$FV6n)-D28>DSS@2yW$s4g`kF^rm@lExHeUh zQ%6C;gP-K*FArMpx6)`WQ+%fJ!D#rbUd)=l^38X+t!;;#!B5jZcn3zo$wKeNehNH* zX>5LZTm&dp1s>s+kIbpFD0|Y&eOtfZSwRVPV>yDnk2fOm|NinG>HQ4jg&R-1RCOjh5abjMeB7mzG&8|w9Aq&(LRiReV=ZpNR}Xri-+$CPrMq_SZZNRWV)F`(U+KM zOvJ-yuK-#X^|~fc*rhO(ZH5W?Y)fzZyJ}Cq?{s;9swRm3lG>5fi);06+Ei<$MhS$0 z88$ze$A{V@eD`5yeHNv+zbSvYcid+1izhsS?-Hzy69RlRzqUoWmNC1mL;eFxl%Si~ zI!2M);C>7_-gAFYnNBqm4C$sH!R1{IYhg`!S<~Jd^KyZq;j5ey+YIeD;>UH3Kii)S z^4xI4l062s<3EUg62P+TCX^yuE)t^RzTH;dx9%WhW$hBR4k+YX)!vkgHb?*V4^mas zP$-r&5BghYA(qdP4eJJ&0`l_+d3_KfQ<3KQ6%0l9kYW+eY{)bxC{gUh&C6#3-b6O! zsuL8m0*{G^=}dzAoDIxhas7EI=3f@EJvSNur`+R=R;E|GP~Rq zM)M)sMr@vl33l3jQ;Qw_K@S0esL>BaY!)LGmI#;{GIyTf>Pchpx3df*WntjoG4r}X zF{^7};0uiO!4-Knv^~=)22xfGOpOU~rur5fW{} zUd`|beEHnYb_Y#zqdH~>EDbqhJtHwJ`cpf%=r3&(S_nH9KbQ=%a1jlP7BY37kuy6L zuiws{Gu;{d%T`zx!VVUwHkXBP{lRpw_a~F`{$JWu)@UX{un45>f+@rr0{O#^$mgF- zjP#JpOoXSCNdB(wl>$2X(nwiZ2t&0@I7Iyq%W8SZS<27-gDRk{&H|?{MKcP6Ss-H< zjG?8Fl|N#8WBZ3)l^xoQ=#(rU(|D_n2n4DoLNbO!=&QL0As>kT%B1Sq4`(UIi292N zz=E=2Ul#?7fZ9&Z))Ofo-rp9s-U<4HEDHuRBa{81M97kI2quyn8+s0VhPGUOfmZFu z0Tnq98}%+8Y)=OQStFa(pcGJRx+LV78dMCRJZlr0E>HB7uqgY3)?C)e6s;LG@mSt_ z#j}gD6h$ELtA^yNLPapHUNZ{2kBKU;klO%1rGFYrLyqx+mMbfg`#y_?{Rq1h+(6m2 zJza+A#@A;mUo413La>YUN`a;uQ%QRDg7p&v69bY1o3jJ`0}V;}#m<9yHfFkdx`5}D zhnt(5<(<)}=xFCcA8F0INY+W-A9?{M-Qvp?T-GMZ^9SDBk!6~frtbWR-SM3O2w6C7|+((+2?3#Ga^R?OsvA&%Tu3>*>$nZPFFOjnHQ!66q2UTGJ4=a&leVn2H69N3zl!<39;>u>_#-_z_3Z(3#n#-t!#Gtb zf09VA(_H1=JF&X1og7NFzU`$}xPdxJC^Q}-A@2J*w4MNzQ0lkc)2|Y1JRGTAFcjV> z%impu$FqSU7~~k+?syEku7lFU@`S%iHXTG)85|buCF9hzy^*gM+0B|ui#24tzcI&q zo2)0_^3y=4K^8NNNQPh{4;EMq+qid9d+)HFKSN4I?{d*4{+Y`0h2v1+WvOlIK&i-s zTHeL61S|l4IUA-vbvXkapScYtwK6DRXJR$IZtqKvHQ8Y{@q~e>;4|U_Vf8BtQhRPP z20Sw#$geY-Iyi2Ok1%VQt?AN?>h2gR)#US^IEqEMyPJAq+our3Jq95p$!(WFOD+?- zuhW_+J#iiM%75kFz$`U2dwZFIuUuwM7c}o6od!H@^xtZ)OLR8j>h1v2Oax0Eh8v3m z>@xDqjum5Ax_1X`Te!Xpm~yJo@iqo!vYuS;(MOdH86>C^1S4tQyGQW3?Kzif^zh6* zOF);tICm+WOr}6pYKflEB{?tSb%V5BT=rL|3ZF(*8xO(e$0uo5!!=|V927b&DuFNS zp@7>wUQlvfn?vTuP?Hr5+V@lkl-=rPR%iLh!w9g+yJ=)HEM@a(zII#UhgGE7;KEkJ z`dF)m3+g1-e{*McXR87`WG8{s!Q!(e{lw>|XeaO?@p|A^zC#mYX<;?5p)IyZP^aEh zMo|;s9nf>kSdA_Oi||BYy@QOjI$&=mR`C^)9+<$OPQIs5Q`yG$os^y`feHB@3_T-k znB?T(T(!+&YN`T-R?{ z+>QUrHc)t}Ve4^E^=lx*?R@``dE6v*3#{|HlUL8(Wb;D`o%h;RRx|+^5{xq*;O8e{ z-x?Ja<&?v=ZxY}U08QsHl3L2>K0Mhdq2np{ntL~3mX{4G8&tIx|rPBr6jH?p`I#ivLJ9yp|?cBga3>*M6$C}+z5+|*eiZApBfxQDZ zUi)0A;RneY`JDG>zL|R={1YLs?oiG4SALC-qQyPi?~*Y%#X*iwX0j#JTaLYxG}FWc zRka~=^MP^2>f<|=!F-s#-Kv}rG=hj0;xUm-ZCijhyOd<9&DSjH0gk|}>GZ_SlQm$1 zJ`MJ<6c~&QE;g+f+iPpgnCkqYcCw}!i;@!346dIy)Cas&wR>E zX_At_&oqjBd7dN;*6Ox}6ZmfP;wIUCng421c&w(hBtYK8{6mW0dp?{#!}j?^z+Mfp^^J({PpJD+8w(OWL7ro{G7u2{;+ zp6V^J47~P%xB+F;GR4U`ulb|6+#iT*Q*V0=5$TzL2l^xeAtp$N+X_Jo)b5c-P65jC z$!KJZFAQ*_WQflLg%Jmn$!rLU?Mf-y)WoGnuM=cY?~A3VZ0>$4INr?geZXk&pm$&t zvAbqGzYur=9Q>&8XR@Z=HY4YM>FqZv%F!l1J)5_1UNct_{z(v(hX*NQvDEt~fmYs~01nq7y@D0PJ7ZJ()gw+w9uq_TcH~BfG69{>&#X^2 z^e68uFwEn~9+tPwV-|o7#WYmW2 z<~)%;eqHOWc|$cr@@V7b3#it1$0`ryx`lmmR3huh7X1LJ^Us*T>y1*DG=N8BV|1H& z=Pa)f7=q0@tt5l((X{iX_TV#YY(PH85Cg{{MdmtWEhUz0CqHn0Nxb`bO3LT{@wO3# zP4q@2_v_y1Da$E8Mza9&j33DEZ_JLOra7n#PLXiYNaQ4M8;W6*zpda2gH%bf8J$J< z+eL%Lsw*ct>E-uy>o=}p6#xrm1&Ss`t^`O=r^RaJw>Tujs))yhpgV-<q6hh>h*44ozL*3yko;`L0))N5v6>8cugYEicoQ{ zT-YY6(BBdDaS?7@DPLw7xul4$GU#PKOt?9=vHRHymch|6#RN!Nj$O=-hgXu1b6|n` z%hE}$JzJ`Qyxpr^^hR|j#X~=KmZSX#l7KxWnd^8YMiH0BJ$ocF+QqqVL?ps^>!qV9 z#zu^0$eQ0BJ1lkW3 zbH|k*ib)wKeBb!RUvVVu+jgb0vVQhkg6 ztz|sNk9(A?HQvz&J{=r?bE?JJA+FwA1H$~(!_Li4i^RsE2dD90X&=4 z(Z}ku^vmKWYdhg4$Fr5F4+i&j8+6z0qgoU32R}wgexrEU>9bYOJez1mzd_j^j^0mb z$l%PGk*@ekr`r}rmAv^qjLa?rz%%_j+sWo^ynPJu!O2Jlu$$2LL|}o0{tdg{R7HF7 zui-Y)wKBqYAE(+Zdw=<|OQLOka9ip7w_-{}bz1^rzyb%0NMoufLaW)TswJI{2+PGQd#9iA3HOJgvCFKV)5! zJ-4uC>wJTMDKpSzo?xZzG<_hn%N@=|b%xB)t7J~IilM*4wMCU>Yso-(CKVAu`~;@FUyu8xlM(Pe^_Kxo z2~pPuITr7f&|Fc`#&XP~?3gJuy$7dM*5E#0EW`*aZID0t?60&N`jrE{!S9RDz^36C zRqLFA4QU}QqCO99p5^u~Ddh`juX|4B{8B?cv{!I4Ouz&EdVvo5fLm*bq53VXms9v~ zoiFp~SPIC$a_Zz#V3Uv;W+~J!Oyvy1Lz_Vz>_vXyL??Z5zy;$AbPamq4hxkC&5!2H z-x0DqKZcue6Cols^2P7ZW4qA@UgJJLny}gVTCD>8NA6Pf_w3l!I+Qx^Eoq*i6WuhA zfAW^dw!MxBSYUX?b(TZ@kS3uBP~4*KpaDFgF)Eu^^E5Le`iNZY6@tMv9vZOzHeXiO z4E+-LuFF}{O6?)JgdWSG9K2^CM98FY1m->&HrVf`b;3lydZ7b;2u6bUSuf7YNXT{S zUIC`wL{$_fe^9>eKGmAkrbfaG9`Fa zi{b^&IUhpCdco~9hgB`d>S>SC#7XdOoy8=?QQD;qNPZt z)y@?CLi#~UXxViE#QE=PQuuHD`7~*Q88;tX)}%fImN9=CC=TBDIr9|(CG7=^GzAxT zoMlx8yUFv61cx>=kf;ev=car9)*%LJfL7l&hT0P$WsITp*UX7A0`QqSrpkS}87U`A_KXGcjUJ|+e?XGx~(e5XHn!>uHl-0U2!T<T}g}Cn(if>!a2QN&}g_kghpFNzMSuo20FB(bt}{(9hqw7$lLhMPN##h%=P% zKe!I$&Q#HDOCqEb044a%rzC$4f^K5M&Ook#j;Pu>0R!qp|0z=;r7jTvy}HrO_@ITyhU?BsQaY z>i)%LQFX35?DC&+>DQgBqPwYoaAjXe(Jj^UxEyck=`5gm=KjSsJ$VjL^bFRO2VgFWOA=t>khtR8M`44r2(n4^-$lEaR)!!8`dMd>`lTz{8 zSz7+H&i~e({TsF=7t-7fdi6ibu94?diwa311}6N?dRFInyca|6P?9qb=RMHXuY4OR z;|^s#6CnJcG*EdxFp|*>OpRPM1rz*+SocMbMW2sdA^wNk$WBl6XqWeyB_&eA14{TC za22=^2YFni^$bfq@Is94_F^JOJua3=i5D8l`^Ci=z2~1u-*PU*=mzi~tLhAn@8!i< zjVBbwc)Aa8)#X#4HpC|?vOTz!pIL^4O-VGm$iEmkVaRnq^hCFN z|B)d`+U0X8y8ry!bIAO;lvI%C-xY@xM^8G0P3YXN(C1IIERl05x+hJ9Jn^}hq0?kQ zmM?}Be4((jsiyNsORpK78$|j32@_^=F8%ELr&C|fr3rTE?lG6&1vWSUjY1lDs!#o| zB0HTN2v+pzAPurM67rAggxonB;yha+GRi%0N%W+Ppr5}_{`F&|{UVunU$N}au@L5-;I?PlxU#-|e6bUQO$U3ga(XlP>IG&6pB zjop~vnRU)px_031A>HPqyq!8R`g>!?-N)pP$=L0Y-@Du9Z+oiw6ki-d+-E=Q{55ms z%26kyT~Ge9)hSEY4f)XgVV6PU>z>~Zh_18_jbmr$QiqexVhm10EbXt#W`mXgS$X6d zLU!rVC&fnSAY~qFwx%c^8Nt6cn|k`_sf5wNWLql=OW*E@k=A_Z!XA^E2Z0#=(}Qy7 zJ8GCAmj}}veUY(6QNsj90~^#mkCK307Ng|Y2Q%-|`{Fuf|DcYKdp8`e{&=gPdl4fM**V_xkY@-ZODfw+A7jxCLa1a?4w_{I+73*&8PKA$pqGN z+R~N(B!q4Kcu46{pVDqzzoisU)CI*Se?~hG<4@eKa7frMFDfja%K8PY+?V4V&Y$C}jm;1t(ic8c`{*d)Rc9@Wx2OBOxJ8C-7vnG{rjP-7< z90~&OR{d5pW~ZZu3WeMkB!-hC>+$p!luuADS>AA?|5FiyMxCt>K`=)q#*5e|=mvHn z%eN2FZZ`B87(a+8H~Snf>DH1Ep=Ps3hgs}+?jE180t^e_>R=RJqD-)dy7YMPGj`&K z!)RN9(A+lzPxA!}*R7CdBb0~~W8=~X`pkDx6c_y}8P~LKC-*S*LBcZ&_^g+6MM^k} zSyLL>$uMm%J*hIt!i4xnzxWkA=ynPWi4=YPjz)^3u4q!Kmgp||04=C*nx(2ACK!3L z*f7-wj?#5842jqm1AxG9_dJ%Nzq2*@4x&!2&6ug%87)yK>Y$9)vp-jnxyUI>u!J9L zJpiLm-^A@Esq_CTfNZY5Cqzx=9O8r+yxD>6uf> z@s3GGADZ!JA-uv;1lV^_1f9-4S+}?*>8+b|iTX>P8R0jl{3Z2J;_@a5s%;Rm5KQXI zh+A@0*<3Zz85hy0iGLEy%xFF5r{vutvy|>c$zZ#c+;le`vUr7PcWb)hDHeCBf10rz zo>dqy{IR`eJop3rIcGB$VX2vYu)>K#Oc`Bznmo~SbHt>t*Kat(+7X%Y?~E$>ec2mZ z7;-{64e7Y_^jwr3ryw3Y_XT16!v!MP5|QOg?01(KAGLFgEyKl%MYYGPho)Ka`g6vs z(%3NR4I6Ur+am&_dgjVczlxE?6kwjgJkk~bnzc(lvteZ(^W`wLNWQ-4roV#xdhpYe z@lnfD*ouoS4~|_nZ|EDCsC#RHZyGJqt16m*n{eIDnN=SuH8b5XCD^O}x9VOHSXsh% z7D%X_FYLATj4y!H9O?IVd;;z(E*;_%mU6)_t7Ai}b4psshLP7iK8I^aI8&gX=A~Wq zW)aSWDpF-B6OnSDgxc-feDt@D$6;$Z4MH?tg{@fX(pj$WnjXj>ogwqVCP6cFlkA!L z+`U8b7zhkmzu-Bhjy<0m)d!Ux*Rg}Tp)g&l7R|%nYv|Okvq5+EvW=}JvhV!pkI!uN zXBYnxnd*{-=pu#sVFDucLwqMNm7r(Y#L#%vO%B6?9xVu!Af?z;Hku9D1BWH~X!ip9q^P4i&_&sHs}V;SmLsaOL2 zyQB|t$cUL?4*V`!uyYzE=wZAuIa`e4P%Ep5NwOV5Ql^y7$JGP0qa!aStF28JPJ-gl zdW9V72JAhW0OY!@lw7QIIs!6TbZ z8w(wkUsg@esZ~u~`vbYQa#Z*MfXm)z*~|W)-6BKTw87M>3+bntX^DwF7H+FmD;`dATKl;udj<3dNWD+tjtj&5E#X$H9c+(Rl79M(ag$;T6C-|{R&+>lcM6Z zhG2dDRI1wz`gc5OTKEnBR-nRvobfild`L$(NXUqve3Yw>J`D-8t%3VQNWE&c( zYTQ`nGnNPKR>Q82KhIntOpcJBh_sbqdZMFCJQ`1KK7eLHKTmdISQ)9EWT*(#RZ^Hh zxuNXcV;w6!vP<(r^Xn}!Q-I;KVOg>c;!jsd}L6Bk^uVP|137sMZi-WSL}4`(CfI zq*1eC=YIH6TRouUaZN;fyj4Prz#L+@13AdmYYx43L*c*M9vOmy)S`vB&BC=3X)HYl z+2kAFeFUR?gYiuIPlgBU_r#k+ayee2&GgN5G^qf*tV3B%alV!kZs0*XmFK!bOv@Sa z`Iq<)v}oc-)S?UkWgj2y(6vjBaP1gc%^>P&kDS-Ny#zm%4;$F&=ACR?JHKNTBwV00{Q zJ~<9#_UMK5hLnSg{w;ZAaio84pJ~RWKUYqKGQvnN;K>9guW;WLTrH)v^Ch97aPI;* zzGqFciS=QYE){DhfXcSXMJ`{3vpH^2`S7UjAHO+R6tW~VoXBq4fL5ZEyrtI>654sl zn*#=F?SsF575w2A%TpLveh!pd#|(70T4PEO-BsD&yiTlAqZuIK$DGV1EQMHphN2Il zs;~b5rxr*1FGKK0EN1CKWGcNsC_~--g3HH@8c5cY0E5Kcp|$DK3&;ijOxAghl=Vo^MLU3D}1Z@PI{2O(0u|d9I`ZpgNA7=SqWem zZ>PtM)FNo}{Xf;kWw8~mtkCxy8|@Bl(fL%v&diTMB}4eH?-5sw)0>sXB(!^e{H3AC zIf-A9J>A+^2dH*wkKMxy0tQ+c2oIXT$Z?Gynbc zk=x7GBk`EUF@l=?2=dpFz1eX$8!R)!^_0BJ2cR<%XWqqbfQ|;JcD!w@yLoZ0>X=OM zhZ{YDt^T?dk{s3xo+Iuf;$*M)9OTkm(HZJI_R(BjYjbbw`3+KYI? zp=b@2vHtcqX)YPnorc*ofobg#c1sXFb)9@F=cD1V;|ZA}8Ytsr$-#cNaq;){%!m2A zF1p_ekx^QESHy@@t<2=KMV}0A+zPwdiRGBXaRU@B)Zrf0sAkz`bAgTQQjBkd22(@s zt?Cdr3S@CV-p4NtP9V~}X~*#qqMn1gKM`ohs}o?>@6 zf=WO5Ekb4#4WCRO1nFz(H~Jh15O+3hkjTmA9RAAc!DhQh2dV@1<{f3rA=IryHfc}# zSvmD9Uk3(8kjuj}-Bt2OTLU_vUKijc!xZ@OElE@;%i4OaTL`Lyq)lb5(A*!;%ex7^ zkr|eB+FK95?51ant&)>7V%NAGk0ttpuVjHWCkO*b`;jBz#m6Z_$(0wk1Tm8+>nGyg zAVEzPLi_ufbjdK3zH4Bp&Jta}$<=Rcf5t1+PYd*$K1$9=!^Mkc zP82tB!f#9dI{UzneW>S|roC5&4;>eDT{lj~HEbmY2MK`(4!`x}2JWd3kuV1aE{09| zp{c=8mpX~fGIlVl*XV76UamtN^`%)|Z{z*h3&~nvaYBK8x-6+=lb)} zy9uXWdF_2aFze|2+6z-V$Z!Zw^*$zS$T_5O)U14Ot_ZemlP($)UY^YSY!BUnR;n7S z3%oLJIBdc7$wD3u`)7JE&mAM{Y@NwraZ8P=`9-y>-0<*uueL+{1w>~SLM4ZG=Kj5rL9f-@?o4V zlAZ{Z6EEk=I5C#z)}}hP&`0cArs?|j`wRzyalj%T(zFbC|nhgjdY zu|ieT-S%mBykAL^HL(U+ZS_;dCZod2nhT+zEr-kRWp9daSqKQ6dQT8r$sOR`kB7;> z1(kHxbUZ{i*>wj-&!m%B+sWb~PJWp)SlZ_qyx^UV?U-$NXFu@5>OA1tJkFb0CuqwD zwz7^E_l+F0MF=cZh+w@m#HNq1-phH4Z4Nb}GGI(tq7bjugeevJ1`69Tsa~D+loSvn(rX+9&5-dD3EP!*z5++YMigD|u zh0_ZF^xP+w)6kC1WL;){rv_#lmT++WH_%5JMolxzCOf9lPo7~5cRKNPt@Zx#DLJa`6x zm(DT0NaTf?C-lMia$OzVcBM0U2AVPp5>0ZD)%OkwY_C{$hL{Ru%WW3{;0Xl;7x6{M zxntiz*9Eyj;CAi%20B5EF6rP-gY707{I`hyQ}{cR|Id}*fo=!7Z9UoPgq=><>4Y5? v?66>m1v@O*VZjayc3ANLlm+Gri|p7*g@X!DcSm#n$_A{=Y|oUO_Pp~y^589L literal 8159 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 diff --git a/rawAssets/buildings/owner_0.kra b/rawAssets/buildings/owner_0.kra new file mode 100644 index 0000000000000000000000000000000000000000..eaa02c7a9bedc66513691f2bc6059982ee1fe97b GIT binary patch literal 31564 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 IJ%4@sAEO*HnE(I) literal 0 HcmV?d00001 diff --git a/rawAssets/buildings/owner_1.kra b/rawAssets/buildings/owner_1.kra new file mode 100644 index 0000000000000000000000000000000000000000..5e559aba36c2762e5f284466c3b3081720437fff GIT binary patch literal 31783 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 literal 0 HcmV?d00001 diff --git a/tiled/test.tmx b/tiled/test.tmx index 8394f85..6249f7f 100644 --- a/tiled/test.tmx +++ b/tiled/test.tmx @@ -1,5 +1,5 @@ - + @@ -273,6 +273,60 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,329,329,329,0,0,329,329,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,329,329,329,0,0,329,329,329,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,329,329,329,0,0,329,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,329,329,329,329,329,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0