diff --git a/CMakeLists.txt b/CMakeLists.txt index ea3731916c..4f1d03669d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -406,7 +406,7 @@ else (WIN32) endif (NOT DISABLE_RCT2) add_custom_command( OUTPUT g2.dat - COMMAND ./openrct2 sprite build ${CMAKE_BINARY_DIR}/g2.dat ${CMAKE_CURRENT_SOURCE_DIR}/resources/g2/ + COMMAND ./openrct2 sprite build ${CMAKE_BINARY_DIR}/g2.dat ${CMAKE_CURRENT_SOURCE_DIR}/resources/g2/sprites.json WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) add_custom_target(g2 DEPENDS ${PROJECT} g2.dat) diff --git a/OpenRCT2.xcodeproj/project.pbxproj b/OpenRCT2.xcodeproj/project.pbxproj index c95cfabaf2..82fb2485eb 100644 --- a/OpenRCT2.xcodeproj/project.pbxproj +++ b/OpenRCT2.xcodeproj/project.pbxproj @@ -2504,7 +2504,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${TARGET_BUILD_DIR}/${EXECUTABLE_PATH}\" sprite build \"${SRCROOT}/data/g2.dat\" \"${SRCROOT}/resources/g2/\""; + shellScript = "\"${TARGET_BUILD_DIR}/${EXECUTABLE_PATH}\" sprite build \"${SRCROOT}/data/g2.dat\" \"${SRCROOT}/resources/g2/sprites.json\""; }; D4CA88671D4E962100060C11 /* Get Git Variables */ = { isa = PBXShellScriptBuildPhase; diff --git a/openrct2.proj b/openrct2.proj index fa6652969b..f9abece593 100644 --- a/openrct2.proj +++ b/openrct2.proj @@ -199,7 +199,7 @@ - diff --git a/resources/g2/29.png b/resources/g2/icons/29.png similarity index 100% rename from resources/g2/29.png rename to resources/g2/icons/29.png diff --git a/resources/g2/30.png b/resources/g2/icons/30.png similarity index 100% rename from resources/g2/30.png rename to resources/g2/icons/30.png diff --git a/resources/g2/31.png b/resources/g2/icons/31.png similarity index 100% rename from resources/g2/31.png rename to resources/g2/icons/31.png diff --git a/resources/g2/32.png b/resources/g2/icons/32.png similarity index 100% rename from resources/g2/32.png rename to resources/g2/icons/32.png diff --git a/resources/g2/58.png b/resources/g2/icons/58.png similarity index 100% rename from resources/g2/58.png rename to resources/g2/icons/58.png diff --git a/resources/g2/33.png b/resources/g2/icons/cheats.png similarity index 100% rename from resources/g2/33.png rename to resources/g2/icons/cheats.png diff --git a/resources/g2/78.png b/resources/g2/icons/copy.png similarity index 100% rename from resources/g2/78.png rename to resources/g2/icons/copy.png diff --git a/resources/g2/2.png b/resources/g2/icons/fast_forward.png similarity index 100% rename from resources/g2/2.png rename to resources/g2/icons/fast_forward.png diff --git a/resources/g2/3.png b/resources/g2/icons/game_speed_indicator.png similarity index 100% rename from resources/g2/3.png rename to resources/g2/icons/game_speed_indicator.png diff --git a/resources/g2/4.png b/resources/g2/icons/game_speed_indicator_double.png similarity index 100% rename from resources/g2/4.png rename to resources/g2/icons/game_speed_indicator_double.png diff --git a/resources/g2/14.png b/resources/g2/icons/large_scenery.png similarity index 100% rename from resources/g2/14.png rename to resources/g2/icons/large_scenery.png diff --git a/resources/g2/6.png b/resources/g2/icons/map_gen_land.png similarity index 100% rename from resources/g2/6.png rename to resources/g2/icons/map_gen_land.png diff --git a/resources/g2/13.png b/resources/g2/icons/map_gen_noise.png similarity index 100% rename from resources/g2/13.png rename to resources/g2/icons/map_gen_noise.png diff --git a/resources/g2/12.png b/resources/g2/icons/map_gen_trees.png similarity index 100% rename from resources/g2/12.png rename to resources/g2/icons/map_gen_trees.png diff --git a/resources/g2/60.png b/resources/g2/icons/multiplayer.png similarity index 100% rename from resources/g2/60.png rename to resources/g2/icons/multiplayer.png diff --git a/resources/g2/87.png b/resources/g2/icons/mute.png similarity index 100% rename from resources/g2/87.png rename to resources/g2/icons/mute.png diff --git a/resources/g2/88.png b/resources/g2/icons/mute_pressed.png similarity index 100% rename from resources/g2/88.png rename to resources/g2/icons/mute_pressed.png diff --git a/resources/g2/79.png b/resources/g2/icons/paste.png similarity index 100% rename from resources/g2/79.png rename to resources/g2/icons/paste.png diff --git a/resources/g2/16.png b/resources/g2/icons/paths.png similarity index 100% rename from resources/g2/16.png rename to resources/g2/icons/paths.png diff --git a/resources/g2/17.png b/resources/g2/icons/rct1_close_off.png similarity index 100% rename from resources/g2/17.png rename to resources/g2/icons/rct1_close_off.png diff --git a/resources/g2/18.png b/resources/g2/icons/rct1_close_off_pressed.png similarity index 100% rename from resources/g2/18.png rename to resources/g2/icons/rct1_close_off_pressed.png diff --git a/resources/g2/19.png b/resources/g2/icons/rct1_close_on.png similarity index 100% rename from resources/g2/19.png rename to resources/g2/icons/rct1_close_on.png diff --git a/resources/g2/20.png b/resources/g2/icons/rct1_close_on_pressed.png similarity index 100% rename from resources/g2/20.png rename to resources/g2/icons/rct1_close_on_pressed.png diff --git a/resources/g2/25.png b/resources/g2/icons/rct1_open_off.png similarity index 100% rename from resources/g2/25.png rename to resources/g2/icons/rct1_open_off.png diff --git a/resources/g2/26.png b/resources/g2/icons/rct1_open_off_pressed.png similarity index 100% rename from resources/g2/26.png rename to resources/g2/icons/rct1_open_off_pressed.png diff --git a/resources/g2/27.png b/resources/g2/icons/rct1_open_on.png similarity index 100% rename from resources/g2/27.png rename to resources/g2/icons/rct1_open_on.png diff --git a/resources/g2/28.png b/resources/g2/icons/rct1_open_on_pressed.png similarity index 100% rename from resources/g2/28.png rename to resources/g2/icons/rct1_open_on_pressed.png diff --git a/resources/g2/21.png b/resources/g2/icons/rct1_test_off.png similarity index 100% rename from resources/g2/21.png rename to resources/g2/icons/rct1_test_off.png diff --git a/resources/g2/22.png b/resources/g2/icons/rct1_test_off_pressed.png similarity index 100% rename from resources/g2/22.png rename to resources/g2/icons/rct1_test_off_pressed.png diff --git a/resources/g2/23.png b/resources/g2/icons/rct1_test_on.png similarity index 100% rename from resources/g2/23.png rename to resources/g2/icons/rct1_test_on.png diff --git a/resources/g2/24.png b/resources/g2/icons/rct1_test_on_pressed.png similarity index 100% rename from resources/g2/24.png rename to resources/g2/icons/rct1_test_on_pressed.png diff --git a/resources/g2/59.png b/resources/g2/icons/server_password.png similarity index 100% rename from resources/g2/59.png rename to resources/g2/icons/server_password.png diff --git a/resources/g2/15.png b/resources/g2/icons/small_scenery.png similarity index 100% rename from resources/g2/15.png rename to resources/g2/icons/small_scenery.png diff --git a/resources/g2/77.png b/resources/g2/icons/sort.png similarity index 100% rename from resources/g2/77.png rename to resources/g2/icons/sort.png diff --git a/resources/g2/80.png b/resources/g2/icons/tab_disabled.png similarity index 100% rename from resources/g2/80.png rename to resources/g2/icons/tab_disabled.png diff --git a/resources/g2/5.png b/resources/g2/icons/twitch.png similarity index 100% rename from resources/g2/5.png rename to resources/g2/icons/twitch.png diff --git a/resources/g2/90.png b/resources/g2/icons/unmute.png similarity index 100% rename from resources/g2/90.png rename to resources/g2/icons/unmute.png diff --git a/resources/g2/89.png b/resources/g2/icons/unmute_pressed.png similarity index 100% rename from resources/g2/89.png rename to resources/g2/icons/unmute_pressed.png diff --git a/resources/g2/8.png b/resources/g2/icons/zoom_in.png similarity index 100% rename from resources/g2/8.png rename to resources/g2/icons/zoom_in.png diff --git a/resources/g2/9.png b/resources/g2/icons/zoom_in_background.png similarity index 100% rename from resources/g2/9.png rename to resources/g2/icons/zoom_in_background.png diff --git a/resources/g2/10.png b/resources/g2/icons/zoom_out.png similarity index 100% rename from resources/g2/10.png rename to resources/g2/icons/zoom_out.png diff --git a/resources/g2/11.png b/resources/g2/icons/zoom_out_background.png similarity index 100% rename from resources/g2/11.png rename to resources/g2/icons/zoom_out_background.png diff --git a/resources/g2/0.png b/resources/g2/logo.png similarity index 100% rename from resources/g2/0.png rename to resources/g2/logo.png diff --git a/resources/g2/1.png b/resources/g2/logo_text.png similarity index 100% rename from resources/g2/1.png rename to resources/g2/logo_text.png diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json new file mode 100644 index 0000000000..19db0371c4 --- /dev/null +++ b/resources/g2/sprites.json @@ -0,0 +1,281 @@ +[ + { + "path": "logo.png" + }, + { + "path": "logo_text.png" + }, + { + "path": "icons/fast_forward.png" + }, + { + "path": "icons/game_speed_indicator.png" + }, + { + "path": "icons/game_speed_indicator_double.png" + }, + { + "path": "icons/twitch.png" + }, + { + "path": "icons/map_gen_land.png" + }, + { + "path": "7.png" + }, + { + "path": "icons/zoom_in.png" + }, + { + "path": "icons/zoom_in_background.png" + }, + { + "path": "icons/zoom_out.png" + }, + { + "path": "icons/zoom_out_background.png" + }, + { + "path": "icons/map_gen_trees.png" + }, + { + "path": "icons/map_gen_noise.png" + }, + { + "path": "icons/large_scenery.png" + }, + { + "path": "icons/small_scenery.png" + }, + { + "path": "icons/paths.png" + }, + { + "path": "icons/rct1_close_off.png" + }, + { + "path": "icons/rct1_close_off_pressed.png" + }, + { + "path": "icons/rct1_close_on.png" + }, + { + "path": "icons/rct1_close_off_pressed.png" + }, + { + "path": "icons/rct1_test_off.png" + }, + { + "path": "icons/rct1_test_off_pressed.png" + }, + { + "path": "icons/rct1_test_on.png" + }, + { + "path": "icons/rct1_test_on_pressed.png" + }, + { + "path": "icons/rct1_open_off.png" + }, + { + "path": "icons/rct1_open_off_pressed.png" + }, + { + "path": "icons/rct1_open_on.png" + }, + { + "path": "icons/rct1_open_on_pressed.png" + }, + { + "path": "icons/29.png" + }, + { + "path": "icons/30.png" + }, + { + "path": "icons/31.png" + }, + { + "path": "icons/32.png" + }, + { + "path": "icons/cheats.png" + }, + { + "path": "track/junior/flat_to_steep_1.png" + }, + { + "path": "track/junior/flat_to_steep_2_1.png" + }, + { + "path": "track/junior/flat_to_steep_3_1.png" + }, + { + "path": "track/junior/flat_to_steep_4.png" + }, + { + "path": "track/junior/flat_to_steep_2_2.png" + }, + { + "path": "track/junior/flat_to_steep_3_2.png" + }, + { + "path": "track/junior/steep_to_flat_1.png" + }, + { + "path": "track/junior/steep_to_flat_2_1.png" + }, + { + "path": "track/junior/steep_to_flat_3_1.png" + }, + { + "path": "track/junior/steep_to_flat_4.png" + }, + { + "path": "track/junior/steep_to_flat_2_2.png" + }, + { + "path": "track/junior/steep_to_flat_3_2.png" + }, + { + "path": "track/junior/flat_to_steep_lift_1.png" + }, + { + "path": "track/junior/flat_to_steep_lift_2_1.png" + }, + { + "path": "track/junior/flat_to_steep_lift_3_1.png" + }, + { + "path": "track/junior/flat_to_steep_lift_4.png" + }, + { + "path": "track/junior/flat_to_steep_lift_2_2.png" + }, + { + "path": "track/junior/flat_to_steep_lift_3_2.png" + }, + { + "path": "track/junior/steep_to_flat_lift_1.png" + }, + { + "path": "track/junior/steep_to_flat_lift_2_1.png" + }, + { + "path": "track/junior/steep_to_flat_lift_3_1.png" + }, + { + "path": "track/junior/steep_to_flat_lift_4.png" + }, + { + "path": "track/junior/steep_to_flat_lift_2_2.png" + }, + { + "path": "track/junior/steep_to_flat_lift_3_2.png" + }, + { + "path": "icons/58.png" + }, + { + "path": "icons/server_password.png" + }, + { + "path": "icons/multiplayer.png" + }, + { + "path": "track/junior/flat_to_steep_diagonal_1.png" + }, + { + "path": "track/junior/flat_to_steep_diagonal_2.png" + }, + { + "path": "track/junior/flat_to_steep_diagonal_3.png" + }, + { + "path": "track/junior/flat_to_steep_diagonal_4.png" + }, + { + "path": "track/junior/steep_to_flat_diagonal_1.png" + }, + { + "path": "track/junior/steep_to_flat_diagonal_2.png" + }, + { + "path": "track/junior/steep_to_flat_diagonal_3.png" + }, + { + "path": "track/junior/steep_to_flat_diagonal_4.png" + }, + { + "path": "track/junior/flat_to_steep_diagonal_lift_1.png" + }, + { + "path": "track/junior/flat_to_steep_diagonal_lift_2.png" + }, + { + "path": "track/junior/flat_to_steep_diagonal_lift_3.png" + }, + { + "path": "track/junior/flat_to_steep_diagonal_lift_4.png" + }, + { + "path": "track/junior/steep_to_flat_diagonal_lift_1.png" + }, + { + "path": "track/junior/steep_to_flat_diagonal_lift_2.png" + }, + { + "path": "track/junior/steep_to_flat_diagonal_lift_3.png" + }, + { + "path": "track/junior/steep_to_flat_diagonal_lift_4.png" + }, + { + "path": "icons/sort.png" + }, + { + "path": "icons/copy.png" + }, + { + "path": "icons/paste.png" + }, + { + "path": "icons/tab_disabled.png" + }, + { + "path": "track/intamin/booster_1.png" + }, + { + "path": "track/intamin/booster_2.png" + }, + { + "path": "track/bm/booster_1.png" + }, + { + "path": "track/bm/booster_2.png" + }, + { + "path": "track/junior/booster_1.png" + }, + { + "path": "track/junior/booster_2.png" + }, + { + "path": "icons/mute.png" + }, + { + "path": "icons/mute_pressed.png" + }, + { + "path": "icons/unmute.png" + }, + { + "path": "icons/unmute_pressed.png" + }, + { + "path": "track/mini/booster_1.png" + }, + { + "path": "track/mini/booster_2.png" + } +] diff --git a/resources/g2/83.png b/resources/g2/track/bm/booster_1.png similarity index 100% rename from resources/g2/83.png rename to resources/g2/track/bm/booster_1.png diff --git a/resources/g2/84.png b/resources/g2/track/bm/booster_2.png similarity index 100% rename from resources/g2/84.png rename to resources/g2/track/bm/booster_2.png diff --git a/resources/g2/81.png b/resources/g2/track/intamin/booster_1.png similarity index 100% rename from resources/g2/81.png rename to resources/g2/track/intamin/booster_1.png diff --git a/resources/g2/82.png b/resources/g2/track/intamin/booster_2.png similarity index 100% rename from resources/g2/82.png rename to resources/g2/track/intamin/booster_2.png diff --git a/resources/g2/85.png b/resources/g2/track/junior/booster_1.png similarity index 100% rename from resources/g2/85.png rename to resources/g2/track/junior/booster_1.png diff --git a/resources/g2/86.png b/resources/g2/track/junior/booster_2.png similarity index 100% rename from resources/g2/86.png rename to resources/g2/track/junior/booster_2.png diff --git a/resources/g2/34.png b/resources/g2/track/junior/flat_to_steep_1.png similarity index 100% rename from resources/g2/34.png rename to resources/g2/track/junior/flat_to_steep_1.png diff --git a/resources/g2/35.png b/resources/g2/track/junior/flat_to_steep_2_1.png similarity index 100% rename from resources/g2/35.png rename to resources/g2/track/junior/flat_to_steep_2_1.png diff --git a/resources/g2/38.png b/resources/g2/track/junior/flat_to_steep_2_2.png similarity index 100% rename from resources/g2/38.png rename to resources/g2/track/junior/flat_to_steep_2_2.png diff --git a/resources/g2/36.png b/resources/g2/track/junior/flat_to_steep_3_1.png similarity index 100% rename from resources/g2/36.png rename to resources/g2/track/junior/flat_to_steep_3_1.png diff --git a/resources/g2/39.png b/resources/g2/track/junior/flat_to_steep_3_2.png similarity index 100% rename from resources/g2/39.png rename to resources/g2/track/junior/flat_to_steep_3_2.png diff --git a/resources/g2/37.png b/resources/g2/track/junior/flat_to_steep_4.png similarity index 100% rename from resources/g2/37.png rename to resources/g2/track/junior/flat_to_steep_4.png diff --git a/resources/g2/61.png b/resources/g2/track/junior/flat_to_steep_diagonal_1.png similarity index 100% rename from resources/g2/61.png rename to resources/g2/track/junior/flat_to_steep_diagonal_1.png diff --git a/resources/g2/62.png b/resources/g2/track/junior/flat_to_steep_diagonal_2.png similarity index 100% rename from resources/g2/62.png rename to resources/g2/track/junior/flat_to_steep_diagonal_2.png diff --git a/resources/g2/63.png b/resources/g2/track/junior/flat_to_steep_diagonal_3.png similarity index 100% rename from resources/g2/63.png rename to resources/g2/track/junior/flat_to_steep_diagonal_3.png diff --git a/resources/g2/64.png b/resources/g2/track/junior/flat_to_steep_diagonal_4.png similarity index 100% rename from resources/g2/64.png rename to resources/g2/track/junior/flat_to_steep_diagonal_4.png diff --git a/resources/g2/69.png b/resources/g2/track/junior/flat_to_steep_diagonal_lift_1.png similarity index 100% rename from resources/g2/69.png rename to resources/g2/track/junior/flat_to_steep_diagonal_lift_1.png diff --git a/resources/g2/70.png b/resources/g2/track/junior/flat_to_steep_diagonal_lift_2.png similarity index 100% rename from resources/g2/70.png rename to resources/g2/track/junior/flat_to_steep_diagonal_lift_2.png diff --git a/resources/g2/71.png b/resources/g2/track/junior/flat_to_steep_diagonal_lift_3.png similarity index 100% rename from resources/g2/71.png rename to resources/g2/track/junior/flat_to_steep_diagonal_lift_3.png diff --git a/resources/g2/72.png b/resources/g2/track/junior/flat_to_steep_diagonal_lift_4.png similarity index 100% rename from resources/g2/72.png rename to resources/g2/track/junior/flat_to_steep_diagonal_lift_4.png diff --git a/resources/g2/46.png b/resources/g2/track/junior/flat_to_steep_lift_1.png similarity index 100% rename from resources/g2/46.png rename to resources/g2/track/junior/flat_to_steep_lift_1.png diff --git a/resources/g2/47.png b/resources/g2/track/junior/flat_to_steep_lift_2_1.png similarity index 100% rename from resources/g2/47.png rename to resources/g2/track/junior/flat_to_steep_lift_2_1.png diff --git a/resources/g2/50.png b/resources/g2/track/junior/flat_to_steep_lift_2_2.png similarity index 100% rename from resources/g2/50.png rename to resources/g2/track/junior/flat_to_steep_lift_2_2.png diff --git a/resources/g2/48.png b/resources/g2/track/junior/flat_to_steep_lift_3_1.png similarity index 100% rename from resources/g2/48.png rename to resources/g2/track/junior/flat_to_steep_lift_3_1.png diff --git a/resources/g2/51.png b/resources/g2/track/junior/flat_to_steep_lift_3_2.png similarity index 100% rename from resources/g2/51.png rename to resources/g2/track/junior/flat_to_steep_lift_3_2.png diff --git a/resources/g2/49.png b/resources/g2/track/junior/flat_to_steep_lift_4.png similarity index 100% rename from resources/g2/49.png rename to resources/g2/track/junior/flat_to_steep_lift_4.png diff --git a/resources/g2/40.png b/resources/g2/track/junior/steep_to_flat_1.png similarity index 100% rename from resources/g2/40.png rename to resources/g2/track/junior/steep_to_flat_1.png diff --git a/resources/g2/41.png b/resources/g2/track/junior/steep_to_flat_2_1.png similarity index 100% rename from resources/g2/41.png rename to resources/g2/track/junior/steep_to_flat_2_1.png diff --git a/resources/g2/44.png b/resources/g2/track/junior/steep_to_flat_2_2.png similarity index 100% rename from resources/g2/44.png rename to resources/g2/track/junior/steep_to_flat_2_2.png diff --git a/resources/g2/42.png b/resources/g2/track/junior/steep_to_flat_3_1.png similarity index 100% rename from resources/g2/42.png rename to resources/g2/track/junior/steep_to_flat_3_1.png diff --git a/resources/g2/45.png b/resources/g2/track/junior/steep_to_flat_3_2.png similarity index 100% rename from resources/g2/45.png rename to resources/g2/track/junior/steep_to_flat_3_2.png diff --git a/resources/g2/43.png b/resources/g2/track/junior/steep_to_flat_4.png similarity index 100% rename from resources/g2/43.png rename to resources/g2/track/junior/steep_to_flat_4.png diff --git a/resources/g2/65.png b/resources/g2/track/junior/steep_to_flat_diagonal_1.png similarity index 100% rename from resources/g2/65.png rename to resources/g2/track/junior/steep_to_flat_diagonal_1.png diff --git a/resources/g2/66.png b/resources/g2/track/junior/steep_to_flat_diagonal_2.png similarity index 100% rename from resources/g2/66.png rename to resources/g2/track/junior/steep_to_flat_diagonal_2.png diff --git a/resources/g2/67.png b/resources/g2/track/junior/steep_to_flat_diagonal_3.png similarity index 100% rename from resources/g2/67.png rename to resources/g2/track/junior/steep_to_flat_diagonal_3.png diff --git a/resources/g2/68.png b/resources/g2/track/junior/steep_to_flat_diagonal_4.png similarity index 100% rename from resources/g2/68.png rename to resources/g2/track/junior/steep_to_flat_diagonal_4.png diff --git a/resources/g2/73.png b/resources/g2/track/junior/steep_to_flat_diagonal_lift_1.png similarity index 100% rename from resources/g2/73.png rename to resources/g2/track/junior/steep_to_flat_diagonal_lift_1.png diff --git a/resources/g2/74.png b/resources/g2/track/junior/steep_to_flat_diagonal_lift_2.png similarity index 100% rename from resources/g2/74.png rename to resources/g2/track/junior/steep_to_flat_diagonal_lift_2.png diff --git a/resources/g2/75.png b/resources/g2/track/junior/steep_to_flat_diagonal_lift_3.png similarity index 100% rename from resources/g2/75.png rename to resources/g2/track/junior/steep_to_flat_diagonal_lift_3.png diff --git a/resources/g2/76.png b/resources/g2/track/junior/steep_to_flat_diagonal_lift_4.png similarity index 100% rename from resources/g2/76.png rename to resources/g2/track/junior/steep_to_flat_diagonal_lift_4.png diff --git a/resources/g2/52.png b/resources/g2/track/junior/steep_to_flat_lift_1.png similarity index 100% rename from resources/g2/52.png rename to resources/g2/track/junior/steep_to_flat_lift_1.png diff --git a/resources/g2/53.png b/resources/g2/track/junior/steep_to_flat_lift_2_1.png similarity index 100% rename from resources/g2/53.png rename to resources/g2/track/junior/steep_to_flat_lift_2_1.png diff --git a/resources/g2/56.png b/resources/g2/track/junior/steep_to_flat_lift_2_2.png similarity index 100% rename from resources/g2/56.png rename to resources/g2/track/junior/steep_to_flat_lift_2_2.png diff --git a/resources/g2/54.png b/resources/g2/track/junior/steep_to_flat_lift_3_1.png similarity index 100% rename from resources/g2/54.png rename to resources/g2/track/junior/steep_to_flat_lift_3_1.png diff --git a/resources/g2/57.png b/resources/g2/track/junior/steep_to_flat_lift_3_2.png similarity index 100% rename from resources/g2/57.png rename to resources/g2/track/junior/steep_to_flat_lift_3_2.png diff --git a/resources/g2/55.png b/resources/g2/track/junior/steep_to_flat_lift_4.png similarity index 100% rename from resources/g2/55.png rename to resources/g2/track/junior/steep_to_flat_lift_4.png diff --git a/resources/g2/91.png b/resources/g2/track/mini/booster_1.png similarity index 100% rename from resources/g2/91.png rename to resources/g2/track/mini/booster_1.png diff --git a/resources/g2/92.png b/resources/g2/track/mini/booster_2.png similarity index 100% rename from resources/g2/92.png rename to resources/g2/track/mini/booster_2.png diff --git a/src/openrct2/OpenRCT2.cpp b/src/openrct2/OpenRCT2.cpp index 1816f98ac7..bfa3e6721f 100644 --- a/src/openrct2/OpenRCT2.cpp +++ b/src/openrct2/OpenRCT2.cpp @@ -299,9 +299,6 @@ extern "C" OpenRCT2::RunGameLoop(); } openrct2_dispose(); - - // HACK Some threads are still running which causes the game to not terminate. Investigation required! - exit(gExitCode); } void openrct2_dispose() diff --git a/src/openrct2/cmdline/CommandLine.cpp b/src/openrct2/cmdline/CommandLine.cpp index 2337744927..dae2f01696 100644 --- a/src/openrct2/cmdline/CommandLine.cpp +++ b/src/openrct2/cmdline/CommandLine.cpp @@ -568,6 +568,12 @@ extern "C" argEnumerator.TryPop(); const CommandLineCommand * command = CommandLine::FindCommandFor(CommandLine::RootCommands, &argEnumerator); + + if (command == nullptr) + { + return EXITCODE_FAIL; + } + if (command->Options != nullptr) { auto argEnumeratorForOptions = CommandLineArgEnumerator(argEnumerator); @@ -576,6 +582,7 @@ extern "C" return EXITCODE_FAIL; } } + if (command == CommandLine::RootCommands && command->Func == nullptr) { return CommandLine::HandleCommandDefault(); diff --git a/src/openrct2/cmdline/SpriteCommands.cpp b/src/openrct2/cmdline/SpriteCommands.cpp index 241e53438d..52758066c0 100644 --- a/src/openrct2/cmdline/SpriteCommands.cpp +++ b/src/openrct2/cmdline/SpriteCommands.cpp @@ -24,7 +24,7 @@ extern "C" { - sint32 gSpriteMode = 0; + sint32 gSpriteMode = 0; } static const char * _mode; @@ -40,12 +40,12 @@ static exitcode_t HandleSprite(CommandLineArgEnumerator *argEnumerator); const CommandLineCommand CommandLine::SpriteCommands[] { // Main commands - DefineCommand("append", " ", SpriteOptions, HandleSprite), - DefineCommand("build", " [silent]", SpriteOptions, HandleSprite), - DefineCommand("create", "", SpriteOptions, HandleSprite), - DefineCommand("details", " [idx]", SpriteOptions, HandleSprite), - DefineCommand("export", " ", SpriteOptions, HandleSprite), - DefineCommand("exportall", " ", SpriteOptions, HandleSprite), + DefineCommand("append", " [x_offset y_offset]", SpriteOptions, HandleSprite), + DefineCommand("build", " [silent]", SpriteOptions, HandleSprite), + DefineCommand("create", "", SpriteOptions, HandleSprite), + DefineCommand("details", " [idx]", SpriteOptions, HandleSprite), + DefineCommand("export", " ", SpriteOptions, HandleSprite), + DefineCommand("exportall", " ", SpriteOptions, HandleSprite), CommandTableEnd }; diff --git a/src/openrct2/cmdline_sprite.c b/src/openrct2/cmdline_sprite.c index 4e3357af12..4753ae7b5e 100644 --- a/src/openrct2/cmdline_sprite.c +++ b/src/openrct2/cmdline_sprite.c @@ -14,6 +14,9 @@ *****************************************************************************/ #pragma endregion +#pragma warning(disable : 4706) // assignment within conditional expression + +#include #include "cmdline_sprite.h" #include "drawing/drawing.h" #include "Imaging.h" @@ -289,7 +292,8 @@ static sint32 get_palette_index(sint16 *colour) return -1; } -static bool sprite_file_import(const char *path, rct_g1_element *outElement, uint8 **outBuffer, sint32 *outBufferLength, sint32 mode) + +static bool sprite_file_import(const char *path, sint16 x_offset, sint16 y_offset, rct_g1_element *outElement, uint8 **outBuffer, int *outBufferLength, sint32 mode) { uint8 *pixels; uint32 width, height; @@ -433,8 +437,8 @@ static bool sprite_file_import(const char *path, rct_g1_element *outElement, uin outElement->width = width; outElement->height = height; outElement->flags = G1_FLAG_RLE_COMPRESSION; - outElement->x_offset = 0; - outElement->y_offset = 0; + outElement->x_offset = x_offset; + outElement->y_offset = y_offset; outElement->zoomed_offset = 0; *outBuffer = buffer; @@ -595,18 +599,42 @@ sint32 cmdline_for_sprite(const char **argv, sint32 argc) sprite_file_close(); return 1; } else if (_strcmpi(argv[0], "append") == 0) { - if (argc < 3) { - fprintf(stderr, "usage: sprite append \n"); + if (argc != 3 && argc != 5) { + fprintf(stderr, "usage: sprite append [ ]\n"); return -1; } + const char *spriteFilePath = argv[1]; const char *imagePath = argv[2]; + sint16 x_offset = 0; + sint16 y_offset = 0; + + if (argc == 5) + { + char *endptr; + + x_offset = strtol(argv[3], &endptr, 0); + if (*endptr != 0) + { + fprintf(stderr, "X offset must be an integer\n"); + return -1; + } + + y_offset = strtol(argv[4], &endptr, 0); + if (*endptr != 0) + { + fprintf(stderr, "Y offset must be an integer\n"); + return -1; + } + } rct_g1_element spriteElement; uint8 *buffer; + sint32 bufferLength; - if (!sprite_file_import(imagePath, &spriteElement, &buffer, &bufferLength, gSpriteMode)) + if (!sprite_file_import(imagePath, x_offset, y_offset, &spriteElement, &buffer, &bufferLength, gSpriteMode)) + return -1; if (!sprite_file_open(spriteFilePath)) { @@ -633,75 +661,118 @@ sint32 cmdline_for_sprite(const char **argv, sint32 argc) return 1; } else if (_strcmpi(argv[0], "build") == 0) { if (argc < 3) { - fprintf(stdout, "usage: sprite build [silent]\n"); + fprintf(stdout, "usage: sprite build [silent]\n"); return -1; } const char *spriteFilePath = argv[1]; - const char *resourcePath = argv[2]; - char imagePath[MAX_PATH]; - size_t resourceLength = strlen(resourcePath); + const char *spriteDescriptionPath = argv[2]; + char* directoryPath = path_get_directory(spriteDescriptionPath); + + json_error_t error; + json_t* sprite_list=json_load_file(spriteDescriptionPath, JSON_REJECT_DUPLICATES, &error); + + if (sprite_list == NULL) + { + fprintf(stderr, "Error parsing sprite description file: %s at line %d column %d\n", error.text, error.line, error.column); + return -1; + } + + if (!json_is_array(sprite_list)) + { + fprintf(stderr, "Error: expected array\n"); + json_decref(sprite_list); + return -1; + } bool silent = (argc >= 4 && strcmp(argv[3], "silent") == 0); - SDL_RWops *file; spriteFileHeader.num_entries = 0; spriteFileHeader.total_size = 0; sprite_file_save(spriteFilePath); fprintf(stdout, "Building: %s\n", spriteFilePath); - sint32 i = 0; - do { - // Create image path - safe_strcpy(imagePath, resourcePath, MAX_PATH); - if (resourcePath[resourceLength - 1] == '/' || resourcePath[resourceLength - 1] == '\\') - imagePath[resourceLength - 1] = 0; - char filename[16]; - snprintf(filename, 16, "%d.png", i); - safe_strcat_path(imagePath, filename, MAX_PATH); - file = SDL_RWFromFile(imagePath, "r"); - if (file != NULL) { - SDL_RWclose(file); - rct_g1_element spriteElement; - uint8 *buffer; - sint32 bufferLength; - if (!sprite_file_import(imagePath, &spriteElement, &buffer, &bufferLength, gSpriteMode)) { - fprintf(stderr, "Could not import image file: %s\nCanceling\n", imagePath); - return -1; - } + size_t i; + json_t* sprite_description; - if (!sprite_file_open(spriteFilePath)) { - fprintf(stderr, "Unable to open sprite file: %s\nCanceling\n", spriteFilePath); - return -1; - } - - spriteFileHeader.num_entries++; - spriteFileHeader.total_size += bufferLength; - spriteFileEntries = realloc(spriteFileEntries, spriteFileHeader.num_entries * sizeof(rct_g1_element)); - - sprite_entries_make_relative(); - spriteFileData = realloc(spriteFileData, spriteFileHeader.total_size); - sprite_entries_make_absolute(); - - spriteFileEntries[spriteFileHeader.num_entries - 1] = spriteElement; - memcpy(spriteFileData + (spriteFileHeader.total_size - bufferLength), buffer, bufferLength); - spriteFileEntries[spriteFileHeader.num_entries - 1].offset = spriteFileData + (spriteFileHeader.total_size - bufferLength); - - free(buffer); - - if (!sprite_file_save(spriteFilePath)) { - fprintf(stderr, "Could not save sprite file: %s\nCanceling\n", imagePath); - return -1; - } - if (!silent) - fprintf(stdout, "Added: %s\n", imagePath); - sprite_file_close(); + json_array_foreach(sprite_list, i, sprite_description) + { + if(!json_is_object(sprite_description)) + { + fprintf(stderr, "Error: expected object for sprite %lu\n", (unsigned long)i); + json_decref(sprite_list); + return -1; } - i++; - } while (file != NULL); + + json_t* path = json_object_get(sprite_description,"path"); + if(!path || !json_is_string(path)) + { + fprintf(stderr, "Error: no path provided for sprite %lu\n", (unsigned long)i); + json_decref(sprite_list); + return -1; + } + //Get x and y offsets, if present + json_t* x_offset = json_object_get(sprite_description, "x_offset"); + json_t* y_offset = json_object_get(sprite_description, "y_offset"); + + //Resolve absolute sprite path + char *imagePath = platform_get_absolute_path(json_string_value(path), directoryPath); + rct_g1_element spriteElement; + uint8 *buffer; + int bufferLength; + + if (!sprite_file_import(imagePath, x_offset==NULL ? 0 : json_integer_value(x_offset), y_offset==NULL ? 0 : json_integer_value(y_offset), &spriteElement, &buffer, &bufferLength, gSpriteMode)) + { + fprintf(stderr, "Could not import image file: %s\nCanceling\n", imagePath); + json_decref(sprite_list); + free(imagePath); + return -1; + } + + if (!sprite_file_open(spriteFilePath)) + { + fprintf(stderr, "Unable to open sprite file: %s\nCanceling\n", spriteFilePath); + json_decref(sprite_list); + free(imagePath); + return -1; + } + + spriteFileHeader.num_entries++; + spriteFileHeader.total_size += bufferLength; + spriteFileEntries = realloc(spriteFileEntries, spriteFileHeader.num_entries * sizeof(rct_g1_element)); + + sprite_entries_make_relative(); + spriteFileData = realloc(spriteFileData, spriteFileHeader.total_size); + sprite_entries_make_absolute(); + + spriteFileEntries[spriteFileHeader.num_entries - 1] = spriteElement; + memcpy(spriteFileData + (spriteFileHeader.total_size - bufferLength), buffer, bufferLength); + spriteFileEntries[spriteFileHeader.num_entries - 1].offset = spriteFileData + (spriteFileHeader.total_size - bufferLength); + + free(buffer); + + if (!sprite_file_save(spriteFilePath)) + { + fprintf(stderr, "Could not save sprite file: %s\nCanceling\n", imagePath); + json_decref(sprite_list); + free(imagePath); + return -1; + } + + if (!silent) + fprintf(stdout, "Added: %s\n", imagePath); + + free(imagePath); + sprite_file_close(); + + } + + json_decref(sprite_list); + free(directoryPath); + fprintf(stdout, "Finished\n"); return 1; } else { diff --git a/src/openrct2/platform/platform.h b/src/openrct2/platform/platform.h index ac93a317c5..fb0edc5a7d 100644 --- a/src/openrct2/platform/platform.h +++ b/src/openrct2/platform/platform.h @@ -167,6 +167,7 @@ bool platform_original_game_data_exists(const utf8 *path); time_t platform_file_get_modified_time(const utf8* path); bool platform_ensure_directory_exists(const utf8 *path); bool platform_directory_delete(const utf8 *path); +utf8 * platform_get_absolute_path(const utf8 * relative_path, const utf8 * base_path); bool platform_lock_single_instance(); sint32 platform_enumerate_files_begin(const utf8 *pattern); bool platform_enumerate_files_next(sint32 handle, file_info *outFileInfo); diff --git a/src/openrct2/platform/posix.c b/src/openrct2/platform/posix.c index 3891930217..49236ea78a 100644 --- a/src/openrct2/platform/posix.c +++ b/src/openrct2/platform/posix.c @@ -47,21 +47,20 @@ utf8 _userDataDirectoryPath[MAX_PATH] = { 0 }; utf8 _openrctDataDirectoryPath[MAX_PATH] = { 0 }; /** - * The function that is called directly from the host application (rct2.exe)'s WinMain. - * This will be removed when OpenRCT2 can be built as a stand alone application. + * The main entry point for non-Windows platforms. */ sint32 main(sint32 argc, const char **argv) { core_init(); - sint32 run_game = cmdline_run(argv, argc); - if (run_game == 1) + sint32 exitCode = cmdline_run(argv, argc); + if (exitCode == 1) { openrct2_launch(); + exitCode = gExitCode; } - exit(gExitCode); - return gExitCode; + return exitCode; } void platform_get_date_utc(rct2_date *out_date) @@ -262,6 +261,22 @@ bool platform_directory_delete(const utf8 *path) return true; } +utf8 * platform_get_absolute_path(const utf8 * relative_path, const utf8 * base_path) +{ + utf8 path[MAX_PATH]; + + if (base_path != NULL) + { + snprintf(path, MAX_PATH, "%s/%s", base_path, relative_path); + } + else + { + safe_strcpy(path, base_path, MAX_PATH); + } + return realpath(path,NULL); +} + + bool platform_lock_single_instance() { char pidFilePath[MAX_PATH]; diff --git a/src/openrct2/platform/windows.c b/src/openrct2/platform/windows.c index cc528147ab..4fe901d10a 100644 --- a/src/openrct2/platform/windows.c +++ b/src/openrct2/platform/windows.c @@ -67,12 +67,13 @@ sint32 RunOpenRCT2(int argc, char * * argv) core_init(); - int runGame = cmdline_run((const char **)argv, argc); - if (runGame == 1) { + sint32 exitCode = cmdline_run((const char **)argv, argc); + if (exitCode == 1) { openrct2_launch(); + exitCode = gExitCode; } - return gExitCode; + return exitCode; } #ifdef NO_RCT2 @@ -109,7 +110,7 @@ BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved) */ __declspec(dllexport) sint32 StartOpenRCT(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, sint32 nCmdShow) { - sint32 argc, runGame; + sint32 argc; char **argv; if (_dllModule == NULL) { @@ -118,9 +119,8 @@ __declspec(dllexport) sint32 StartOpenRCT(HINSTANCE hInstance, HINSTANCE hPrevIn core_init(); - // argv = CommandLineToArgvA(lpCmdLine, &argc); argv = (char**)windows_get_command_line_args(&argc); - runGame = cmdline_run((const char **)argv, argc); + sint32 exitCode = cmdline_run((const char **)argv, argc); // Free argv for (sint32 i = 0; i < argc; i++) { @@ -128,11 +128,14 @@ __declspec(dllexport) sint32 StartOpenRCT(HINSTANCE hInstance, HINSTANCE hPrevIn } free(argv); - if (runGame == 1) { + if (exitCode == 1) { openrct2_launch(); + exitCode = gExitCode; } - exit(gExitCode); + + exit(exitCode); + return exitCode; } #endif // NO_RCT2 @@ -1057,6 +1060,26 @@ bool platform_get_font_path(TTFFontDescriptor *font, utf8 *buffer, size_t size) #endif } +utf8 * platform_get_absolute_path(const utf8 * relativePath, const utf8 * basePath) +{ + utf8 path[MAX_PATH]; + safe_strcpy(path, basePath, sizeof(path)); + safe_strcat_path(path, relativePath, sizeof(path)); + + wchar_t * pathW = utf8_to_widechar(path); + wchar_t fullPathW[MAX_PATH]; + DWORD fullPathLen = GetFullPathNameW(pathW, countof(fullPathW), fullPathW, NULL); + + free(pathW); + + if (fullPathLen == 0) + { + return NULL; + } + + return widechar_to_utf8(fullPathW); +} + datetime64 platform_get_datetime_now_utc() { // Get file time