英雄的黎明2,自1270版本起,将在剧本编辑器中支持自定义建筑系统。剧本开发者可以扩展新的建筑类型。
目标:添加一个星际争霸中人族地堡bunker。 限制:
到目前为止,已经可以在游戏中建造【地堡】了。但是没有任何效果。后面我们需要使用脚本给【地堡】添加攻击的功能。
脚本内容如下,带注释
/*
英雄的黎明2脚本系统
手册:https://lmcd.xyz/doc/LMCD.html
*/
var handle = {
OnNewTurn:OnNewTurnFunc, // 每回合回调函数
};
RegGameHandler(handle); //注册回调函数
// 经过前面的注册后,本函数会在每个回合结束时执行
function OnNewTurnFunc(){
console.log("on new turn");
// 调用地堡攻击函数
DoAllBunkerAttack();
}
function DoAllBunkerAttack(){
// 查询所有地堡。地堡在本剧本新建建筑里的id是203。
var bunkers = Story.GetFacilitys(f=>{
return f.type == 203 && f.comp;
});
// 让所有地堡执行攻击
for (var i=0; i<bunkers.length; i++){
DoBunkerAttack(bunkers[i]);
}
}
function DoBunkerAttack(bunker){
var bunker_info = Story.GetFacilityInfo(bunker.type);
// 搜索周围敌人
var xyrange = MAP.GetRange({
from:bunker.xy,
max_radius:bunker_info.max_range,
min_radius:bunker_info.min_range,
});
console.log("xyrange.len=" + xyrange.length);
// 声明一个数组,用以存放敌军坐标
var enemy_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 != bunker.groupid){
// groupid(势力id)不一样,表示是敌军,记录敌军坐标
// 这里忽略了盟军,所以会连盟军一块攻击
enemy_list.push(other_army);
}
}
// 执行攻击搜索出来的敌军
for (var i=0; i<enemy_list.length; i++){
var enemy = enemy_list[i];
var damage = bunker_info.value;
// 播放哒哒哒音效
Control.PlaySFX("res:3");
// 播放系统内置的机枪火光特效
MAP.PlayEffect("mgun_fire_1", {
from:bunker.xy,
to:enemy.xy,
count:3,
});
// 给被攻击的部队减少士兵
enemy.soldier -= damage;
// 弹出部队伤害数字
MAP.BubbleText(enemy.xy, "-"+damage);
// 如果被攻击部队士兵为0,调用部队击溃函数使部队消失。
if (enemy.soldier <= 0){
Story.DoArmyDie(enemy.id);
}
}
}