zealvurte / simsimmissionwin Goto Github PK
View Code? Open in Web Editor NEWWoW addon for the Shadowlands command table
License: GNU General Public License v3.0
WoW addon for the Shadowlands command table
License: GNU General Public License v3.0
and here is a collection for targets of random-target spell you might interest in
database.txt
I've collected this before to check out the targets of random-target-spell from real logs I did
data like
[298] = {
[7] = {
"{\"targets\":\"random-ally\",\"targetUnit\":\"7\",\"encounters\":\"679abc\",\"followers\":\"01234\",\"sourceUnit\":7,\"effectIndex\":0}",
which 298
means the spell ID
the second key 7
means the caster index
and in third line, targets
means the value of key target
of spell 298
in my own vs-spell.lua
targetUnit
means the target of the spell in real log
encounters
and followers
means the current survival units in fields
sourceUnit
is the same to the key in second line
effectIndex
may be 0 or 1 which means damage or heal effect? I'm not sure of this,so I just save it from real log
some targets seems to be strange from the collections
like spell 231
and 232
spell 231
most of times selects the target 1
in fields
while spell 298
selects the target 7
in most of times
Below is the current list of follower logs required for verification of spells:
{
[1240]=true, -- Kyrian Phalanx
[1242]=true, -- Maldraxxus Shock Trooper
[1243]=true, -- Maldraxxus Plaguesinger
[1262]=true, -- Bonesmith Heirmir
[1263]=true, -- Emeni
[1271]=true, -- Pelodis
[1289]=true, -- Kyrian Phalanx
[1290]=true, -- Kyrian Phalanx
[1300]=true, -- Secutor Mevix
[1301]=true, -- Gunn Gorgebone
[1302]=true, -- Rencissa the Dynamo
[1303]=true, -- Khaliiq
[1304]=true, -- Plaguey
[1305]=true, -- Rathan
[1306]=true, -- Gorgelimb
[1307]=true, -- Talethi
[1308]=true, -- Velkein
[1309]=true, -- Assembler Xertora
[1310]=true, -- Rattlebag
[1311]=true, -- Ashraka
[1312]=true, -- Maldraxxus Shock Trooper
[1313]=true, -- Maldraxxus Shock Trooper
[1314]=true, -- Maldraxxus Plaguesinger
[1315]=true, -- Maldraxxus Plaguesinger
[1320]=true, -- Kyrian Phalanx
[1321]=true, -- Maldraxxus Shock Trooper
[1324]=true, -- Maldraxxus Plaguesinger
[1328]=true, -- ELGU - 007
[1329]=true, -- Kiaranyka
[1330]=true, -- Ryuja Shockfist
[1331]=true, -- Kinessa the Absorbent
[1332]=true, -- Steadyhands
[1334]=true, -- Lyra Hailstorm
[1335]=true, -- Enceladus
[1336]=true, -- Deathfang
[1343]=true, -- Auric Spiritguide
}
This same list is implemented in VP (modified) to cause a report to be saved when a mission with one of these followers is completed, regardless of outcome or sim accuracy.
Effect.Target values are somewhat complex, unintuitive, and hindered with some errors in the game's implementation.
I've attempted to document and implement them in a way that helps me visualise and debug them easier. This is very much an incomplete work in progress and somewhat speculative in places.
{
[0]={ -- NONE
text="nothing"
},
[1]={ -- SELF
text="self",
targets=function (source) return source end,
},
[2]={ -- ADJACENT_FRIENDLY
text="closest ally",
targets={
-- [source]=targetByPriority
[-1]={5,6,7,8,9,10,11,12},
[0]={2,3,1,4}, {0,3,4,2},
{0,3,1,4}, {2,0,1,4}, {3,1,2,0},
{5,6,10,7,9,11,8,12}, {5,10,7,11,6,9,12,8}, {6,11,10,12,8,7,5,9}, {7,6,8,11,12,9,5,10},
{5,10,6,9,7,8,11,12}, {9,6,11,5,7,10,8,12}, {10,7,8,12,6,9,11,5}, {8,11,7,12,6,5,10,9},
},
},
[3]={ -- ADJACENT_HOSTILE
text="closest enemy",
targets={
-- [source]=targetByPriority
[-1]={0,1,2,3,4},
[0]={5,6,10,7,9,11,8,12}, {6,7,11,8,10,12,5,9},
{5,6,9,10,7,11,8,12}, {6,7,5,10,9,11,8,12}, {7,8,6,11,10,12,5,9},
{2,0,3,1,4}, {2,3,0,1,4}, {3,4,2,0,1}, {4,3,1,2,0},
{2,3,0,1,4}, {2,3,4,0,1}, {2,3,4,0,1}, {4,3,2,0,1},
},
},
[4]={ -- RANGED_FRIENDLY (Unused)
text="furthest ally",
targets={
-- [source]=targetByPriority
},
},
[5]={ -- RANGED_HOSTILE
text="furthest enemy",
targets={
-- [source]=targetByPriority
[-1]={4,3,2,1,0},
[0]={12,8,9,11,10,5,7,6}, {9,5,10,12,11,6,8,7},
{12,8,11,7,9,10,5,6}, {9,12,5,8,10,11,6,7}, {9,5,10,6,11,12,7,8},
{4,1,3,0,2}, {4,1,0,2,3}, {2,0,1,3,4}, {2,0,3,1,4},
{4,1,0,3,2}, {1,0,4,2,3}, {0,1,2,3,4}, {2,0,1,3,4},
},
},
[6]={ -- ALL_FRIENDLIES
text="all allies",
targets={
-- [source.type(environment|follower|encounter)]=targets
[-1]={-1}
[0]={0,1,2,3,4}
[1]={5,6,7,8,9,10,11,12}
},
},
[7]={ -- ALL_HOSTILES
text="all enemies",
targets={
-- [source.type(environment|follower|encounter)]=targets
[-1]={0,1,2,3,4}
[0]={5,6,7,8,9,10,11,12}
[1]={0,1,2,3,4}
},
},
[8]={ -- ALL_ADJACENT_FRIENDLIES (closest ally, then additional targets)
text="closest allies",
targets={
-- [source]={[target]=additionalTargets}
}
},
[9]={
text="closest enemies", -- ALL_ADJACENT_HOSTILES (closest enemy, then additional targets)
targets={
-- [source]={[target]=additionalTargets}
[0]={[5]=6, [10]={7,9,11}, [7]={9,11}, [9]=11, [8]=12},
[1]={[6]=7, [11]={8,10,12}, [8]={10,12}, [10]=12, [5]=9},
[2]={[5]=6, [9]=10, [7]=11, [8]=12},
[3]={[6]=7, [5]={9,10,11}, [10]={9,11}, [9]=11, [8]=12},
[4]={[7]=8, [6]={10,11,12}, [11]={10,12}, [10]=12, [5]=9}
[5]={[2]=nil, [0]=3, [1]=4},
[6]={[2]=3, [0]=nil, [1]=4},
[7]={[3]=4, [2]={0,1}, [0]=1},
[8]={[4]=nil, [3]=1, [2]=0},
[9]={[2]=nil, [3]=nil, [0]=nil, [1]=4},
[10]={[2]=nil, [3]=nil, [0]=1, [4]=nil},
[11]={[2]=3, [4]=nil, [0]=1},
[12]={[3]=4, [2]=nil, [0]=1},
},
},
[10]="closest cone of allies", -- CONE_FRIENDLIES (closest ally, then cone selection) #Note: All known cases are from encounters where the closest ally is in the back row with the cone targeting towards the back of the encounters side, so this just acts like closest ally for those
[11]="closest cone of enemies", -- CONE_HOSTILES (closest enemy, then cone selection)
[12]="closest column of allies", -- LINE_FRIENDLIES (closest ally, then column selection)
[13]="closest column of enemies", -- LINE_HOSTILES (closest enemy, then column selection) #Bug: Column does not work on followers, so this acts like closest enemy for encounters
[14]="frontmost row of allies", -- ALL_FRONT_ROW_FRIENDLIES (closest row with allies selection)
[15]="frontmost row of enemies", -- ALL_FRONT_ROW_HOSTILES (closest row with enemies selection)
[16]="backmost row of allies", -- ALL_BACK_ROW_FRIENDLIES (furthest row with allies selection)
[17]="backmost row of enemies", -- ALL_BACK_ROW_HOSTILES (furthest row with enemies selection)
[18]="all targets", -- ALL_TARGETS
[19]="random target", -- RANDOM_TARGET
[20]="random follower", -- RANDOM_ALLY
[21]="random encounter", -- RANDOM_ENEMY
[22]="all-other allies", -- ALL_FRIENDLIES_BUT_SELF
[23]="all followers", -- UNKNOWN
[24]="all encounters", -- UNKNOWN
}
VP switches up some of the target values, uses different names for others, and simply doesn't implement some that see no usage. The targeting logic it used for effect.target=9
is (now?) incorrect and has required changes, which are also reflected above. For VP I decided to rewrite the handling for this and use a single table of target values similar to the above, which ends up being the below:
{
-- #Mod-Start: Improve cleave targeting
[0x05]=6, [0x0a]={7,9,11}, [0x07]={9,11}, [0x09]=11, [0x08]=12,
[0x16]=7, [0x1b]={8,10,12}, [0x18]={10,12}, [0x1a]=12, [0x15]=9,
[0x25]=6, [0x29]=10, [0x27]=11, [0x28]=12,
[0x36]=7, [0x35]={9,10,11}, [0x3a]={9,11}, [0x39]=11, [0x38]=12,
[0x47]=8, [0x46]={10,11,12}, [0x4b]={10,12}, [0x4a]=12, [0x45]=9,
[0x52]=nil, [0x50]=3, [0x51]=4,
[0x62]=3, [0x60]=nil, [0x61]=4,
-- #Bug: [0x63]=2 is unused (VERIFIED)
-- #Fix: Remove [0x63] (VERIFIED)
-- #Bug: [0x61]=4 is missing (UNVERIFIED)
-- #Fix: Add [0x61]=4 (UNVERIFIED)
[0x73]=4, [0x72]={0,1}, [0x70]=1,
[0x84]=nil, [0x83]=1, [0x82]=0,
[0x92]=nil, [0x93]=nil, [0x90]=nil, [0x91]=4,
-- #Bug: [0x91]=4 is missing (VERIFIED)
-- #Fix: Add [0x91]=4 (VERIFIED)
[0xa2]=nil, [0xa3]=nil, [0xa0]=1, [0xa4]=nil,
-- #Bug: [0xa2]=3 is incorrect (VERIFIED)
-- #Fix: Change to [0xa2]=nil (VERIFIED)
-- #Bug: [0xa3]=2 is incorrect (UNVERIFIED)
-- #Fix: Change to [0xa3]=nil (UNVERIFIED)
-- #Bug: [0xa0]=1 is missing (UNVERIFIED)
-- #Fix: Add [0xa0]=1 (UNVERIFIED)
[0xb2]=3, [0xb4]=nil, [0xb0]=1,
-- #Bug: [0xb2]=3 is missing (VERIFIED)
-- #Fix: Add [0xb2]=3 (VERIFIED)
-- #Bug: [0xb3]=4 is incorrect (VERIFIED)
-- #Fix: Remove [0xb3] (VERIFIED)
-- #Bug: [0xb4]=3 is incorrect (VERIFIED)
-- #Fix: Remove [0xb4] (VERIFIED)
-- #Bug: [0xb0]=1 is missing (VERIFIED)
-- #Fix: Add [0xb0]=1 (VERIFIED)
[0xc3]=4, [0xc2]=nil, [0xc0]=1,
-- #Bug: [0xc3]=4 is missing (VERIFIED)
-- #Fix: Add [0xc3]=4 (VERIFIED)
-- #Bug: [0xc0]=1 is missing (VERIFIED)
-- #Fix: Add [0xc0]=1 (VERIFIED)
-- #Mod-End: Improve cleave targeting
}
Effect.Types and Effect.Flags can change the behaviour of Effect.Points as described below.
When Effect.Flags doesn't have 2^0 -- USE_ATTACK_FOR_POINTS
:
{
[0]="Do nothing to", -- NONE (effect.points unused)
[1]="Damage", -- DAMAGE (effect.points)
[2]="Heal", -- HEAL (effect.points)
[3]="Damage", -- DAMAGE_PCT (effect.points as %)
[4]="Heal", -- HEAL_PCT (effect.points as %)
[5]="Damage (tick)", -- DOT (effect.points)
[6]="Heal (tick)", -- HOT (effect.points)
[7]="Damage (tick)", -- DOT_PCT (effect.points as %)
[8]="Heal (tick)", -- HOT_PCT (effect.points as %)
[9]="Taunt", -- TAUNT (effect.points unused)
[10]="Detaunt", -- DETAUNT (effect.points unused)
[11]="Mod damage done of", -- MOD_DAMAGE_DONE (effect.points)
[12]="Mod damage done of", -- MOD_DAMAGE_DONE_PCT (effect.points as %)
[13]="Mod damage taken of", -- MOD_DAMAGE_TAKEN (effect.points)
[14]="Mod damage taken of", -- MOD_DAMAGE_TAKEN_PCT (effect.points as %)
[15]="Damage attacker of", -- DEAL_DAMAGE_TO_ATTACKER (effect.points)
[16]="Damage attacker of", -- DEAL_DAMAGE_TO_ATTACKER_PCT (effect.points as %)
[17]="Mod max health of", -- INCREASE_MAX_HEALTH (effect.points)
[18]="Mod max health of", -- INCREASE_MAX_HEALTH_PCT (effect.points as %)
[19]="Mod damage done of", -- MOD_DAMAGE_DONE_PCT_OF_FLAT (effect.points as %)
[20]="Mod damage taken of" -- MOD_DAMAGE_TAKEN_PCT_OF_FLAT (effect.points as %)
}
When Effect.Flags has 2^0 -- USE_ATTACK_FOR_POINTS
:
{
[0]="Do nothing to", -- NONE (effect.points unused)
[1]="Damage", -- DAMAGE (use source.attack instead)
[2]="Heal", -- HEAL (use source.attack instead)
[3]="Damage", -- DAMAGE_PCT (effect.points*source.attack)
[4]="Heal", -- HEAL_PCT (effect.points*source.attack)
[5]="Damage (tick)", -- DOT (use source.attack instead)
[6]="Heal (tick)", -- HOT (use source.attack instead)
[7]="Damage (tick)", -- DOT_PCT (effect.points*source.attack)
[8]="Heal (tick)", -- HOT_PCT (effect.points*source.attack)
[9]="Taunt", -- TAUNT (effect.points unused)
[10]="Detaunt", -- DETAUNT (effect.points unused)
[11]="Mod damage done of", -- MOD_DAMAGE_DONE (use source.attack instead)
[12]="Mod damage done of", -- MOD_DAMAGE_DONE_PCT (effect.points as %)
[13]="Mod damage taken of", -- MOD_DAMAGE_TAKEN (use source.attack instead)
[14]="Mod damage taken of", -- MOD_DAMAGE_TAKEN_PCT (effect.points as %)
[15]="Damage attacker of", -- DEAL_DAMAGE_TO_ATTACKER (use source.attack instead)
[16]="Damage attacker of", -- DEAL_DAMAGE_TO_ATTACKER_PCT (effect.points*source.attack)
[17]="Mod max health of", -- INCREASE_MAX_HEALTH (use source.attack instead)
[18]="Mod max health of", -- INCREASE_MAX_HEALTH_PCT (effect.points*source.attack)
[19]="Mod damage done of", -- MOD_DAMAGE_DONE_PCT_OF_FLAT (effect.points*source.attack)
[20]="Mod damage taken of" -- MOD_DAMAGE_TAKEN_PCT_OF_FLAT (effect.points*source.attack)
}
As you can see, Effect.Type 19 and 20 only exist because 12 and 14 ignore this flag in the game.
I've implemented this logic as a pair of functions. The first mutates the effect with the correct flags value when first processing the spell effect info, and second returns a new effect with the correct effect.type and effect.points values whenever it is cast:
{
[2^0]={ -- USE_ATTACK_FOR_POINTS
info=function (spell,effect)
if effect.type == 12 or effect.type == 14 then
effect.flags = bit.band(effect.flags,bit.bnot(2^0)) -- Flag is never used
if effect.flags = 0 then effect.flags = nil end
end
end,
cast=function (spell,effect,source,target)
e = {}
for k, v in pairs(effect)
e[k] = v
end
if e.type == 1 or e.type == 2 or e.type == 5 or e.type == 11 or e.type == 13 e.type == 6 or e.type == 15 then
e.points = source.attack -- Points is the source's attack
else
e.points = e.points*source.attack -- Points is modified by the source's attack
end
return e
end,
},
-- ...
}
Below is the current list of missions logs required for verification of spells:
{
-- No missions currently required
}
This same list is implemented in VP (modified) to indicate which missions should be marked with a warning as they need verification, and also cause a report to be saved when completed, regardless of outcome or sim accuracy.
Hi there, first off, just wanna say a big thank you for picking up the mantle to continue where Venture Plan has left off.
With that being said, I think there has been a frequent request (amongst my friends and guild at least) for Venture Plan to have a button to auto assign / simulate and do multiple missions. So I reckon I would post it here because the best time for development requests is early in the development cycle.
For eg. I would like to do all gold missions and anima missions while skipping certain ones like experience or enchanting mats ones. Not sure if doing All missions is feasible given the complexity in calculating all combinations, but perhaps certain favourited categories could be automated.
Once again, thank you and good luck with the new addon. Really looking forward to it. Cheers.
Do you still need these logs you listed in last issue for verification?
I have a character that doesn't finish any campaign yet(but followers are too weak to do many of them)
Here are two logs you listed
logs.txt
[2261]
[2262]
Due to a lack of autoCombatant
data for followers from the game's API, role based selection of auto-attack spellID
is an optimal solution; however, there are some cases where a using a follower's role
to determine the auto-attack spellID
would result in the wrong spellID
being selected.
The list of cases where this occurs can be obtained by filtering GarrAutoCombatant for:
AttackSpellID=11
& Role=2|3|4
AttackSpellID=15
& Role=1|5
AttackSpellID
or Role
are any other values can be ignored, as this will be environments, encounters, or unused test followers)id
for each can be obtained by doing a foreign key search of GarrAutoCombatant::ID
as GarrFollower::AutoCombatantID
, and noting the corresponding GarrFollower::ID
I've decided to handle this using the combination of the follower id
and role
as a key, with the value being the correct spellID
. This means if the role
ever changes, then the override will not be used. It also allows me to more directly see which followers are actually being overridden.
Below is the current implementation of this.
{
-- ["id-role"] = spellID
["1212-4"] = 11, -- [UNUSED] [1212] Anjali, with role [4] Heal/Support, has [11] Auto Attack
["1239-2"] = 11, -- [UNUSED] [1239] Venthyr Soulcaster, with role [2] Ranged (Physical), has [11] Auto Attack
["1243-2"] = 11, -- [UNUSED] [1243] Maldraxxus Plaguesinger, with role [2] Ranged (Physical), has [11] Auto Attack
["1248-2"] = 11, -- [UNUSED] [1248] Venthyr Soulcaster, with role [2] Ranged (Physical), has [11] Auto Attack
["1249-2"] = 11, -- [UNUSED] [1249] Venthyr Soulcaster, with role [2] Ranged (Physical), has [11] Auto Attack
["1258-4"] = 11, -- [1258] Mikanikos, with role [4] Heal/Support, has [11] Auto Attack
["1311-4"] = 11, -- [1311] Ashraka, with role [4] Heal/Support, has [11] Auto Attack
["1314-2"] = 11, -- [UNUSED] [1314] Maldraxxus Plaguesinger, with role [2] Ranged (Physical), has [11] Auto Attack
["1315-2"] = 11, -- [UNUSED] [1315] Maldraxxus Plaguesinger, with role [2] Ranged (Physical), has [11] Auto Attack
["1323-2"] = 11, -- [1323] Venthyr Soulcaster, with role [2] Ranged (Physical), has [11] Auto Attack
["1324-2"] = 11, -- [1324] Maldraxxus Plaguesinger, with role [2] Ranged (Physical), has [11] Auto Attack
["1327-4"] = 11, -- [1327] Ella, with role [4] Heal/Support, has [11] Auto Attack
["1338-4"] = 11, -- [1338] Elwyn, with role [4] Heal/Support, has [11] Auto Attack
["1340-4"] = 11, -- [UNUSED] [1340] Ella, with role [4] Heal/Support, has [11] Auto Attack
["1342-4"] = 11, -- [1342] Cromas the Mystic, with role [4] Heal/Support, has [11] Auto Attack
["1345-4"] = 11, -- [1345] Chachi the Artiste, with role [4] Heal/Support, has [11] Auto Attack
}
For verification with VP (modified), this is implemented as:
{[57]=0, [181]=0, [341]=0, [777]=0, [1213]=0, [1225]=0, [1237]=0, [1257]=0, [1301]=0} -- #Mod: Improve auto attack overrides
-- #Bug: [1212] Anjali, with role [4] Heal/Support, has [11] Auto Attack [UNUSED]
-- #Fix: Add [57]=0 [UNUSED]
-- #Bug: [(1239,1248,1249,)1323] Venthyr Soulcaster, with role [2] Ranged (Physical), has [11] Auto Attack [UNVERIFIED]
-- #Fix: Add [181]=0 [UNVERIFIED]
-- #Bug: [1258] Mikanikos, with role [4] Heal/Support, has [11] Auto Attack [VERIFIED]
-- #Fix: Add [341]=0 [VERIFIED]
-- #Bug: [1311] Ashraka, with role [4] Heal/Support, has [11] Auto Attack [UNVERIFIED]
-- #Fix: Add [777]=0 [UNVERIFIED]
-- #Bug: [(1243,1314,1315,)1324] Maldraxxus Plaguesinger, with role [2] Ranged (Physical), has [11] Auto Attack [UNVERIFIED]
-- #Fix: Add [1213]=0 [UNVERIFIED]
-- #Bug: [1338] Elwyn, with role [4] Heal/Support, has [11] Auto Attack [VERIFIED]
-- #Fix: Add [1225]=0 [VERIFIED]
-- #Bug: [1327(,1340)] Ella, with role [4] Heal/Support, has [11] Auto Attack [VERIFIED]
-- #Fix: Add [1237]=0 [VERIFIED]
-- #Bug: [1342] Cromas the Mystic, with role [4] Heal/Support, has [11] Auto Attack [VERIFIED]
-- #Fix: Add [1257]=0 [VERIFIED]
-- #Bug: [1345] Chachi the Artiste, with role [4] Heal/Support, has [11] Auto Attack [UNVERIFIED]
-- #Fix: Add [1301]=0 [UNVERIFIED]
logs.txt
I've added a table you listed in #2 to collect these logs
By the way,
It seems that the spell 9 works well in sim using the key healPercent
,
which you said it should be healPerc
in this issue
I've checked the source code in vs.lua.
Surprisingly,it uses healPercent
in heal(spell 9) but healPerc
in aura(spell 10).
Perhaps you have modified them to a same key before the last valid version because it's so strange to use two different keys to implement the same function
logs.txt
logs_2.txt
some of these you may not interest in because they are not filtered
covers 4 or 5 missions not verified
logs.txt
(2171)
(2177)
(2178)
(2180)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.