PyMO AVG Game Engine implemention in C.

Overview
   __________        __  _______
  / ____/ __ \__  __/  |/  / __ \
 / /   / /_/ / / / / /|_/ / / / /
/ /___/ ____/ /_/ / /  / / /_/ /
\____/_/    \__, /_/  /_/\____/
           /____/                                                  

BANNER

LICENSE

此项目仅用于您运行合法持有的游戏软件副本,持有盗版副本可能会让您面临法律问题。
这是一个使用C实现的pymo引擎的复刻,以方便在各种平台上制作并运行pymo游戏。

如果你需要使用CPyMO制作游戏,可以参见CPyMO + YukimiScript开发模板

pymo原版参见:https://github.com/pymo/pymo

平台支持列表

第一梯队

CPyMO主要在这些平台上开发,并将主要在这些平台上进行测试和除错。

平台 后端 视频播放器 音频支持 字体支持 额外功能
Windows SDL2 FFmpeg FFmpeg, SDL2_mixer 加载系统字体 视障帮助
Nintendo 3DS 3DS FFmpeg FFmpeg 自带字体 游戏选择器

第二梯队

CPyMO可以编译到这些平台,保证全部功能可用,但不保证用户体验,也没有进行全面的测试。

平台 后端 视频播放器 音频支持 字体支持 额外功能
Linux SDL2 FFmpeg FFmpeg, SDL2_mixer 外置字体 视障帮助
macOS SDL2 FFmpeg FFmpeg, SDL2_mixer 加载系统字体 视障帮助
Nintendo Switch SDL2 FFmpeg FFmpeg 加载系统字体 游戏选择器
UWP SDL2 FFmpeg FFmpeg 加载系统字体 游戏选择器
Emscripten SDL2 FFmpeg FFmpeg, SDL2_mixer 外置字体
Android SDL2 FFmpeg FFmpeg 外置字体 游戏选择器

第三梯队

CPyMO可以编译到这些平台,但可能有部分次要功能不可用。

平台 后端 视频播放器 音频支持 字体支持 额外功能
Sony PSP SDL2 不支持 SDL2_mixer(仅支持BGM通道) 外置字体 游戏选择器
Sony PSV SDL2 FFmpeg FFmpeg 外置字体 游戏选择器
Windows 95 SDL 1.2 FFmpeg FFmpeg, SDL_mixer 加载系统字体
macOS (SDL 1.2) SDL 1.2 FFmpeg FFmpeg, SDL_mixer 加载系统字体
Linux (SDL 1.2) SDL 1.2 FFmpeg FFmpeg, SDL_mixer 外置字体
POSIX (ASCII ART) ASCII ART 不支持 不支持 外置字体 在控制台上操作并输出画面
注:SDL2_mixer音频后端仅支持在BGM通道播放MP3文件,其余通道不支持。

与pymo行为差异

  • CPyMO的存档位置和存档格式与pymo不同,不能与之互换。
  • CPyMO最小音频支持仅包含OGG格式,且CPyMO不会考虑MID格式的音频播放。
  • CPyMO的蒙版渐变动画效果与PyMO不同。
  • 涉及动画时间曲线的部分CPyMO均做了缓动效果,而pymo则使用线性效果。
  • CPyMO的菜单和UI与PyMO不同。
  • CPyMO在可以播放视频的情况下比pymo支持更多编码格式的视频。
  • CPyMO不支持预载,预载选项会被CPyMO直接忽略。
  • CPyMO忽略除字体大小以外所有的字体设置,将自动启用字体阴影和字体反锯齿。

由SDL2支持的桌面平台 (Windows、Linux与macOS)

额外依赖

你需要使用vcpkg包管理器安装以下依赖:

  • SDL2
  • ffmpeg

如果你使用Microsoft Visual Studio,默认的CMakeSettings.json中指示的依赖版本为x64-windows-static。

如果你需要在macOS上运行,那么你需要首先安装libxcb:

brew install libxcb

视障帮助功能

github action及release上的版本默认会开启视障帮助功能,如果你需要禁用视障帮助功能,可在编译时定义宏NON_VISUALLY_IMPAIRED_HELP.

视障帮助功能将会把游戏中的文本复制到剪切板供读屏软件读取。

全屏

按下Alt + Enter键可在全屏/窗口模式中切换。

在Windows下使用nmake进行构建

首先你需要确保:

  • 你已经构建了当前平台的SDL2库,并将二进制目录(含有include和lib文件夹)设置为环境变量%SDL2%(或通过nmake的-a参数传入)。
  • 你已经构建了当前平台的FFmpeg库,并将二进制目录(含有include和lib文件夹)设置为环境变量%FFMPEG%(或通过nmake的-a参数传入)。
  • 已经安装了某一版本的Windows SDK和MSVC编译器工具链。

关于音频支持,将会按照以下路径进行检查:

  • 将会首先检查环境变量FFMPEG是否存在,它需要指向FFMPEG二进制库目录,如果存在则会编译生成依赖于FFMPEG并带有播放视频功能的CPyMO。
  • 如果FFMPEG环境变量不存在,则会检查环境变量SDL2_MIXER是否存在,它需要指向SDL2_MIXER的二进制库目录,如果存在则编译生成依赖于SDL2_MIXER的CPyMO。
  • 如果两个环境变量均不存在则编译生成不能播放音频和视频文件的CPyMO。

除此之外,你还可以使用以下编译开关:

  • NO_CONSOLE环境变量存在或通过-a传入并设置为1,则禁用命令行窗口,使得CPyMO仅创建一个游戏窗口。
  • NON_VISUALLY_IMPAIRED_HELP环境变量存在或通过-a传入并设置为1,则禁用视障帮助功能。
  • RC_FILE环境变量存在或通过-a传入,则允许传入用户指定的资源文件(主要用于修改图标)。
  • TARGET环境变量存在或通过-a传入,则允许用户通过TARGET指定输出的可执行文件名称。

之后启动Visual Studio开发人员命令提示符,使用cd命令进入cpymo-backends/sdl2目录,执行nmake -f Makefile.Win32即可构建CPyMO。

使用GNU Make进行构建

  1. 你需要安装SDL2,可以选择直接安装libsdl2-dev,或者将SDL2的预编译二进制库存入环境变量SDL2中。
  2. 如果你需要使用FFmpeg播放音频和视频,可以选择安装以下库,或者将其预编译的二进制库存入环境变量FFmpeg中:
    • libavformat-dev
    • libavutil-dev
    • libavcodec-dev
    • libswscale-dev
    • libswresample-dev
  3. 如果你需要使用SDL2_mixer播放音频,则可以选择安装libsdl2-mixer-dev,或者将SDL2_mixer的预编译二进制库存入环境变量SDL2_mixer中,并定义环境变量export USE_SDL2_MIXER=1.
  4. 如果你不想播放音视频,可直接定义export DISABLE_AUDIO=1
  5. 如果你不想使用视障帮助功能,则可以定义export NON_VISUALLY_IMPAIRED_HELP=1
  6. 通过定义TARGET环境变量来指定输出文件名的名称。
  7. 执行make -j即可产生可执行文件。

Nintendo 3DS 平台

在Universal Updater应用商店中查看

额外依赖

  • devkitPro + 3ds dev
  • FFmpeg 5.0

编译3DS用的FFmpeg依赖

在终端或devkitPro的MSYS2控制台(如果你使用Windows的话),cd到cpymo-backends/3ds/目录下,执行./build-3ds-ffmpeg.sh,这将为3DS编译FFmpeg。

产生3dsx与cia文件

./cpymo-backends/3ds/目录下执行make即可生成3dsx程序。

如果你需要创建cia文件,首先需要确保已经安装了makerom命令,之后在./cpymo-backends/3ds/下执行make cia即可。

你可以在 https://github.com/3DSGuy/Project_CTR 找到makerom的可执行文件。

启动

你需要将你的游戏放置于SD卡的/pymogames/下,保证路径中只有半角英文、数字和下划线,之后该游戏便会被CPyMO for 3DS检测到。
如果你已经安装了Citra且citra命令可用,你可以直接使用make run来调用Citra模拟器来启动CPyMO。

CPyMO for 3DS支持3D显示,可使用3D滑块来打开3D显示功能。
按下START键可以快速退出CPyMO。
按下SELECT键在四种屏幕模式之间切换。 ZL和ZR键功能和A、Y键相同,用于单手操作。

以调试模式启动

如果你需要查看CPyMO控制台,你需要在游戏列表中按住L键,同时按下A键选择游戏,即可激活调试模式。
在这种模式下,下屏会显示CPyMO控制台,Start键将不再可用,对话文本会被强制显示在上屏。

如果无法启动CIA版本的话?

  1. 目前仅在New 3DS日版(系统版本号Ver 11.15.0-47J)上对CIA版本进行过测试。
  2. 如果你的机器在运行CIA版本的CPyMO时崩溃,请尝试切换到3dsx版。

如何启动3DSX版本?

  1. 将cpymo.3dsx放入SD卡的3ds目录下。
  2. 启动Homebrew Launcher,建议使用这里的Homebrew Launcher Dummy(https://github.com/PabloMK7/homebrew_launcher_dummy )。
  3. 执行cpymo.3dsx。

在3DS中没有声音?

你需要确保已经Dump了3DS的DSP固件。
如果你没有Dump,那么你需要先安装DSP1(https://github.com/zoogie/DSP1/releases/tag/v1.0 ),并使用它Dump你的3DS的DSP固件。

为3DS适配游戏

如果你需要为3DS适配PyMO游戏,那么建议你使用以下参数:

  • 分辨率:400×240
  • 音频格式:ogg,16bit signed little-endian,32000Hz
  • 背景格式:jpg
  • 其他图片:带透明通道的png,不要使用额外的mask灰阶图片
  • platform参数:pygame
  • 默认字体大小:28
  • 视频格式:H264 MP4,低于30FPS,Old 3DS请不要使用视频

关于字体

3DS版本的CPyMO不会加载游戏中自带的字体或者其他TTF字体,而是使用思源黑体
思源黑体已经被转换为可以被3DS直接识别的bcfnt格式,CPyMO for 3DS中的思源黑体将会按照其原本的SIL协议随CPyMO for 3DS一起分发。

如果自带的字体不能满足你的需求,那么你可以将bcfnt格式的字体放入SD卡中的/pymogames/font.bcfnt路径处,CPyMO将会优先加载这个字体。

Nintendo Switch 平台

额外依赖

  • devkitPro + switch dev
  • switch-sdl2
  • switch-ffmpeg

直接使用devkitPro pacman安装即可。

编译

cd到cpymo-backends/sdl2,执行make -j -f Makefile.Switch即可编译到任天堂Switch平台。
使用make run -j -f Makefile.Swtich即可使用yuzu模拟器运行。

启动

将游戏放入SD卡的/pymogames/目录即可。

自定义字体

将字体文件改名为default.ttf放入/pymogames/目录即可加载该字体文件。

默认将会加载Switch自带的字体。

为Switch适配游戏

如果你需要为Switch适配游戏,那么建议你使用以下参数:

  • 分辨率:1920×1080
  • 音频格式:ogg,32bit signed float little-endian,48000Hz
  • 图片格式:带透明通道的png,不要使用mask灰阶图片
  • platform参数:pygame
  • 视频格式:H264 MP4

Sony Playstation Portable 平台

PSP平台的CPyMO仅能运行s60v3数据包或下述“适配”的包。

额外依赖

  • pspdev/pspdev
  • psp-sdl2(已经包括到pspdev中)
  • psp-sdl2_mixer(已经包括到pspdev中)
  • psp-libvorbis(已经包括到pspdev中)
  • psp-libogg(已经包括到pspdev中)

编译

cd到cpymo-backends/sdl2,执行make -f Makefile.PSP即可编译到索尼PSP平台。

启动

将EBOOT.PBP、游戏文件夹和default.ttf放在一起。
你需要自己准备可以使用的default.ttf,CPyMO将会加载这个文件作为字体使用。

在使用PPSSPP模拟器的情况下,你需要关闭“系统设置 - 快速内存访问”,并开启“忽略读写错误”。

缺陷

这些缺陷将不会得到修复:

  • 由于PSP生态中没有移植的FFmpeg库
    • 视频播放器功能已经禁用
    • 音频播放使用SDL2_mixer后端
      • 音频不支持mp3格式
  • 由于PSP机能有限
    • 仅能加载s60v3数据包或下述推荐的PSP数据包
    • 在放入太多游戏时将无法加载游戏列表
    • 加载音效和语音可能会导致内存占用过高,故禁用音效和语音
    • 将不会在启动游戏时加载游戏目录下的system/default.ttf字体
  • 由于stb_image会在PSP中崩溃
    • 某些情况下使用icon.png会导致崩溃,如果出现了这种情况请删除icon.png
  • 由于SDL2 for PSP存在问题
    • 游戏将会在屏幕左上角显示,而不是居中显示
  • PPSSPP的“快速内存访问”可能存在问题
    • 目前仅可在PPSSPP在关闭“快速内存访问”时才可以正常启动
  • 由于本人不会编写makefile :(
    • Makefile.PSP将会把.o文件弄得到处都是

为PSP适配游戏

如果你需要为PSP适配游戏,那么建议你使用以下参数:

  • 分辨率:480×272
  • 背景、立绘图像:jpg,立绘图像应当带jpg格式的透明通道mask图
  • 系统图像:png,带mask图
  • 声音格式:ogg, 16bit signed little-endian, 44100Hz
  • platform参数:s60v3
  • 不支持的内容:
    • 视频
    • 音效(se)

利用pymo-converter从PyMO Android版本数据包创建psp版本的数据包

  1. 你需要安装cpymo-tool到你的系统中(添加到PATH环境变量),确保该命令可用。
  2. 下载pymo-converter.ps1。
  3. 使用命令行pymo-converter.ps1 psp <PyMO Android版本数据包路径> <输出的PSP版本的数据包路径>。
  4. 手动转换BGM音频为ogg格式,并修改gameconfig.txt中bgmformat一栏为.ogg,如果原本就是ogg格式则无需修改。
  5. 手动转换VO音频为ogg格式,并修改gameconfig.txt中的voformat一栏为.ogg,如果原本就是ogg格式则无需修改。

Sony Playstation Vita 平台

额外依赖

  1. 你需要安装vdpm,并使用其安装vitasdk。
  2. 通过命令行vdpm sdl2安装SDL2。
  3. cd到cpymo-backends/sdl2下执行./build-psv-ffmpeg.sh编译FFmpeg,注意这个版本和vdpm中的ffmpeg使用的剪裁参数不同,不要使用vdpm中的ffmpeg。

编译

cpymo-backends/sdl2下执行make -f Makefile.PSV即可得到CPyMO.vpk。

安装

安装CPyMO.vpk之后,你还需要在ux0:/pymogames目录下放置default.ttf和游戏文件。

为PSV适配游戏

如果你需要为PSV适配游戏,那么建议你使用以下参数:

  • 分辨率:960×544
  • 图像:带透明通道的png,不要使用mask灰阶图片
  • 声音:ogg,16bit signed,little endian,44100Hz

Emscripten 平台

你可以使用Emscripten将CPyMO编译到Web Assembly或者JavsScript。

在这里你可以找到部署在Github Pages上的Demo

编译

cpymo-backends/sdl2下修改Makefile.Emscripten.

变量WASM设置为1时编译到 Web Assembly 二进制文件,为0时编译到 JavaScript。
变量BUILD_GAME_DIR指定要集成的游戏目录,留空则不集成游戏。
以上两个变量可通过环境传入。

默认编译出的结果将不支持视频播放,并且采用SDL2_mixer作为音频后端(只能在BGM通道播放mp3,其他通道不支持mp3),默认采用这种方式是出于编译结果大小的考虑。

  • 如果你需要播放MP3格式的语音或音效,或者需要播放视频,那么你需要在编译前执行:
    1. cpymo-backends/sdl2目录下执行build-emscripten-ffmpeg.sh
    2. 执行export AUDIO_BACKEND=ffmpeg启动FFmpeg音视频后端。
  • 如果你完全不需要音视频功能,可以执行export AUDIO_BACKEND=none关闭音视频功能以降低编译结果大小。

游戏目录中必须存在/system/default.ttf作为游戏字体使用。

之后使用make -j即可构建。

启动

仅当集成了游戏时,可通过make run -j来使用emrun启动CPyMO。

Android 平台

仅支持 Android 4.3 及以上的系统。

编译

  1. cd到cpymo-backends/android后执行./build-android-ffmpeg.sh以构建FFmpeg。
  2. 使用Android Studio打开cpymo-backends/android即可构建APK。

启动

  1. 安装CPyMO,并在“设置 - 应用 - CPyMO”中允许其一切权限。
  2. 在绝对路径/sdcard/pymogames//storage/emulated/0/pymogames/中放置default.ttf和游戏文件夹。
  3. 启动CPyMO。

Universal Windows Platform 平台

最低支持Windows 10 (10.0.10240.0)。

编译

前置条件:

  • 已经安装vcpkg,并安装以下包:
    • ffmpeg:x86-uwp
    • ffmpeg:x64-uwp
    • ffmpeg:arm-uwp
  • 已经安装Visual Studio,并安装以下组件:
    • 使用C++的通用Windows平台开发

使用Visual Studio 2022打开解决方案cpymo-backends/sdl2/uwp/CPyMO.sln即可编译。

启动

你的游戏需要放置在文件夹%LOCALAPPDATA%\Packages\7062935b-c643-4df5-97d1-2744bf120181_*\LocalState中。

其中*的部分可能会不同,找到符合这个模式的目录即可。

之后从开始菜单启动CPyMO。

CPyMO ASCII ART

这是一个CPyMO变种,没有音频和视频播放器支持,它将会在控制台上输出画面,Just for fun!

编译

如果你需要编译到Windows,那么你应该使用MinGWMSYS2来构建它。

cd到cpymo-backends/ascii-art,执行makemingw32-make即可生成可执行文件。

启动

参见CPyMO Desktop的启动方式。

注意:光敏性癫痫患者请不要使用该版本。
注意:Windows上控制台输出效率较低,帧率可能会很差,建议使用Linux来执行该程序。

CPyMO ASCII ART仅支持键盘操作:

  • WSAD为方向键
  • J或空格为确认
  • K为取消
  • L为快进

使用CPyMO开发新游戏

我们推荐你使用YukimiScript作为开发语言,当然也可以使用传统PyMO游戏的开发方式。

CPyMO-YukimiScript-Template是一套使用YukimiScript语言和Pipe构建系统的CPyMO项目模板,我们建议你基于它来开发游戏。

除此之外,我们建议你使用以下格式:

  • 分辨率:CPyMO没有分辨率限制,你可以根据自己的需要选择分辨率
  • 音频:ogg,48000Hz,16bit signed
    • 注:CPyMO仅保证wav和ogg两种格式在所有平台上都可识别。
  • 视频:mp4
    • 注:CPyMO不保证所有平台都可以播放视频。
  • 图片:png

如果你需要生成特定于平台的包,你可以先创建发布包,然后再使用pymo-converter工具将其转换为各个平台上通用的包。

将CPyMO移植到其他平台

CPyMO由一套完全跨平台的通用代码和适配于多平台的“后端”组成。

通用代码放在cpymo文件夹中,后端放在cpymo-backends文件夹中。

其中cpymo-backends/include中的代码规定了每个后端都应当实现的接口。

通用部分

视障帮助

使用宏NON_VISUALLY_IMPAIRED_HELP可以关闭视障帮助功能。

音频系统

使用宏DISABLE_FFMPEG_AUDIO可关闭音频播放器对FFmpeg的依赖,你需要替换成自己的音频系统实现。

使用宏DISABLE_AUDIO可完全关闭音频系统。

视频播放器

使用宏DISABLE_FFMPEG_MOVIE可关闭视频播放器对FFmpeg的依赖,你可以替换为自己的error_t cpymo_movie_play(cpymo_engine * e, cpymo_parser_stream_span videoname)函数进行视频播放。

使用宏DISABLE_MOVIE可完全播放所有的视频播放功能。

低帧率模式

某些设备可能刷新屏幕会造成闪烁,需要尽可能减少屏幕刷新,这时可定义LOW_FRAME_RATE宏来启用低帧率模式,它将关闭动画效果并显著减少刷新次数。

SDL2后端

SDL2后端在目录cpymo-backends/sdl2中。

解除FFmpeg依赖

某些平台上FFmpeg难以编译,同时定义DISABLE_FFMPEG_AUDIODISABLE_FFMPEG_MOVIE即可彻底对解除FFmpeg的依赖,并替换为你的音频视频后端。

如果你只想解除FFmpeg依赖,并且不想提供后端,则可通过同时定义DISABLE_AUDIODISABLE_MOVIE来彻底关闭音频和视频播放器支持。

SDL2_mixer音频后端

如果你想解除FFmpeg依赖后依然可以播放音频,可以考虑启动SDL2_mixer音频后端支持。
SDL2_mixer音频后端可能无法播放mp3格式的语音和音效。

启用SDL2_mixer音频后端之前,必须禁用FFmpeg视频播放器:

  • 定义DISABLE_FFMPEG_MOVIE来替换为自己的视频播放后端
  • 或者定义DISABLE_MOVIE彻底关闭视频播放器功能

之后定义:

  1. 定义DISABLE_FFMPEG_AUDIO关闭FFmpeg音频依赖
  2. 定义ENABLE_SDL2_MIXER_AUDIO_BACKEND启用SDL2_Mixer音频后端。

如果你的设备上SDL_mixer中Mix_Music不能正常工作,则可以使用DISABLE_SDL2_MIXER_MUSIC宏将其替换为使用Mix_Chunk来播放BGM。

全屏切换

定义宏ENABLE_ALT_ENTER_FULLSCREEN可启用按下Alt+Enter键切换全屏的功能。

游戏选择器

使用宏USE_GAME_SELECTOR可启用游戏选择器。
一旦使用游戏选择器:

  • 你需要修改main.c中的static char *get_last_selected_game_dir()以获取上一次启动的游戏。
  • 你需要修改main.c中的cpymo_game_selector_item *get_game_list()以获取游戏列表。
  • 你需要定义宏SCREEN_WIDTHSCREEN_HEIGHT来定义屏幕宽度和高度。
  • 你需要定义以下宏以布局游戏选择器UI:
    • GAME_SELECTOR_FONTSIZE
    • GAME_SELECTOR_EMPTY_MSG_FONTSIZE
    • GAME_SELECTOR_COUNT_PER_SCREEN
  • 定义宏GAME_SELECTOR_DIR以游戏选择目录。

加载系统字体

定位到cpymo_backend_font.c中的函数error_t cpymo_backend_font_init(const char *gamedir),向此函数添加用于加载系统字体的代码。

SDL 1.2后端

该后端用于兼容较为老旧的平台。

SDL 1.2的Alpha混合与缩放功能受限,将不会支持已有透明图层的Alpha变化,同时也禁用了右键菜单的背景缩放功能。

此外,SDL 1.2后端使用了SDL2后端的cpymo_backend_font.ccpymo_backend_save.c

桌面版本 (Windows 95/98/Me/2000/XP, Unix)

这里的产生的版本支持较旧的Windows和Unix-like操作系统。

如果你使用Windows,那么你将只能使用msys2和mingw来编译。

你可以使用以下环境变量来修改开关:

  • USE_FFMPEG,此变量为1时将会连接到FFmpeg库,并启用FFmpeg音视频支持。
  • USE_FFMPEG不为1时,若USE_SDL_MIXER为1将连接到SDL_MIXER,仅启动受限的音频支持。
  • 可以使用SDL环境变量传入使用自定义SDL二进制库目录,如果不传入则使用系统安装的库。

之后在cpymo-backends/sdl1中执行make即可启动。

使用宏适配目标系统

  • 画面
    • FAST_FILL_RECT定义后,填充矩形时将禁用Alpha混合并提升性能。
    • SCREEN_BPP可以定义为8、16、24、32以选择游戏画面的位深度(可选)。
    • SCREEN_WIDTH将设置游戏起始画面宽度,如果你使用了游戏选择器,则必须定义此项,并且必须和SCREEN_HEIGHT一起定义。
    • SCREEN_HEIGHT将设置游戏起始画面高度,如果你使用了游戏选择器,则必须定义此项,并且必须和SCREEN_WIDTH一起定义。
    • SCREEN_FLAGS可定义SDL_SetVideoModeflags参数。
    • SCREEN_RESIZABLE定义时,将允许调整游戏窗口大小。
    • TOGGLE_FULLSCREEN定义时,将允许用户通过Alt+Enter键切换全屏。
  • FFmpeg支持的音频系统
    • DEFAULT_CHANNELS将设置默认音频输出通道数。
    • DEFAULT_FREQ将设置默认音频输出的频率。
    • DEFAULT_SAMPLES将设置默认缓冲区大小(以采样为单位)。
  • ENABLE_SDL_MIXER_AUDIO_BACKEND宏将启用SDL_Mixer音频后端,在这之前需要先定义DISABLE_FFMPEG_AUDIO
    • SDL_MIXER_FREQ将设置音频的默认输出频率(可选)。
    • SDL_MIXER_CHANNELS将设置音频默认输出的通道数(可选)。
    • SDL_MIXER_CHUNKSIZE将设置缓冲区大小(可选)。
  • LOAD_GAME_ICON定义时,将加载游戏图标,此项目与USE_GAME_SELECTOR冲突。

工具

cpymo-tool

该工具用于开发PyMO游戏,与原版PyMO工具完全兼容,它提供以下功能:

  • PyMO数据包打包
  • PyMO数据包解包
  • 游戏图片缩放

启动此程序即可看到详细用法。

构建cpymo-tool

你可以选择以下三种方式之一来构建cpymo-tool:

  1. 直接使用CMake构建整个项目。
  2. 使用GNU Make在cpymo-tool目录中执行make命令。
  3. 使用Microsoft NMake在cpymo-tool目录中执行nmake -f Makefile.Win32命令构建。

pymo-converter

该工具用于将高分辨率的PyMO游戏数据包转换为适配各种低性能设备的PyMO游戏数据包。
要使用该工具,需要确保你已经安装了最新版本的PowerShell,并已经将cpymo-toolffmpegpymo-convert-audio-to-ogg安装到命令行中。

pymo-converter目前支持将游戏适配到以下设备:

  • s60v3
  • s60v5
  • pymo-android
  • 3ds
  • psp
  • psv

pymo-convert-audio-to-ogg

由于某些平台上的CPyMO对音频格式支持有限,该脚本可以将所有的音频转换为ogg格式,在运行此脚本前需要确保已经将cpymo-tool和ffmpeg安装到命令行中。

mo2pymo

该工具用于将特定mo1、mo2游戏转换为PyMO游戏。

pymo2ykm

该工具用于将PyMO脚本语言编译到YukimiScript语言。

libpymo

该工具用于将PyMO API公开到YukimiScript语言中,
使得YukimiScript语言可以访问PyMO/CPyMO引擎的各项功能。

贡献者

  • PyMO原作者
    • chen_xin_ming
  • CPyMO主要作者
    • 许兴逸
  • 协助
    • 守望
    • heiyu04
  • 测试
    • 幻世
    • °SARTINCE。
    • 白若秋
    • 卢毅
    • benhonjen
    • 镜面倾斜
    • 七月缘
    • __

赞助

如果您有兴趣推动本软件的发展,可以对我们进行赞助。

弦语蝶梦独立游戏工作室 开源软件事业

您可以在爱发电对我们进行赞助:

https://afdian.net/order/create?user_id=4ffe65ae104a11ec9bdf52540025c377

本软件主要作者 许兴逸

您可以通过支付宝或微信对本软件主要作者许兴逸进行赞助:

alipay wechat

帮助我们移植到更多平台

如果您有兴趣帮助我们移植到更多平台,您可以考虑向本软件主要作者许兴逸以借用的形式寄送您需要移植CPyMO的设备。
我们将会评估该平台是否适用CPyMO,在移植和测试工作完成后,该设备将会被退还。

我们无意于为私人开发的硬件平台进行移植,您所提供的设备必须是在市场上占有一定份额的平台。

详细信息您可以联系QQ853974536(许兴逸)

如果您有兴趣,您可以直接向仓库推送支持平台的pull request,但我们不会接受:

  • 移植到私人开发的硬件平台的补丁
  • 含有AGPL不兼容的代码的补丁
  • 导致CPyMO与PyMO不再兼容的补丁
  • 代码与文字说明不符合的补丁
  • 其他有争议的内容
Issues
  • [Bug]: 运行时闪退

    [Bug]: 运行时闪退

    基本信息

    CPyMO运行环境

    • CPyMO版本:3DS CIA/3DS 3DSX
    • 3DS设备:N3DSLL(XL)(如果不是3DS设备请删去此项)

    详细描述

    没有放入游戏时会提示没有游戏,一放入游戏再运行软件就会出现系统崩溃,出现以下提示: Exception:data abort Fault status:Translation - Section (没有手机没法拍照)

    报错日志 crash_dump_00000000.zip

    bug problem 
    opened by zhishixiang 20
  • [Compatibility]:  天使的星期日 显示不了某些字

    [Compatibility]: 天使的星期日 显示不了某些字

    基本信息

    CPyMO运行环境

    • CPyMO版本:3DS CIA
    • 3DS设备:2DSLL(XL) (如果不是3DS设备请删去此项)

    兼容性不佳的应用程序信息

    • 不能运行的PyMO应用程序名称:天使的星期日
    • 可能发生错误的脚本文件名称:
    • 可能的行号:
    • 应用程序数据包版本:s60v3
    • 问题类型:图像瑕疵/CPyMO报告错误后退出/CPyMO报告错误后运行不正常/致命性错误导致3DS崩溃或在其他平台上不正确退出/性能较差

    详细描述

    天使的星期日 在3ds有显示不了文字的现象,显示个问号,在windows下则正常,不知道是不是自带字体的问题 1 2

    bug wontfix compatibility 
    opened by chacha1355 6
  • [Compatibility]: 秽翼的尤斯蒂娅不显示人物

    [Compatibility]: 秽翼的尤斯蒂娅不显示人物

    基本信息

    CPyMO运行环境

    • CPyMO版本:3DS CIA
    • 3DS设备:Unknown

    兼容性不佳的应用程序信息

    • 不能运行的PyMO应用程序名称:秽翼的尤斯蒂娅
    • 可能发生错误的脚本文件名称:
    • 可能的行号:
    • 应用程序数据包版本:s60v3/s60v5/Android
    • 问题类型:图像瑕疵

    详细描述

    秽翼的尤斯蒂娅不显示人物

    bug wontfix compatibility 
    opened by Seng-Jik 2
  • [Compatibility]:  《海猫鸣泣之时 羽》菜单背景文字溢出

    [Compatibility]: 《海猫鸣泣之时 羽》菜单背景文字溢出

    基本信息

    CPyMO运行环境

    • CPyMO版本:3DS CIA
    • 3DS设备:2DSLL(XL) (如果不是3DS设备请删去此项)

    兼容性不佳的应用程序信息

    • 不能运行的PyMO应用程序名称:海猫鸣泣之时 羽
    • 可能发生错误的脚本文件名称:
    • 可能的行号:
    • 应用程序数据包版本:s60v5
    • 问题类型:图像瑕疵

    详细描述

    《海猫鸣泣之时 羽》呼出菜单,字跑背景外了

    WeChat 圖片_20220313141849

    bug compatibility 
    opened by chacha1355 1
  • 为Android端添加无障碍

    为Android端添加无障碍

    修改与添加的代码及说明

    CPyMO 部分

    1. cpymo_game_selector
    • cpymo_game_selector_item结构体添加gametitle_text,用于无障碍访问游戏标题
    • 通过cpymo_list_ui_set_selection_changed_callback添加回调,用于选择游戏时进行读屏
    1. cpymo_list_ui, cpmo_rmenu, cpymo_select_img, cpymo_textbox 在以上文件中添加了一些音效

    CPyMO backend

    1. cpymo_backend_text 修改cpymo_backend_text_visually_impaired_help函数,用于支持安卓读屏
    2. cpymo_backend_audio 添加了无障碍模式下安卓端的音效播放函数

    Android 部分

    1. CMakeLists.txt 删除-DNON_VISUALLY_IMPAIRED_HELP
    2. AndroidManifest.xml 添加了TTS_SERVICE
    3. SDLActivity.java
    • onCreate中添加所有文件的权限请求,Android11之后需要此权限才能访问/sdcard根目录
    • onCreate中添加VisualHelper.setup(),用于初始化无障碍帮助类
    • SDLSurface中修改了onTouch并添加了onTouchEvent,以及若干回调函数,用于处理无障碍手势
    1. xyz.xydm.cpymo.Config 从C层级获取无障碍配置
    2. xyz.xydm.cpymo.VisualHelper 无障碍的工具类,都是静态方法
    3. xyz.xydm.cpymo.gesture.GestureDetector 通过状态机的方式识别手势
    4. xyz.xydm.cpymo.gesture.OnGestureListener 手势回调接口
    5. xyz.xydm.cpymo.gesture.SlideDetector 检测手势滑动的方向
    6. 添加了若干音效文件并修改了themes.xml文件
    enhancement 
    opened by tuyunlei 0
  • [Compatibility]:  天使的星期日 呼出菜单和重启游戏卡顿

    [Compatibility]: 天使的星期日 呼出菜单和重启游戏卡顿

    基本信息

    CPyMO运行环境

    • CPyMO版本:3DS CIA
    • 3DS设备:2DSLL(XL) (如果不是3DS设备请删去此项)

    兼容性不佳的应用程序信息

    • 不能运行的PyMO应用程序名称:天使的星期日
    • 可能发生错误的脚本文件名称:
    • 可能的行号:
    • 应用程序数据包版本:s60v3
    • 问题类型:性能较差

    详细描述

    呼出菜单和重启游戏卡卡的

    bug compatibility problem 
    opened by chacha1355 10
Releases(v1.0.9)
Owner
弦语蝶梦
一个独立游戏制作组。
弦语蝶梦
Love 6's Regular Expression Engine. Support Concat/Select/Closure Basic function. Hope u can enjoy this tiny engine :)

Regex_Engine Love 6's Blog Website: https://love6.blog.csdn.net/ Love 6's Regular Expression Engine Hope u can love my tiny regex engine :) maybe a fe

Love6 2 May 24, 2022
Sword Engine is a fork of Psych Engine that plans on adding more features and quality of life improvements.

⚠️ WARNING: This README is currently incomplete, This warning will be removed once it's complete. Friday Night Funkin' - Sword Engine Sword Engine is

swordcube 6 Mar 13, 2022
Two Tribes Engine; the engine which we used to create Toki Tori 2+ and RIVE with

Two Tribes Engine We, Two Tribes, have used this engine for over a decade. It started with early development on the Nintendo DS and ultimately resulte

Two Tribes 117 Jun 21, 2022
OpenGL Template Engine - a C++ OpenGL graphics engine which aimed to be a simple startup template for 3D OpenGL projects.

OpenGL Template Engine is a C++ OpenGL graphics engine which aimed to be a simple startup template for 3D OpenGL projects. This is the template I personally use for my own projects and provides me with the general OpenGL 3D render setup with model import and UI.

Marcus Nesse Madland 2 May 16, 2022
My first Real-Time 3D Game Engine learning project written in C++.

EyeEngine-Cpp FOA, sry for my poor English. What is Eye Engine? Eye Engine is my first Real-Time 3D Game Engine learning project. There are two editio

F-seeeye 5 Apr 6, 2022
Modern & multiplatform game engine in C++17

RaZ Modern & multiplatform 3D game engine in C++17 Linux Windows macOS WebAssembly Compilation Unit tests No CI yet No CI yet N/A Codacy Coveralls Sum

Romain Milbert 326 Jun 30, 2022
A simple, funky, horrible fluid simulator, made possible by OLC's Pixel Game Engine

flOwie A simple, funky, horrible fluid simulator, made possible by OLC's Pixel Game Engine! Not meant for usefulness. The big O is in the name because

null 1 Jan 21, 2022
A simple 3D game engine for GameCube, Wii, 3DS, Windows, and Linux.

octave A Simple 3D Game Engine for GameCube, Wii, 3DS, Windows, and Linux Windows Setup Download and Install: Visual Studio Community 2017 (with C++ s

Martin Holtkamp 6 Jun 7, 2022
HEngine - 2D/3D Game Engine written in C++20

HEngine HEngine: Hbh Game Engine Now only support platform Windows OpenGL 4.5 TODO: D3D11 D3D12 Vulkan 命名规范 命名法 统一采用Pascal命名法(文件夹、类名等),第三方库除外 CMakeLis

null 57 Jun 26, 2022
Game Boy and Game Boy Color Emulator

SkyBoy A simple game boy emulator written to keep my skills sharp. The majority of the code was written in a 7 day sprint. It supports most common Gam

Sky 60 Jun 19, 2022
Tools for interacting with music data in GBA games that use the Engine Software replayer.

A suite of tools for interacting with the XM-like music data found in certain Game Boy Advance games - specifically those that use the Engine Software replayer middleware.

Luna 17 Nov 16, 2021
Typesense is a fast, typo-tolerant search engine for building delightful search experiences.

Fast, typo tolerant, fuzzy search engine for building delightful search experiences ⚡ ??

Typesense 10.2k Jun 27, 2022
Dynamic 3D cellular automata engine with lua scripting support

Cell3D Cell3D is a dynamic 3D cellular automata engine with lua scripting support Installation Dependencies: Lua 5.3 Raylib Simplest possible build co

null 1 May 25, 2021
Elk is a tiny embeddable JavaScript engine that implements a small but usable subset of ES6

Elk is a tiny embeddable JavaScript engine that implements a small but usable subset of ES6. It is designed for microcontroller development. Instead of writing firmware code in C/C++, Elk allows to develop in JavaScript. Another use case is providing customers with a secure, protected scripting environment for product customisation.

Cesanta Software 1.4k Jun 27, 2022
Rule Engine (RE) creates an interpretable anomaly classifier from many one-feature and two-feature decision rules

Rule Engine (RE) creates an interpretable anomaly classifier from many one-feature and two-feature decision rules

James Thomas 15 Mar 31, 2022
A light-weight Flutter Engine Embedder based on HADK ,which for Android devices that runs without any java code

flutter-hadk A light-weight Flutter Engine Embedder based on HADK ,which for Android devices that runs without any java code 1.Build by android-ndk-to

null 12 Jun 15, 2022
Coqui Inference Engine is a library for efficiently deploying speech models.

Coqui Inference Engine Coqui Inference Engine is a library for efficiently deploying speech models. This project is at an early proof-of-concept stage

coqui 34 Feb 13, 2022
Android Bindings for QuickJS, A fine little javascript engine.

quickjs-android quickjs-android 是 QuickJS JavaScript 引擎的 Android 接口框架,整体基于面向对象设计,提供了自动GC功能,使用简单。armeabi-v7a 的大小仅 350KB,是 Google V8 不错的替代品,启动速度比 V8 快,内

Wiki 91 Jun 9, 2022
Simple Excel engine without any UI

The idea is to implement a batch program that can accept a CSV file

Tsoding 33 Jun 8, 2022