more tooltip fields to assist altoholics #63


  • New
  • Enhancment
Open
  • _ForgeUser2706188 created this issue Dec 16, 2014

    My decision-making processes for which alt to switch to in order to handle mission completions looks like this:
    - among the alts who have completed missions, switch to the one with the *largest* time remaining until her next mission completes. (All missions complete -> infinite time until next completion; such an alt would get handled first)

    This saves me from bouncing to an alt only to have to come back a couple minutes later when another mission completes. With 11 alts, it's often the case that by the time I finish handling ones with large time-to-next-completion, the ones with low time-to-next-completion have finished additional missions. In the end, I can handle more completions in less time with fewer alt swaps.

    Currently, I'm eyeballing this using the mission status tooltip, but I would greatly appreciate a pair of custom fields in the tooltip header (in the style of %mnt and %mnc) to support my workflow:
    - character with at least one completed mission and the largest time remaining until the next completed mission; some sensible non-value if no characters have completed missions
    - (optional) the amount of time remaining until the next completed mission on that character.

  • _ForgeUser2706188 added the tags New Enhancment Dec 16, 2014
  • _ForgeUser2706188 posted a comment Dec 16, 2014

    For example: http://i.imgur.com/B7vbc5J.png

    If I switch to Anastasya to complete "Heart of the Iron Horde", then move on to another alt, "Night Watch" will probably complete after I've switched away, requiring me to switch back later.

    Instead, my heuristic says I should handle alts in this order:

    • Firebaugh, because all of her missions are complete
    • Venabili, with 3h47m until next completion after her 5 currently completed missions
    • Lazuli, with 1h22m until next completion after her 3 currently completed missions
    • (etc; you get the idea)
    • Anastasya, with 0h02m until next completion; after handling the above alts, this will certainly be complete also.

    Cryoseismic/Pavli, with no missions complete, don't get touched until they complete a mission, at least 43m from now.


    Edited Dec 16, 2014
  • _ForgeUser2706188 posted a comment Jan 16, 2015

    I've implemented this, probably not as cleanly as possible. Would a diff be useful?

  • Forge_User_42667175 posted a comment Jan 16, 2015

    thinking about a "todo" display (not sure on the way its implemented/displayed yet) - but yes, diff would be helpful (maybe with screenshot?)

  • _ForgeUser2706188 posted a comment Jan 17, 2015

    The only UI difference is in the tooltip's header, so the screenshots are pretty light:

    http://i.imgur.com/fUx7SFx.png - note "Juggle: Pavli" in the extreme upper right. In this case, Pavli has at least one complete mission, and time-until-next-complete is infinite (no pending missions), so she should be handled first.

    http://i.imgur.com/yO7pmRp.png - note "Juggle: Cryoseismic". Now that Pavli's missions are completed, Cryo has at least one complete mission, and time-until-next-complete is 5h40m, longer than any other character with completed missions

    Further logic, not shown in above screenshots:

    • if multiple characters have completed missions but no pending missions, prioritize the one with more complete missions
    • if no characters have completed missions, the next one to handle is the one with the shortest time-until-next-complete; an argument could be made that this should just be nil, instead.

    The code diff is across two files:

    data.lua: (this part was straightforward, aside from not having localized the name)

    497,508d496
    < 	["jnc"] = {
    < 		name = "Character next juggle",
    < 		data = function(data) 
    < 			local juggle = Garrison.getTableValue(data, "missionCount", "nextJuggle", "playerName")
    < 			if juggle then
    < 				return juggle
    < 			else
    < 				return Garrison.getTableValue(data, "missionCount", "nextChar", "playerName")
    < 			end
    < 		end,
    < 		type = Garrison.TYPE_MISSION,
    < 	},	
    

    core.lua: (this part could probably be significantly cleaned up, this is just the first thing that worked)

    545,548d544
    < 					if not missionCount.completedByChar[paramCharInfo] then
    < 						missionCount.completedByChar[paramCharInfo] = 0
    < 					end
    < 					missionCount.completedByChar[paramCharInfo] = missionCount.completedByChar[paramCharInfo] + 1
    554,557c550
    < 					end
    < 					if not missionCount.nextTimeByChar[paramCharInfo] or timeLeft < missionCount.nextTimeByChar[paramCharInfo] then
    < 						missionCount.nextTimeByChar[paramCharInfo] = timeLeft
    < 					end
    ---
    > 					end					
    565,568d557
    < 					if not missionCount.completedByChar[paramCharInfo] then
    < 						missionCount.completedByChar[paramCharInfo] = 0
    < 					end
    < 					missionCount.completedByChar[paramCharInfo] = missionCount.completedByChar[paramCharInfo] + 1
    698a688
    > 		nextName = nil,
    700,702d689
    < 		completedByChar = {},
    < 		nextTimeByChar = {},
    < 		nextJuggle = nil,
    723,739d709
    < 	missionCount.nextJuggle = nil
    < 	mostCompleted = 0
    < 	for char, completed in pairs(missionCount.completedByChar) do
    < 		if not missionCount.nextJuggle then  -- no current favorite
    < 			missionCount.nextJuggle = char
    < 			mostCompleted = completed
    < 		elseif not missionCount.nextTimeByChar[char] then  -- this char has no pending missions; top priority
    < 			if missionCount.nextTimeByChar[missionCount.nextJuggle] or mostCompleted < completed then
    < 				missionCount.nextJuggle = char
    < 				mostCompleted = completed
    < 			end
    < 		elseif missionCount.nextTimeByChar[missionCount.nextJuggle] and missionCount.nextTimeByChar[char] > missionCount.nextTimeByChar[missionCount.nextJuggle] then  -- this char's next mission is longer than the current favorite's
    < 			missionCount.nextJuggle = char
    < 			mostCompleted = completed
    < 		end
    < 	end
    < 
    756a727
    > 			nextName = nil,
    
  • _ForgeUser2706188 posted a comment Jan 19, 2015

    "an argument could be made that this should just be nil, instead."

    I convinced myself. This now just returns nil if no missions are complete.

    I also added a corresponding %jnt% var, so I can eyeball how soon I'll be juggling missions again. Under 10 minutes or so and I won't bother.

  • _ForgeUser2706188 posted a comment Jun 24, 2015

    I still want this feature, and it's one of the core reasons I use Broker_Garrison. I'd been holding my version at 1.6.something to avoid having to re-merge my patch into each new release, but the shipyard update forced me to update.

    The diff to core.lua is unchanged from the previous diff I posted.

    The diff to data.lua follows, and includes my comments about "should just be nil" and "%jnt%":

    558a559,578
    >  	["jnc"] = {
    >  		name = "Character next juggle",
    >  		data = function(data) 
    >  			return Garrison.getTableValue(data, "missionCount", "nextJuggle", "playerName")
    >  		end,
    >  		type = Garrison.TYPE_MISSION,
    >  	},	
    >  	["jnt"] = {
    >  		name = "Time next juggle",
    >  		data = function(data) 
    >  			local juggle = Garrison.getTableValue(data, "missionCount", "nextJuggle", "playerName")
    >  			local time = Garrison.getTableValue(data, "missionCount", "nextTimeByChar", juggle) or 0
    >  			if time > 0 then
    > 				return Garrison.formattedSeconds(time)
    > 			else
    > 				return nil
    > 			end
    >  		end,
    >  		type = Garrison.TYPE_MISSION,
    >  	},	
    
  • _ForgeUser2706188 posted a comment Jun 24, 2015

    Whoops, the following line:

    >  			local juggle = Garrison.getTableValue(data, "missionCount", "nextJuggle", "playerName")
    

    Should instead be:

    >  			local juggle = Garrison.getTableValue(data, "missionCount", "nextJuggle")
    

To post a comment, please login or register a new account.