show degrading statline
This commit is contained in:
@@ -297,6 +297,8 @@ const getPrimaryColor = (catalog) => {
|
|||||||
return "#44264C";
|
return "#44264C";
|
||||||
case "Ynnari":
|
case "Ynnari":
|
||||||
return "#536766";
|
return "#536766";
|
||||||
|
case "Leagues of Votann":
|
||||||
|
return "#7d4c08";
|
||||||
default:
|
default:
|
||||||
console.log(catalog);
|
console.log(catalog);
|
||||||
return "#536766";
|
return "#536766";
|
||||||
|
|||||||
+12
-36
@@ -376,22 +376,6 @@ const ModelStats = ({
|
|||||||
model.replaceAll(name, "")
|
model.replaceAll(name, "")
|
||||||
);
|
);
|
||||||
|
|
||||||
const degradingStuff = [];
|
|
||||||
const bsChange = Math.abs(parseInt(modelStats[0].bs, 10) - parseInt(bs, 10));
|
|
||||||
if (bsChange > 0) {
|
|
||||||
degradingStuff.push(`${bsChange} from the balistic skill`);
|
|
||||||
}
|
|
||||||
const wsChange = Math.abs(parseInt(modelStats[0].ws, 10) - parseInt(ws, 10));
|
|
||||||
if (wsChange > 0) {
|
|
||||||
degradingStuff.push(`${wsChange} from the weapon skill`);
|
|
||||||
}
|
|
||||||
const attacksChange = Math.abs(
|
|
||||||
parseInt(modelStats[0].attacks, 10) - parseInt(attacks, 10)
|
|
||||||
);
|
|
||||||
if (attacksChange > 0) {
|
|
||||||
degradingStuff.push(`${attacksChange} from the number of attacks`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{ display: "flex", gap: 16, alignItems: "center" }}>
|
<div style={{ display: "flex", gap: 16, alignItems: "center" }}>
|
||||||
<Characteristic title="M" characteristic={move} index={index} />
|
<Characteristic title="M" characteristic={move} index={index} />
|
||||||
@@ -424,19 +408,6 @@ const ModelStats = ({
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{degradingStuff.length > 0 && (
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
whiteSpace: "normal",
|
|
||||||
marginLeft: -10,
|
|
||||||
fontSize: "0.7em",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{`Each time this model makes
|
|
||||||
an attack, subtract
|
|
||||||
${degradingStuff.join(" and ")}.`}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -475,9 +446,6 @@ const FactionIcon = ({ catalog }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const Keywords = ({ keywords }) => {
|
const Keywords = ({ keywords }) => {
|
||||||
keywords = Array.from(keywords).filter(
|
|
||||||
(keyword) => keyword !== "Configuration"
|
|
||||||
);
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
@@ -556,6 +524,10 @@ const Rules = ({ rules }) => {
|
|||||||
|
|
||||||
const Abilities = ({ abilities }) => {
|
const Abilities = ({ abilities }) => {
|
||||||
if (!abilities) return null;
|
if (!abilities) return null;
|
||||||
|
let keys = [...abilities.keys()];
|
||||||
|
keys = keys.filter(
|
||||||
|
(key) => key !== "Stratagem: Warlord Trait" && key !== "Stratagem: Relic"
|
||||||
|
);
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
@@ -567,7 +539,7 @@ const Abilities = ({ abilities }) => {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{abilities &&
|
{abilities &&
|
||||||
[...abilities.keys()].map((ability) => (
|
keys.map((ability) => (
|
||||||
<div
|
<div
|
||||||
key={ability}
|
key={ability}
|
||||||
style={{
|
style={{
|
||||||
@@ -640,10 +612,10 @@ const Psykers = ({ title, psykers }) => {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<th style={{ textAlign: "left" }}>PSYKER</th>
|
<th style={{ textAlign: "left" }}>PSYKER</th>
|
||||||
<th>Cast</th>
|
<th>CAST</th>
|
||||||
<th>Deny</th>
|
<th>DENY</th>
|
||||||
<th style={{ textAlign: "left", width: "100%" }} colSpan="4">
|
<th style={{ textAlign: "left", width: "100%" }} colSpan="4">
|
||||||
Powers Known
|
POWERS KNOWN
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@@ -845,6 +817,10 @@ const ForceRules = ({ rules, onePerPage }) => {
|
|||||||
"Melta X",
|
"Melta X",
|
||||||
"Each time an attack made with this weapon targets a unit within half range, that attack's Damagae characteristic is increased by the amount denotex by 'X'."
|
"Each time an attack made with this weapon targets a unit within half range, that attack's Damagae characteristic is increased by the amount denotex by 'X'."
|
||||||
);
|
);
|
||||||
|
rules.set(
|
||||||
|
"Lethal Hits",
|
||||||
|
"Each time an attack is made with this weapon profile, an unmodified hit roll of 6 automatically wounds the target."
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
|
|||||||
+27
-5
@@ -56,8 +56,8 @@ const Weapon = ({ weapon, modelStats, isMelee, className }) => {
|
|||||||
const attacks = type.substring(lastWhiteSpace + 1);
|
const attacks = type.substring(lastWhiteSpace + 1);
|
||||||
type = type.substring(0, lastWhiteSpace);
|
type = type.substring(0, lastWhiteSpace);
|
||||||
|
|
||||||
const bs = modelStats[0].bs;
|
let bs = modelStats.map((modelStat) => modelStat.bs);
|
||||||
let ws = modelStats[0].ws;
|
let ws = modelStats.map((modelStat) => modelStat.ws);
|
||||||
const strModel = modelStats[0].str;
|
const strModel = modelStats[0].str;
|
||||||
let meleeAttacks = modelStats.map((modelStat) => modelStat.attacks);
|
let meleeAttacks = modelStats.map((modelStat) => modelStat.attacks);
|
||||||
|
|
||||||
@@ -138,6 +138,12 @@ const Weapon = ({ weapon, modelStats, isMelee, className }) => {
|
|||||||
],
|
],
|
||||||
"Melta 4"
|
"Melta 4"
|
||||||
);
|
);
|
||||||
|
replaceAbilityWithType(
|
||||||
|
[
|
||||||
|
"Each time an attack is made with this weapon profile, an unmodified hit roll of 6 automatically wounds the target.",
|
||||||
|
],
|
||||||
|
"Lethal Hits"
|
||||||
|
);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
abilities?.includes(
|
abilities?.includes(
|
||||||
@@ -177,7 +183,7 @@ const Weapon = ({ weapon, modelStats, isMelee, className }) => {
|
|||||||
"When attacking with this weapon, you must subtract 1 from the hit rolls.",
|
"When attacking with this weapon, you must subtract 1 from the hit rolls.",
|
||||||
""
|
""
|
||||||
);
|
);
|
||||||
ws = `${parseInt(ws, 10) + 1}+`;
|
ws = ws.map((ws) => `${parseInt(ws, 10) + 1}+`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -237,6 +243,12 @@ const Weapon = ({ weapon, modelStats, isMelee, className }) => {
|
|||||||
if (meleeAttacks.every((meleeAttack) => meleeAttack === meleeAttacks[0])) {
|
if (meleeAttacks.every((meleeAttack) => meleeAttack === meleeAttacks[0])) {
|
||||||
meleeAttacks = meleeAttacks[0];
|
meleeAttacks = meleeAttacks[0];
|
||||||
}
|
}
|
||||||
|
if (bs.every((b) => b === bs[0])) {
|
||||||
|
bs = bs[0];
|
||||||
|
}
|
||||||
|
if (ws.every((w) => w === ws[0])) {
|
||||||
|
ws = ws[0];
|
||||||
|
}
|
||||||
|
|
||||||
name = name.replaceAll(" (Shooting)", "").replaceAll(" (Melee)", "");
|
name = name.replaceAll(" (Shooting)", "").replaceAll(" (Melee)", "");
|
||||||
|
|
||||||
@@ -256,7 +268,9 @@ const Weapon = ({ weapon, modelStats, isMelee, className }) => {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{differentProfiles && selectionName + " - "}
|
{differentProfiles && selectionName + " - "}
|
||||||
{differentProfiles ? name.replaceAll(selectionName, "") : name}
|
{differentProfiles
|
||||||
|
? name.replaceAll(selectionName, "").replaceAll(", ", "")
|
||||||
|
: name}
|
||||||
{type && (
|
{type && (
|
||||||
<span
|
<span
|
||||||
style={{
|
style={{
|
||||||
@@ -279,7 +293,15 @@ const Weapon = ({ weapon, modelStats, isMelee, className }) => {
|
|||||||
: meleeAttacks
|
: meleeAttacks
|
||||||
: attacks}
|
: attacks}
|
||||||
</td>
|
</td>
|
||||||
<td>{isMelee ? ws : bs}</td>
|
<td>
|
||||||
|
{isMelee
|
||||||
|
? ws.join
|
||||||
|
? ws.join("|")
|
||||||
|
: ws
|
||||||
|
: bs.join
|
||||||
|
? bs.join("|")
|
||||||
|
: bs}
|
||||||
|
</td>
|
||||||
<td>{calculateWeaponStrength(strModel, str)}</td>
|
<td>{calculateWeaponStrength(strModel, str)}</td>
|
||||||
<td>{ap}</td>
|
<td>{ap}</td>
|
||||||
<td>{damage}</td>
|
<td>{damage}</td>
|
||||||
|
|||||||
+1
-1
@@ -72,7 +72,7 @@ button:focus-visible {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
padding: var(--size-24) var(--size-20);
|
padding: var(--size-24) var(--size-20);
|
||||||
max-width: 1100px;
|
max-width: 1150px;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user