diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b5795df
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,32 @@
+CXX = clang++
+EMCC = emcc
+FLAGS = -Wall -std=c++17 $(shell pkg-config --libs --cflags raylib)
+SRC = scripts/main.cpp
+
+# ARM Build
+ARM_TARGET = bin/game
+arm: $(ARM_TARGET)
+$(ARM_TARGET): $(SRC)
+ $(CXX) $(FLAGS) $(SRC) -o $(ARM_TARGET)
+
+# Web Build
+WEB_TARGET = bin/game.js
+EMFLAGS = -s USE_GLFW=3 -s ASYNCIFY -s TOTAL_MEMORY=67108864 \
+ --preload-file assets -DPLATFORM_WEB -gsource-map -s ASSERTIONS=2
+RAYLIB_WEB_PATH = web-includes
+web: $(WEB_TARGET)
+$(WEB_TARGET): $(SRC)
+ $(EMCC) -Wall -std=c++17 -I/opt/homebrew/include -L$(RAYLIB_WEB_PATH) \
+ -lraylib.web $(SRC) -o $(WEB_TARGET) $(EMFLAGS)
+
+# Clean
+clean:
+ rm -f $(ARM_TARGET) $(WEB_TARGET)
+
+# Run ARM Build
+run: clean arm
+ ./$(ARM_TARGET)
+
+# Serve Web Build
+serve: web
+ python3 -m http.server
diff --git a/assets/character.png b/assets/character.png
new file mode 100644
index 0000000..51b27e9
Binary files /dev/null and b/assets/character.png differ
diff --git a/assets/character.png.import b/assets/character.png.import
new file mode 100644
index 0000000..1f391bb
--- /dev/null
+++ b/assets/character.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://n72g6l4saupl"
+path="res://.godot/imported/character.png-7d161e056639ffa8fae932e906cc0673.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/character.png"
+dest_files=["res://.godot/imported/character.png-7d161e056639ffa8fae932e906cc0673.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/map.png b/assets/map.png
new file mode 100644
index 0000000..a7afe24
Binary files /dev/null and b/assets/map.png differ
diff --git a/assets/map.png.import b/assets/map.png.import
new file mode 100644
index 0000000..f85f152
--- /dev/null
+++ b/assets/map.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://clxsj5chse86r"
+path="res://.godot/imported/map.png-dfba05084e3346587240e6093ee94fb2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/map.png"
+dest_files=["res://.godot/imported/map.png-dfba05084e3346587240e6093ee94fb2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/map.tmx b/assets/map.tmx
new file mode 100644
index 0000000..5864694
--- /dev/null
+++ b/assets/map.tmx
@@ -0,0 +1,292 @@
+
+
diff --git a/assets/tileset.png b/assets/tileset.png
new file mode 100644
index 0000000..23d4cc7
Binary files /dev/null and b/assets/tileset.png differ
diff --git a/bin/game b/bin/game
new file mode 100755
index 0000000..2909dae
Binary files /dev/null and b/bin/game differ
diff --git a/scripts/main.cpp b/scripts/main.cpp
new file mode 100644
index 0000000..8f224d4
--- /dev/null
+++ b/scripts/main.cpp
@@ -0,0 +1,165 @@
+#include
+
+typedef struct
+{
+ float x;
+ float y;
+ int count;
+} SpriteSet;
+
+int main()
+{
+ int screenWidth = 1280;
+ int screenHeight = 720;
+ InitWindow(screenWidth, screenHeight, "Father and Son");
+ SetTargetFPS(60);
+
+ // Initialize Tiles
+ Texture2D tileTexture = LoadTexture("assets/tileset.png");
+ Vector2 tileFrameSize = {16.0f, 16.0f};
+
+ Rectangle tileSourceRec = { tileFrameSize.x * 11 + 11, tileFrameSize.y * 10 + 10, tileFrameSize.x, tileFrameSize.y};
+
+
+ // Initialize Background
+ // Texture2D backTexture = LoadTexture("assets/map.png");
+ // Vector2 backFrameSize = {639.0f, 271.0f};
+ // Rectangle backSourceRec = {0.0f, 0.0f, backFrameSize.x, backFrameSize.y};
+ // Rectangle backDestRec = {0.0f, 0.0f, backFrameSize.x, backFrameSize.y};
+ // Vector2 backOrigin = {0.0f, 0.0f};
+
+ // Initialize Character
+ Texture2D characterTexture = LoadTexture("assets/character.png");
+ Vector2 charFrameSize = {32.0f, 32.0f};
+
+ SpriteSet idle = {0.0f, 0.0f, 2};
+ SpriteSet walkingDown = {0.0f, 96.0f, 4};
+ SpriteSet walkingRight = {0.0f, 128.0f, 4};
+ SpriteSet walkingUp = {0.0f, 160.0f, 4};
+ SpriteSet current = idle;
+
+ Rectangle charSourceRec = {idle.x, idle.y, charFrameSize.x, charFrameSize.y};
+ Vector2 charPosition = {0.0f, 0.0f};
+ Vector2 charOrigin = {charFrameSize.x / 2.0f, charFrameSize.y / 2.0f};
+
+ int currentFrame = 0;
+ int framesCounter = 0;
+ int framesSpeed = 4;
+
+ // Initialize Camera
+ Camera2D camera = { 0 };
+ camera.target = charPosition;
+ camera.offset = (Vector2){screenWidth / 2.0f, screenHeight / 2.0f};
+ camera.rotation = 0.0f;
+ camera.zoom = 10.0f;
+
+ while (!WindowShouldClose())
+ {
+ // Update Character
+ if (IsKeyDown(KEY_RIGHT))
+ {
+ current = walkingRight;
+ charSourceRec.width = charFrameSize.x;
+ charPosition.x += 0.5f;
+ }
+ else if (IsKeyDown(KEY_LEFT))
+ {
+ current = walkingRight;
+ charSourceRec.width = -charFrameSize.x;
+ charPosition.x -= 0.5f;
+ }
+ else if (IsKeyDown(KEY_DOWN))
+ {
+ current = walkingDown;
+ charSourceRec.width = charFrameSize.x;
+ charPosition.y += 0.5f;
+ }
+ else if (IsKeyDown(KEY_UP))
+ {
+ current = walkingUp;
+ charSourceRec.width = charFrameSize.x;
+ charPosition.y -= 0.5f;
+ }
+ else
+ {
+ current = idle;
+ charSourceRec.width = charFrameSize.x;
+ }
+
+ framesCounter++;
+
+ if (framesCounter >= (60 / framesSpeed))
+ {
+ framesCounter = 0;
+ currentFrame++;
+ if (currentFrame >= current.count)
+ currentFrame = 0;
+
+ charSourceRec.x = current.x + currentFrame * charFrameSize.x;
+ charSourceRec.y = current.y;
+ }
+
+ // Update Camera
+ camera.target = charPosition;
+
+ // Render
+ BeginDrawing();
+ ClearBackground(RAYWHITE);
+
+ BeginMode2D(camera); // Activate 2D camera
+
+ // Render Tiles
+ float left = camera.target.x - (screenWidth / 2.0f / camera.zoom);
+ float right = camera.target.x + (screenWidth / 2.0f / camera.zoom);
+ float top = camera.target.y - (screenHeight / 2.0f / camera.zoom);
+ float bottom = camera.target.y + (screenHeight / 2.0f / camera.zoom);
+
+ int startX = (int)(left / tileFrameSize.x) - 1;
+ int endX = (int)(right / tileFrameSize.x) + 1;
+ int startY = (int)(top / tileFrameSize.y) - 1;
+ int endY = (int)(bottom / tileFrameSize.y) + 1;
+
+ for (int y = startY; y <= endY; y++)
+ {
+ for (int x = startX; x <= endX; x++)
+ {
+ Vector2 tilePosition = {x * tileFrameSize.x, y * tileFrameSize.y};
+ Rectangle tileDestRec = {tilePosition.x, tilePosition.y, tileFrameSize.x, tileFrameSize.y};
+ DrawTexturePro(tileTexture, tileSourceRec, tileDestRec, (Vector2){0.0f, 0.0f}, 0.0f, WHITE);
+ }
+ }
+
+ // Render Background
+ // DrawTexturePro(backTexture, backSourceRec, backDestRec, backOrigin, 0.0f, WHITE);
+
+ // Render Character
+ Rectangle charDestRec = {charPosition.x, charPosition.y, charFrameSize.x, charFrameSize.y};
+ DrawTexturePro(characterTexture, charSourceRec, charDestRec, charOrigin, 0.0f, WHITE);
+
+ EndMode2D();
+
+ // Render Debug
+
+ EndDrawing();
+ }
+
+ // Unload Character
+ UnloadTexture(characterTexture);
+ UnloadTexture(tileTexture);
+ // UnloadTexture(backTexture);
+
+ CloseWindow();
+
+ return 0;
+}
+
+
+/*
+DrawRectangleLines(charDestRec.x, charDestRec.y, charFrameSize.x, charFrameSize.y, GREEN);
+DrawRectangleLines(charPosition.x, charPosition.y, charFrameSize.x, charFrameSize.y, GREEN);
+DrawRectangleLines(camera.offset.x, camera.offset.y, charFrameSize.x, charFrameSize.y, RED);
+DrawRectangleLines(camera.target.x, camera.target.y, charFrameSize.x, charFrameSize.y, RED);
+DrawText(TextFormat("charDestRec: %f, %f", charDestRec.x, charDestRec.y),10,10,20,GREEN);
+DrawText(TextFormat("charSourceRec: %f, %f", charSourceRec.x, charSourceRec.y),10,30,20,GREEN);
+DrawFPS(screenWidth - 30, 10);
+*/
\ No newline at end of file