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不再兼容的补丁
  • 代码与文字说明不符合的补丁
  • 其他有争议的内容
Comments
  • [Bug]: 运行时闪退

    [Bug]: 运行时闪退

    基本信息

    CPyMO运行环境

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

    详细描述

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

    报错日志 crash_dump_00000000.zip

    bug 
    opened by zhishixiang 20
  • [Compatibility]:  天使的星期日 呼出菜单和重启游戏卡顿

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

    基本信息

    CPyMO运行环境

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

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

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

    详细描述

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

    bug compatibility 
    opened by chacha1355 10
  • [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
  • Support iOS

    Support iOS

    1. Add submodule FFmpeg-iOS-build-script
    2. Add submodule ios-cmake
    3. Add CMakeLists.txt and some resource files for iOS build
    4. Add cpymo_ios.m for getting iOS game directory dynamically
    5. Edit cpymo_backend_font.c for getting font on iOS
    6. Edit cpymo_import_sdl2.h for importing SDL on iOS
    7. Edit main.c for some iOS features
    8. Edit cpymo_game_selector.c for empty game selector message on iOS
    enhancement 
    opened by tuyunlei 1
  • [Compatibility]: FrFr

    [Compatibility]: FrFr

    • CPyMO版本:3DS CIA
    • 3DS设备:O3DS和N3DSLL(XL)

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

    • 不能运行的PyMO应用程序名称:frfr1
    • 应用程序数据包版本:s60v5
    • 问题类型:图像瑕疵 save-01.zip

    https://user-images.githubusercontent.com/11296891/185292863-d318e8ba-35a8-4ea6-a502-5e5a3518ba18.mp4

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

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

    基本信息

    CPyMO运行环境

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

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

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

    详细描述

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

    WeChat 圖片_20220313141849

    bug compatibility 
    opened by chacha1355 1
  • 修复Android无障碍触摸Bug,并更新版本号

    修复Android无障碍触摸Bug,并更新版本号

    1. 修复Android无障碍触摸Bug

    Bug现象

    按住屏幕并滑动后,会概率性出现无法双击回车,或长按返回的现象

    Bug原因

    SDLActivity.onNativeTouch会被SDL解析为一次触摸输入, 虽然之前的代码仅仅发送了ACTION_MOVE,但是触摸输入的逻辑就是按下->移动->松开,所以SDL可能会擅自发送按下的事件,于是就造成cpymo收到了按下和移动的事件,但并没有收到松开事件,所以鼠标一直按下的情况下,回车键esc键自然是无法正常工作了

    修复方法

    使用SDLActivity.onNativeMouse即可发送纯鼠标事件(这个API本就是为了给Android设备外接鼠标而设计的)

    注意事项

    由于onNativeMouse缺乏详细的文档,我只是照着已有的代码写法来写的,而对于最后一个参数relative的含义并不太了解,所以这里有待更多的测试和验证

    2. 更新Android和iOS的版本号为1.1.3

    opened by tuyunlei 0
  • Update android signature file

    Update android signature file

    1. Add keystore file
    2. Update ci.yml for signature
    3. Update build.gradle for signature
    4. chmod +x cpymo-backend/android/gradlew and delete corresponding command in ci.yml
    5. Fix extract-text related macro in Android
    opened by tuyunlei 0
  • Update android signing key

    Update android signing key

    1. update ci.yml to use signing file
    2. update build.gradle to use signing file
    3. add keystore.jks (signing file)
    4. fix two "extract_text" macro in Android
    5. chmod +x cpymo-backends/android/gradlew
    opened by tuyunlei 0
  • fix bug and update android version number

    fix bug and update android version number

    1. split NON_VISUALLY_IMPAIRED_HELP macro into ENABLE_TEXT_EXTRACT and ENABLE_TEXT_EXTRACT_ANDROID_ACCESSIBILITY
    2. update versionCode to 2, versionName to '1.1.1'
    opened by tuyunlei 0
Releases(v1.1.3)
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 7 Jul 9, 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 122 Nov 28, 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 366 Dec 24, 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 10 Dec 25, 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 93 Dec 24, 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 325 Jan 8, 2023
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 16 Oct 22, 2022
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 12k Jan 2, 2023
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 2 Oct 7, 2022
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.5k Jan 8, 2023
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 Aug 15, 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 35 Jan 5, 2023
Android Bindings for QuickJS, A fine little javascript engine.

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

Wiki 121 Dec 28, 2022
Simple Excel engine without any UI

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

Tsoding 32 Nov 19, 2022