diff --git a/doc/todolist.xmind b/doc/todolist.xmind new file mode 100644 index 0000000..d22f2ea Binary files /dev/null and b/doc/todolist.xmind differ diff --git a/src/rooms/logic/CfgMan.ts b/src/rooms/logic/CfgMan.ts index b8949ef..cd4b825 100644 --- a/src/rooms/logic/CfgMan.ts +++ b/src/rooms/logic/CfgMan.ts @@ -2,6 +2,7 @@ import { EffectCardCfg } from "cfg/parsers/EffectCardCfg"; import { HeroCfg } from "cfg/parsers/HeroCfg"; import { SkillCfg } from "cfg/parsers/SkillCfg"; import { UnitCfg } from "cfg/parsers/UnitCfg"; +import arrUtil from "utils/array.util"; import { BaseConst } from "../../constants/BaseConst"; import { EffectCardType, EnhanceEffectType, SkillEffectSignType, SkillEffectValueType, SkillTargetType } from "./skill/SkillConst"; @@ -12,6 +13,8 @@ let CfgMan = { */ _cardcache: new Map(), + _typecards: new Map(), + findPlayerCfg(playerid: number): HeroCfg{ return global.$cfg.get(BaseConst.HERO).get(playerid); }, @@ -109,6 +112,38 @@ let CfgMan = { this._cardcache.set(cardid + '', {target: res}); return res; + }, + + randomCard(subtype: number): number{ + if(this._typecards.size == 0){ + for(let [key, val] of global.$cfg.get(BaseConst.EFFECTCARD)){ + let id1 = val.affix1id; + let id2 = val.affix2id; + if(id1){ + let lst = this._typecards.get(id1 + ''); + if(!lst){ + lst = [key]; + this._typecards.set(id1 + '', lst); + }else{ + lst.push(key); + } + } + + if(id2 && id2 != id1){ + let lst = this._typecards.get(id2 + ''); + if(!lst){ + lst = [key]; + this._typecards.set(id2 + '', lst); + }else{ + lst.push(key); + } + } + } + } + + let obj = this._typecards.get(subtype + ''); + + return obj? arrUtil.randomOne(obj): 0; } }; diff --git a/src/rooms/logic/Handler/BattleHandler.ts b/src/rooms/logic/Handler/BattleHandler.ts index a5b5143..33d7a82 100644 --- a/src/rooms/logic/Handler/BattleHandler.ts +++ b/src/rooms/logic/Handler/BattleHandler.ts @@ -102,7 +102,7 @@ export class BattleHandler { { let pet = apet; let bok = this.petIsValid(pet, players, ct); - if(checktaunt && (!bok || !pet._istaunt)){ + if(checktaunt && (!bok || !pet.isTaunt())){ for(let i = 0; i < players.length;i++){ let obj = players[i].findTauntPet(); if(obj){ diff --git a/src/rooms/logic/Handler/PetHandler.ts b/src/rooms/logic/Handler/PetHandler.ts index dce9edd..595d8a9 100644 --- a/src/rooms/logic/Handler/PetHandler.ts +++ b/src/rooms/logic/Handler/PetHandler.ts @@ -29,6 +29,8 @@ export class PetHandler { _baseap: number; // 基础 + _basehp: number = 0; + // _exap: number = 0; // 额外 _exredhurt: number = 0; // 减伤 @@ -37,10 +39,15 @@ export class PetHandler { _istaunt: boolean = false; // 是否是嘲讽 + _isSilent: boolean = false; // 是否被沉默 + _silentCD: number = 0; // 沉默剩余回合 + _selfskills: number[] = []; _idx: number; + _bakBaseap: number; + public init(apet: Pet, owner: PlayerHandler, index: number){ this._pet = apet; this._owner = owner; @@ -188,6 +195,7 @@ export class PetHandler { if(value <= 0){ return 0; } + let n = -value; for(let i = 0; i < this._effhalos.length;i++){ let dv = this._effhalos[i].addHaloValue(n); @@ -196,21 +204,20 @@ export class PetHandler { break; } } - if(n < 0){ - this._baseap += n; - this._ceilBaseAP(); + if(n >= 0){ + this.dataChanged(); + return value; } - this.dataChanged(); - if(this._baseap <= 0){ - this.die(); - } - return value; + + return this.addBaseAP(n); }; public addBaseAP(value: number): number{ if(value == 0){ return 0; } + + this._bakBaseap = this._baseap; this._baseap += value; this._ceilBaseAP(); this.dataChanged(); @@ -254,11 +261,22 @@ export class PetHandler { this._owner && this._owner.onPetBorned(this, param); }; + public isDead(){ + return this._baseap <= 0; + }; + public die(){ - this.clear(); this._owner && this._owner.onPetDied(this); }; + public reborn(){ + this._effhalos.forEach((item: Skill) => { + item.resetHaloValue(); + }); + this._baseap = this._bakBaseap; + this._bakBaseap = 0; + }; + public clear(){ if(this._halos.length > 0){ this._halos.length = 0; @@ -276,10 +294,30 @@ export class PetHandler { this._istaunt = false; }; + public isTaunt(){ + return this._istaunt; + }; + + public isSilent(){ + return this._isSilent; + }; + public summonPet(petid: number, count: number = 1, exparam: SkillParam):number{ return this._owner.summonPet(petid, count, exparam); }; + public beSilent(count: number){ + this._isSilent = true; + this._silentCD = count; + if(this.hasHaloSkill()){ + + } + }; + + public hasHaloSkill(): boolean{ + return this._halos.length > 0; + }; + public hasHalo(skill: Skill): boolean{ return this._halos.includes(skill); }; @@ -314,6 +352,9 @@ export class PetHandler { }; public checkSkills(tgtype: TriggerType, tgtv: any, sp: SkillParam, cb?: any){ + if(this._isSilent){ + return; + } this._waitskills.forEach((item: Skill) => { item.checkTrigger(tgtype, tgtv, sp, cb); }); diff --git a/src/rooms/logic/Handler/PlayerHandler.ts b/src/rooms/logic/Handler/PlayerHandler.ts index 41ccc61..18a1245 100644 --- a/src/rooms/logic/Handler/PlayerHandler.ts +++ b/src/rooms/logic/Handler/PlayerHandler.ts @@ -270,16 +270,24 @@ export class PlayerHandler { this._owner.onAddPetNotify(apet); // 战吼 - this.simpleCheckSkills(apet._bornSkills, apet, param); + if(!apet.isSilent()){ + this.simpleCheckSkills(apet._bornSkills, apet, param); + } }; - public onPetDied(apet: PetHandler){ - this._owner.onDelPetNotify(apet); - + public onPetDied(apet: PetHandler): boolean{ // 遗愿 - this.simpleCheckSkills(apet._dieSkills); + if(!apet.isSilent()){ + this.simpleCheckSkills(apet._dieSkills); + } - this.delPet(apet); + if(apet.isDead()){ + this._owner.onDelPetNotify(apet); + apet.clear(); + this.delPet(apet); + } + + return true; }; public onPetChanged(apet: PetHandler){ @@ -350,11 +358,11 @@ export class PlayerHandler { }; public findTauntPet(): PetHandler{ - if(this._self && this._self._istaunt){ + if(this._self && this._self.isTaunt()){ return this._self; } return this._pets.find((item: PetHandler) =>{ - return item._istaunt; + return item.isTaunt(); }) }; diff --git a/src/rooms/logic/skill/Skill.ts b/src/rooms/logic/skill/Skill.ts index 90c4374..d969417 100644 --- a/src/rooms/logic/skill/Skill.ts +++ b/src/rooms/logic/skill/Skill.ts @@ -24,6 +24,7 @@ export class Skill { _cb: any; halo_v: number = -1; + reborn_v: number = -1; rd: number = 0; // LIFE-CYCLE CALLBACKS: @@ -198,6 +199,10 @@ export class Skill { return 0; }; + resetHaloValue(){ + this.halo_v = -1; + }; + trigger(param: SkillParam, cb?: any) { //触发buff效果 let res = TriggerManager.onTrigger(this, param); diff --git a/src/rooms/logic/skill/SkillConst.ts b/src/rooms/logic/skill/SkillConst.ts index 9e97bba..763d476 100644 --- a/src/rooms/logic/skill/SkillConst.ts +++ b/src/rooms/logic/skill/SkillConst.ts @@ -1,4 +1,16 @@ // 判断条件 +/** + * 0.无条件发动 + * 1.当前手牌数 + * 2.累计抽牌数 + * 3.胡牌(吃牌/自摸)(就是无条件,所以废弃) + * 4.吃别人牌(吃牌) + * 5.自己胡牌(自摸) + * 6.自己受到来自他人的冲锋后 + * 7.受到伤害后 + * 8.发动冲锋技能(ID40122)前 + */ + export const enum CondType { NO_COND = 0, @@ -12,6 +24,12 @@ export const enum CondType CARD_ACTION_LINK_OTHER = 4, CARD_ACTION_LINK_SELF = 5, + + BE_ATTACK = 6, + + BE_HURT = 7, + + BEFORE_ATTACK = 8, }; // 判断方式 @@ -96,6 +114,14 @@ export const enum SkillRangeUnitType{ * 11.扣除HP * 12.增加出场战力[暂不用] * 13.自己受到的伤害降低 + * 21.获得引用卡牌(需引用卡牌ID) + * 22.冲锋,对被攻击者造成“攻击者战力的伤害值”,同时由攻击者承受“被攻击者战力的伤害值” + * 23.伤害(对战力、HP均有效) + * 24.强化法术强度 + * 25.沉默N回合(N=参数) + * 26.重生(并获得死前战力) + * 27.遭受反击的伤害参数,减半 + * 28.使获得技能(引用技能ID) */ export const enum SkillEffectType { @@ -114,6 +140,13 @@ export const enum SkillEffectType POWER_ADD_BUFF = 12, HURT_REDUCE = 13, CARD_GETDIRECT = 21, + ATTACK = 22, + HURT_ALL = 23, + ENHANCE_MAGIC = 24, + SILENT = 25, + REBORN = 26, + ATTACK_BACK = 27, + SKILL_GET = 28, }; // 技能效果参数类型 @@ -147,6 +180,9 @@ export const enum EffectCardType * 3.(使引用随从、技能的次数)+效果强化牌数 * 4.(使出场战力)+效果强化参数*效果强化牌数 * 5.(使出场战力)+效果强化参数的倍速*联合牌总点数*效果强化牌数 + * 21.使本技能的释放次数(下限)+a牌数 + * 22.使本技能的释放次数(上限)+a牌数 + * 23.使本技能的引用次数(上限)+a牌数:同理,引用次数,没加下限的,就是下限 */ export const enum EnhanceEffectType { NONE = 0, @@ -155,6 +191,9 @@ export const enum EnhanceEffectType { EN_SUBSKILL_BYCFG = 3, EN_POWER_BYCFG = 4, EN_POWER_BYAP = 5, + EN_SKILL_USECOUNT_MIN = 21, + EN_SKILL_USECOUNT_MAX = 22, + EN_SKILL_QCOUNT_MAX = 23, }; // 游戏单位类型 @@ -168,6 +207,18 @@ export const enum GameUnitType { }; // 游戏敌我阵营 +/** + * 1.自己(势力) + * 2.友方(势力),不包括自己 + * 3.自己和友方(势力) + * 4.单个敌方(势力) + * 5.全部敌方(势力) + * 6.场上全部(势力),无视敌我 + + * 7.自己和友方(势力)中的随机一个 + * 8.全部敌方(势力)中的随机一个 + * 9.先对家,不存在,执行第八条 + */ export const enum GameCampType { NONE = 0, SELF = 1, @@ -176,6 +227,9 @@ export const enum GameCampType { ENEMY = 4, ENEMYTEAM = 5, ALL = 6, + RANDOM_US = 7, + RANDOM_ENEMY = 8, + FACE_ENEMY = 9, }; // 战力参数数值