diff --git a/CMakeLists.txt b/CMakeLists.txt index cdd6759..d353ee3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,11 +93,13 @@ if(LIBTMJ_TEST) enable_testing() add_executable(map_tests test/map_tests.c test/Unity/src/unity.c) + add_executable(infinite_map_tests test/infinite_map_tests.c test/Unity/src/unity.c) add_executable(tileset_tests test/tileset_tests.c test/Unity/src/unity.c) add_executable(decode_tests test/decode_tests.c test/Unity/src/unity.c) #add_executable(util_tests test/util_tests.c test/Unity/src/unity.c) target_link_libraries(map_tests tmj jansson::jansson) + target_link_libraries(infinite_map_tests tmj jansson::jansson) target_link_libraries(tileset_tests tmj jansson::jansson) target_link_libraries(decode_tests tmj jansson::jansson) #target_link_libraries(util_tests tmj jansson::jansson) @@ -110,11 +112,13 @@ if(LIBTMJ_TEST) endif() set_target_properties(map_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY test/bin) + set_target_properties(infinite_map_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY test/bin) set_target_properties(tileset_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY test/bin) set_target_properties(decode_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY test/bin) #set_target_properties(util_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY test/bin) add_test(NAME map_tests COMMAND test/bin/map_tests) + add_test(NAME infinite_map_tests COMMAND test/bin/infinite_map_tests) add_test(NAME tileset_tests COMMAND test/bin/tileset_tests) add_test(NAME decode_tests COMMAND test/bin/decode_tests) #add_test(NAME util_tests COMMAND test/bin/util_tests) @@ -124,6 +128,8 @@ if(LIBTMJ_TEST) if(WIN32) set_tests_properties(map_tests PROPERTIES ENVIRONMENT_MODIFICATION PATH=path_list_append:${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}) + set_tests_properties(infinite_map_tests PROPERTIES ENVIRONMENT_MODIFICATION + PATH=path_list_append:${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}) set_tests_properties(tileset_tests PROPERTIES ENVIRONMENT_MODIFICATION PATH=path_list_append:${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}) set_tests_properties(decode_tests PROPERTIES ENVIRONMENT_MODIFICATION diff --git a/example/overworld_inf.tmj b/example/overworld_inf.tmj new file mode 100644 index 0000000..5e4c4c5 --- /dev/null +++ b/example/overworld_inf.tmj @@ -0,0 +1,326 @@ +{ "compressionlevel":-1, + "height":20, + "infinite":true, + "layers":[ + { + "chunks":[ + { + "data":[173, 71, 71, 71, 71, 71, 71, 71, 71, 71, 172, 27, 86, 110, 149, 110, + 172, 172, 1, 2, 2, 3, 71, 71, 71, 173, 71, 27, 86, 28, 110, 110, + 71, 1, 26, 46, 23, 24, 71, 71, 71, 71, 71, 27, 109, 110, 110, 109, + 71, 22, 46, 47, 46, 24, 71, 71, 71, 71, 71, 27, 28, 110, 110, 86, + 71, 22, 46, 46, 47, 24, 71, 71, 71, 71, 71, 27, 28, 109, 149, 28, + 71, 22, 23, 46, 47, 24, 71, 71, 71, 71, 71, 48, 70, 110, 86, 149, + 71, 22, 46, 47, 23, 24, 71, 71, 71, 71, 71, 71, 27, 109, 86, 86, + 71, 22, 47, 23, 46, 24, 71, 71, 71, 71, 71, 71, 27, 86, 86, 28, + 71, 22, 46, 23, 47, 24, 71, 71, 71, 71, 71, 71, 48, 49, 70, 28, + 71, 22, 23, 46, 47, 24, 71, 71, 71, 71, 71, 71, 71, 71, 27, 110, + 71, 22, 47, 23, 23, 24, 71, 71, 71, 71, 71, 71, 71, 71, 48, 49, + 71, 43, 44, 44, 44, 45, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 173, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 46, 47, 23, 47, 46, 46, 47, 47, 23, 23, 46, 47, 46, 23, 23, 23, + 46, 23, 47, 46, 46, 46, 23, 47, 47, 23, 23, 47, 23, 23, 47, 47], + "height":16, + "width":16, + "x":0, + "y":0 + }, + { + "data":[110, 28, 149, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 28, 86, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 109, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 130, 170, 131, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 150, 173, 148, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 151, 128, 152, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 149, 149, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 86, 149, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 110, 149, 109, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 86, 149, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 49, 49, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":16, + "width":16, + "x":16, + "y":0 + }, + { + "data":[47, 46, 47, 47, 23, 47, 46, 23, 46, 46, 23, 4, 44, 44, 5, 47, + 46, 23, 47, 23, 23, 46, 46, 23, 4, 5, 46, 24, 71, 71, 22, 47, + 23, 47, 47, 23, 46, 47, 23, 47, 25, 26, 23, 24, 172, 172, 22, 47, + 47, 46, 46, 23, 47, 46, 46, 47, 46, 23, 23, 24, 173, 71, 22, 46, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":16, + "width":16, + "x":0, + "y":16 + }, + { + "data":[24, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":16, + "width":16, + "x":16, + "y":16 + }], + "height":32, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "startx":0, + "starty":0, + "type":"tilelayer", + "visible":true, + "width":32, + "x":0, + "y":0 + }, + { + "chunks":[ + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, + 0, 72, 73, 0, 0, 0, 81, 0, 0, 0, 0, 14, 15, 14, 15, 0], + "height":16, + "width":16, + "x":0, + "y":0 + }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 36, 35, 36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":16, + "width":16, + "x":0, + "y":16 + }], + "height":32, + "id":3, + "name":"village", + "opacity":1, + "startx":0, + "starty":0, + "type":"tilelayer", + "visible":true, + "width":16, + "x":0, + "y":0 + }, + { + "draworder":"topdown", + "id":4, + "name":"secret_stuff", + "objects":[ + { + "height":0, + "id":1, + "name":"Secret_Area1", + "properties":[ + { + "name":"active", + "type":"bool", + "value":false + }, + { + "name":"to", + "type":"int", + "value":21 + }], + "rotation":0, + "type":"Teleportation Platform", + "visible":true, + "width":0, + "x":87.1277500911633, + "y":279.794173655849 + }, + { + "height":10.6316599813622, + "id":2, + "name":"Teleport_Boss1", + "rotation":0, + "type":"Teleportation Platform", + "visible":true, + "width":10.372351201329, + "x":274.607998055184, + "y":66.9016652485718 + }], + "opacity":1, + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 + }, + { + "chunks":[ + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 134, 135, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 155, 156, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 177, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, + 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":16, + "width":16, + "x":0, + "y":0 + }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 54, 55, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":16, + "width":16, + "x":16, + "y":0 + }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":16, + "width":16, + "x":0, + "y":16 + }, + { + "data":[95, 96, 97, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 117, 118, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 138, 139, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 158, 159, 160, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":16, + "width":16, + "x":16, + "y":16 + }], + "height":32, + "id":2, + "name":"tree-mountain-bridge", + "opacity":1, + "startx":0, + "starty":0, + "type":"tilelayer", + "visible":true, + "width":32, + "x":0, + "y":0 + }], + "nextlayerid":5, + "nextobjectid":3, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.11.2", + "tileheight":16, + "tilesets":[ + { + "firstgid":1, + "source":"overworld.tsj" + }], + "tilewidth":16, + "type":"map", + "version":"1.10", + "width":20 +} diff --git a/src/map.c b/src/map.c index 8164a08..865ea4e 100644 --- a/src/map.c +++ b/src/map.c @@ -430,7 +430,7 @@ void free_objects(Object* objects, size_t object_count) { free(objects); } -Chunk* unpack_chunks(json_t* chunks) { +Chunk* unpack_chunks(json_t* chunks, size_t* chunk_count) { if (chunks == NULL) { return NULL; } @@ -443,9 +443,9 @@ Chunk* unpack_chunks(json_t* chunks) { json_error_t error; - size_t chunk_count = json_array_size(chunks); + *chunk_count = json_array_size(chunks); - Chunk* ret = calloc(chunk_count, sizeof(Chunk)); + Chunk* ret = calloc(*chunk_count, sizeof(Chunk)); if (ret == NULL) { logmsg(TMJ_LOG_ERR, "Unable to unpack chunks, the system is out of memory"); @@ -526,7 +526,7 @@ Chunk* unpack_chunks(json_t* chunks) { return ret; fail_data: - for (size_t i = 0; i < chunk_count; i++) { + for (size_t i = 0; i < *chunk_count; i++) { if (!ret[i].data_is_str) { free(ret[i].data_uint); } @@ -703,8 +703,17 @@ Layer* unpack_layers(json_t* layers) { } } - // Unpack data + // If a tilelayer, make sure we have one of the "data" or "chunks" fields if (strcmp(ret[idx].type, "tilelayer") == 0) { + if (!json_object_get(layer, "data") && !json_object_get(layer, "chunks")) { + logmsg(TMJ_LOG_ERR, "Could not unpack layer[%d], missing 'data' and 'chunks' fields", ret[idx].id); + + goto fail_layer; + } + } + + // Unpack data + if (strcmp(ret[idx].type, "tilelayer") == 0 && json_object_get(layer, "data")) { json_t* data = NULL; unpk = json_unpack_ex(layer, &error, 0, "{s:o}", "data", &data); @@ -786,7 +795,7 @@ Layer* unpack_layers(json_t* layers) { } if (chunks != NULL) { - ret[idx].chunks = unpack_chunks(chunks); + ret[idx].chunks = unpack_chunks(chunks, &ret[idx].chunk_count); if (ret[idx].chunks == NULL) { logmsg(TMJ_LOG_ERR, "Unable to unpack layer[%d]->chunks", ret[idx].id); diff --git a/test/infinite_map_tests.c b/test/infinite_map_tests.c new file mode 100644 index 0000000..324681b --- /dev/null +++ b/test/infinite_map_tests.c @@ -0,0 +1,81 @@ +#include + +#include "../include/tmj.h" + +#include "Unity/src/unity.h" + +void log_cb(tmj_log_priority priority, const char* msg) { + switch (priority) { + case TMJ_LOG_DEBUG: + printf("DEBUG: %s\n", msg); + break; + case TMJ_LOG_INFO: + printf("INFO: %s\n", msg); + break; + case TMJ_LOG_WARNING: + printf("WARNING: %s\n", msg); + break; + case TMJ_LOG_ERR: + printf("ERR: %s\n", msg); + break; + case TMJ_LOG_CRIT: + printf("CRIT: %s\n", msg); + break; + } +} + +void setUp(void) { + tmj_log_regcb(true, log_cb); +} + +void tearDown(void) {} + +char* testmap_path = "example/overworld_inf.tmj"; + +Map* mf = NULL; +Map* mf2 = NULL; +Map* ms = NULL; + +void test_map_loadf(void) { + mf = tmj_map_loadf(testmap_path, true); + TEST_ASSERT_NOT_NULL(mf); + TEST_ASSERT_EQUAL_size_t(4, mf->layer_count); + TEST_ASSERT_EQUAL_STRING("tilelayer", mf->layers[0].type); + TEST_ASSERT_EQUAL_size_t(4, mf->layers[0].chunk_count); +} + +void test_map_load(void) { + FILE* f = fopen(testmap_path, "rb"); + + fseek(f, 0, SEEK_END); + size_t fsize = ftell(f); + rewind(f); + + char* s = calloc(1, fsize + 1); + + TEST_ASSERT_EQUAL_size_t(fread(s, 1, fsize, f), fsize); + fclose(f); + + ms = tmj_map_load(s, "overworld"); + + TEST_ASSERT_NOT_NULL(ms); + TEST_ASSERT_EQUAL_size_t(4, ms->layer_count); + TEST_ASSERT_EQUAL_STRING("tilelayer", ms->layers[0].type); + TEST_ASSERT_EQUAL_size_t(4, ms->layers[0].chunk_count); + + free(s); +} + +void test_map_free(void) { + tmj_map_free(mf); + tmj_map_free(mf2); + tmj_map_free(ms); +} + +int main(void) { + UNITY_BEGIN(); + RUN_TEST(test_map_loadf); + RUN_TEST(test_map_load); + RUN_TEST(test_map_free); + return UNITY_END(); +}