Version 0.8.0 du moteur.

This commit is contained in:
Ulysse Cura 2024-09-06 08:45:17 +02:00
parent dd9c60f1d6
commit 9d3b0f0b88
91 changed files with 28239 additions and 0 deletions

BIN
2D_Engine Executable file

Binary file not shown.

50
Camera.hpp Normal file
View File

@ -0,0 +1,50 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
////////////////////////////////////////////////////////////////////////
// //
// Programme de la caméra, sert a avoir un rectangle et de pouvoir //
// la gérer correctement en fonction de la taille de la map... etc... //
// //
////////////////////////////////////////////////////////////////////////
#ifndef CAMERA_HPP
#define CAMERA_HPP
#include <SDL2/SDL.h> // SDL_Rect
#include "Game.hpp" // Game::...
#include "TileMap.hpp" // TileMap::...
struct Camera {
Camera(int xpos, int ypos, int width, int height)
{
camR.x = xpos;
camR.y = ypos;
camR.w = width;
camR.h = height;
}
Camera(int xpos, int ypos, int width, int height, int z) : zoom(z)
{
camR.x = xpos;
camR.y = ypos;
camR.w = width;
camR.h = height;
}
// Verifie si la caméra ne dépasse pas de la map
void update()
{
if(camR.x < 0) camR.x = 0;
if(camR.y < 0) camR.y = 0;
if(camR.x > Game::tileMap.worldWidth - camR.w) camR.x = Game::tileMap.worldWidth - camR.w;
if(camR.y > Game::tileMap.worldHeight - camR.h) camR.y = Game::tileMap.worldHeight - camR.h;
}
SDL_Rect camR;
int zoom; // TODO Zoom pas encore pris en charge
};
#endif

54
ChannelManager.hpp Normal file
View File

@ -0,0 +1,54 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
////////////////////////////////////////////////////////////////////////////
// //
// Programme des channels, sert au entitée pour avoir //
// un channel de discution, comme un interrupteur qui vas mettre son état //
// dans un channel, ou une porte qui vas lire dans un channel pour savoir //
// elle doit s'ouvrir ou non. //
// //
////////////////////////////////////////////////////////////////////////////
#ifndef CHANNELMANAGER_HPP
#define CHANNELMANAGER_HPP
#include <unordered_map> // unordered_map
using std::unordered_map;
class ChannelManager {
public:
// Setter
void setChannel(int channelID, bool value)
{
channels[channelID] = value;
}
// Getter
bool getChannel(int channelID) const
{
auto it = channels.find(channelID);
return it != channels.end() ? it->second : false;
}
bool areChannelsInState(const unordered_map<int, bool> &states)
{
for(const auto &state : states)
{
if(getChannel(state.first) != state.second)
{
return false;
}
}
return true;
}
private:
unordered_map<int, bool> channels;
};
#endif

39
CompilerFileList.txt Normal file
View File

@ -0,0 +1,39 @@
# Main
main.cpp
# Game
Game.cpp
# Texture manager
TextureManager.cpp
# Map manager
MapManager.cpp
# TileMap
TileMap.cpp
# SDL
$(sdl2-config --cflags --libs)
-lSDL2_image
# Std version
-std=c++20
# Warnings
-Wall
-Wextra
-Wpedantic
-Wshadow
-Wconversion
-Wfloat-equal
-Wformat=2
-Wnull-dereference
-Woverloaded-virtual
# Debug
-DDEBUG_MODE
-g
# Release
#-O2

113
ECS/AnimationSystem.hpp Normal file
View File

@ -0,0 +1,113 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
///////////////////////////////////////////////////////
// //
// Système d'animation pour l'ECS, peut controller //
// tout ce qui est en rapport avec des animations. //
// //
///////////////////////////////////////////////////////
#ifndef ANIMATION_HPP
#define ANIMATION_HPP
#include <algorithm>
#include <vector>
#include "ECS.hpp"
#include "../Game.hpp"
#include "SpriteComponent.hpp"
using std::string, std::reverse, std::vector;
class AnimationSystem : public Component {
public:
AnimationSystem() = default;
AnimationSystem(int nbF, int currentF, int frameD, bool playAnim) : playAnimation(playAnim), frameDelay(frameD), currentFrame(currentF), m_nbFrames(nbF)
{}
void init() override
{
m_sprite = &entity->getComponent<SpriteComponent>();
m_createFramesClips();
}
void update() override
{
if(playAnimation)
{
m_frameTimer++;
if(m_frameTimer >= frameDelay)
{
m_frameTimer = 0;
if(reverse)
{
currentFrame = m_nbFrames - 1 - (m_nbFrames - 1 - currentFrame + 1) % m_nbFrames;
if(!loop && !currentFrame) playAnimation = false;
}
else
{
currentFrame = (currentFrame + 1) % m_nbFrames;
if(!loop && currentFrame == m_nbFrames - 1) playAnimation = false;
}
}
m_sprite->setSrcRect(m_frames[currentFrame]);
}
}
void changeAnimation(const string &path, int nbF)
{
currentFrame = 0;
m_sprite->setTexture(path);
m_nbFrames = nbF;
m_createFramesClips();
update();
}
void changeAnimation(const string &path, int nbF, int frameD)
{
changeAnimation(path, nbF);
frameDelay = frameD;
}
bool playAnimation {true};
bool loop {true};
bool reverse {false};
int frameDelay {0};
int currentFrame {0};
private:
void m_createFramesClips()
{
m_frames.clear();
for (int framePos {0}; framePos < m_nbFrames; framePos++) {
SDL_Rect frame;
frame.x = framePos * m_sprite->getSrcRect().w;
frame.y = 0;
frame.w = m_sprite->getSrcRect().w;
frame.h = m_sprite->getSrcRect().h;
m_frames.push_back(frame);
}
}
SpriteComponent *m_sprite;
vector<SDL_Rect> m_frames;
int m_nbFrames {1};
int m_frameTimer {0};
};
#endif

27
ECS/Components.hpp Normal file
View File

@ -0,0 +1,27 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
/////////////////////////////////////////////////////////////
// //
// Inclure facilement tout les definition des composant. //
// //
/////////////////////////////////////////////////////////////
#ifndef COMPONENTS_HPP
#define COMPONENTS_HPP
#include "AnimationSystem.hpp"
#include "Door.hpp"
#include "ECS.hpp"
#include "HitboxComponent.hpp"
#include "InteractableComponent.hpp"
#include "InventoryComponent.hpp"
#include "Lever.hpp"
#include "Lock.hpp"
#include "PlayerSystem.hpp"
#include "SpriteComponent.hpp"
#include "TransformComponent.hpp"
#endif

70
ECS/Door.hpp Normal file
View File

@ -0,0 +1,70 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
//////////////////////////////////
// //
// Composant pour les portes. //
// //
//////////////////////////////////
#ifndef DOOR_HPP
#define DOOR_HPP
#include <unordered_map>
#include "AnimationSystem.hpp"
#include "ECS.hpp"
#include "HitboxComponent.hpp"
using std::unordered_map;
class Door : public Component {
public:
Door(unordered_map<int, bool> states) : m_states(states)
{}
void init() override
{
m_animation = &entity->getComponent<AnimationSystem>();
m_hitbox = &entity->getComponent<HitboxComponent>();
m_animation->loop = false;
}
void update() override
{
if(Game::entityManager.getChannelManager().areChannelsInState(m_states))
{
if(!m_isDoorOpen)
{
m_animation->reverse = false;
m_animation->playAnimation = true;
m_isDoorOpen = true;
}
}
else if(m_isDoorOpen)
{
m_animation->reverse = true;
m_animation->playAnimation = true;
m_hitbox->hitboxActivated = true;
m_isDoorOpen = false;
}
if(!m_animation->playAnimation)
{
m_hitbox->hitboxActivated = !m_isDoorOpen;
}
}
private:
AnimationSystem *m_animation;
HitboxComponent *m_hitbox;
unordered_map<int, bool> m_states;
bool m_isDoorOpen {false};
};
#endif

203
ECS/ECS.hpp Normal file
View File

@ -0,0 +1,203 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
////////////////////////////
// //
// Definition de l'ECS. //
// //
////////////////////////////
#ifndef ECS_HPP
#define ECS_HPP
#include <algorithm>
#include <array>
#include <bitset>
#include <stdexcept>
#include <iostream>
#include <memory>
#include <vector>
#include "../ChannelManager.hpp"
using std::bitset, std::array, std::vector, std::unique_ptr, std::make_unique, std::move, std::forward, std::runtime_error, std::sort;
class Component;
class Entity;
using ComponentID = std::size_t;
inline ComponentID getComponentTypeID()
{
static ComponentID lastID = 0;
return lastID++;
}
template<typename T> inline ComponentID getComponentTypeID() noexcept
{
static ComponentID typeID = getComponentTypeID();
return typeID;
}
constexpr std::size_t maxComponents = 32;
using ComponentBitSet = bitset<maxComponents>;
using ComponentArray = array<Component*, maxComponents>;
class Component {
public:
Entity *entity;
virtual void init() {}
virtual void update() {}
virtual void draw() {}
virtual ~Component() {}
};
class Entity {
public:
void update()
{
for(auto &c : m_components) c->update();
}
void draw()
{
for(auto &c : m_components) c->draw();
}
bool isActive() const { return m_active; }
void destroy() { m_active = false; }
template <typename T, typename... TArgs>
T& addComponent(TArgs&&... args)
{
if(hasComponent<T>())
{
throw runtime_error("Vous ne pouvez pas mettre deux fois le même composant dans la même entité.\n");
}
// Creation d'un pointeur du type donné avec les arguments necessaires
T *c(new T(forward<TArgs>(args)...));
// On donne au composant une reference de l'entitée
c->entity = this;
// Création d'un unique_ptr et ajout du composant dans le vecteur et array associé
unique_ptr<Component> uPtr {c};
m_components.emplace_back(move(uPtr));
m_componentArray[getComponentTypeID<T>()] = c;
m_componentBitSet[getComponentTypeID<T>()] = true;
// Initialisation du composant
c->init();
return *c;
}
template <typename T>
bool hasComponent() const {
// Vérifier d'abord si un type exact est présent
ComponentID id = getComponentTypeID<T>();
if (m_componentBitSet[id]) {
return true;
}
// Si non, vérifier dynamiquement tous les composants pour un type dérivé
for (const auto& c : m_components) {
if (dynamic_cast<T*>(c.get())) {
return true;
}
}
return false;
}
template <typename T>
T& getComponent() const {
// Vérification rapide via le BitSet et l'accès direct au composant via l'array
ComponentID id = getComponentTypeID<T>();
if (m_componentBitSet[id]) {
return *static_cast<T*>(m_componentArray[id]);
}
// Vérification polymorphique avec dynamic_cast
for (const auto& c : m_components) {
if (T* t = dynamic_cast<T*>(c.get())) {
return *t;
}
}
throw runtime_error("Composant non trouvé.\n");
}
int draw_priority;
private:
bool m_active {true};
vector<unique_ptr<Component>> m_components;
ComponentArray m_componentArray;
ComponentBitSet m_componentBitSet;
};
class Manager {
public:
void update()
{
for(auto &e : m_entities) e->update();
}
void draw()
{
vector<int> drawOrder(m_entities.size());
for(int i {0}; i < static_cast<int>(m_entities.size()); i++) drawOrder[i] = i;
sort(drawOrder.begin(), drawOrder.end(), [this](const int &a, const int &b) {
return m_entities.at(a)->draw_priority < m_entities.at(b)->draw_priority;
});
for(int i {0}; i < static_cast<int>(m_entities.size()); i++)
{
m_entities[drawOrder[i]]->draw();
}
}
void refresh()
{
m_entities.erase(std::remove_if(m_entities.begin(), m_entities.end(),
[](const unique_ptr<Entity> &mEntity) {
return !mEntity->isActive();
}),
m_entities.end());
}
Entity &addEntity()
{
Entity *e = new Entity();
unique_ptr<Entity> uPtr{e};
m_entities.emplace_back(move(uPtr));
return *e;
}
std::size_t getNumberOfEntity() const
{
return m_entities.size();
}
void erase(std::size_t index)
{
m_entities.at(index).get()->destroy();
}
vector<unique_ptr<Entity>> &getEntities() { return m_entities; }
ChannelManager &getChannelManager() { return m_channelManager; }
private:
vector<unique_ptr<Entity>> m_entities;
ChannelManager m_channelManager;
};
#endif

66
ECS/HitboxComponent.hpp Normal file
View File

@ -0,0 +1,66 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
////////////////////////////////////////////////////////
// //
// Composant hitbox, contient toutes les données //
// necessaires pour gérer les collision efficacement. //
// //
////////////////////////////////////////////////////////
#ifndef HITBOX_HPP
#define HITBOX_HPP
#include "ECS.hpp"
#include "TransformComponent.hpp"
#include "../Vector2D.hpp"
#ifdef DEBUG_MODE
#include "../Game.hpp"
#endif
class HitboxComponent : public Component {
public:
HitboxComponent() = default;
HitboxComponent(Vector2D<float> sc, Vector2D<float> pos) : position(pos), scale(sc)
{}
void init() override
{
m_transform = &entity->getComponent<TransformComponent>();
}
void update() override
{
hitboxR.w = static_cast<int>(static_cast<float>(m_transform->dimension.x * m_transform->scale) * scale.x);
hitboxR.h = static_cast<int>(static_cast<float>(m_transform->dimension.y * m_transform->scale) * scale.y);
hitboxR.x = static_cast<int>(m_transform->position.x + static_cast<float>(m_transform->dimension.x * m_transform->scale - hitboxR.w) * position.x);
hitboxR.y = static_cast<int>(m_transform->position.y + static_cast<float>(m_transform->dimension.y * m_transform->scale - hitboxR.h) * position.y);
}
#ifdef DEBUG_MODE
void draw() override
{
if(hitboxActivated)
{
SDL_SetRenderDrawColor(Game::renderer, 20, 200, 18, 255);
SDL_RenderDrawRect(Game::renderer, &hitboxR);
SDL_SetRenderDrawColor(Game::renderer, 20, 20, 18, 255);
}
}
#endif
Vector2D<float> position{Vector2D<float>(1.0f, 1.0f)}; // Dans l'entitée (0 -> 1) 0=>tout a gauche de l'entitée, 1=>tout a droite et pareil pour le Y
Vector2D<float> scale{Vector2D<float>(1.0f, 1.0f)}; // Par rapport à la taille initiale (0 -> 1)
SDL_Rect hitboxR;
bool hitboxActivated {true};
private:
TransformComponent *m_transform;
};
#endif

View File

@ -0,0 +1,21 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
///////////////////////////////////////////////////////////
// //
// Classe de base pour tout les composant interactifs. //
// //
///////////////////////////////////////////////////////////
#ifndef INTERACTABLE_HPP
#define INTERACTABLE_HPP
#include "ECS.hpp"
struct InteractableComponent : public Component {
virtual void interact() = 0;
};
#endif

View File

@ -0,0 +1,55 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
//////////////////////////////////////////////////////////////////
// //
// Composant d'inventaire, sert pour les coffre, PNJ, ou MOB. //
// //
//////////////////////////////////////////////////////////////////
#ifndef INVENTORY_HPP
#define INVENTORY_HPP
#include <memory>
#include <vector>
#include "ECS.hpp"
#include "../IP/IP.hpp"
using std::vector, std::unique_ptr, std::move;
class InventoryComponent : public Component {
public:
InventoryComponent() = default;
InventoryComponent(vector<unique_ptr<Item>> items) : m_items(move(items))
{}
Item &addItem()
{
Item *i = new Item();
unique_ptr<Item> uPtr{i};
m_items.emplace_back(move(uPtr));
return *i;
}
std::size_t getNumberOfItem()
{
return m_items.size();
}
void erase(std::size_t index)
{
if (index < m_items.size())
{
m_items.erase(m_items.begin() + index);
}
}
vector<unique_ptr<Item>> &getItems() { return m_items; }
private:
vector<unique_ptr<Item>> m_items;
};
#endif

67
ECS/Lever.hpp Normal file
View File

@ -0,0 +1,67 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
//////////////////////////////////////////////////
// //
// Composant interactif, ici pour les levier. //
// //
//////////////////////////////////////////////////
#ifndef LEVER_HPP
#define LEVER_HPP
#include "AnimationSystem.hpp"
#include "InteractableComponent.hpp"
#include "../Game.hpp"
class Lever : public InteractableComponent {
public:
Lever(int channel) : m_channel(channel)
{}
void init() override
{
m_animation = &entity->getComponent<AnimationSystem>();
m_animation->loop = false;
}
void update() override
{
if(!m_animation->playAnimation)
{
Game::entityManager.getChannelManager().setChannel(m_channel, m_leverOn);
}
}
void interact() override
{
if(!m_animation->playAnimation)
{
if(m_leverOn)
{
m_animation->reverse = true;
m_animation->playAnimation = true;
m_leverOn = false;
}
else
{
m_animation->reverse = false;
m_animation->playAnimation = true;
m_leverOn = true;
}
}
}
private:
int m_channel;
AnimationSystem *m_animation;
bool m_leverOn {false};
};
#endif

55
ECS/Lock.hpp Normal file
View File

@ -0,0 +1,55 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
////////////////////////////////////////////////////
// //
// Composant interactif, ici pour les serrures. //
// //
////////////////////////////////////////////////////
#ifndef LOCK_HPP
#define LOCK_HPP
#include "AnimationSystem.hpp"
#include "InteractableComponent.hpp"
#include "../Game.hpp"
class Lock : public InteractableComponent {
public:
Lock(int channel) : m_channel(channel)
{}
void init() override
{
m_animation = &entity->getComponent<AnimationSystem>();
m_animation->loop = false;
}
void update() override
{
if(!m_animation->playAnimation && m_lockInteracted)
{
Game::entityManager.getChannelManager().setChannel(m_channel, true);
}
}
void interact() override
{
if(!m_animation->playAnimation && !m_lockInteracted)
{
m_animation->playAnimation = true;
m_lockInteracted = true;
}
}
private:
int m_channel;
AnimationSystem *m_animation;
bool m_lockInteracted {false};
};
#endif

277
ECS/PlayerSystem.hpp Normal file
View File

@ -0,0 +1,277 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
////////////////////////////////////////////
// //
// Système pour le joueur, gère tout ce //
// qui est necessaire pour le joueur. //
// //
////////////////////////////////////////////
#ifndef PLAYER_HPP
#define PLAYER_HPP
#include <algorithm>
#include <cmath>
#include <vector>
#include "AnimationSystem.hpp"
#include "ECS.hpp"
#include "InteractableComponent.hpp"
#include "SpriteComponent.hpp"
#include "TransformComponent.hpp"
#include "../Camera.hpp"
#include "../Events.hpp"
#include "../Game.hpp"
#include "../TileMap.hpp"
#include "../Vector2D.hpp"
using std::lerp, std::abs, std::vector, std::sort;
constexpr const float EPSILON = 1e-6f; // Tolérance
class PlayerSystem : public Component {
public:
void init() override
{
m_transform = &entity->getComponent<TransformComponent>();
m_sprite = &entity->getComponent<SpriteComponent>();
m_hitbox = &entity->getComponent<HitboxComponent>();
m_animation = &entity->getComponent<AnimationSystem>();
}
void update() override
{
m_getInputs();
m_handleHitboxes();
m_adjustVelocity();
m_setStateAndAnimation();
m_setFlip();
m_setCamera();
m_checkInteractions();
}
#ifdef DEBUG_MODE
void draw() override
{
SDL_SetRenderDrawColor(Game::renderer, 200, 20, 18, 255);
for(auto it {Game::entityManager.getEntities().begin() + 1}; it < Game::entityManager.getEntities().end(); it++)
{
if(it->get()->hasComponent<InteractableComponent>())
{
SDL_Rect interactableR;
if(it->get()->hasComponent<HitboxComponent>())
{
interactableR = it->get()->getComponent<HitboxComponent>().hitboxR;
}
else
{
interactableR.x = static_cast<int>(it->get()->getComponent<TransformComponent>().position.x);
interactableR.y = static_cast<int>(it->get()->getComponent<TransformComponent>().position.y);
interactableR.w = it->get()->getComponent<TransformComponent>().dimension.x * it->get()->getComponent<TransformComponent>().scale;
interactableR.h = it->get()->getComponent<TransformComponent>().dimension.y * it->get()->getComponent<TransformComponent>().scale;
}
interactableR.x -= m_interactionRange;
interactableR.y -= m_interactionRange;
interactableR.w += (m_interactionRange * 2);
interactableR.h += (m_interactionRange * 2);
SDL_RenderDrawRect(Game::renderer, &interactableR);
}
}
SDL_Rect futureHitboxR = m_hitbox->hitboxR;
futureHitboxR.x += static_cast<int>(m_transform->velocity.x * static_cast<float>(m_transform->speed));
futureHitboxR.y += static_cast<int>(m_transform->velocity.y * static_cast<float>(m_transform->speed));
SDL_RenderDrawRect(Game::renderer, &futureHitboxR);
SDL_SetRenderDrawColor(Game::renderer, 20, 20, 18, 255);
}
#endif
private:
void m_getInputs()
{
m_transform->velocity.x = Game::events.keys[SDL_SCANCODE_A] * -1 + Game::events.keys[SDL_SCANCODE_D] * 1;
m_transform->velocity.y = Game::events.keys[SDL_SCANCODE_W] * -1 + Game::events.keys[SDL_SCANCODE_S] * 1;
}
void m_handleHitboxes()
{
for(int i {0}; i < 2; i++)
{
SDL_Rect futureHitboxR = m_hitbox->hitboxR;
if(i == 0) futureHitboxR.x += static_cast<int>(m_transform->velocity.x * static_cast<float>(m_transform->speed));
if(i == 1) futureHitboxR.y += static_cast<int>(m_transform->velocity.y * static_cast<float>(m_transform->speed));
SDL_Rect hitboxTilesR;
hitboxTilesR.x = futureHitboxR.x / (TILE_SIZE * TILEMAP_SCALE);
hitboxTilesR.y = futureHitboxR.y / (TILE_SIZE * TILEMAP_SCALE);
hitboxTilesR.w = (futureHitboxR.w + futureHitboxR.x) / (TILE_SIZE * TILEMAP_SCALE);
hitboxTilesR.h = (futureHitboxR.h + futureHitboxR.y) / (TILE_SIZE * TILEMAP_SCALE);
vector<int> touchedHitboxes {};
for(int tileY = hitboxTilesR.y; tileY <= hitboxTilesR.h; tileY++)
{
for(int tileX = hitboxTilesR.x; tileX <= hitboxTilesR.w; tileX++)
{
touchedHitboxes.emplace_back(Game::tileMap.hitboxes[tileX + tileY * Game::tileMap.tileMapWidth]);
}
}
sort(touchedHitboxes.begin(), touchedHitboxes.end());
for(const auto &touchedHitbox : touchedHitboxes)
{
if(touchedHitbox == 1)
{
if(i == 0) m_transform->velocity.x = 0;
if(i == 1) m_transform->velocity.y = 0;
break;
}
else if(touchedHitbox != 0)
{
Game::tileMap.LoadNextMap(touchedHitbox);
m_transform->position = Game::tileMap.getPlayerInitPos();
Game::camera.camR.x = static_cast<int>(m_transform->position.x - static_cast<float>(Game::camera.camR.w / 2 - m_transform->dimension.x * m_transform->scale / 2));
Game::camera.camR.y = static_cast<int>(m_transform->position.y - static_cast<float>(Game::camera.camR.h / 2 - m_transform->dimension.y * m_transform->scale / 2));
playerState = State::None;
break;
}
}
for(auto it {Game::entityManager.getEntities().begin() + 1}; it < Game::entityManager.getEntities().end(); it++)
{
if(it->get()->hasComponent<HitboxComponent>())
{
if(it->get()->getComponent<HitboxComponent>().hitboxActivated)
{
if(SDL_HasIntersection(&futureHitboxR, &it->get()->getComponent<HitboxComponent>().hitboxR))
{
if(i == 0) m_transform->velocity.x = 0;
if(i == 1) m_transform->velocity.y = 0;
break;
}
}
}
}
}
}
void m_adjustVelocity()
{
if(isNotZero(m_transform->velocity.x) && isNotZero(m_transform->velocity.y))
{
m_transform->velocity.x *= 0.707106781186548f;
m_transform->velocity.y *= 0.707106781186548f;
}
}
void m_setStateAndAnimation()
{
if((isNotZero(m_transform->velocity.x) || isNotZero(m_transform->velocity.y)) && playerState != State::Running)
{
playerState = State::Running;
m_animation->changeAnimation("ressources/heroes/knight/run-sheet.png", 6, 10);
}
else if(!(isNotZero(m_transform->velocity.x) || isNotZero(m_transform->velocity.y)) && playerState != State::Idle)
{
playerState = State::Idle;
m_animation->changeAnimation("ressources/heroes/knight/idle-sheet.png", 4, 15);
}
}
void m_setFlip()
{
if(m_transform->velocity.x < 0.0f)
m_sprite->flipSprite = true;
if(m_transform->velocity.x > 0.0f)
m_sprite->flipSprite = false;
}
void m_setCamera()
{
float targetX = m_transform->position.x - static_cast<float>(Game::camera.camR.w / 2 - m_transform->dimension.x * m_transform->scale / 2);
float targetY = m_transform->position.y - static_cast<float>(Game::camera.camR.h / 2 - m_transform->dimension.y * m_transform->scale / 2);
float smoothingFactor {0.08f};
if(playerState == State::Running) smoothingFactor = 0.12f;
Game::camera.camR.x = static_cast<int>(lerp(Game::camera.camR.x, targetX, smoothingFactor));
Game::camera.camR.y = static_cast<int>(lerp(Game::camera.camR.y, targetY, smoothingFactor));
}
void m_checkInteractions()
{
if(Game::events.keys[SDL_SCANCODE_E])
{
for(auto it {Game::entityManager.getEntities().begin() + 1}; it < Game::entityManager.getEntities().end(); it++)
{
if(it->get()->hasComponent<InteractableComponent>())
{
SDL_Rect interactableR;
if(it->get()->hasComponent<HitboxComponent>())
{
interactableR = it->get()->getComponent<HitboxComponent>().hitboxR;
}
else
{
interactableR.x = static_cast<int>(it->get()->getComponent<TransformComponent>().position.x);
interactableR.y = static_cast<int>(it->get()->getComponent<TransformComponent>().position.y);
interactableR.w = it->get()->getComponent<TransformComponent>().dimension.x * it->get()->getComponent<TransformComponent>().scale;
interactableR.h = it->get()->getComponent<TransformComponent>().dimension.y * it->get()->getComponent<TransformComponent>().scale;
}
if(m_isInRange(interactableR))
{
it->get()->getComponent<InteractableComponent>().interact();
}
}
}
}
}
bool m_isInRange(const SDL_Rect &entityR)
{
SDL_Rect intersectR {entityR};
intersectR.x -= m_interactionRange;
intersectR.y -= m_interactionRange;
intersectR.w += (m_interactionRange * 2);
intersectR.h += (m_interactionRange * 2);
return SDL_HasIntersection(&m_hitbox->hitboxR, &intersectR);
}
inline bool isNotZero(float value)
{
return abs(value) > EPSILON;
}
enum class State {
None,
Idle,
Running
};
TransformComponent *m_transform;
SpriteComponent *m_sprite;
HitboxComponent *m_hitbox;
AnimationSystem *m_animation;
int m_interactionRange {10};
State playerState {State::None};
};
#endif

76
ECS/SpriteComponent.hpp Normal file
View File

@ -0,0 +1,76 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
////////////////////////////////////////////
// //
// Composant sprite, gère ce qu'il faut //
// pour afficher le sprite. //
// //
////////////////////////////////////////////
#ifndef SPRITE_HPP
#define SPRITE_HPP
#include <string>
#include "ECS.hpp"
#include "TransformComponent.hpp"
#include "../Game.hpp"
#include "../TextureManager.hpp"
using std::string;
class SpriteComponent : public Component {
public:
SpriteComponent(const string &path)
{
setTexture(path);
}
void init() override
{
m_transform = &entity->getComponent<TransformComponent>();
m_srcR.x = m_srcR.y = 0;
m_srcR.w = m_transform->dimension.x;
m_srcR.h = m_transform->dimension.y;
}
void update() override
{
m_dstR.x = static_cast<int>(m_transform->position.x);
m_dstR.y = static_cast<int>(m_transform->position.y);
m_dstR.w = m_transform->dimension.x * m_transform->scale;
m_dstR.h = m_transform->dimension.y * m_transform->scale;
}
void draw() override
{
Game::textureManager.Draw(m_texture, m_srcR, m_dstR, flipSprite);
}
void setTexture(const string &path)
{
m_texture = Game::textureManager.LoadTexture(path);
}
SDL_Rect getSrcRect()
{
return m_srcR;
}
void setSrcRect(SDL_Rect srcR)
{
m_srcR = srcR;
}
bool flipSprite {false};
private:
TransformComponent *m_transform;
SDL_Texture *m_texture;
SDL_Rect m_srcR, m_dstR;
};
#endif

View File

@ -0,0 +1,49 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
////////////////////////////////////////////////////
// //
// Composant de transformation, sert a donner //
// une position, dimension, etc... à une entitée. //
// //
////////////////////////////////////////////////////
#ifndef TRANSFORM_HPP
#define TRANSFORM_HPP
#include "ECS.hpp"
#include "../Vector2D.hpp"
struct TransformComponent : public Component {
TransformComponent()
{
position.zero();
}
TransformComponent(Vector2D<float> pos, Vector2D<int> dim, int sc, int spd) : position(pos), speed(spd), dimension(dim), scale(sc)
{}
void init() override
{
velocity.zero();
}
void update() override
{
position += (velocity * static_cast<float>(speed));
entity->draw_priority = static_cast<int>(position.y + static_cast<float>(dimension.y * scale));
}
Vector2D<float> position;
Vector2D<float> velocity;
int speed {1};
Vector2D<int> dimension {32, 32};
int scale {1};
};
#endif

19
Events.hpp Normal file
View File

@ -0,0 +1,19 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
/////////////////////////////////////////////////////////////////////////////
// //
// Programme des évènement, sert a avoir une class dédiée au évènements. //
// //
/////////////////////////////////////////////////////////////////////////////
#ifndef EVENTS_HPP
#define EVENTS_HPP
struct Events {
bool keys[SDL_NUM_SCANCODES]; // touches du clavier en direct
};
#endif

154
Game.cpp Normal file
View File

@ -0,0 +1,154 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
/////////////////////////////////////
// //
// Definition de la classe Game. //
// //
/////////////////////////////////////
#include <iostream> // cerr
#include <SDL2/SDL_image.h> // IMG_Init, IMG_GetError
#include <stdexcept> // runtime_error
#include "Camera.hpp" // Camera::
#include "ECS/Components.hpp" // ECS and Components definition
#include "Events.hpp" // Events::
#include "Game.hpp" // Game declaration
#include "IP/Properties.hpp" // Item definition
#include "MapManager.hpp" // MapManager::
#include "TextureManager.hpp" // TextureManager::
#include "TileMap.hpp" // TileMap::
using std::cerr, std::runtime_error;
SDL_Renderer *Game::renderer;
SDL_Texture *Game::textureRenderer;
Events Game::events;
TextureManager Game::textureManager;
Camera Game::camera {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};
TileMap Game::tileMap;
MapManager Game::mapManager;
Manager Game::entityManager;
Entity &player(Game::entityManager.addEntity());
Game::~Game()
{
if(renderer != NULL) SDL_DestroyRenderer(renderer);
if(m_window != NULL) SDL_DestroyWindow(m_window);
SDL_Quit();
cerr << "Game cleaned.\n";
}
bool Game::Init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) != 0)
{
cerr << "Erreur SDL_Init : " << SDL_GetError() << '\n';
throw runtime_error("Impossible d'initialiser SDL2.\n");
}
cerr << "SDL initialised successfully.\n";
if(IMG_Init(IMG_INIT_PNG) == 0)
{
cerr << "Erreur IMG_Init : " << IMG_GetError() << '\n';
throw runtime_error("Impossible d'initialiser IMG.\n");
}
cerr << "IMG initialised successfully.\n";
m_window = SDL_CreateWindow(WINDOW_TITLE, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
if(m_window == NULL)
{
cerr << "Erreur SDL_CreateWindow : " << SDL_GetError() << '\n';
throw runtime_error("Impossible d'initialiser la fenêtre.\n");
}
cerr << "Window created successfully.\n";
renderer = SDL_CreateRenderer(m_window, -1, 0);
if(renderer == NULL)
{
cerr << "Erreur SDL_CreateRenderer : " << SDL_GetError() << '\n';
throw runtime_error("Impossible d'initialiser le renderer.\n");
}
cerr << "Renderer created successfully\n\n";
tileMap.LoadTileset("ressources/tileset/tileset.png");
tileMap.LoadTileMap("ressources/maps/dungeon entry.json");
TransformComponent *p_transform = &player.addComponent<TransformComponent>(tileMap.getPlayerInitPos(), Vector2D<int>(32, 32), 2, 3);
player.addComponent<SpriteComponent>("ressources/heroes/knight/idle-sheet.png");
player.addComponent<HitboxComponent>(Vector2D<float>(0.81f, 0.41f), Vector2D<float>(0.5f, 1.0f));
InventoryComponent *p_inventory = &player.addComponent<InventoryComponent>();
player.addComponent<AnimationSystem>();
player.addComponent<PlayerSystem>();
camera.camR.x = static_cast<int>(p_transform->position.x - static_cast<float>(camera.camR.w / 2 - p_transform->dimension.x * p_transform->scale / 2));
camera.camR.y = static_cast<int>(p_transform->position.y - static_cast<float>(camera.camR.h / 2 - p_transform->dimension.y * p_transform->scale / 2));
Item &item(p_inventory->addItem());
item.addProperty<NameProperty>("Prout");
m_isRunning = true;
return true;
}
void Game::HandleEvents()
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
if(event.type == SDL_QUIT)
m_isRunning = false;
else if(event.type == SDL_KEYDOWN && event.key.repeat == 0)
events.keys[event.key.keysym.scancode] = true;
else if(event.type == SDL_KEYUP)
events.keys[event.key.keysym.scancode] = false;
}
}
void Game::Update()
{
entityManager.refresh();
entityManager.update();
camera.update();
}
void Game::Render()
{
// Dessin sur une texture intermediaire
SDL_SetRenderTarget(renderer, textureRenderer);
SDL_SetRenderDrawColor(renderer, 20, 20, 18, 255);
SDL_RenderClear(renderer);
tileMap.draw(1);
tileMap.draw(2);
entityManager.draw();
tileMap.draw(3);
// Affichage sur la fenêtre avec la caméra
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderCopy(renderer, textureRenderer, &camera.camR, NULL);
SDL_RenderPresent(renderer);
}
bool Game::Running()
{
return m_isRunning;
}

57
Game.hpp Normal file
View File

@ -0,0 +1,57 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
/////////////////////////////////////////////////////////////////////
// //
// Declaration de la classe Game, gère toutes les données du jeu //
// et l'execution de chaque morceau de la boucle pricipale. //
// //
/////////////////////////////////////////////////////////////////////
#ifndef GAME_HPP
#define GAME_HPP
#include <SDL2/SDL.h> // SDL_Renderer, SDL_texture, SDL_Window
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 640
#define WINDOW_TITLE "2D Engine !"
class Events;
class TextureManager;
class Camera;
class TileMap;
class MapManager;
class Manager;
class Game {
public:
Game() = default;
~Game();
bool Init();
bool Running();
void HandleEvents();
void Update();
void Render();
static SDL_Renderer *renderer;
static SDL_Texture *textureRenderer;
static Events events;
static TextureManager textureManager;
static Camera camera;
static TileMap tileMap;
static MapManager mapManager;
static Manager entityManager;
private:
SDL_Window *m_window;
bool m_isRunning {false};
};
#endif

127
IP/IP.hpp Normal file
View File

@ -0,0 +1,127 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
//////////////////////////////////////
// //
// Definition de l'Item Property. //
// //
//////////////////////////////////////
#ifndef ITEMPROPERTY_HPP
#define ITEMPROPERTY_HPP
#include <algorithm>
#include <array>
#include <bitset>
#include <stdexcept>
#include <iostream>
#include <memory>
#include <vector>
using std::bitset, std::array, std::vector, std::unique_ptr, std::make_unique, std::move, std::forward, std::runtime_error, std::sort;
class Property;
class Item;
using PropertyID = std::size_t;
inline PropertyID getPropertyTypeID()
{
static PropertyID lastID = 0;
return lastID++;
}
template<typename T> inline PropertyID getPropertyTypeID() noexcept
{
static PropertyID typeID = getPropertyTypeID();
return typeID;
}
constexpr std::size_t maxProperties = 32;
using PropertyBitSet = bitset<maxProperties>;
using PropertyArray = array<Property*, maxProperties>;
class Property {
public:
Item *item;
virtual void init() {}
virtual ~Property() {}
};
class Item {
public:
template <typename T, typename... TArgs>
T& addProperty(TArgs&&... args)
{
if(hasProperty<T>())
{
throw runtime_error("Vous ne pouvez pas mettre deux fois la même propriétée dans le même item.\n");
}
// Creation d'un pointeur du type donné avec les arguments necessaires
T *p(new T(forward<TArgs>(args)...));
// On donne au composant une reference de l'entitée
p->item = this;
// Création d'un unique_ptr et ajout du composant dans le vecteur et array associé
unique_ptr<Property> uPtr {p};
properties.emplace_back(move(uPtr));
propertyArray[getPropertyTypeID<T>()] = p;
propertyBitSet[getPropertyTypeID<T>()] = true;
// Initialisation du composant
p->init();
return *p;
}
template <typename T>
bool hasProperty() const {
// Vérifier d'abord si un type exact est présent
PropertyID id = getPropertyTypeID<T>();
if (propertyBitSet[id]) {
return true;
}
// Si non, vérifier dynamiquement tous les composants pour un type dérivé
for (const auto& p : properties) {
if (dynamic_cast<T*>(p.get())) {
return true;
}
}
return false;
}
template <typename T>
T& getProperty() const {
// Vérification rapide via le BitSet et l'accès direct au composant via l'array
PropertyID id = getPropertyTypeID<T>();
if (propertyBitSet[id]) {
return *static_cast<T*>(propertyArray[id]);
}
// Vérification polymorphique avec dynamic_cast
for (const auto& p : properties) {
if (T* t = dynamic_cast<T*>(p.get())) {
return *t;
}
}
throw runtime_error("Propriété non trouvé.\n");
}
private:
bool active {true};
vector<unique_ptr<Property>> properties;
PropertyArray propertyArray;
PropertyBitSet propertyBitSet;
};
#endif

34
IP/NameProperty.hpp Normal file
View File

@ -0,0 +1,34 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
///////////////////////////////////////////////////////
// //
// Propriété de nom, sert a l'item d'avoir un nom. //
// //
///////////////////////////////////////////////////////
#ifndef NAME_HPP
#define NAME_HPP
#include <string>
#include "IP.hpp"
using std::string;
class NameProperty : public Property {
public:
NameProperty(const string &name) : m_name(name)
{}
string &getName()
{
return m_name;
}
private:
string m_name;
};
#endif

19
IP/Properties.hpp Normal file
View File

@ -0,0 +1,19 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
////////////////////////////////////////////////////////////////////////
// //
// Programme de la caméra, sert a avoir un rectangle et de pouvoir //
// la gérer correctement en fonction de la taille de la map... etc... //
// //
////////////////////////////////////////////////////////////////////////
#ifndef PROPERTIES_HPP
#define PROPERTIES_HPP
#include "IP.hpp"
#include "NameProperty.hpp"
#endif

71
MapManager.cpp Normal file
View File

@ -0,0 +1,71 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
///////////////////////////////////////////
// //
// Definition de la classe MapManager. //
// //
///////////////////////////////////////////
#include <fstream> // ifstream
#include <iostream> // cerr
#include <stdexcept> // exception, runtime_error
#include "MapManager.hpp" // MapManager definition
using std::ifstream, std::cerr, std::runtime_error, std::exception, std::make_unique;
json *MapManager::LoadMap(const string &path)
{
// Si la map est déja chargée, on la renvoie
auto it = m_maps.find(path);
if (it != m_maps.end())
return it->second.get();
// Sinon on charge le fichier
ifstream mapFile {path};
if(!mapFile)
{
cerr << "Erreur : Impossible d'ouvrir le fichier \"" << path << "\".\n";
throw runtime_error("Impossible d'ouvrir le fichier.\n");
}
// Puis on créé notre mapData et on la charge depuis le fichier
json mapData;
try
{
mapData = json::parse(mapFile);
}
catch (exception const &e)
{
cerr << "Erreur : " << e.what() << std::endl;
mapFile.close();
throw runtime_error("Impossible de lire correctement le fichier.\n");
}
mapFile.close();
// On ajoute la mapData dans la memoire
m_maps.emplace(path, make_unique<json>(mapData));
// Puis on la renvoie
it = m_maps.find(path);
if(it != m_maps.end())
return it->second.get();
throw runtime_error("Impossible de trouver la map dans l'unordered_map.\n");
}
void MapManager::Erase(const string &path)
{
m_maps.erase(path);
}
void MapManager::Clear()
{
m_maps.clear();
}

37
MapManager.hpp Normal file
View File

@ -0,0 +1,37 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
/////////////////////////////////////////////////////////////////////
// //
// Declaration de la classe MapManager, elle sert a charger des //
// map dans la memoire pour eviter de les recharger tout le temps. //
// //
/////////////////////////////////////////////////////////////////////
#ifndef MAPMANAGER_HPP
#define MAPMANAGER_HPP
#include <memory> // unique_ptr
#include <string> // string
#include <unordered_map> // unordered_map
#include "nlohmann/json.hpp" // json::
using std::string, std::unordered_map, std::unique_ptr;
using json = nlohmann::json;
class MapManager {
public:
json *LoadMap(const string &); // Renvoie une map depuis l'unordered_map ou charge depuis le disque puis renvoie la map
void Erase(const string &); // Efface dans l'unordered_map la map correspondante
void Clear(); // Clear tout l'unordered_map
private:
using json_ptr = unique_ptr<json>;
unordered_map<string, json_ptr> m_maps;
};
#endif

63
TextureManager.cpp Normal file
View File

@ -0,0 +1,63 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
///////////////////////////////////////////////
// //
// Definition de la classe TextureManager. //
// //
///////////////////////////////////////////////
#include <iostream>
#include <SDL2/SDL_image.h>
#include <stdexcept>
#include "Game.hpp"
#include "TextureManager.hpp"
using std::string, std::cerr, std::runtime_error;
SDL_Texture *TextureManager::LoadTexture(const string &path)
{
auto it = m_textures.find(path);
if (it != m_textures.end())
return it->second.get();
SDL_Surface *tmpSurface = IMG_Load(path.c_str());
if (!tmpSurface) {
cerr << "Erreur IMG_Load : " << IMG_GetError() << '\n';
throw runtime_error("Impossible de charger la texture depuis la memoire.\n");
}
SDL_Texture *texture = SDL_CreateTextureFromSurface(Game::renderer, tmpSurface);
SDL_FreeSurface(tmpSurface);
if (!texture) {
cerr << "Erreur SDL_CreateTextureFromSurface : " << SDL_GetError() << '\n';
throw runtime_error("Impossible de convertir la surface en texture.\n");
}
m_textures.emplace(path, texture_ptr(texture, &SDL_DestroyTexture));
it = m_textures.find(path);
if(it != m_textures.end())
return it->second.get();
throw runtime_error("Impossible de trouver la texture dans l'unordered_map.\n");
}
void TextureManager::Draw(SDL_Texture *texture, SDL_Rect srcR, SDL_Rect dstR, bool flip)
{
SDL_RendererFlip flipRender {SDL_FLIP_NONE};
if(flip) flipRender = SDL_FLIP_HORIZONTAL;
if(SDL_RenderCopyEx(Game::renderer, texture, &srcR, &dstR, 0, NULL, flipRender) != 0)
{
cerr << "Erreur SDL_RenderCopy : " << SDL_GetError() << '\n';
throw runtime_error("Impossible de dessiner la texture.\n");
}
}

37
TextureManager.hpp Normal file
View File

@ -0,0 +1,37 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
/////////////////////////////////////////////////////////////////////////
// //
// Declaration de la classe TextureManager, elle sert a charger des //
// texture dans la memoire pour eviter de les recharger tout le temps. //
// //
/////////////////////////////////////////////////////////////////////////
#ifndef TEXTURE_MANAGER_HPP
#define TEXTURE_MANAGER_HPP
#include <memory>
#include <SDL2/SDL.h>
#include <string>
#include <unordered_map>
using std::string, std::unique_ptr, std::unordered_map;
class TextureManager {
public:
SDL_Texture *LoadTexture(const string &); // Renvoie une texture depuis l'unordered_map ou charge depuis le disque puis renvoie la texture
void Draw(SDL_Texture *, SDL_Rect, SDL_Rect, bool); // Dessine la texture passé sur l'écran
void Erase(const string &); // Efface dans l'unordered_map la texture correspondante
void Clear(); // Clear tout l'unordered_map
private:
using texture_ptr = unique_ptr<SDL_Texture, decltype(&SDL_DestroyTexture)>;
unordered_map<string, texture_ptr> m_textures;
};
#endif

241
TileMap.cpp Normal file
View File

@ -0,0 +1,241 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
////////////////////////////////////////
// //
// Definition de la classe TileMap. //
// //
////////////////////////////////////////
#include <iostream>
#include <stdexcept>
#include "Camera.hpp"
#include "Game.hpp"
#include "MapManager.hpp"
#include "nlohmann/json.hpp"
#include "TextureManager.hpp"
#include "TileMap.hpp"
#include "Vector2D.hpp"
#include "ECS/Components.hpp"
using std::string, std::exception, std::vector, std::cerr, std::runtime_error;
using json = nlohmann::json;
void TileMap::LoadTileMap(const string &path)
{
json *mapData;
mapData = Game::mapManager.LoadMap(path);
tileMapWidth = mapData->at("TileMapWidth").get<int>();
tileMapHeight = mapData->at("TileMapHeight").get<int>();
worldWidth = tileMapWidth * TILE_SIZE * TILEMAP_SCALE;
worldHeight = tileMapHeight * TILE_SIZE * TILEMAP_SCALE;
m_tilesLayer1.clear();
m_tilesLayer2.clear();
m_tilesLayer3.clear();
hitboxes.clear();
m_tilesLayer1.resize(tileMapWidth * tileMapHeight);
m_tilesLayer2.resize(tileMapWidth * tileMapHeight);
m_tilesLayer3.resize(tileMapWidth * tileMapHeight);
hitboxes.resize(tileMapWidth * tileMapHeight);
string layers[] {"Layer 1","Layer 2","Layer 3", "Hitboxes"};
for(const string &layer : layers)
{
for(int y {0}; y < tileMapHeight; y++)
{
for(int x {0}; x < tileMapWidth; x++)
{
TileID tileID {mapData->at(layer).at(y).at(x)};
if(layer == "Layer 1")
{
m_tilesLayer1[x + y * tileMapWidth] = tileID;
}
else if(layer == "Layer 2")
{
m_tilesLayer2[x + y * tileMapWidth] = tileID;
}
else if(layer == "Layer 3")
{
m_tilesLayer3[x + y * tileMapWidth] = tileID;
}
else if(layer == "Hitboxes")
{
hitboxes[x + y * tileMapWidth] = tileID;
}
}
}
}
if(mapData->contains("PlayerInitPos"))
{
m_playerInitPos.x = mapData->at("PlayerInitPos").at("x").get<float>() * TILE_SIZE * TILEMAP_SCALE;
m_playerInitPos.y = mapData->at("PlayerInitPos").at("y").get<float>() * TILE_SIZE * TILEMAP_SCALE;
}
m_nextMaps.clear();
for(auto it {mapData->at("NextMaps").begin()}; it < mapData->at("NextMaps").end(); it++)
{
NextMap nextMap;
nextMap.path = it->at("Path").get<string>();
nextMap.playerInitPos.x = it->at("PlayerInitPos").at("x").get<float>();
nextMap.playerInitPos.y = it->at("PlayerInitPos").at("y").get<float>();
m_nextMaps.emplace(it->at("Number").get<int>(), nextMap);
}
std::size_t numberOfEntity {Game::entityManager.getNumberOfEntity()};
for(std::size_t i {1}; i < numberOfEntity; i++) Game::entityManager.erase(i);
if(mapData->contains("Entities"))
{
for(auto it {mapData->at("Entities").begin()}; it < mapData->at("Entities").end(); it++)
{
Entity &e(Game::entityManager.addEntity());
for(auto component {it->begin()}; component < it->end(); component++)
{
if(component->at("Type").get<string>() == "TransformComponent")
{
Vector2D<float> pos {Vector2D<float>(component->at("Position").at("x").get<float>(), component->at("Position").at("y").get<float>())};
Vector2D<float> dim {Vector2D<float>(component->at("Dimension").at("x").get<float>(), component->at("Dimension").at("y").get<float>())};
pos = pos * TILE_SIZE * TILEMAP_SCALE;
e.addComponent<TransformComponent>(pos, dim, component->at("Scale").get<int>(), component->at("Speed").get<int>());
}
else if(component->at("Type").get<string>() == "SpriteComponent")
{
e.addComponent<SpriteComponent>(component->at("Path").get<string>());
}
else if(component->at("Type").get<string>() == "AnimationSystem")
{
int nbFrames {component->at("NbFrames").get<int>()};
int currentFrame {component->at("CurrentFrame").get<int>()};
int frameDelay {component->at("FrameDelay").get<int>()};
bool playAnimation {component->at("PlayAnimation").get<bool>()};
e.addComponent<AnimationSystem>(nbFrames, currentFrame, frameDelay, playAnimation);
}
else if(component->at("Type").get<string>() == "HitboxComponent")
{
Vector2D<float> sc {Vector2D<float>(component->at("Scale").at("x").get<float>(), component->at("Scale").at("y").get<float>())};
Vector2D<float> pos {Vector2D<float>(component->at("Position").at("x").get<float>(), component->at("Position").at("y").get<float>())};
e.addComponent<HitboxComponent>(sc, pos);
}
else if(component->at("Type").get<string>() == "Lever")
{
e.addComponent<Lever>(component->at("Channel").get<int>());
}
else if(component->at("Type").get<string>() == "Lock")
{
e.addComponent<Lock>(component->at("Channel").get<int>());
}
else if(component->at("Type").get<string>() == "Door")
{
unordered_map<int, bool> states {};
for(auto state {component->at("States").begin()}; state < component->at("States").end(); state++)
states[state->at("Channel").get<int>()] = state->at("State").get<bool>();
e.addComponent<Door>(states);
}
}
}
}
Game::textureRenderer = SDL_CreateTexture(Game::renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, worldWidth, worldHeight);
if(Game::textureRenderer == NULL)
{
cerr << "Erreur SDL_CreateTexture : " << SDL_GetError() << '\n';
throw runtime_error("Impossible de creer la texture de rendu.\n");
}
}
void TileMap::LoadNextMap(int nextMapNumber)
{
NextMap nextMap = m_nextMaps.at(nextMapNumber);
LoadTileMap(nextMap.path);
m_playerInitPos = nextMap.playerInitPos * TILE_SIZE * TILEMAP_SCALE;
}
void TileMap::LoadTileset(const string &path)
{
m_tileset = Game::textureManager.LoadTexture(path);
SDL_QueryTexture(m_tileset, nullptr, nullptr, &m_tilesetWidth, &m_tilesetHeight);
m_tilesetWidth /= TILE_SIZE;
m_tilesetHeight /= TILE_SIZE;
}
void TileMap::draw(int layer)
{
if(layer == 1)
{
m_draw(m_tilesLayer1);
}
else if(layer == 2)
{
m_draw(m_tilesLayer2);
}
else if(layer == 3)
{
m_draw(m_tilesLayer3);
}
else
{
cerr << "Erreur : La tileMap " << layer << " n'est pas prise en charge.\n";
throw runtime_error("Impossible de dessiner la tileMap.\n");
}
}
void TileMap::m_draw(const vector<TileID> &tiles)
{
SDL_Rect visibleTilesR;
visibleTilesR.x = Game::camera.camR.x / (TILE_SIZE * TILEMAP_SCALE);
visibleTilesR.y = Game::camera.camR.y / (TILE_SIZE * TILEMAP_SCALE);
visibleTilesR.w = (Game::camera.camR.w + Game::camera.camR.x) / (TILE_SIZE * TILEMAP_SCALE);
visibleTilesR.h = (Game::camera.camR.h + Game::camera.camR.y) / (TILE_SIZE * TILEMAP_SCALE);
for(int tileY {visibleTilesR.y}; tileY <= visibleTilesR.h; tileY++)
{
for(int tileX {visibleTilesR.x}; tileX <= visibleTilesR.w; tileX++)
{
const TileID tile = tiles[tileX + tileY * tileMapWidth] - 1;
if(tile)
{
SDL_Rect srcR {(tile % m_tilesetWidth) * TILE_SIZE, (tile / m_tilesetWidth) * TILE_SIZE, TILE_SIZE, TILE_SIZE};
SDL_Rect dstR {tileX * TILE_SIZE * TILEMAP_SCALE, tileY * TILE_SIZE * TILEMAP_SCALE, TILE_SIZE * TILEMAP_SCALE, TILE_SIZE * TILEMAP_SCALE};
Game::textureManager.Draw(m_tileset, srcR, dstR, false);
}
}
}
}
Vector2D<float> TileMap::getPlayerInitPos()
{
return m_playerInitPos;
}
TileMap::~TileMap()
{
if(Game::textureRenderer != NULL) SDL_DestroyTexture(Game::textureRenderer);
}

66
TileMap.hpp Normal file
View File

@ -0,0 +1,66 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
/////////////////////////////////////////////////////////////////////////
// //
// Declaration de la classe TileMap, elle sert a charger tout ce //
// qui est en rapport avec une map. (tileMap, entités, hitbox, etc...) //
// //
/////////////////////////////////////////////////////////////////////////
#ifndef MAP_HPP
#define MAP_HPP
#include <SDL2/SDL.h>
#include <string>
#include <unordered_map>
#include <vector>
#include "Vector2D.hpp"
#define TILE_SIZE 16
#define TILEMAP_SCALE 2
using std::string, std::vector, std::unordered_map;
using TileID = int;
struct NextMap {
string path;
Vector2D<float> playerInitPos;
};
class TileMap {
public:
TileMap() = default;
~TileMap();
void LoadTileMap(const string &);
void LoadNextMap(int);
void LoadTileset(const string &);
void draw(int);
Vector2D<float> getPlayerInitPos();
int tileMapWidth, tileMapHeight;
int worldWidth, worldHeight;
vector<int> hitboxes;
private:
void m_draw(const vector<TileID> &);
vector<TileID> m_tilesLayer1;
vector<TileID> m_tilesLayer2;
vector<TileID> m_tilesLayer3;
int m_tilesetWidth, m_tilesetHeight;
SDL_Texture *m_tileset;
Vector2D<float> m_playerInitPos;
unordered_map<int, NextMap> m_nextMaps;
};
#endif

51
Vector2D.hpp Normal file
View File

@ -0,0 +1,51 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
//////////////////////////////////////////////////////////////////////
// //
// Vector2D et une classe template qui est similaire a SDL_Point. //
// //
//////////////////////////////////////////////////////////////////////
#ifndef VECTOR2D_HPP
#define VECTOR2D_HPP
#include <iosfwd>
template<typename T>
struct Vector2D {
T x;
T y;
Vector2D();
Vector2D(T, T);
template <typename U>
Vector2D(const Vector2D<U>&);
Vector2D<T> &operator+=(const Vector2D<T> &) noexcept;
Vector2D<T> &operator-=(const Vector2D<T> &) noexcept;
Vector2D<T> &operator*=(const Vector2D<T> &) noexcept;
Vector2D<T> &operator/=(const Vector2D<T> &) noexcept;
Vector2D<T> operator*(const T &) noexcept;
Vector2D<T> operator/(const T &) noexcept;
Vector2D<T> &zero() noexcept;
};
template<typename T>
Vector2D<T> operator+(const Vector2D<T> &, const Vector2D<T> &);
template<typename T>
Vector2D<T> operator-(const Vector2D<T> &, const Vector2D<T> &);
template<typename T>
Vector2D<T> operator*(const Vector2D<T> &, const Vector2D<T> &);
template<typename T>
Vector2D<T> operator/(const Vector2D<T> &, const Vector2D<T> &);
#include "Vector2D.tpp"
#endif

103
Vector2D.tpp Normal file
View File

@ -0,0 +1,103 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
/////////////////////////////////////////
// //
// Definition de la classe Vector2D. //
// //
/////////////////////////////////////////
template<typename T>
Vector2D<T>::Vector2D() : x(static_cast<T>(0)), y(static_cast<T>(0))
{}
template<typename T>
Vector2D<T>::Vector2D(T xInit, T yInit) : x(xInit), y(yInit)
{}
template <typename T> template<typename U>
Vector2D<T>::Vector2D(const Vector2D<U>& vec) : x(static_cast<T>(vec.x)), y(static_cast<T>(vec.y))
{}
template<typename T>
Vector2D<T> &Vector2D<T>::operator+=(const Vector2D<T> &vec) noexcept
{
x += vec.x;
y += vec.y;
return *this;
}
template<typename T>
Vector2D<T> &Vector2D<T>::operator-=(const Vector2D<T> &vec) noexcept
{
x -= vec.x;
y -= vec.y;
return *this;
}
template<typename T>
Vector2D<T> &Vector2D<T>::operator*=(const Vector2D<T> &vec) noexcept
{
x *= vec.x;
y *= vec.y;
return *this;
}
template<typename T>
Vector2D<T> &Vector2D<T>::operator/=(const Vector2D<T> &vec) noexcept
{
x /= vec.x;
y /= vec.y;
return *this;
}
template<typename T>
Vector2D<T> Vector2D<T>::operator*(const T &i) noexcept
{
return Vector2D<T>(x * i, y * i);
}
template<typename T>
Vector2D<T> Vector2D<T>::operator/(const T &i) noexcept
{
return Vector2D<T>(x / i, y / i);
}
template<typename T>
Vector2D<T> &Vector2D<T>::zero() noexcept
{
x = static_cast<T>(0);
y = static_cast<T>(0);
return *this;
}
template<typename T>
Vector2D<T> operator+(const Vector2D<T> &v1, const Vector2D<T> &v2)
{
return Vector2D<T>(v1.x + v2.x, v1.y + v2.y);
}
template<typename T>
Vector2D<T> operator-(const Vector2D<T> &v1, const Vector2D<T> &v2)
{
return Vector2D<T>(v1.x - v2.x, v1.y - v2.y);
}
template<typename T>
Vector2D<T> operator*(const Vector2D<T> &v1, const Vector2D<T> &v2)
{
return Vector2D<T>(v1.x * v2.x, v1.y * v2.y);
}
template<typename T>
Vector2D<T> operator/(const Vector2D<T> &v1, const Vector2D<T> &v2)
{
return Vector2D<T>(v1.x / v2.x, v1.y / v2.y);
}

76
main.cpp Normal file
View File

@ -0,0 +1,76 @@
/********************\
| Copyright 2024, |
| Ulysse Cura |
\********************/
////////////////////////////////////////
// //
// Main, gère la boucle principale. //
// //
////////////////////////////////////////
#include <iostream> // cerr
#include <stdexcept> // exception
#include "Game.hpp" // Game definition
using std::cerr, std::exception;
Game *game {nullptr};
int main()
{
// Pour limiter les FPS
const int FPS {60};
const float FRAME_DELAY {1000.0f / FPS};
Uint32 frameStart;
int frameTime;
game = new Game();
try
{
game->Init();
}
catch(exception const &e)
{
cerr << e.what();
delete game;
return EXIT_FAILURE;
}
while(game->Running())
{
frameStart = SDL_GetTicks();
game->HandleEvents();
try
{
game->Update();
}
catch(exception const &e)
{
cerr << e.what();
delete game;
return EXIT_FAILURE;
}
game->Render();
frameTime = SDL_GetTicks() - frameStart;
if(static_cast<float>(frameTime) < FRAME_DELAY)
{
SDL_Delay(static_cast<Uint32>(FRAME_DELAY - static_cast<float>(frameTime)));
}
#ifdef DEBUG_MODE
else
{
cerr << 1000 / frameTime << " FPS\n";
}
#endif
}
delete game;
return EXIT_SUCCESS;
}

24765
nlohmann/json.hpp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="22" height="21" tilewidth="16" tileheight="16" infinite="0" nextlayerid="4" nextobjectid="1">
<editorsettings>
<export target="../../maps/dungeon entry prout.json" format="json"/>
</editorsettings>
<tileset firstgid="1" source="../../tileset/tileset.tsx"/>
<layer id="1" name="Calque de Tuiles 1" width="22" height="21">
<data encoding="csv">
297,306,306,306,306,297,306,297,297,306,297,306,297,408,306,306,278,297,278,306,278,297,
278,278,278,297,692,306,306,306,306,297,278,297,297,417,306,278,297,306,278,630,278,297,
306,297,278,278,306,278,278,297,297,278,278,306,278,297,297,278,297,306,297,306,306,306,
278,278,278,278,306,297,297,306,297,297,297,278,297,306,297,297,306,297,306,306,278,297,
306,297,306,278,297,297,297,306,278,306,278,297,306,297,278,306,278,297,297,306,297,297,
297,278,274,282,306,297,297,297,306,297,297,306,306,297,297,278,278,297,274,282,297,297,
306,278,273,274,278,278,306,302,310,309,1,1,310,309,299,306,278,297,274,274,278,306,
297,278,274,282,297,297,302,311,319,318,322,323,319,318,308,310,299,278,283,273,306,278,
297,297,274,274,302,310,311,320,328,327,331,332,328,327,317,319,308,299,273,273,297,278,
306,297,283,273,285,319,320,329,306,306,306,306,306,297,326,328,317,280,282,283,297,306,
278,278,283,273,285,329,324,278,297,297,306,306,306,297,297,315,326,280,283,274,306,306,
306,278,274,274,285,297,306,306,297,306,315,297,278,306,306,278,297,280,274,282,278,278,
278,278,274,273,285,278,297,306,306,297,306,306,278,306,297,306,306,280,274,273,278,278,
278,599,283,273,275,306,297,297,278,306,278,306,278,297,333,306,278,272,282,283,297,297,
607,608,609,274,283,1,278,306,324,278,297,364,365,366,278,297,278,282,274,283,278,306,
306,297,273,438,439,274,274,306,306,278,306,373,374,375,272,273,283,659,660,274,297,278,
278,297,306,278,278,306,278,306,306,364,365,365,366,278,306,278,306,412,306,278,278,278,
306,278,278,297,297,297,297,278,278,373,374,374,375,297,306,306,278,297,306,306,306,306,
278,278,306,297,306,306,278,278,297,373,374,374,375,306,306,297,278,278,278,297,278,278,
278,297,278,306,306,278,278,278,278,382,363,374,379,366,278,297,278,278,306,297,278,297,
297,306,297,278,278,278,278,278,297,306,373,374,374,375,297,306,297,306,278,297,306,278
</data>
</layer>
<layer id="2" name="Calque de Tuiles 2" width="22" height="21">
<data encoding="csv">
620,621,1,682,683,684,1,640,641,1,1,406,407,646,452,453,1,619,620,621,1,1,
629,630,1,691,409,693,1,649,650,1,1,415,416,655,461,462,1,628,629,397,398,1,
569,570,571,1,418,419,1,658,659,1,1,424,425,664,470,471,1,421,422,406,407,408,
578,579,580,1,427,428,1,667,668,1,1,433,434,435,479,480,1,430,431,415,416,417,
587,588,589,1,1,437,1,1,677,1,1,442,443,1,488,489,1,439,440,424,425,426,
596,597,598,1,1,1,1,1,1,1,1,1,1,1,1,1,1,508,509,510,511,512,
605,606,607,1,1,1,1,1,1,1,1,1,1,1,1,1,1,457,518,519,520,521,
614,615,616,1,1,464,1,1,1,1,1,1,1,1,1,1,1,1,407,408,529,629,
1,1,585,558,1,1,1,1,1,515,1,1,516,1,1,1,1,1,416,417,538,1,
1,1,1,1,1,1,638,639,1,1,1,1,1,1,533,1,1,1,425,546,547,1,
1,644,645,646,1,532,647,648,1,1,1,1,1,1,515,1,1,1,434,1,1,1,
1,653,654,655,1,1,534,1,1,1,1,1,1,1,1,1,1,1,586,587,588,589,
1,662,663,664,1,1,514,1,714,1,1,1,1,1,1,525,514,1,595,596,597,598,
670,418,419,420,1,276,1,1,1,1,1,1,697,1,1,1,640,641,642,605,606,607,
1,427,428,429,567,275,265,266,1,516,1,1,1,1,271,264,649,650,651,614,615,616,
1,436,493,494,1,440,460,461,264,265,265,265,264,264,400,401,402,403,404,662,662,663,
1,1,502,503,1,1,469,470,471,1,1,1,1,1,409,410,411,404,669,1,671,672,
1,1,511,512,570,571,572,573,480,1,1,715,1,1,418,419,420,413,678,1,680,681,
1,1,520,521,579,580,581,582,583,1,1,1,1,1,427,428,429,422,687,1,689,690,
1,1,529,530,588,589,590,591,592,1,1,1,1,1,1,1,1,431,1,1,1,1,
1,1,538,1,597,598,599,600,1,1,1,1,1,1,1,1,1,440,1,1,1,1
</data>
</layer>
<layer id="3" name="Calque de Tuiles 3" width="22" height="21">
<data encoding="csv">
551,552,553,554,400,401,402,403,404,642,643,644,645,451,400,401,402,403,404,388,389,390,
560,561,562,563,564,410,411,412,413,651,652,653,654,460,409,410,411,412,473,474,475,399,
474,475,0,572,573,574,420,421,422,660,661,662,663,469,418,419,420,481,482,483,484,485,
483,484,485,581,582,583,429,430,431,669,670,671,672,478,427,428,429,490,491,492,493,494,
492,493,494,590,591,592,438,439,440,678,679,680,681,487,436,437,438,499,500,501,502,503,
501,502,503,599,600,446,447,448,686,687,688,689,690,496,497,498,447,388,389,390,610,611,
510,511,512,608,609,455,456,457,1,1,313,314,1,505,506,455,456,397,398,399,619,620,
519,520,521,617,618,464,465,466,1,1,1,1,1,1,1,464,465,406,550,551,552,553,
625,626,627,1,1,1,1,1,1,1,1,1,1,1,1,1,1,415,559,560,561,562,
634,635,636,637,1,1,1,1,1,1,1,1,1,1,1,1,1,424,568,569,570,571,
643,391,392,393,394,395,1,1,1,1,1,1,1,1,391,1,1,433,577,578,579,580,
652,400,401,402,403,404,1,1,1,1,1,1,1,1,1,1,622,623,624,625,626,1,
661,409,410,411,412,413,1,1,1,1,1,1,1,1,1,1,631,632,633,634,635,636,
473,474,475,476,421,422,1,1,1,1,1,1,1,1,1,1,640,641,1,643,644,645,
482,483,484,485,430,431,451,452,453,1,1,1,1,1,1,392,393,394,1,652,653,654,
491,492,1,551,552,553,554,555,462,1,1,1,1,1,392,393,394,472,473,474,475,476,
500,501,559,560,561,562,563,564,565,1,1,1,1,400,401,402,403,481,482,483,484,485,
509,510,568,569,472,473,474,475,574,1,1,1,1,409,410,411,412,490,491,492,493,494,
518,519,577,578,481,482,483,484,485,1,1,1,1,418,419,420,421,499,500,501,502,503,
527,528,586,587,490,491,492,493,494,1,1,1,1,427,428,429,430,508,509,510,511,512,
536,537,595,596,499,500,501,502,503,1,1,1,1,436,437,438,439,517,518,519,520,521
</data>
</layer>
</map>

View File

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="51" height="33" tilewidth="16" tileheight="16" infinite="0" nextlayerid="4" nextobjectid="1">
<editorsettings>
<export target="../../maps/map 1.tmj" format="json"/>
</editorsettings>
<tileset firstgid="1" source="../../tileset/tileset.tsx"/>
<layer id="1" name="Calque de Tuiles 1" width="51" height="33">
<data encoding="csv">
19,31,31,31,31,31,31,31,31,31,31,31,31,20,1,1,1,1,1,19,31,31,163,165,31,31,20,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
28,3,2,2,2,2,2,2,2,2,2,2,4,29,1,1,1,1,1,28,3,2,163,165,2,4,29,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
28,12,11,11,11,11,95,95,11,11,11,11,13,29,1,1,1,1,1,28,12,11,163,165,11,13,29,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
28,154,155,155,155,130,131,131,132,155,155,155,156,29,1,1,1,1,1,28,154,155,167,166,155,156,29,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
28,163,164,164,164,139,140,140,141,164,164,164,165,29,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,19,31,31,31,31,31,31,31,31,31,31,31,31,31,20,
28,163,164,181,182,148,149,149,150,164,164,164,165,29,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,28,3,2,2,2,2,2,2,2,2,2,2,2,4,29,
28,163,164,190,191,164,164,164,164,183,164,164,165,29,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,28,12,11,11,11,11,11,11,11,11,11,11,11,13,29,
28,163,164,164,164,193,164,164,164,164,193,164,165,29,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,28,154,155,155,155,155,155,155,155,155,155,155,155,156,29,
28,172,173,173,173,173,158,157,173,173,173,173,174,29,1,1,1,1,1,28,163,164,164,164,193,165,29,1,1,1,1,1,1,1,1,1,28,163,164,164,164,164,164,164,164,164,164,164,164,165,29,
37,22,22,22,359,46,163,165,46,377,22,22,22,38,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,28,172,173,173,173,173,173,173,173,158,157,173,173,174,29,
1,1,1,1,28,3,163,165,4,29,1,1,1,1,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,52,46,46,46,46,46,46,46,46,163,165,46,46,46,44,
1,1,1,1,28,12,163,165,13,29,1,1,1,1,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,28,3,2,2,2,2,2,2,2,163,165,2,2,4,29,
1,1,1,1,28,154,167,166,156,29,1,1,1,1,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,28,12,11,11,11,11,11,11,11,163,165,11,11,13,29,
1,1,1,1,28,163,164,164,165,30,31,31,31,31,31,31,31,31,31,32,163,164,164,164,164,165,30,31,31,31,31,31,31,31,31,31,32,154,155,155,155,155,155,155,155,167,166,155,155,156,29,
1,1,1,1,28,163,164,164,165,6,2,2,2,2,2,2,2,2,2,7,163,164,164,164,164,165,6,2,2,2,2,2,2,2,2,2,7,163,164,164,157,173,173,173,173,173,173,173,173,174,29,
1,1,1,1,28,163,164,164,165,15,11,11,11,11,11,11,10,11,11,16,163,164,164,164,164,165,15,11,11,11,11,11,11,11,11,11,16,163,164,164,165,21,22,22,22,22,22,22,22,22,38,
1,1,1,1,28,163,164,164,166,155,155,155,155,155,155,155,155,155,155,155,167,164,164,164,164,166,155,155,155,155,155,155,155,155,155,155,155,167,164,164,165,30,31,31,31,31,31,31,31,31,20,
1,1,1,1,28,172,173,173,173,173,173,173,173,173,173,173,173,173,173,173,158,183,164,164,164,157,173,173,173,173,173,173,173,173,173,173,173,158,164,164,165,6,2,2,2,2,2,2,2,4,29,
1,1,1,1,37,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,163,164,164,164,164,165,21,22,22,22,22,22,22,22,22,22,23,163,164,164,165,15,11,11,10,11,11,11,11,13,29,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,28,163,164,183,166,155,155,155,155,155,155,155,155,156,29,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,28,172,173,173,173,173,173,173,173,173,173,173,173,174,29,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,37,22,22,22,22,22,22,22,22,22,22,22,22,22,38,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,28,163,164,164,164,164,165,29,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,19,31,31,31,31,31,32,163,164,164,164,164,165,30,31,31,31,31,31,20,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,19,31,31,31,31,31,360,3,2,2,2,2,7,163,164,164,164,164,165,6,2,2,2,2,4,386,31,31,31,31,31,20,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,28,3,2,2,2,4,33,12,11,11,11,11,16,163,164,164,164,164,165,15,11,11,11,11,13,33,2,2,2,2,4,29,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,28,12,11,11,11,13,234,154,155,155,155,155,155,167,164,164,164,164,166,155,155,155,155,155,156,234,11,11,10,11,13,29,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,28,154,155,155,155,156,243,163,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,165,243,154,155,155,155,156,29,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,28,163,164,192,193,166,155,167,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,166,155,167,164,164,164,165,29,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,28,172,173,173,173,173,173,173,173,173,173,173,173,173,173,158,157,173,173,173,173,173,173,173,173,173,173,173,173,173,174,29,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,37,22,22,22,22,22,22,22,22,22,22,22,22,22,22,1,1,22,22,22,22,22,22,22,22,22,22,22,22,22,22,38,1,1,1,1,1,1,1,1,1,1,1,1
</data>
</layer>
<layer id="2" name="Calque de Tuiles 2" width="51" height="33">
<data encoding="csv">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,64,65,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,73,74,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,161,162,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,64,65,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,73,74,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,64,65,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,73,74,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,701,1,1,701,698,1,1,188,189,1,1,698,701,1,1,701,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,710,1,1,710,707,1,1,188,189,1,1,707,710,1,1,710,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,252,1,1,1,1,1,1,1,1,188,189,1,1,1,1,1,1,1,1,252,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,197,198,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</data>
</layer>
<layer id="3" name="Calque de Tuiles 3" width="51" height="33">
<data encoding="csv">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,55,56,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,341,342,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,395,396,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,341,342,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,395,396,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,341,342,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,350,351,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</data>
</layer>
</map>

View File

@ -0,0 +1,341 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="left-up" width="30" height="20" tilewidth="16" tileheight="16" infinite="1" nextlayerid="8" nextobjectid="1">
<tileset firstgid="1" source="../../tileset/tileset.tsx"/>
<tileset firstgid="793" source="../../../../../../snap/tiled/4555/Props.tsx"/>
<layer id="5" name="Calque de Tuiles 1" width="30" height="20">
<data encoding="csv">
<chunk x="-32" y="0" width="16" height="16">
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,19,31,31,31,31,31,31,31,
9,9,9,9,9,9,9,9,28,3,2,2,2,2,2,2,
9,9,9,9,9,9,9,9,28,12,11,11,11,11,11,11,
9,9,9,9,9,9,9,9,28,154,155,155,155,155,155,155,
9,9,9,9,9,9,9,9,28,163,157,173,173,173,173,173,
9,9,9,9,9,9,9,9,28,163,165,21,22,22,22,22,
9,9,9,9,9,9,9,9,28,163,165,29,9,9,9,9,
9,9,9,9,9,9,9,9,28,163,165,29,9,9,9,9,
9,9,9,9,9,9,9,9,28,163,165,29,9,9,9,9
</chunk>
<chunk x="-16" y="0" width="16" height="16">
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
19,9,9,20,9,9,9,9,9,9,9,9,9,9,9,9,
28,9,9,29,9,9,9,9,9,9,9,9,9,9,9,9,
32,9,9,30,31,31,31,31,31,31,31,31,31,31,31,31,
7,154,156,6,2,2,2,2,2,2,2,2,2,2,2,2,
16,163,165,15,11,11,11,11,11,11,11,11,11,11,11,11,
155,167,166,155,155,155,155,155,155,155,155,155,155,155,155,155,
173,173,173,173,173,173,173,173,173,173,158,157,173,173,173,173,
22,22,22,22,22,22,22,22,22,23,163,165,21,22,22,22,
9,9,9,9,9,9,9,9,9,28,163,165,29,9,9,9,
9,9,9,9,9,9,9,9,9,28,163,165,29,9,9,9,
9,9,9,9,9,9,9,9,9,28,159,160,29,9,9,9
</chunk>
<chunk x="0" y="0" width="16" height="16">
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
31,31,31,31,31,20,9,9,9,9,9,9,9,9,9,9,
2,2,2,2,4,29,9,9,9,9,9,9,9,9,9,9,
11,11,11,11,13,29,9,9,9,9,9,9,9,9,9,9,
155,155,155,155,156,29,9,9,9,9,9,9,9,9,9,9,
173,173,173,173,174,29,9,9,9,9,9,9,9,9,9,9,
22,22,22,22,22,38,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9
</chunk>
<chunk x="-32" y="16" width="16" height="16">
9,9,9,9,9,9,9,9,28,163,165,29,9,9,9,9,
9,9,9,9,9,9,9,9,28,163,165,29,9,9,9,9,
9,9,9,19,31,31,31,31,32,164,164,30,31,31,31,31,
9,9,9,28,3,2,2,2,7,1,1,6,2,2,2,2,
9,9,9,28,12,11,11,11,16,1,1,15,11,11,11,11,
9,9,9,28,199,200,200,200,200,200,200,200,200,200,200,201,
9,9,9,28,208,209,209,236,209,209,209,209,209,209,209,210,
9,9,9,28,208,209,209,209,209,209,236,209,236,209,209,210,
9,9,9,28,208,209,209,209,209,209,209,209,209,209,209,210,
9,9,9,28,208,209,236,209,209,209,209,209,236,209,209,210,
9,9,9,28,217,218,218,218,218,218,218,218,218,218,218,219,
9,9,9,37,22,22,22,22,22,22,22,22,22,22,22,22,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9
</chunk>
<chunk x="-16" y="16" width="16" height="16">
9,9,9,9,9,9,9,9,9,28,168,169,29,9,9,9,
9,9,9,9,9,9,9,9,9,28,154,156,29,9,9,9,
43,31,31,31,31,31,31,31,31,32,163,165,30,31,31,31,
47,3,2,2,2,2,2,2,2,7,163,165,6,2,2,2,
47,12,11,11,11,11,11,11,11,16,163,165,15,11,11,11,
47,154,155,155,155,155,155,155,155,155,167,166,155,155,155,155,
47,163,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
47,163,164,164,164,164,164,164,164,164,39,40,164,164,164,164,
47,163,164,164,164,164,164,164,164,164,48,49,164,164,164,164,
47,163,164,164,164,164,164,164,164,164,6,7,164,164,164,164,
47,172,173,173,173,158,164,164,164,164,15,16,164,164,164,164,
53,22,22,22,23,163,164,164,164,164,164,164,164,164,164,164,
9,9,9,9,28,172,173,173,173,173,173,173,173,173,173,173,
9,9,9,9,37,22,22,22,22,22,9,9,22,22,22,22,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9
</chunk>
<chunk x="0" y="16" width="16" height="16">
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
31,31,31,31,31,20,9,9,9,9,9,9,9,9,9,9,
2,2,2,2,4,386,31,31,31,31,20,9,9,9,9,9,
11,11,11,11,13,234,3,2,2,4,29,9,9,9,9,9,
155,155,155,155,156,243,12,11,11,13,29,9,9,9,9,9,
164,164,164,164,164,173,155,155,155,156,29,9,9,9,9,9,
164,164,164,164,165,25,173,173,173,174,29,9,9,9,9,9,
164,164,164,164,165,368,22,22,22,22,38,9,9,9,9,9,
164,164,164,164,165,29,9,9,9,9,9,9,9,9,9,9,
157,173,173,173,174,29,9,9,9,9,9,9,9,9,9,9,
165,21,22,22,22,38,9,9,9,9,9,9,9,9,9,9,
174,29,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
22,38,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9
</chunk>
</data>
</layer>
<layer id="6" name="Calque de Tuiles 2" width="30" height="20">
<data encoding="csv">
<chunk x="-32" y="0" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,10,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
<chunk x="-16" y="0" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,31,31,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,834,835,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,859,860,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,10,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
<chunk x="0" y="0" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,57,58,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,66,67,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,75,76,1,1,1,1,1,1,1,1,1,1,1,1,
969,207,206,242,207,1,1,1,1,1,1,1,1,1,1,1,
1,1,254,1,216,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
<chunk x="-32" y="16" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,350,351,1,1,1,1,1,
1,1,1,1,773,774,0,0,1,834,835,1,773,774,773,774,
1,1,1,1,782,783,751,752,753,859,860,1,782,783,782,783,
1,1,1,1,791,792,760,761,762,1,1,1,791,792,791,792,
1,1,1,1,1,771,772,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,780,781,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,789,790,1,754,755,755,756,1,754,756,1,
1,1,1,1,1,1,1,1,763,764,764,765,1,763,765,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
<chunk x="-16" y="16" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,701,1,1,1,701,1,1,1,1,1,1,701,1,
1,10,1,710,1,1,1,710,1,1,1,1,1,1,710,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
<chunk x="0" y="16" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,701,1,1,1,1,57,58,1,1,1,1,1,1,1,
1,1,710,1,1,1,1,66,67,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,75,76,1,1,1,1,1,1,1,
1,1,1,1,1,252,260,256,260,1,1,1,1,1,1,1,
1,1,1,1,1,1,261,1,1,994,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,794,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,819,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
</data>
</layer>
<layer id="7" name="Calque de Tuiles 3" width="30" height="20">
<data encoding="csv">
<chunk x="-32" y="0" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
<chunk x="-16" y="0" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,809,810,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,963,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,988,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
<chunk x="0" y="0" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
<chunk x="-32" y="16" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,341,342,1,1,1,1,1,
1,1,1,1,1,1,1,1,387,809,810,369,1,1,1,1,
1,1,1,1,1,1,0,0,1,1,0,1,0,0,0,0,
1,1,1,1,924,929,882,928,1,1,0,1,929,930,930,931,
1,1,1,1,0,929,0,0,1,1,1,991,932,932,929,814,
1,1,1,1,1,911,1,1,1,1,1,1,1,1,1,839,
1,1,1,1,1,1,825,1,848,849,1,1,1,850,851,1,
1,1,1,1,1,1,1,1,873,874,881,1,1,875,876,1,
1,1,1,1,917,1,1,1,1,738,1,1,1,1,1,1,
1,1,1,1,942,991,1,1,1,747,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
<chunk x="-16" y="16" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,183,1,
1,1,1,1,1,1,181,182,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,190,191,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,193,1,
1,1,1,1,1,1,1,1,1,1,341,342,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,350,351,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
<chunk x="0" y="16" width="16" height="16">
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
</chunk>
</data>
</layer>
</map>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,118 @@
{
"TileMapWidth": 22,
"TileMapHeight": 21,
"Layer 1": [
[297, 306, 306, 306, 306, 297, 306, 297, 297, 306, 297, 306, 297, 408, 306, 306, 278, 297, 278, 306, 278, 297],
[278, 278, 278, 297, 692, 306, 306, 306, 306, 297, 278, 297, 297, 417, 306, 278, 297, 306, 278, 630, 278, 297],
[306, 297, 278, 278, 306, 278, 278, 297, 297, 278, 278, 306, 278, 297, 297, 278, 297, 306, 297, 306, 306, 306],
[278, 278, 278, 278, 306, 297, 297, 306, 297, 297, 297, 278, 297, 306, 297, 297, 306, 297, 306, 306, 278, 297],
[306, 297, 306, 278, 297, 297, 297, 306, 278, 306, 278, 297, 306, 297, 278, 306, 278, 297, 297, 306, 297, 297],
[297, 278, 274, 282, 306, 297, 297, 297, 306, 297, 297, 306, 306, 297, 297, 278, 278, 297, 274, 282, 297, 297],
[306, 278, 273, 274, 278, 278, 306, 302, 310, 309, 330, 330, 310, 309, 299, 306, 278, 297, 274, 274, 278, 306],
[297, 278, 274, 282, 297, 297, 302, 311, 319, 318, 322, 323, 319, 318, 308, 310, 299, 278, 283, 273, 306, 278],
[297, 297, 274, 274, 302, 310, 311, 320, 328, 327, 331, 332, 328, 327, 317, 319, 308, 299, 273, 273, 297, 278],
[306, 297, 283, 273, 285, 319, 320, 329, 306, 306, 306, 306, 306, 297, 326, 328, 317, 280, 282, 283, 297, 306],
[278, 278, 283, 273, 285, 329, 324, 278, 297, 297, 306, 306, 306, 297, 297, 315, 326, 280, 283, 274, 306, 306],
[306, 278, 274, 274, 285, 297, 306, 306, 297, 306, 315, 297, 278, 306, 306, 278, 297, 280, 274, 282, 278, 278],
[278, 278, 274, 273, 285, 278, 297, 306, 306, 297, 306, 306, 278, 306, 297, 306, 306, 280, 274, 273, 278, 278],
[278, 599, 283, 273, 275, 306, 297, 297, 278, 306, 278, 306, 278, 297, 333, 306, 278, 272, 282, 283, 297, 297],
[607, 608, 609, 274, 283, 1, 278, 306, 324, 278, 297, 364, 365, 366, 278, 297, 274, 282, 274, 283, 278, 306],
[306, 297, 273, 438, 439, 274, 274, 306, 306, 278, 306, 373, 374, 375, 272, 273, 283, 659, 660, 274, 297, 278],
[278, 297, 306, 278, 278, 306, 278, 306, 306, 364, 365, 365, 366, 278, 306, 278, 306, 412, 306, 278, 278, 278],
[306, 278, 278, 297, 297, 297, 297, 278, 278, 373, 374, 374, 375, 297, 306, 306, 278, 297, 306, 306, 306, 306],
[278, 278, 306, 297, 306, 306, 278, 278, 297, 373, 374, 374, 375, 306, 306, 297, 278, 278, 278, 297, 278, 278],
[278, 297, 278, 306, 306, 278, 278, 278, 278, 382, 363, 374, 379, 366, 278, 297, 278, 278, 306, 297, 278, 297],
[297, 306, 297, 278, 278, 278, 278, 278, 297, 306, 373, 374, 374, 375, 297, 306, 297, 306, 278, 297, 306, 278]
],
"Layer 2": [
[620, 621, 1, 682, 683, 684, 1, 640, 641, 1, 1, 406, 407, 646, 452, 453, 1, 619, 620, 621, 1, 1],
[629, 630, 1, 691, 409, 693, 1, 649, 650, 1, 1, 415, 416, 655, 461, 462, 1, 628, 629, 397, 398, 1],
[569, 570, 571, 1, 418, 419, 1, 658, 659, 1, 1, 424, 425, 664, 470, 471, 1, 421, 422, 406, 407, 408],
[578, 579, 580, 1, 427, 428, 1, 667, 668, 1, 1, 433, 434, 435, 479, 480, 1, 430, 431, 415, 416, 417],
[587, 588, 589, 1, 1, 437, 1, 1, 677, 1, 1, 442, 443, 1, 488, 489, 1, 439, 440, 424, 425, 426],
[596, 597, 598, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 508, 509, 510, 511, 512],
[605, 606, 607, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 457, 518, 519, 520, 521],
[614, 615, 616, 1, 1, 464, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 407, 408, 529, 629],
[1, 1, 585, 558, 1, 1, 1, 1, 1, 515, 1, 1, 516, 1, 1, 1, 1, 1, 416, 417, 538, 1],
[1, 1, 1, 1, 1, 1, 638, 639, 1, 1, 1, 1, 1, 1, 533, 1, 1, 1, 425, 546, 547, 1],
[1, 644, 645, 646, 1, 532, 647, 648, 1, 1, 1, 1, 1, 1, 515, 1, 1, 1, 434, 1, 1, 1],
[1, 653, 654, 655, 1, 1, 534, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 586, 587, 588, 589],
[1, 662, 663, 664, 1, 1, 514, 1, 714, 1, 1, 1, 1, 1, 1, 525, 514, 1, 595, 596, 597, 598],
[670, 418, 419, 420, 1, 276, 1, 1, 1, 1, 1, 1, 697, 1, 1, 1, 640, 641, 642, 605, 606, 607],
[1, 427, 428, 429, 567, 275, 265, 266, 1, 516, 1, 1, 1, 1, 271, 264, 649, 650, 651, 614, 615, 616],
[1, 436, 493, 494, 1, 440, 460, 461, 264, 265, 265, 265, 264, 264, 400, 401, 402, 403, 404, 662, 662, 663],
[1, 1, 502, 503, 1, 1, 469, 470, 471, 1, 1, 1, 1, 1, 409, 410, 411, 404, 669, 1, 671, 672],
[1, 1, 511, 512, 570, 571, 572, 573, 480, 1, 1, 715, 1, 1, 418, 419, 420, 413, 678, 1, 680, 681],
[1, 1, 520, 521, 579, 580, 581, 582, 583, 1, 1, 1, 1, 1, 427, 428, 429, 422, 687, 1, 689, 690],
[1, 1, 529, 530, 588, 589, 590, 591, 592, 1, 1, 1, 1, 1, 1, 1, 1, 431, 1, 1, 1, 1],
[1, 1, 538, 1, 597, 598, 599, 600, 1, 1, 1, 1, 1, 1, 1, 1, 1, 440, 1, 1, 1, 1]
],
"Layer 3": [
[551, 552, 553, 554, 400, 401, 402, 403, 404, 642, 643, 644, 645, 451, 400, 401, 402, 403, 404, 388, 389, 390],
[560, 561, 562, 563, 564, 410, 411, 412, 413, 651, 652, 653, 654, 460, 409, 410, 411, 412, 473, 474, 475, 399],
[474, 475, 0, 572, 573, 574, 420, 421, 422, 660, 661, 662, 663, 469, 418, 419, 420, 481, 482, 483, 484, 485],
[483, 484, 485, 581, 582, 583, 429, 430, 431, 669, 670, 671, 672, 478, 427, 428, 429, 490, 491, 492, 493, 494],
[492, 493, 494, 590, 591, 592, 438, 439, 440, 678, 679, 680, 681, 487, 436, 437, 438, 499, 500, 501, 502, 503],
[501, 502, 503, 599, 600, 446, 447, 448, 686, 687, 688, 689, 690, 496, 497, 498, 447, 388, 389, 390, 610, 611],
[510, 511, 512, 608, 609, 455, 456, 457, 1, 1, 313, 314, 1, 505, 506, 455, 456, 397, 398, 399, 619, 620],
[519, 520, 521, 617, 618, 464, 465, 466, 1, 1, 1, 1, 1, 1, 1, 464, 465, 406, 550, 551, 552, 553],
[625, 626, 627, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 415, 559, 560, 561, 562],
[634, 635, 636, 637, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 424, 568, 569, 570, 571],
[643, 391, 392, 393, 394, 1, 1, 1, 1, 1, 1, 1, 1, 1, 391, 1, 1, 433, 577, 578, 579, 580],
[652, 400, 401, 402, 403, 404, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 622, 623, 624, 625, 626, 1],
[661, 409, 410, 411, 412, 413, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 631, 632, 633, 634, 635, 636],
[473, 474, 475, 476, 421, 422, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 640, 641, 1, 643, 644, 645],
[482, 483, 484, 485, 430, 431, 451, 452, 453, 1, 1, 1, 1, 1, 1, 392, 393, 394, 1, 652, 653, 654],
[491, 492, 1, 551, 552, 553, 554, 555, 462, 1, 1, 1, 1, 1, 392, 393, 394, 472, 473, 474, 475, 476],
[500, 501, 559, 560, 561, 562, 563, 564, 565, 1, 1, 1, 1, 400, 401, 402, 403, 481, 482, 483, 484, 485],
[509, 510, 568, 569, 472, 473, 474, 475, 574, 1, 1, 1, 1, 409, 410, 411, 412, 490, 491, 492, 493, 494],
[518, 519, 577, 578, 481, 482, 483, 484, 485, 1, 1, 1, 1, 418, 419, 420, 421, 499, 500, 501, 502, 503],
[527, 528, 586, 587, 490, 491, 492, 493, 494, 1, 1, 1, 1, 427, 428, 429, 430, 508, 509, 510, 511, 512],
[536, 537, 595, 596, 499, 500, 501, 502, 503, 1, 1, 1, 1, 436, 437, 438, 439, 517, 518, 519, 520, 521]
],
"Hitboxes": [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
],
"NextMaps": [
{
"Number": 2,
"Path": "ressources/maps/map dungeon 1.json",
"PlayerInitPos": {
"x": 22,
"y": 30
}
}
],
"PlayerInitPos": {
"x": 10,
"y": 11
}
}

View File

@ -0,0 +1,434 @@
{
"TileMapWidth": 51,
"TileMapHeight": 33,
"Layer 1": [
[19, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 20, 1, 1, 1, 1, 1, 19, 31, 31, 163, 165, 31, 31, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[28, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 29, 1, 1, 1, 1, 1, 28, 3, 2, 163, 165, 2, 4, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[28, 12, 11, 11, 11, 11, 95, 95, 11, 11, 11, 11, 13, 29, 1, 1, 1, 1, 1, 28, 12, 11, 163, 165, 11, 13, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[28, 154, 155, 155, 155, 130, 131, 131, 132, 155, 155, 155, 156, 29, 1, 1, 1, 1, 1, 28, 154, 155, 167, 166, 155, 156, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[28, 163, 164, 164, 164, 139, 140, 140, 141, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 20],
[28, 163, 164, 181, 182, 148, 149, 149, 150, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 29],
[28, 163, 164, 190, 191, 164, 164, 164, 164, 183, 164, 164, 165, 29, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 13, 29],
[28, 163, 164, 164, 164, 193, 164, 164, 164, 164, 193, 164, 165, 29, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 154, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 156, 29],
[28, 172, 173, 173, 173, 173, 158, 157, 173, 173, 173, 173, 174, 29, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 193, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 29],
[37, 22, 22, 22, 359, 46, 163, 165, 46, 377, 22, 22, 22, 38, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 172, 173, 173, 173, 173, 173, 173, 173, 158, 157, 173, 173, 174, 29],
[1, 1, 1, 1, 28, 3, 163, 165, 4, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 46, 46, 46, 46, 46, 46, 46, 46, 163, 165, 46, 46, 46, 44],
[1, 1, 1, 1, 28, 12, 163, 165, 13, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 3, 2, 2, 2, 2, 2, 2, 2, 163, 165, 2, 2, 4, 29],
[1, 1, 1, 1, 28, 154, 167, 166, 156, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 12, 11, 11, 11, 11, 11, 11, 11, 163, 165, 11, 11, 13, 29],
[1, 1, 1, 1, 28, 163, 164, 164, 165, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 163, 164, 164, 164, 164, 165, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 154, 155, 155, 155, 155, 155, 155, 155, 167, 166, 155, 155, 156, 29],
[1, 1, 1, 1, 28, 163, 164, 164, 165, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 163, 164, 164, 164, 164, 165, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 163, 164, 164, 157, 173, 173, 173, 173, 173, 173, 173, 173, 174, 29],
[1, 1, 1, 1, 28, 163, 164, 164, 165, 15, 11, 11, 11, 11, 11, 11, 10, 11, 11, 16, 163, 164, 164, 164, 164, 165, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 163, 164, 164, 165, 21, 22, 22, 22, 22, 22, 22, 22, 22, 38],
[1, 1, 1, 1, 28, 163, 164, 164, 166, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 167, 164, 164, 164, 164, 166, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 167, 164, 164, 165, 30, 31, 31, 31, 31, 31, 31, 31, 31, 20],
[1, 1, 1, 1, 28, 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 158, 183, 164, 164, 164, 157, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 158, 164, 164, 165, 6, 2, 2, 2, 2, 2, 2, 2, 4, 29],
[1, 1, 1, 1, 37, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 163, 164, 164, 164, 164, 165, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 163, 164, 164, 165, 15, 11, 11, 10, 11, 11, 11, 11, 13, 29],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 183, 166, 155, 155, 155, 155, 155, 155, 155, 155, 156, 29],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 174, 29],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 38],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 31, 31, 31, 31, 31, 32, 163, 164, 164, 164, 164, 165, 30, 31, 31, 31, 31, 31, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 19, 31, 31, 31, 31, 31, 360, 3, 2, 2, 2, 2, 7, 163, 164, 164, 164, 164, 165, 6, 2, 2, 2, 2, 4, 386, 31, 31, 31, 31, 31, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 28, 3, 2, 2, 2, 4, 33, 12, 11, 11, 11, 11, 16, 163, 164, 164, 164, 164, 165, 15, 11, 11, 11, 11, 13, 33, 2, 2, 2, 2, 4, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 28, 12, 11, 11, 11, 13, 234, 154, 155, 155, 155, 155, 155, 167, 164, 164, 164, 164, 166, 155, 155, 155, 155, 155, 156, 234, 11, 11, 10, 11, 13, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 28, 154, 155, 155, 155, 156, 243, 163, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 243, 154, 155, 155, 155, 156, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 28, 163, 164, 192, 193, 166, 155, 167, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 166, 155, 167, 164, 164, 164, 165, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 28, 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 158, 157, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 174, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 37, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 1, 1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 38, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"Layer 2": [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 64, 65, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 73, 74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 161, 162, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 64, 65, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 73, 74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 64, 65, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 73, 74, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 701, 1, 1, 701, 698, 1, 1, 188, 189, 1, 1, 698, 701, 1, 1, 701, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 710, 1, 1, 710, 707, 1, 1, 188, 189, 1, 1, 707, 710, 1, 1, 710, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 252, 1, 1, 1, 1, 1, 1, 1, 1, 188, 189, 1, 1, 1, 1, 1, 1, 1, 1, 252, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 197, 198, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"Layer 3": [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 56, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 341, 342, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 395, 396, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 341, 342, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 395, 396, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 341, 342, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350, 351, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"Hitboxes": [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
],
"NextMaps": [
{
"Number": 2,
"Path": "ressources/maps/dungeon entry.json",
"PlayerInitPos": {
"x": 10,
"y": 7
}
}
],
"Entities": [
[
{
"Type": "TransformComponent",
"Position": {
"x": 47,
"y": 12
},
"Dimension": {
"x": 48,
"y": 32
},
"Scale": 2,
"Speed": 0
},
{
"Type": "SpriteComponent",
"Path": "ressources/props/lever.png"
},
{
"Type": "AnimationSystem",
"NbFrames": 3,
"CurrentFrame": 0,
"FrameDelay": 10,
"PlayAnimation": false
},
{
"Type": "HitboxComponent",
"Scale": {
"x": 0.33333,
"y": 0.21875
},
"Position": {
"x": 0.5,
"y": 0.82
}
},
{
"Type": "Lever",
"Channel": 0
}
],
[
{
"Type": "TransformComponent",
"Position": {
"x": 47,
"y": 18
},
"Dimension": {
"x": 48,
"y": 32
},
"Scale": 2,
"Speed": 0
},
{
"Type": "SpriteComponent",
"Path": "ressources/props/lever.png"
},
{
"Type": "AnimationSystem",
"NbFrames": 3,
"CurrentFrame": 0,
"FrameDelay": 10,
"PlayAnimation": false
},
{
"Type": "HitboxComponent",
"Scale": {
"x": 0.33333,
"y": 0.21875
},
"Position": {
"x": 0.5,
"y": 0.82
}
},
{
"Type": "Lever",
"Channel": 1
}
],
[
{
"Type": "TransformComponent",
"Position": {
"x": 23,
"y": 1
},
"Dimension": {
"x": 16,
"y": 32
},
"Scale": 2,
"Speed": 0
},
{
"Type": "SpriteComponent",
"Path": "ressources/props/lock.png"
},
{
"Type": "AnimationSystem",
"NbFrames": 7,
"CurrentFrame": 0,
"FrameDelay": 8,
"PlayAnimation": false
},
{
"Type": "Lock",
"Channel": 2
}
],
[
{
"Type": "TransformComponent",
"Position": {
"x": 45,
"y": 10
},
"Dimension": {
"x": 32,
"y": 48
},
"Scale": 2,
"Speed": 0
},
{
"Type": "SpriteComponent",
"Path": "ressources/props/barred door 2.png"
},
{
"Type": "AnimationSystem",
"NbFrames": 8,
"CurrentFrame": 0,
"FrameDelay": 3,
"PlayAnimation": false
},
{
"Type": "HitboxComponent",
"Scale": {
"x": 1,
"y": 0.6666666666666
},
"Position": {
"x": 0,
"y": 1
}
},
{
"Type": "Door",
"States": [
{
"Channel": 0,
"State": false
},
{
"Channel": 1,
"State": true
}
]
}
],
[
{
"Type": "TransformComponent",
"Position": {
"x": 6,
"y": 9
},
"Dimension": {
"x": 32,
"y": 48
},
"Scale": 2,
"Speed": 0
},
{
"Type": "SpriteComponent",
"Path": "ressources/props/barred door 2.png"
},
{
"Type": "AnimationSystem",
"NbFrames": 8,
"CurrentFrame": 0,
"FrameDelay": 3,
"PlayAnimation": false
},
{
"Type": "HitboxComponent",
"Scale": {
"x": 1,
"y": 0.6666666666666
},
"Position": {
"x": 0,
"y": 1
}
},
{
"Type": "Door",
"States": [
{
"Channel": 0,
"State": true
},
{
"Channel": 1,
"State": true
}
]
}
]
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

BIN
ressources/props/key.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 B

BIN
ressources/props/lever.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1004 B

BIN
ressources/props/lock.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 621 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 670 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 698 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.10" tiledversion="1.11.0" name="tileset" tilewidth="16" tileheight="16" tilecount="1053" columns="9">
<image source="tileset.png" width="144" height="1408"/>
</tileset>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB