Compare commits

..

5 Commits

Author SHA1 Message Date
Ulysse Cura c7afabd4c4 Moved initialisation of values of components outside their init function. 2026-08-13 19:06:29 +02:00
Ulysse Cura 62a77dae6a Updated tiled extension for entities. 2026-08-13 19:05:38 +02:00
Ulysse Cura d40f1943e5 Optimized asset building for speed by adding a buffer in png conversion from rgba8888 to rgb565 2026-08-13 19:05:04 +02:00
Ulysse Cura 02b87270bb Updated ccls and make options. 2026-08-13 19:04:16 +02:00
Ulysse Cura b74b0e357b Added trace for errors. 2026-08-13 19:02:25 +02:00
28 changed files with 965 additions and 293 deletions

9
.ccls
View File

@ -1,10 +1 @@
gcc gcc
# Headers
-Isrc/components/headers
-ISDL3_Core/src/headers
#-INCurses_Core/src/headers
-Iassets/asset_builder/src/headers
# Macros
-DASSET_FILE_NAME="$(make print-ASSET_OUTPUT)"
-DDEBUG=2

2
.gitignore vendored
View File

@ -1,2 +1,2 @@
.ccls-cache .vscode/ccls-cache
build build

@ -1 +1 @@
Subproject commit ea7f7453133cb3ce231db074986820cbba86c0a6 Subproject commit c71af2e8036c0e8dbed88f986df448b065d93f9b

View File

@ -1,5 +1,4 @@
ASSETS := \ ASSETS := \
misc/dummy_sheet.png \
player_sheets/player_idle_sheet.png \ player_sheets/player_idle_sheet.png \
player_sheets/player_walk_sheet.png \ player_sheets/player_walk_sheet.png \
player_sheets/player_run_sheet.png \ player_sheets/player_run_sheet.png \

View File

@ -0,0 +1,6 @@
gcc
# Headers
-Iassets/asset_builder/src/headers
# Macros
-DDEBUG=2

View File

@ -206,25 +206,27 @@ int parse_png_for_content_and_write(const char *input_file_name, FILE *output_fi
} }
// Prepare storage. // Prepare storage.
png_byte pixels[height * row_length]; png_byte src_pixels[height * row_length];
png_bytep row_ptrs[height]; png_bytep src_row_ptrs[height];
for(png_uint_32 i = 0; i < height; i++) for(png_uint_32 i = 0; i < height; i++)
row_ptrs[i] = &pixels[i * row_length]; src_row_ptrs[i] = &src_pixels[i * row_length];
// Read pixels. // Read pixels.
png_read_image(png_ptr, row_ptrs); png_read_image(png_ptr, src_row_ptrs);
uint16_t dst_pixels[width * height * sizeof(uint16_t)];
for(size_t i = 0; i < height; i++) for(size_t i = 0; i < height; i++)
{ {
for(size_t j = 0; j < row_length; j += 4) for(size_t j = 0; j < width; j += 1)
{ {
uint8_t r, g, b; uint8_t r, g, b;
if(pixels[i * row_length + j + 3]) if(src_pixels[i * row_length + j * 4 + 3])
{ {
r = pixels[i * row_length + j] >> 3; r = src_pixels[i * row_length + j * 4] >> 3;
g = pixels[i * row_length + j + 1] >> 2; g = src_pixels[i * row_length + j * 4 + 1] >> 2;
b = pixels[i * row_length + j + 2] >> 3; b = src_pixels[i * row_length + j * 4 + 2] >> 3;
} }
else else
{ {
@ -235,17 +237,19 @@ int parse_png_for_content_and_write(const char *input_file_name, FILE *output_fi
uint16_t pixel = ((r) << 11) | ((g) << 5) | b; uint16_t pixel = ((r) << 11) | ((g) << 5) | b;
// printf("\033[48;2;%d;%d;%dm ", r << 3, g << 2, b << 3); dst_pixels[i * width + j] = pixel;
if(fwrite(&pixel, sizeof(uint16_t), 1, output_file) != 1) // printf("\033[48;2;%d;%d;%dm ", r << 3, g << 2, b << 3);
}
// puts("\033[m");
}
if(fwrite(&dst_pixels, width * height * sizeof(uint16_t), 1, output_file) != 1)
{ {
png_destroy_read_struct(&png_ptr, &info_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(input_file); fclose(input_file);
return WRITE_FAILED; return WRITE_FAILED;
} }
}
// puts("\033[m");
}
png_destroy_read_struct(&png_ptr, &info_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(input_file); fclose(input_file);

View File

@ -106,7 +106,7 @@
0, 0, 0, 0, 0, 0, 0, 1821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2323, 2324, 2325, 2326, 2327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2323, 2324, 2325, 2326, 2327, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1867, 0, 0, 1870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2372, 2373, 2374, 2375, 2376, 0, 0, 0, 0, 0 0, 0, 0, 0, 1867, 0, 0, 1870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2372, 2373, 2374, 2375, 2376, 0, 0, 0, 0, 0
], ],
"HitBoxes": [ "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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@ -131,5 +131,5 @@
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
] ],
} }

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.12.1" orientation="orthogonal" renderorder="left-up" width="32" height="24" tilewidth="16" tileheight="16" infinite="0" nextlayerid="13" nextobjectid="12"> <map version="1.10" tiledversion="1.12.1" orientation="orthogonal" renderorder="left-up" width="32" height="24" tilewidth="16" tileheight="16" infinite="0" nextlayerid="14" nextobjectid="17">
<editorsettings> <editorsettings>
<export target="dungeon_entry.json" format="custom"/> <export target="dungeon_entry.json" format="custom"/>
</editorsettings> </editorsettings>
@ -25,18 +25,10 @@
eJy9lr1Lw0AYh69JzIeTirZCQXDTxUlBdFKsVRDERfwbXEXQRakfrXbVQXAX7KDS+lHQSdDJQSdRBy212gpOnRQEfyEJvbZJTHK1w0NCkrvnzXt3752PEOKrAbcCIXcCez/9HCE7Dd7ach7bVTLLle5vatSnG3Yp/0+FP8jXN5YeUbtuwhsHAZMx3qpjjiIyIStgFayBdRAFMVl7L+vxNor/40/CkwLH4AScgjOQlkvfDMA9qPszHLvzEn0FFELaQRaeV5ADb+Ad5EFBNs9NUs9PVHbmovtQ2xfxsAj/GNzjirfcGPHFxepxM+ujk9P6MMutHXa5Ud+fw38hlsdmtN3mq/sw2k97GMMliZBlSc+pVP6Ojs14dgX/tcXajrn0H8B3CI4kd+2sSLv0P8P7AjK6P+swji7Ulm4QofKQh7vg0t+EvDaDFjDlcO7MVNS1FK/NU7q2OGUI3w+7aLNhsW/m+Or5z2MNCn+sQ5U5lzGb4RfK149KL9x9YNEiBrp+OPV8WPx/2OY8kaD8X7j/1mOia9AI8hdysF8GLfavBRP/AxyP4Mnk/xMV9Xne4V49YeHfd3GeMotpj+GsYNRKlvlzz3hW+WT0y4zn0Q6G+tmKsWgDfqW0dzuaC5RzksEfgm8UhBX7vfsXuP91rA== eJy9lr1Lw0AYh69JzIeTirZCQXDTxUlBdFKsVRDERfwbXEXQRakfrXbVQXAX7KDS+lHQSdDJQSdRBy212gpOnRQEfyEJvbZJTHK1w0NCkrvnzXt3752PEOKrAbcCIXcCez/9HCE7Dd7ach7bVTLLle5vatSnG3Yp/0+FP8jXN5YeUbtuwhsHAZMx3qpjjiIyIStgFayBdRAFMVl7L+vxNor/40/CkwLH4AScgjOQlkvfDMA9qPszHLvzEn0FFELaQRaeV5ADb+Ad5EFBNs9NUs9PVHbmovtQ2xfxsAj/GNzjirfcGPHFxepxM+ujk9P6MMutHXa5Ud+fw38hlsdmtN3mq/sw2k97GMMliZBlSc+pVP6Ojs14dgX/tcXajrn0H8B3CI4kd+2sSLv0P8P7AjK6P+swji7Ulm4QofKQh7vg0t+EvDaDFjDlcO7MVNS1FK/NU7q2OGUI3w+7aLNhsW/m+Or5z2MNCn+sQ5U5lzGb4RfK149KL9x9YNEiBrp+OPV8WPx/2OY8kaD8X7j/1mOia9AI8hdysF8GLfavBRP/AxyP4Mnk/xMV9Xne4V49YeHfd3GeMotpj+GsYNRKlvlzz3hW+WT0y4zn0Q6G+tmKsWgDfqW0dzuaC5RzksEfgm8UhBX7vfsXuP91rA==
</data> </data>
</layer> </layer>
<layer id="12" name="HitBoxes" width="32" height="24" visible="0"> <layer id="12" name="Hitboxes" width="32" height="24">
<properties>
<property name="2" type="list">
<item value="room_1"/>
<item type="list">
<item type="int" value="15"/>
<item type="int" value="22"/>
</item>
</property>
</properties>
<data encoding="base64" compression="zlib"> <data encoding="base64" compression="zlib">
eJwL52JgCB/Fo3gUj+IhhiOhmB52RWDBxMhRy25S5anpBnL9Rg03kGsGLfw/EHaTmg5oZTeutECrND+KR/Eopj0GAGrPIzU= eJwL52JgCB/Fo3gUj+IhhiOhmB52RWDBxMhRy25S5anpBnL9Rg03kGsGLfw/EHaTmg5oZTeutECrND+KR/Eopj0GAGrPIzU=
</data> </data>
</layer> </layer>
<objectgroup id="13" name="Entities"/>
</map> </map>

View File

@ -1,3 +0,0 @@
{
"Entities": []
}

View File

@ -0,0 +1,203 @@
{
"MapWidth": 14,
"MapHeight": 16,
"BackgroundLayer1": [
13, 157, 157, 157, 157, 157, 245, 247, 157, 157, 157, 157, 157, 14,
108, 1, 2, 2, 2, 2, 245, 247, 2, 2, 2, 2, 3, 156,
108, 50, 51, 51, 51, 51, 245, 247, 51, 51, 51, 51, 52, 156,
108, 196, 197, 197, 197, 197, 151, 150, 197, 197, 197, 197, 198, 156,
108, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 156,
108, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 156,
108, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 156,
108, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 156,
108, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 156,
108, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 156,
108, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 156,
108, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 156,
108, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 156,
108, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 156,
108, 294, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 296, 156,
62, 107, 107, 107, 107, 107, 69, 70, 107, 107, 107, 107, 107, 63
],
"BackgroundLayer2": [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 120, 121, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
],
"BackgroundLayer3": [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
],
"Foreground": [
0, 0, 0, 0, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 71, 72, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
],
"Hitboxes": [
0, 0, 0, 0, 0, 1, 3, 3, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
1, 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,
1, 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,
1, 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,
1, 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,
1, 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,
1, 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,
1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1
],
"Entities": [
{
"ID":1,
"Components": [
{
"Type": "TRANSFORM_COMPONENT",
"Attributes": [
96,
0,
32,
48
]
},
{
"Type": "SPRITE_COMPONENT",
"Attributes": [
"barred_door_sheet"
]
},
{
"Type": "ANIMATION_SYSTEM",
"Attributes": [
8,
0,
30,
false,
false,
false
]
},
{
"Type": "HITBOX_COMPONENT",
"Attributes": [
0,
0.8333333333333334,
1,
0.16666666666666666
]
},
{
"Type": "DOOR_COMPONENT",
"Attributes": [
"0",
false
]
}
]
},
{
"ID":2,
"Components": [
{
"Type": "TRANSFORM_COMPONENT",
"Attributes": [
88,
112,
48,
32
]
},
{
"Type": "SPRITE_COMPONENT",
"Attributes": [
"lever_sheet"
]
},
{
"Type": "ANIMATION_SYSTEM",
"Attributes": [
3,
0,
100,
false,
false,
false
]
},
{
"Type": "HITBOX_COMPONENT",
"Attributes": [
0.3333333333333333,
0.59375,
0.3333333333333333,
0.34375
]
},
{
"Type": "INTERACT_COMPONENT",
"Attributes": [
0.16666666666666666,
0.34375,
0.6666666666666666,
0.84375,
0,
0,
0
]
},
{
"Type": "LEVER_COMPONENT",
"Attributes": [
0,
false
]
}
]
}
]
}

View File

@ -0,0 +1,182 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.12.1" orientation="orthogonal" renderorder="right-down" width="14" height="16" tilewidth="16" tileheight="16" infinite="0" nextlayerid="9" nextobjectid="13">
<editorsettings>
<export target="dungeon_room_1.json" format="custom"/>
</editorsettings>
<tileset firstgid="1" source="../tileset/tileset.tsx"/>
<tileset firstgid="2647" source="hiitboxes.tsx"/>
<layer id="1" name="BackgroundLayer1" width="14" height="16">
<data encoding="csv">
14,158,158,158,158,158,246,248,158,158,158,158,158,15,
109,2,3,3,3,3,246,248,3,3,3,3,4,157,
109,51,52,52,52,52,246,248,52,52,52,52,53,157,
109,197,198,198,198,198,152,151,198,198,198,198,199,157,
109,246,247,247,247,247,247,247,247,247,247,247,248,157,
109,246,247,247,247,247,247,247,247,247,247,247,248,157,
109,246,247,247,247,247,247,247,247,247,247,247,248,157,
109,246,247,247,247,247,247,247,247,247,247,247,248,157,
109,246,247,247,247,247,247,247,247,247,247,247,248,157,
109,246,247,247,247,247,247,247,247,247,247,247,248,157,
109,246,247,247,247,247,247,247,247,247,247,247,248,157,
109,246,247,247,247,247,247,247,247,247,247,247,248,157,
109,246,247,247,247,247,247,247,247,247,247,247,248,157,
109,246,247,247,247,247,247,247,247,247,247,247,248,157,
109,295,296,296,296,296,296,296,296,296,296,296,297,157,
63,108,108,108,108,108,70,71,108,108,108,108,108,64
</data>
</layer>
<layer id="2" name="BackgroundLayer2" width="14" height="16">
<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,121,122,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,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="BackgroundLayer3" width="14" height="16">
<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,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,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="4" name="Foreground" width="14" height="16">
<data encoding="csv">
1,1,1,1,1,1,23,24,1,1,1,1,1,1,
1,1,1,1,1,1,72,73,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,21,22,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1
</data>
</layer>
<layer id="7" name="Hitboxes" width="14" height="16">
<data encoding="csv">
2647,2647,2647,2647,2647,2648,2650,2650,2648,2647,2647,2647,2647,2647,
2647,2647,2647,2647,2647,2648,2647,2647,2648,2647,2647,2647,2647,2647,
2648,2648,2648,2648,2648,2648,2647,2647,2648,2648,2648,2648,2648,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2647,2648,
2648,2648,2648,2648,2648,2648,2649,2649,2648,2648,2648,2648,2648,2648
</data>
</layer>
<objectgroup id="8" name="Entities">
<object id="4" name="1" x="96" y="0" width="32" height="48">
<properties>
<property name="components" type="list">
<item type="list">
<item value="TRANSFORM_COMPONENT"/>
</item>
<item type="list">
<item value="SPRITE_COMPONENT"/>
<item value="barred_door_sheet"/>
</item>
<item type="list">
<item value="ANIMATION_SYSTEM"/>
<item type="int" value="8"/>
<item type="int" value="0"/>
<item type="float" value="30"/>
<item type="bool" value="false"/>
<item type="bool" value="false"/>
<item type="bool" value="false"/>
</item>
<item type="list">
<item value="HITBOX_COMPONENT"/>
<item type="object" value="5"/>
</item>
<item type="list">
<item value="DOOR_COMPONENT"/>
<item value="0"/>
<item type="bool" value="false"/>
</item>
</property>
</properties>
</object>
<object id="5" x="96" y="40" width="32" height="8"/>
<object id="8" name="2" x="88" y="112" width="48" height="32">
<properties>
<property name="components" type="list">
<item type="list">
<item value="TRANSFORM_COMPONENT"/>
</item>
<item type="list">
<item value="SPRITE_COMPONENT"/>
<item value="lever_sheet"/>
</item>
<item type="list">
<item value="ANIMATION_SYSTEM"/>
<item type="int" value="3"/>
<item type="int" value="0"/>
<item type="float" value="100"/>
<item type="bool" value="false"/>
<item type="bool" value="false"/>
<item type="bool" value="false"/>
</item>
<item type="list">
<item value="HITBOX_COMPONENT"/>
<item type="object" value="9"/>
</item>
<item type="list">
<item value="INTERACT_COMPONENT"/>
<item type="object" value="10"/>
<item type="int" value="0"/>
<item type="int" value="0"/>
<item type="int" value="0"/>
</item>
<item type="list">
<item value="LEVER_COMPONENT"/>
<item type="int" value="0"/>
<item type="bool" value="false"/>
</item>
</property>
</properties>
</object>
<object id="9" x="104" y="131" width="16" height="11"/>
<object id="10" x="96" y="123" width="32" height="27"/>
</objectgroup>
</map>

View File

@ -1,32 +1,15 @@
var customMapFormat = { function writeTileLayer(tileLayer, file)
name: "Custom map format", {
extension: "custom", file.writeLine(" \"" + tileLayer.name + "\": [");
write: function(map, fileName) for(let cell_y = 0; cell_y < tileLayer.height; ++cell_y)
{
var file = new TextFile(fileName, TextFile.WriteOnly);
file.writeLine("{");
file.writeLine(" \"MapWidth\": " + map.width + ",");
file.writeLine(" \"MapHeight\": " + map.height + ",");
file.writeLine("");
for(var i = 0; i < map.layerCount; i++)
{
var layer = map.layerAt(i);
if(layer.isTileLayer)
{
file.writeLine(" \"" + layer.name + "\": [");
for(var cell_y = 0; cell_y < layer.height; ++cell_y)
{ {
file.write(" "); file.write(" ");
for (var cell_x = 0; cell_x < layer.width; ++cell_x) for(let cell_x = 0; cell_x < tileLayer.width; ++cell_x)
{ {
file.write(" " + layer.cellAt(cell_x, cell_y).tileId) file.write(" " + tileLayer.cellAt(cell_x, cell_y).tileId)
if(cell_x < layer.width - 1 || cell_y < layer.height - 1) if(cell_x < tileLayer.width - 1 || cell_y < tileLayer.height - 1)
file.write(","); file.write(",");
} }
@ -34,6 +17,183 @@ var customMapFormat = {
} }
file.writeLine(" ],"); file.writeLine(" ],");
}
function writeEntities(objectLayer, file)
{
file.writeLine(" \"Entities\": [");
let entities = [];
for(let i = 0; i < objectLayer.objectCount; i++)
{
let entity = objectLayer.objectAt(i);
if(entity.name)
{
entities.push(entity);
}
}
for(let i = 0; i < entities.length; i++)
{
let entity = entities[i];
file.writeLine(" {");
file.writeLine(" \"ID\":" + entity.name + ",");
file.writeLine(" \"Components\": [");
let components = entity.properties()["components"];
let nb_components = Object.keys(components).length;
for(let j = 0; j < nb_components; j++)
{
let component = components[j];
let component_type = component[0];
file.writeLine(" {");
file.write(" \"Type\": \"" + component_type + "\"");
if(component.length > 1)
{
file.writeLine(",");
file.writeLine(" \"Attributes\": [");
}
// Write atributes, speciale cases need speciale treatment.
if(component_type == "TRANSFORM_COMPONENT")
{
file.writeLine(",");
file.writeLine(" \"Attributes\": [");
file.writeLine(" " + entity.x + ",");
file.writeLine(" " + entity.y + ",");
file.writeLine(" " + entity.width + ",");
file.writeLine(" " + entity.height);
file.writeLine(" ]");
}
else if(component_type == "HITBOX_COMPONENT")
{
let hitbox;
for(let k = 0; k < objectLayer.objectCount; k++)
{
hitbox = objectLayer.objectAt(k);
if(hitbox.id === component[1].id)
break;
}
let x = (hitbox.x - entity.x) / entity.width;
let y = (hitbox.y - entity.y) / entity.height;
let width = hitbox.width / entity.width;
let height = hitbox.height / entity.height;
file.writeLine(" " + x + ",");
file.writeLine(" " + y + ",");
file.writeLine(" " + width + ",");
file.writeLine(" " + height);
}
else if(component_type == "INTERACT_COMPONENT")
{
let interact_box;
for(let k = 0; k < objectLayer.objectCount; k++)
{
interact_box = objectLayer.objectAt(k);
if(interact_box.id === component[1].id)
break;
}
let x = (interact_box.x - entity.x) / entity.width;
let y = (interact_box.y - entity.y) / entity.height;
let width = interact_box.width / entity.width;
let height = interact_box.height / entity.height;
file.writeLine(" " + x + ",");
file.writeLine(" " + y + ",");
file.writeLine(" " + width + ",");
file.writeLine(" " + height + ",");
file.writeLine(" " + component[2] + ",");
file.writeLine(" " + component[3] + ",");
file.writeLine(" " + component[4]);
}
else
{
if(component.length > 1)
{
for(let k = 1; k < component.length; k++)
{
file.write(" ");
switch(typeof(component[k]))
{
case typeof(Number()):
case typeof(Boolean()):
file.write(component[k]);
break;
case typeof(String()):
file.write("\"" + component[k] + "\"");
break;
default:
throw new Error("Attribute \"" + component[k] + "\", type not supported : " + typeof(component[k]));
}
if(k == component.length - 1)
file.writeLine("");
else
file.writeLine(",");
}
}
else
file.writeLine("");
}
if(component.length > 1)
file.writeLine(" ]");
if(j == nb_components - 1)
file.writeLine(" }");
else
file.writeLine(" },");
}
file.writeLine(" ]");
if(i == entities.length - 1)
file.writeLine(" }");
else
file.writeLine(" },");
}
file.writeLine(" ]");
}
var customMapFormat = {
name: "Custom JSON map format",
extension: "json",
write: function(map, fileName)
{
let file = new TextFile(fileName, TextFile.WriteOnly);
file.writeLine("{");
file.writeLine(" \"MapWidth\": " + map.width + ",");
file.writeLine(" \"MapHeight\": " + map.height + ",");
file.writeLine("");
for(let i = 0; i < map.layerCount; i++)
{
let layer = map.layerAt(i);
if(layer.isTileLayer)
{
writeTileLayer(layer, file);
}
else if(layer.isObjectLayer)
{
writeEntities(layer, file);
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 B

7
src/.ccls Normal file
View File

@ -0,0 +1,7 @@
gcc
# Headers
-Isrc/components/headers
-ISDL3_Core/src/headers
# Macros
-DDEBUG=2

View File

@ -15,8 +15,10 @@ SOURCES := \
SRC_CC = gcc SRC_CC = gcc
ifeq ($(RELEASE), 1) ifeq ($(RELEASE), 1)
SRC_CFLAGS = --std=c17 --pedantic -O3 # RELEASE SRC_CFLAGS = --std=c17 --pedantic -O3 # RELEASE
SRC_LDFLAGS = -O3
else else
SRC_CFLAGS = --std=c17 --pedantic -O0 -g -DDEBUG=2 \ SRC_CFLAGS = --std=c17 --pedantic -O1 -g -DDEBUG=2 \
-Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \ -Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \
-Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \ -Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \
-Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5 \ -Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5 \
@ -24,13 +26,13 @@ SRC_CFLAGS = --std=c17 --pedantic -O0 -g -DDEBUG=2 \
-Wcast-qual -Wshadow -Wunreachable-code -Wlogical-op \ -Wcast-qual -Wshadow -Wunreachable-code -Wlogical-op \
-Wfloat-equal -Wstrict-aliasing=2 -Wredundant-decls \ -Wfloat-equal -Wstrict-aliasing=2 -Wredundant-decls \
-Wold-style-definition # DEVELOPEMENT -Wold-style-definition # DEVELOPEMENT
SRC_LDFLAGS = -O1
endif endif
SRC_INCLUDE_DIRS = $(SOURCE_DIR)/components/headers $(CORE_DIR)/headers SRC_INCLUDE_DIRS = $(SOURCE_DIR)/components/headers $(CORE_DIR)/headers
SRC_INCLUDE_DIRS := $(addprefix -I, $(SRC_INCLUDE_DIRS)) SRC_INCLUDE_DIRS := $(addprefix -I, $(SRC_INCLUDE_DIRS))
SRC_LDFLAGS =
# Deduce objects # Deduce objects
SOURCE_OBJECTS = $(SOURCES:%.c=$(BUILD_DIR)/$(SOURCE_DIR)/%.o) SOURCE_OBJECTS = $(SOURCES:%.c=$(BUILD_DIR)/$(SOURCE_DIR)/%.o)

View File

@ -16,18 +16,10 @@ int animation_system_init(component_t *component)
} }
system_data->sprite_component_data = sprite_component->data; system_data->sprite_component_data = sprite_component->data;
system_data->nb_frames = 1;
system_data->current_frame_nb = 0;
linked_list_init(&system_data->frames, sizeof(rect_t), NULL, NULL); linked_list_init(&system_data->frames, sizeof(rect_t), NULL, NULL);
animation_system_create_frames_clips(system_data);
system_data->frame_delay_ms = 0.0f;
system_data->frame_timer_ms = 0.0f; system_data->frame_timer_ms = 0.0f;
system_data->play = false;
system_data->loop = false;
system_data->reverse = false;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@ -89,45 +81,34 @@ inline int animation_system_destroy(component_t *component)
{ {
animation_system_data_t *system_data = component->data; animation_system_data_t *system_data = component->data;
if(linked_list_exit(&system_data->frames)) return EXIT_FAILURE; if(linked_list_exit(&system_data->frames)) return_failure_int;
free(system_data); free(system_data);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
int animation_system_create_frames_clips(animation_system_data_t *system_data)
{
sprite_component_data_t *sprite_component_data = system_data->sprite_component_data;
if(linked_list_clear(&system_data->frames)) return EXIT_FAILURE;
if(linked_list_reserve(&system_data->frames, system_data->nb_frames)) return EXIT_FAILURE;
for(size_t current_frame_nb = 0; current_frame_nb < system_data->nb_frames; current_frame_nb++)
{
elem_t *frame = create_elem(&system_data->frames);
if(!frame) return EXIT_FAILURE;
((rect_t *)frame->data)->x = sprite_component_data->src_rect.w * current_frame_nb;
((rect_t *)frame->data)->y = 0;
((rect_t *)frame->data)->w = sprite_component_data->src_rect.w;
((rect_t *)frame->data)->h = sprite_component_data->src_rect.h;
if(linked_list_push_back(&system_data->frames, frame)) return EXIT_FAILURE;
}
system_data->current_frame = linked_list_get(&system_data->frames, system_data->current_frame_nb);
if(!system_data->current_frame) return EXIT_FAILURE;
return EXIT_SUCCESS;
}
inline int animation_system_apply_changes(animation_system_data_t *system_data) inline int animation_system_apply_changes(animation_system_data_t *system_data)
{ {
sprite_component_data_t *sprite_component_data = system_data->sprite_component_data; sprite_component_data_t *sprite_component_data = system_data->sprite_component_data;
if(animation_system_create_frames_clips(system_data)) return EXIT_FAILURE; if(linked_list_clear(&system_data->frames)) return_failure_int;
for(size_t current_frame_nb = 0; current_frame_nb < system_data->nb_frames; current_frame_nb++)
{
elem_t *frame = create_elem(&system_data->frames);
if(!frame) return_failure_int;
((rect_t *)frame->data)->x = sprite_component_data->src_rect.w * current_frame_nb;
((rect_t *)frame->data)->y = 0;
((rect_t *)frame->data)->w = sprite_component_data->src_rect.w;
((rect_t *)frame->data)->h = sprite_component_data->src_rect.h;
linked_list_push_back(&system_data->frames, frame);
}
system_data->current_frame = linked_list_get(&system_data->frames, system_data->current_frame_nb);
if(!system_data->current_frame) return_failure_int;
sprite_component_data->src_rect = *(rect_t *)system_data->current_frame->data; sprite_component_data->src_rect = *(rect_t *)system_data->current_frame->data;

View File

@ -14,7 +14,11 @@ static inline int door_component_callback(va_list event_args, void *subscription
const entity_t *entity = subscription_data; const entity_t *entity = subscription_data;
component_t *door_component = entity_get_component(entity, DOOR_COMPONENT); component_t *door_component = entity_get_component(entity, DOOR_COMPONENT);
if(!door_component) return EXIT_FAILURE; if(!door_component)
{
error_printf("Failed to get door component.");
return EXIT_FAILURE;
}
door_component_data_t *component_data = door_component->data; door_component_data_t *component_data = door_component->data;
@ -43,10 +47,6 @@ inline int door_component_init(component_t *component)
} }
component_data->hitbox_component_data = hitbox_component->data; component_data->hitbox_component_data = hitbox_component->data;
component_data->topic_id = 0;
event_bus_subscribe(&game.event_bus, component_data->topic_id, door_component_callback, component->entity);
component_data->state = false;
component_data->last_state = false; component_data->last_state = false;
return EXIT_SUCCESS; return EXIT_SUCCESS;
@ -79,3 +79,10 @@ inline int door_component_destroy(component_t *component)
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
inline int door_component_subscribe(door_component_data_t *component_data, entity_t *entity)
{
if(event_bus_subscribe(&game.event_bus, component_data->topic_id, door_component_callback, entity)) return_failure_int;
return EXIT_SUCCESS;
}

View File

@ -28,8 +28,6 @@ int animation_system_update(component_t *component);
int animation_system_destroy(component_t *component); int animation_system_destroy(component_t *component);
int animation_system_create_frames_clips(animation_system_data_t *system_data);
int animation_system_apply_changes(animation_system_data_t *system_data); int animation_system_apply_changes(animation_system_data_t *system_data);
#endif // SPRITE_COMPONENT_H #endif // SPRITE_COMPONENT_H

View File

@ -24,4 +24,6 @@ int door_component_update(component_t *component);
int door_component_destroy(component_t *component); int door_component_destroy(component_t *component);
int door_component_subscribe(door_component_data_t *component_data, entity_t *entity);
#endif // DOOR_COMPONENT_H #endif // DOOR_COMPONENT_H

View File

@ -36,6 +36,6 @@ int interact_component_destroy(component_t *component);
int interact_component_interact(interact_component_data_t *component_data); int interact_component_interact(interact_component_data_t *component_data);
int interact_component_modify_topic(interact_component_data_t *component_data, size_t id); int interact_component_modify_topic_id(interact_component_data_t *component_data, size_t id);
#endif // TRANSFORM_COMPONENT_H #endif // TRANSFORM_COMPONENT_H

View File

@ -22,4 +22,6 @@ int lever_component_update(component_t *component);
int lever_component_destroy(component_t *component); int lever_component_destroy(component_t *component);
int lever_component_subscribe(lever_component_data_t *component_data, entity_t *entity);
#endif // LEVER_COMPONENT_H #endif // LEVER_COMPONENT_H

View File

@ -37,8 +37,8 @@ inline int hitbox_component_update(component_t *component)
hitbox_component_data_t *component_data = component->data; hitbox_component_data_t *component_data = component->data;
const transform_component_data_t *transform_component_data = component_data->transform_component_data; const transform_component_data_t *transform_component_data = component_data->transform_component_data;
component_data->bounds.x = transform_component_data->bounds.x + (transform_component_data->bounds.w - component_data->bounds.w) * component_data->position.x; component_data->bounds.x = transform_component_data->bounds.x + transform_component_data->bounds.w * component_data->position.x;
component_data->bounds.y = transform_component_data->bounds.y + (transform_component_data->bounds.h - component_data->bounds.h) * component_data->position.y; component_data->bounds.y = transform_component_data->bounds.y + transform_component_data->bounds.h * component_data->position.y;
component_data->bounds.w = transform_component_data->bounds.w * component_data->scale.x; component_data->bounds.w = transform_component_data->bounds.w * component_data->scale.x;
component_data->bounds.h = transform_component_data->bounds.h * component_data->scale.y; component_data->bounds.h = transform_component_data->bounds.h * component_data->scale.y;
@ -53,7 +53,7 @@ inline int hitbox_component_draw(const component_t *component)
const hitbox_component_data_t *component_data = component->data; const hitbox_component_data_t *component_data = component->data;
if(component_data->activated) if(component_data->activated)
if(display_draw_frect(&component_data->bounds, C_RED, 128)) return EXIT_FAILURE; if(display_draw_frect(&component_data->bounds, C_RED, 128)) return_failure_int;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -27,24 +27,21 @@ inline int interact_component_init(component_t *component)
}; };
component_data->topic_id = 0; component_data->topic_id = 0;
component_data->type = INTERACT_TOGGLE;
component_data->state = 0; if(event_bus_new_topic(&game.event_bus, component_data->topic_id)) return_failure_int;
if(event_bus_new_topic(&game.event_bus, component_data->topic_id)) return EXIT_FAILURE;
component_data->activated = true; component_data->activated = true;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
inline int interact_component_update(component_t *component __attribute__((unused))) inline int interact_component_update(component_t *component)
{ {
interact_component_data_t *component_data = component->data; interact_component_data_t *component_data = component->data;
const transform_component_data_t *transform_component_data = component_data->transform_component_data; const transform_component_data_t *transform_component_data = component_data->transform_component_data;
component_data->bounds.x = transform_component_data->bounds.x + (transform_component_data->bounds.w - component_data->bounds.w) * component_data->position.x; component_data->bounds.x = transform_component_data->bounds.x + transform_component_data->bounds.w * component_data->position.x;
component_data->bounds.y = transform_component_data->bounds.y + (transform_component_data->bounds.h - component_data->bounds.h) * component_data->position.y; component_data->bounds.y = transform_component_data->bounds.y + transform_component_data->bounds.h * component_data->position.y;
component_data->bounds.w = transform_component_data->bounds.w * component_data->scale.x; component_data->bounds.w = transform_component_data->bounds.w * component_data->scale.x;
component_data->bounds.h = transform_component_data->bounds.h * component_data->scale.y; component_data->bounds.h = transform_component_data->bounds.h * component_data->scale.y;
@ -58,7 +55,7 @@ inline int interact_component_draw(const component_t *component)
{ {
const interact_component_data_t *component_data = component->data; const interact_component_data_t *component_data = component->data;
if(display_draw_frect(&component_data->bounds, C_GREEN, 128)) return EXIT_FAILURE; if(display_draw_frect(&component_data->bounds, C_GREEN, 128)) return_failure_int;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@ -82,17 +79,18 @@ inline int interact_component_interact(interact_component_data_t *component_data
break; break;
default: default:
error_printf("Interaction type not valid : %d", component_data->type);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if(event_bus_publish(&game.event_bus, component_data->topic_id, component_data->state)) return EXIT_FAILURE; if(event_bus_publish(&game.event_bus, component_data->topic_id, component_data->state)) return_failure_int;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
inline int interact_component_modify_topic(interact_component_data_t *component_data, size_t id) inline int interact_component_modify_topic_id(interact_component_data_t *component_data, size_t id)
{ {
if(event_bus_change_topic_id(&game.event_bus, component_data->topic_id, id)) return EXIT_FAILURE; if(event_bus_change_topic_id(&game.event_bus, component_data->topic_id, id)) return_failure_int;
component_data->topic_id = id; component_data->topic_id = id;

View File

@ -8,15 +8,17 @@
#include "memory_alloc.h" #include "memory_alloc.h"
#include "errors.h" #include "errors.h"
#include "hitbox_component.h"
// Args = entity_t *entity, size_t state // Args = entity_t *entity, size_t state
static inline int lever_component_callback(va_list args, void *subscription_data) static inline int lever_component_callback(va_list args, void *subscription_data)
{ {
const entity_t *entity = subscription_data; const entity_t *entity = subscription_data;
component_t *lever_component = entity_get_component(entity, LEVER_COMPONENT); component_t *lever_component = entity_get_component(entity, LEVER_COMPONENT);
if(!lever_component) return EXIT_FAILURE; if(!lever_component)
{
error_printf("Failed to get lever component.");
return EXIT_FAILURE;
}
lever_component_data_t *component_data = lever_component->data; lever_component_data_t *component_data = lever_component->data;
@ -37,10 +39,6 @@ inline int lever_component_init(component_t *component)
} }
component_data->animation_system_data = animation_system->data; component_data->animation_system_data = animation_system->data;
component_data->topic_id = 0;
event_bus_subscribe(&game.event_bus, component_data->topic_id, lever_component_callback, component->entity);
component_data->state = false;
component_data->last_state = false; component_data->last_state = false;
return EXIT_SUCCESS; return EXIT_SUCCESS;
@ -70,3 +68,10 @@ inline int lever_component_destroy(component_t *component)
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
inline int lever_component_subscribe(lever_component_data_t *component_data, entity_t *entity)
{
if(event_bus_subscribe(&game.event_bus, component_data->topic_id, lever_component_callback, entity)) return_failure_int;
return EXIT_SUCCESS;
}

View File

@ -52,8 +52,8 @@ inline int player_system_update(component_t *component)
player_system_get_inputs(system_data); player_system_get_inputs(system_data);
player_system_set_velocity(system_data); player_system_set_velocity(system_data);
if(player_system_set_animation_and_speed(system_data)) return EXIT_FAILURE; if(player_system_set_animation_and_speed(system_data)) return_failure_int;
if(player_system_process_interaction(system_data)) return EXIT_FAILURE; if(player_system_process_interaction(system_data)) return_failure_int;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@ -123,33 +123,33 @@ static inline int player_system_set_animation_and_speed(player_system_data_t *sy
{ {
physics_system_data->speed = PLAYER_DEFAULT_RUN_SPEED; physics_system_data->speed = PLAYER_DEFAULT_RUN_SPEED;
if(sprite_component_set_texture(sprite_component_data, "player_run_sheet")) return EXIT_FAILURE; if(sprite_component_set_texture(sprite_component_data, "player_run_sheet")) return_failure_int;
animation_system_data->nb_frames = 8; animation_system_data->nb_frames = 8;
animation_system_data->current_frame_nb = 0; animation_system_data->current_frame_nb = 0;
animation_system_data->frame_delay_ms = PLAYER_DEFAULT_RUN_ANIMATION_SPEED; animation_system_data->frame_delay_ms = PLAYER_DEFAULT_RUN_ANIMATION_SPEED;
if(animation_system_apply_changes(animation_system_data)) return EXIT_FAILURE; if(animation_system_apply_changes(animation_system_data)) return_failure_int;
} }
else else
{ {
physics_system_data->speed = PLAYER_DEFAULT_WALK_SPEED; physics_system_data->speed = PLAYER_DEFAULT_WALK_SPEED;
if(sprite_component_set_texture(sprite_component_data, "player_walk_sheet")) return EXIT_FAILURE; if(sprite_component_set_texture(sprite_component_data, "player_walk_sheet")) return_failure_int;
animation_system_data->nb_frames = 4; animation_system_data->nb_frames = 4;
animation_system_data->current_frame_nb = 0; animation_system_data->current_frame_nb = 0;
animation_system_data->frame_delay_ms = PLAYER_DEFAULT_WALK_ANIMATION_SPEED; animation_system_data->frame_delay_ms = PLAYER_DEFAULT_WALK_ANIMATION_SPEED;
if(animation_system_apply_changes(animation_system_data)) return EXIT_FAILURE; if(animation_system_apply_changes(animation_system_data)) return_failure_int;
} }
} }
else if(!(system_data->state & PLAYER_MOVING) && (system_data->last_state & PLAYER_MOVING)) else if(!(system_data->state & PLAYER_MOVING) && (system_data->last_state & PLAYER_MOVING))
{ {
if(sprite_component_set_texture(sprite_component_data, "player_idle_sheet")) return EXIT_FAILURE; if(sprite_component_set_texture(sprite_component_data, "player_idle_sheet")) return_failure_int;
animation_system_data->nb_frames = 4; animation_system_data->nb_frames = 4;
animation_system_data->current_frame_nb = 0; animation_system_data->current_frame_nb = 0;
animation_system_data->frame_delay_ms = PLAYER_DEFAULT_IDLE_ANIMATION_SPEED; animation_system_data->frame_delay_ms = PLAYER_DEFAULT_IDLE_ANIMATION_SPEED;
if(animation_system_apply_changes(animation_system_data)) return EXIT_FAILURE; if(animation_system_apply_changes(animation_system_data)) return_failure_int;
} }
return EXIT_SUCCESS; return EXIT_SUCCESS;
@ -176,7 +176,7 @@ static inline int action_detect_activate_interact(elem_t *elem, va_list args)
if(fhas_intersection(hitbox_bounds, target_interact_bounds)) if(fhas_intersection(hitbox_bounds, target_interact_bounds))
{ {
if(interact_component_interact(target_interact_component_data)) return EXIT_FAILURE; if(interact_component_interact(target_interact_component_data)) return_failure_int;
} }
return EXIT_SUCCESS; return EXIT_SUCCESS;
@ -188,7 +188,7 @@ static inline int player_system_process_interaction(player_system_data_t *system
if(game.events.keys[KEY_INTERACT] && !last_state) if(game.events.keys[KEY_INTERACT] && !last_state)
{ {
if(linked_list_for_each(&game.entity_manager.entities, action_detect_activate_interact, system_data)) return EXIT_FAILURE; if(linked_list_for_each(&game.entity_manager.entities, action_detect_activate_interact, system_data)) return_failure_int;
} }
last_state = game.events.keys[KEY_INTERACT]; last_state = game.events.keys[KEY_INTERACT];

View File

@ -18,8 +18,6 @@ inline int sprite_component_init(component_t *component)
transform_component_data_t *transform_component_data = component_data->transform_component_data; transform_component_data_t *transform_component_data = component_data->transform_component_data;
if(sprite_component_set_texture(component_data, "dummy_sheet")) return EXIT_FAILURE;
frect_to_rect(&transform_component_data->bounds, &component_data->src_rect); frect_to_rect(&transform_component_data->bounds, &component_data->src_rect);
component_data->src_rect.x = 0; component_data->src_rect.x = 0;
component_data->src_rect.y = 0; component_data->src_rect.y = 0;
@ -44,7 +42,7 @@ inline int sprite_component_draw(const component_t *component)
{ {
const sprite_component_data_t *component_data = component->data; const sprite_component_data_t *component_data = component->data;
if(display_draw_texture(component_data->texture, &component_data->src_rect, &component_data->dst_rect, component_data->flip)) return EXIT_FAILURE; if(display_draw_texture(component_data->texture, &component_data->src_rect, &component_data->dst_rect, component_data->flip)) return_failure_int;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@ -61,7 +59,7 @@ inline int sprite_component_destroy(component_t *component)
inline int sprite_component_set_texture(sprite_component_data_t *component_data, const char *texture_name) inline int sprite_component_set_texture(sprite_component_data_t *component_data, const char *texture_name)
{ {
asset_t *texture_asset = asset_manager_get(&game.asset_manager, texture_name); asset_t *texture_asset = asset_manager_get(&game.asset_manager, texture_name);
if(!texture_asset) return EXIT_FAILURE; if(!texture_asset) return_failure_int;
component_data->texture = texture_asset->data; component_data->texture = texture_asset->data;

View File

@ -30,7 +30,7 @@ inline int transform_component_draw(const component_t *component)
{ {
const transform_component_data_t *component_data = component->data; const transform_component_data_t *component_data = component->data;
if(display_draw_frect(&component_data->bounds, C_BLUE, 128)) return EXIT_FAILURE; if(display_draw_frect(&component_data->bounds, C_BLUE, 128)) return_failure_int;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -3,204 +3,342 @@
#include <stdlib.h> #include <stdlib.h>
#include "display.h" #include "display.h"
#include "asset_manager.h" #include "asset_manager.h"
#include "ecs.h"
#include "event_bus.h" #include "event_bus.h"
#include "inputs.h" #include "ecs.h"
#include "components.h" #include "components.h"
#include "inputs.h"
#include "errors.h" #include "errors.h"
int game_init(void) int game_init(void)
{ {
game.is_running = false; game.is_running = false;
if(display_init()) return EXIT_FAILURE; if(display_init()) return_failure_int;
if(asset_manager_init(&game.asset_manager)) return EXIT_FAILURE; if(asset_manager_init(&game.asset_manager)) return_failure_int;
event_bus_init(&game.event_bus); event_bus_init(&game.event_bus);
entity_manager_init(&game.entity_manager); entity_manager_init(&game.entity_manager);
if(asset_manager_load_asset(&game.asset_manager, "dummy_sheet", ASSET_TEXTURE)) return EXIT_FAILURE; if(asset_manager_load_asset(&game.asset_manager, "player_idle_sheet", ASSET_TEXTURE)) return_failure_int;
if(asset_manager_load_asset(&game.asset_manager, "player_idle_sheet", ASSET_TEXTURE)) return EXIT_FAILURE; if(asset_manager_load_asset(&game.asset_manager, "player_walk_sheet", ASSET_TEXTURE)) return_failure_int;
if(asset_manager_load_asset(&game.asset_manager, "player_walk_sheet", ASSET_TEXTURE)) return EXIT_FAILURE; if(asset_manager_load_asset(&game.asset_manager, "player_run_sheet", ASSET_TEXTURE)) return_failure_int;
if(asset_manager_load_asset(&game.asset_manager, "player_run_sheet", ASSET_TEXTURE)) return EXIT_FAILURE; if(asset_manager_load_asset(&game.asset_manager, "lever_sheet", ASSET_TEXTURE)) return_failure_int;
if(asset_manager_load_asset(&game.asset_manager, "lever_sheet", ASSET_TEXTURE)) return EXIT_FAILURE; if(asset_manager_load_asset(&game.asset_manager, "barred_door_sheet", ASSET_TEXTURE)) return_failure_int;
if(asset_manager_load_asset(&game.asset_manager, "barred_door_sheet", ASSET_TEXTURE)) return EXIT_FAILURE; if(asset_manager_load_asset(&game.asset_manager, "wooden_door_sheet", ASSET_TEXTURE)) return_failure_int;
if(asset_manager_load_asset(&game.asset_manager, "wooden_door_sheet", ASSET_TEXTURE)) return EXIT_FAILURE; if(asset_manager_load_asset(&game.asset_manager, "tileset", ASSET_TEXTURE)) return_failure_int;
if(asset_manager_load_asset(&game.asset_manager, "tileset", ASSET_TEXTURE)) return EXIT_FAILURE;
/* ======== Player ======== */ /* ======== Player ======== */
{
entity_t *player_entity = entity_manager_new_entity(&game.entity_manager, 0); entity_t *player_entity = entity_manager_new_entity(&game.entity_manager, 0);
if(!player_entity) return EXIT_FAILURE; if(!player_entity) return_failure_int;
component_t *component = entity_new_component(player_entity, TRANSFORM_COMPONENT); {
if(!component) return EXIT_FAILURE; component_t *transform_component = entity_new_component(player_entity, TRANSFORM_COMPONENT);
if(!transform_component) return_failure_int;
((transform_component_data_t *)component->data)->bounds = (frect_t) { transform_component_data_t *transform_component_data = transform_component->data;
transform_component_data->bounds = (frect_t) {
.x = 10.0f, .x = 10.0f,
.y = 10.0f, .y = 10.0f,
.w = 32.0f, .w = 32.0f,
.h = 32.0f .h = 32.0f
}; };
}
if(!entity_new_component(player_entity, SPRITE_COMPONENT)) return EXIT_FAILURE; {
component_t *sprite_component = entity_new_component(player_entity, SPRITE_COMPONENT);
if(!sprite_component) return_failure_int;
component = entity_new_component(player_entity, ANIMATION_SYSTEM); sprite_component_data_t *sprite_component_data = sprite_component->data;
if(!component) return EXIT_FAILURE;
((animation_system_data_t *)component->data)->loop = true; sprite_component_set_texture(sprite_component_data, "player_idle_sheet");
((animation_system_data_t *)component->data)->play = true; }
component = entity_new_component(player_entity, HITBOX_COMPONENT); {
if(!component) return EXIT_FAILURE; component_t *animation_system = entity_new_component(player_entity, ANIMATION_SYSTEM);
if(!animation_system) return_failure_int;
((hitbox_component_data_t *)component->data)->position = (fvector2d_t) { animation_system_data_t *animation_system_data = animation_system->data;
.x = 0.5f,
.y = 1.0f if(linked_list_reserve(&animation_system_data->frames, 8)) return_failure_int;
animation_system_data->current_frame_nb = 0;
animation_system_data->nb_frames = 4;
if(animation_system_apply_changes(animation_system_data)) return_failure_int;
animation_system_data->play = true;
animation_system_data->loop = true;
animation_system_data->reverse = false;
}
{
component_t *hitbox_component = entity_new_component(player_entity, HITBOX_COMPONENT);
if(!hitbox_component) return_failure_int;
hitbox_component_data_t * hitbox_component_data = hitbox_component->data;
hitbox_component_data->position = (fvector2d_t) {
.x = 0.25f,
.y = 0.6875f
}; };
((hitbox_component_data_t *)component->data)->scale = (fvector2d_t) { hitbox_component_data->scale = (fvector2d_t) {
.x = 0.5f, .x = 0.5f,
.y = 1.0f / 3.0f .y = 0.3125f
}; };
}
if(!entity_new_component(player_entity, PHYSICS_SYSTEM)) return EXIT_FAILURE; if(!entity_new_component(player_entity, PHYSICS_SYSTEM)) return_failure_int;
if(!entity_new_component(player_entity, PLAYER_SYSTEM)) return EXIT_FAILURE;
if(!entity_new_component(player_entity, PLAYER_SYSTEM)) return_failure_int;
}
/* ======== Lever ========*/ /* ======== Lever ========*/
{
entity_t *lever_entity = entity_manager_new_entity(&game.entity_manager, 1); entity_t *lever_entity = entity_manager_new_entity(&game.entity_manager, 1);
if(!lever_entity) return EXIT_FAILURE; if(!lever_entity) return_failure_int;
component = entity_new_component(lever_entity, TRANSFORM_COMPONENT); {
if(!component) return EXIT_FAILURE; component_t *transform_component = entity_new_component(lever_entity, TRANSFORM_COMPONENT);
if(!transform_component) return_failure_int;
((transform_component_data_t *)component->data)->bounds = (frect_t) { transform_component_data_t *transform_component_data = transform_component->data;
transform_component_data->bounds = (frect_t) {
.x = 30.0f, .x = 30.0f,
.y = 120.0f, .y = 120.0f,
.w = 48.0f, .w = 48.0f,
.h = 32.0f .h = 32.0f
}; };
}
component = entity_new_component(lever_entity, SPRITE_COMPONENT); {
if(!component) return EXIT_FAILURE; component_t *sprite_component = entity_new_component(lever_entity, SPRITE_COMPONENT);
if(!sprite_component) return_failure_int;
if(sprite_component_set_texture(component->data, "lever_sheet")) return EXIT_FAILURE; sprite_component_data_t *sprite_component_data = sprite_component->data;
component = entity_new_component(lever_entity, ANIMATION_SYSTEM); if(sprite_component_set_texture(sprite_component_data, "lever_sheet")) return_failure_int;
if(!component) return EXIT_FAILURE; }
((animation_system_data_t *)component->data)->nb_frames = 3; {
((animation_system_data_t *)component->data)->frame_delay_ms = LEVER_DEFAULT_ANIMATION_SPEED; component_t *animation_system = entity_new_component(lever_entity, ANIMATION_SYSTEM);
if(animation_system_create_frames_clips(component->data)) return EXIT_FAILURE; if(!animation_system) return_failure_int;
component = entity_new_component(lever_entity, HITBOX_COMPONENT); animation_system_data_t *animation_system_data = animation_system->data;
if(!component) return EXIT_FAILURE;
((hitbox_component_data_t *)component->data)->position = (fvector2d_t) { animation_system_data->nb_frames = 3;
.x = 0.5f, animation_system_data->current_frame_nb = 0;
.y = 0.9f animation_system_data->frame_delay_ms = LEVER_DEFAULT_ANIMATION_SPEED;
animation_system_data->play = false;
animation_system_data->loop = false;
animation_system_data->reverse = false;
if(animation_system_apply_changes(animation_system_data)) return_failure_int;
}
{
component_t *hitbox_component = entity_new_component(lever_entity, HITBOX_COMPONENT);
if(!hitbox_component) return_failure_int;
hitbox_component_data_t *hitbox_component_data = hitbox_component->data;
hitbox_component_data->position = (fvector2d_t) {
.x = 0.3333333333333333f,
.y = 0.59375
}; };
((hitbox_component_data_t *)component->data)->scale = (fvector2d_t) { hitbox_component_data->scale = (fvector2d_t) {
.x = 1.0f / 3.0f, .x = 0.3333333333333333f,
.y = 0.3f .y = 0.34375f
};
}
{
component_t *interact_component = entity_new_component(lever_entity, INTERACT_COMPONENT);
if(!interact_component) return_failure_int;
interact_component_data_t *interact_component_data = interact_component->data;
interact_component_data->position = (fvector2d_t) {
.x = 0.16666666666666666f,
.y = 0.34375f
}; };
component = entity_new_component(lever_entity, INTERACT_COMPONENT); interact_component_data->scale = (fvector2d_t) {
if(!component) return EXIT_FAILURE; .x = 0.6666666666666666f,
.y = 0.84375f
((interact_component_data_t *)component->data)->position = (fvector2d_t) {
.x = 0.5f,
.y = 1.9f
}; };
((interact_component_data_t *)component->data)->scale = (fvector2d_t) { interact_component_data->type = INTERACT_TOGGLE;
.x = 2.0f / 3.0f, interact_component_data->state = 0;
.y = 0.8f
};
if(!entity_new_component(lever_entity, LEVER_COMPONENT)) return EXIT_FAILURE; interact_component_modify_topic_id(interact_component_data, 0);
}
{
component_t *lever_component = entity_new_component(lever_entity, LEVER_COMPONENT);
if(!lever_component) return_failure_int;
lever_component_data_t * lever_component_data = lever_component->data;
lever_component_data->topic_id = 0;
lever_component_data->state = false;
lever_component_subscribe(lever_component_data, lever_entity);
}
}
/* ======== Door ======== */ /* ======== Door ======== */
{
entity_t *door_entity = entity_manager_new_entity(&game.entity_manager, 1); entity_t *door_entity = entity_manager_new_entity(&game.entity_manager, 1);
if(!lever_entity) return EXIT_FAILURE; if(!door_entity) return_failure_int;
component = entity_new_component(door_entity, TRANSFORM_COMPONENT); {
if(!component) return EXIT_FAILURE; component_t *transform_component = entity_new_component(door_entity, TRANSFORM_COMPONENT);
if(!transform_component) return_failure_int;
((transform_component_data_t *)component->data)->bounds = (frect_t) { transform_component_data_t *transform_component_data = transform_component->data;
transform_component_data->bounds = (frect_t) {
.x = 120.0f, .x = 120.0f,
.y = 30.0f, .y = 30.0f,
.w = 32.0f, .w = 32.0f,
.h = 48.0f .h = 48.0f
}; };
}
component = entity_new_component(door_entity, SPRITE_COMPONENT); {
if(!component) return EXIT_FAILURE; component_t *sprite_component = entity_new_component(door_entity, SPRITE_COMPONENT);
if(!sprite_component) return_failure_int;
if(sprite_component_set_texture(component->data, "barred_door_sheet")) return EXIT_FAILURE; sprite_component_data_t * sprite_component_data = sprite_component->data;
component = entity_new_component(door_entity, ANIMATION_SYSTEM); if(sprite_component_set_texture(sprite_component_data, "barred_door_sheet")) return_failure_int;
if(!component) return EXIT_FAILURE; }
((animation_system_data_t *)component->data)->nb_frames = 8; {
((animation_system_data_t *)component->data)->frame_delay_ms = BARRED_DOOR_DEFAULT_ANIMATION_SPEED; component_t *animation_system = entity_new_component(door_entity, ANIMATION_SYSTEM);
if(animation_system_create_frames_clips(component->data)) return EXIT_FAILURE; if(!animation_system) return_failure_int;
component = entity_new_component(door_entity, HITBOX_COMPONENT); animation_system_data_t *animation_system_data = animation_system->data;
if(!component) return EXIT_FAILURE;
((hitbox_component_data_t *)component->data)->position = (fvector2d_t) { animation_system_data->nb_frames = 8;
.x = 0.5f, animation_system_data->current_frame_nb = 0;
.y = 1.0f animation_system_data->frame_delay_ms = BARRED_DOOR_DEFAULT_ANIMATION_SPEED;
animation_system_data->play = false;
animation_system_data->loop = false;
animation_system_data->reverse = false;
if(animation_system_apply_changes(animation_system->data)) return_failure_int;
}
{
component_t *hitbox_component = entity_new_component(door_entity, HITBOX_COMPONENT);
if(!hitbox_component) return_failure_int;
hitbox_component_data_t * hitbox_component_data = hitbox_component->data;
hitbox_component_data->position = (fvector2d_t) {
.x = 0.0f,
.y = 0.8333333333333334f
}; };
((hitbox_component_data_t *)component->data)->scale = (fvector2d_t) { hitbox_component_data->scale = (fvector2d_t) {
.x = 1.0f, .x = 1.0f,
.y = 1.0f / 7.0f .y = 0.16666666666666666f
}; };
}
if(!entity_new_component(door_entity, DOOR_COMPONENT)) return EXIT_FAILURE; {
component_t *door_component = entity_new_component(door_entity, DOOR_COMPONENT);
if(!door_component) return_failure_int;
door_component_data_t * door_component_data = door_component->data;
door_component_data->topic_id = 0;
door_component_data->state = false;
door_component_subscribe(door_component_data, door_entity);
}
}
/* ======== Door 2 ======== */ /* ======== Door 2 ======== */
{
entity_t *door2_entity = entity_manager_new_entity(&game.entity_manager, 1); entity_t *door2_entity = entity_manager_new_entity(&game.entity_manager, 1);
if(!lever_entity) return EXIT_FAILURE; if(!door2_entity) return_failure_int;
component = entity_new_component(door2_entity, TRANSFORM_COMPONENT); {
if(!component) return EXIT_FAILURE; component_t *transform_component = entity_new_component(door2_entity, TRANSFORM_COMPONENT);
if(!transform_component) return_failure_int;
((transform_component_data_t *)component->data)->bounds = (frect_t) { transform_component_data_t *transform_component_data = transform_component->data;
transform_component_data->bounds = (frect_t) {
.x = 240.0f, .x = 240.0f,
.y = 30.0f, .y = 30.0f,
.w = 32.0f, .w = 32.0f,
.h = 48.0f .h = 48.0f
}; };
}
component = entity_new_component(door2_entity, SPRITE_COMPONENT); {
if(!component) return EXIT_FAILURE; component_t *sprite_component = entity_new_component(door2_entity, SPRITE_COMPONENT);
if(!sprite_component) return_failure_int;
if(sprite_component_set_texture(component->data, "wooden_door_sheet")) return EXIT_FAILURE; sprite_component_data_t *sprite_component_data = sprite_component->data;
component = entity_new_component(door2_entity, ANIMATION_SYSTEM); if(sprite_component_set_texture(sprite_component_data, "wooden_door_sheet")) return_failure_int;
if(!component) return EXIT_FAILURE; }
((animation_system_data_t *)component->data)->nb_frames = 6; {
((animation_system_data_t *)component->data)->frame_delay_ms = WOODEN_DOOR_DEFAULT_ANIMATION_SPEED; component_t *animation_system = entity_new_component(door2_entity, ANIMATION_SYSTEM);
if(animation_system_create_frames_clips(component->data)) return EXIT_FAILURE; if(!animation_system) return_failure_int;
component = entity_new_component(door2_entity, HITBOX_COMPONENT); animation_system_data_t *animation_system_data = animation_system->data;
if(!component) return EXIT_FAILURE;
((hitbox_component_data_t *)component->data)->position = (fvector2d_t) { animation_system_data->nb_frames = 6;
.x = 0.5f, animation_system_data->current_frame_nb = 0;
.y = 1.0f animation_system_data->frame_delay_ms = WOODEN_DOOR_DEFAULT_ANIMATION_SPEED;
animation_system_data->play = false;
animation_system_data->loop = false;
animation_system_data->reverse = false;
if(animation_system_apply_changes(animation_system->data)) return_failure_int;
}
{
component_t *hitbox_component = entity_new_component(door2_entity, HITBOX_COMPONENT);
if(!hitbox_component) return_failure_int;
hitbox_component_data_t *hitbox_component_data = hitbox_component->data;
hitbox_component_data->position = (fvector2d_t) {
.x = 0.0f,
.y = 0.8333333333333334f
}; };
((hitbox_component_data_t *)component->data)->scale = (fvector2d_t) { hitbox_component_data->scale = (fvector2d_t) {
.x = 1.0f, .x = 1.0f,
.y = 1.0f / 7.0f .y = 0.16666666666666666f
}; };
}
if(!entity_new_component(door2_entity, DOOR_COMPONENT)) return EXIT_FAILURE; {
component_t *door_component = entity_new_component(door2_entity, DOOR_COMPONENT);
if(!door_component) return_failure_int;
door_component_data_t * door_component_data = door_component->data;
door_component_data->topic_id = 0;
door_component_data->state = false;
door_component_subscribe(door_component_data, door2_entity);
}
}
game.is_running = true; game.is_running = true;
@ -228,7 +366,7 @@ int game_update(void)
if(entity_manager_update(&game.entity_manager)) if(entity_manager_update(&game.entity_manager))
{ {
game.is_running = false; game.is_running = false;
return EXIT_FAILURE; return_failure_int;
} }
return EXIT_SUCCESS; return EXIT_SUCCESS;
@ -239,13 +377,13 @@ int game_render(void)
if(display_clear()) if(display_clear())
{ {
game.is_running = false; game.is_running = false;
return EXIT_FAILURE; return_failure_int;
} }
if(entity_manager_draw(&game.entity_manager)) if(entity_manager_draw(&game.entity_manager))
{ {
game.is_running = false; game.is_running = false;
return EXIT_FAILURE; return_failure_int;
} }
display_update(); display_update();
@ -257,7 +395,7 @@ int game_exit(void)
{ {
entity_manager_exit(&game.entity_manager); entity_manager_exit(&game.entity_manager);
event_bus_exit(&game.event_bus); event_bus_exit(&game.event_bus);
if(asset_manager_exit(&game.asset_manager)) return EXIT_FAILURE; if(asset_manager_exit(&game.asset_manager)) return_failure_int;
display_exit(); display_exit();
return EXIT_SUCCESS; return EXIT_SUCCESS;