为Character类的get 4 增加proxy

This commit is contained in:
kuangshen04 2024-05-01 14:19:26 +08:00
parent 46e43d6b6e
commit 20f09f8244
1 changed files with 82 additions and 47 deletions

View File

@ -32,12 +32,12 @@ export class Character {
group;
/**
* 武将牌的势力边框颜色如徐庶身在曹营心在汉
* @type { string }
* @type { string|undefined }
**/
groupBorder;
/**
* 神武将牌在国战模式下的势力
* @type { string }
* @type { string|undefined }
**/
groupInGuozhan;
/**
@ -62,17 +62,17 @@ export class Character {
hasHiddenSkill = false;
/**
* 垃圾桶用于存储原本Character[4]的垃圾数据
* @type { Array }
* @type { any[] }
**/
trashBin = [];
/**
* 武将牌对应的另一半双面武将牌
* @type { string }
* @type { string|undefined }
**/
dualSideCharacter;
/**
* 多势力武将牌的全部势力
* @type { Array }
* @type { string[] }
**/
doubleGroup = [];
/**
@ -97,7 +97,7 @@ export class Character {
isAiForbidden = false;
/**
* 武将牌在炉石模式/挑战模式下的特殊信息
* @type { array|undefined }
* @type { any[]|undefined }
**/
extraModeData;
/**
@ -151,7 +151,7 @@ export class Character {
**/
initFilters = [];
/**
* @param { Array|Object } [data]
* @param { Object|[string, string, string|number, string[], any[], any[]|undefined] } [data]
*/
constructor(data) {
if (Array.isArray(data)) {
@ -161,72 +161,96 @@ export class Character {
this.maxHp = get.infoMaxHp(data[2]);
this.hujia = get.infoHujia(data[2]);
this.skills = get.copy(data[3] || []);
if (data[4]) Character.convertTrashToProperties(this, data[4]);
if (data[4]) this.setPropertiesFromTrash(data[4]);
if (data.length > 5) this.extraModeData = data[5];
} else if (get.is.object(data)) {
Object.assign(this, data);
if (typeof this.maxHp !== "number") this.maxHp = this.hp;
}
}
initializeTrashProperties() {
this.groupInGuozhan = void 0;
this.isZhugong = false;
this.isUnseen = false;
this.isMinskin = false;
this.hasSkinInGuozhan = false;
this.isBoss = false;
this.isChessBoss = false;
this.isJiangeBoss = false;
this.isJiangeMech = false;
this.isBossAllowed = false;
this.isHiddenBoss = false;
this.isAiForbidden = false;
this.isFellowInStoneMode = false;
this.isHiddenInStoneMode = false;
this.isSpecialInStoneMode = false;
this.hasHiddenSkill = false;
this.groupBorder = void 0;
this.dualSideCharacter = void 0;
this.doubleGroup = [];
this.clans = [];
this.initFilters = [];
this.trashBin = [];
}
/**
* @param { Character } character
* @param { Array } trash
* @param { any[] } trash
*/
static convertTrashToProperties(character, trash) {
let keptTrashes = [],
setPropertiesFromTrash(trash) {
this.initializeTrashProperties();
const keptTrashes = [],
clans = [];
for (let i = 0; i < trash.length; i++) {
let item = trash[i];
const item = trash[i];
if (i === 0 && (lib.group.includes(item) || item === 'key')) {
character.groupInGuozhan = item;
} else if(item.startsWith("gzgroup:")){
character.groupInGuozhan = item.slice(8);
this.groupInGuozhan = item;
} else if (item === "zhu") {
character.isZhugong = true;
this.isZhugong = true;
} else if (item === "unseen") {
character.isUnseen = true;
this.isUnseen = true;
} else if (item === "minskin") {
character.isMinskin = true;
this.isMinskin = true;
} else if (item === "gzskin") {
character.hasSkinInGuozhan = true;
this.hasSkinInGuozhan = true;
} else if (item === "boss") {
character.isBoss = true;
this.isBoss = true;
} else if (item === "chessboss") {
character.isChessBoss = true;
this.isChessBoss = true;
} else if (item === "jiangeboss") {
character.isJiangeBoss = true;
this.isJiangeBoss = true;
} else if (item === "jiangemech") {
character.isJiangeMech = true;
this.isJiangeMech = true;
} else if (item === "bossallowed") {
character.isBossAllowed = true;
this.isBossAllowed = true;
} else if (item === "hiddenboss") {
character.isHiddenBoss = true;
this.isHiddenBoss = true;
} else if (item === "forbidai") {
character.isAiForbidden = true;
this.isAiForbidden = true;
} else if (item === "stone") {
character.isFellowInStoneMode = true;
this.isFellowInStoneMode = true;
} else if (item === "stonehidden") {
character.isHiddenInStoneMode = true;
this.isHiddenInStoneMode = true;
} else if (item === "stonespecial") {
character.isSpecialInStoneMode = true;
this.isSpecialInStoneMode = true;
} else if (item === "hiddenSkill") {
character.hasHiddenSkill = true;
} else if (item.startsWith("border:")) {
character.groupBorder = item.slice(7);
} else if (item.startsWith("dualside:")) {
character.dualSideCharacter = item.slice(9);
} else if (item.startsWith("doublegroup:")) {
character.doubleGroup = item.slice(12).split(":");
} else if (item.startsWith("clan:")) {
this.hasHiddenSkill = true;
} else if (item?.startsWith("border:")) {
this.groupBorder = item.slice(7);
} else if (item?.startsWith("dualside:")) {
this.dualSideCharacter = item.slice(9);
} else if (item?.startsWith("gzgroup:")) {
this.groupInGuozhan = item.slice(8);
} else if (item?.startsWith("doublegroup:")) {
this.doubleGroup = item.slice(12).split(":");
} else if (item?.startsWith("clan:")) {
clans.push(item.slice(5));
} else if (item.startsWith("InitFilter:")) {
character.initFilters = item.slice(11).split(":");
} else if (item?.startsWith("InitFilter:")) {
this.initFilters = item.slice(11).split(":");
} else {
keptTrashes.push(item);
}
}
if (clans.length > 0) character.clans = clans;
character.trashBin = keptTrashes;
this.clans = clans;
this.trashBin = keptTrashes;
}
/**
* @deprecated
@ -274,12 +298,12 @@ export class Character {
/**
* 把新格式下的数据转换回传统的屎山
* @deprecated
* @deprecated
*/
get 4() {
const trashes = [],
character = this;
if (lib.group.includes(character.groupInGuozhan)) {
if (character.groupInGuozhan && lib.group.includes(character.groupInGuozhan)) {
trashes.push(`gzgroup:${character.groupInGuozhan}`);
}
if (character.isZhugong) {
@ -343,16 +367,27 @@ export class Character {
trashes.push(`InitFilters:${character.initFilters.join(":")}`);
}
return trashes.concat(character.trashBin);
return new Proxy(trashes.concat(character.trashBin), {
set(target, prop, newValue) {
const result = Reflect.set(target, prop, newValue);
character.setPropertiesFromTrash(target);
return result;
},
deleteProperty(target, prop) {
const result = Reflect.deleteProperty(target, prop);
character.setPropertiesFromTrash(target);
return result;
}
});
}
set 4(trashBin) {
console.warn("你set你🐎的废弃属性");
}
get 5(){
get 5() {
return this.extraModeData;
}
set 5(stoneData){
set 5(stoneData) {
this.extraModeData = stoneData;
}
}