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) | ... | ... |