diff --git a/.gitignore b/.gitignore index 386b4d9..7bae937 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,13 @@ .vscode +*config.txt *.DS_Store -bin -data/config/config.txt -data/config/config.bin -data/config/score.bin \ No newline at end of file +thumbs.db +*.exe +*_macos +*_linux +*.dmg +*.tar.gz +*.zip +*.app +*config.bin +*score.bin \ No newline at end of file diff --git a/Makefile b/Makefile index 5a9c57a..66e264d 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,118 @@ executable = coffee_crisis source = source/*.cpp source/common/*.cpp +appName = Coffee Crisis +releaseFolder = cc_release +version = v2.1b windows: @echo off - if not exist bin\ (mkdir bin) - g++ $(source) -std=c++11 -Wall -O2 -lmingw32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o bin/$(executable).exe - strip -s -R .comment -R .gnu.version bin/$(executable).exe --strip-unneeded + powershell if (Test-Path data\config\config.bin) {Remove-Item data\config\config.bin -Recurse -Force} + powershell if (Test-Path data\config\score.bin) {Remove-Item data\config\score.bin -Recurse -Force} + g++ $(source) -std=c++11 -Wall -Os -lmingw32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o $(executable).exe + strip -s -R .comment -R .gnu.version $(executable).exe --strip-unneeded + +windows_release: + @echo off + +# Remove data + powershell if (Test-Path data\config\config.bin) {Remove-Item data\config\config.bin -Recurse -Force} + powershell if (Test-Path data\config\score.bin) {Remove-Item data\config\score.bin -Recurse -Force} + powershell if (Test-Path $(releaseFolder)) {Remove-Item $(releaseFolder) -Recurse -Force} + +# Create folders + powershell if (-not (Test-Path $(releaseFolder))) {New-Item $(releaseFolder) -ItemType Directory} + +# Copy data + powershell Copy-Item -Path "data" -Destination "$(releaseFolder)" -recurse -Force + powershell Copy-Item "LICENSE" -Destination "$(releaseFolder)" + powershell Copy-Item "README.md" -Destination "$(releaseFolder)" + powershell Copy-Item "release/SDL2.dll" -Destination "$(releaseFolder)" + +# Build + g++ $(source) -D RELEASE -std=c++11 -Wall -Os -lmingw32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o "$(releaseFolder)/$(executable).exe" + strip -s -R .comment -R .gnu.version "$(releaseFolder)/$(executable).exe" --strip-unneeded + +# Create ZIP + powershell if (Test-Path $(executable)_win_$(version).zip) {Remove-Item $(executable)_win_$(version).zip} + powershell Compress-Archive -Path "$(releaseFolder)"/* -DestinationPath $(executable)_win_$(version).zip + +# Remove folder + powershell if (Test-Path $(releaseFolder)) {Remove-Item $(releaseFolder) -Recurse -Force} + macos: - mkdir -p bin - g++ $(source) -std=c++11 -Wall -O2 -lSDL2 -ffunction-sections -fdata-sections -o bin/$(executable)_macos + rm -f data/config/config.bin + rm -f data/config/score.bin + clang++ $(source) -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -o $(executable)_macos -target arm64-apple-macos11 + +macos_release: +# Remove data + rm -f data/config/config.bin + rm -f data/config/score.bin + rm -rdf "$(releaseFolder)" + +# Create folders + mkdir -p "$(releaseFolder)/$(appName).app/Contents/Frameworks" + mkdir -p "$(releaseFolder)/$(appName).app/Contents/MacOS" + mkdir -p "$(releaseFolder)/$(appName).app/Contents/Resources" + mkdir -p Frameworks + +# Copy folders + cp -R data "$(releaseFolder)/$(appName).app/Contents/Resources" + cp -R /Library/Frameworks/SDL2.framework "$(releaseFolder)/$(appName).app/Contents/Frameworks" + cp -R /Library/Frameworks/SDL2.framework Frameworks + +# Copy files + cp release/*.icns "$(releaseFolder)/$(appName).app/Contents/Resources" + cp release/Info.plist "$(releaseFolder)/$(appName).app/Contents" + +# Build INTEL + clang++ $(source) -D RELEASE -D MACOS_BUNDLE -std=c++11 -Wall -Os -framework SDL2 -F ./Frameworks -ffunction-sections -fdata-sections -o "$(releaseFolder)/$(appName).app/Contents/MacOS/$(executable)" -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.12 + +# Build INTEL DMG + rm -f "$(executable)_macos_intel_$(version).dmg" + hdiutil create tmp.dmg -ov -volname "$(appName)" -fs HFS+ -srcfolder "$(releaseFolder)" + hdiutil convert tmp.dmg -format UDZO -o "$(executable)_macos_intel_$(version).dmg" + rm tmp.dmg + +# Build APPLE SILICON + clang++ $(source) -D RELEASE -D MACOS_BUNDLE -std=c++11 -Wall -Os -framework SDL2 -F ./Frameworks -ffunction-sections -fdata-sections -o "$(releaseFolder)/$(appName).app/Contents/MacOS/$(executable)" -rpath @executable_path/../Frameworks/ -target arm64-apple-macos11 + +# Build APPLE SILICON DMG + rm -f "$(executable)_macos_apple_silicon_$(version).dmg" + hdiutil create tmp.dmg -ov -volname "$(appName)" -fs HFS+ -srcfolder "$(releaseFolder)" + hdiutil convert tmp.dmg -format UDZO -o "$(executable)_macos_apple_silicon_$(version).dmg" + rm tmp.dmg + +# Remove data + rm -rdf Frameworks + rm -rdf "$(releaseFolder)" + linux: - mkdir -p bin - g++ $(source) -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -o bin/$(executable)_linux - strip -s -R .comment -R .gnu.version bin/$(executable)_linux --strip-unneeded -opendingux: - mkdir -p bin - /opt/gcw0-toolchain/usr/bin/mipsel-linux-gcc -D GCWZERO -O2 -std=c++11 -I/opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/include/SDL2 -D_GNU_SOURCE=1 -D_REENTRANT -lSDL2 -lSDL2_mixer -lstdc++ source/*.cpp -o bin/$(executable)_opendingux - /opt/gcw0-toolchain/usr/bin/mksquashfs ./default.gcw0.desktop ./icon.png ./bin ./data ./media coffee_crisis.opk -all-root -noappend -no-exports -no-xattrs \ No newline at end of file + rm -f data/config/config.bin + rm -f data/config/score.bin + g++ $(source) -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -o $(executable)_linux + strip -s -R .comment -R .gnu.version $(executable)_linux --strip-unneeded + +linux_release: +# Remove data + rm -f data/config/config.bin + rm -f data/config/score.bin + rm -rdf $(releaseFolder) + +# Create folders + mkdir -p $(releaseFolder) + +# Copy data + cp -R data $(releaseFolder) + cp LICENSE $(releaseFolder) + cp README.md $(releaseFolder) + +# Build + g++ $(source) -D RELEASE -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -o $(releaseFolder)/$(executable) + strip -s -R .comment -R .gnu.version $(releaseFolder)/$(executable) --strip-unneeded + +# Pack files + cd $(releaseFolder) && tar -czvf ../$(executable)_linux_$(version).tar.gz * + +# Remove data + rm -rdf $(releaseFolder) \ No newline at end of file diff --git a/release/Info.plist b/release/Info.plist new file mode 100644 index 0000000..57e87bb --- /dev/null +++ b/release/Info.plist @@ -0,0 +1,42 @@ + + + + + CFBundleDevelopmentRegion + es + CFBundleDisplayName + coffee_crisis + CFBundleExecutable + coffee_crisis + CFBundleIconFile + coffee_crisis + CFBundleIconName + coffee_crisis + CFBundleIdentifier + org.jailgames.coffee_crisis + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + coffee_crisis + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0.0 + CSResourcesFileMapped + + LSMinimumSystemVersion + 10.12 + NSHighResolutionCapable + + NSHumanReadableCopyright + Copyright 2022 JailDesigner + NSPrincipalClass + NSApplication + SUPublicDSAKeyFile + dsa_pub.pem + + diff --git a/release/SDL2.dll b/release/SDL2.dll new file mode 100755 index 0000000..2282f93 Binary files /dev/null and b/release/SDL2.dll differ diff --git a/release/coffee_crisis.icns b/release/coffee_crisis.icns new file mode 100644 index 0000000..d6c0528 Binary files /dev/null and b/release/coffee_crisis.icns differ diff --git a/source/common/asset.cpp b/source/common/asset.cpp index f00fb2f..807d195 100644 --- a/source/common/asset.cpp +++ b/source/common/asset.cpp @@ -1,9 +1,9 @@ #include "asset.h" // Constructor -Asset::Asset(std::string path) +Asset::Asset(std::string executablePath) { - executablePath = path; + this->executablePath = executablePath.substr(0, executablePath.find_last_of("\\/")); longestName = 0; } diff --git a/source/common/asset.h b/source/common/asset.h index afcabff..accd386 100644 --- a/source/common/asset.h +++ b/source/common/asset.h @@ -46,7 +46,7 @@ private: public: // Constructor - Asset(std::string path); + Asset(std::string executablePath); // Destructor ~Asset(); diff --git a/source/director.cpp b/source/director.cpp index 0416205..14607db 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -11,7 +11,7 @@ Director::Director(std::string path) section.name = PROG_SECTION_LOGO; // Crea el objeto que controla los ficheros de recursos - asset = new Asset(path.substr(0, path.find_last_of("\\/")) + "/../"); + asset = new Asset(path); // Establece la lista de ficheros if (!setFileList()) @@ -160,122 +160,128 @@ bool Director::initSDL() // Crea el indice de ficheros bool Director::setFileList() { +#ifdef MACOS_BUNDLE + const std::string prefix = "/../Resources"; +#else + const std::string prefix = ""; +#endif + // Ficheros de configuración - asset->add("data/config/score.bin", t_data, false); - asset->add("data/config/demo.bin", t_data); - asset->add("data/config/config.bin", t_data, false); - asset->add("data/config/gamecontrollerdb.txt", t_data); + asset->add(prefix + "/data/config/score.bin", t_data, false); + asset->add(prefix + "/data/config/demo.bin", t_data); + asset->add(prefix + "/data/config/config.bin", t_data, false); + asset->add(prefix + "/data/config/gamecontrollerdb.txt", t_data); // Musicas - asset->add("data/music/intro.ogg", t_music); - asset->add("data/music/playing.ogg", t_music); - asset->add("data/music/title.ogg", t_music); + asset->add(prefix + "/data/music/intro.ogg", t_music); + asset->add(prefix + "/data/music/playing.ogg", t_music); + asset->add(prefix + "/data/music/title.ogg", t_music); // Sonidos - asset->add("data/sound/balloon.wav", t_sound); - asset->add("data/sound/bubble1.wav", t_sound); - asset->add("data/sound/bubble2.wav", t_sound); - asset->add("data/sound/bubble3.wav", t_sound); - asset->add("data/sound/bubble4.wav", t_sound); - asset->add("data/sound/bullet.wav", t_sound); - asset->add("data/sound/coffeeout.wav", t_sound); - asset->add("data/sound/hiscore.wav", t_sound); - asset->add("data/sound/itemdrop.wav", t_sound); - asset->add("data/sound/itempickup.wav", t_sound); - asset->add("data/sound/menu_move.wav", t_sound); - asset->add("data/sound/menu_select.wav", t_sound); - asset->add("data/sound/player_collision.wav", t_sound); - asset->add("data/sound/stage_change.wav", t_sound); - asset->add("data/sound/title.wav", t_sound); - asset->add("data/sound/clock.wav", t_sound); - asset->add("data/sound/powerball.wav", t_sound); + asset->add(prefix + "/data/sound/balloon.wav", t_sound); + asset->add(prefix + "/data/sound/bubble1.wav", t_sound); + asset->add(prefix + "/data/sound/bubble2.wav", t_sound); + asset->add(prefix + "/data/sound/bubble3.wav", t_sound); + asset->add(prefix + "/data/sound/bubble4.wav", t_sound); + asset->add(prefix + "/data/sound/bullet.wav", t_sound); + asset->add(prefix + "/data/sound/coffeeout.wav", t_sound); + asset->add(prefix + "/data/sound/hiscore.wav", t_sound); + asset->add(prefix + "/data/sound/itemdrop.wav", t_sound); + asset->add(prefix + "/data/sound/itempickup.wav", t_sound); + asset->add(prefix + "/data/sound/menu_move.wav", t_sound); + asset->add(prefix + "/data/sound/menu_select.wav", t_sound); + asset->add(prefix + "/data/sound/player_collision.wav", t_sound); + asset->add(prefix + "/data/sound/stage_change.wav", t_sound); + asset->add(prefix + "/data/sound/title.wav", t_sound); + asset->add(prefix + "/data/sound/clock.wav", t_sound); + asset->add(prefix + "/data/sound/powerball.wav", t_sound); // Texturas - asset->add("data/gfx/balloon1.png", t_bitmap); - asset->add("data/gfx/balloon1.ani", t_data); - asset->add("data/gfx/balloon2.png", t_bitmap); - asset->add("data/gfx/balloon2.ani", t_data); - asset->add("data/gfx/balloon3.png", t_bitmap); - asset->add("data/gfx/balloon3.ani", t_data); - asset->add("data/gfx/balloon4.png", t_bitmap); - asset->add("data/gfx/balloon4.ani", t_data); - asset->add("data/gfx/bullet.png", t_bitmap); + asset->add(prefix + "/data/gfx/balloon1.png", t_bitmap); + asset->add(prefix + "/data/gfx/balloon1.ani", t_data); + asset->add(prefix + "/data/gfx/balloon2.png", t_bitmap); + asset->add(prefix + "/data/gfx/balloon2.ani", t_data); + asset->add(prefix + "/data/gfx/balloon3.png", t_bitmap); + asset->add(prefix + "/data/gfx/balloon3.ani", t_data); + asset->add(prefix + "/data/gfx/balloon4.png", t_bitmap); + asset->add(prefix + "/data/gfx/balloon4.ani", t_data); + asset->add(prefix + "/data/gfx/bullet.png", t_bitmap); - asset->add("data/gfx/game_buildings.png", t_bitmap); - asset->add("data/gfx/game_clouds.png", t_bitmap); - asset->add("data/gfx/game_grass.png", t_bitmap); - asset->add("data/gfx/game_power_meter.png", t_bitmap); - asset->add("data/gfx/game_sky_colors.png", t_bitmap); - asset->add("data/gfx/game_text.png", t_bitmap); + asset->add(prefix + "/data/gfx/game_buildings.png", t_bitmap); + asset->add(prefix + "/data/gfx/game_clouds.png", t_bitmap); + asset->add(prefix + "/data/gfx/game_grass.png", t_bitmap); + asset->add(prefix + "/data/gfx/game_power_meter.png", t_bitmap); + asset->add(prefix + "/data/gfx/game_sky_colors.png", t_bitmap); + asset->add(prefix + "/data/gfx/game_text.png", t_bitmap); - asset->add("data/gfx/intro.png", t_bitmap); - asset->add("data/gfx/logo.png", t_bitmap); - asset->add("data/gfx/menu_game_over.png", t_bitmap); - asset->add("data/gfx/menu_game_over_end.png", t_bitmap); + asset->add(prefix + "/data/gfx/intro.png", t_bitmap); + asset->add(prefix + "/data/gfx/logo.png", t_bitmap); + asset->add(prefix + "/data/gfx/menu_game_over.png", t_bitmap); + asset->add(prefix + "/data/gfx/menu_game_over_end.png", t_bitmap); - asset->add("data/gfx/item_points1_disk.png", t_bitmap); - asset->add("data/gfx/item_points1_disk.ani", t_data); - asset->add("data/gfx/item_points2_gavina.png", t_bitmap); - asset->add("data/gfx/item_points2_gavina.ani", t_data); - asset->add("data/gfx/item_points3_pacmar.png", t_bitmap); - asset->add("data/gfx/item_points3_pacmar.ani", t_data); - asset->add("data/gfx/item_clock.png", t_bitmap); - asset->add("data/gfx/item_clock.ani", t_data); - asset->add("data/gfx/item_coffee.png", t_bitmap); - asset->add("data/gfx/item_coffee.ani", t_data); - asset->add("data/gfx/item_coffee_machine.png", t_bitmap); - asset->add("data/gfx/item_coffee_machine.ani", t_data); + asset->add(prefix + "/data/gfx/item_points1_disk.png", t_bitmap); + asset->add(prefix + "/data/gfx/item_points1_disk.ani", t_data); + asset->add(prefix + "/data/gfx/item_points2_gavina.png", t_bitmap); + asset->add(prefix + "/data/gfx/item_points2_gavina.ani", t_data); + asset->add(prefix + "/data/gfx/item_points3_pacmar.png", t_bitmap); + asset->add(prefix + "/data/gfx/item_points3_pacmar.ani", t_data); + asset->add(prefix + "/data/gfx/item_clock.png", t_bitmap); + asset->add(prefix + "/data/gfx/item_clock.ani", t_data); + asset->add(prefix + "/data/gfx/item_coffee.png", t_bitmap); + asset->add(prefix + "/data/gfx/item_coffee.ani", t_data); + asset->add(prefix + "/data/gfx/item_coffee_machine.png", t_bitmap); + asset->add(prefix + "/data/gfx/item_coffee_machine.ani", t_data); - asset->add("data/gfx/title_bg_tile.png", t_bitmap); - asset->add("data/gfx/title_coffee.png", t_bitmap); - asset->add("data/gfx/title_crisis.png", t_bitmap); - asset->add("data/gfx/title_dust.png", t_bitmap); - asset->add("data/gfx/title_dust.ani", t_data); - asset->add("data/gfx/title_gradient.png", t_bitmap); + asset->add(prefix + "/data/gfx/title_bg_tile.png", t_bitmap); + asset->add(prefix + "/data/gfx/title_coffee.png", t_bitmap); + asset->add(prefix + "/data/gfx/title_crisis.png", t_bitmap); + asset->add(prefix + "/data/gfx/title_dust.png", t_bitmap); + asset->add(prefix + "/data/gfx/title_dust.ani", t_data); + asset->add(prefix + "/data/gfx/title_gradient.png", t_bitmap); - asset->add("data/gfx/player_head.ani", t_data); - asset->add("data/gfx/player_body.ani", t_data); - asset->add("data/gfx/player_legs.ani", t_data); - asset->add("data/gfx/player_death.ani", t_data); - asset->add("data/gfx/player_fire.ani", t_data); + asset->add(prefix + "/data/gfx/player_head.ani", t_data); + asset->add(prefix + "/data/gfx/player_body.ani", t_data); + asset->add(prefix + "/data/gfx/player_legs.ani", t_data); + asset->add(prefix + "/data/gfx/player_death.ani", t_data); + asset->add(prefix + "/data/gfx/player_fire.ani", t_data); - asset->add("data/gfx/player_bal1_head.png", t_bitmap); - asset->add("data/gfx/player_bal1_body.png", t_bitmap); - asset->add("data/gfx/player_bal1_legs.png", t_bitmap); - asset->add("data/gfx/player_bal1_death.png", t_bitmap); - asset->add("data/gfx/player_bal1_fire.png", t_bitmap); + asset->add(prefix + "/data/gfx/player_bal1_head.png", t_bitmap); + asset->add(prefix + "/data/gfx/player_bal1_body.png", t_bitmap); + asset->add(prefix + "/data/gfx/player_bal1_legs.png", t_bitmap); + asset->add(prefix + "/data/gfx/player_bal1_death.png", t_bitmap); + asset->add(prefix + "/data/gfx/player_bal1_fire.png", t_bitmap); - asset->add("data/gfx/player_arounder_head.png", t_bitmap); - asset->add("data/gfx/player_arounder_body.png", t_bitmap); - asset->add("data/gfx/player_arounder_legs.png", t_bitmap); - asset->add("data/gfx/player_arounder_death.png", t_bitmap); - asset->add("data/gfx/player_arounder_fire.png", t_bitmap); + asset->add(prefix + "/data/gfx/player_arounder_head.png", t_bitmap); + asset->add(prefix + "/data/gfx/player_arounder_body.png", t_bitmap); + asset->add(prefix + "/data/gfx/player_arounder_legs.png", t_bitmap); + asset->add(prefix + "/data/gfx/player_arounder_death.png", t_bitmap); + asset->add(prefix + "/data/gfx/player_arounder_fire.png", t_bitmap); // Fuentes - asset->add("data/font/8bithud.png", t_font); - asset->add("data/font/8bithud.txt", t_font); - asset->add("data/font/nokia.png", t_font); - asset->add("data/font/nokia_big2.png", t_font); - asset->add("data/font/nokia.txt", t_font); - asset->add("data/font/nokia2.png", t_font); - asset->add("data/font/nokia2.txt", t_font); - asset->add("data/font/nokia_big2.txt", t_font); - asset->add("data/font/smb2_big.png", t_font); - asset->add("data/font/smb2_big.txt", t_font); - asset->add("data/font/smb2.png", t_font); - asset->add("data/font/smb2.txt", t_font); + asset->add(prefix + "/data/font/8bithud.png", t_font); + asset->add(prefix + "/data/font/8bithud.txt", t_font); + asset->add(prefix + "/data/font/nokia.png", t_font); + asset->add(prefix + "/data/font/nokia_big2.png", t_font); + asset->add(prefix + "/data/font/nokia.txt", t_font); + asset->add(prefix + "/data/font/nokia2.png", t_font); + asset->add(prefix + "/data/font/nokia2.txt", t_font); + asset->add(prefix + "/data/font/nokia_big2.txt", t_font); + asset->add(prefix + "/data/font/smb2_big.png", t_font); + asset->add(prefix + "/data/font/smb2_big.txt", t_font); + asset->add(prefix + "/data/font/smb2.png", t_font); + asset->add(prefix + "/data/font/smb2.txt", t_font); // Textos - asset->add("data/lang/es_ES.txt", t_lang); - asset->add("data/lang/en_UK.txt", t_lang); - asset->add("data/lang/ba_BA.txt", t_lang); + asset->add(prefix + "/data/lang/es_ES.txt", t_lang); + asset->add(prefix + "/data/lang/en_UK.txt", t_lang); + asset->add(prefix + "/data/lang/ba_BA.txt", t_lang); // Menus - asset->add("data/menu/title.men", t_data); - asset->add("data/menu/options.men", t_data); - asset->add("data/menu/pause.men", t_data); - asset->add("data/menu/gameover.men", t_data); - asset->add("data/menu/player_select.men", t_data); + asset->add(prefix + "/data/menu/title.men", t_data); + asset->add(prefix + "/data/menu/options.men", t_data); + asset->add(prefix + "/data/menu/pause.men", t_data); + asset->add(prefix + "/data/menu/gameover.men", t_data); + asset->add(prefix + "/data/menu/player_select.men", t_data); return asset->check(); } diff --git a/source/title.h b/source/title.h index 3f63c6d..925b612 100644 --- a/source/title.h +++ b/source/title.h @@ -21,7 +21,7 @@ #define TITLE_H // Textos -#define TEXT_COPYRIGHT "@2020,2022 JailDesigner (v2.1a)" +#define TEXT_COPYRIGHT "@2020,2022 JailDesigner (v2.1b)" // Contadores #define TITLE_COUNTER 800