// 目标1:给刘备部队2级别菜单“计略”里扩展“说得”功能
// 声明一个变量保存刘备的武将id
var liubei_id = 636;
var handle = {
ModifyArmyMenu:ModifyArmyMenu,
};
RegGameHandler(handle); //注册回调函数
// 检查某个武将是否在某个部队里
function IsHeroInArmy(heroid, army){
console.log("IsHeroInArmy");
for (var i=0;i<army.heroids.length;i++){
console.log(army.heroids[i]);
if (heroid == army.heroids[i]){
return true;
}
}
return false;
}
var level = 0;
function PrintMenu(menu){
level++;
for (var i=0; i<menu.length; i++){
var item = menu[i];
console.log("l="+level + ",id="+item.id+","+item.name + ",i=" + item.interactable,",a="+item.active);
if (item.children != null){
PrintMenu(item.children);
level--;
}
}
}
function ModifyArmyMenu(armyid, menu){
// console.log("ModifyArmyMenu armyid:"+armyid + ",menu.len="+menu.length);
//PrintMenu(menu);
// 根据回调函数传入的部队id查询部队对象
var army = Story.GetArmy(armyid);
// 如果目标武将在部队里,执行菜单的扩展。
// 因为只有刘备支持,所以只在操作刘备部队时,执行扩展菜单的操作
if (IsHeroInArmy(liubei_id, army)){
// 在"计略"菜单menu[5]的子菜单最后追加“自爆”
// 为什么5?因为"计略"在部队菜单中的第6个
menu[5].children.push({
name:"说得(20)",
interactable: army.mp>20, // 因为这个技能要消耗20气力,如果气力大于20激活按钮。
active:true, // 表示菜单按钮是否可见
callback:cmd_shuode, // 点击该菜单按钮时的处理函数回调
});
// 返回true表示本函数修改过menu菜单。
return true;
}
// 返回false表示本函数没有修改过menu菜单。
return false;
}
function cmd_shuode(destarmyid){
// 查询操作的部队对象
var my_army = Story.GetArmy(destarmyid);
// 以my_army.xy为中心,搜索范围
var xyrange = MAP.GetRange({
from:my_army.xy,
max_radius:2,
min_radius:1,
});
console.log("xyrange.len=" + xyrange.length);
// 声明一个数组,用以存放敌军坐标
var emeny_xy_list = [];
// 遍历搜索出来的范围,检查范围内是否有敌军
for (var i=0; i<xyrange.length; i++){
// 从范围中获取一个坐标
var xy = xyrange[i];
// 查询这个坐标上是否有部队
var other_army = MAP.GetArmy(xy);
// 如果没有部队,continue让循环进入下一次
if (other_army == null){
continue;
}
// 如果有部队,检查是否是敌方部队.
if (other_army.groupid != my_army.groupid){
// groupid(势力id)不一样,表示是敌军,记录敌军坐标
emeny_xy_list.push(xy);
}
}
// 显示位置指示器,0xff0000ff红色
// 位置指示器会显示emeny_xy_list的数组里的敌方坐标,以及一个“取消”按钮
var destxy = MAP.ShowIndicator(emeny_xy_list, 0xff0000ff);
// 如果destxy为空,表示取消
if (destxy == null){
console.log("cancel selection");
// 点击取消,本函数返回false,整条命令撤销。
return false;
}
// 走到这里,表示玩家点击了某个坐标。
console.log("selected=" + destxy.x + "," + destxy.y);
// 根据玩家点击的坐标,查询部队
var destarmy = MAP.GetArmy(destxy);
// 对话情节
UI.Talk(my_army.heroids[0], "跟我混,吃香喝辣");
// =====利用随机数计算成功率=====
// 产生一个随机小数,范围是0-1
var r = Misc.RandomF(0,1);
// 如果产生的数大于0.5,就成功。此时的成功率是50%
var succ = r > 0.5;
if (succ){
UI.Talk(destarmy.heroids[0], "我这就跟走");
// TODO:由于部队改变阵营还没实现,暂时不实现
}else{
UI.Talk(destarmy.heroids[0], "国贼!我与你势不两立");
}
// 扣除20气力
my_army.mp -= 20;
// 设置部队已经行动
my_army.acted = true;
return true;
}