Files
noname_miaomiao/content.js
T
2024-07-25 00:15:48 +08:00

2601 lines
97 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import miaoTool from "./miaoTool.js";
export default (lib, game, ui, get, ai, _status) => (config, pack) => {
lib.miaoTool = miaoTool(lib, game, ui, get, ai, _status)
lib.miaoStorage = {
// 已初始化的style的class
initedStyle: []
};
// console.log(666,miaoTool(lib, game, ui, get, ai, _status))
/*---------------------------------------------------------------以下为杂项---------------------------------------------------------------*/
get.is.xuemai = function (skill) {
var info = lib.skill[skill];
if (typeof info.xuemai == "function") return info.xuemai(skill);
if (info.xuemai == false) return false;
if (info.trigger && info.forced) return true;
if (info.mod) return true;
if (info.xuemai) return true;
return false;
};
game.changeRoundNumber = function () {
/*接受输入num,游戏轮数+=num */
//event.trigger("changeRoundNumberBegin");
var num = 1,
source = _status.event.player,
is_skip = false;
for (var i = 0; i < arguments.length; i++) {
if (typeof arguments[i] == "number") {
num = arguments[i];
} else if (arguments[i] == "skip") {
is_skip = true;
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
}
}
if (is_skip) {
game.roundNumber += num;
} else {
while (num > 0) {
num--;
game.roundNumber++;
game.updateRoundNumber();
_status.event.trigger("roundStart");
}
}
game.updateRoundNumber();
//event.trigger("changeRoundNumberEnd");
};
// 重写废除判定区相关
lib.element.content.enableJudge = function () {
"step 0"
if (!player.storage._disableJudge || player.storage._disableJudge == false) event.finish();
// 多次废除恢复判断
if (!player.storage._disableJudge_layer) {
player.storage._disableJudge_layer = 0;
}
player.storage._disableJudge_layer--;
if (player.storage._disableJudge_layer < 0) {
player.storage._disableJudge_layer = 0;
event.finish();
}
if (player.storage._disableJudge_layer > 0) event.finish();
"step 1"
game.log(player, "恢复了判定区");
player.storage._disableJudge = false;
// player.markSkill('_disableJudge');
"step 2"
game.broadcastAll(function (player, card) {
player.$enableJudge();
}, player);
};
lib.element.content.disableJudge = function () {
"step 0"
// if (player.storage._disableJudge == true) return;
// 多次废除恢复判断
if (!player.storage._disableJudge_layer) {
player.storage._disableJudge_layer = 0;
}
player.storage._disableJudge_layer++;
if (player.storage._disableJudge_layer > 1) {
event.finish();
}
"step 1"
game.log(player, "废除了判定区");
var js = player.getCards("j");
if (js.length) player.discard(js);
player.storage._disableJudge = true;
//player.markSkill('_disableJudge');
"step 2"
game.broadcastAll(function (player, card) {
player.$disableJudge();
}, player);
};
// 并不是很好的写法
let gameAddPlayerBak = game.addPlayer
game.addPlayer = (position, character, character2) => {
let player = gameAddPlayerBak(position, character, character2)
// if (position < 0 || position > game.players.length + game.dead.length || position == undefined)
// position = Math.ceil(Math.random() * (game.players.length + game.dead.length));
// const players = game.players.concat(game.dead);
// ui.arena.setNumber(players.length + 1);
// players.forEach(value => {
// if (parseInt(value.dataset.position) >= position) value.dataset.position = parseInt(value.dataset.position) + 1;
// });
// const player = ui.create.player(ui.arena).animate("start");
// if (character) player.init(character, character2);
// //技能修复
// var skills=lib.character[character][3];
// if(character2)skills.concat(lib.character[character2][3])
// for(var i of skills){
// game.log(i)
// player.removeSkill(i)
// player.addSkill(i);
// }
// 属性
player.storage.enhancementArray = {
attack: 0, //攻击力
defend: 0, //防御力
miss: 0, //闪避率
hit: 0, //命中率
strike: 0, //暴击率,目前没用
draw: 0, //摸牌,目前没用
locked: false,
locked_end: -1,
locked_type: null
};
game.players.push(player);
player.playerid = get.id();
game.playerMap[player.playerid] = player;
// game.log(game.playerMap)
// for(var i in game.playerMap){
// game.log(i)
// }
// game.playerMap.push(player);
player.dataset.position = position;
game.arrangePlayers();
return player;
};
// //多位主公死亡情况
// lib.skill._miao_zhu_dying = {
// }
//更换武将头像
lib.element.player.changeAvatarMiao = function (imgFrom, imgTo) {
var path = this.node.avatar.style.backgroundImage.split(imgFrom)[0];
this.node.avatar.style.backgroundImage = path + imgTo + '")';
};
//获得限伤
lib.element.player.addDamageLimiter = function () {
if (!this.storage._damageLimiter_Miao) {
this.storage._damageLimiter_Miao = [];
}
var id = _status.event.name,
num = 1,
source = _status.event.player,
nolog = false;
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "nolog") {
nolog = true;
} else if (typeof arguments[i] == "number") {
num = arguments[i];
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
} else if (typeof arguments[i] == "string") {
id = arguments[i];
}
}
this.removeDamageLimiter(id, "noUnmark");
var Limiter = {};
Limiter.id = id;
Limiter.num = num;
Limiter.source = source;
this.storage._damageLimiter_Miao.push(Limiter);
this.markSkill("_DamageLimiter");
};
//移除限伤
lib.element.player.removeDamageLimiter = function () {
if (!this.storage._damageLimiter_Miao) {
this.storage._damageLimiter_Miao = [];
}
var id = _status.event.name,
noUnmark = false,
nolog = false;
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "nolog") {
nolog = true;
} else if (arguments[i] == "noUnmark") {
noUnmark = true;
} else if (typeof arguments[i] == "string") {
id = arguments[i];
}
}
for (var i = 0; i < this.storage._damageLimiter_Miao.length; i += 1) {
if (this.storage._damageLimiter_Miao[i].id == id) {
this.storage._damageLimiter_Miao.splice(i, 1);
}
}
if (this.storage._damageLimiter_Miao.length == 0 && noUnmark == false) this.unmarkSkill("_DamageLimiter");
};
lib.skill["_DamageLimiter"] = {
trigger: {
player: ["damageBegin3"]
},
filter: function (event, player) {
if (!player.storage._damageLimiter_Miao) return false;
var min = Infinity;
for (var i = 0; i < player.storage._damageLimiter_Miao.length; ++i) {
var limiter = player.storage._damageLimiter_Miao[i];
if (player.storage._damageLimiter_Miao[i].num < min) min = player.storage._damageLimiter_Miao[i].num;
}
return event.num > min;
},
priority: -705831,
forced: true,
silent:true,
charlotte: true,
unique: true,
mark: true,
marktext: "限伤",
intro: {
name: "最大伤害限制",
mark: function (dialog, storage, player) {
var min = Infinity;
for (var i = 0; i < player.storage._damageLimiter_Miao.length; ++i) {
var limiter = player.storage._damageLimiter_Miao[i];
if (player.storage._damageLimiter_Miao[i].num < min) min = player.storage._damageLimiter_Miao[i].num;
}
return "你受到的所有伤害不超过" + min + "点";
}
},
content: function () {
var min = Infinity;
for (var i = 0; i < player.storage._damageLimiter_Miao.length; ++i) {
var limiter = player.storage._damageLimiter_Miao[i];
if (player.storage._damageLimiter_Miao[i].num < min) min = player.storage._damageLimiter_Miao[i].num;
}
if (trigger.num > min) trigger.num = min;
game.log(player, "触发了限伤");
_status.event.trigger("damageLimit");
}
};
//获得缓伤,即百分比减伤
lib.element.player.addDamageMitigationer = function () {
if (!this.storage._damageMitigationer_Miao) {
this.storage._damageMitigationer_Miao = [];
}
var id = _status.event.name,
num = 1,
source = _status.event.player,
nolog = false;
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "nolog") {
nolog = true;
} else if (typeof arguments[i] == "number") {
num = arguments[i];
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
} else if (typeof arguments[i] == "string") {
id = arguments[i];
}
}
this.removeDamageMitigationer(id);
var Limiter = {};
Limiter.id = id;
Limiter.num = num;
Limiter.source = source;
this.storage._damageMitigationer_Miao.push(Limiter);
this.markSkill("_DamageMitigationer");
};
lib.element.player.removeDamageMitigationer = function () {
if (!this.storage._damageMitigationer_Miao) {
this.storage._damageMitigationer_Miao = [];
}
var id = _status.event.name,
nolog = false;
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "nolog") {
nolog = true;
} else if (typeof arguments[i] == "string") {
id = arguments[i];
}
}
for (var i = 0; i < this.storage._damageMitigationer_Miao.length; i += 1) {
if (this.storage._damageMitigationer_Miao[i].id == id) {
this.storage._damageMitigationer_Miao.splice(i, 1);
}
}
if (this.storage._damageMitigationer_Miao.length == 0) this.unmarkSkill("_DamageMitigationer");
};
lib.skill["_DamageMitigationer"] = {
trigger: {
player: ["damageBegin4"]
},
filter: function (event, player) {
if (!player.hp_float) {
player.hp_float = 0; //储存浮点位的hp
}
if (!player.storage._damageMitigationer_Miao || player.storage._damageMitigationer_Miao.length == 0) return false;
return true;
},
priority: -Infinity, //保证优先级最低
forced: true,
silent:true,
charlotte: true,
unique: true,
mark: true,
marktext: "减伤",
intro: {
name: "伤害减免",
mark: function (dialog, storage, player) {
var min = Infinity;
for (var i = 0; i < player.storage._damageMitigationer_Miao.length; ++i) {
limiter = player.storage._damageMitigationer_Miao[i];
if (player.storage._damageMitigationer_Miao[i].num < min) min = player.storage._damageMitigationer_Miao[i].num;
}
return "你受到的所有伤害减少" + (100 - min * 100).toString() + "%";
}
},
content: function () {
"step 0"
var min = 1;
for (var i = 0; i < player.storage._damageMitigationer_Miao.length; ++i) {
limiter = player.storage._damageMitigationer_Miao[i];
if (player.storage._damageMitigationer_Miao[i].num < min) min = player.storage._damageMitigationer_Miao[i].num;
}
n1 = trigger.num;
n2 = parseFloat((n1 * min + 0.00001).toFixed(4));
// nint = parseInt(n2)
// game.log(n2,nint,n2-nint)
// nfloathp = parseFloat(n2 - nint)
// player.hp_float = player.hp_float + parseFloat(nfloathp)
// trigger.num = parseInt(n2)
// if(parseFloat(nfloathp) != 0){
// trigger.num += 1
// }
// game.log(player.hp_float >= 1)
// flag=false
// if(player.hp_float == 0 && n2 > 0){
// // if(player.hujia > 0){
// // player.changeHujia(-1)
// // }
// // else{
// // player.hp-=1
// // }
// trigger.num += 1
// }
player.hp_float -= n2;
// game.log(player.hp_float)
trigger.num = 0;
// if(flag){
// trigger.num += 1
// }
while (player.hp_float < 0) {
player.hp_float += 1;
trigger.num += 1;
}
// if(player.hp_float == 0){
// // if(player.hujia > 0){
// // player.changeHujia(1)
// // }
// // else{
// // player.hp+=1
// // }
// trigger.num -= 1
// }
// game.log(player.hp_float,'sss',trigger.num)
game.log(player, "触发了减伤,实际受到<span class='yellowtext'>" + n2 + "</span>点伤害");
if (n2 < 1) {
if (player.hujia != 0) {
player.changeHujia(-trigger.num);
} else player.hp -= trigger.num;
if (trigger.source) {
player.$damage(trigger.source);
} else {
player.$damage();
}
player.update();
trigger.num = 0;
}
_status.event.trigger("damageMitigation");
"step 1"
if (player.hp <= 0 && player.hp_float <= 0) {
player.nodying = false;
// game.log(player.hp,player.hp_float);
player.dying();
}
}
};
//濒死阶段0.xhp处理
lib.skill["_DyingWithFloatHp"] = {
trigger: {
player: ["dying"]
},
direct: true,
unique: true,
silent:true,
// forceunique:true,
filter: function (event, player) {
if (!player.hp_float) {
player.hp_float = 0; //储存浮点位的hp
}
return player.hp == 0 && player.hp_float > 0;
},
init: function (player) {
if (!player.hp_float) {
player.hp_float = 0; //储存浮点位的hp
}
},
content: function () {
// game.log(player.hp,player.hp_float)
trigger.cancel();
for (var i = 0; i < _status.dying.length; ++i) {
if (_status.dying[i] == player) {
_status.dying.splice(i, 1);
}
}
// trigger.nodying = true
}
};
//回满血0.xhp处理
lib.skill["_RecoverWithFloatHp"] = {
trigger: {
player: ["recoverEnd"]
},
direct: true,
unique: true,
silent:true,
forceunique: true,
filter: function (event, player) {
if (!player.hp_float) {
player.hp_float = 0; //储存浮点位的hp
}
return player.hp == player.maxHp;
},
init: function (player) {
if (!player.hp_float) {
player.hp_float = 0; //储存浮点位的hp
}
},
content: function () {
player.hp_float = 0;
}
};
lib.skill["zioy_lockHp"] = {
trigger: {
player: ["damageBegin", "loseHpBegin"]
},
direct: true,
unique: true,
silent:true,
forceunique: true,
filter: function (event, player) {
return true;
},
mark: true,
marktext: "锁血",
intro: {
name: "锁血"
},
init: function (player) {},
content: function () {
trigger.cancel();
}
};
/*-----------------------------------------------------------以下部分为全局状态相关----------------------------------------------------------- */
game.globalStatus = {
name: null,
/*全局状态名称,string or null*/
timing_type: null,
/*全局状态计时类型,轮:'round'or回合:"phase"or null */
locked_timing_type: null,
/*全局状态锁定计时类型,轮:'round'or回合:"phase"or null */
source: null,
/*全局状态来源,player or null*/
end: 0,
/*全局状态结束时间,int */
locked_end: -1,
/*锁定结束时间,int */
storage: {
remove_timing_locked: true
},
/*存放全局状态需要的数据,object */
isLocked: function () {
/*返回全局状态是否锁定 */
if (this.locked_timing_type == "round") return this.locked_end > game.roundNumber;
else return this.locked_end > 0;
},
translation: function () {
/*返回全局状态的中文字符名称 */
return get.status(this).translation;
}
};
game.changeGlobalStatus = function () {
/*改变场上状态,example:game.changeGlobalStatus(5,3,"xiyu",true,"phase") 表示强制转换为细雨天气5回合并锁定3回合,来源默认为event.player*/
if (!game.hasGlobalStatusButton) {
game.hasGlobalStatusButton = true;
ui.globalStatusButton = ui.create.system("喵喵", null, true);
ui.globalStatusButton.style.display = "hidden";
lib.setPopped(ui.globalStatusButton, ui.click.globalStatusButton, 170);
if (get.is.phoneLayout()) {
ui.globalStatus = ui.create.div(".touchinfo.right", ui.window);
} else {
ui.globalStatus = ui.create.div(ui.gameinfo);
}
}
var status = null,
timing_type = null,
locked_timing_type = null,
num = -1,
locked_num = -1,
source = _status.event.player,
forced = false,
Overridable = false,
nolog = false; //最后不game.log(xxxxx)
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "nolog") {
nolog = true;
} else if (arguments[i] == "round" || arguments[i] == "phase") {
if (timing_type == null) timing_type = arguments[i];
else locked_timing_type = arguments[i];
} else if (typeof arguments[i] == "boolean") {
forced = arguments[i];
} else if (typeof arguments[i] == "number") {
if (num == -1) num = arguments[i];
else if (locked_num == -1) locked_num = arguments[i];
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
} else if (typeof arguments[i] == "string") {
status = arguments[i];
}
}
if (timing_type == null) timing_type = "round";
if (locked_timing_type == null) locked_timing_type = timing_type;
_status.event.trigger("changeGlobalStatusBegin");
/*以上处理输入信息 */
if (get.status(status) == null) status = null;
var skill = get.status(status).skill;
if (num <= -1) {
num = 1;
}
if (locked_num <= -1) {
locked_num = 0;
}
if (locked_num > num) {
locked_num = num;
}
if (forced) {
Overridable = true;
} else if (
(get.status(status).type == get.status(game.globalStatus).type || get.status(null).type == get.status(game.globalStatus).type) &&
!game.globalStatus.isLocked()
) {
Overridable = true;
}
var str = "";
var str1 = lib.globalStatusTypeTranslation[get.status(game.globalStatus).type];
/*全局状态类型中文字符 */
var str2 = "轮",
str4 = str2;
var flag1 = true;
if (timing_type == "phase") str2 = "回合";
if (locked_timing_type == "phase") str4 = "回合";
//event.trigger("changeGlobalStatus");
if (Overridable) {
if (game.globalStatus && game.globalStatus.name != null) {
if (game.globalStatus.name != status) {
/*若当前全局状态与待召唤全局状态不一致则删除上一全局状态 */
game.removeGlobalSkillMiao(get.status(game.globalStatus).skill);
} else {
/*若当前全局状态与待召唤全局状态一致则跳过添加全局状态 */
flag1 = false;
}
}
if (flag1) {
game.addGlobalSkillMiao(skill);
// game.addGlobalSkill("globalStatusRemover");
// game.addGlobalSkill("globalStatusRemover1");
}
game.globalStatus.name = status;
game.globalStatus.end = Math.max(game.roundNumber + num,game.globalStatus.end);
game.globalStatus.locked_end = Math.max(game.roundNumber + locked_num,game.globalStatus.locked_end)
game.globalStatus.source = source;
game.globalStatus.timing_type = timing_type;
game.globalStatus.locked_timing_type = locked_timing_type;
game.globalStatus.storage.remove_timing_locked = true; //防止当前回合更改
if (timing_type == "phase") {
game.globalStatus.end = num;
}
if (locked_timing_type == "phase") {
game.globalStatus.locked_end = locked_num;
}
// if(_status.event.getParent()['triggername'] == 'phaseBegin' && timing_type == 'phase'){
// /*回合开始阶段修正 */
// game.globalStatus.end += 1;
// }
// if(_status.event.getParent()['triggername'] == 'phaseBegin' && locked_timing_type == 'phase'){
// /*回合开始阶段修正 */
// game.globalStatus.locked_end += 1;
// }
if (!(status == null && locked_num <= 0)) {
/*更新str1全局状态类型中文字符 */
str1 = lib.globalStatusTypeTranslation[get.status(game.globalStatus).type];
}
str +=
"召唤场上" +
str1 +
"为:<span class='yellowtext'>" +
get.status(status).translation +
"</span>,持续<span class='yellowtext'>" +
num +
"</span>" +
str2;
if (locked_num == num) {
str =
"锁定场上" +
str1 +
"为:<span class='yellowtext'>" +
get.status(status).translation +
"</span>,持续<span class='yellowtext'>" +
locked_num +
"</span>" +
str4;
} else if (locked_num > 0) {
str += "并锁定<span class='yellowtext'>" + locked_num + "</span>" + str4;
}
if (status == null && locked_num <= 0) {
str = "清除了场上" + str1;
}
if (forced) str = "强制" + str;
if (!nolog) game.log(source, str);
ui.updateGlobalStatus();
} else {
str += "召唤" + lib.globalStatusTypeTranslation[get.status(status).type] + "失败";
if (!nolog) game.log(source, str);
}
/*以上更改全局状态并输出 */
_status.event.trigger("changeGlobalStatus_End");
};
game.changeGlobalStatusEnd = function () {
/*改变场上状态持续时间*/
if (game.globalStatus.name == null) {
return;
}
var num = 0,
// timing_type = game.globalStatus.timing_type,
locked_num = 0,
source = _status.event.player,
nolog = false; //最后不game.log(xxxxx)
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "nolog") {
nolog = true;
} else if (arguments[i] == "round" || arguments[i] == "phase") {
timing_type = arguments[i];
} else if (typeof arguments[i] == "number") {
if (num == 0) num = arguments[i];
else if (locked_num == 0) locked_num = arguments[i];
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
}
}
if (num == 0 && locked_num == 0) return;
var str = "",
str1 = "",
str2 = "";
if (num > 0) {
str1 = "延长";
} else {
str1 = "减少";
num = -num;
}
if (locked_num > 0) {
str2 = "延长";
} else {
str2 = "减少";
locked_num = -locked_num;
}
if (num != 0) {
str = str + str1 + '<span class="yellowtext">' + get.status(game.globalStatus).translation + "</span>:<span class='yellowtext'>" + num + "</span>";
if (game.globalStatus.timing_type == "round") str = str + "轮";
else str = str + "回合";
}
if (locked_num != 0) {
if (str != "") str = str + ",";
str = str + str2 + '锁定<span class="yellowtext">' + locked_num + "</span>";
if (game.globalStatus.locked_timing_type == "round") str = str + "轮";
else str = str + "回合";
}
game.log(source, str);
/*处理锁定时间大于持续时间 */
if (game.globalStatus.timing_type == game.globalStatus.locked_timing_type) {
if (game.globalStatus.locked_end + locked_num > game.globalStatus.end + num) {
locked_num = game.globalStatus.end + num - game.globalStatus.locked_end;
}
}
/*处理锁定时间小于0 */
if (game.globalStatus.locked_timing_type == "round") {
if (game.globalStatus.locked_end + locked_num <= game.roundNumber) {
locked_num = -game.globalStatus.locked_end + 1;
}
} else {
if (game.globalStatus.locked_end + locked_num <= 0) {
locked_num = -game.globalStatus.locked_end;
}
}
game.globalStatus.end = game.globalStatus.end + num;
game.globalStatus.locked_end = game.globalStatus.locked_end + locked_num;
game.globalStatus.source = source;
game.globalStatus.storage.remove_timing_locked = true; //防止当前回合更改
// game.globalStatus.timing_type = timing_type;
/*处理剩余时间小于0 */
if (game.globalStatus.timing_type == "round") {
if (game.globalStatus.end <= game.roundNumber) {
game.clearGlobalStatus(true, "nolog");
}
} else {
if (game.globalStatus.end <= 0) {
game.clearGlobalStatus(true, "nolog");
}
}
};
game.clearGlobalStatus = function () {
/*强制或状态非锁定则清除场上状态 */
var force = false,
source = _status.event.player,
nolog = false,
str1 = "清除" + lib.globalStatusTypeTranslation[get.status(game.globalStatus).type];
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == true) {
force = true;
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
} else if (arguments[i] == "nolog") {
nolog = true;
}
}
//event.trigger("clearGlobalStatusBegin");
//event.trigger("clearGlobalStatus");
if (force || !game.globalStatus.isLocked() || game.globalStatus.name == null) {
if (force) {
str1 = "强制" + str1;
}
game.changeGlobalStatus("nolog", true, null);
// game.removeGlobalSkill("globalStatusRemover");
// game.removeGlobalSkill("globalStatusRemover1");
ui.updateGlobalStatus();
if (!nolog) game.log(source, str1 + "成功");
} else {
if (!nolog) game.log(source, str1 + "失败");
}
//event.trigger("clearGlobalStatusEnd");
};
game.addGlobalSkillMiao = function (skill) {
/*添加globalSkill的同时处理skill的init和groupM*/
if (!lib.skill[skill]) return;
game.addGlobalSkill(skill);
/*处理skill的init */
if (lib.skill[skill].init && typeof lib.skill[skill].init == "function") {
let p = _status.event.player;
do {
lib.skill[skill].init(p);
p = p.next;
} while (p != _status.event.player);
}
/*直接使用group会出错,这里使用groupM */
if (lib.skill[skill].groupM) {
if (typeof lib.skill[skill].groupM == "string") {
game.log("hello");
game.addGlobalSkillMiao(lib.skill[skill].groupM);
} else {
for (let i in lib.skill[skill].groupM) {
game.addGlobalSkillMiao(i);
}
}
}
};
game.removeGlobalSkillMiao = function (skill) {
/*添加globalSkill的同时处理skill的onremove和groupM*/
if (!lib.skill[skill]) return;
game.removeGlobalSkill(skill);
/*处理skill的onremove */
if (lib.skill[skill].onremove && typeof lib.skill[skill].onremove == "function") {
let p = _status.event.player;
do {
lib.skill[skill].onremove(p);
p = p.next;
} while (p != _status.event.player);
}
/*直接使用group会出错,这里使用groupM */
if (lib.skill[skill].groupM) {
if (typeof lib.skill[skill].groupM == "string") {
game.removeGlobalSkillMiao(lib.skill[skill].groupM);
} else {
for (let i in lib.skill[skill].groupM) {
game.removeGlobalSkillMiao(i);
}
}
}
};
// game.hasGlobalStatus = function () {
// /*返回目前是否拥有状态,没啥用 */
// if (!game.globalStatus || game.globalStatus == null || game.globalStatus.name == null) return false;
// return true;
// };
get.status = function (status) {
/*如果输入一个object或string,返回lib.globalStatus中key对应的内容,否则返回lib.globalStatus[null] */
var s = status;
if (typeof status == "object" && status != null) {
return get.status(s.name);
}
if (lib.globalStatus[status]) {
return lib.globalStatus[status];
}
return lib.globalStatus[null];
};
ui.updateGlobalStatus = function () {
/*时钟边上的全局状态显示 */
if (game.globalStatus.name != null) {
ui.globalStatus.innerHTML = lib.globalStatusTypeTranslation[get.status(game.globalStatus).type] + ":" + get.status(game.globalStatus).translation;
} else {
ui.globalStatus.innerHTML = "当前无天气/环境";
}
if (get.is.phoneLayout()) ui.globalStatus.innerHTML = "<br>" + ui.globalStatus.innerHTML;
};
ui.click.globalStatusButton = function () {
/*喵喵按钮 */
var uiintro = ui.create.dialog("hidden");
uiintro.listen(function (e) {
e.stopPropagation();
});
var num;
if (game.online) {
num = _status.cardPileNum || 0;
} else {
num = ui.cardPile.childNodes.length;
}
if (game.globalStatus.name == null) {
uiintro.add("当前无天气/环境");
} else {
uiintro.add(
'<div class="text center">>>>当前' +
lib.globalStatusTypeTranslation[get.status(game.globalStatus).type] +
"为<<<</div><br>" +
get.status(game.globalStatus).translation
// +"<br>"
);
var str = "",
str2 = "轮",
num1 = game.globalStatus.end - game.roundNumber,
num2 = game.globalStatus.locked_end - game.roundNumber;
if (game.globalStatus.timing_type == "phase") {
str2 = "回合";
num1 = game.globalStatus.end;
}
str = '<div class="text center"><P align=left>--->剩余:' + num1 + str2 + "<br>";
if (game.globalStatus.locked_timing_type == "phase") {
str2 = "回合";
num2 = game.globalStatus.locked_end;
}
if (game.globalStatus.isLocked()) {
str += "--->锁定:" + num2 + str2 + "</P></div>";
} else {
str += "--->未被锁定</P></div>";
}
str += '<div class="text center"><P align=left>--->效果:' + get.status(game.globalStatus).intro.replace('<br>','<br>--->') + "</P></div>";
uiintro.add(str);
}
return uiintro;
};
lib.globalStatusTypeTranslation = {
/*储存全局状态类型对应的中文字符 */
"weather": "天气",
"environment": "环境",
null: "状态"
};
lib.globalStatus = {
/*存储所有全局状态信息 */
/*以下为天气 */
"rerang": {
translation: "热浪",
skill: "zioy_status_rerang",
type: "weather",
intro: "火属性伤害+1。"
},
"xiyu": {
translation: "细雨",
skill: "zioy_status_xiyu",
type: "weather",
intro: "火属性伤害将被视为无属性伤害。"
},
"chunfeng": {
translation: "台风",
skill: "zioy_status_taifeng",
type: "weather",
intro: "角色受伤时,概率将其随机一张牌移动至下家的对应位置。"
},
"shuguang": {
translation: "曙光",
skill: "zioy_status_shuguang",
type: "weather",
intro: "回合结束阶段清除当前角色的所有异常状态。"
},
"fenfang": {
translation: "芬芳",
skill: "zioy_status_fenfang",
type: "weather",
intro: "回合结束阶段,若当前回合角色体力值不大于2,其回复1点体力。"
},
"shenlou": {
translation: "海市蜃楼",
skill: "zioy_status_shenlou",
type: "weather",
intro: "回合结束阶段令当前回合角色执行[失去log3(X)点体力(X为海市蜃楼剩余回合数,向上取整),将牌弃置至Y张(Y为体力值,至少弃置1张),获得“睡眠”异常]中随机任意项。<br>当海市蜃楼结束时,当前回合角色失去所有体力。"
},
"heiwu": {
translation: "黑雾",
skill: "zioy_status_heiwu",
type: "weather",
intro: "所有角色体力上限-1直到“黑雾”天气结束。"
},
/*以下为环境 */
"mizhang": {
translation: "迷嶂",
skill: "zioy_status_mizhang",
type: "environment",
intro: "所有角色进攻距离-1。"
},
"hexu": {
translation: "云归鹤墟",
skill: "zioy_status_hexu",
type: "environment",
intro: "还没想出来。"
},
"huoshan": {
translation: "风林火山",
skill: "zioy_status_huoshan",
type: "environment",
intro: "回复体力时令回复体力值减半(向下取整)。"
},
"senluowanxiang": {
translation: "森罗万象",
skill: "zioy_status_senluowanxiang",
type: "environment",
intro: "回合结束阶段,你随机摸0~6张牌,然后你有10*N%几率进入睡眠/混乱状态(N为你以此法获得的牌的数量)。"
},
/*以下为其他状态 */
null: {
translation: "无",
skill: null,
type: null,
intro: "目前场上无任何状态。"
},
"test": {
translation: "测试",
skill: null,
type: null,
intro: "测试。"
}
};
lib.skill["zioy_status"] = {
/*储存全局状态对应技能 */
subSkill: {
example: {
trigger: {
global: "phaseEnd"
},
sub: true,
forced: true,
direct: true,
unique: true,
silent:true,
charlotte: true,
filter: function (event, player) {
return true;
},
init: function (player) {},
onremove: function (player) {},
content: function () {},
mod: {},
groupM: "zioy_status_example1"
},
xiyu: {
sub: true,
forced: true,
direct: true,
unique: true,
silent:true,
charlotte: true,
trigger: {
source: "damageBegin1"
},
filter: function (event) {
return event.hasNature("fire");
},
priority: -5,
content: function () {
trigger.nature = null;
}
},
rerang: {
sub: true,
forced: true,
direct: true,
unique: true,
silent:true,
charlotte: true,
trigger: {
source: "damageBegin1"
},
filter: function (event) {
return event.hasNature("fire");
},
priority: -5,
content: function () {
trigger.num += 1;
}
},
mizhang: {
sub: true,
forced: true,
direct: true,
silent:true,
unique: true,
charlotte: true,
mod: {
globalFrom: function (from, to, distance) {
return distance + 1;
}
}
},
shuguang: {
sub: true,
forced: true,
direct: true,
unique: true,
silent:true,
charlotte: true,
trigger: {
player: "phaseEnd"
},
priority: -2523,
content: function () {
player.removeBuff("all");
}
},
shenlou: {
trigger: {
player: "phaseEnd"
},
sub: true,
forced: true,
direct: true,
unique: true,
silent:true,
charlotte: true,
filter: function (event, player) {
return !player.storage.shenlou_noLoseHp;
},
init: function (player) {},
onremove: function (player) {
let p = _status.currentPhase
if(!p.storage.shenlou_noLoseHp){
p.loseHp(p.hp)
}
},
content: function () {
var r = function () {
return [true, false].randomGet();
};
if (r()) {
let n = game.globalStatus.end
if(game.globalStatus.timing_type === 'round'){
n = (n - game.roundNumber)*game.players.length
}
n = Math.ceil(Math.log(n)/Math.log(3))
player.loseHp(n);
}
if (r()) {
var n = player.countCards() - player.hp;
if (player.countCards() > 0 && n <= 0) n = 1;
player.chooseToDiscard(true, n);
}
if (r()) {
player.addBuff("shuimian", null);
}
},
mod: {},
"_priority": 6485
},
huoshan: {
trigger: {
player: "recoverBegin"
},
sub: true,
forced: true,
direct: true,
silent:true,
unique: true,
charlotte: true,
filter: function (event, player) {
return !player.storage.huoshan_no;
},
init: function (player) {},
onremove: function (player) {},
content: function () {
trigger.num = parseInt(trigger.num / 2);
},
mod: {},
"_priority": 685
},
fenfang: {
trigger: {
player: "phaseEnd"
},
sub: true,
forced: true,
direct: true,
unique: true,
silent:true,
charlotte: true,
filter: function (event, player) {
return true;
},
init: function (player) {},
onremove: function (player) {},
content: function () {
if(player.hp <= 2)player.recover()
},
mod: {},
},
senluowanxiang: {
trigger: {
player: "phaseEnd"
},
sub: true,
forced: true,
direct: true,
silent:true,
unique: true,
charlotte: true,
filter: function (event, player) {
return true;
},
init: function (player) {},
onremove: function (player) {},
content: function () {
let num = parseInt(Math.random()*7)
player.draw(num)
if(Math.random() < 0.1*num){
// console.log(12)
player.addBuff('shuimian')
}
},
mod: {},
},
heiwu: {
trigger: {
global: "phaseEnd"
},
sub: true,
forced: true,
direct: true,
unique: true,
silent:true,
charlotte: true,
filter: function (event, player) {
return false;
},
init: function (player) {
player.loseMaxHp(1);
},
onremove: function (player) {
player.gainMaxHp(1);},
content: function () {},
mod: {},
},
test: {
sub: true,
forced: true,
direct: true,
unique: true,
silent:true,
charlotte: true,
mod: {}
}
}
};
lib.skill["_globalStatusRemover"] = {
/*轮类型全局状态倒计时 */
trigger: {
global: "roundStart"
},
filter: function (card, player, target) {
if (game.globalStatus.storage.remove_timing_locked == true) return false;
if (game.globalStatus.timing_type != "round") return false;
return game.globalStatus.end <= game.roundNumber;
},
direct: true,
charlotte: true,
silent:true,
unique: true,
content: function () {
if (game.globalStatus.timing_type == "round" && game.globalStatus.end <= game.roundNumber) {
game.clearGlobalStatus(true, "nolog", null);
ui.updateGlobalStatus();
}
}
//group:"globalStatusRemover1",
};
lib.skill["_globalStatusRemover1"] = {
/*回合类型全局状态倒计时 */
trigger: {
player: "phaseBegin"
},
direct: true,
charlotte: true,
silent:true,
unique: true,
filter: function (event, player) {
if (game.globalStatus.storage.remove_timing_locked == true) return false;
return true;
if (game.globalStatus.locked_timing_type == "phase") game.globalStatus.locked_end--;
if (game.globalStatus.timing_type != "phase") return false;
game.globalStatus.end--;
return game.globalStatus.end <= 0;
},
content: function () {
if (game.globalStatus.locked_timing_type == "phase") game.globalStatus.locked_end--;
// game.log(123)
if (game.globalStatus.timing_type == "phase") {
if (game.globalStatus.storage.remove_timing_locked == true) return;
game.globalStatus.end--;
game.globalStatus.storage.remove_timing_locked = true;
// game.log(game.globalStatus.end);
if (game.globalStatus.end <= 0) {
game.clearGlobalStatus(true, "nolog", null);
ui.updateGlobalStatus();
}
}
}
};
lib.skill["_globalStatusRemover2"] = {
/*回合类型全局状态倒计时 */
trigger: {
player: "phaseEnd"
},
direct: true,
charlotte: true,
silent:true,
unique: true,
filter: function (event, player) {
return true;
},
content: function () {
// game.log(666);
game.globalStatus.storage.remove_timing_locked = false;
}
};
/*---------------------------------------------------------------以下部分为异常相关---------------------------------------------------------------*/
lib.element.player.addBuff = function () {
/*添加异常状态 */
var buff = null,
num = 1, //暂时没用,异常状态的持续时间应由异常状态本身决定
force = false, //暂时没用
source = _status.event.player; //暂时没用
for (var i = 0; i < arguments.length; i++) {
if (typeof arguments[i] == "number") {
num = arguments[i];
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
} else if (typeof arguments[i] == "string") {
buff = arguments[i];
} else if (arguments[i] == true) {
force = true;
}
}
if (buff == null || !lib.buffMiao[buff]) {
game.log("buff not found_1");
return;
}
if (!this.storage.buffArray) {
this.storage.buffArray = [];
}
if (!this.storage.immuneBuffArray) {
//Translated by deepl
this.storage.immuneBuffArray = [];
}
var skill = lib.buffMiao[buff].skill;
for (let i = 0; i < this.storage.immuneBuffArray.length; i++) {
if (force == true) break;
//若免疫此buff则return
if (lib.buffMiao[this.storage.immuneBuffArray[i].name] == lib.buffMiao[buff]) {
game.log(this, "免疫<span class='yellowtext'>" + lib.buffMiao[buff].translation + "</span>异常");
return;
}
}
for (let i = 0; i < this.storage.buffArray.length; i++) {
//若有相同buff则return
if (lib.buffMiao[this.storage.buffArray[i]] == lib.buffMiao[buff]) {
return;
}
//移除已有同类型Buff
if (lib.buffMiao[this.storage.buffArray[i]].type == lib.buffMiao[buff].type) {
this.removeBuff(this.storage.buffArray[i]);
}
}
// console.log(this)
if(skill == 'mad'){
this.addTempSkill(skill,'phaseEnd')
}else{
this.addSkill(skill);
}
this.storage.buffArray.push(buff);
var strf = "";
if (force) strf = "强制";
if (source != null) {
game.log(source, "令", this, strf, "获得<span class='yellowtext'>" + lib.buffMiao[buff].translation + "</span>异常");
} else {
game.log(this, strf, "获得了<span class='yellowtext'>" + lib.buffMiao[buff].translation + "</span>异常");
}
};
lib.element.player.removeBuff = function () {
/*移去异常状态 */
var buff = null,
all = false,
force = false, //暂时没用
source = _status.event.player; //暂时没用
for (var i = 0; i < arguments.length; i++) {
if (typeof arguments[i] == "number") {
num = arguments[i];
} else if (arguments[i] == "all" || arguments[i] == "All") {
all = true;
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
} else if (typeof arguments[i] == "string") {
buff = arguments[i];
} else if (arguments[i] == true) {
force = true;
}
}
if (all) {
for (let i in lib.buffMiao) {
this.removeBuff(i);
}
return;
}
if (buff == null || !lib.buffMiao[buff]) {
game.log("buff not found_2");
return;
}
if (!this.storage.buffArray) {
this.storage.buffArray = [];
}
var skill = lib.buffMiao[buff].skill;
for (let i = 0; i < this.storage.buffArray.length; i++) {
if (this.storage.buffArray[i] == buff) {
this.removeSkill(skill);
this.storage.buffArray.splice(i, 1);
game.log(this, "移除了<span class='yellowtext'>" + lib.buffMiao[buff].translation + "</span>异常");
break;
}
}
};
lib.element.player.addBuffImmune = function () {
/*添加异常免疫 */
if (!this.storage.buffArray) {
this.storage.buffArray = [];
}
if (!this.storage.immuneBuffArray) {
//Translated by deepl
this.storage.immuneBuffArray = [];
}
if (!this.storage.immuneBuffRemover) {
//Translated by deepl
this.storage.immuneBuffRemover = [];
}
var buff = [],
num = Infinity,
type = "round",
id = _status.event.name, // 区分不同来源的异常免疫
clear = false, //添加免疫时移除已有但免疫的异常
all = false; //免疫所有异常
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "all" || arguments[i] == "All") {
all = true;
} else if (arguments[i] == "phase") {
type = "phase";
} else if (arguments[i] == "round") {
type = "round";
} else if (typeof arguments[i] == "string" && arguments[i].substring(0,3) == "id=") {
id = arguments[i].substring(3)
} else if (arguments[i] == true) {
clear = true;
} else if (typeof arguments[i] == "number") {
num = arguments[i];
} else if (typeof arguments[i] == "object") {
for (var j = 0; j < arguments[i].length; j++) {
buff.push(arguments[i][j]);
}
} else if (typeof arguments[i] == "string") {
buff.push(arguments[i]);
}
}
if (all == true) {
for (let i in lib.buffMiao) {
this.addBuffImmune(i, clear, num, type, 'id='+id);
}
return;
}
var flag = true;
for (var i = 0; i < buff.length; i++) {
var b = buff[i];
flag = true;
if (b == null || !lib.buffMiao[b]) {
game.log("buff not found_3", b);
return;
}
if (clear == true) {
for (let i = 0; i < this.storage.buffArray.length; i++) {
if (lib.buffMiao[this.storage.buffArray[i]] == lib.buffMiao[b]) {
this.removeBuff(b);
break;
}
}
}
var getmax = function(arr){
var max = -1
for(let i of arr){
}
}
// //若已免疫此buff则continue
// for (let j = 0; j < this.storage.immuneBuffArray.length; j++) {
// if (lib.buffMiao[this.storage.immuneBuffArray[j].name] == lib.buffMiao[b]) {
// var n = this.storage.immuneBuffArray[j].name;
// for(let ibr of this.storage.immuneBuffRemover){
// if(ibr.id == id && ibr.num > num && ibr.type == type){
// flag = false
// }
// }
// if (flag == false) break;
// // if (this.storage.immuneBuffRemover[b].type != type || this.storage.immuneBuffRemover[b].num >= num) {
// // flag = false;
// // break;
// // }
// }
// }
// if (flag == false) continue;
if (this.storage.immuneBuffArray.filter(v=>v.name == b && v.id == id).length == 0) this.storage.immuneBuffArray.push({"name":b,"id":id});
// this.storage.immuneBuffRemover[b] = {};
// this.storage.immuneBuffRemover[b].num = num;
// this.storage.immuneBuffRemover[b].type = type;
// this.storage.immuneBuffRemover[b].id = id;
if (_status.event.getParent() && _status.event.getParent()["triggername"] == "phaseBegin" && type == "phase") {
/*回合开始阶段修正 */
num += 1;
}
flag = false
for(let v of this.storage.immuneBuffRemover){
if(v.name == b && v.type == type && v.id == id){
if(v.num < num)v.num = num
flag = true
}
}
if(flag == false)this.storage.immuneBuffRemover.push({
"name":b,
"num":num,
"type":type,
"id":id
})
if (_status.event.getParent() && _status.event.getParent()["triggername"] == "phaseBegin" && type == "phase") {
num -= 1;
}
var str = "获得<span class='yellowtext'>" + lib.buffMiao[b].translation + "</span>免疫";
if (num != Infinity) {
str = str + '<span class="yellowtext">' + num;
if (type == "round") {
str = str + "</span>轮";
} else {
str = str + "</span>回合";
}
}
game.log(this, str);
this.markSkill("zioy_buff_mianyi");
}
};
lib.element.player.removeBuffImmune = function () {
/*移除异常免疫 */
if (!this.storage.buffArray) {
this.storage.buffArray = [];
}
if (!this.storage.immuneBuffArray) {
//Translated by deepl
this.storage.immuneBuffArray = [];
}
if (!this.storage.immuneBuffRemover) {
//Translated by deepl
this.storage.immuneBuffRemover = [];
}
var buff = [],
source = null,
id = _status.event.name // 区分不同来源的异常免疫
// all_flag = false
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "all" || arguments[i] == "All") {
for (let i in lib.buffMiao) {
// this.removeBuffImmune(i,source,"id="+id);
buff.push(i)
}
} else if (typeof arguments[i] == "string" && arguments[i].substring(0,3) == "id=") {
id = arguments[i].substring(3)
} else if (typeof arguments[i] == "object") {
for (var j = 0; j < arguments[i].length; j++) {
buff.push(arguments[i][j]);
}
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
} else if (typeof arguments[i] == "string") {
buff.push(arguments[i]);
} else if (arguments[i] == true) {
force = true;
}
}
// console.log(buff,id,this.storage.immuneBuffArray)
// if(all_flag){
// for (let i in lib.buffMiao) {
// this.removeBuffImmune(i,source,"id="+id);
// }
// return;
// }
var flag = true;
for (var b of buff) {
// var b = buff[i];
// console.log(b)
flag = true;
if (b == null || !lib.buffMiao[b]) {
game.log("buff not found_4");
return;
}
//若未免疫此buff则continue
for (let i = 0; i < this.storage.immuneBuffArray.length; i++) {
if (lib.buffMiao[this.storage.immuneBuffArray[i].name] == lib.buffMiao[b]) {
flag = false;
break;
}
}
if (flag == true) continue;
// 失去免疫
this.storage.immuneBuffArray = this.storage.immuneBuffArray.filter(i=>i.name != b || i.id != id)
this.storage.immuneBuffRemover = this.storage.immuneBuffRemover.filter(i=>i.name != b || i.id != id)
if(this.storage.immuneBuffArray.filter(v=>v.name == b).length == 0){
game.log(this, "失去<span class='yellowtext'>" + lib.buffMiao[b].translation + "</span>免疫");
}
// console.log('123')
}
if (this.storage.immuneBuffArray.length == 0) this.unmarkSkill("zioy_buff_mianyi");
};
lib.skill._miao_removeBuffImmune1 = {
/*轮次类型计数移除异常免疫 */
trigger: {
global: "roundStart"
},
filter: function (card, player, target) {
return player.storage.immuneBuffRemover;
},
direct: true,
charlotte: true,
silent:true,
unique: true,
content: function () {
// 检查是否所有计时器都结束
var checkRemovable=name=>{
for(let v of player.storage.immuneBuffRemover){
if(v.name == name && v.num > 0)return false
}
return true
}
let i = 0
while(i < player.storage.immuneBuffRemover.length) {
// console.log(player.storage.immuneBuffRemover[i],player.storage.immuneBuffRemover,i)
if (player.storage.immuneBuffRemover[i].type == "round") {
player.storage.immuneBuffRemover[i].num -= 1;
if (player.storage.immuneBuffRemover[i].num == 0) {
var name = player.storage.immuneBuffRemover[i].name
if(checkRemovable(name)){
player.removeBuffImmune(player.storage.immuneBuffRemover[i].name,"id="+player.storage.immuneBuffRemover[i].id);
}else{
i++
}
}else{
i++
}
}else{
i++
}
}
player.storage.immuneBuffRemover=player.storage.immuneBuffRemover.filter(v=>v.num > 0)
}
};
lib.skill._miao_removeBuffImmune2 = {
/*回合类型计数移除异常免疫 */
trigger: {
global: "phaseBegin"
},
direct: true,
charlotte: true,
silent:true,
unique: true,
filter: function (event, player) {
return player.storage.immuneBuffRemover;
},
content: function () {
// 检查是否所有计时器都结束
var checkRemovable=name=>{
for(let v of player.storage.immuneBuffRemover){
if(v.name == name && v.num > 0)return false
}
return true
}
let i = 0
while(i < player.storage.immuneBuffRemover.length) {
// console.log(player.storage.immuneBuffRemover[i],player.storage.immuneBuffRemover,i)
if (player.storage.immuneBuffRemover[i].type == "phase") {
player.storage.immuneBuffRemover[i].num -= 1;
if (player.storage.immuneBuffRemover[i].num == 0) {
var name = player.storage.immuneBuffRemover[i].name
if(checkRemovable(name)){
player.removeBuffImmune(player.storage.immuneBuffRemover[i].name,"id="+player.storage.immuneBuffRemover[i].id);
}else{
i++
}
}else{
i++
}
}else{
i++
}
}
player.storage.immuneBuffRemover=player.storage.immuneBuffRemover.filter(v=>v.num > 0)
}
};
lib.buffMiao = {
/*存储所有异常状态信息 */
"shuimian": {
translation: "睡眠",
skill: "zioy_buff_shuimian",
type: "control",
intro: "始终跳过出牌阶段,无法使用或打出任何牌,每轮游戏开始时有25*n%概率移除此状态,受到伤害时立即移除此状态。(n为异常状态已持续轮数)"
},
// "bingdong": {
// translation: "冰冻",
// skill: "zioy_buff_bingdong",
// type: "control",
// intro:
// "跳过判定阶段,摸牌阶段,出牌阶段与弃牌阶段,受到的所有伤害-1,回合开始阶段有15*n%概率移除此状态。受到火属性伤害时立即移除此状态。(n为异常状态已持续轮数)"
// },
// "ranshao": {
// translation: "燃烧",
// skill: "zioy_status_ranshao",
// type: "damage",
// intro: "balabala"
// },
"mad":{
translation: "混乱",
skill: "mad",
type: "damage",
intro:"角色陷入混乱"
}
};
lib.skill["zioy_buff"] = {
/*储存异常状态对应技能,如写正常技能一般即可 */
subSkill: {
mianyi: {
mark: true,
marktext: "免疫",
intro: {
name: "免疫以下异常状态",
mark: function (dialog, storage, player) {
var flag = 0,
str = "",
buff_name="";
var getn = (name,type)=>{
var arr = player.storage.immuneBuffRemover
var max = -1
for(let i of arr){
// console.log(i.name , name , i.type , type)
if(i.name == name && i.type == type){
var n = i.num
// if(i.type == 'round'){
// n *= game.players.length
// }
if(n > max)max = n
}
}
return max
}
function unique(arr) {
return arr.filter(function(item, index, arr) {
return arr.indexOf(item, 0) === index;
});
}
var ls = unique(player.storage.immuneBuffArray.map(v=>v.name))
for (let a of ls) {
// var a = player.storage.immuneBuffArray[i].name;
for(let typei of ['round','phase']){
var n = getn(a,typei)
if (n == -1)continue
if (n != Infinity) {
// buff_name = lib.buffMiao[a].translation + ":" + player.storage.immuneBuffRemover[a].num;
buff_name = lib.buffMiao[a].translation + ":" + n;
} else {
buff_name = lib.buffMiao[a].translation + ":∞";
}
if (typei == "round") {
buff_name = buff_name + "轮";
} else {
buff_name = buff_name + "回合";
}
if (flag % 2 == 0 && flag != 0) str += "<br>";
else {
if (flag != 0) str += ",";
}
flag++;
str += buff_name;
}
// if (player.storage.immuneBuffRemover[a].num != Infinity) {
// buff_name = lib.buffMiao[a].translation + ":" + player.storage.immuneBuffRemover[a].num;
// } else {
// buff_name = lib.buffMiao[a].translation + ":∞";
// }
// // if (player.storage.immuneBuffRemover[a].type == "round") {
// // buff_name = buff_name + "轮";
// // } else {
// buff_name = buff_name + "回合";
// // }
// if (flag % 2 == 0 && flag != 0) str += "<br>";
// else {
// if (flag != 0) str += ",";
// }
// flag++;
// str += buff_name;
}
return str;
}
}
},
shuimian: {
mark: true,
marktext: "睡眠",
init: function (player) {
player.storage.shuimian_count = 0;
},
trigger: {
player: "phaseUseBegin"
},
priority: 3014745327,
direct: true,
silent:true,
filter: function () {
return true;
},
content: function () {
trigger.cancel(null, null, "notrigger");
},
mod:{
cardEnabled:function(card,player){
return false;
},
cardRespondable:function(card,player){
return false;
},
// cardSavable:function(card,player){
// return false;
// },
},
group: ["zioy_buff_shuimian_awake1", "zioy_buff_shuimian_awake2"],
intro: {
name: "睡眠",
mark: function (dialog, storage, player) {
var n = player.storage.shuimian_count + 1;
return "始终跳过出牌阶段,无法使用或打出任何牌,下轮游戏开始时有" + 25 * n + "%概率移除此状态,受到伤害后立即移除此状态。";
}
}
},
shuimian_awake1: {
trigger: {
player: "damageEnd"
},
priority: -301745327,
direct: true,
silent:true,
filter: function () {
return true;
},
content: function () {
player.removeBuff("shuimian");
}
},
shuimian_awake2: {
trigger: {
global: "roundStart"
},
priority: -3456301727,
direct: true,
silent:true,
filter: function () {
return true;
},
content: function () {
player.storage.shuimian_count++;
if (player.storage.shuimian_count * 0.25 > Math.random()) player.removeBuff("shuimian");
}
}
}
};
lib.element.player.goMad_old = lib.element.player.goMad
lib.element.player.goMad = function(end ,force){
// console.log(this, this.storage )
if (!this.storage.buffArray) {
this.storage.buffArray = [];
}
if (!this.storage.immuneBuffArray) {
//Translated by deepl
this.storage.immuneBuffArray = [];
}
if (!this.storage.immuneBuffRemover) {
//Translated by deepl
this.storage.immuneBuffRemover = [];
}
for (let i = 0; i < this.storage.immuneBuffArray.length; i++) {
if (force == true) break;
//若免疫此buff则return
if (lib.buffMiao[this.storage.immuneBuffArray[i].name] == lib.buffMiao['mad']) {
game.log(this, "免疫<span class='yellowtext'>" + lib.buffMiao['mad'].translation + "</span>异常");
return;
}
}
this.goMad_old(end)
}
/*---------------------------------------------------------------以下部分为强化相关---------------------------------------------------------------*/
lib.element.player.changeEnhancement = function () {
/*获得/失去强化 */
var enhancements = [],
num = 1,
source = _status.event.player,
forced = false,
strlog = "",
flag = false;
// nolog = false; //最后不game.log(xxxxx)
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "nolog") {
nolog = true;
} else if (arguments[i] == "all") {
enhancements = ["attack", "miss", "defend", "hit", "strike"];
} else if (typeof arguments[i] == "boolean") {
forced = arguments[i];
} else if (typeof arguments[i] == "number") {
num = arguments[i];
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
} else if (typeof arguments[i] == "string") {
enhancements.push(arguments[i]);
} else if (typeof arguments[i] == "object") {
for (var j = 0; j < arguments[i].length; j++) {
enhancements.push(arguments[i][j]);
}
}
}
if (num == 0) {
return;
}
if (this.storage.enhancementArray["locked"] == true && forced == false) {
game.log(this, "的强化已<span class='yellowtext'>锁定</span>");
return;
}
if (num > 0) {
strlog = "获得了" + num + '级<span class="yellowtext">';
} else if (num < 0) {
strlog = "失去了" + -num + '级<span class="yellowtext">';
}
for (var i = 0; i < enhancements.length; ++i) {
var e = enhancements[i];
if (this.storage.enhancementArray[e] || this.storage.enhancementArray[e] == 0) {
this.storage.enhancementArray[e] += num;
let s;
switch (e) {
case "attack":
s = "攻击";
break;
case "defend":
s = "防御";
break;
case "miss":
s = "闪避";
break;
case "hit":
s = "命中";
break;
case "strike":
s = "暴击";
break;
case "draw":
s = "摸牌";
break;
}
if (flag) s = '</span>,<span class="yellowtext">' + s;
flag = true;
if (this.storage.enhancementArray[e] > 6) {
this.storage.enhancementArray[e] = 6;
}
if (this.storage.enhancementArray[e] < -6) {
this.storage.enhancementArray[e] = -6;
}
this.storage["miao_enhancement_mark_" + e] = this.storage.enhancementArray[e];
this.storage["miao_enhancement_mark_" + e + "1"] = this.storage.enhancementArray[e];
// if (this.storage.enhancementArray[e] > 0) {
// this.markSkill("miao_enhancement_mark_" + e + "1");
// } else if (this.storage.enhancementArray[e] == 0) {
// this.unmarkSkill("miao_enhancement_mark_" + e);
// this.unmarkSkill("miao_enhancement_mark_" + e + "1");
// } else if (this.storage.enhancementArray[e] < 0) {
// this.markSkill("miao_enhancement_mark_" + e);
// }
strlog = strlog + s;
}
}
strlog = strlog + "</span>强化";
game.log(this, strlog);
flag = true;
for (var i in this.storage.enhancementArray) {
if (!["attack", "miss", "defend", "hit", "strike"].includes(i)) continue;
if (this.storage.enhancementArray[i] != 0) {
flag = false;
this.markSkill("miao_enhancement_mark_mark");
break;
}
}
if (flag) this.unmarkSkill("miao_enhancement_mark_mark");
};
lib.element.player.lockEnhancement = function () {
/*锁定强化 */
var num = -1, //锁定回合数
source = _status.event.player,
forced = false,
type = "round",
strlog = "";
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "nolog") {
nolog = true;
} else if (typeof arguments[i] == "boolean") {
forced = arguments[i];
} else if (typeof arguments[i] == "number") {
num = arguments[i];
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
} else if (typeof arguments[i] == "string") {
type = arguments[i];
}
}
if (num < 0 || (type == this.storage.enhancementArray["locked_type"] && num < this.storage.enhancementArray["locked_end"])) {
return;
}
this.storage.enhancementArray["locked"] = true;
this.storage.enhancementArray["locked_end"] = num;
// game.log(_status.event.getParent().name);
// for(var i in _status.event.getParent()){
// game.log(i,':',_status.event.getParent()[i]);
// }
if (_status.event.getParent()["triggername"] == "phaseBegin" && type == "phase") {
/*回合开始阶段修正 */
this.storage.enhancementArray["locked_end"] += 1;
}
this.storage.enhancementArray["locked_type"] = type;
this.markSkill("miao_enhancement_mark_locked");
strlog = strlog + "已锁定强化<span class='yellowtext'>";
this.addSkill("miao_enhancement_locked");
this.addSkill("miao_enhancement_locked2");
strlog = strlog + num + "</span>";
if (type == "round") {
strlog = strlog + "轮";
} else {
strlog = strlog + "回合";
}
game.log(this, strlog);
};
lib.element.player.unlockEnhancement = function () {
/*解锁强化 */
var source = _status.event.player,
forced = false,
strlog = "";
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "nolog") {
nolog = true;
} else if (typeof arguments[i] == "boolean") {
forced = arguments[i];
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
}
}
if (this.storage.enhancementArray["locked"] == false) {
return;
}
// if (num > 0) {
// strlog = "获得了" + num + '级<span class="yellowtext">';
// } else if (num < 0) {
// strlog = "失去了" + -num + '级<span class="yellowtext">';
// }
this.storage.enhancementArray["locked"] = false;
this.storage.enhancementArray["locked_end"] = -1;
this.storage.enhancementArray["locked_type"] = null;
this.unmarkSkill("miao_enhancement_mark_locked");
this.removeSkill("miao_enhancement_locked");
this.removeSkill("miao_enhancement_locked2");
strlog = strlog + "已解锁强化";
game.log(this, strlog);
};
lib.element.player.clearEnhancement = function () {
/*清空强化 */
var nolog = null,
source = _status.event.player,
forced = false;
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == "nolog") {
nolog = "nolog";
} else if (typeof arguments[i] == "boolean") {
forced = arguments[i];
} else if (get.itemtype(arguments[i]) == "player" || arguments[i] == null) {
source = arguments[i];
}
}
if (this.storage.enhancementArray["locked"] == true && !forced) {
game.log(this, "已锁定强化");
return;
}
var c = ["attack", "miss", "defend", "hit", "strike"];
for (var l = 0; l < c.length; ++l) {
i = c[l];
if (nolog != null) this.changeEnhancement(i, -this.storage.enhancementArray[i], source, forced, nolog);
this.changeEnhancement(i, -this.storage.enhancementArray[i], source, forced);
}
};
lib.element.player._miao_check_enhancement = function () {
if (!this.storage.enhancementArray)
this.storage.enhancementArray = {
attack: 0, //攻击力
defend: 0, //防御力
miss: 0, //闪避率
hit: 0, //命中率
strike: 0, //暴击率,目前没用
draw: 0, //摸牌,目前没用
locked: false,
locked_end: -1,
locked_type: null
};
};
lib.skill._miao_enhancement_init = {
/*游戏开始时设置player.storage.enhancementArray */
// addplayer时会出错,需要注意
unique: true,
trigger: {
global: "phaseBefore",
player: ["enterGame", "showCharacterAfter"]
},
priority: 70582140,
forced: true,
silent:true,
locked: true,
direct: true,
filter: function (event, player) {
return event.name != "phase" || game.phaseNumber == 0 || !player.storage.enhancementArray;
},
content: function () {
player.storage.enhancementArray = {
attack: 0, //攻击力
defend: 0, //防御力
miss: 0, //闪避率
hit: 0, //命中率
strike: 0, //暴击率,目前没用
draw: 0, //摸牌,目前没用
locked: false,
locked_end: -1,
locked_type: null
};
}
};
lib.skill._miao_enhancement_attack = {
/*根据攻击与防御强化进行伤害修正 */
trigger: {
source: "damageBegin1"
},
priority: -70582140,
forced: true,
filter: function (card, player, target) {
return true;
},
direct: true,
silent:true,
charlotte: true,
unique: true,
content: function () {
if (!player.storage.enhancementArray) {
player.storage.enhancementArray = {
attack: 0, //攻击力
defend: 0, //防御力
miss: 0, //闪避率
hit: 0, //命中率
strike: 0, //暴击率,目前没用
draw: 0, //摸牌,目前没用
locked: false,
locked_end: -1,
locked_type: null
};
}
if (!trigger.player.storage.enhancementArray) {
player.storage.enhancementArray = {
attack: 0, //攻击力
defend: 0, //防御力
miss: 0, //闪避率
hit: 0, //命中率
strike: 0, //暴击率,目前没用
draw: 0, //摸牌,目前没用
locked: false,
locked_end: -1,
locked_type: null
};
}
var numDamage = trigger.num,
numAtk = player.storage.enhancementArray["attack"],
numDfd = trigger.player.storage.enhancementArray["defend"];
var dmm = numAtk - numDfd; //Damage modifier multiplier
// game.log(player,trigger.player,dmm);
if (dmm > 0) {
numDamage *= 0.5 * dmm + 1;
numDamage = parseInt(numDamage);
} else if (dmm < 0) {
numDamage *= 1 / (-dmm * 0.5 + 1);
numDamage = Math.ceil(numDamage);
}
trigger.num = numDamage;
}
};
lib.skill._miao_enhancement_miss = {
/*根据命中与闪避强化判定是否闪避 */
trigger: {
player: ["chooseToRespondBegin", "chooseToUseBegin"]
},
filter: function (event, player) {
if (event.responded) return false;
if (event.miss_skill_miaomiao) return false;
if (!event.filterCard || !event.filterCard({ name: "shan" }, player, event)) return false;
if (event.name == "chooseToRespond" && !lib.filter.cardRespondable({ name: "shan" }, player, event)) return false;
return true;
},
priority: 70582140,
forced: true,
direct: true,
silent:true,
charlotte: true,
unique: true,
content: function () {
if (!player.storage.enhancementArray) {
player.storage.enhancementArray = {
attack: 0, //攻击力
defend: 0, //防御力
miss: 0, //闪避率
hit: 0, //命中率
strike: 0, //暴击率,目前没用
draw: 0, //摸牌,目前没用
locked: false,
locked_end: -1,
locked_type: null
};
}
if (!trigger.player.storage.enhancementArray) {
player.storage.enhancementArray = {
attack: 0, //攻击力
defend: 0, //防御力
miss: 0, //闪避率
hit: 0, //命中率
strike: 0, //暴击率,目前没用
draw: 0, //摸牌,目前没用
locked: false,
locked_end: -1,
locked_type: null
};
}
event.miss_skill_miaomiao = true;
var numMis = player.storage.enhancementArray["miss"],
numHit = trigger.player.storage.enhancementArray["hit"];
var num = numMis - numHit;
if (num <= 0) return;
else {
num = 0.05 * num;
}
if (num > Math.random()) {
trigger.untrigger();
trigger.set("responded", true);
trigger.result = { bool: true, card: { name: "shan", isCard: false } };
}
}
};
lib.skill._miao_enhancement_strike = {
/*根据攻击与防御强化进行伤害修正 */
trigger: {
source: "damageBegin1"
},
priority: -70582140,
forced: true,
filter: function (card, player, target) {
return true;
},
direct: true,
charlotte: true,
silent:true,
unique: true,
content: function () {
if (!player.storage.enhancementArray) {
player.storage.enhancementArray = {
attack: 0, //攻击力
defend: 0, //防御力
miss: 0, //闪避率
hit: 0, //命中率
strike: 0, //暴击率,目前没用
draw: 0, //摸牌,目前没用
locked: false,
locked_end: -1,
locked_type: null
};
}
if (!trigger.player.storage.enhancementArray) {
player.storage.enhancementArray = {
attack: 0, //攻击力
defend: 0, //防御力
miss: 0, //闪避率
hit: 0, //命中率
strike: 0, //暴击率,目前没用
draw: 0, //摸牌,目前没用
locked: false,
locked_end: -1,
locked_type: null
};
}
var numDamage = trigger.num,
num = player.storage.enhancementArray["strike"];
if (num * 0.05 > Math.random()) {
trigger.num *= 2;
game.log(player, "暴击了");
}
}
};
lib.skill._miao_enhancement_locked = {
/*轮次类型计数移除强化锁定 */
trigger: {
global: "roundStart"
},
filter: function (card, player, target) {
return true;
},
direct: true,
silent:true,
charlotte: true,
unique: true,
content: function () {
if (!player.storage.enhancementArray || player.storage.enhancementArray.locked_type != "round") {
return;
}
player.storage.enhancementArray.locked_end -= 1;
if (player.storage.enhancementArray.locked_end == 0) {
player.unlockEnhancement();
}
}
};
lib.skill._miao_enhancement_locked2 = {
/*回合类型计数移除强化锁定 */
trigger: {
global: "phaseBegin"
},
direct: true,
silent:true,
charlotte: true,
unique: true,
filter: function (event, player) {
return true;
},
content: function () {
if (!player.storage.enhancementArray || player.storage.enhancementArray.locked_type != "phase") {
return;
}
player.storage.enhancementArray.locked_end -= 1;
if (player.storage.enhancementArray.locked_end == 0) {
player.unlockEnhancement();
}
}
};
lib.skill.miao_enhancement_mark = {
/*强化的mark,指示用,CPU is cheap,memory is cheap,life is beautiful */
subSkill: {
mark: {
mark: true,
marktext: "强化",
intro: {
name: "强化等级",
mark: function (dialog, storage, player) {
var str = "",
count = 0;
for (var i in player.storage.enhancementArray) {
if (!["attack", "miss", "defend", "hit", "strike"].includes(i) || player.storage.enhancementArray[i] == 0) continue;
var e = i;
var s = "";
count++;
if (count != 1 && (count - 1) % 3 == 0) {
str = str + "<br>";
} else if (count != 1) {
str = str + ",";
}
switch (e) {
case "attack":
s = "攻击";
break;
case "defend":
s = "防御";
break;
case "miss":
s = "闪避";
break;
case "hit":
s = "命中";
break;
case "strike":
s = "暴击";
break;
case "draw":
s = "摸牌";
break;
}
if (player.storage.enhancementArray[i] > 0) {
s = s + "+";
}
s = s + player.storage.enhancementArray[i];
str = str + s;
}
return str;
}
}
},
attack: {
mark: true,
marktext: "攻击",
intro: {
name: "攻击"
}
},
defend: {
mark: true,
marktext: "防御",
intro: {
name: "防御"
}
},
miss: {
mark: true,
marktext: "闪避",
intro: {
name: "闪避"
}
},
hit: {
mark: true,
marktext: "命中",
intro: {
name: "命中"
}
},
strike: {
mark: true,
marktext: "暴击",
intro: {
name: "暴击"
}
},
draw: {
mark: true,
marktext: "摸牌",
intro: {
name: "摸牌"
}
},
attack1: {
mark: true,
marktext: "攻击+",
intro: {
name: "攻击"
}
},
defend1: {
mark: true,
marktext: "防御+",
intro: {
name: "防御"
}
},
miss1: {
mark: true,
marktext: "闪避+",
intro: {
name: "闪避"
}
},
hit1: {
mark: true,
marktext: "命中+",
intro: {
name: "命中"
}
},
strike1: {
mark: true,
marktext: "暴击+",
intro: {
name: "暴击"
}
},
draw1: {
mark: true,
marktext: "摸牌+",
intro: {
name: "摸牌"
}
},
locked: {
mark: true,
marktext: "锁强",
intro: {
name: "已锁定强化等级",
mark: function (dialog, storage, player) {
var str;
if (player.storage.enhancementArray["locked_type"] == "round") str = " 轮";
else {
str = " 回合";
}
return "剩余 " + player.storage.enhancementArray["locked_end"] + str;
}
}
}
}
};
/*---------------------------------------------------------------以下部分为武将势力相关---------------------------------------------------------------*/
// 暂时不可用
game.AddGroupNatureMiao = function (name, translation, mapping) {
/*设定势力的函数,from活动武将 */
if (!mapping || !Array.isArray(mapping) || mapping.length != 3) mapping = [199, 21, 133];
var gradient = [mapping, mapping];
var y = "(" + mapping[0] + "," + mapping[1] + "," + mapping[2];
var y1 = y + ",1)",
y2 = y + ")";
var s = document.createElement("style");
var l;
//omg
l = ".player .identity[data-color='miao_" + name + "'],";
l += "div[data-nature='miao_" + name + "'],";
l +=
"span[data-nature='miao_" +
name +
"'] {text-shadow: black 0 0 1px,rgba" +
y1 +
" 0 0 2px,rgba" +
y1 +
" 0 0 5px,rgba" +
y1 +
" 0 0 10px,rgba" +
y1 +
" 0 0 10px}";
l += "div[data-nature='miao_" + name + "m'],";
l +=
"span[data-nature='miao_" +
name +
"m'] {text-shadow: black 0 0 1px,rgba" +
y1 +
" 0 0 2px,rgba" +
y1 +
" 0 0 5px,rgba" +
y1 +
" 0 0 5px,rgba" +
y1 +
" 0 0 5px,black 0 0 1px;}";
l += "div[data-nature='miao_" + name + "mm'],";
l +=
"span[data-nature='miao_" +
name +
"mm'] {text-shadow: black 0 0 1px,rgba" +
y1 +
" 0 0 2px,rgba" +
y1 +
" 0 0 2px,rgba" +
y1 +
" 0 0 2px,rgba" +
y1 +
" 0 0 2px,black 0 0 1px;}";
s.innerHTML = l;
document.head.appendChild(s);
if (gradient && Array.isArray(gradient) && Array.isArray(gradient[0]) && gradient[0].length == 3) {
var str = "",
st2 = [];
for (var i = 0; i < gradient.length; i++) {
str += ",rgb(" + gradient[i][0] + "," + gradient[i][1] + "," + gradient[i][2] + ")";
if (i < 2) st2[i] = "rgb(" + gradient[i][0] + "," + gradient[i][1] + "," + gradient[i][2] + ")";
}
var tenUi = document.createElement("style");
tenUi.innerHTML = ".player>.camp-zone[data-camp='" + name + "']>.camp-back {background: linear-gradient(to bottom" + str + ");}";
tenUi.innerHTML += ".player>.camp-zone[data-camp='" + name + "']>.camp-name {text-shadow: 0 0 5px " + st2[0] + ", 0 0 10px " + st2[1] + ";}";
document.head.appendChild(tenUi);
}
//lib.group.push(n);
lib.translate[name] = translation;
lib.groupnature[name] = "miao_" + name;
};
game.AddGroupNatureMiao("daqin", "秦", [255, 165, 0]);
game.AddGroupNatureMiao(null, "?", [0, 0, 0]);
// game.AddGroupNatureMiao('test', "测试", [0, 0, 0]);
}