Commit 1ffc16b9a1583fccd06df72e83691546a4e1c15d
1 parent
f45d3a7b
冒险 选择点和 建筑
Showing
3 changed files
with
118 additions
and
50 deletions
Show diff stats
src/adv/Adv.lua
... | ... | @@ -538,7 +538,7 @@ local function clickMonster(self, room, block, params) |
538 | 538 | return true |
539 | 539 | end |
540 | 540 | |
541 | -local function chooseCommon(self, room, block, chooseData, choose) | |
541 | +local function chooseCommon(self, room, block, chooseData, choose, tag) | |
542 | 542 | if not chooseData or not chooseData["button".. choose .."cond"] then return end |
543 | 543 | |
544 | 544 | local cond = chooseData["button".. choose .."cond"]:toArray(true, "=") |
... | ... | @@ -589,25 +589,37 @@ local function chooseCommon(self, room, block, chooseData, choose) |
589 | 589 | return true |
590 | 590 | end |
591 | 591 | end, |
592 | - } | |
593 | - assert(not cond[1] or checkCond[cond[1]], "error cond, event_[link]chooseCsv id :" .. block.event.id) | |
592 | + [7] = function() | |
593 | + local buff = self.battle.player:getBuffById(cond[2]) | |
594 | + if buff and buff:getLayer() >= cond[3] then | |
595 | + return true | |
596 | + end | |
597 | + end, | |
598 | + [8] = function() | |
599 | + return self:isHaveArtifact(cond[2]) | |
600 | + end | |
601 | + } | |
602 | + assert(not cond[1] or checkCond[cond[1]], "error cond, event_" .. (tag or "choose") .. "Csv id :" .. block.event.id) | |
594 | 603 | |
595 | 604 | if cond[1] and not checkCond[cond[1]]() then return end |
596 | 605 | local clearBlock = chooseData.keep ~= 1 |
597 | 606 | local effects = chooseData["button".. choose .."effect"]:toTableArray(true) |
598 | 607 | for _, effect in ipairs(effects) do |
599 | - if effect[1] == 1 then | |
600 | - local reward = csvdb["event_dropCsv"][effect[2]]["range"]:randWeight(true) | |
601 | - effect[2] = reward[1] | |
602 | - effect[3] = reward[2] | |
603 | - end | |
604 | - | |
605 | 608 | local doEffect = { |
606 | 609 | [1] = function() -- 获得某道具N个 |
607 | - self:backReward(self:award({[effect[2]] = effect[3]}, {})) | |
610 | + local count = effect[3] or 1 | |
611 | + local reward = {} | |
612 | + for i = 1, count do | |
613 | + local item = csvdb["event_dropCsv"][effect[2]]["range"]:randWeight(true) | |
614 | + reward[item[1]] = (reward[item[1]] or 0) + item[2] | |
615 | + end | |
616 | + self:backReward(self:award(reward, {})) | |
608 | 617 | end, |
609 | 618 | [2] = function() --获得冒险buff |
610 | - self.battle.player:addBuff(effect[2]) | |
619 | + local layer = effect[3] or 1 | |
620 | + for i = 1, layer do | |
621 | + self.battle.player:addBuff(effect[2]) | |
622 | + end | |
611 | 623 | end, |
612 | 624 | [3] = function() --发现怪物 |
613 | 625 | self:getCurMap():addNewMonsterRand(effect[2], {room, block}) |
... | ... | @@ -615,25 +627,74 @@ local function chooseCommon(self, room, block, chooseData, choose) |
615 | 627 | end, |
616 | 628 | [4] = function() --无事发生 |
617 | 629 | end, |
630 | + [5] = function() --5=属性枚举=数值;直接增加玩家属性 | |
631 | + local attr | |
632 | + if effect[3] == 0 then | |
633 | + attr = "sp" | |
634 | + else | |
635 | + attr = AttsEnumEx[effect[3]] | |
636 | + if not AdvAttsEnum[attr] then return end | |
637 | + end | |
638 | + self.battle.player:addBaseAttr(attr, effect[4], effect[2]) | |
639 | + end, | |
640 | + [6] = function() -- 商店 | |
641 | + block:updateEvent({ | |
642 | + etype = AdvEventType.Trader, | |
643 | + id = effect[2] | |
644 | + }) | |
645 | + block:randomEvent() | |
646 | + clearBlock = false | |
647 | + end, | |
648 | + [7] = function() -- 建筑 | |
649 | + block:updateEvent({ | |
650 | + etype = AdvEventType.Build, | |
651 | + id = effect[2] | |
652 | + }) | |
653 | + block:randomEvent() | |
654 | + clearBlock = false | |
655 | + end, | |
656 | + [8] = function() -- 选择 | |
657 | + block:updateEvent({ | |
658 | + etype = AdvEventType.Choose, | |
659 | + id = effect[2] | |
660 | + }) | |
661 | + block:randomEvent() | |
662 | + clearBlock = false | |
663 | + end, | |
664 | + [9] = function() -- click | |
665 | + block:updateEvent({ | |
666 | + etype = AdvEventType.Click, | |
667 | + id = effect[2] | |
668 | + }) | |
669 | + block:randomEvent() | |
670 | + clearBlock = false | |
671 | + end, | |
672 | + [10] = function() -- 陷阱 | |
673 | + block:updateEvent({ | |
674 | + etype = AdvEventType.Trap, | |
675 | + id = effect[2] | |
676 | + }) | |
677 | + block:randomEvent() | |
678 | + clearBlock = false | |
679 | + end, | |
618 | 680 | [11] = function() -- 获得神器 |
619 | 681 | self:waitChooseArtifact() --等待获取神器 |
620 | 682 | end |
621 | 683 | } |
622 | - assert(doEffect[effect[1]], "error effect, event_[link]chooseCsv id :" .. block.event.id) | |
684 | + assert(doEffect[effect[1]], "error effect, event_" .. (tag or "choose") .. "Csv id :" .. block.event.id) | |
623 | 685 | doEffect[effect[1]]() |
624 | 686 | end |
625 | - self:checkTask(Adv.TaskType.Choose, 1, block.event.id) | |
626 | - self:checkAchievement(Adv.AchievType.Choose, 1, block.event.id) | |
627 | - self:checkAdvUnlock(3, block.event.id) | |
628 | 687 | return true, clearBlock |
629 | 688 | end |
630 | 689 | |
631 | 690 | local function clickChoose(self, room, block, params) |
632 | 691 | local choose = params.choose |
633 | 692 | local chooseData = csvdb["event_chooseCsv"][block.event.id] |
634 | - local status, clearBlock = chooseCommon(self, room, block, chooseData, choose) | |
693 | + local status, clearBlock = chooseCommon(self, room, block, chooseData, choose, "choose") | |
635 | 694 | if not status then return end |
636 | - | |
695 | + self:checkAdvUnlock(3, block.event.id) | |
696 | + self:checkTask(Adv.TaskType.Choose, 1, block.event.id) | |
697 | + self:checkAchievement(Adv.AchievType.Choose, 1, block.event.id) | |
637 | 698 | if clearBlock then |
638 | 699 | block:clear() |
639 | 700 | end |
... | ... | @@ -643,7 +704,7 @@ end |
643 | 704 | local function clickLinkChoose(self, room, block, params) |
644 | 705 | local choose = params.choose |
645 | 706 | local chooseData = csvdb["event_linkchooseCsv"][block.event.id] |
646 | - local status, clearBlock = chooseCommon(self, room, block, chooseData, choose) | |
707 | + local status, clearBlock = chooseCommon(self, room, block, chooseData, choose, "link") | |
647 | 708 | if not status then return end |
648 | 709 | |
649 | 710 | -- 完成统计次数 |
... | ... | @@ -694,31 +755,14 @@ local function clickTrader(self, room, block, params) |
694 | 755 | end |
695 | 756 | |
696 | 757 | local function clickBuild(self, room, block, params) |
697 | - local buildData = csvdb["event_buildingCsv"][block.event.id] | |
698 | - if not buildData then return end-- 偷偷改表了 | |
699 | - if not block.event.effect then return end -- 没有效果 气人不 | |
700 | - local clearBlock = true | |
701 | - local effect = block.event.effect | |
702 | - --todo 效果生效 | |
703 | - local doEffect = { | |
704 | - [1] = function() -- 获得某道具N个 | |
705 | - self:backReward(self:award({[effect[2]] = effect[3]}, {})) | |
706 | - end, | |
707 | - [2] = function() --获得冒险buff | |
708 | - self.battle.player:addBuff(effect[2]) | |
709 | - end, | |
710 | - [3] = function() --发现怪物 | |
711 | - self:getCurMap():addNewMonsterRand(effect[2], {room, block}) | |
712 | - clearBlock = false | |
713 | - end, | |
714 | - [4] = function() --无事发生 | |
715 | - end | |
716 | - } | |
717 | - assert(doEffect[effect[1]], "error effect, event_buildingCsv id :" .. block.event.id) | |
718 | - if not self:cost(buildData.required:toNumMap(), {}) then return end | |
719 | - doEffect[effect[1]]() | |
758 | + local choose = params.choose | |
759 | + local chooseData = csvdb["event_buildingCsv"][block.event.id] | |
760 | + local status, clearBlock = chooseCommon(self, room, block, chooseData, choose, "build") | |
761 | + if not status then return end | |
762 | + | |
720 | 763 | self:checkTask(Adv.TaskType.Build, 1, block.event.id) |
721 | 764 | self:checkAchievement(Adv.AchievType.Build, 1, block.event.id) |
765 | + | |
722 | 766 | if clearBlock then |
723 | 767 | block:clear() |
724 | 768 | end | ... | ... |
src/adv/AdvBuff.lua
... | ... | @@ -247,7 +247,7 @@ local BuffFactory = { |
247 | 247 | |
248 | 248 | [Buff.CLEAR_BUFF] = function(_Buff) |
249 | 249 | _Buff._init = function(self, data) |
250 | - for _, buff in ipairs(self.buffs) do -- 挂上就清除一下子 | |
250 | + for _, buff in ipairs(self.owner.buffs) do -- 挂上就清除一下子 | |
251 | 251 | if not buff.isDel and self:canEffect(buff.id) and not self.isDel then |
252 | 252 | if not buff.isDel and not self.isDel then |
253 | 253 | self:effect() |
... | ... | @@ -629,6 +629,10 @@ function Buff:doEffectChange(effect) |
629 | 629 | return effect * (1 + change) |
630 | 630 | end |
631 | 631 | |
632 | +function Buff:getLayer() | |
633 | + return self.layer | |
634 | +end | |
635 | + | |
632 | 636 | function Buff:getDB() |
633 | 637 | local db = {} |
634 | 638 | if self._getDB then | ... | ... |
src/adv/AdvPlayer.lua
... | ... | @@ -575,19 +575,39 @@ function Player:addExp(value) |
575 | 575 | local delta = level - self.level |
576 | 576 | if delta > 0 then |
577 | 577 | for attr, _ in pairs(AdvAttsEnum) do |
578 | - if attr == "hp" then | |
579 | - self[attr] = self[attr] + self.growth[attr] * delta | |
580 | - self._hpMax = self._hpMax + self.growth[attr] * delta | |
581 | - self:reSetHpMax() | |
582 | - else | |
583 | - self["_" .. attr] = self["_" .. attr] + self.growth[attr] * delta | |
584 | - self:reSetAttr(attr) | |
585 | - end | |
578 | + self:addBaseAttr(attr, self.growth[attr] * delta) | |
586 | 579 | end |
587 | 580 | end |
588 | 581 | self.level = level |
589 | 582 | self.exp = newExp |
590 | 583 | end |
584 | +--vtype 0/1 值/% | |
585 | +function Player:addBaseAttr(attr, value, vtype) | |
586 | + local attrName = attr | |
587 | + if attr == "hp" then | |
588 | + attrName = "hpMax" | |
589 | + elseif attr = "sp" then | |
590 | + attrName = "spMax" | |
591 | + end | |
592 | + local baseName = "_" .. attrName | |
593 | + if not self[baseName] then return end | |
594 | + local oldV = self[baseName] | |
595 | + | |
596 | + local change = value | |
597 | + if vtype == 1 then | |
598 | + change = oldV * value / 100 | |
599 | + end | |
600 | + self[baseName] = self[baseName] + change | |
601 | + if attr == "hp" then | |
602 | + self.hp = self.hp + change | |
603 | + self:reSetHpMax() | |
604 | + elseif attr == "sp" then | |
605 | + self.sp = self.sp + change | |
606 | + self:reSetSpMax() | |
607 | + else | |
608 | + self:reSetAttr(attr) | |
609 | + end | |
610 | +end | |
591 | 611 | |
592 | 612 | --cType 0 or nil 值 1 百分比 |
593 | 613 | function Player:changeSp(value, cType) | ... | ... |