Commit 02c4de8dfa830af31b34ad7e1e32f4907c667139

Authored by zhouahaihai
1 parent 4ae223df

增加 固有技

src/adv/Adv.lua
... ... @@ -273,8 +273,9 @@ function Block:open(adv, room)
273 273 if enemy then
274 274 enemy:unlock(self.event.mId)
275 275 else
276   - adv.battle:addEnemy(room, self)
  276 + enemy = adv.battle:addEnemy(room, self)
277 277 end
  278 + enemy:triggerPassive(Passive.BORN_ONCE)
278 279 end
279 280 randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster]
280 281 --掉落
... ... @@ -525,30 +526,37 @@ function Adv:getAroundBlocks(room, block)
525 526 end
526 527  
527 528 --随机一个空的位置生成怪, 如果没有就没有
528   -function Adv:addNewMonsterRand(monsterId)
529   - local pool = {}
530   - for _, room in pairs(self.rooms) do
531   - for _, block in pairs(room.blocks) do
532   - if block.isOpen and not block.event then
533   - table.insert(pool, {room, block})
  529 +function Adv:addNewMonsterRand(monsterId, where)
  530 + local room, block
  531 + if where then
  532 + room, block = where[1], where[2]
  533 + else
  534 + local pool = {}
  535 + for _, room_ in pairs(self.rooms) do
  536 + for _, block_ in pairs(room_.blocks) do
  537 + if block_.isOpen and not block_.event then
  538 + table.insert(pool, {room_, block_})
  539 + end
534 540 end
535 541 end
  542 + if not next(pool) then return end
  543 + local idx = math.randomInt(1, #pool)
  544 + room, block = pool[idx][1], pool[idx][2]
536 545 end
537   - if not next(pool) then return end
538   - local idx = math.randomInt(1, #pool)
539   - local room, block = pool[idx][1], pool[idx][2]
540   -
541   - local event = {etype = AdvEventType.Monster, mId = self.advInfo.enemyId}
542   - self.advInfo.enemyId = self.advInfo.enemyId + 1
  546 +
543 547 if not monsterId then
544 548 local eventLib = getEventLib(self.advInfo.chapter, self.advInfo.level, AdvEventType.Monster)
545 549 if not next(eventLib[AdvEventType.Monster]) then return false end
546 550 monsterId = math.randWeight(eventLib[AdvEventType.Monster], "showup")
547 551 end
  552 +
  553 + local event = {etype = AdvEventType.Monster, mId = self.advInfo.enemyId}
  554 + self.advInfo.enemyId = self.advInfo.enemyId + 1
548 555 event.id = monsterId
549 556 block.event = event
550 557 room.info.event[block.blockId] = event
551   - self.battle:addEnemy(room, block)
  558 + self.battle:addEnemy(room, block):triggerPassive(Passive.BORN_ONCE)
  559 +
552 560 return room, block
553 561 end
554 562  
... ... @@ -579,7 +587,9 @@ end
579 587 -- 打开一个地块
580 588 function Adv:openBlock(roomId, blockId)
581 589 local room = self.rooms[roomId]
  590 + if not room then return end
582 591 local block = room.blocks[blockId]
  592 + if not block then return end
583 593 room:openBlock(block, self)
584 594 self:backBlockChange(roomId, blockId)
585 595 end
... ... @@ -696,7 +706,7 @@ local function clickChoose(self, room, block, params)
696 706 }
697 707 assert(not cond[1] or checkCond[cond[1]], "error cond, event_chooseCsv id :" .. block.event.id)
698 708 if cond[1] and not checkCond[cond[1]]() then return end
699   -
  709 + local clearBlock = true
700 710 local effect = block.event.effect[choose]
701 711 local doEffect = {
702 712 [1] = function() -- 获得某道具N个
... ... @@ -706,17 +716,17 @@ local function clickChoose(self, room, block, params)
706 716 self.battle.player:addBuff(effect[2])
707 717 end,
708 718 [3] = function() --发现怪物
709   - local r, b = self:addNewMonsterRand(effect[2])
710   - if r then
711   - self:backBlockChange(r.roomId, b.blockId)
712   - end
  719 + self:addNewMonsterRand(effect[2], {room, block})
  720 + clearBlock = false
713 721 end,
714 722 [4] = function() --无事发生
715 723 end
716 724 }
717 725 assert(doEffect[effect[1]], "error effect, event_chooseCsv id :" .. block.event.id)
718 726 doEffect[effect[1]]()
719   - room:clearBEvent(block)
  727 + if clearBlock then
  728 + room:clearBEvent(block)
  729 + end
720 730 return true
721 731 end
722 732  
... ... @@ -749,6 +759,7 @@ local function clickBuild(self, room, block, params)
749 759 local buildData = csvdb["event_buildingCsv"][block.event.id]
750 760 if not buildData then return end-- 偷偷改表了
751 761 if not block.event.effect then return end -- 没有效果 气人不
  762 + local clearBlock = true
752 763 local effect = block.event.effect
753 764 --todo 效果生效
754 765 local doEffect = {
... ... @@ -759,8 +770,8 @@ local function clickBuild(self, room, block, params)
759 770 self.battle.player:addBuff(effect[2])
760 771 end,
761 772 [3] = function() --发现怪物
762   - local r, b = self:addNewMonsterRand(effect[2])
763   - if r then self:backBlockChange(r.roomId, b.blockId) end
  773 + self:addNewMonsterRand(effect[2], {room, block})
  774 + clearBlock = false
764 775 end,
765 776 [4] = function() --无事发生
766 777 end
... ... @@ -768,7 +779,9 @@ local function clickBuild(self, room, block, params)
768 779 assert(doEffect[effect[1]], "error effect, event_buildingCsv id :" .. block.event.id)
769 780 if not self:cost({[buildData.type] = 1}, {}) then return end
770 781 doEffect[effect[1]]()
771   - room:clearBEvent(block)
  782 + if clearBlock then
  783 + room:clearBEvent(block)
  784 + end
772 785 return true
773 786 end
774 787  
... ... @@ -884,7 +897,7 @@ function Adv:useSkill(skillId, target)
884 897 end
885 898  
886 899 --敌人死亡
887   -function Adv:enemyDead(roomId, blockId)
  900 +function Adv:enemyDead(roomId, blockId, escape)
888 901 local room = self.rooms[roomId]
889 902 local block = room.blocks[blockId]
890 903 --死了以后掉东西
... ... @@ -892,19 +905,23 @@ function Adv:enemyDead(roomId, blockId)
892 905 if block.event.etype == AdvEventType.BOSS then
893 906 room.isBossRoom = false
894 907 end
895   - local item = block.event.item
896   - if not item then
897   - if block.event.etype == AdvEventType.BOSS then
898   - item = {ItemId.AdvKey, 1}
899   - else
900   - local monsterData = csvdb["event_monsterCsv"][block.event.id]
901   - local dropData = csvdb["event_dropCsv"][monsterData.dropid]
902   - item = dropData["range"]:randWeight(true)
  908 + if escape then
  909 + room:clearBEvent(block)
  910 + else
  911 + local item = block.event.item
  912 + if not item then
  913 + if block.event.etype == AdvEventType.BOSS then
  914 + item = {ItemId.AdvKey, 1}
  915 + else
  916 + local monsterData = csvdb["event_monsterCsv"][block.event.id]
  917 + local dropData = csvdb["event_dropCsv"][monsterData.dropid]
  918 + item = dropData["range"]:randWeight(true)
  919 + end
903 920 end
  921 + table.clear(block.event)
  922 + block.event.etype = AdvEventType.Drop
  923 + block.event.item = item
904 924 end
905   - table.clear(block.event)
906   - block.event.etype = AdvEventType.Drop
907   - block.event.item = item
908 925 end
909 926 self:backBlockChange(roomId, blockId)
910 927 end
... ...
src/adv/AdvBattle.lua
... ... @@ -4,10 +4,14 @@ local Battle = class("Battle")
4 4 function Battle:ctor(adv)
5 5 self.adv = adv
6 6 self.player = nil --玩家
  7 + self.isNewPlayer = false
7 8 self.enemys = {} --怪
8 9 self:initPlayer()
9 10 self:initEnemys()
10 11 self:initAfter()
  12 + if self.isNewPlayer then
  13 + self.player:triggerPassive(Passive.BORN_ONCE)
  14 + end
11 15 end
12 16  
13 17 function Battle:initAfter()
... ... @@ -37,6 +41,7 @@ function Battle:initPlayer()
37 41 player.miss = 0
38 42 player.hit = 100
39 43 self.adv.advTeam.player = player
  44 + self.isNewPlayer = true
40 45 end
41 46 self.player = Player.new(self, self.adv.advTeam.player)
42 47 end
... ... @@ -64,7 +69,9 @@ function Battle:addEnemy(room, block)
64 69 end
65 70 block.event.enemy = enemy
66 71 end
67   - table.insert(self.enemys, Enemy.new(self, block.event.mId or 999, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.enemy))
  72 + local player = Enemy.new(self, block.event.mId or 999, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.enemy)
  73 + table.insert(self.enemys, player)
  74 + return player
68 75 end
69 76 end
70 77  
... ... @@ -98,7 +105,10 @@ function Battle:playerAtk(roomId, blockId)
98 105 end
99 106 --触发全员被动技能
100 107 function Battle:triggerPassive(condType, params)
101   -
  108 + self.player:triggerPassive(condType, params)
  109 + for _, enemy in ipairs(self.enemys) do
  110 + enemy:triggerPassive(condType, params)
  111 + end
102 112 end
103 113  
104 114 --回合
... ...
src/adv/AdvBuff.lua
... ... @@ -232,7 +232,6 @@ end
232 232  
233 233 function Buff:afterRound()
234 234 if self.isDel or self.owner.isDead then return end
235   -
236 235 if self._afterRount then
237 236 self:_afterRount()
238 237 end
... ...
src/adv/AdvPassive.lua
... ... @@ -3,8 +3,8 @@ local Passive = class("Passive")
3 3 -- 每回合触发的使用 afterRound
4 4 -- 其他触发的使用 triggerPassive
5 5  
6   -Passive.BORN_ONCE = 1 -- 自身出生(翻开所在格子)后M回合触发(1次)
7   -Passive.BORN_PRE = 2 --自身出生(翻开所在格子)后每N回合触发1次
  6 +Passive.BORN_ONCE = 1 -- 自身出生(翻开所在格子)触发
  7 +Passive.ROOM_SHOW = 2 --自身所在房间被展示时,触发1次
8 8 Passive.HURT_PERCENT_SELF = 3 --自身,每损失N%生命值,触发1次
9 9 Passive.HURT_PERCENT_TEAM = 4 --队友,每损失N%生命值,触发1次
10 10 Passive.HP_LOW_SELF = 5 --自身生命值<N%时,每回合触发
... ... @@ -21,12 +21,98 @@ Passive.SELF_DEAD = 15 --自身死亡后,触发1次
21 21 Passive.TEAM_DEAD = 16 --队友死亡后,触发1次
22 22 Passive.TARGET_SKILL = 17 --目标每使用N次技能,触发1次
23 23 Passive.TEAM_SKILL = 18 --队友每使用N次技能,触发1次
24   -Passive.ROOM_SHOW = 19 --自身所在房间被展示时,触发1次
  24 +
25 25  
26 26 -- 不同的开启条件
27   -local PassiveFactory = {
28   -
29   -}
  27 +local PassiveCondFactory = {}
  28 +PassiveCondFactory[Passive.HURT_PERCENT_SELF] = function(_Passive)
  29 + _Passive._trigger = function(self, params)
  30 + local value = params.value or 1
  31 + self.rv = math.floor(self.rv + value)
  32 + if self.rv >= self.passiveData.value then
  33 + self.rv = self.rv % self.passiveData.value -- 取余
  34 + return true
  35 + end
  36 + end
  37 + _Passive._initDB = function(self, data)
  38 + self.rv = data.rv or 0
  39 + end
  40 + _Passive._getDB = function(self)
  41 + return {rv = self.rv}
  42 + end
  43 +end
  44 +
  45 +PassiveCondFactory[Passive.HURT_PERCENT_TEAM] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  46 +PassiveCondFactory[Passive.SELF_ATK] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  47 +PassiveCondFactory[Passive.SELF_HURT] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  48 +PassiveCondFactory[Passive.TEAM_ATK] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  49 +PassiveCondFactory[Passive.TEAM_HURT] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  50 +PassiveCondFactory[Passive.TARGET_SKILL] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  51 +PassiveCondFactory[Passive.TEAM_SKILL] = PassiveCondFactory[Passive.HURT_PERCENT_SELF] --逻辑相同
  52 +
  53 +PassiveCondFactory[Passive.ROOM_SHOW] = function(_Passive)
  54 + _Passive._trigger = function(self, params)
  55 + local roomId = params.roomId
  56 + if self.roomId == roomId then
  57 + return true
  58 + end
  59 + end
  60 +end
  61 +
  62 +PassiveCondFactory[Passive.HP_LOW_SELF] = function(_Passive)
  63 + _Passive._afterRound = function(self)
  64 + if self.owner.hp / self.owner.hpMax * 100 < self.passiveData.value then
  65 + self:trigger(Passive.HP_LOW_SELF)
  66 + end
  67 + end
  68 +end
  69 +
  70 +PassiveCondFactory[Passive.HP_LOW_TEAM] = function(_Passive)
  71 + _Passive._afterRound = function(self)
  72 + for _, player in ipairs(self.owner:getTeam(2)) do
  73 + if player.hp / player.hpMax * 100 < self.passiveData.value then
  74 + self:trigger(Passive.HP_LOW_TEAM, {trigger = player})
  75 + end
  76 + end
  77 + end
  78 +end
  79 +
  80 +PassiveCondFactory[Passive.HP_UP_SELF] = function(_Passive)
  81 + _Passive._afterRound = function(self)
  82 + if self.owner.hp / self.owner.hpMax * 100 > self.passiveData.value then
  83 + self:trigger(Passive.HP_UP_SELF)
  84 + end
  85 + end
  86 +end
  87 +
  88 +PassiveCondFactory[Passive.HP_UP_TEAM] = function(_Passive)
  89 + _Passive._afterRound = function(self)
  90 + for _, player in ipairs(self.owner:getTeam(2)) do
  91 + if player.hp / player.hpMax * 100 > self.passiveData.value then
  92 + self:trigger(Passive.HP_UP_TEAM, {trigger = player})
  93 + end
  94 + end
  95 + end
  96 +end
  97 +
  98 +PassiveCondFactory[Passive.MONSTER_COUNT_UP] = function(_Passive)
  99 + _Passive._afterRound = function(self)
  100 + local monsters = self.owner.battle.player:getTeam(2)
  101 + if #monsters > self.passiveData.value then
  102 + self:trigger(Passive.MONSTER_COUNT_UP)
  103 + end
  104 + end
  105 +end
  106 +
  107 +PassiveCondFactory[Passive.MONSTER_COUNT_LOW] = function(_Passive)
  108 + _Passive._afterRound = function(self)
  109 + local monsters = self.owner.battle.player:getTeam(2)
  110 + if #monsters < self.passiveData.value then
  111 + self:trigger(Passive.MONSTER_COUNT_LOW)
  112 + end
  113 + end
  114 +end
  115 +
30 116  
31 117 function Passive:ctor(owner, data)
32 118 self.owner = owner
... ... @@ -36,8 +122,11 @@ function Passive:ctor(owner, data)
36 122 self.isDel = false
37 123 self.round = data.round or 0 --触发剩余回合数
38 124 self.count = data.count or 0 --触发剩余次数
39   - if PassiveFactory[self.passiveData.condition] then
40   - PassiveFactory[self.passiveData.condition](self)
  125 + if PassiveCondFactory[self.passiveData.condition] then
  126 + PassiveCondFactory[self.passiveData.condition](self)
  127 + end
  128 + if self._initDB then
  129 + self:_initDB(data)
41 130 end
42 131 end
43 132  
... ... @@ -46,8 +135,8 @@ function Passive:getCondType()
46 135 end
47 136  
48 137 function Passive:effect()
49   - if self._effect then
50   - self:_effect()
  138 + if math.randomInt(1, 100) <= self.passiveData.chance and self["effect" .. self.passiveData.effect] then
  139 + self["effect" .. self.passiveData.effect](self)
51 140 end
52 141 --次数为 -1 一局只能触发一次,触发过后删掉就可以
53 142 if self.count == -1 then
... ... @@ -78,16 +167,19 @@ function Passive:isActive( )
78 167 end
79 168  
80 169 function Passive:trigger(condType, params) --触发检查
  170 + params = params or {}
  171 + if self.isDel or self.owner.isDead then return end
81 172 if self:getCondType() ~= condType then return end
  173 + if self.owner.lock and self.passiveData.effect ~= 3 then return end -- 锁定的只能触发翻开自己格子的固有技
82 174 if self:isActive() then return end
83 175 if self._trigger then
84   - if not self._trigger(params) then return end --检查
  176 + if not self:_trigger(params) then return end --检查
85 177 end
86 178 self.round = self.passiveData.delay --首次
87 179 self.count = self.passiveData.count --次数
88 180 -- 没有延迟就直接触发
89 181 if self.round == 0 then
90   - self:effect()
  182 + self:effect(params.trigger)
91 183 end
92 184 end
93 185  
... ... @@ -102,4 +194,30 @@ function Passive:getDB()
102 194 db.count = self.count
103 195 return db
104 196 end
  197 +
  198 +--默认=0=使用技能,
  199 +function Passive:effect0()
  200 + self.owner:releaseSkill(self.passiveData.effectValue)
  201 +end
  202 +--1=自身获得buff
  203 +function Passive:effect1()
  204 + self.owner:addBuff(self.passiveData.effectValue)
  205 +end
  206 +--2=触发目标获得buff
  207 +function Passive:effect2(trigger)
  208 + if trigger then
  209 + trigger:addBuff(self.passiveData.effectValue)
  210 + end
  211 +end
  212 +--3=翻开自己所在格子,
  213 +function Passive:effect3()
  214 + self.owner.battle.adv:openBlock(self.owner.roomId, self.owner.blockId)
  215 +end
  216 +--4=逃跑
  217 +function Passive:effect4()
  218 + self.owner.isDead = true --跑了
  219 + self.owner.battle.adv:enemyDead(self.owner.roomId,self.owner.blockId, true)
  220 +end
  221 +
  222 +
105 223 return Passive
106 224 \ No newline at end of file
... ...
src/adv/AdvPlayer.lua
... ... @@ -165,12 +165,20 @@ end
165 165 function BaseObject:hurt(value, releaser, params)
166 166 params = params or {}
167 167 if params.hurtType and params.hurtType == 1 then
  168 + releaser:triggerPassive(Passive.SELF_ATK)
  169 + for _, team in ipairs(releaser:getTeam(1, true)) do
  170 + team:triggerPassive(Passive.TEAM_ATK)
  171 + end
168 172 if self:hadBuff(Buff.IMMNUE_ATK) then return end --无视普通攻击
169 173  
170 174 local hit = releaser.hit - self.miss --命中率
171 175 if hit < math.randomInt(1, 100) then --miss
172 176 return
173 177 end
  178 + self:triggerPassive(Passive.SELF_HURT, {trigger = releaser})
  179 + for _, team in ipairs(self:getTeam(1, true)) do
  180 + team:triggerPassive(Passive.TEAM_HURT, {trigger = releaser})
  181 + end
174 182 end
175 183  
176 184 value = self:getInjuredValue(value) --减伤计算
... ... @@ -222,8 +230,17 @@ function BaseObject:hurt(value, releaser, params)
222 230 self.battle.adv:backHpChange(self.id, -value)
223 231 self.hp = math.max(0, self.hp - value)
224 232 if self.hp == 0 then
  233 + self:triggerPassive(Passive.SELF_DEAD)
  234 + for _, team in ipairs(self:getTeam(1, true)) do
  235 + team:triggerPassive(Passive.TEAM_DEAD)
  236 + end
  237 +
225 238 self.isDead = true
226 239 end
  240 + self:triggerPassive(Passive.HURT_PERCENT_SELF, {value = value / self.hpMax})
  241 + for _, team in ipairs(self:getTeam(1, true)) do
  242 + team:triggerPassive(Passive.HURT_PERCENT_TEAM, {value = value / self.hpMax})
  243 + end
227 244 end
228 245 --恢复
229 246 function BaseObject:recover(value, releaser, params)
... ... @@ -317,6 +334,13 @@ function BaseObject:releaseSkill(skillId, skillLevel, target)
317 334 target_:addBuff(buffId, self)
318 335 end
319 336 end
  337 +
  338 + for _, team in ipairs(self:getTeam(2)) do
  339 + team:triggerPassive(Passive.TARGET_SKILL)
  340 + end
  341 + for _, team in ipairs(self:getTeam(1, true)) do
  342 + team:triggerPassive(Passive.TEAM_SKILL)
  343 + end
320 344 end
321 345  
322 346 --0 全部 1 我方 2 敌方
... ... @@ -379,7 +403,10 @@ function BaseObject:getDB()
379 403 end
380 404  
381 405 function BaseObject:triggerPassive(condType, params)
382   -
  406 + if self.isDead then return end
  407 + for _, passive in ipairs(self.passives) do
  408 + passive:trigger(condType, params) --检查触发
  409 + end
383 410 end
384 411  
385 412 local Enemy = class("Enemy", BaseObject)
... ...