逆向:程序研究/AT1/菜单相关例程:修订间差异
(→用户界面绘制组(Gp): 更新发现) |
(→菜单系统: 分析错误。待研究) |
||
第112行: | 第112行: | ||
== 菜单系统 == | == 菜单系统 == | ||
{{warn|错误分析。该系统很可能是顺序执行函数的系统(按照注册顺序逐个调用)并可能有跳转到第N个函数之功能,故可用作菜单。需进一步研究}} | |||
菜单宿主系统对菜单处理进行管理。需要注册当前菜单的绘图回调函数、每个菜单项的进入回调函数。然后运行菜单。 | 菜单宿主系统对菜单处理进行管理。需要注册当前菜单的绘图回调函数、每个菜单项的进入回调函数。然后运行菜单。 | ||
2024年11月8日 (五) 19:25的版本
菜单相关处理。
用户界面绘制组(Gp)
Gp使用Tx的裁切结果。拼接成为用户界面。所有可变的元素,是在运行时,初始化时,调用方先在Gp结构中填入需要表示的值,然后再调用Gp处理函数进行显示。
Gp按以下结构连续存储:
<struct name='UiGp'> <field name='txptr' type='int32'/> <!-- 指向Tx结构的指针。若为NULL表示到达Gp列表尾端。 --> <field name='x' type='int16' /> <field name='y' type='int16' /> <field name='tex' type='int16' /> <field name='pal' type='int16' /> <field name='func' type='int32' /> <field name='w-fx-no' type='int32' /> <field name='h-fy' type='int32' /> <field name='str' type='string*' /> <field name='r' type='uint8' /> <field name='g' type='uint8' /> <field name='b' type='uint8' /> <field name='a' type='uint8' /> <field name='rot' type='float' /> <field name='paras' type='int32[3]' /> </struct> struct Gp { struct Tx* txptr; // 0x0 int16_t x; // 0x4 int16_t y; // 0x6 int16_t tex; // 0x8 int16_t pal; // 0xA int32_t func; // 0xC int32_t w-fx-no; // 0x10 int32_t h-fy; // 0x14 char *str; // 0x18 uint8_t r; // 0x1C uint8_t g; // 0x1D uint8_t b; // 0x1E uint8_t a; // 0x1F float rot; // 0x20 uint32_t para[3]; /* 0x24,未知参数,padding? */ };
其中,func 表示此元素的绘制方式。各个参数的含义随func的不同而有不同解释。
处理其显示的函数为0x116588。
术语
“框”类元素。
+---+ | | +---+ 此类型的元素,被分割为9块:左上角,上边框,右上角,左边框,中间,右边框,左下角,下边框,右下角。 在显示时,四角不进行变形,边框分别进行左右拉伸/反复,中间进行拉伸/反复。
例子:窗口类,对话框等。
“条”类元素。
+---+ + | + 此类型的元素,被分割为3块:左端点,中间,右端点。在显示时,端点进行上下拉伸/反复,中间进行左右及上下拉伸/反复。
例子:血量条等。
※以上的只是通用的结构,实际的显示中可能不包括所有的构件。
拉伸填充显示 原图片,按比例进行拉伸以填充新的宽高。尚未确认拉伸时使用双线性还是最近邻。
反复填充显示 原图片,不进行拉伸,而是不断地重复来填充超过原本宽高的位置。
func表
0x116588首先检查func的值,并按跳表执行。跳表共55项,其中0,36,43,48,51-53取ukn之值,若为0则不动作,否则将ukn的值,否则将s4中的双字存入全局变量0xA7A778(某种标志?)。
55以上的值不做操作。
x,y为相对于屏幕左上角的偏移。tex 为 Tx 表的偏移 (0为Tx表第一项、1为第二项……,-1则此元素不显示)。
func==0
Tx 图片的直接显示。
func==1
func==15
文字显示。取str作为显示参数。h-fy 为字体大小。但是该值似乎常常在运行时才填入。r, g, b, a为字体显示用的rgba值。(取值范围[0-128],注意是128)
使用主字库的显示。
func==16
文字显示。
func==20
数字的显示。w-fx-no 此时表示 no,其中的值为要显示的值(若为999则显示为999)。
txptr 指向一组用于表示数字的 Tx。0号元素表示0,9号元素表示9。tex 仍用于表示偏移。tex 设定的情况下,txptr 首先偏移 tex 指定的值,然后以那里为0号元素。
func==25
“框”类元素的显示。w-fx-no 此时表示 w,宽度,h-fy 此时表示 h,高度。
txptr 指向一组9个用于表示框类元素各个构件的图片。【需要检查】
func==42
横“条”类元素的显示。w-fx-no 此时表示 w,宽度,h-fy 此时表示 h,高度。
txptr 指向一组3个用于表示条类元素各个构件的图片。【需要检查】
菜单系统
警告 : 错误分析。该系统很可能是顺序执行函数的系统(按照注册顺序逐个调用)并可能有跳转到第N个函数之功能,故可用作菜单。需进一步研究
菜单宿主系统对菜单处理进行管理。需要注册当前菜单的绘图回调函数、每个菜单项的进入回调函数。然后运行菜单。
菜单宿主系统主循环每次渲染调用注册的绘图回调函数,然后检查玩家输入,并调整高亮和当前选择的菜单项。若玩家按下返回键则终止主循环并返回。
若玩家按下确认键则调用当前高亮的菜单项对应的注册的进入回调函数。
- menuHostInit(struct menu_t *menu): 菜单宿主初始化,a0:要初始化的菜单宿主结构体。13CB48。
- menuHostRegEntry(struct menu_t *menu, void (*displayCallback)(), void (*confirmCallback)()):注册一个菜单项。13CC18。
- menuHostShowMenu(struct menu_t *menu):显示菜单,进行主循环。13CC38。
- menuHostFini(struct menu_t *menu):菜单宿主系统终止。释放资源。13CDB8。
※:以上地址为日版SLPS_256.04的地址。
典型的调用是:
/* ... */ menu_t menu; menuHostInit(&menu); menuHostRegEntry(&menu, helpDisplayCallback, helpShowCallback); menuHostRegEntry(&menu, termDisplayCallback, termShowCallback); menuHostShowMenu(&menu); menuHostFini(&menu); /* ... */