#!/usr/bin/env python3 """ Python script to generate proper Visual Studio project files for YAZE This script creates a comprehensive .vcxproj file with all necessary source files """ import os import sys from pathlib import Path def generate_vcxproj(): """Generate the YAZE.vcxproj file with all source files""" # Source file lists (from CMake files) app_core_src = [ "app/core/controller.cc", "app/emu/emulator.cc", "app/core/project.cc", "app/core/window.cc", "app/core/asar_wrapper.cc", "app/core/platform/font_loader.cc", "app/core/platform/clipboard.cc", "app/core/platform/file_dialog.cc" ] app_emu_src = [ "app/emu/audio/apu.cc", "app/emu/audio/spc700.cc", "app/emu/audio/dsp.cc", "app/emu/audio/internal/addressing.cc", "app/emu/audio/internal/instructions.cc", "app/emu/cpu/internal/addressing.cc", "app/emu/cpu/internal/instructions.cc", "app/emu/cpu/cpu.cc", "app/emu/video/ppu.cc", "app/emu/memory/dma.cc", "app/emu/memory/memory.cc", "app/emu/snes.cc" ] app_editor_src = [ "app/editor/editor_manager.cc", "app/editor/dungeon/dungeon_editor.cc", "app/editor/dungeon/dungeon_room_selector.cc", "app/editor/dungeon/dungeon_canvas_viewer.cc", "app/editor/dungeon/dungeon_object_selector.cc", "app/editor/dungeon/dungeon_toolset.cc", "app/editor/dungeon/dungeon_object_interaction.cc", "app/editor/dungeon/dungeon_renderer.cc", "app/editor/dungeon/dungeon_room_loader.cc", "app/editor/dungeon/dungeon_usage_tracker.cc", "app/editor/overworld/overworld_editor.cc", "app/editor/overworld/overworld_editor_manager.cc", "app/editor/sprite/sprite_editor.cc", "app/editor/music/music_editor.cc", "app/editor/message/message_editor.cc", "app/editor/message/message_data.cc", "app/editor/message/message_preview.cc", "app/editor/code/assembly_editor.cc", "app/editor/graphics/screen_editor.cc", "app/editor/graphics/graphics_editor.cc", "app/editor/graphics/palette_editor.cc", "app/editor/overworld/tile16_editor.cc", "app/editor/overworld/map_properties.cc", "app/editor/graphics/gfx_group_editor.cc", "app/editor/overworld/entity.cc", "app/editor/system/settings_editor.cc", "app/editor/system/command_manager.cc", "app/editor/system/extension_manager.cc", "app/editor/system/shortcut_manager.cc", "app/editor/system/popup_manager.cc", "app/test/test_manager.cc" ] app_gfx_src = [ "app/gfx/arena.cc", "app/gfx/background_buffer.cc", "app/gfx/bitmap.cc", "app/gfx/compression.cc", "app/gfx/scad_format.cc", "app/gfx/snes_palette.cc", "app/gfx/snes_tile.cc", "app/gfx/snes_color.cc", "app/gfx/tilemap.cc" ] app_zelda3_src = [ "app/zelda3/hyrule_magic.cc", "app/zelda3/overworld/overworld_map.cc", "app/zelda3/overworld/overworld.cc", "app/zelda3/screen/inventory.cc", "app/zelda3/screen/title_screen.cc", "app/zelda3/screen/dungeon_map.cc", "app/zelda3/sprite/sprite.cc", "app/zelda3/sprite/sprite_builder.cc", "app/zelda3/music/tracker.cc", "app/zelda3/dungeon/room.cc", "app/zelda3/dungeon/room_object.cc", "app/zelda3/dungeon/object_parser.cc", "app/zelda3/dungeon/object_renderer.cc", "app/zelda3/dungeon/room_layout.cc", "app/zelda3/dungeon/dungeon_editor_system.cc", "app/zelda3/dungeon/dungeon_object_editor.cc" ] gui_src = [ "app/gui/modules/asset_browser.cc", "app/gui/modules/text_editor.cc", "app/gui/canvas.cc", "app/gui/canvas_utils.cc", "app/gui/enhanced_palette_editor.cc", "app/gui/input.cc", "app/gui/style.cc", "app/gui/color.cc", "app/gui/zeml.cc", "app/gui/theme_manager.cc", "app/gui/background_renderer.cc" ] util_src = [ "util/bps.cc", "util/flag.cc", "util/hex.cc" ] # Combine all source files all_source_files = ( ["yaze.cc", "app/main.cc", "app/rom.cc"] + app_core_src + app_emu_src + app_editor_src + app_gfx_src + app_zelda3_src + gui_src + util_src ) # Header files header_files = [ "incl/yaze.h", "incl/zelda.h", "src/yaze_config.h.in" ] # Generate the .vcxproj file content vcxproj_content = ''' Debug x64 Debug x86 Debug ARM64 Release x64 Release x86 Release ARM64 RelWithDebInfo x64 RelWithDebInfo x86 RelWithDebInfo ARM64 MinSizeRel x64 MinSizeRel x86 MinSizeRel ARM64 17.0 {B2C3D4E5-F6G7-8901-BCDE-F23456789012} Win32Proj YAZE 10.0 YAZE true true x86-windows x64-windows arm64-windows Application true v143 Unicode Application true v143 Unicode Application true v143 Unicode Application false v143 true Unicode Application false v143 true Unicode Application false v143 true Unicode Application false v143 true Unicode Application false v143 true Unicode Application false v143 true Unicode Application false v143 true Unicode Application false v143 true Unicode Application false v143 true Unicode true $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ true $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ true $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ false $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ false $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ false $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ false $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ false $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ false $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ false $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ false $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ false $(SolutionDir)build\\bin\\$(Configuration)\\ $(SolutionDir)build\\obj\\$(Configuration)\\ ''' # Add compiler and linker settings for all configurations configurations = ["Debug", "Release", "RelWithDebInfo", "MinSizeRel"] platforms = ["x64", "x86", "ARM64"] for config in configurations: for platform in platforms: is_debug = (config == "Debug") debug_flags = "_DEBUG;_CONSOLE;%(PreprocessorDefinitions)" if is_debug else "NDEBUG;_CONSOLE;%(PreprocessorDefinitions)" link_incremental = "true" if is_debug else "false" generate_debug_info = "false" if config == "MinSizeRel" else "true" vcxproj_content += f''' Level3 true {debug_flags} true $(ProjectDir)src;$(ProjectDir)incl;$(ProjectDir)src\\lib;$(ProjectDir)src\\lib\\asar\\src;$(ProjectDir)src\\lib\\asar\\src\\asar;$(ProjectDir)src\\lib\\asar\\src\\asar-dll-bindings\\c;$(ProjectDir)src\\lib\\imgui;$(ProjectDir)src\\lib\\imgui_test_engine;%(AdditionalIncludeDirectories) stdcpp23 true true MultiThreaded{"Debug" if is_debug else ""}DLL Console {generate_debug_info} {"false" if is_debug else "true"} {"false" if is_debug else "true"} ''' # Add source files vcxproj_content += ''' ''' for header in header_files: vcxproj_content += f' \n' vcxproj_content += ''' ''' for source in all_source_files: vcxproj_content += f' \n' vcxproj_content += ''' ''' return vcxproj_content def generate_solution(): """Generate the YAZE.sln file""" return '''Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "YAZE", "YAZE.vcxproj", "{B2C3D4E5-F6G7-8901-BCDE-F23456789012}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Debug|ARM64 = Debug|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 Release|ARM64 = Release|ARM64 RelWithDebInfo|x64 = RelWithDebInfo|x64 RelWithDebInfo|x86 = RelWithDebInfo|x86 RelWithDebInfo|ARM64 = RelWithDebInfo|ARM64 MinSizeRel|x64 = MinSizeRel|x64 MinSizeRel|x86 = MinSizeRel|x86 MinSizeRel|ARM64 = MinSizeRel|ARM64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Debug|x64.ActiveCfg = Debug|x64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Debug|x64.Build.0 = Debug|x64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Debug|x86.ActiveCfg = Debug|x86 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Debug|x86.Build.0 = Debug|x86 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Debug|ARM64.ActiveCfg = Debug|ARM64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Debug|ARM64.Build.0 = Debug|ARM64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Release|x64.ActiveCfg = Release|x64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Release|x64.Build.0 = Release|x64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Release|x86.ActiveCfg = Release|x86 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Release|x86.Build.0 = Release|x86 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Release|ARM64.ActiveCfg = Release|ARM64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.Release|ARM64.Build.0 = Release|ARM64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x86 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x86 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|ARM64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.RelWithDebInfo|ARM64.Build.0 = RelWithDebInfo|ARM64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x86 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.MinSizeRel|x86.Build.0 = MinSizeRel|x86 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|ARM64 {B2C3D4E5-F6G7-8901-BCDE-F23456789012}.MinSizeRel|ARM64.Build.0 = MinSizeRel|ARM64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {A1B2C3D4-E5F6-7890-ABCD-EF1234567890} EndGlobalSection EndGlobal''' def main(): """Main function to generate Visual Studio project files""" print("Generating Visual Studio project files for YAZE...") # Get the project root directory script_dir = Path(__file__).parent project_root = script_dir.parent # Generate .vcxproj file vcxproj_content = generate_vcxproj() vcxproj_path = project_root / "YAZE.vcxproj" with open(vcxproj_path, 'w', encoding='utf-8') as f: f.write(vcxproj_content) print(f"Generated: {vcxproj_path}") # Generate .sln file solution_content = generate_solution() solution_path = project_root / "YAZE.sln" with open(solution_path, 'w', encoding='utf-8') as f: f.write(solution_content) print(f"Generated: {solution_path}") print("Visual Studio project files generated successfully!") print("") print("To build:") print("1. Open YAZE.sln in Visual Studio 2022") print("2. Ensure vcpkg is installed and configured") print("3. Select your desired configuration (Debug/Release) and platform (x64/x86/ARM64)") print("4. Build the solution (Ctrl+Shift+B)") if __name__ == "__main__": main()