铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 4471|回复: 8

[lua复刻] 将金群MOD移植到PSP及制作eboot.pbp的教程

[复制链接]
发表于 2013-5-6 00:47 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
本帖最后由 lsl_lsq 于 2013-5-9 16:44 编辑


到目前为止已经有不少金群MOD移植到PSP/PSV上,个人也将台湾版PTT,再战江湖,天书劫及乡民创江湖半即时版等移植到PSP/PSV。

现在论坛的主流金群MOD半即时版,一些低层C的源码被论坛的MOD达人们更新,修改,所以必须重新制作PSP/PSV的PBP(也就是PC上的EXE之类的可执行文件),才能将论坛上的苍半及其MOD移植到PSP/PSV上。但是制作此前PBP文件的有关内容并没有公开,所以必须重新开始来进行,经过一番摸索及调试,总算完成了。现将过程及需注意的内容发布出来,便于今后有人继续此开发。

一:PSP开发编译环境搭建
因为此次只是移植工作,需开发编程的量不大,所以选择了简单和易懂的TOPOC。但是,因为网上提供的TOPOC的PSPSDK都是很早的版本,需要新的PSPSDK版本来替换。而个人在网上找到了最新的0.11.1版,却始终没法正确编译,折腾了很多时间,才发现0.10版可以顺利的完成编译。对于移植老的程序,最新版的SDK并不一定适用,是这次最大的教训。
(1):到网上下载TOPOC_PSPDEV和PSPSDK 0.10版
(2):解压TOPOC文件,安装PSPSDK0.10版,将安装目录下的所有文件,复制,覆盖到TOPOC的PSPDEV目录下。
(3):运行TOPOC目录下的creatbat.exe,自动建好了一个start.bat文件。以后进入PSP编译环境,只需点击这个start.bat就可以了。
好了,至此PSP开发编译环境搭建完成了

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-5-6 01:16 | 显示全部楼层
本帖最后由 lsl_lsq 于 2013-5-9 17:04 编辑

(二):编写makefile文件


有过lunix编程的,都知道makefile文件吧。makefile就是执行编译的文本文件,与windows下的C++之类的编译环境不同,Pbp文件的编译需要手动编写一个makefile,来引导编译程序加入类库,h头文件等。
这个调试过程,也是非常花时间,因为金群半即时MOD(以龙人为例)需要SDL ,SMPEG,OGG,LUA,Zlib,png,tiff,freetype等的动态资源库,这些在移植PSP的时候,必须连接到支持库,让编译程序打包到PBP文件,才能在PSP正常的运行金群MOD。
以下,是金群MOD的makefile文件,详细的就不解释了,能看懂的自然就知道是什么。这个可是这次移植过程中,花费时间最多的一个地方。


  1. TARGET = jymain
  2. OBJS = src/jymain.o src/charset.o src/luafun.o src/mainmap.o src/piccache.o src/sdlfun.o src/SDL_rotozoom.o

  3. PSPSDK = $(shell psp-config --pspsdk-path)
  4. PSPBIN = $(PSPSDK)/../bin

  5. CFLAGS = -O3 -G0 -Wall -g `$(PSPSDK)/../bin/sdl-config --cflags` -DPSP=1
  6. CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti `$(PSPSDK)/../bin/sdl-config --cflags`
  7. ASFLAGS = $(CFLAGS)

  8. INCDIR = ../../pspdev/psp/include/SDL
  9. LIBDIR = ../../pspdev/lib
  10. LDFLAGS =

  11. LIBS += -llua -lSDL_image -lSDL_mixer -lSDLmain -lsmpeg -lSDL_ttf -lSDL -lfreetype -lc -lpng -ljpeg -logg -lvorbisidec -lvorbis -lpspgu -lstdc++ -lm -lz

  12. LIBS += $(shell $(PSPBIN)/sdl-config --libs)

  13. EXTRA_TARGETS = EBOOT.PBP
  14. PSP_EBOOT_TITLE = jymain_desc
  15. PSP_EBOOT_ICON = icon.png

  16. include $(PSPSDK)/lib/build.mak
复制代码





评分

参与人数 1声望 +30 收起 理由
KA + 30 高手

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-5-9 17:31 | 显示全部楼层
本帖最后由 lsl_lsq 于 2013-5-9 17:49 编辑

(三):编写PSP移植文件

移植到PSP,还需增加PSP的输入代码部分。因为在PC上用的键盘,鼠标操作,必须转成PSP的按键,才能完成PSP的移植了。
在PSPSDK里有PSP按键控制的例子,参照这个文件,写以下代码文件INPUT_PSP.H(这里参考了仙剑SDL的PSP源代码)。

  1. #include <pspkernel.h>
  2. #include <pspdebug.h>
  3. #include <pspsdk.h>
  4. #include <psppower.h>
  5. #include <pspthreadman.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>

  8. #define PSP_HEAP_MEMSIZE 12288

  9. PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
  10. PSP_HEAP_SIZE_KB(PSP_HEAP_MEMSIZE);

  11. int PSP_exit_callback(int arg1, int arg2, void *common)
  12. {
  13.         exit(0);
  14.         return 0;
  15. }

  16. int PSP_suspend_callback(int unknown, int pwrflags, void *common)
  17. {
  18.   int cbid;
  19.   cbid = sceKernelCreateCallback("suspend Callback", PSP_suspend_callback, NULL);
  20.         scePowerRegisterCallback(0, cbid);
  21.   return 0;
  22. }

  23. int PSP_exit_callback_thread(SceSize args, void *argp)
  24. {
  25.         int cbid;
  26.         cbid = sceKernelCreateCallback("Exit Callback", PSP_exit_callback, NULL);
  27.         sceKernelRegisterExitCallback(cbid);
  28.         cbid = sceKernelCreateCallback("suspend Callback", PSP_suspend_callback, NULL);
  29.         scePowerRegisterCallback(0, cbid);
  30.         sceKernelSleepThreadCB();
  31.         return 0;
  32. }

  33. int PSP_setup_callbacks(void)
  34. {
  35.         int thid = 0;
  36.         thid = sceKernelCreateThread("update_thread", PSP_exit_callback_thread, 0x11, 0xFA0, 0, 0);
  37.         if(thid >= 0)
  38.                 sceKernelStartThread(thid, 0, 0);
  39.         return thid;
  40. }

  41. void jy_psp_init(void)
  42. {
  43.    PSP_setup_callbacks();

  44.    atexit(sceKernelExitGame);

  45. scePowerSetClockFrequency(333 , 333 , 166);
  46. }
复制代码



并在jymain.c文件里加入以下的代码:

  1. #include “INPUT_PSP.H"
复制代码


jymain.c文件main函数里加入psp的初始化的代码:

  1. int main(int argc, char *argv[])
  2. {
  3.         lua_State *pL_main;

  4.         remove(DEBUG_FILE);
  5.     freopen(ERROR_FILE,"wt",stderr);    //设置stderr输出到文件

  6.         //初始化lua
  7.         pL_main=lua_open();
  8.     luaL_openlibs(pL_main);
  9.         
  10.         //PSP初始化代码
  11.         JY_Debug("PSP_init();");
  12.         jy_psp_init();        

  13.     Lua_Config(pL_main,CONFIG_FILE);        //读取lua配置文件,设置参数

  14.     InitSDL();           //初始化SDL

  15.         InitGame();          //初始化游戏数据

  16.         LoadMB(HZMB_FILE);  //加载汉字字符集转换码表


  17.     Lua_Main(pL_main);          //调用Lua主函数,开始游戏

  18.    //关闭lua
  19.     lua_close(pL_main);

  20.         ExitGame();       //释放游戏数据

  21.     ExitSDL();        //退出SDL

  22.     return 0;
  23. }
复制代码


修改SDLFUN.C的按键函数JY_GetKey():

  1. int JY_GetKey()
  2. {
  3.             int keyPress=-1;
  4.         
  5. sceCtrlReadBufferPositive(&pad, 1);

  6.                 if (pad.Buttons != 0){
  7.                         if (pad.Buttons & PSP_CTRL_SQUARE){
  8.                                 keyPress = 0;
  9.                         }
  10.                         if (pad.Buttons & PSP_CTRL_TRIANGLE){
  11.                                 keyPress =3;
  12.                         }
  13.                         if (pad.Buttons & PSP_CTRL_CIRCLE){
  14.                                 keyPress = 1;
  15.                         }
  16.                         if (pad.Buttons & PSP_CTRL_CROSS){
  17.                                 keyPress = 2;
  18.                         }

  19.                         if (pad.Buttons & PSP_CTRL_UP){
  20.                                 keyPress =8;
  21.                         }
  22.                         if (pad.Buttons & PSP_CTRL_DOWN){
  23.                                 keyPress = 6;
  24.                         }
  25.                         if (pad.Buttons & PSP_CTRL_LEFT){
  26.                                 keyPress = 7;
  27.                         }
  28.                         if (pad.Buttons & PSP_CTRL_RIGHT){
  29.                                 keyPress =9;
  30.                         }      

  31.                         if (pad.Buttons & PSP_CTRL_START){
  32.                                 keyPress = 10;
  33.                         }
  34.                         if (pad.Buttons & PSP_CTRL_SELECT){
  35.                                 keyPress = 11;
  36.                         }
  37.                         if (pad.Buttons & PSP_CTRL_LTRIGGER){
  38.                                 keyPress = 4;
  39.                         }
  40.                         if (pad.Buttons & PSP_CTRL_RTRIGGER){
  41.                                 keyPress = 5;
  42.                         }      
  43.                 }

  44. return keyPress;
  45. }
复制代码



【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-5-9 17:36 | 显示全部楼层
发完了没?坐等加精帖火
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-5-9 17:47 | 显示全部楼层
本帖最后由 lsl_lsq 于 2013-5-9 17:51 编辑

(四):编译PBP文件

  (1):新建一个文件夹,如jymain,将上述修改和新建的文件INPUT_PSP.H(SRC子目录),及makefile文件复制到这个文件夹中,然后移动jymain到TOPOC的projects文件夹中。

  (2):运行TOPOC的start.bat文件,在DOS模式中输入:
         CD projects
         CD jymain
         输入make,开始编译。如果没问题,最后就会出现eboot.pbp文件了。


     最后,还要修改script的jyconst.lua文件中的按键对应值到PSP的按键值。(其实,直接在上述的JY_GetKey()将keypress值对应成目前的jyconst.lua也可以)



【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-5-9 18:08 | 显示全部楼层
本帖最后由 lsl_lsq 于 2013-5-9 18:08 编辑

最后,是制作PSP版的文件。将PC版的windows文件DLL,exe之类都删除,复制eboot.pbp,其它的基本保留,就完成了。

另外,PSP的CONFIG.LUA和jyconst.lua文件中目录标志和windows不同,要改成
(./和/)的路径。



【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-5-10 10:53 | 显示全部楼层
虽然不玩psp,但是这个还是必须得收藏了……
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-5-10 21:30 | 显示全部楼层
这个留着学习啊。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2020-4-3 12:48 | 显示全部楼层
顶一下顶一下顶一下顶一下
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-4-25 15:54

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表