界面修改资料

在这里留点当备份
TA界面修改资料

具体修改资料参考翻译TADesign的GUI部分,下面是大体的内容
下面的资料是针对12键菜单模式的新型界面的,不一定能符合原版界面的要求。
TA 在游戏中的界面分为3种DL界面和GEN界面,还有一种是指定单位界面
(1)GEN界面是一般单位用的
(2)DL界面是有建造菜单的单位用的,DL界面除建造菜单外的部分应该与GEN界面对应
(3)指定界面是针对某个单位的,名字和单位一样,有0,1,2,3这样的字样,其中0是共通界面,当单独选择单位时显示的是1界面,建造菜单一页一页的翻下去就是2,3,4,5界面。0界面在选择多个不同单位时显示。所以0界面应当与GEN界面对应,也就是共用的功能,如攻击,移动,停止等等的位置有要相同。如果你没有0界面,那也不要紧,系统会自动把GEN作为0界面。实际上,0界面是ORDER界面,而1、2、3界面是BUILD界面。

ARM的GEN和DL界面文件是ARMGEN.gui和ARMDL.gui,而CORE则是CORGEN.gui和CORDL.gui
名字其实是对应于sidedata里指定的界面,例如在sidedata里,RHYOSS(某个玩家制作的种族)指定的界面为intgaf=ARMINT;那RHYOSS的GEN和DL也就是ARMGEN.gui和ARMDL.gui。所以做新种族不一定要做新界面。

在TA Design Guide 里面有这样的一句
Note: 我想把所有的建造图片加入 commongui.gaf. 这样可以节省许多空间。 GUI 的基本菜单 和 MDF (多方向工厂) would be able to be done with little or no additional space compared to normal factories. 遗憾的是加任何东西进 commongui.gaf 都会使TA启动时出错, 我强烈要求有兴趣的人想出解决办法,我对此无计可施。

不过我发现TALON似乎解决了这个问题,不过TALON的主程序经过了修改,将commongui改为了comtalgui,同时将3个种族的这类文件整合到了一起成为comtalgui.gaf,而DL.gaf和GEN.gaf就不需要了。

commonattribs
8代表武器建造(例如核弹的建造,不是8的话造不出核弹),0和4暂时未知分别

关于图片
我只研究了pan2这个部分,我用了一幅长度很长的图片,结果表明如果图片长度不够,会用底图补足,底图不够用黑色,如果长度超过,则会被截断,即使调高分辨率,多出的部分也是底图黑色补,指定pan2的范围是多少就多少,不够黑色补,超出就截断。

注意:
现在的12键菜单界面中,DL界面没有on/off,而GEN界面中没有上下翻页,这两个东西在同一个位置上,所以一个单位同时有开关和上下翻页的情形时,会采用指定界面来解决,不过基本上没这种单位。
原因是768的分辨率仍然不够,只好让这两重叠。

Unitinfox.GUI和UNITINFO.GUI
按F1显示的那个单位介绍的对话框,为什么有两个文件?还未搞明白。但Unitinfox.GUI看来是起主要作用的,猫版的这个文件加了DANWEISM和ZONGWENZI两项,是与汉化有关的。
MAINMENU.GUI
这个是进入游戏的初始界面,就是单人游戏,多人游戏,退出游戏那个界面,现在有些人很喜欢修改这个界面。
EXITMENU.GUI
这个是退出游戏的对话框,它的背景是用9格合成的,要注意的是它的高度不应大于191,当大于等于192时它的底部就会被中间的盖住。
YESORNO.GUI
这个是退出游戏时问你是否的界面,上面的 text=Title;在游戏中不是显示Title这个字,修改它是没用的,你须要修改主程序,在主程序中你可以搜索到游戏中那个字,将它用00(空格)代替,再在图片里加中文,就能汉化。

PS:我找不到那个GUI文件是对应一进入游戏时弹出的那个提示DX版本的对话框。

commongui.gaf里面的文件解析
LISTBOX——清单框,这个文件有9帧,分别是左上角,左边,内部。。。等等,通过这9个部分可以组合成一个方形,其中内部是可以任意放大的,左右边可以上下拉长,上下边可以左右拉长。4个角则不能变化,通过这样就可以做出各种大小的方框。如果你要修改这个文件要注意9帧的顺序。

Back Tile——框,例如退出游戏的那个框,9帧,跟上面的原理一样,

SLIDERS——滑动条,20帧,具体那帧是干什么的看看也就知道了

TEXTINPUT——文字输入,3帧,左中右,中间帧是可以左右拉长的,游戏中好像没见过这个

BUTTONS0——里面是各式按键

LIGHTBAR——里面有载入游戏的那条进度条,整条的文字输入条,还有一块不知道是什么

stagebuttn4——4重按键,6帧,分别是模式1,2,3,4,和按下时的效果,按键不可用(灰色)

igpatch——建造菜单的背景,当哪一格没有东西造的时候显示的

下面是脚本解析的补充,研究了一个新的单位,所以做一个补充
//这是TALON的核弹车的脚本,重点是开头的履带运动控制,
#define TA                        // This is a TA script

#include “sfxtype.h”
#include “exptype.h”

piece  base, body, stand, missile, tracks_animated, door, spinner, smoker1, smoker2, tracks_reverse, tracks_move;

static-var  Static_Var_1, Static_Var_2, statechg_DesiredState, statechg_StateChanging, fired, smoking, bmoving;

// Signal definitions
#define SIG_AIM                                2
#define SIG_MOVE                        4

//track_tracks()和isMoving()部分就是履带的运动控制,不会C语言的照抄就可以了。简要解析原理如下:
//做3个履带的部件,放在同一位置,三个部件上面的动态贴图不一样,第一个是两边履带向前,第二个左前右后,用于右转,第三个右前左后,用于左转。直线移动时显示第一个,隐藏第二和第三个。同理,左右转时显示第二或第三个,隐藏其余两个。在不移动的时候阻止履带播放。

track_tracks()
{
        var pre;
        var now;
        pre = get XZ_ATAN(-419);
        var dif;
        while(1)
        {
                now = get XZ_ATAN(-419);
                dif = pre - now;
                if(dif > <2>)
                {
                        hide tracks_reverse;     
                        hide tracks_move;
                        show tracks_animated;    //这三句是三个部件
                }
                if(dif < <-2>)
                {
                        show tracks_reverse;
                        hide tracks_move;
                        hide tracks_animated;
                }
                if(dif <= <2> && dif >= <-2>)
                {
                        hide tracks_reverse;
                        show tracks_move;
                        hide tracks_animated;
                }
                sleep 200;
                pre = now;
        }
}

isMoving()
{
        var preang;
        var prepos;
        var ang;
        var pos;
       
        preang = get XZ_ATAN(-419);
        prepos = get PIECE_XZ(base);
       
        while(1)
        {
                ang = get XZ_ATAN(-419);
                pos = get PIECE_XZ(base);
               
                bmoving = 0;
               
                if (ang != preang)
                {
                        bmoving = 1;
                }
                if(pos != prepos)
                {
                        bmoving = 1;
                }
                if(bmoving)
                {
                        dont-Cache tracks_animated;
                        dont-cache tracks_reverse;
                        dont-cache tracks_move;
                }
                if(!bmoving)
                {
                        Cache tracks_animated;
                        cache tracks_reverse;
                        cache tracks_move;
                }
                sleep 200;
                prepos = pos;
                preang = ang;
        }
}
       
       
SmokeUnit(healthpercent, sleeptime, smoketype)
{
        while( get BUILD_PERCENT_LEFT )
        {
                sleep 400;
        }
        while( TRUE )
        {
                healthpercent = get HEALTH;
                if( healthpercent < 66 )
                {
                        smoketype = 256 | 2;
                        if( Rand( 1, 66 ) < healthpercent )
                        {
                                smoketype = 256 | 1;
                        }
                        emit-sfx smoketype from base;
                }
                sleeptime = healthpercent * 50;
                if( sleeptime < 200 )
                {
                        sleeptime = 200;
                }
                sleep sleeptime;
        }
}

HitByWeapon(Func_Var_1, Func_Var_2)
{
        signal 8;
        set-signal-mask 8;
        turn base to z-axis Func_Var_2 speed <105.021978>;
        turn base to x-axis Func_Var_1 speed <105.021978>;
        wait-for-turn base around z-axis;
        wait-for-turn base around x-axis;
        turn base to z-axis <0.000000> speed <30.005495>;
        turn base to x-axis <0.000000> speed <30.005495>;
}

Create()
{
        Static_Var_1 = 0;
        Static_Var_2 = 10000;
        start-script SmokeUnit();
        spin spinner around z-axis speed <100>;
        fired=0;
        smoking=0;
        spin base around y-axis speed <-30.005495>;
        bmoving=0;                             //这里有一句
        while( get BUILD_PERCENT_LEFT )
        {
                sleep 1;
        }
        stop-spin base around y-axis;
        turn base to y-axis <0> speed <30>;
        hide tracks_reverse;                //
        hide tracks_move;                   //
        start-script track_tracks();         //
        start-script ismoving();             //以上4句
}

/*StartMoving()                              ///这个部分用/**/包起来的是无效的,应该是测试用的。
{
        signal SIG_MOVE;
        set-signal-mask SIG_MOVE;
        dont-Cache tracks_animated;
        dont-cache tracks_reverse;
        dont-cache tracks_move;
}

StopMoving()
{
        Cache tracks_animated;
        cache tracks_reverse;
        cache tracks_move;
        signal SIG_MOVE;
}*/

RestoreAfterDelay()
{
        sleep Static_Var_2;
        set-signal-mask 0;
        turn stand to x-axis <0.000000> speed <100.021978>;
        wait-for-turn stand around x-axis;
        move door to x-axis [0] speed [10];
        wait-for-move door along x-axis;
        show missile;
        fired=0;
}

AimPrimary(heading, pitch)
{
        signal SIG_AIM;
        set-signal-mask SIG_AIM;
        while (fired)
        {
                sleep 100;
        }
        move door to x-axis [-3.18999] speed [10];
        wait-for-move door along x-axis;
        turn stand to x-axis <-90.021978> speed <100.021978>;
        wait-for-turn stand around x-axis;
        while ( smoking < 15 )
        {
                emit-sfx 256 | 1 from smoker1;
                emit-sfx 256 | 2 from smoker2;
                sleep 100;
                ++smoking;
        }
        smoking = 0;
        start-script RestoreAfterDelay();
        return (1);
}

FirePrimary()
{
        hide missile;
        fired=1;
        sleep 1000;
        turn stand to x-axis <0.000000> speed <100.021978>;
        wait-for-turn stand around x-axis;
        move door to x-axis [0] speed [10];
        wait-for-move door along x-axis;
        show missile;
        sleep 1000;
        fired=0;
}

QueryPrimary(piecenum)
{
        piecenum = missile;
}

SweetSpot(piecenum)
{
        piecenum = base;
}

Killed(severity, corpsetype)
{
        if( severity <= 25 )
        {
                corpsetype = 1;
                explode base type BITMAPONLY | BITMAP1;
                explode stand type BITMAPONLY | BITMAP2;
                explode missile type FALL | SMOKE | FIRE | EXPLODE_ON_HIT | BITMAP3;
                explode tracks_animated type BITMAPONLY | BITMAP4;
                explode body type BITMAPONLY | BITMAP5;
                return (0);
        }
        if( severity <= 50 )
        {
                corpsetype = 2;
                explode base type BITMAPONLY | BITMAP1;
                explode stand type SHATTER | BITMAP2;
                explode missile type FALL | SMOKE | FIRE | EXPLODE_ON_HIT | BITMAP3;
                explode tracks_animated type BITMAPONLY | BITMAP4;
                explode body type BITMAPONLY | BITMAP5;
                return (0);
        }
        if( severity <= 99 )
        {
                corpsetype = 3;
                explode base type BITMAPONLY | BITMAP1;
                explode stand type SHATTER | EXPLODE_ON_HIT | BITMAP2;
                explode missile type FALL | SMOKE | FIRE | EXPLODE_ON_HIT | BITMAP3;
                explode tracks_animated type BITMAPONLY | BITMAP4;
                explode body type BITMAPONLY | BITMAP5;
                return (0);
        }
        corpsetype = 3;
        explode base type BITMAPONLY | BITMAP1;
        explode stand type SHATTER | EXPLODE_ON_HIT | BITMAP2;
        explode missile type FALL | SMOKE | FIRE | EXPLODE_ON_HIT | BITMAP3;
        explode tracks_animated type BITMAPONLY | BITMAP4;
        explode body type BITMAPONLY | BITMAP5;
}