Commit 84193e7ad4009956de353b45704aaee48c3f48fb
Merge branch 'cn/develop' into cn/publish/release
Showing
9 changed files
with
673 additions
and
21 deletions
Show diff stats
src/GlobalVar.lua
src/ProtocolCode.lua
@@ -270,6 +270,12 @@ actionCodes = { | @@ -270,6 +270,12 @@ actionCodes = { | ||
270 | Activity_actNewUserTaskRpc = 674, | 270 | Activity_actNewUserTaskRpc = 674, |
271 | Activity_buyBattleTicketRpc = 675, | 271 | Activity_buyBattleTicketRpc = 675, |
272 | Activity_resetGachakonRpc = 676, --狩猎祭,重制扭蛋机 | 272 | Activity_resetGachakonRpc = 676, --狩猎祭,重制扭蛋机 |
273 | + Activity_startRegularWorldBossBattleRpc = 677, | ||
274 | + Activity_endRegularWorldBossBattleRpc = 678, | ||
275 | + Activity_regularWorldBossRewardRpc = 679, | ||
276 | + Activity_buyWorldBossBattleTicketRpc = 680, | ||
277 | + Activity_regularWorldBossMilestoneRpc = 681, | ||
278 | + | ||
273 | 279 | ||
274 | Radio_startQuestRpc = 700, | 280 | Radio_startQuestRpc = 700, |
275 | Radio_finishQuestRpc = 701, | 281 | Radio_finishQuestRpc = 701, |
src/RedisKeys.lua
@@ -22,6 +22,7 @@ RANK_COMMON = "rank:common:" | @@ -22,6 +22,7 @@ RANK_COMMON = "rank:common:" | ||
22 | RANK_TYPE = { | 22 | RANK_TYPE = { |
23 | ActBattleBoss = "act_battle_boss", | 23 | ActBattleBoss = "act_battle_boss", |
24 | ActCrisis = "crisis", | 24 | ActCrisis = "crisis", |
25 | + RegularWorldBoos = "regular_world_boss" | ||
25 | } | 26 | } |
26 | 27 | ||
27 | -- rank | 28 | -- rank |
src/actions/ActivityAction.lua
@@ -918,6 +918,7 @@ function _M.battleRankRpc(agent, data) | @@ -918,6 +918,7 @@ function _M.battleRankRpc(agent, data) | ||
918 | local actTypeToRank = { | 918 | local actTypeToRank = { |
919 | [role.activity.ActivityType.ChallengeLevel] = RANK_TYPE.ActBattleBoss, | 919 | [role.activity.ActivityType.ChallengeLevel] = RANK_TYPE.ActBattleBoss, |
920 | [role.activity.ActivityType.Crisis] = RANK_TYPE.ActCrisis, | 920 | [role.activity.ActivityType.Crisis] = RANK_TYPE.ActCrisis, |
921 | + [role.activity.ActivityType.RegularWorldBoos] = RANK_TYPE.RegularWorldBoos, | ||
921 | } | 922 | } |
922 | if not actTypeToRank[cfg.showType] then return end | 923 | if not actTypeToRank[cfg.showType] then return end |
923 | local rankInfo = role:getRankInfoCommon(actTypeToRank[cfg.showType]) | 924 | local rankInfo = role:getRankInfoCommon(actTypeToRank[cfg.showType]) |
@@ -1186,7 +1187,7 @@ function _M.friendHelpRpc(agent, data) | @@ -1186,7 +1187,7 @@ function _M.friendHelpRpc(agent, data) | ||
1186 | cmd1 = 2 | 1187 | cmd1 = 2 |
1187 | end | 1188 | end |
1188 | 1189 | ||
1189 | - if members[friendId] and not getAE[friendId] and limit <= getLimit then | 1190 | + if members[friendId] and not getAE[friendId] and limit < getLimit then |
1190 | cmd2 = 1 | 1191 | cmd2 = 1 |
1191 | limit = limit + 1 | 1192 | limit = limit + 1 |
1192 | getAE[friendId] = 1 | 1193 | getAE[friendId] = 1 |
@@ -1541,4 +1542,457 @@ function _M.buyBattleTicketRpc(agent, data) | @@ -1541,4 +1542,457 @@ function _M.buyBattleTicketRpc(agent, data) | ||
1541 | return true | 1542 | return true |
1542 | end | 1543 | end |
1543 | 1544 | ||
1545 | + | ||
1546 | +-- 常规世界boss | ||
1547 | +function _M.startRegularWorldBossBattleRpc(agent, data) | ||
1548 | + local role = agent.role | ||
1549 | + local msg = MsgPack.unpack(data) | ||
1550 | + local actid = msg.actid | ||
1551 | + local id = msg.id | ||
1552 | + local count = msg.count | ||
1553 | + | ||
1554 | + local actCfg = csvdb["activity_battleCsv"][actid] | ||
1555 | + if not actCfg then return 2 end | ||
1556 | + | ||
1557 | + local battleCfg = actCfg[id] | ||
1558 | + if not battleCfg then return 3 end | ||
1559 | + | ||
1560 | + local actData = role.activity:getActData("RegularWorldBoos") or {} | ||
1561 | + | ||
1562 | + local preArr = battleCfg.prepose:toArray(true, "=") | ||
1563 | + for _, v in ipairs(preArr) do | ||
1564 | + local battleInfo = actData[v] | ||
1565 | + if not battleInfo then | ||
1566 | + return 4 | ||
1567 | + end | ||
1568 | + local star = battleInfo["star"] or 0 | ||
1569 | + if star <= 0 then | ||
1570 | + return 4 | ||
1571 | + end | ||
1572 | + end | ||
1573 | + -- check cost | ||
1574 | + local changeFlag = false | ||
1575 | + local ticket = actData["ticket"] | ||
1576 | + local num = 0 -- cost num | ||
1577 | + if battleCfg.type ~= "" then | ||
1578 | + role.activity:getRegularWorldBossTicket(actid) | ||
1579 | + num = battleCfg.type:toArray(true, "=")[3] | ||
1580 | + if count and count > 0 then | ||
1581 | + if battleCfg.rank ~= 0 then | ||
1582 | + local bi = actData[id] | ||
1583 | + if not bi then return 8 end | ||
1584 | + local star = bi["star"] or 0 | ||
1585 | + local maxP = bi["maxP"] or 0 | ||
1586 | + -- 世界boss | ||
1587 | + if battleCfg.worldBoss_award ~= 0 then | ||
1588 | + if maxP < 1 then | ||
1589 | + return 9 | ||
1590 | + end | ||
1591 | + else | ||
1592 | + if star < 1 then | ||
1593 | + return 9 | ||
1594 | + end | ||
1595 | + end | ||
1596 | + end | ||
1597 | + num = num * count | ||
1598 | + else | ||
1599 | + num = 0 | ||
1600 | + end | ||
1601 | + if ticket < num then | ||
1602 | + return 6 | ||
1603 | + end | ||
1604 | + changeFlag = true | ||
1605 | + end | ||
1606 | + -- 解锁活动剧情 | ||
1607 | + role:checkStoryStatus(false, 5, id) | ||
1608 | + | ||
1609 | + if not count then | ||
1610 | + role.__regularWorldBossBattleCache = { | ||
1611 | + key = tostring(math.random()), | ||
1612 | + actid = actid, | ||
1613 | + id = id, | ||
1614 | + format = msg.format, | ||
1615 | + } | ||
1616 | + SendPacket(actionCodes.Activity_startRegularWorldBossBattleRpc, MsgPack.pack({key = role.__regularWorldBossBattleCache.key})) | ||
1617 | + else | ||
1618 | + if count <= 0 then | ||
1619 | + return | ||
1620 | + end | ||
1621 | + | ||
1622 | + local bi = actData[id] | ||
1623 | + local star = bi["star"] or 0 | ||
1624 | + local award = battleCfg.item_clear:toNumMap() | ||
1625 | + | ||
1626 | + if battleCfg.rank ~= 0 then | ||
1627 | + if getStarCount(battleCfg, star) == 3 then | ||
1628 | + local aw = battleCfg.perfect_reward:toNumMap() | ||
1629 | + for k, v in pairs(aw) do | ||
1630 | + award[k] = (award[k] or 0) + v | ||
1631 | + end | ||
1632 | + end | ||
1633 | + end | ||
1634 | + for k, v in pairs(award) do | ||
1635 | + award[k] = v * count | ||
1636 | + end | ||
1637 | + local reward, change = role:award(award, {log = {desc = "regularWorldBossBattle", int1 = actid, int2 = count or 0}}) | ||
1638 | + | ||
1639 | + changeFlag = true | ||
1640 | + actData["ticket"] = ticket - num | ||
1641 | + | ||
1642 | + if battleCfg.rank ~= 0 then | ||
1643 | + if battleCfg.worldBoss_award ~= 0 and (bi["maxP"] or 0) > 0 then | ||
1644 | + bi["bossP"] = (bi["bossP"] or 0) + bi["maxP"] * count | ||
1645 | + end | ||
1646 | + | ||
1647 | + bi["sum"] = bi["sum"] + bi["top"] * count | ||
1648 | + actData[id] = bi | ||
1649 | + | ||
1650 | + local rankVal = 0 | ||
1651 | + if battleCfg.rank == 1 then | ||
1652 | + rankVal = bi["sum"] | ||
1653 | + elseif battleCfg.rank == 2 then | ||
1654 | + rankVal = bi["top"] | ||
1655 | + end | ||
1656 | + role:updateRankCommon(RANK_TYPE.RegularWorldBoos, rankVal) | ||
1657 | + end | ||
1658 | + role.activity:updateActData("RegularWorldBoos", actData) | ||
1659 | + | ||
1660 | + SendPacket(actionCodes.Activity_startRegularWorldBossBattleRpc, MsgPack.pack(role:packReward(reward, change))) | ||
1661 | + | ||
1662 | + return true | ||
1663 | + end | ||
1664 | + | ||
1665 | + return true | ||
1666 | +end | ||
1667 | + | ||
1668 | +function _M.endRegularWorldBossBattleRpc(agent, data) | ||
1669 | + local role = agent.role | ||
1670 | + local msg = MsgPack.unpack(data) | ||
1671 | + local actid = msg.actid | ||
1672 | + local id = msg.id | ||
1673 | + local key = msg.key | ||
1674 | + local isWin = msg.isWin | ||
1675 | + local heros = msg.heros | ||
1676 | + local support = msg.support | ||
1677 | + if not role.activity:isOpenById(actid, "RegularWorldBoos") then | ||
1678 | + SendPacket(actionCodes.Activity_endRegularWorldBossBattleRpc, MsgPack.pack({})) | ||
1679 | + return true | ||
1680 | + end | ||
1681 | + | ||
1682 | + if not role.__regularWorldBossBattleCache then return 2 end | ||
1683 | + | ||
1684 | + if role.__regularWorldBossBattleCache.id ~= id or role.__regularWorldBossBattleCache.key ~= key and role.__regularWorldBossBattleCache.actid ~= actid then | ||
1685 | + SendPacket(actionCodes.Activity_endRegularWorldBossBattleRpc, MsgPack.pack({errorCode = 1})) | ||
1686 | + end | ||
1687 | + | ||
1688 | + -- 防作弊 | ||
1689 | + if not role:checkBattleCheat("act_battle", { | ||
1690 | + id = id, | ||
1691 | + isWin = isWin, | ||
1692 | + info = msg.info, | ||
1693 | + format = role.__regularWorldBossBattleCache.format | ||
1694 | + }) then | ||
1695 | + SendPacket(actionCodes.Activity_endRegularWorldBossBattleRpc, MsgPack.pack({errorCode = 1})) | ||
1696 | + return true | ||
1697 | + end | ||
1698 | + role.__regularWorldBossBattleCache = nil | ||
1699 | + | ||
1700 | + local actCfg = csvdb["activity_battleCsv"][actid] | ||
1701 | + if not actCfg then return 3 end | ||
1702 | + | ||
1703 | + local battleCfg = actCfg[id] | ||
1704 | + if not battleCfg then return 4 end | ||
1705 | + | ||
1706 | + local actData = role.activity:getActData("RegularWorldBoos") or {} | ||
1707 | + | ||
1708 | + -- 总输出 | ||
1709 | + local dmg = 0 | ||
1710 | + for k, v in pairs(msg.info.damage) do | ||
1711 | + if k % 100 == 2 then | ||
1712 | + dmg = dmg + v | ||
1713 | + end | ||
1714 | + end | ||
1715 | + | ||
1716 | + local reward, change = {}, nil | ||
1717 | + | ||
1718 | + local battleInfo = actData[id] or {} | ||
1719 | + local curStar = 0 | ||
1720 | + if isWin then | ||
1721 | + local herosInfo = msg.heros | ||
1722 | + | ||
1723 | + local check = {} | ||
1724 | + -- 1 通关 | ||
1725 | + check[1] = function(_) | ||
1726 | + return true | ||
1727 | + end | ||
1728 | + -- 2 阵亡人数 <= N | ||
1729 | + check[2] = function(_, cond) | ||
1730 | + return msg.info.dead and msg.info.dead <= cond | ||
1731 | + end | ||
1732 | + -- 3 全员存活 | ||
1733 | + check[3] = function(_) | ||
1734 | + return msg.info.dead and msg.info.dead == 0 | ||
1735 | + end | ||
1736 | + -- 4 指定种族 >= N | ||
1737 | + check[4] = function(_, cond) | ||
1738 | + local count = 0 | ||
1739 | + for _, one in pairs(herosInfo) do | ||
1740 | + local heroData = csvdb["unitCsv"][one.type] | ||
1741 | + if heroData.camp == cond then | ||
1742 | + count = count + 1 | ||
1743 | + end | ||
1744 | + end | ||
1745 | + return count >= cond | ||
1746 | + end | ||
1747 | + -- 5 指定职业 >= N | ||
1748 | + check[5] = function(_, cond) | ||
1749 | + local count = 0 | ||
1750 | + for _, one in pairs(herosInfo) do | ||
1751 | + local heroData = csvdb["unitCsv"][one.type] | ||
1752 | + if heroData.job == cond then | ||
1753 | + count = count + 1 | ||
1754 | + end | ||
1755 | + end | ||
1756 | + return count >= cond | ||
1757 | + end | ||
1758 | + -- 6 含有指定角色 | ||
1759 | + check[6] = function(_, cond) | ||
1760 | + for _, one in pairs(herosInfo) do | ||
1761 | + if one.type == cond then | ||
1762 | + return true | ||
1763 | + end | ||
1764 | + end | ||
1765 | + return false | ||
1766 | + end | ||
1767 | + -- 7 通关耗时 <= X 秒 msg.info.atime | ||
1768 | + check[7] = function(_, cond) | ||
1769 | + return msg.info.atime and msg.info.atime <= cond | ||
1770 | + end | ||
1771 | + -- 8 总输出值 msg.info.atime | ||
1772 | + check[8] = function(_, cond) | ||
1773 | + return dmg >= cond | ||
1774 | + end | ||
1775 | + curStar = 0 | ||
1776 | + local sweepConds = battleCfg.sweep_condition:toTableArray(true) | ||
1777 | + for i, cond in ipairs(sweepConds) do | ||
1778 | + if check[cond[1]] and check[cond[1]](table.unpack(cond)) then | ||
1779 | + curStar = curStar + (1 << (i - 1)) | ||
1780 | + end | ||
1781 | + end | ||
1782 | + | ||
1783 | + role:checkTaskEnter("ActBattlePass", {chapterId = id}) | ||
1784 | + else | ||
1785 | + curStar = 0 | ||
1786 | + if battleCfg.rank ~= 0 then | ||
1787 | + curStar = 1 | ||
1788 | + end | ||
1789 | + end | ||
1790 | + local oldStarNum = getStarCount(battleCfg, battleInfo["star"] or 0) | ||
1791 | + local newStarNum = getStarCount(battleCfg, curStar) | ||
1792 | + if newStarNum > oldStarNum then | ||
1793 | + battleInfo["star"] = curStar | ||
1794 | + end | ||
1795 | + | ||
1796 | + if battleCfg.rank ~= 0 and isWin then | ||
1797 | + if battleCfg.type ~= "" then | ||
1798 | + -- 消耗门票 | ||
1799 | + role.activity:getRegularWorldBossTicket(actid) | ||
1800 | + local num = battleCfg.type:toArray(true, "=")[3] | ||
1801 | + actData["ticket"] = math.max(actData["ticket"] - num, 0) | ||
1802 | + end | ||
1803 | + | ||
1804 | + -- 更新排行榜 最高伤害 | ||
1805 | + battleInfo["top"] = math.max(battleInfo["top"] or 0, dmg) | ||
1806 | + battleInfo["sum"] = (battleInfo["sum"] or 0) + dmg | ||
1807 | + local rankVal = 0 | ||
1808 | + if battleCfg.rank == 1 then | ||
1809 | + rankVal = battleInfo["sum"] | ||
1810 | + elseif battleCfg.rank == 2 then | ||
1811 | + rankVal = battleInfo["top"] | ||
1812 | + end | ||
1813 | + if rankVal > 0 then | ||
1814 | + role:updateRankCommon(RANK_TYPE.RegularWorldBoos, rankVal) | ||
1815 | + end | ||
1816 | + end | ||
1817 | + | ||
1818 | + if (oldStarNum == 0 and newStarNum > 0) or battleCfg.rank ~= 0 then | ||
1819 | + reward = battleCfg.item_clear:toNumMap() | ||
1820 | + end | ||
1821 | + if (oldStarNum < 3 and newStarNum == 3) or (battleCfg.rank ~= 0 and newStarNum == 3) then | ||
1822 | + local aw = battleCfg.perfect_reward:toNumMap() | ||
1823 | + for k, v in pairs(aw) do | ||
1824 | + reward[k] = (reward[k] or 0) + v | ||
1825 | + end | ||
1826 | + end | ||
1827 | + | ||
1828 | + role:checkBattle("act_battle", { | ||
1829 | + cfg = battleCfg, | ||
1830 | + star = newStarNum, | ||
1831 | + isWin = isWin, | ||
1832 | + info = msg.info, | ||
1833 | + reward = reward, | ||
1834 | + heros = heros, | ||
1835 | + supports = support, | ||
1836 | + }) | ||
1837 | + | ||
1838 | + -- 解锁活动剧情 | ||
1839 | + if newStarNum >= 3 then | ||
1840 | + role:checkStoryStatus(false, 5, id) | ||
1841 | + end | ||
1842 | + | ||
1843 | + if battleCfg.worldBoss_award ~= 0 and msg.point then | ||
1844 | + battleInfo["bossP"] = (battleInfo["bossP"] or 0) + msg.point | ||
1845 | + battleInfo["maxP"] = math.max(msg.point, (battleInfo["maxP"] or 0)) | ||
1846 | + end | ||
1847 | + actData[id] = battleInfo | ||
1848 | + role.activity:updateActData("RegularWorldBoos", actData) | ||
1849 | + | ||
1850 | + reward, change = role:award(reward, {log = {desc = "actBattle", int1 = actid, int2 = newStarNum}}) | ||
1851 | + | ||
1852 | + SendPacket(actionCodes.Activity_endRegularWorldBossBattleRpc, MsgPack.pack({ | ||
1853 | + reward = reward, | ||
1854 | + change = change | ||
1855 | + })) | ||
1856 | + | ||
1857 | + return true | ||
1858 | +end | ||
1859 | + | ||
1860 | +function _M.regularWorldBossRewardRpc(agent, data) | ||
1861 | + local role = agent.role | ||
1862 | + local msg = MsgPack.unpack(data) | ||
1863 | + local actid = msg.actid | ||
1864 | + local id = msg.id | ||
1865 | + local index = msg.index | ||
1866 | + | ||
1867 | + if not role.activity:isOpenById(actid, "RegularWorldBoos") then return 1 end | ||
1868 | + | ||
1869 | + local actCfg = csvdb["activity_battleCsv"][actid] | ||
1870 | + if not actCfg then return 2 end | ||
1871 | + | ||
1872 | + local battleCfg = actCfg[id] | ||
1873 | + if not battleCfg then return 3 end | ||
1874 | + | ||
1875 | + if battleCfg.worldBoss_award == 0 then return 4 end | ||
1876 | + | ||
1877 | + actCfg = csvdb["activity_wordboss_awardCsv"][battleCfg.worldBoss_award] | ||
1878 | + if not actCfg then return 5 end | ||
1879 | + local awardCfg = actCfg[index] | ||
1880 | + if not awardCfg then return 6 end | ||
1881 | + | ||
1882 | + local totalAwardCnt = #actCfg | ||
1883 | + local preList = awardCfg.condition1:toArray(true, "=") | ||
1884 | + | ||
1885 | + local actData = role.activity:getActData("RegularWorldBoos") or {} | ||
1886 | + local battleInfo = actData[id] or {} | ||
1887 | + local bossPoint = battleInfo["bossP"] or 0 | ||
1888 | + if bossPoint < 1 then return 7 end | ||
1889 | + | ||
1890 | + local bossRecord = battleInfo["bossR"] or "" | ||
1891 | + local r = string.char(string.getbit(bossRecord, index)) | ||
1892 | + if r == "1" then | ||
1893 | + return 9 | ||
1894 | + end | ||
1895 | + local ok = false | ||
1896 | + if #preList == 0 then | ||
1897 | + ok = true | ||
1898 | + else | ||
1899 | + for _, i in ipairs(preList) do | ||
1900 | + local flag = string.char(string.getbit(bossRecord, i)) | ||
1901 | + if flag == "1" then | ||
1902 | + ok = true | ||
1903 | + break | ||
1904 | + end | ||
1905 | + end | ||
1906 | + end | ||
1907 | + if not ok then return 8 end | ||
1908 | + | ||
1909 | + battleInfo["bossR"] = string.setbit(bossRecord, index) | ||
1910 | + local allFinish = true | ||
1911 | + for i = 1, totalAwardCnt do | ||
1912 | + if string.char(string.getbit(battleInfo["bossR"], i)) == "0" then | ||
1913 | + allFinish = false | ||
1914 | + break | ||
1915 | + end | ||
1916 | + end | ||
1917 | + if allFinish then | ||
1918 | + battleInfo["bossR"] = "" | ||
1919 | + end | ||
1920 | + battleInfo["bossP"] = bossPoint - 1 | ||
1921 | + actData[id] = battleInfo | ||
1922 | + role.activity:updateActData("RegularWorldBoos", actData) | ||
1923 | + | ||
1924 | + local award = awardCfg.reward:toNumMap() | ||
1925 | + local reward, change = role:award(award, {log = {desc = "regularWorldBossReward", int1 = actid, int2 = index}}) | ||
1926 | + SendPacket(actionCodes.Activity_regularWorldBossRewardRpc, MsgPack.pack(role:packReward(reward, change))) | ||
1927 | + return true | ||
1928 | +end | ||
1929 | + | ||
1930 | +function _M.buyWorldBossBattleTicketRpc(agent, data) | ||
1931 | + local role = agent.role | ||
1932 | + local msg = MsgPack.unpack(data) | ||
1933 | + local actid = msg.actid | ||
1934 | + local id = msg.id | ||
1935 | + local count = msg.count | ||
1936 | + if not role.activity:isOpenById(actid, "RegularWorldBoos") then return 1 end | ||
1937 | + role.activity:getRegularWorldBossTicket(actid) | ||
1938 | + local actData = role.activity:getActData("RegularWorldBoos") or {} | ||
1939 | + local battleInfo = actData[id] or {} | ||
1940 | + --["activity_scrofa_tickets"] = { 10, 20, 30, 40, 50, 100, 150, 200, 200, 200 } | ||
1941 | + --TODO | ||
1942 | + local limit = #(globalCsv.activity_scrofa_tickets) | ||
1943 | + local curCount = actData["buyC"] or 0 | ||
1944 | + if count <= 0 or curCount + count > limit then | ||
1945 | + return 2 | ||
1946 | + end | ||
1947 | + local cost = globalCsv.activity_scrofa_tickets[curCount + 1] | ||
1948 | + if not role:checkItemEnough({[ItemId.Jade] = cost}) then return 3 end | ||
1949 | + role:costItems({[ItemId.Jade] = cost}, {log = {desc = "buyRegularWorldBossTicket", int1 = actid, int2 = count, long1 = curCount}}) | ||
1950 | + actData["ticket"] = (actData["ticket"] or 0) + 1 | ||
1951 | + actData["buyC"] = curCount + count | ||
1952 | + | ||
1953 | + role.activity:updateActData("RegularWorldBoos", actData) | ||
1954 | + SendPacket(actionCodes.Activity_buyWorldBossBattleTicketRpc, "") | ||
1955 | + return true | ||
1956 | +end | ||
1957 | + | ||
1958 | +function _M.regularWorldBossMilestoneRpc(agent, data) | ||
1959 | + local role = agent.role | ||
1960 | + local msg = MsgPack.unpack(data) | ||
1961 | + local actid = msg.actid | ||
1962 | + local id = msg.id | ||
1963 | + local index = msg.index | ||
1964 | + | ||
1965 | + if not role.activity:isOpenById(actid, "RegularWorldBoos") then return 1 end | ||
1966 | + | ||
1967 | + local actCfg = csvdb["activity_mileageCsv"][actid] | ||
1968 | + if not actCfg then return 3 end | ||
1969 | + | ||
1970 | + local mileCfg = actCfg[index] | ||
1971 | + if not mileCfg then return 4 end | ||
1972 | + | ||
1973 | + local actData = role.activity:getActData("RegularWorldBoos") or {} | ||
1974 | + local battleInfo = actData[id] or {} | ||
1975 | + local val = 0 | ||
1976 | + if mileCfg.type == 1 then | ||
1977 | + val = battleInfo["sum"] or 0 | ||
1978 | + elseif mileCfg.type == 2 then | ||
1979 | + val = battleInfo["top"] or 0 | ||
1980 | + end | ||
1981 | + | ||
1982 | + local record = battleInfo["r"] or "" | ||
1983 | + local flag = string.char(string.getbit(record, index)) | ||
1984 | + if flag == "1" then return 5 end | ||
1985 | + if mileCfg.condition > val then return 6 end | ||
1986 | + | ||
1987 | + battleInfo["r"] = string.setbit(record, index) | ||
1988 | + actData[id] = battleInfo | ||
1989 | + role.activity:updateActData("RegularWorldBoos", actData) | ||
1990 | + | ||
1991 | + local award = mileCfg.reward:toNumMap() | ||
1992 | + local reward, change = role:award(award, {log = {desc = "regularWorldBossMilestone", int1 = actid, int2 = index}}) | ||
1993 | + SendPacket(actionCodes.Activity_regularWorldBossMilestoneRpc, MsgPack.pack(role:packReward(reward, change))) | ||
1994 | + | ||
1995 | + return true | ||
1996 | +end | ||
1997 | + | ||
1544 | return _M | 1998 | return _M |
src/models/Activity.lua
@@ -40,6 +40,8 @@ Activity.ActivityType = { | @@ -40,6 +40,8 @@ Activity.ActivityType = { | ||
40 | 40 | ||
41 | BattleCommandTask = 38, -- 战令任务活动 | 41 | BattleCommandTask = 38, -- 战令任务活动 |
42 | NewUserTask = 41, -- 新用户任务 | 42 | NewUserTask = 41, -- 新用户任务 |
43 | + RegularWorldBoos = 42, -- 常规世界boos | ||
44 | + RadioTask = 43, -- 活动电台任务 | ||
43 | } | 45 | } |
44 | 46 | ||
45 | local function checkActivityType(activityType) | 47 | local function checkActivityType(activityType) |
@@ -93,6 +95,7 @@ Activity.schema = { | @@ -93,6 +95,7 @@ Activity.schema = { | ||
93 | 95 | ||
94 | act34 = {"table", {}}, -- 战令记录{unlock = 1, freeR = "", payR = "", lvl = 10, sum = 100} | 96 | act34 = {"table", {}}, -- 战令记录{unlock = 1, freeR = "", payR = "", lvl = 10, sum = 100} |
95 | act36 = {"table", {}}, -- 每日活跃签到 {0=day, 1=1,2=1,3=1} | 97 | act36 = {"table", {}}, -- 每日活跃签到 {0=day, 1=1,2=1,3=1} |
98 | + act42 = {"table", {}}, -- | ||
96 | 99 | ||
97 | reset20 = {"number", 1}, -- 重置扭蛋机 | 100 | reset20 = {"number", 1}, -- 重置扭蛋机 |
98 | } | 101 | } |
@@ -123,6 +126,7 @@ function Activity:data() | @@ -123,6 +126,7 @@ function Activity:data() | ||
123 | 126 | ||
124 | act34 = self:getProperty("act34"), | 127 | act34 = self:getProperty("act34"), |
125 | act36 = self:getProperty("act36"), | 128 | act36 = self:getProperty("act36"), |
129 | + act42 = self:getProperty("act42"), | ||
126 | 130 | ||
127 | reset20 = self:getProperty("reset20") | 131 | reset20 = self:getProperty("reset20") |
128 | } | 132 | } |
@@ -836,6 +840,21 @@ activityFunc[Activity.ActivityType.ChallengeLevel] = { | @@ -836,6 +840,21 @@ activityFunc[Activity.ActivityType.ChallengeLevel] = { | ||
836 | end, | 840 | end, |
837 | } | 841 | } |
838 | 842 | ||
843 | +--RegularWorldBoos | ||
844 | +activityFunc[Activity.ActivityType.RegularWorldBoos] = { | ||
845 | + ["init"] = function(self, actType, isCrossDay, notify, actId) | ||
846 | + self:getRegularWorldBossTicket(actId) | ||
847 | + end, | ||
848 | + ["login"] = function(self, actType, actId) | ||
849 | + self:getRegularWorldBossTicket(actId) | ||
850 | + end, | ||
851 | + ["crossDay"] = function(self, actType, notify) | ||
852 | + local actData = self:getActData(actType) | ||
853 | + actData["buyC"] = 0 | ||
854 | + self:updateActData(actType, actData, not notify) | ||
855 | + end, | ||
856 | +} | ||
857 | + | ||
839 | function Activity:onLoginActivity(actId) | 858 | function Activity:onLoginActivity(actId) |
840 | local actData = csvdb["activity_ctrlCsv"][actId] | 859 | local actData = csvdb["activity_ctrlCsv"][actId] |
841 | if not actData then return end | 860 | if not actData then return end |
@@ -1056,6 +1075,45 @@ function Activity:getBattleTicket(actId) | @@ -1056,6 +1075,45 @@ function Activity:getBattleTicket(actId) | ||
1056 | end | 1075 | end |
1057 | end | 1076 | end |
1058 | 1077 | ||
1078 | +--常规世界boss计算门票 | ||
1079 | +function Activity:getRegularWorldBossTicket(actId) | ||
1080 | + local role = self.owner | ||
1081 | + local createTs = role:getProperty("ctime") | ||
1082 | + local actCfg = csvdb["activity_ctrlCsv"][actId] | ||
1083 | + if not actCfg then return 0 end | ||
1084 | + | ||
1085 | + local actStartTime = 0 | ||
1086 | + local openTimes = actCfg.time:toArray(false, "=") | ||
1087 | + actStartTime = toUnixtime(openTimes[1]..string_format("%02x", RESET_TIME)) | ||
1088 | + local actData = self:getActData("RegularWorldBoos") or {} | ||
1089 | + local startTs = actData["ts"] or math.max(actStartTime, createTs) | ||
1090 | + local timeNow = skynet.timex() | ||
1091 | + local modify = false | ||
1092 | + local arr = actCfg.condition2:toArray(true, "=") | ||
1093 | + | ||
1094 | + local ticketId, init, limit, duration = arr[1] or 0, arr[2] or 0, arr[3] or 0, arr[4] or 10000 | ||
1095 | + | ||
1096 | + local count = actData["ticket"] or init | ||
1097 | + if count >= limit then | ||
1098 | + actData["ts"] = timeNow | ||
1099 | + self:updateActData("RegularWorldBoos", actData) | ||
1100 | + return | ||
1101 | + end | ||
1102 | + local add = math.max(math.floor((timeNow - startTs) / (duration * 60)), 0) | ||
1103 | + | ||
1104 | + local newCount= math.min(count + add, limit) | ||
1105 | + if newCount ~= count or newCount >= limit then | ||
1106 | + modify = true | ||
1107 | + end | ||
1108 | + add = newCount - count | ||
1109 | + | ||
1110 | + if modify or not next(actData) then | ||
1111 | + actData["ticket"] = newCount | ||
1112 | + actData["ts"] = newCount >= limit and timeNow or (startTs + add * duration * 60) | ||
1113 | + self:updateActData("RegularWorldBoos", actData) | ||
1114 | + end | ||
1115 | +end | ||
1116 | + | ||
1059 | activityFunc[Activity.ActivityType.ActShopGoods] = { | 1117 | activityFunc[Activity.ActivityType.ActShopGoods] = { |
1060 | ["init"] = function(self, actType, isCrossDay, notify, actId) | 1118 | ["init"] = function(self, actType, isCrossDay, notify, actId) |
1061 | end, | 1119 | end, |
@@ -1216,7 +1274,7 @@ activityFunc[Activity.ActivityType.BattleCommand] = { | @@ -1216,7 +1274,7 @@ activityFunc[Activity.ActivityType.BattleCommand] = { | ||
1216 | actData["week"] = math.min(old + count, limit) | 1274 | actData["week"] = math.min(old + count, limit) |
1217 | count = actData["week"] - old | 1275 | count = actData["week"] - old |
1218 | end | 1276 | end |
1219 | - local total = actData["sum"] + count | 1277 | + local total = (actData["sum"] or 0) + count |
1220 | local curLvl = actData["lvl"] or 0 | 1278 | local curLvl = actData["lvl"] or 0 |
1221 | if actCfg.condition == 1 then -- 代表sum需要转换为等级 | 1279 | if actCfg.condition == 1 then -- 代表sum需要转换为等级 |
1222 | local bpCfg = csvdb["activity_battlepass_rewardCsv"][actId] | 1280 | local bpCfg = csvdb["activity_battlepass_rewardCsv"][actId] |
@@ -1353,4 +1411,95 @@ activityFunc[Activity.ActivityType.AdvLevel] = { | @@ -1353,4 +1411,95 @@ activityFunc[Activity.ActivityType.AdvLevel] = { | ||
1353 | end, | 1411 | end, |
1354 | } | 1412 | } |
1355 | 1413 | ||
1414 | +-- 获取英雄大成功率 | ||
1415 | +local function getHeroCoef(hero, condition) | ||
1416 | + -- 基础概率 | ||
1417 | + local rareMap = {[HeroQuality.N] = 10, [HeroQuality.R] = 10, [HeroQuality.SR] = 15, [HeroQuality.SSR] = 20} | ||
1418 | + local rare = hero:getRare() | ||
1419 | + local result = 0 | ||
1420 | + for _, it in ipairs(condition:toTableArray(true)) do | ||
1421 | + local type = it[1] | ||
1422 | + local value = it[2] | ||
1423 | + local add = it[3] | ||
1424 | + if type == 1 then -- 种族加成 | ||
1425 | + if hero:getCamp() == value then | ||
1426 | + result = result + add | ||
1427 | + end | ||
1428 | + elseif type == 2 then -- 定位加成 | ||
1429 | + if hero:getPosition() == value then | ||
1430 | + result = result + add | ||
1431 | + end | ||
1432 | + end | ||
1433 | + end | ||
1434 | + | ||
1435 | + return result + (rareMap[rare] or 0) | ||
1436 | +end | ||
1437 | + | ||
1438 | +local function getActRadioTaskReward(role, id, task) | ||
1439 | + local config = csvdb["crusadeCsv"][id] | ||
1440 | + if not config then return 2 end | ||
1441 | + local carbonData = csvdb["idle_battleCsv"][config.unlock] | ||
1442 | + if not carbonData then return 3 end | ||
1443 | + -- get heros | ||
1444 | + local totalCoef = 0 | ||
1445 | + local exp = config.time / 60 | ||
1446 | + for _, heroId in ipairs(task.heros) do | ||
1447 | + local hero = role.heros[heroId] | ||
1448 | + if hero then | ||
1449 | + totalCoef = totalCoef + getHeroCoef(hero, config.success) | ||
1450 | + -- 增加英雄信赖 | ||
1451 | + hero:addHeroFaith(exp) | ||
1452 | + end | ||
1453 | + end | ||
1454 | + -- send award | ||
1455 | + local bigSuccess = false | ||
1456 | + local result = math.randomInt(0, 100) | ||
1457 | + if result < totalCoef then | ||
1458 | + bigSuccess = true | ||
1459 | + end | ||
1460 | + local money = math.ceil(carbonData.money / 5) * config.time * config.money_clear | ||
1461 | + local exp = math.ceil(carbonData.exp / 5) * config.time * config.exp_clear | ||
1462 | + local itemReward = config.item_clear_special:toNumMap() | ||
1463 | + itemReward[ItemId.Gold] = (itemReward[ItemId.Gold] or 0) + money | ||
1464 | + itemReward[ItemId.Exp] = (itemReward[ItemId.Exp] or 0) + exp | ||
1465 | + if bigSuccess then | ||
1466 | + for key, value in pairs(itemReward) do | ||
1467 | + itemReward[key] = math.ceil(1.5 * value) | ||
1468 | + end | ||
1469 | + end | ||
1470 | + | ||
1471 | + return itemReward | ||
1472 | +end | ||
1473 | + | ||
1474 | + | ||
1475 | +activityFunc[Activity.ActivityType.RadioTask] = { | ||
1476 | + -- ["check"] = function(self, actType, notify) -- 检查 | ||
1477 | + -- end, | ||
1478 | + ["init"] = function(self, actType, isCrossDay, notify) | ||
1479 | + end, | ||
1480 | + ["close"] = function(self, actType, notify, actid) | ||
1481 | + local radioTask = self.owner:getProperty("radioTask") | ||
1482 | + local result = {} | ||
1483 | + for id, task in pairs(radioTask) do | ||
1484 | + -- check id | ||
1485 | + local config = csvdb["crusadeCsv"][id] | ||
1486 | + if config then | ||
1487 | + if config.actid == actid then | ||
1488 | + radioTask[id] = nil | ||
1489 | + | ||
1490 | + if not task then return 4 end | ||
1491 | + if skynet.timex() < task.time then return 5 end | ||
1492 | + | ||
1493 | + local reward = getActRadioTaskReward(self.owner, id, task) | ||
1494 | + for k, v in pairs(reward) do | ||
1495 | + result[k] = (result[k] or 0) + v | ||
1496 | + end | ||
1497 | + end | ||
1498 | + end | ||
1499 | + end | ||
1500 | + self.owner:sendMail(MailId.ActRadoTaskReward, nil, result, nil) | ||
1501 | + self.owner:updateProperty({field="radioTask", value=radioTask, notNotify = true}) | ||
1502 | + end, | ||
1503 | +} | ||
1504 | + | ||
1356 | return Activity | 1505 | return Activity |
src/models/Diner.lua
@@ -232,7 +232,7 @@ function Diner:calSellReward(sell, delta, dishData, isExpedite) | @@ -232,7 +232,7 @@ function Diner:calSellReward(sell, delta, dishData, isExpedite) | ||
232 | upValue[-1] = (upValue[-1] or 0) + collectAdd | 232 | upValue[-1] = (upValue[-1] or 0) + collectAdd |
233 | 233 | ||
234 | -- 电波塔加成 | 234 | -- 电波塔加成 |
235 | - local goldCount = self.owner:getBnousDiner(4,addReward[ItemId.Gold]) | 235 | + local goldCount = (self.owner:getBnousDiner(4,addReward[ItemId.Gold]/delta, true) + self.owner:getBnousByZero(4)) * delta |
236 | 236 | ||
237 | for id, count in pairs(addReward) do | 237 | for id, count in pairs(addReward) do |
238 | addReward[id] = math.floor(count * (1 + (upValue[id] or 0) / 100)) | 238 | addReward[id] = math.floor(count * (1 + (upValue[id] or 0) / 100)) |
src/models/RoleLog.lua
@@ -70,6 +70,11 @@ local ItemReason = { | @@ -70,6 +70,11 @@ local ItemReason = { | ||
70 | buyDiamondCardReward = 154, --购买钻石额外赠送奖励 | 70 | buyDiamondCardReward = 154, --购买钻石额外赠送奖励 |
71 | firstMonthCardReward = 155, --首次订阅月卡奖励 | 71 | firstMonthCardReward = 155, --首次订阅月卡奖励 |
72 | firstSMonthCardReward = 156, --首次订阅特刊奖励 | 72 | firstSMonthCardReward = 156, --首次订阅特刊奖励 |
73 | + regularWorldBossReward = 157, -- 常规世界boss | ||
74 | + regularWorldBossMilestone = 158, -- 常规世界boss伤害里程碑 | ||
75 | + regularWorldBossBattle = 159, -- 常规世界boss战斗奖励 | ||
76 | + | ||
77 | + | ||
73 | 78 | ||
74 | advHang = 301, -- 拾荒挂机 | 79 | advHang = 301, -- 拾荒挂机 |
75 | hangBattle = 302, -- 挂机战斗 | 80 | hangBattle = 302, -- 挂机战斗 |
@@ -115,6 +120,8 @@ local ItemReason = { | @@ -115,6 +120,8 @@ local ItemReason = { | ||
115 | battleCommandTask = 1011, -- 将军令任务 | 120 | battleCommandTask = 1011, -- 将军令任务 |
116 | newUserTask = 1012, -- 新玩家任务 | 121 | newUserTask = 1012, -- 新玩家任务 |
117 | buyActivityBattleTicket = 1013, -- 购买门票 | 122 | buyActivityBattleTicket = 1013, -- 购买门票 |
123 | + buyRegularWorldBossTicket = 1014, -- 购买门票 | ||
124 | + | ||
118 | 125 | ||
119 | -- 餐厅 | 126 | -- 餐厅 |
120 | greenHourse = 1101, -- 食材获得 | 127 | greenHourse = 1101, -- 食材获得 |
src/models/RolePlugin.lua
@@ -2873,15 +2873,32 @@ function RolePlugin.bind(Role) | @@ -2873,15 +2873,32 @@ function RolePlugin.bind(Role) | ||
2873 | return self.towerBnousActive | 2873 | return self.towerBnousActive |
2874 | end | 2874 | end |
2875 | 2875 | ||
2876 | + function Role:bonusMerged(bonus1, bonus2) | ||
2877 | + bonus1 = bonus1 or {} | ||
2878 | + bonus2 = bonus2 or {} | ||
2879 | + | ||
2880 | + local bonus = {} | ||
2881 | + bonus[0] = (bonus1[0] or 0) + (bonus2[0] or 0) | ||
2882 | + bonus[1] = (bonus1[1] or 0) + (bonus2[1] or 0) | ||
2883 | + return bonus | ||
2884 | + end | ||
2885 | + | ||
2886 | + --计算公式是 (原价+固有提升数)*(1+赞誉度增幅中的百分比+电波塔中的百分比) | ||
2887 | + --详细做法是 原价 + (原价+固有提升数) * (赞誉度增幅中的百分比+电波塔中的百分比) + 固有提升数 | ||
2876 | function Role:getDeltaValue(result, value) | 2888 | function Role:getDeltaValue(result, value) |
2877 | if not result then return 0 end | 2889 | if not result then return 0 end |
2878 | local delta = 0 | 2890 | local delta = 0 |
2879 | - if result[1] and value then | ||
2880 | - delta = math.floor(value * result[1] / 100) | ||
2881 | - end | ||
2882 | if result[0] then | 2891 | if result[0] then |
2883 | delta = delta + result[0] | 2892 | delta = delta + result[0] |
2884 | end | 2893 | end |
2894 | + | ||
2895 | + if result[1] and value then | ||
2896 | + if delta == 0 then | ||
2897 | + delta = delta * result[1] / 100 | ||
2898 | + else | ||
2899 | + delta = (delta + value )* result[1] / 100 | ||
2900 | + end | ||
2901 | + end | ||
2885 | return delta | 2902 | return delta |
2886 | end | 2903 | end |
2887 | 2904 | ||
@@ -2894,32 +2911,49 @@ function RolePlugin.bind(Role) | @@ -2894,32 +2911,49 @@ function RolePlugin.bind(Role) | ||
2894 | local towerBnous = self:getTowerBnousActive() | 2911 | local towerBnous = self:getTowerBnousActive() |
2895 | local levelBnous = self:getLevelBnous() | 2912 | local levelBnous = self:getLevelBnous() |
2896 | 2913 | ||
2897 | - local towerValue = self:getDeltaValue(towerBnous[SystemBnousType.CrusadeTask], value) | ||
2898 | - local levelValue = self:getDeltaValue(levelBnous[SystemBnousType.CrusadeTask], value) | ||
2899 | - return levelValue + towerValue | 2914 | + local bonus = self:bonusMerged(towerBnous[SystemBnousType.CrusadeTask], levelBnous[SystemBnousType.CrusadeTask]) |
2915 | + return self:getDeltaValue(bonus, value) | ||
2900 | end | 2916 | end |
2901 | 2917 | ||
2902 | - function Role:getBnousDiner(type, value) | 2918 | + function Role:getBnousDiner(type, value, flag) |
2903 | local towerBnous = self:getTowerBnousActive() | 2919 | local towerBnous = self:getTowerBnousActive() |
2904 | local levelBnous = self:getLevelBnous() | 2920 | local levelBnous = self:getLevelBnous() |
2905 | type = type or 1 | 2921 | type = type or 1 |
2906 | - local result, levelReault | 2922 | + local bonus |
2907 | if type == 1 then | 2923 | if type == 1 then |
2908 | - result = towerBnous[SystemBnousType.DinerGet] | ||
2909 | - levelReault = levelBnous[SystemBnousType.DinerGet] | 2924 | + bonus = self:bonusMerged(towerBnous[SystemBnousType.DinerGet], levelBnous[SystemBnousType.DinerGet]) |
2910 | elseif type == 2 then | 2925 | elseif type == 2 then |
2911 | - result = towerBnous[SystemBnousType.DinerLimit] | ||
2912 | - levelReault = levelBnous[SystemBnousType.DinerLimit] | 2926 | + bonus = self:bonusMerged(towerBnous[SystemBnousType.DinerLimit], levelBnous[SystemBnousType.DinerLimit]) |
2913 | elseif type == 3 then | 2927 | elseif type == 3 then |
2914 | - result = towerBnous[SystemBnousType.DinerSell] | ||
2915 | - levelReault = levelBnous[SystemBnousType.DinerSell] | 2928 | + bonus = self:bonusMerged(towerBnous[SystemBnousType.DinerSell], levelBnous[SystemBnousType.DinerSell]) |
2916 | elseif type == 4 then | 2929 | elseif type == 4 then |
2917 | - result = towerBnous[SystemBnousType.DinerPrice] | ||
2918 | - levelReault = levelBnous[SystemBnousType.DinerPrice] | 2930 | + bonus = self:bonusMerged(towerBnous[SystemBnousType.DinerPrice], levelBnous[SystemBnousType.DinerPrice]) |
2931 | + end | ||
2932 | + dump(bonus) | ||
2933 | + if not flag then | ||
2934 | + return self:getDeltaValue(bonus, value) + (bonus[0] or 0) | ||
2935 | + else | ||
2936 | + return self:getDeltaValue(bonus, value) | ||
2919 | end | 2937 | end |
2920 | - return self:getDeltaValue(result, value) + self:getDeltaValue(levelReault, value) | ||
2921 | end | 2938 | end |
2922 | 2939 | ||
2940 | + function Role:getBnousByZero(type) | ||
2941 | + local towerBnous = self:getTowerBnousActive() | ||
2942 | + local levelBnous = self:getLevelBnous() | ||
2943 | + type = type or 1 | ||
2944 | + local bonus | ||
2945 | + if type == 1 then | ||
2946 | + bonus = self:bonusMerged(towerBnous[SystemBnousType.DinerGet], levelBnous[SystemBnousType.DinerGet]) | ||
2947 | + elseif type == 2 then | ||
2948 | + bonus = self:bonusMerged(towerBnous[SystemBnousType.DinerLimit], levelBnous[SystemBnousType.DinerLimit]) | ||
2949 | + elseif type == 3 then | ||
2950 | + bonus = self:bonusMerged(towerBnous[SystemBnousType.DinerSell], levelBnous[SystemBnousType.DinerSell]) | ||
2951 | + elseif type == 4 then | ||
2952 | + bonus = self:bonusMerged(towerBnous[SystemBnousType.DinerPrice], levelBnous[SystemBnousType.DinerPrice]) | ||
2953 | + end | ||
2954 | + return (bonus[0] or 0) | ||
2955 | + end | ||
2956 | + | ||
2923 | local function appendAdvBnous(dstBnous, srcBnous) | 2957 | local function appendAdvBnous(dstBnous, srcBnous) |
2924 | if not dstBnous and not srcBnous then return {} end | 2958 | if not dstBnous and not srcBnous then return {} end |
2925 | local result = clone(dstBnous or {}) | 2959 | local result = clone(dstBnous or {}) |