消消方块阵换皮表情
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

424 lines
14 KiB

import { Singleton } from '../../mx/tools/Singleton';
import { OtherDataType, StatusType } from '../game/GameData';
import { GEvent } from '../../mx/module/event/GEvent';
import { AddType, ATTR_TYPE_MAP, CONDITION_STRATEGIES, AttrResult, WearingAddType } from '../interface/AttributeInterface';
export class RoleSkin extends Singleton {
/**获取所有皮肤列表 */
get allSkin() {
let arr = gg.role.allSkinItemid;
//console.log("所有皮肤配置", arr);
return arr;
}
/**获取当前拥有的皮肤列表 */
get skinList() {
let allSkin = this.allSkin;
let have = [allSkin[0]]; //拥有默认的初始皮肤
for (let item of allSkin) {
if (gg.data.getItemNum(item.id) > 0) {
have.push(item);
}
}
//console.log("当前拥有的皮肤 物品配置", have);
return have;
}
/**获取当前穿戴的皮肤 */
get CurrentSkin() {
let skinId = gg.data.getStatus(StatusType.CurrentSkin);
if(skinId == 0){
gg.role.setDefaultSkin();
skinId = gg.data.getStatus(StatusType.CurrentSkin);
}
return skinId;
}
set CurrentSkin(skinId: number) {
if (this.CurrentSkin == skinId) {
return;
}
gg.data.setStatus(StatusType.CurrentSkin, skinId);
GEvent.Ins.emit(GEvent.CHANGE_SKIN, skinId);
}
/**获取指定皮肤需要的锁片 */
getNeedPieceNum(skinId: number) {
let skin = gg.role.allSkinConfig.find(item => item.itemid == skinId);
let skinLevel = this.getSkinLevel(skinId);
let upneeds = skin.upneed.split(",");
return Number(upneeds[skinLevel]);
}
//
getHavePieceId(skinId: number){
let skinConfig = gg.role.allSkinConfig.find(item => item.itemid == skinId);
let pieceId = skinConfig.piece;
return pieceId;
}
getHavePieceNum(skinId: number) {
let skinConfig = gg.role.allSkinConfig.find(item => item.itemid == skinId);
let pieceId = skinConfig.piece;
return gg.data.getItemNum(pieceId);
}
/**检查是否有指定的皮肤 */
checkHasSkin(skinId: number) {
return this.skinList.some(item => item.id == skinId);
}
/**获取指定的皮肤 */
getSkin(skinId: number) {
return this.allSkin.find(item => item.id == skinId);
}
/**获得皮肤 */
addSkin(skinId: number) {
return gg.data.addItemNum(skinId, 1);
}
//根据itemId获取皮肤的配置
getSkinConfig(itemid: number) {
return gg.role.allSkinConfig.find(item => item.itemid == itemid);
}
/***根据skinid获取皮肤配置 */
getSkinConfigBySkinId(skinId: number) {
return gg.role.allSkinConfig.find(item => item.id == skinId);
}
//获取当前皮肤的type AddType
getCurrentSkinAddType(skinId){
let config = this.getSkinConfig(skinId);
let addType = config.alladd.split('|').map(Number);
return addType[0];
}
//获取当前皮肤的加成系数
getCurrentSkinAddValue(skinId){
let config = this.getSkinConfig(skinId);
let addType = config.alladd.split('|').map(Number);
return addType[1];
}
//获取当前皮肤是不是满级了
isMaxLevel(skinId){
let config = this.getSkinConfig(skinId);
let level = this.getSkinLevel(skinId);
return level >= config.upneed.split(',').length;
}
maxLevel(skinId){
let config = this.getSkinConfig(skinId);
let level = this.getSkinLevel(skinId);
let max = config.upneed.split(',').length-1;
return max;
}
//当前等级皮肤的加成系数和下一级的加成系数
getCurrentSkinAddValueAndNext(skinId){
let config = this.getSkinConfig(skinId);
let level = this.getSkinLevel(skinId);
let upattr = config.upattr.split(',').map(Number);
let nextLevel = level+1;
let nextAddValue = upattr[nextLevel];
if(level >= config.upattr.length){
nextAddValue = -999 //满级标记
}
return {
addValue:upattr[level],
nextAddValue:nextAddValue
}
}
//获取当前皮肤穿戴的onadd类型
getCurrentSkinOnAddType(skinId){
let config = this.getSkinConfig(skinId);
if (!config || !config.onadd) {
return { WearingAddType: 0, WearingAddValue: 0, addType: 0 };
}
let addType = config.onadd.split('|').map(Number);
if (addType.length < 3) {
return { WearingAddType: addType[0] ?? 0, WearingAddValue: addType[1] ?? 0, addType: addType[2] ?? 0 };
}
return {
WearingAddType:addType[0],
WearingAddValue:addType[1],
addType:addType[2]
}
}
/**获取皮肤等级 */
getSkinLevel(skinId: number) {
let allSkin = this.allSkin;
let have = allSkin[0]; //拥有默认的初始皮肤
let level = 1;
let skinLevel = gg.data.getkeyKeyValue(OtherDataType.SkinLevel, skinId);
level = skinLevel && skinLevel != "" ? parseInt(skinLevel) : 0;
if(level == 0 && skinId == have.id){
//默认皮肤不需要解锁
level = 1;
}else if(this.checkHasSkin(skinId) && level == 0){
//如果有皮肤,等级从1开始
level = 1;
}
//console.log("皮肤等级", skinId, level);
return level;
}
/**设置皮肤等级 */
setSkinLevel(skinId: number, level: number) {
gg.data.setkeyKeyValue(OtherDataType.SkinLevel, skinId, level);
}
/**皮肤升级 */
upgradeSkin(skinId: number) {
let level = this.getSkinLevel(skinId);
if(level == 0){
//如果是0等级刚刚开始解锁的, 设置一下皮肤的道具为1
gg.data.setItemNum(skinId, 1);
}
level++;
let maxLevel = this.maxLevel(skinId);
if(level > maxLevel){
level = maxLevel;
}
this.setSkinLevel(skinId, level);
}
//皮肤加成 万分比没有做处理
//获取皮肤攻击力加成
/**获取皮肤加成 */
getSkinAdd() {
//获取当前穿戴的皮肤的加成 fix me
//alladd == AddType.Atk
let skinList = this.skinList; //当前拥有的皮肤
let allSkinConfig = gg.role.allSkinConfig
let atkAdd = 0;
for(let item of skinList){
let skinConfig = allSkinConfig.find(skin => skin.itemid == item.id);
if(skinConfig){
let addType = skinConfig.alladd.split('|').map(Number);
if(addType[0] == AddType.Atk || addType[0] == AddType.Atk2){
//攻击力加成
atkAdd += Number(addType[1]);
}
}
}
//console.log("皮肤攻击力加成", atkAdd);
//1+atkAdd/10000;
let curSkinAttr = this.getCurSkinAttr()
let cdAll = curSkinAttr.atkAdd+curSkinAttr.atk2Add;
return 1+atkAdd/10000+cdAll;
}
//获取皮肤暴击加成
getSkinCritAdd() {
let skinList = this.skinList;
let allSkinConfig = gg.role.allSkinConfig
let critAdd = 0;
for(let item of skinList){
let skinConfig = allSkinConfig.find(skin => skin.itemid == item.id);
if(skinConfig){
let addType = skinConfig.alladd.split('|').map(Number);
if(addType[0] == AddType.Crit){
//暴击加成
critAdd += Number(addType[1]);
}
}
}
//console.log("皮肤暴击加成", critAdd);
//1+critAdd/10000;
let curSkinAttr = this.getCurSkinAttr()
let all = curSkinAttr.critAdd;
return 1+critAdd/10000+all;
}
//获取皮肤冷却加成
getSkinCDAdd() {
let skinList = this.skinList;
let allSkinConfig = gg.role.allSkinConfig
let cdAdd = 0;
for(let item of skinList){
let skinConfig = allSkinConfig.find(skin => skin.itemid == item.id);
if(skinConfig){
let addType = skinConfig.alladd.split('|').map(Number);
if(addType[0] == AddType.CD){
//冷却加成
cdAdd += Number(addType[1]);
}
}
}
//console.log("皮肤冷却加成", cdAdd);
//1+cdAdd/10000;
let curSkinAttr = this.getCurSkinAttr()
let cdAll = curSkinAttr.cdAdd;
return 1+cdAdd/10000+cdAll;
}
//皮肤全局加成
getSkinGlobalAdd() {
let skinList = this.skinList; //当前拥有的皮肤
let allSkinConfig = gg.role.allSkinConfig //当前皮肤列表
const result: AttrResult = {
atkAdd: 0, cdAdd: 0, critAdd: 0, atk2Add: 0,
damageAdd: 0, critDamageAdd: 0, igniteAdd: 0, shockAdd: 0
};
// 3. 遍历皮肤列表
for (const item of skinList) {
const skinConfig = allSkinConfig.find(skin => skin.itemid == item.id);
if (!skinConfig) continue;
// 解析配置: alladd 格式假设为 "属性类型|数值"
const addConfig = skinConfig.alladd.split('|').map(Number);
// 防御性检查:确保数据格式正确 (至少要有类型和数值)
if (addConfig.length < 2) continue;
const [attrType, addValueRaw] = addConfig;
// --- 核心逻辑 (一行代码替代 8 个 if-else) ---
// A. 查表获取对应的属性键名
const resultKey = ATTR_TYPE_MAP[attrType];
// B. 如果键名存在,直接累加
if (resultKey !== undefined) {
result[resultKey] += addValueRaw;
}
// --- 结束 ---
}
return result; // 别忘了返回结果
}
/**获取穿戴皮肤加成之后的全局属性 */
getCurSkinAttr(){
let currentSkinItemId = this.CurrentSkin;
let allSkinConfig = gg.role.allSkinConfig
const skinConfig = allSkinConfig?.find(skin => skin.itemid == currentSkinItemId);
const result: AttrResult = {
atkAdd: 0, cdAdd: 0, critAdd: 0, atk2Add: 0,
damageAdd: 0, critDamageAdd: 0, igniteAdd: 0, shockAdd: 0
};
if (!skinConfig || !skinConfig.onadd) {
return result;
}
const addTypeConfig = skinConfig.onadd.split('|').map(Number);
if (addTypeConfig.length < 3) {
return result;
}
const [conditionType, conditionParam, attrType] = addTypeConfig;
if(conditionType == WearingAddType.AllWeapon){
let skinLevel = this.getSkinLevel(currentSkinItemId);
if (!skinConfig.upattr) {
return result;
}
const shuxing = skinConfig.upattr.split(',').map(Number);
if (shuxing.length === 0) {
return result;
}
// 防御性检查:防止等级超出配置范围
if (skinLevel >= shuxing.length){
skinLevel = shuxing.length-1;
}
const addNum = shuxing[skinLevel];
const resultKey = ATTR_TYPE_MAP[attrType];
if (resultKey !== undefined) {
// 原逻辑: 最终值 = 1 + 总和/10000
// 这里直接累加增量部分 (/10000)
result[resultKey] += addNum / 10000;
}
return result;
}else{
//没有全局武器加成
return result;
}
}
//皮肤穿戴加成
/**获取皮肤加成后的属性 */
getSkinAttrByWeapon(weaponId: number):AttrResult {
let weaponData: ITableWeapon2 = gg.data.project.getWeaponData(weaponId);
let skinList = this.skinList;
let allSkinConfig = gg.role.allSkinConfig
let currentSkinItemId = this.CurrentSkin;
const result: AttrResult = {
atkAdd: 0, cdAdd: 0, critAdd: 0, atk2Add: 0,
damageAdd: 0, critDamageAdd: 0, igniteAdd: 0, shockAdd: 0
};
// 4. 遍历皮肤列表
for (const item of skinList) {
// 防御性检查:确保数据格式正确 (至少要有类型和数值)
if (item.id != currentSkinItemId) continue;
const skinConfig = allSkinConfig.find(skin => skin.itemid == item.id);
if (!skinConfig) continue;
const skinLevel = this.getSkinLevel(item.id);
const shuxing = skinConfig.upattr.split(',').map(Number);
// 防御性检查:防止等级超出配置范围
if (skinLevel >= shuxing.length) continue;
const addNum = shuxing[skinLevel];
if (addNum === 0) continue; // 优化:0 加成直接跳过
if (!skinConfig.onadd) continue;
const addTypeConfig = skinConfig.onadd.split('|').map(Number);
if (addTypeConfig.length < 3) continue;
// 解构: [条件类型, 条件参数, 属性类型]
const [conditionType, conditionParam, attrType] = addTypeConfig;
// --- 核心逻辑 (通用处理所有情况) ---
// A. 检查武器条件是否满足
const checkFunc = CONDITION_STRATEGIES[conditionType] || (() => false);;
if (!checkFunc || !checkFunc(conditionParam, weaponData)) {
continue; // 条件不满足,跳过
}
// B. 查找对应的属性键名
const resultKey = ATTR_TYPE_MAP[attrType];
// C. 如果属性类型有效,累加数值
if (resultKey !== undefined) {
// 原逻辑: 最终值 = 1 + 总和/10000
// 这里直接累加增量部分 (/10000)
result[resultKey] += addNum;
}
// --- 结束 ---
}
return result;
}
}