脚本系统简易教程

得益于HTML优势,网页版霸业在原版基础上扩展出Javascript脚本系统,使得lib制作能高度定制游戏逻辑。

Javascript简要基础

基本概念

脚本是一种编程语言,不同于普通文档(如XML),脚本主要由一系列的 数据 和对数据的 操作 (语句)构成。

脚本中语句是一条接着一条顺序执行下去的。如:

a = 1; //让对象a的值为1 (赋值)
b = a; //让b的值为a的值,此后b的值也为1
a = 2; //让a的值为2,此后a为2,b仍然为1
c = a; //让c的值为a的值,此后a为2,b为1,c为2

以上脚本有4条语句,顺序执行。

XML文档描述“ 做什么 ”,脚本描述“ 怎么做 ”。

霸业的脚本系统采用javascript语言, 本教程仅讲一些最基本的javascript脚本知识,欲了解更全面,请参考相关资料。

注释

注释的内容是为了帮助程序员阅读用的,代码执行时注释会被忽略。

// 标记单行注释开始,每一行的 // 开始到行末的内容为注释。

/**/ 对,用于标记多行注释,如:

/*
这是注释
这也是注释
*/

Javascript的数据类型

数字: 123

字符串: "赵云"

对象: {name: "赵云", age: 20}

列表: [1, 2, 3]

...

赋值

最基础的动作语句是赋值,赋值就是让一个 名字 关联一个 , 其后,我们就可以在需要用到这个 的地方使用这个 名字 来代替。

基本语法:

变量名称=值;

示例:

/*
简单赋值语句
让 a 关联值 1,分号指示语句结束
javascript里面分号是可选的,但为避免歧义,最好每条语句都加上分号
*/

var a = 1;  // var 定义并赋值,首次使用时加上var
a = a + 2;  // 重新赋值, 此后a的值是3

没接触过编程语言的朋友一定要注意: 程序里面的 = 符号代表的是一个动作,区别于我们数学里面学的 = 代表一个相等关系 .

条件判断

有时候程序需要根据不同的条件执行不同的代码,Javasctipt 用 if 来进行条件判断。

示例:

var a = 1;
var b = 2;
if (a > b) {
    // 如果 a > b
    console.log("a > b");
}

示例2:

var a = 1;
if (a > b) {
    // 如果 a > b
    // console.log语句通常用于调试,它将字符串输出到控制台。
    console.log("a > b");
} else if (a == 1) {
    console.log("a = 1");
} else if (a == 0) {
    console.log("a = 2");
} else {
    // 其它情况
    console.log("其它情况");
}

遍历数据

有时候我们需要遍历一个集合里面的每一个元素做操作,比如霸业里面找出符合某种条件的人物。

我们通常使用 for 循环来实现遍历数据,示例:

var numbers = [1, 3, 2, 4];
for (var i = 0; i < numbers.length; i++) {
    if (numbers[i] < 3) {
        console.log(numbers[i]);
    }
}

for 循环语法构成如下:

for (表达式1; 表达式2; 表达式3) {
    循环体
}

其它语句

执行流程:

for流程图

函数(function)

如果一段代码是可复用的或是逻辑相对独立,我们可以将其封装称为函数。

基本语法:

function 函数名称(参数列表){
    函数体
}

函数名称可以忽略,称为匿名函数。

// 这种格式是普通的赋值语句, “=”右边的的函数整体是一个值。
变量名称 = function(参数列表) {
    函数体
}

示例:

function add(x, y) {
    return x + y;
}
var a = add(1, 2); // now, c = 3
var b = add(a, 1);

或:

var add = function(x, y) {
    return x + y;
}
var a = add(1, 2); // now, c = 3
var b = add(a, 1);

霸业脚本系统原理

霸业的脚本系统定义了一个对象 baye.hooks ,称之为 钩子对象 ,此对象作为引擎与脚本衔接的纽带。 引擎在一系列特定的时间点会调用 baye.hooks 里面的 钩子函数 来完成特定任务。

当lib开启了脚本功能后,引擎在启动时会执行 script.js 文件内的代码。因此, script.js 文件的主要作用就是往 baye.hooks 对象里面填充我们需要关注的 钩子函数 来实现特定功能。

示例:

baye.hooks.giveTool = function(context) {
    //简单示例,赏赐成功
    context.result = 1;
}

如上,每当引擎执行到赏赐功能的时候会调用 baye.hooks.giveTool 这个钩子函数,达到” 询问 脚本是否要允许赏赐“这个目的。

霸业脚本编写向导

了解了原理后,我们就可以一步一步来编写霸业脚本了。

假如我们要实现这么一个功能: 每月对AI控制的人物执行升级

为实现此功能,我们需要在写一些功能代码,并且让引擎在每次策略结束后执行我们的代码。

Step1: 让引擎每次策略结束后执行我们的代码

我们设置钩子函数 baye.hooks.tacticStage4 (详细介绍参考下文 钩子函数手册 )

baye.hooks.tacticStage4 = function() {
    //待续
};

Step2: 遍历所有人物,如果有归属,且归属不是玩家君主, 且等级未满上限,升级之:

baye.hooks.tacticStage4 = function() {
    var allPerson = baye.data.g_Persons;
    var playerKingId = baye.data.g_PlayerKing + 1;
    var maxLevel = baye.data.g_engineConfig.maxLevel;

    for (var i = 0; i < allPerson.length; i++) {
        var p = allPerson[i];
        if (p.Belong > 0 && p.Belong != playerKingId && p.Level < maxLevel) {
            p.Level = p.Level + 1;
        }
    }
};

注:

  1. 关于 baye.data 内的数据参考后文 数据手册
  2. allPerson[i] : 取列表里第 i 个元素(也就是第i个人物的数据)
  3. && : 并且
  4. != : 不等于

Step3: 进一步完善

当人物处于被俘虏状态时,归属被设置为255,因此进一步排除俘虏被升级:

baye.hooks.tacticStage4 = function() {
    var allPerson = baye.data.g_Persons;
    var playerKingId = baye.data.g_PlayerKing + 1;
    var maxLevel = baye.data.g_engineConfig.maxLevel;

    for (var i = 0; i < allPerson.length; i++) {
        var p = allPerson[i];
        if (
            p.Belong > 0
            && p.Belong != playerKingId
            && p.Belong != 255
            && p.Level < maxLevel
        ) {
            p.Level = p.Level + 1;
        }
    }
};

Step4: 加入概率因素:

baye.hooks.tacticStage4 = function() {
    var allPerson = baye.data.g_Persons;
    var playerKingId = baye.data.g_PlayerKing + 1;
    var maxLevel = baye.data.g_engineConfig.maxLevel;

    for (var i = 0; i < allPerson.length; i++) {
        var p = allPerson[i];
        if (
            p.Belong > 0
            && p.Belong != playerKingId
            && p.Belong != 255
            && p.Level < maxLevel
        ) {
            var chance = Math.random(); //产生一个0~1之间的随机数
            if (chance < 0.7) {// 随机数小于0.7升级,也就是70%的概率升级
                p.Level = p.Level + 1;
            }
        }
    }
};

调试方法

我们使用PC浏览器的 “开发者工具” 来调试脚本。以Chrome浏览器为例,打开baye页面后按 F12 打开“开发者工具”。 如下图:

打开开发者工具

实时查看和修改引擎数据

霸业的引擎数据存放在 baye.data 对象中,浏览器控制台中输入 baye.data. 浏览器会弹出自动补全菜单,对象中有哪些属性一览无余。如图:

自动补全

查看第一个城池的归属:

查看城池归属

修改第一个城池的归属:

修改城池归属

修改后移动一下城池光标,可以看到已经实时生效。

实时替换钩子函数

调试钩子函数时,如果每次修改一点脚本,又重新打包lib->重新加载运行,会非常麻烦。 当我们修改了钩子函数后,只需在浏览器控制台对该钩子重新赋值,该钩子就即时生效。如图:

修改钩子函数

添加调试日志

有时候为调试代码中的逻辑是否按预想的逻辑正常执行,我们需要得到一些实时输出信息。 我们用 console.log 来实现日志功能。

例如,前面的升级功能,我们要先看升级功能有没有正常执行,可以添加一些日志:

baye.hooks.tacticStage4 = function() {
    var allPerson = baye.data.g_Persons;
    var playerKingId = baye.data.g_PlayerKing + 1;
    var maxLevel = baye.data.g_engineConfig.maxLevel;

    for (var i = 0; i < allPerson.length; i++) {
        var p = allPerson[i];
        if (p.Belong > 0 && p.Belong != playerKingId && p.Level < maxLevel) {
            p.Level = p.Level + 1;
            var name = baye.getPersonName(i);
            console.log(name + " 升级为: " + p.Level);
        }
    }
};

策略结束后,可见到控制台打印如下:

打印日志

霸业API手册

数据手册

霸业引擎数据都导出到了 baye.data 对象里。

以下摘自霸业引擎源码,后续有时间更新更详细说明。

baye.data 属性

/*变量定义*/
/*------------------------------------------*/
baye.data.g_FightMap[];             /* 战斗地图屏显缓存 */
baye.data.g_FightPath[];            /* 战斗行军计算 */
baye.data.g_FgtAtkRng[];            /* 攻击范围 */
baye.data.g_TileId;         /* 当前地图所用tile的ID */
baye.data.g_EneTmpProv;             /* 战斗模块,敌人粮草临时变量 */

baye.data.g_MapWid;         /* 战斗地图宽度 */
baye.data.g_MapHgt;         /* 战斗地图高度 */
baye.data.g_FightMapData[];   /* 战场地形数据矩阵 */

baye.data.g_screenWidth; //屏幕宽度
baye.data.g_screenHeight; // 屏幕高度
baye.data.g_FlipDrawing;  //镜像绘图
baye.data.g_disablePushMessage; //屏蔽消息
baye.data.g_MenuTouchComfirm; 菜单项选中是否需要二次确认

baye.data.g_FoucsX;     /* 光标的地图坐标 */
baye.data.g_FoucsY;
baye.data.g_MapSX;      /* 当前地图显示的起始坐标 */
baye.data.g_MapSY;
baye.data.g_PathSX,
baye.data.g_PathSY; /* 行军范围地图起始坐标 */
baye.data.g_PUseSX,
baye.data.g_PUseSY; /* 行军范围使用起始坐标 */
baye.data.g_BakUpX,
baye.data.g_BakUpY; /* 将领坐标备份 */
baye.data.g_CityX,
baye.data.g_CityY;  /* 城市坐标 */
baye.data.g_FgtOver;                /* 战斗是否结束 */
baye.data.g_FgtWeather;             /* 战场天气情况 */
baye.data.g_FgtBoutCnt;             /* 战斗回合计数 */
baye.data.g_MainGenIdx;             /* 主将序号 */
baye.data.g_LookEnemy;              /* 是否观看敌人移动 */
baye.data.g_LookMovie;              /* 是否观看战斗动画 */
baye.data.g_MoveSpeed;              /* 战斗中移动速度 */
baye.data.g_FgtParam;               /* 战斗模块接口参数 */
    baye.data.g_FgtParam.Mode;                              /* 玩家的战斗模式FGT_DF|FGT_AT */
    baye.data.g_FgtParam.Way;                               /* 战斗进攻方向 */
    baye.data.g_FgtParam.MapId;                             /* 城市战斗地图 */
    baye.data.g_FgtParam.CityIndex;                         /* 城市id */
    baye.data.g_FgtParam.MProvender;                        /* 玩家粮草 */
    baye.data.g_FgtParam.EProvender;                        /* 敌人粮草 */
    baye.data.g_FgtParam.GenArray[20];              /* 将领队列 */
baye.data.g_GenPos[20];     /* 将领地图位置及基本属性 */
    baye.data.g_GenPos[?].x;                                /* 地图坐标x */
    baye.data.g_GenPos[?].y;                                /* 地图坐标y */
    baye.data.g_GenPos[?].hp;                               /* 生命 */
    baye.data.g_GenPos[?].mp;                               /* 技能点 */
    baye.data.g_GenPos[?].move;                             /* 移动力 */
    baye.data.g_GenPos[?].active;                           /* 将领执行命令能力 */
    baye.data.g_GenPos[?].state;                            /* 状态 */
baye.data.g_GenAtt[2];              /* 攻击状态下的两个将领属性 */
    baye.data.g_GenAtt[?].canny;                            /* 中计谋的可能性 */
    baye.data.g_GenAtt[?].ter;                              /* 将领所在地形 */
    baye.data.g_GenAtt[?].bile;                             /* 愤怒值 */
    baye.data.g_GenAtt[?].armsType;                 /* 兵种 */
    baye.data.g_GenAtt[?].at;                               /* 攻击力 */
    baye.data.g_GenAtt[?].df;                               /* 防御力 */
    baye.data.g_GenAtt[?].generalIndex;                     /* 将领id */

baye.data.g_AutoUpdateMapXY;

/*变量定义*/
/*------------------------------------------*/
baye.data.g_PlayerKing;             /*玩家君主*/
baye.data.g_YearDate;                       /*当前日期*/
baye.data.g_MonthDate;                      /*当前日期*/
baye.data.g_PIdx;                   /*历史时期*/
baye.data.g_Persons[250];           /*存放人才属性指针*/
    baye.data.g_Persons[?].OldBelong;               /*俘虏的旧归属*/
    baye.data.g_Persons[?].Belong;                  /*归属*/
    baye.data.g_Persons[?].Level;                   /*等级*/
    baye.data.g_Persons[?].Force;                   /*武力*/
    baye.data.g_Persons[?].IQ;                              /*智力*/
    baye.data.g_Persons[?].Devotion;                        /*忠诚*/
    baye.data.g_Persons[?].Character;                       /*性格*/
    baye.data.g_Persons[?].Experience;                      /*经验*/
    baye.data.g_Persons[?].Thew;                    /*体力*/
    baye.data.g_Persons[?].ArmsType;                        /*兵种*/
    baye.data.g_Persons[?].Arms;                    /*兵力*/
    baye.data.g_Persons[?].Equip[2];                        /*装备*/
    baye.data.g_Persons[?].Age;                             /*年龄*/
baye.data.g_Cities[38];     /*存放城市属性指针*/
    baye.data.g_Cities[?].State;
    baye.data.g_Cities[?].Belong;                   /*归属*/
    baye.data.g_Cities[?].SatrapId;                 /*太守编号*/
    baye.data.g_Cities[?].FarmingLimit;             /*农业上限*/
    baye.data.g_Cities[?].Farming;                  /*农业开发度*/
    baye.data.g_Cities[?].CommerceLimit;            /*商业上限*/
    baye.data.g_Cities[?].Commerce;                 /*商业开发度*/
    baye.data.g_Cities[?].PeopleDevotion;           /*民忠*/
    baye.data.g_Cities[?].AvoidCalamity;            /*防灾*/
    baye.data.g_Cities[?].PopulationLimit;          /*人口上限*/
    baye.data.g_Cities[?].Population;                       /*人口*/
    baye.data.g_Cities[?].Money;                    /*金钱*/
    baye.data.g_Cities[?].Food;                     /*粮食*/
    baye.data.g_Cities[?].MothballArms;             /*后备兵力*/
    baye.data.g_Cities[?].PersonQueue;                      /*人才队列*/
    baye.data.g_Cities[?].Persons;                  /*人才数*/
    baye.data.g_Cities[?].ToolQueue;                        /*道具队列*/
    baye.data.g_Cities[?].Tools;                    /*道具数*/
baye.data.g_PersonsQueue[PERSON_MAX];       /*人才队列*/
baye.data.g_GoodsQueue[GOODS_MAX];  /*道具队列*/
baye.data.g_CityPos;                /*当前城市地图显示位置结构*/
baye.data.g_Tools[];        /*存放道具属性指针*/
    baye.data.g_Tools[?].idx;                       /* 道具序号 */
    baye.data.g_Tools[?].useflag;           /* 使用标志:是被使用还是被装备*/
    baye.data.g_Tools[?].atRange[30];               /* 攻击范围数据 */
    baye.data.g_Tools[?].changeAttackRange;         /* 是否改变攻击范围 */
    baye.data.g_Tools[?].at;                        /* 对武力的加层 */
    baye.data.g_Tools[?].iq;                        /* 对智力的加层 */
    baye.data.g_Tools[?].move;                      /* 对移动力的加层 */
    baye.data.g_Tools[?].arm;                       /* 对兵种的改变 */
baye.data.g_Skills[];  /* 技能属性 */
    baye.data.g_Skills[?].aim;                              /* 施展目标 */
    baye.data.g_Skills[?].state;                            /* 技能对目标状态的影响 */
    baye.data.g_Skills[?].power;                            /* 对兵力的基本伤害 */
    baye.data.g_Skills[?].destroy;                  /* 对粮草的基本伤害 */
    baye.data.g_Skills[?].useMp;                            /* 消耗技能点 */
    baye.data.g_Skills[?].weather[5];                       /* 天气效果(0为不可施展 1-100%效果)*/
    baye.data.g_Skills[?].eland[8];                 /* 敌人所在地形效果(0为不可施展 1-100%效果)*/
    baye.data.g_Skills[?].oland[8];                 /* 我方所在地形效果(0为不可施展 1-100%效果)*/
    baye.data.g_Skills[?].earm[6];                  /* 敌人兵种加层(0为不可施展 1-100%效果)*/


baye.data.g_engineConfig // 引擎参数设置
    baye.data.g_engineConfig.fixCityOffset;    //纠正城市偏移
    baye.data.g_engineConfig.fixThewOverFlow;  //修复体力溢出bug
    baye.data.g_engineConfig.fixFoodOverFlow;  //修复出征刷粮草
    baye.data.g_engineConfig.fixOverFlow16;    //修复多处16位溢出
    baye.data.g_engineConfig.fixConsumeMoney;  //启用招降收费
    baye.data.g_engineConfig.fixFightMoveOutRange; //修复战场瞬移
    baye.data.g_engineConfig.fixAlienateComsumeThew; //修复离间减小敌将体力问题
    baye.data.g_engineConfig.enableToolAttackRange; //启用"道具改变攻击范围"
    baye.data.g_engineConfig.enable16bitConsumeMoney;   //启用扩展金钱消耗(16位)
    baye.data.g_engineConfig.enableScript;              //启用脚本
    baye.data.g_engineConfig.disableSL;              //禁SL
    baye.data.g_engineConfig.aiLevelUpSpeed;            //AI升级速度 (0~100, 0使用原版默认策略)
    baye.data.g_engineConfig.disableAgeGrow;         //禁用年龄增长
    baye.data.g_engineConfig.ratioOfFoodToArmsPerMouth; // 市政兵力和粮耗(默认50,越大粮耗越少)
    baye.data.g_engineConfig.ratioOfFoodToArmsPerDay; //战场兵力和粮耗参数(默认3,越大粮耗越少)
    baye.data.g_engineConfig.armsPerDevotion;        //征兵量和民忠的关系(默认20)
    baye.data.g_engineConfig.armsPerMoney;           //每个金钱能购买的士兵数(默认10)
    baye.data.g_engineConfig.maxLevel;                //最大等级
    baye.data.g_engineConfig.responseNoteOfBettle;   //"战斗提示"允许按键跳过(默认0,填2允许)
    baye.data.g_engineConfig.aiDefenceMode;          // AI行军策略,默认0追主将,1守城
    baye.data.g_engineConfig.aiAttackMethod;          // AI攻击时选择技能/普攻的算法(0原版,1优化版)
    baye.data.g_engineConfig.batlleDisableWeatherChange;    // 禁止战场天气变化
    baye.data.g_engineConfig.mainMenuButtonRects[16];   // 主界面4个按钮的边框位置
    baye.data.g_engineConfig.periodMenuButtonRects[16]; // 时期界面4个按钮的边框位置
    baye.data.g_engineConfig.saveFaceListAnchor[2];      // 存档界面list左上角坐标

钩子函数手册

baye.hooks.aiFightCommand

功能 战场调用脚本进行行军计算及战斗命令选择,可利用此钩子实现自定义AI行军算法。
调用时机 AI每次计算将领行军策略前

输入参数

参数 类型 说明
context.sIdx U8 需要计算的行军将领的 战场序号

输出参数

参数 类型 说明
context.type U8 命令类型,0 普攻, 1 技能, 3 休息
context.param U8 技能序号(如果选择技能)
context.aIdx U8 攻击或技能目标将领的 战场序号

baye.hooks.getSkillIds

功能 获取将领当前可使用的技能
调用时机 战场每当AI或玩家使用技能前

输入参数

参数 类型 说明
context.generalIndex U8 将领的 战场序号

输出参数

参数 类型 说明
context.skillIds [U8] 技能号数组

baye.hooks.calcAttackRange

功能 计算攻击范围
调用时机 战场每次下攻击命令

输入参数

参数 类型 说明
context.personIndex U8 将领 序号
context.ter U8 将领所处地形
context.type U8 攻击类型,0 普攻,1 技能
context.skillId U8 技能 ID

输出参数

参数 类型 说明
context.range [U8] 攻击范围矩阵
context.rangeSize U8 攻击范围矩阵的边长,如5x5矩阵填写5

baye.hooks.showSkill

功能 施展技能是否成功 可用于调整技能成功率。
调用时机 施展技能时

输入参数

参数 类型 说明
context.ter U8 将领所处地形
context.skillId U8 技能 ID

输出参数

参数 类型 说明
context.result U8 是否成功,0 失败, 1 成功 (原context.success)

baye.hooks.giveTool

功能 用于控制赏赐命令是否成功
调用时机 执行赏赐命令,道具即将被装到人物时

输入参数

参数 类型 说明
context.personIndex U8 将领所处地形
context.toolIndex U8 技能 ID

输出参数

参数 类型 说明
context.result U8 是否成功,0 失败, 1 成功

baye.hooks.takeOffTool

功能 用于控制没收命令是否成功
调用时机 执行赏赐命令,道具即将被装到人物时

输入参数

参数 类型 说明
context.personIndex U8 将领所处地形
context.toolIndex U8 技能`ID`

输出参数

参数 类型 说明
context.result U8 是否成功,0 失败, 1 成功

baye.hooks.didOpenNewGame

功能 自由
调用时机 新开局时
输入参数
输出参数

baye.hooks.didLoadGame

功能 自由
调用时机 成功读档后
输入参数
输出参数

baye.hooks.willSaveGame

功能 自由
调用时机 执行存档前
输入参数
输出参数

baye.hooks.tacticStage1

功能 自由
调用时机 策略阶段1
输入参数
输出参数

引擎的运行,最顶层分为如下几个阶段循环运行:

  • 判断统一或全军覆灭
  • 更新每个城池的太守
  • 玩家策略中 (玩家操作下各种命令,策略结束后继续后续步骤)
  • 电脑策略中
  • 执行命令(包括市政和军备等命令)
  • 执行数据更新策略(如粮草收获等)

现脚本系统在此间插入了5个钩子点:

  • 判断统一或全军覆灭
  • 更新每个城池的太守
  • 调用tacticStage1
  • 玩家策略中 (玩家操作下各种命令,策略结束后继续后续步骤)
  • 调用tacticStage2
  • 电脑策略中
  • 调用tacticStage3
  • 执行命令(包括市政和军备等命令)
  • 调用tacticStage4
  • 执行数据更新策略(如粮草收获等)
  • 调用tacticStage5

baye.hooks.tacticStage2

功能 自由
调用时机 策略阶段2
输入参数
输出参数

baye.hooks.tacticStage3

功能 自由
调用时机 策略阶段3
输入参数
输出参数

baye.hooks.tacticStage4

功能 自由
调用时机 策略阶段5
输入参数
输出参数

baye.hooks.tacticStage5

功能 自由
调用时机 策略阶段5
输入参数
输出参数

baye.hooks.willAddOrder

功能 自由
调用时机 即将下达某命令

输入参数

参数 类型 说明
context.OrderId U8 命令ID
context.Person U8 执行命令的人物
context.City U8 执行命令的城池
context.Object U8 执行命令的目标人物ID或目标城池ID
context.Arms U16 兵力(运输)
context.Food U16 粮草(运输)
context.Money U16 金钱(运输)
context.Consume U8 命令耗时(暂无用处)
context.TimeCount U8 命令累时(暂无用处)

输出参数

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.willExecuteOrder

功能 自由
调用时机 即将执行某命令

输入参数

参数 类型 说明
context.OrderId U8 命令ID
context.Person U8 执行命令的人物
context.City U8 执行命令的城池
context.Object U8 执行命令的目标人物ID或目标城池ID
context.Arms U16 兵力(运输)
context.Food U16 粮草(运输)
context.Money U16 金钱(运输)
context.Consume U8 命令耗时(暂无用处)
context.TimeCount U8 命令累时(暂无用处)

输出参数

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.enterBattle

功能 自由
调用时机 进入战场
输入参数
输出参数

baye.hooks.battleStage1

功能 自由
调用时机 战场阶段1
输入参数
输出参数

baye.hooks.battleStage2

功能 自由
调用时机 战场阶段2
输入参数
输出参数

baye.hooks.battleStage3

功能 自由
调用时机 战场阶段3
输入参数
输出参数

baye.hooks.battleStage4

功能 自由
调用时机 战场阶段5
输入参数
输出参数

baye.hooks.battleStage5

功能 自由
调用时机 战场阶段5
输入参数
输出参数

baye.hooks.exitBattle

功能 自由
调用时机 战争结束
输入参数
输出参数

baye.hooks.cityMakeCommand

功能 自由
调用时机 城池菜单选择某命令

输入参数

参数 类型 说明
context.cityIndex U8 城池序号
context.commandIndex U8 命令序号

输出参数

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return 1; 提示错误 并跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.willGiveTool

功能 自由
调用时机 即将赏赐某道具给某人

输入参数

参数 类型 说明
context.cityIndex U8 城池序号
context.personIndex U8 人物序号
context.toolIndex U8 道具序号

输出参数

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.willTakeOffTool

功能 自由
调用时机 即将没收某人某道具

输入参数

参数 类型 说明
context.cityIndex U8 城池序号
context.personIndex U8 人物序号
context.toolIndex U8 道具序号

输出参数

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.countAttackHurt

功能 计算普通攻击对兵力伤害
调用时机 计算普通攻击对兵力伤害

输入参数 无, 攻防双方数据已存储于全局变量 baye.data.g_GenAtt[]

输出参数

参数 类型 说明
context.hurt U8 兵力伤害值

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.countSkillHurt

功能 计算技能对兵力和粮草的伤害
调用时机 计算技能对兵力和粮草的伤害

输入参数 攻防双方数据已存储于全局变量 baye.data.g_GenAtt[]

参数 类型 说明
context.skillId U8 技能ID
context.origin U8 原始目标对象,AOE时使用

输出参数

参数 类型 说明
context.hurt U8 兵力伤害值
context.prov U8 粮草伤害值
context.state U8 输出异常状态

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.battleBuildAttackAttriutes

功能 计算将领的攻防等属性
调用时机 计算将领的攻防等属性

输入参数

参数 类型 说明
context.index U8 计算结果存储位置
context.generalIndex U8 将领的 战场序号

输出参数 将结果存储于存储于全局变量 baye.data.g_GenAtt[context.index]

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.getSkillIds

功能 获取将领的技能清单
调用时机 获取将领的技能清单

输入参数

参数 类型 说明
context.generalIndex U8 将领的 战场序号

输出参数

参数 类型 说明
context.skillIds [U8] 技能ID数组

返回值

baye.hooks.battleDrivePersonState

功能 驱动战场将领自定义状态 可用于自定义状态造成将领兵力伤害或补给。
调用时机 驱动战场将领自定义状态

输入参数

参数 类型 说明
context.generalIndex U8 将领的 战场序号

输出参数

返回值 0 有变化, 1 无变化

baye.hooks.getMaxArms

功能 获取人物最大可分配兵力
调用时机 玩家或AI执行分配命令前

输入参数

参数 类型 说明
context.personIndex U8 将领的序号

输出参数

参数 类型 说明
context.maxArms U8 最大兵力

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.getToolPropertyValue

功能 获取道具属性值
调用时机 显示道具属性表时

输入参数

参数 类型 说明
context.toolIndex U8 道具序号
context.propertyIndex U8 属性序号

输出参数

参数 类型 说明
context.value String 属性值

返回值

baye.hooks.getToolPropertyTitle

功能 获取道具属性表头
调用时机 显示道具属性表时

输入参数

参数 类型 说明
context.propertyIndex U8 属性序号

输出参数

参数 类型 说明
context.title String 属性表头字串

返回值

相关全局配置

baye.data.toolPropertiesCount U8 属性表列数量
baye.data.toolPropertiesDisplayWitdh [U8] 属性表各列宽度

baye.hooks.getPersonPropertyValue

功能 获取人物属性值
调用时机 显示人物属性表时

输入参数

参数 类型 说明
context.personIndex U8 人物序号
context.propertyIndex U8 属性序号

输出参数

参数 类型 说明
context.value String 属性值

返回值

baye.hooks.getPersonPropertyTitle

功能 获取人物属性表头
调用时机 显示人物属性表时

输入参数

参数 类型 说明
context.propertyIndex U8 属性序号

输出参数

参数 类型 说明
context.title String 属性值

返回值

相关全局配置

baye.data.personPropertiesCount U8 属性表列数量
baye.data.personPropertiesDisplayWitdh [U8] 属性表各列宽度

baye.hooks.getCityPropertyDisplay

功能 获取城池属性行
调用时机 显示城池属性时

输入参数

参数 类型 说明
context.cityIndex U8 城市序号
context.propertyIndex U8 属性序号

输出参数

参数 类型 说明
context.display String 属性行

返回值

相关全局配置

baye.data.cityPropertiesCount U8 属性表行数量

baye.hooks.getFighterInfo

功能 战场上获取人物信息字符串
调用时机 战场上查看人物信息时

输入参数

参数 类型 说明
context.generalIndex U8 人物战场序号

输出参数

参数 类型 说明
context.info String 面板显示文本信息

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.getTerrainInfo

功能 战场上获取地形信息字符串
调用时机 战场上查看地形信息时

输入参数

参数 类型 说明
context.ter U8 地形序号

输出参数

参数 类型 说明
context.info String 面板显示文本信息

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.showAbout

调用时机 显示开发群组页面

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.willShowPKAnimation

调用时机 即将显示战斗动画

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.didShowPKAnimation

调用时机 战斗动画之后

baye.hooks.showMiniMap

调用时机 显示小地图

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.showMainHelp

调用时机 主策略界面按下 帮助 键或点击 屏幕右下角

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.didShowFightStateBar

调用时机 战场完成状态栏显示

baye.hooks.didRefreshFightStateBar

调用时机 战场完成状态栏刷新

baye.hooks.didShowFightSituation

调用时机 完成显示战场形势图

baye.hooks.didRefreshFightSituation

调用时机 战场形势图刷新

baye.hooks.loadFightMap

功能 加载战场地形数据矩阵
调用时机 进入战场

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

示例:

baye.hooks.loadFightMap = function() {
    var city = baye.data.g_FgtParam.CityIndex;
    var name = baye.getCityName(city);

    console.log('城池序号:' + city);
    console.log('城池名称:' + name);
    console.log('进攻方向:' + baye.data.g_FgtParam.Way);

    switch (name) {
        case '汉中': {
            baye.data.g_MapWid = 17;
            baye.data.g_MapHgt = 18;
            baye.data.g_FightMapData = [
 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 1, 1, 3, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1,
 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1,
 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1,
 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1,
 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1,
 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1,
 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 5, 1, 2, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1,20,16,16,16,
 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,17,20,16,24,
 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1,17,17,17,17,
 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1,17,23,16,21,
 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 5, 1, 1,23,16,16,16,
            ];
            break;
        }
        default:
            return -1;
    }
    return 0;
};

baye.hooks.getPersonName

功能 自定义人物名称

输入参数

参数 类型 说明
context.personIndex U8 人物序号

输出参数

参数 类型 说明
context.name String 人物名称

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.showStateChanged

功能 自定义显示状态变化

输入参数

参数 类型 说明
context.generalIndex U8 战场序号
context.state U8 变化后的状态

输出参数

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.drawGenerals

功能 显示所有将领图片 用于自定义将领战场图

输入参数

参数 类型 说明
context.frame U8 帧序号0或1

输出参数

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

baye.hooks.countMove

功能 计算人物移动力 结果存放于g_GenPos

输入参数

参数 类型 说明
context.generalIndex U8 将领战场序号

输出参数

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

示例

baye.hooks.countMove = function(c) {
    baye.data.g_GenPos[c.generalIndex].move = 2;
}

baye.hooks.countLandResistance

功能 计算地形对人物的阻力 结果存放于g_GenPos

输入参数

参数 类型 说明
context.generalIndex U8 将领战场序号

输出参数

参数 类型 说明
context.result [U8] 各地形对人物的阻力

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

示例

baye.hooks.countLandResistance = function(context) {
    // 0x80 0x81 0x82 0x83 ... 阻力依次递增
    // 输出46种地形对将领的阻力
    for (var i = 0; i < 46; i++) context.result[i] = 0x81;
}

baye.hooks.countMoveRange

功能 计算人物移动范围 结果存放于g_FightPath

使用此钩子可完全自定义计算将领移动范围

此钩子可代替 [移动力钩子+阻力钩子] 实现更灵活的移动范围计算

输入参数

参数 类型 说明
context.generalIndex U8 将领战场序号

输出参数

参数 类型 说明
baye.data.g_FightPath [U8] 移动范围[15x15]矩阵, 0x80以上不可达 * 0x80及以下可到达 * 0x81以上不可到达 * 0x00 0x80 不显示光标但可以到达

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

示例

baye.hooks.countMoveRange = function(context) {
    for (var i = 0; i < 15*15; i++) {
        baye.data.g_FightPath[i] = 0x79;
    }
}

baye.hooks.fontImageForChar

功能 获取扩展字体图片序号 用于显示GB2312不支持的字体

输入参数

参数 类型 说明
context.code U16 文字的GBK编码

输出参数

参数 类型 说明
context.index U16 对应assets/003_MAIN_SPE.assets/1/下的图片序号

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

示例:

baye.hooks.fontImageForChar = function(c) {

    // index为 assets/003_MAIN_SPE.assets/1 下图片序号

    var index = {
        0x82e0: 0, // 傕
        0x90aa: 1, // 惇
        0xb574: 2, // 祎
        0x8faa: 3, // 彧
        0xe041: 4, // 郃
        0xab64: 5, // 玠
        0xae8f: 6, // 畯
        0x85b1: 7, // 叡
    }[c.code];

    if (index != undefined) {
        c.index = index;
    }
};

baye.hooks.willOpenMenu

调用时机 即将显示menu时调用

输入参数

参数 类型 说明
context.index U16 初始选中序号

baye.hooks.willChangeMenuSelection

调用时机 即将menu变更选中项

输入参数

参数 类型 说明
context.index U16 变更后的选中项

baye.hooks.willCloseMenu

调用时机 即将关闭menu

输入参数

参数 类型 说明
context.index U16 最终选中项

baye.hooks.fightCountWinner

调用时机 电脑攻打电脑计算胜利方

baye.hooks.willShowCityInfo

调用时机 显示城市状态

示例:

baye.hooks.willShowCityInfo = function(c) { console.log("city:" + c.city); }

baye.hooks.fightWillShowHelp

调用时机 战场即将显示帮助(包括武将信息和地形信息)

返回值

return 0; 代表由钩子处理, 将跳过引擎默认处理程序
return -1; 将使用引擎默认处理程序

功能函数

baye.getPersonName(index)

功能
获取人物名称

参数

参数 类型 说明
index U8 将领序号
返回值
string 人物名称

baye.getToolName(index)

功能
获取道具名称

参数

参数 类型 说明
index U8 道具序号
返回值
string 道具名称

baye.getSkillName(index)

功能
获取技能名称

参数

参数 类型 说明
index U8 技能序号
返回值
string 技能名称

baye.getCityName(index)

功能
获取城池名称

参数

参数 类型 说明
index U8 城池序号
返回值
string 城池名称

baye.setCustomData(data)

功能
存入自定义数据,自定义数据会存储进存档当中

参数

参数 类型 说明
data string 自定义数据

返回值

baye.getCustomData()

功能
取出之前存储的自定义数据

参数

返回值
string 之前存储的数据,若没存过,返回null

baye.alert(msg, then)

显示文字提示

baye.say(personIndex, msg, then)

显示人物对话

baye.delay(ticks, flag, then)

延时

baye.playSPE(x, y, speid, index, flag, then)

播放动画

baye.choose(x, y, w, h, items, init, then)

显示选择菜单

baye.centerChoose(w, h, items, init, then)

居中显示选择菜单

baye.choosePerson(items, init, then)

显示选择人数界面

baye.chooseTool(items, init, then)

显示选择道具界面

baye.getPersonByName(name)

获取人物数据

baye.getCityByName(name)

获取城池数据

baye.getFighterIndexByName(name)

baye.getFighterPositionByName(name)

baye.getPersonNameByID(id)

baye.getTerrainByGeneralIndex(index)

baye.putPersonInCity(city, person)

往城池中添加人物,注意需要手动删除原城池中该人物

baye.putToolInCity(city, tool, hide)

往城池中添加道具

baye.deletePersonInCity(city, person)

删除城池中的人物

baye.deleteToolInCity(city, tool)

删除城中道具

baye.getPersonByGeneralIndex(gIndex)

baye.moveHere(name)

baye.drawText(x, y, text)

绘文字

baye.drawImage(x, y, resid, resitem, picIndex)

画图片

baye.clearRect(left, top, right, bottom)

清除矩形

baye.revertRect(left, top, right, bottom)

反显矩形

baye.drawLine(startX, startY, endX, endY)

画直线

baye.drawRect(left, top, right, bottom)

画矩形

baye.drawDot(x, y, color)

画点

baye.getNumber(min, max, then)

获取玩家输入一个数字(可用于输入密码等)

示例:

baye.hooks.showMainHelp = function(context) {
    var min = 100;
    var max = 200;
    baye.getNumber(min, max, function(c) { console.log("选择了:" + c); });
}