Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ Known limits: boss mechanics, movement, deaths and crowd control are not simulat

Protection Warrior, Protection Paladin, Blood Death Knight, Guardian Druid, Brewmaster Monk and Vengeance Demon Hunter are detected on import. Every mode (Quick Sim, Enchant Lab, Gear Compare, Upgrade Finder, Crest Planner, Great Vault and Talent Search) then ranks results on DPS and survival.

**Tank Sim** has its own place in the menu: the imported tank against a boss and its adds, one simulation per fight you tick (the boss alone, the boss with 2 adds, the boss with 4 adds), with the numbers a tank cares about: damage taken per second and as a share of your health, healing and absorbs, how much of the fight you survive, how often you die, and your DPS. It needs a tank specialization. Tank Sim is a page of its own and is kept apart from the other simulations: its fights, fight style, duration, iterations, target error, CPU threads, raid buffs and consumables, boss and gear sources are all on the page, and the settings column the other modes share is not used. It can also **find gear** from three sources you switch on or off: the gear from your bags (read from the addon export, with the equipped gear always the baseline), upgrades with crests (each equipped item at every higher level of its track, within the crests you have), and loot from instances (Upgrade Finder's raid, Mythic+, Great Vault, delve and crafted sources, kept as a separate copy of its settings). Every candidate from all three is simulated in its slot in each fight you ticked and the best ones again at full precision, ranked on the survival and damage score. Each fight in the result shows what your current gear takes per second, how much of the fight it survives and how often it dies, then the gear that does better for that fight. With all three off it runs the fights alone.
**Tank Sim** has its own place in the menu: the imported tank against a boss and its adds, one simulation per fight you tick (the boss alone, the boss with 2 adds, the boss with 4 adds), with the numbers a tank cares about: damage taken per second and as a share of your health, healing and absorbs, how much of the fight you survive, how often you die, and your DPS. It needs a tank specialization. Tank Sim is a page of its own and is kept apart from the other simulations: its fights (always Patchwerk: the fights you tick are the whole description of the encounter), duration, iterations, target error, CPU threads, raid buffs and consumables, boss and gear sources are all on the page, and the settings column the other modes share is not used. It can also **find gear** from three sources you switch on or off: the gear from your bags (read from the addon export, with the equipped gear always the baseline), upgrades with crests (each equipped item at every higher level of its track, within the crests you have), and loot from instances (Upgrade Finder's raid, Mythic+, Great Vault, delve and crafted sources, kept as a separate copy of its settings). Every candidate from all three is simulated in its slot in each fight you ticked and the best ones again at full precision, ranked on the survival and damage score. Each fight in the result shows what your current gear takes per second, how much of the fight it survives and how often it dies, then the gear that does better for that fight. With all three off it runs the fights alone.

SimC's built-in tank dummy uses level-70 damage values and never threatens a Midnight tank, and SimC gives players infinite health by default. SimC Lab replaces it with a calibrated boss, tuned once per job against the imported gear and then shared by every variant and scenario:

Expand Down
4 changes: 2 additions & 2 deletions desktop/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "simc-lab",
"productName": "SimC Lab",
"desktopName": "simc-lab.desktop",
"version": "1.44.0",
"version": "1.44.1",
"description": "Local SimulationCraft workbench with upgrade finder and tank simulation.",
"author": "Roburmaster",
"private": true,
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "simc-lab",
"version": "1.44.0",
"version": "1.44.1",
"private": true,
"type": "module",
"scripts": {
Expand Down
7 changes: 3 additions & 4 deletions public/tanksim.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ export const fights=[
{id:'pack',label:'Boss + 2 adds',targets:3,note:'A small pack: two mobs swing at you for the whole fight on top of the boss.'},
{id:'pull',label:'Boss + 4 adds',targets:5,note:'A big pull: four mobs swing at you for the whole fight on top of the boss.'}
];
// Only the fight styles where the boss and its adds can attack a tank; the others have no one hitting you.
const styles=[['Patchwerk','Patchwerk · stationary'],['CastingPatchwerk','Casting Patchwerk · boss casts'],['LightMovement','Light movement'],['HeavyMovement','Heavy movement']];
// The fights above are the whole description of the encounter, so the style is not a choice: Patchwerk, a boss that stands
// still and swings. The other styles change nothing the tank's own boss does.
const style='Patchwerk';
const consumableKinds=[['flask','Flask'],['food','Food'],['potion','Potion'],['augmentation','Augment rune']];

// Tank Sim is a page of its own: its fights, its simulation settings, its buffs, its boss and its gear sources all live
Expand All @@ -26,7 +27,6 @@ export function tankSimUI({api,notice,updateCount,run,cancel}){
<div class="tank-sections">
<section class="tank-section"><h3>Fights</h3><p class="hint">Each fight is one simulation. Dungeon Slice, Hectic Add Cleave, the Mythic+ route and the dummies have no mobs that attack a tank, so they are not offered.</p><div class="upgrade-groups" id="tanksim-fights">${fights.map(f=>`<label class="check"><input type="checkbox" data-tanksim="${f.id}" ${f.id==='boss'||f.id==='pull'?'checked':''}><span>${esc(f.label)}<small class="hint"> · ${esc(f.note)}</small></span></label>`).join('')}</div></section>
<section class="tank-section"><h3>Simulation</h3><div class="tank-grid">
<label>Fight style<select id="tank-style">${styles.map(([value,label])=>`<option value="${value}">${esc(label)}</option>`).join('')}</select></label>
<label>Duration (sec)<input id="tank-duration" type="number" min="10" max="1200" value="300"></label>
<label>Iterations<select id="tank-iterations"><option value="1000">1 000 · quick test</option><option value="10000" selected>10 000 · standard</option><option value="50000">50 000 · high precision</option><option value="100000">100 000 · very high precision</option><option value="1000000">1 000 000 · maximum</option></select></label>
<label>Target error (%)<select id="tank-target-error"><option value="0">None · all iterations</option><option value="0.1" selected>0.10%</option><option value="0.05">0.05%</option><option value="0.02">0.02%</option></select></label>
Expand Down Expand Up @@ -91,7 +91,6 @@ export function tankSimUI({api,notice,updateCount,run,cancel}){
},
// Everything the server needs for a tank job except the character and the boss, which the page adds.
request(){
const style=$('#tank-style').value;
return {mode:'tank',iterations:Number($('#tank-iterations').value),targetError:Number($('#tank-target-error').value),duration:Number($('#tank-duration').value),threads:Number($('#tank-threads').value),
environment:environment(),scenarios:chosen().map(f=>({style,targets:f.targets})),tankGear:gear()};
},
Expand Down
Loading