comparison Lists.lua @ 12:a6bc3f2d3207

Many corrections to support ID based lists
author John@Yosemite-PC
date Wed, 07 Mar 2012 23:01:33 -0500
parents 433d31ea992a
children e62cbf3a0c07
comparison
equal deleted inserted replaced
11:99c279ab0b75 12:a6bc3f2d3207
7 -- A separate user list is held - lists index into this 7 -- A separate user list is held - lists index into this
8 8
9 9
10 -- TODO: rename player 10 -- TODO: rename player
11 -- TODO: list trimming 11 -- TODO: list trimming
12 -- TODO: lists allow double-add
13 -- TODO: collapse slists into delimited strings for space
12 14
13 -- notes on list storage: 15 -- notes on list storage:
14 -- Using names as keys as I do now is atrocious. 16 -- Using names as keys as I do now is atrocious.
15 -- It prevents insertions (twss) to the middle of the list because then it acts 17 -- It prevents insertions (twss) to the middle of the list because then it acts
16 -- as a side effect onto all the others. ie ABCD -> AXBCD would be phrased as 18 -- as a side effect onto all the others. ie ABCD -> AXBCD would be phrased as
87 -- Debugging {{{ 89 -- Debugging {{{
88 function bsk:PrettyPrintList(listIndex) 90 function bsk:PrettyPrintList(listIndex)
89 local list = bsk.lists[listIndex] 91 local list = bsk.lists[listIndex]
90 bsk:Print("List: " .. list.name .. " (" .. list.time .. ")") 92 bsk:Print("List: " .. list.name .. " (" .. list.time .. ")")
91 for i = 1,#list do 93 for i = 1,#list do
92 bsk:Print(" " .. i .. " - " .. bsk.persons[list[i]].main) 94 bsk:Print(" " .. i .. " - " .. bsk.persons[list[i].id].main)
93 end 95 end
94 end 96 end
95 function bsk:PrettyPrintLists() 97 function bsk:PrettyPrintLists()
96 for i,_ in pairs(bsk.lists) do 98 for i,_ in pairs(bsk.lists) do
97 bsk:PrettyPrintList(i) 99 bsk:PrettyPrintList(i)
340 function bsk:DoAddPersonToListRandom(change) 342 function bsk:DoAddPersonToListRandom(change)
341 local list = bsk.lists[change.arg.listIndex] 343 local list = bsk.lists[change.arg.listIndex]
342 local entry = {index=change.arg.roll, id=change.arg.id} 344 local entry = {index=change.arg.roll, id=change.arg.id}
343 345
344 tinsert(list,entry) 346 tinsert(list,entry)
345 table.sort(list,function(a,b) return a.roll < b.roll end) 347 table.sort(list,function(a,b) return a.index < b.index end)
346 list.time = change.time 348 list.time = change.time
347 349
348 return true 350 return true
349 end 351 end
350 352
351 function bsk:AddPersonToListRandom(name,list) 353 function bsk:AddPersonToListRandom(name,list)
352 -- require admin 354 -- require admin
353 local listIndex = bsk:GetListIndex(list) 355 local listIndex = bsk:GetListIndex(list)
354 if bsk.lists[listIndex].closedRandom then 356 if bsk.lists[listIndex].closedRandom then
355 self:Print("Cannot add person to list by random roll because an add-to-end operation has already occurred") 357 self:Print("Cannot add person to list by random roll because an add-to-end operation has already occurred")
358 return false
356 end 359 end
357 local id = personsReverse[name] 360 local id = personsReverse[name]
358 local roll = math.random() 361 local roll = math.random()
359 bsk:Print(sformat("Adding %s (%s) to list %s (%s) with roll (%f)", name, id, list, listIndex, roll)) 362 bsk:Print(sformat("Adding %s (%s) to list %s (%s) with roll (%f)", name, id, list, listIndex, roll))
360 local change = {action="AddToListRand",arg={id=id,listIndex=listIndex,roll=roll}} 363 local change = {action="AddToListRand",arg={id=id,listIndex=listIndex,roll=roll}}
398 401
399 function bsk:SuicidePerson(name,list) 402 function bsk:SuicidePerson(name,list)
400 -- require admin 403 -- require admin
401 bsk:PopulateRaidList() 404 bsk:PopulateRaidList()
402 local listIndex = bsk:GetListIndex(list) 405 local listIndex = bsk:GetListIndex(list)
403 local slist=bsk:GetSuicideList(name,bsk.lists[listIndex]) 406 local id = personsReverse[name]
404 local change = {action="SuicidePerson",arg={names=names,list=slist,listIndex=listIndex}} 407 local slist=bsk:GetSuicideList(id,bsk.lists[listIndex])
408 local change = {action="SuicidePerson",arg={list=slist,listIndex=listIndex}}
405 bsk:PrintTable(change) 409 bsk:PrintTable(change)
406 bsk:StartChange(change) 410 bsk:StartChange(change)
407 if bsk:DoSuicidePerson(change) then 411 if bsk:DoSuicidePerson(change) then
408 bsk:CommitChange(change) 412 bsk:CommitChange(change)
409 end 413 end
477 481
478 -- "Soft" actions- ie things that cause nonpermanent state {{{ 482 -- "Soft" actions- ie things that cause nonpermanent state {{{
479 483
480 -- reserves 484 -- reserves
481 function bsk:AddReserve(name) 485 function bsk:AddReserve(name)
482 reserveList[name]=true 486 reserveList[personsReverse[name]]=true
483 -- TODO: communicate to others. don't store this in any way. 487 -- TODO: communicate to others. don't store this in any way.
484 end 488 end
485 489
486 function bsk:RemoveReserve(name) 490 function bsk:RemoveReserve(name)
487 reserveList[name]=false 491 reserveList[personsReverse[name]]=false
488 -- TODO: communicate to others. don't store this in any way. 492 -- TODO: communicate to others. don't store this in any way.
489 end 493 end
490 494
491 495
492 --function bsk:GetActiveList() 496 --function bsk:GetActiveList()
510 local inRaid = GetNumRaidMembers() 514 local inRaid = GetNumRaidMembers()
511 515
512 wipe(raidList) 516 wipe(raidList)
513 if inRaid > 0 then 517 if inRaid > 0 then
514 for i = 1, inRaid do 518 for i = 1, inRaid do
515 raidList[UnitName(rID[i])]=true 519 raidList[personsReverse[UnitName(rID[i])]]=true
516 end 520 end
517 elseif inParty > 0 then 521 elseif inParty > 0 then
518 for i = 1, inParty do 522 for i = 1, inParty do
519 raidList[UnitName(pID[i])]=true 523 raidList[personsReverse[UnitName(pID[i])]]=true
520 end 524 end
521 -- Now add yourself as the last party member 525 -- Now add yourself as the last party member
522 raidList[UnitName("player")]=true 526 raidList[personsReverse[UnitName("player")]]=true
523 else 527 else
524 -- You're alone 528 -- You're alone
525 raidList[UnitName("player")]=true 529 raidList[personsReverse[UnitName("player")]]=true
526 end 530 end
527 end 531 end
528 532
529 -- undo rules! 533 -- undo rules!
530 -- only the most recent event can be undone 534 -- only the most recent event can be undone
533 -- just find A,B,C in the list and replace in order from the s message 537 -- just find A,B,C in the list and replace in order from the s message
534 -- while undo is allowed *per-list*, certain events in the stream will 538 -- while undo is allowed *per-list*, certain events in the stream will
535 -- prevent proper undo, such as add/delete player or add/delete list 539 -- prevent proper undo, such as add/delete player or add/delete list
536 540
537 541
538 function bsk:GetSuicideList(name,list) 542 function bsk:GetSuicideList(id,list)
539 --self:Print("Calculating changeset for "..name.." from list -") 543 --self:Print("Calculating changeset for "..name.." from list -")
540 --self:PrintTable(list) 544 --self:PrintTable(list)
541 local t = {} 545 local t = {}
542 local ret = {} 546 local ret = {}
543 local pushing = false 547 local pushing = false
544 for i = 1, #list do 548 for i = 1, #list do
545 if list[i] == name then 549 if list[i].id == id then
546 pushing = true 550 pushing = true
547 end 551 end
548 if pushing and (raidList[list[i]] or reserveList[list[i]]) then 552 if pushing and (raidList[list[i].id] or reserveList[list[i].id]) then
549 tinsert(ret,list[i].id) 553 tinsert(ret,list[i].id)
550 end 554 end
551 end 555 end
556 bsk:Print("GSL")
557 bsk:PrintTable(ret)
558 bsk:Print("GSL")
552 return ret 559 return ret
553 end 560 end
554 561
555 -- returns true if the events in the list are in time order 562 -- returns true if the events in the list are in time order
556 function bsk:CheckListCausality() 563 function bsk:CheckListCausality()