diff options
author | chai <chaifix@163.com> | 2021-11-15 13:53:59 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-11-15 13:53:59 +0800 |
commit | 942a030afd348ab2e02eac8054b43e3c3a72ea48 (patch) | |
tree | a13459f39a3d2f1b533fbd1b5ab523d7a621f673 /Data/BuiltIn/Libraries/lua-addons/addons/shoutHelper/Alliance.lua | |
parent | e307051a56a54c27f10438fd2025edf61d0dfeed (diff) |
*rename
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/shoutHelper/Alliance.lua')
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/shoutHelper/Alliance.lua | 498 |
1 files changed, 498 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/shoutHelper/Alliance.lua b/Data/BuiltIn/Libraries/lua-addons/addons/shoutHelper/Alliance.lua new file mode 100644 index 0000000..7cb5606 --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/shoutHelper/Alliance.lua @@ -0,0 +1,498 @@ +--[[ +Copyright (c) 2013, Chiara De Acetis +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of <addon name> nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL <your name> BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +-- Object Alliance +--[[ +Concept +list = {party1={} party2={} party3={}} +list = {party1={WHM="ppl" PLD="ppl" WAR="ppl" DD="ppl" } party2={} party3={}} +if there's "add war" and only DD slots are left, it has to put the war in the DD slot +]] +local Alliance = {} + +require 'logger' +local files = require 'files' + +local JobList = T{ + 'blm', + 'blu', + 'brd', + 'bst', + 'dnc', + 'drg', + 'drk', + 'whm', + 'rdm', + 'pup', + 'cor', + 'pld', + 'geo', + 'run', + 'sch', + 'mnk', + 'thf', + 'war', + 'sam', + 'nin', + 'smn', + 'rng', + 'dd', + 'support', + 'heal', + 'tank' +} + +local DDlist = T{ + 'blm', + 'blu', + 'bst', + 'dnc', + 'drg', + 'drk', + 'pup', + 'pld', + 'run', + 'mnk', + 'thf', + 'war', + 'sam', + 'nin', + 'smn', + 'rng' +} + +local SupportList = T{ + 'cor', + 'brd', + 'geo' +} + +local HealList = T{ + 'whm', + 'rdm', + 'sch' +} + +--create and empty alliance +function Alliance:new() + local ally = { + party1 = {}, + party2 = {}, + party3 = {} + } + setmetatable(ally, self) + self.__index = self + return ally +end + +--sets one or multiple job in party1 +function Alliance:setParty1(jobs) + local length = 0 + local numJob = #self.party1 + if numJob == 6 then + return + end + if #jobs <= (6 - numJob) then + length = #jobs + else + length = (6 - numJob) + end + j = 1 + for i = 1, length do + job = jobs[i]:lower() + if JobList:contains(job) then + self.party1[j+numJob] = {job} + j = j+1 + end + end +end + +--sets one or multiple job in the party2 +function Alliance:setParty2(jobs) + local length = 0 + local numJob = #self.party2 + if numJob == 6 then + return + end + if #jobs <= (6 - numJob) then + length = #jobs + else + length = (6 - numJob) + end + j = 1 + for i = 1, length do + job = jobs[i]:lower() + if JobList:contains(job) then + self.party2[j+numJob] = {job} + j = j+1 + end + end +end + +--sets one or multiple job in party3 +function Alliance:setParty3(jobs) + local length = 0 + local numJob = #self.party3 + if numJob == 6 then + return + end + if #jobs <= (6 - numJob) then + length = #jobs + else + length = (6 - numJob) + end + j = 1 + for i = 1, length do + job = jobs[i]:lower() + if JobList:contains(job) then + self.party3[j+numJob] = {job} + j = j+1 + end + end +end + +--delete a job inside the ally +function Alliance:deleteJob(job, party) --it rescale the player list too + job = job:lower() + -- party slot not given + if (party == nil ) then + party = self:findJob(job) + if party[1] == 1 then + table.remove(self.party1, party[2]) + elseif party[1] == 2 then + table.remove(self.party2, party[2]) + elseif party[1] == 3 then + table.remove(self.party3, party[2]) + end + else -- party given + if (party == "party1") then + for i=1, #self.party1 do + local slot = self.party1[i] + local v = slot[1] + if(v == job) then + table.remove(self.party1, i) + return + end + end + elseif (party == "party2") then + for i=1, #self.party2 do + local slot = self.party2[i] + local v = slot[1] + if(v == job) then + table.remove(self.party2, i) + return + end + end + elseif (party == "party3") then + for i=1, #self.party3 do + if(v == job) then + table.remove(self.party3, i) + return + end + end + end + end +end + +--returns the first party table that contains the given job +function Alliance:findJob(job) + local party = nil + for i=1, #self.party1 do + local slot = self.party1[i] + local v = slot[1] + if( v == job ) then + party = {1, i} + return party + end + end + if(party == nil) then + for i=1, #self.party2 do + local slot = self.party2[i] + local v = slot[1] + if( v == job ) then + party = {2, i} + return party + end + end + end + if(party == nil) then + for i=1, #self.party3 do + local slot = self.party3[i] + local v = slot[1] + if( v == job ) then + party = {3, i} + return party + end + end + end + if(party == nil ) then + error(job..' not found') + return + end +end + +--returns the string representing the party +function Alliance:printAlly() + local s = '' + if(#self.party1 > 0) then + s = s..'\nPARTY 1\n' + for i=1, #self.party1 do + slot = self.party1[i] + job = slot[1] + name = slot[2] + s = s..'['..job:upper()..']' + if name then + s = s..' '..name + end + s = s..' \n' + end + end + if(#self.party2 > 0) then + s = s..'\nPARTY 2\n' + for i=1, #self.party2 do + slot = self.party2[i] + job = slot[1] + name = slot[2] + s = s..'['..job:upper()..']' + if name then + s = s..' '..name + end + s = s..' \n' + end + end + if(#self.party3 > 0) then + s = s..'\nPARTY 3\n' + for i=1, #self.party3 do + slot = self.party3[i] + job = slot[1] + name = slot[2] + s = s..'['..job:upper()..']' + if name then + s = s..' '..name + end + s = s..' \n' + end + end + return s +end + +--delete the ally +function Alliance:deleteAll() + self.party1 = {} + self.party2 = {} + self.party3 = {} +end + +--delete the party +function Alliance:delete(party) + if party == "party1" then + self.party1 = {} + elseif party == "party2" then + self.party2 = {} + elseif party == "party3" then + self.party3 = {} + end +end + +--sets one player to the first <job> slot free +function Alliance:addPlayer(job, name) + local party = self:findFreeSlot(job) + local rightJob = true + --if party is null the job wasn't found + --it means the there isn't the given job (example: one's looking for mnk and only slot DD are left) + if not party and job then + if DDlist:contains(job:lower()) then + party = self:findFreeSlot('dd') + rightJob = false + elseif SupportList:contains(job:lower())then + party = self:findFreeSlot('support') + rightJob = false + elseif HealList:contains(job:lower()) then + party = self:findFreeSlot('heal') + rightJob = false + end + if not party then + error("Can't find a free slot") + return + end + end + local pos = party[2] + if (party[1] == 1) then + local slot = self.party1[pos] + if rightJob then + self.party1[pos] = {slot[1], name} + else + self.party1[pos] = {job:lower(), name} + end + end + if (party[1] == 2) then + local slot = self.party2[pos] + if rightJob then + self.party2[pos] = {slot[1], name} + else + self.party2[pos] = {job, name} + end + end + if (party[1] == 3) then + local slot = self.party3[pos] + if rightJob then + self.party3[pos] = {slot[1], name} + else + self.party3[pos] = {job, name} + end + end + --if I'm here it means it the given job is missing +end + +--find the first free party slot (job is optional) +function Alliance:findFreeSlot(job) + local party = nil --first position is pt, second is party slot + for i=1, #self.party1 do + local slot = self.party1[i] + local jobName = slot[1] + local name = slot[2] + if ((not job) and name == nil) then + --no job given, I'm looking for the first free slot in party + party = {1, i} + return party + elseif (job and name == nil) then + --the job is given, I'm looking for the first free slot for the given job + job = job:lower() + if(jobName == job)then + party = {1, i} + return party + end + end + end + for i=1, #self.party2 do + local slot = self.party2[i] + local jobName = slot[1] + local name = slot[2] + if ((not job) and name == nil) then + --no job given, I'm looking for the first free slot in party + party = {2, i} + return party + elseif (job and name == nil) then + --the job is given, I'm looking for the first free slot for the given job + job = job:lower() + if(jobName == job)then + party = {2, i} + return party + end + end + end + for i=1, #self.party3 do + local slot = self.party3[i] + local jobName = slot[1] + local name = slot[2] + if ((not job) and name == nil) then + --no job given, I'm looking for the first free slot in party + party = {3, i} + return party + elseif (job and name == nil) then + --the job is given, I'm looking for the first free slot for the given job + job = job:lower() + if(jobName == job)then + party = {3, i} + return party + end + end + end +end + +-- removes the player from alliance list (i remove the player in i-esim position) +function Alliance:removePlayer(name) + name = name:lower() + --looks through the pts + local v = '' + local slot = nil + for k=1, #self.party1 do + slot = self.party1[k] + v = slot[2] + if(v~= nil)then + v = v:lower() + if v == name then + self.party1[k] = {slot[1]} + return + end + end + end + for k=1, #self.party2 do + slot = self.party2[k] + v = slot[2] + if(v~= nil)then + v = v:lower() + if v == name then + self.party2[k] = {slot[1]} + return + end + end + end + for k=1, #self.party3 do + slot = self.party3[k] + v = slot[2] + if(v~= nil)then + v = v:lower() + if v == name then + self.party3[k] = {slot[1]} + return + end + end + end +end + +--save the current ally in an xml file +function Alliance:save() + --TODO (now creates only a string xml) + local a = '<?xml version="1.0" ?>\n' + a = a..'<alliance>\n' + a = a..'\t<party1>\n' + for i=1, #self.party1 do + slot = self.party1[i] + job = slot[1] + a = a..'\t\t<job'..i..'>'..job:upper()..'</job'..i..'>\n' + end + a = a..'\t</party1>\n' + a = a..'\t<party2>\n' + for i=1, #self.party2 do + slot = self.party2[i] + job = slot[1] + a = a..'\t\t<job'..i..'>'..job:upper()..'</job'..i..'>\n' + end + a = a..'\t</party2>\n' + a = a..'\t<party3>\n' + for i=1, #self.party3 do + slot = self.party3[i] + job = slot[1] + a = a..'\t\t<job'..i..'>'..job:upper()..'</job'..i..'>\n' + end + a = a..'\t</party3>\n' + a = a..'</alliance>\n' +end + +return Alliance |