Release Healer Man 0.1.50
This commit is contained in:
1 parent
717d12e5af
commit
79153ca40d
11 files changed
+89
-38
No files matched your search
+27
-15
@@ -320,7 +320,7 @@ def interactive_arguments(
|
||||
def weighted_rate(rows: Iterable[dict[str, Any]], amount: str) -> float:
|
||||
materialized = list(rows)
|
||||
seconds = sum(float(row["elapsedSeconds"]) for row in materialized)
|
||||
return sum(float(row[amount]) for row in materialized) / max(0.1, seconds)
|
||||
return sum(float(row.get(amount, 0)) for row in materialized) / max(0.1, seconds)
|
||||
|
||||
|
||||
def mean(values: Iterable[float]) -> float:
|
||||
@@ -402,9 +402,11 @@ def aggregate(raw: dict[str, Any]) -> dict[str, Any]:
|
||||
"dps": weighted_rate(rows, "damage"),
|
||||
"bossDps": weighted_rate(rows, "bossDamage"),
|
||||
"hps": weighted_rate(rows, "healing"),
|
||||
"hpsReceived": weighted_rate(rows, "healingReceived"),
|
||||
"dtps": weighted_rate(rows, "damageTaken"),
|
||||
"totalDamage": sum(row["damage"] for row in rows),
|
||||
"totalHealing": sum(row["healing"] for row in rows),
|
||||
"totalHealingReceived": sum(row.get("healingReceived", 0) for row in rows),
|
||||
"totalAbsorbs": sum(row["absorbs"] for row in rows),
|
||||
"deathEvents": sum(row["deathEvents"] for row in rows),
|
||||
"minimumHealthPercent": min(row["minimumHealthPercent"] for row in rows),
|
||||
@@ -435,6 +437,7 @@ def aggregate(raw: dict[str, Any]) -> dict[str, Any]:
|
||||
"dps": weighted_rate(rows, "damage"),
|
||||
"bossDps": weighted_rate(rows, "bossDamage"),
|
||||
"hps": weighted_rate(rows, "healing"),
|
||||
"hpsReceived": weighted_rate(rows, "healingReceived"),
|
||||
"dtps": weighted_rate(rows, "damageTaken"),
|
||||
"deathEvents": sum(row["deathEvents"] for row in rows),
|
||||
})
|
||||
@@ -520,15 +523,16 @@ def markdown_report(report: dict[str, Any]) -> str:
|
||||
"",
|
||||
"## Every party member",
|
||||
"",
|
||||
"| Slot | Member | Role | DPS | Boss DPS | HPS | DTPS | Role median | Flag | Death events |",
|
||||
"| ---: | --- | --- | ---: | ---: | ---: | ---: | ---: | --- | ---: |",
|
||||
"| Slot | Member | Role | DPS | Boss DPS | HPS done | HPS received | DTPS | Role median | Flag | Death events |",
|
||||
"| ---: | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | --- | ---: |",
|
||||
]
|
||||
for member in report["members"]:
|
||||
marker = " (active)" if member["activePlayer"] else ""
|
||||
lines.append(
|
||||
f"| {member['slot']} | {member['className']} — {member['specialization']}{marker} | "
|
||||
f"{member['role']} | {format_number(member['dps'])} | {format_number(member['bossDps'])} | "
|
||||
f"{format_number(member['hps'])} | {format_number(member['dtps'])} | "
|
||||
f"{format_number(member['hps'])} | {format_number(member['hpsReceived'])} | "
|
||||
f"{format_number(member['dtps'])} | "
|
||||
f"{format_ratio(member['damageVsRoleMedian'])} | {member['damageFlag']} | {member['deathEvents']} |"
|
||||
)
|
||||
lines.extend([
|
||||
@@ -592,12 +596,14 @@ def html_report(report: dict[str, Any]) -> str:
|
||||
"dps": format_number(row["dps"]),
|
||||
"bossDps": format_number(row["bossDps"]),
|
||||
"hps": format_number(row["hps"]),
|
||||
"hpsReceived": format_number(row["hpsReceived"]),
|
||||
"dtps": format_number(row["dtps"]),
|
||||
"damageVsRoleMedian": format_number(row["damageVsRoleMedian"], 2),
|
||||
} for row in report["members"]]
|
||||
member_table = html_table("members", "Every party member", members, (
|
||||
("slot", "Slot"), ("member", "Member"), ("role", "Role"), ("dps", "DPS"),
|
||||
("bossDps", "Boss DPS"), ("hps", "HPS"), ("dtps", "DTPS"),
|
||||
("bossDps", "Boss DPS"), ("hps", "HPS done"), ("hpsReceived", "HPS received"),
|
||||
("dtps", "DTPS"),
|
||||
("damageVsRoleMedian", "Role median ×"), ("damageFlag", "Flag"), ("deathEvents", "Death events"),
|
||||
))
|
||||
boss_table = html_table("bosses", "Every boss — highest pressure first", bosses, (
|
||||
@@ -639,12 +645,12 @@ def create_reports(raw_path: Path, output_dir: Path) -> dict[str, Any]:
|
||||
))
|
||||
write_csv(output_dir / "party_members.csv", report["members"], (
|
||||
"slot", "activePlayer", "classId", "className", "specialization", "role", "dps", "bossDps",
|
||||
"hps", "dtps", "damageVsRoleMedian", "damageFlag", "totalDamage", "totalHealing",
|
||||
"totalAbsorbs", "deathEvents", "minimumHealthPercent",
|
||||
"hps", "hpsReceived", "dtps", "damageVsRoleMedian", "damageFlag", "totalDamage", "totalHealing",
|
||||
"totalHealingReceived", "totalAbsorbs", "deathEvents", "minimumHealthPercent",
|
||||
))
|
||||
write_csv(output_dir / "member_by_boss.csv", report["memberByBoss"], (
|
||||
"bossKey", "bossName", "dungeonTitle", "slot", "className", "specialization", "role",
|
||||
"dps", "bossDps", "hps", "dtps", "deathEvents",
|
||||
"dps", "bossDps", "hps", "hpsReceived", "dtps", "deathEvents",
|
||||
))
|
||||
run_rows = [{
|
||||
"policyId": raw["policyId"],
|
||||
@@ -688,10 +694,12 @@ def aggregate_class_specs(
|
||||
"dps": weighted_rate(observations, "damage"),
|
||||
"bossDps": weighted_rate(observations, "bossDamage"),
|
||||
"hps": weighted_rate(observations, "healing"),
|
||||
"hpsReceived": weighted_rate(observations, "healingReceived"),
|
||||
"dtps": weighted_rate(observations, "damageTaken"),
|
||||
"totalDamage": sum(row["damage"] for row in observations),
|
||||
"totalDamageTaken": sum(row["damageTaken"] for row in observations),
|
||||
"totalHealing": sum(row["healing"] for row in observations),
|
||||
"totalHealingReceived": sum(row.get("healingReceived", 0) for row in observations),
|
||||
"totalAbsorbs": sum(row["absorbs"] for row in observations),
|
||||
"deathEvents": sum(row["deathEvents"] for row in observations),
|
||||
})
|
||||
@@ -805,14 +813,15 @@ def suite_markdown(report: dict[str, Any]) -> str:
|
||||
"",
|
||||
"## Every tested class/spec",
|
||||
"",
|
||||
"| Source | Class/spec | Role | Parties | Runs | DPS | Boss DPS | HPS | DTPS | Total taken | Role median | Flag | Deaths |",
|
||||
"| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | ---: |",
|
||||
"| Source | Class/spec | Role | Parties | Runs | DPS | Boss DPS | HPS done | HPS received | DTPS | Total taken | Role median | Flag | Deaths |",
|
||||
"| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | ---: |",
|
||||
]
|
||||
for row in report["classSpecs"]:
|
||||
lines.append(
|
||||
f"| {row['source']} | {row['className']} — {row['specialization']} | {row['role']} | "
|
||||
f"{row['partyConfigurations']} | {row['runs']} | {format_number(row['dps'])} | "
|
||||
f"{format_number(row['bossDps'])} | {format_number(row['hps'])} | {format_number(row['dtps'])} | "
|
||||
f"{format_number(row['bossDps'])} | {format_number(row['hps'])} | "
|
||||
f"{format_number(row['hpsReceived'])} | {format_number(row['dtps'])} | "
|
||||
f"{format_number(row['totalDamageTaken'])} | "
|
||||
f"{format_ratio(row['damageVsSourceRoleMedian'])} | {row['damageFlag']} | {row['deathEvents']} |"
|
||||
)
|
||||
@@ -873,6 +882,7 @@ def suite_html(report: dict[str, Any]) -> str:
|
||||
"dps": format_number(row["dps"]),
|
||||
"bossDps": format_number(row["bossDps"]),
|
||||
"hps": format_number(row["hps"]),
|
||||
"hpsReceived": format_number(row["hpsReceived"]),
|
||||
"dtps": format_number(row["dtps"]),
|
||||
"totalDamageTaken": format_number(row["totalDamageTaken"]),
|
||||
"damageVsSourceRoleMedian": format_ratio(row["damageVsSourceRoleMedian"]),
|
||||
@@ -911,7 +921,8 @@ def suite_html(report: dict[str, Any]) -> str:
|
||||
class_table = html_table("class-specs", "Every tested class/spec", class_specs, (
|
||||
("source", "Source"), ("classSpec", "Class/spec"), ("role", "Role"),
|
||||
("partyConfigurations", "Parties"), ("runs", "Runs"), ("dps", "DPS"),
|
||||
("bossDps", "Boss DPS"), ("hps", "HPS"), ("dtps", "DTPS"),
|
||||
("bossDps", "Boss DPS"), ("hps", "HPS done"), ("hpsReceived", "HPS received"),
|
||||
("dtps", "DTPS"),
|
||||
("totalDamageTaken", "Total taken"), ("damageVsSourceRoleMedian", "Role median"),
|
||||
("damageFlag", "Flag"), ("deathEvents", "Deaths"),
|
||||
))
|
||||
@@ -1064,6 +1075,7 @@ def create_suite_reports(entries: Sequence[dict[str, Any]], output_dir: Path, le
|
||||
"dps": weighted_rate(observations, "damage"),
|
||||
"bossDps": weighted_rate(observations, "bossDamage"),
|
||||
"hps": weighted_rate(observations, "healing"),
|
||||
"hpsReceived": weighted_rate(observations, "healingReceived"),
|
||||
"dtps": weighted_rate(observations, "damageTaken"),
|
||||
"totalDamageTaken": sum(row["damageTaken"] for row in observations),
|
||||
"deathEvents": sum(row["deathEvents"] for row in observations),
|
||||
@@ -1106,8 +1118,8 @@ def create_suite_reports(entries: Sequence[dict[str, Any]], output_dir: Path, le
|
||||
))
|
||||
write_csv(output_dir / "class_specs_across_parties.csv", class_specs, (
|
||||
"source", "buildId", "classId", "className", "specialization", "role", "partyConfigurations",
|
||||
"runs", "dps", "bossDps", "hps", "dtps", "damageVsSourceRoleMedian", "damageFlag",
|
||||
"totalDamage", "totalDamageTaken", "totalHealing", "totalAbsorbs", "deathEvents",
|
||||
"runs", "dps", "bossDps", "hps", "hpsReceived", "dtps", "damageVsSourceRoleMedian", "damageFlag",
|
||||
"totalDamage", "totalDamageTaken", "totalHealing", "totalHealingReceived", "totalAbsorbs", "deathEvents",
|
||||
))
|
||||
write_csv(output_dir / "class_abilities_across_parties.csv", class_abilities, (
|
||||
"source", "buildId", "classId", "className", "specialization", "role", "abilityId",
|
||||
@@ -1129,7 +1141,7 @@ def create_suite_reports(entries: Sequence[dict[str, Any]], output_dir: Path, le
|
||||
))
|
||||
write_csv(output_dir / "class_spec_by_boss.csv", class_spec_by_boss, (
|
||||
"source", "buildId", "classId", "className", "specialization", "role", "bossKey", "bossName",
|
||||
"dungeonTitle", "partyConfigurations", "runs", "dps", "bossDps", "hps", "dtps",
|
||||
"dungeonTitle", "partyConfigurations", "runs", "dps", "bossDps", "hps", "hpsReceived", "dtps",
|
||||
"totalDamageTaken", "deathEvents",
|
||||
))
|
||||
write_csv(output_dir / "suite_runs.csv", compact_runs, (
|
||||
|
||||
Reference in new issue
Block a user