This is an elaborate napkin math machine, designed to estimate highest possible damage
per second against a sandbag for a given adventurer.
The source code can be found here: https://github.com/dl-stuff/dl
The affliction is considered [uptime]% effective for the entire duration of the
1 stack of the entered buff/debuff is active for the entire duration of the simulation.
Wyrmprints with the same ability are automatically swapped for the best option in terms
stats and value, as long as any affinities are preserved.
For personal damage, the average DPS of a ±5s window is calculated around each time
For team DPS, each point represents a time where the team DPS % changes.
All halidom and weapon bonuses are included, encyclopedia bonuses excluded.
Whenever a simulation is ran, the server will compare the result with the highest
DPS/Team DPS, and store the setup if it is better.
For personal/affliction, team DPS is not considered. Likewise for team DPS, only the
buff % is considered.
Since these setups are crowdsourced, no guarentee is made on any one of them being
and you are encouraged to try for bigger numbers.
Open an issue here, or ask me on
Note: this guide assumes you are familiar with Dragalia Lost’s gameplay and concepts.
ACL (Action Condition Language) is a language used to instruct the DPS simulator what actions to perform under which conditions. As you can guess, the language consists of two parts: Actions and Conditions.
Like most scripting languages, it will follow exactly what was written, in the order it was written. It will read each line in order (top to bottom), and execute the first action it sees whose conditions are true. Once an action is performed, it will once again start reading the ACL from top to bottom, and repeats until the simulation ends.
You can also control the dragon during shapeshift similarly in the lower text box
As mentioned earlier, each line consists of 1 action, and, optionally, one or more conditions.If the condition(s) is/are true, it will perform the action in question.
Each line for an action follows the above structure:
Backtick (`) + action + comma (,) + condition
Backtick is a decorator and is there mostly for historical reasons. The action line works with or without it.
Action is whatever action you want to be executed (skill, dragon, force strike, etc)
Comma is there for the simulator to know the upcoming syntax are conditions for the action on the same line
Condition is the requirement that needs to be met before being allowed to perform the action. It can be one or more condition
A list of actions and conditions is in the next section, but most terms in the following example should be fairly obvious.
`dragon`s3, not buff(s3)`s1`s2`s4, fsc`fs, x=4
In the above example, the simulator checks the following in order:
Following our example ACL with the Prince as our adventurer, the output is as follows:
c4fs*2 [s1] c3 [s3-1] c4fs c3 [s1] c1 [s2] c4fs [s4] c4fs [s1] c1 [dshift] [drg:c3 s1 c3 c3 c2 s1] c4fs*2 [s1]
This is a fairly straightforward ACL. It has two skills (s1 and s2) that will be used as soon as they are ready, and two skills that will be used if certain conditions are met (s3 if no s3 buff is active, and s4 if the last action was a force strike).
This example has a combination of actions and conditions that are more complex compared to the earlier example.
`dragon, s=1 and buff(s2)`s3, not buff(s3)`s2, charged_in(5, s1)`s1`s4, xf`fs, charged_in(fs, s1) and xf>1`fsf, xf=5
In this example, we are following Gala Luca's ACL, which is a bit more complex than the previous example. If you are unfamiliar with his kit, I highly recommend you familiarize yourself with his kit on the wiki before proceeding.
In this ACL, the following checks happen in order:
With the above ACL, the actions it outputs is below:
c5*2 [s3-1] c2 [s1] c5 [s2] c5 [s1] c1 [s4] c5 c3 [s2] c3fs [s1] c5*2 [s2] c2 [s1] c4 [s4] c5 c2fs [s1]
You can see skill 2 is being saved for whenever skill 1 will be ready in 5 uninterrupted combo attacks or less. Skill 4 is used after a combo attack and not immediately after the skill 1.
s1 and s2 are the adventurer’s skills. s3 is the weapon skill or shared skill slot. s4 is the second shared skill slot.
ds1 and ds2 are for dragon skills.
Dragon is for shapeshifting. Once shapeshifted, simulator will follow the dragon ACL instead. This applies to all mechanics the alter shapeshifting behavior (dragondrive, divine dragon, etc)
Perform a force strike. dfs is for dragons that can perform a Dragon Force Strike.
This will simulate a screen press that activates the force strike charging period, but is short enough to fail or cancel the charging. It can be used to end the current tap combo animation so that it can be restarted.
This will simulate a dodge. This is usually used to end the current animation (tap combo or force strike) so that you can start the next tap combo attack or action faster
This ends the shapeshift. Note that there is a minimum time enforced for shapeshifting which increases with every shapeshift.
This will perform the action only after a combo attack or force strike’s end of animation.
`s1, x`s1, x=5`s1, x>2
This will perform the action only after a combo attack’s end of animation. You can also specify which combo attack it follows by using !=, =, >, =>, =<, or < to compare it against a number.
This will perform the action only after a force strike’s end of animation.
Similar to x but will perform the action on the first hit of the combo attack’s animation. For example, blade’s 5th combo attack hits twice. xf=5 will result in the action being executed on the first hit of the two hits. x=5 will do it after the second hit.
Like x, you can also specify which combo attack it follows by using !=, =, >, =>, =<, or < to compare it against a number.
Similar to fsc, but will perform the action on the first hit of the force strike’s animation. For example, dagger’s force strike animation hits 3 times. fscf will perform the action on the first hit of the animation.
Performs action if the previous action was the specified skill (s=x, where x is the number of the skill), or any skill (s)
sp returns the value of the SP cost of the skill in question. This is not usually used by itself.
charged returns the value of the current SP amount of the skill in question. You can compare it with a value with !=, =, >, =>, =<, or < to compare it against a number. The value ideally is a specified number or sp.
In the above example, you can perform skill 1 only if skill 1's skill bar is less than 50% by dividing the value of s1.sp by 2 (/2)
Checks if the skill is ready.
s2, charged_in(5, s1)fs, charged_in(fs, s1)
s2, charged_in(5, s1)
fs, charged_in(fs, s1)
Checks if the skill's remaining SP to be readied is equal to or less than the attack(s) specified.
Numbers means combo attacks (5 = the combined amount of SP combo attacks 1+2+3+4+5 would net you)fs means Force Strike. Different weapons have different SP values on FS.
`s2, prep`s3, prep and not buff(s3)
`s3, prep and not buff(s3)
Checks if all skills are charged/ready.
Returns the current phase of a skill with Skill Shift. The initial phase starts at zero (0, 1, 2)
`s2, not is_cd(s2, 0)
Checks if there is any cooldown in effect with the skill in question. Above example is used to check Gala Luca's strength amp cooldown on his skill 2.
Returns the current amount of Energy stacks.
Returns the current amount of Inspiration stacks.
`fs, xf=5 and speed()>1
Returns the value of the current attack rate. Max is 1.5 (50% attack rate).
Returns the value of the defense modifier on the target enemy.
`s1, have_buff(s1_res_down)`s3, have_buff(ds_sp_regen_zone) or x=5
`s3, have_buff(ds_sp_regen_zone) or x=5
Check if the buff with the given name is active. You can get the buff's name from the simulation logs.
`s1, timeleft(s4)>10`s1, buff(s1,0)<5
Returns the time remaining in seconds for the specified buff. If the skill has multiple buff effects, you can check by specifying the buff's ID in the second value.
`s1, buff(s3)`s1, buff(s2,1)
Checks if buff from specified skill is active. If the skill has multiple buff effects, you can check by specifying the buff's ID in the second value.
Returns the total number of buffs.
Counts the number of active buff zones
Returns the number of stacks the buff named in the parathesis has. In the above example, it is checking if Resilient Offense stack is at 3.
`s2, amp_lvl(team, 20000)`s1, amp_lvl(self)
`s2, amp_lvl(team, 20000)
Checks if the current amp level matches the values provided in the level and id fields. id field will default to strength amp if only the team value was provided. The following are the valid values for each field:
`s2, amp_timeleft(team, 20000)<10`s1, amp_timeleft(self)>10
`s2, amp_timeleft(team, 20000)<10
Returns the time remaining of the specified amp and level in seconds. id field will default to strength amp if only the team value was provided. The following are the valid values for each field:
`s2, hp>80`s4, hp>0 or x=5
`s4, hp>0 or x=5
Returns the current HP value as a percentage. Useful for cases where skills do more damage if HP is higher or lower.
`fs, hits=0`fs, x=4 or hits=3
`fs, x=4 or hits=3
Returns the current number of hits made as a number.
`s2, dshift_count>0`dragon, dshift_count>1 and s=1
`dragon, dshift_count>1 and s=1
This condition checks for the number of times you have shapeshifted.
Returns the amount your dragon gauge is filled as a number. 1000 is max for a normal dragon shapeshift. You can use this with Adventurers with Dragon Drive and similar mechanics as well.
`s2, aff(frostbite)`s4, not aff(poison)
`s4, not aff(poison)
Check if affliction with the given name is active.
`s1, aff_timeleft(stormlash)<3`dragon, aff_timeleft(shadowblight)>15
Returns the time remaining in seconds on the given affliction.
duration returns the simulation duration (default is 180 seconds)
now returns the amount time has passed within the simulation.
You can subtract duration with now to get the time remaining, which is useful if you want to use a skill during the last x amount of seconds of the simulation.
Coming soon: More conditions and character/dragon/mechanic specific actions and conditions