balance: increase skill values and stats across multiple cards

- Adjusted skill effect values (strike, pierce, counter, heal, etc.) to be ~20-50% higher per rarity/level
- Updated unit attack/health stats for several cards (e.g., Hive Queen, Carapace units) to match new power curve
- Improved draft UX in alternating mode by auto-scrolling to current section and caching section positions for smoother tween-based navigation
This commit is contained in:
Brian Fertig 2026-04-04 10:43:52 -06:00
parent 8b963d270e
commit 05ea5a1515
2 changed files with 150 additions and 111 deletions

View File

@ -393,7 +393,7 @@
"skills": [
{
"name": "strike",
"value": 4,
"value": 6,
"trigger": "preAttack"
}
]
@ -406,7 +406,7 @@
"skills": [
{
"name": "strike",
"value": 6,
"value": 9,
"trigger": "preAttack"
}
]
@ -419,7 +419,7 @@
"skills": [
{
"name": "strike",
"value": 10,
"value": 14,
"trigger": "preAttack"
}
]
@ -456,7 +456,7 @@
"skills": [
{
"name": "pierce",
"value": 2,
"value": 3,
"trigger": "preAttack"
}
]
@ -469,7 +469,7 @@
"skills": [
{
"name": "pierce",
"value": 2,
"value": 4,
"trigger": "preAttack"
}
]
@ -482,7 +482,7 @@
"skills": [
{
"name": "pierce",
"value": 3,
"value": 8,
"trigger": "preAttack"
}
]
@ -495,7 +495,7 @@
"skills": [
{
"name": "pierce",
"value": 5,
"value": 12,
"trigger": "preAttack"
}
]
@ -532,7 +532,7 @@
"skills": [
{
"name": "counter",
"value": 3,
"value": 4,
"trigger": "on_defend"
}
]
@ -545,7 +545,7 @@
"skills": [
{
"name": "counter",
"value": 5,
"value": 6,
"trigger": "on_defend"
}
]
@ -558,7 +558,7 @@
"skills": [
{
"name": "counter",
"value": 7,
"value": 9,
"trigger": "on_defend"
}
]
@ -571,7 +571,7 @@
"skills": [
{
"name": "counter",
"value": 10,
"value": 12,
"trigger": "on_defend"
}
]
@ -595,7 +595,7 @@
"skills": [
{
"name": "heal",
"value": 2,
"value": 3,
"trigger": "preBattle"
}
]
@ -608,7 +608,7 @@
"skills": [
{
"name": "heal",
"value": 3,
"value": 4,
"trigger": "preBattle"
}
]
@ -621,7 +621,7 @@
"skills": [
{
"name": "heal",
"value": 5,
"value": 7,
"trigger": "preBattle"
}
]
@ -634,7 +634,7 @@
"skills": [
{
"name": "heal",
"value": 7,
"value": 10,
"trigger": "preBattle"
}
]
@ -647,7 +647,7 @@
"skills": [
{
"name": "heal",
"value": 10,
"value": 14,
"trigger": "preBattle"
}
]
@ -697,7 +697,7 @@
"skills": [
{
"name": "legion",
"value": 3,
"value": 4,
"trigger": "preBattle"
}
]
@ -710,7 +710,7 @@
"skills": [
{
"name": "legion",
"value": 4,
"value": 5,
"trigger": "preBattle"
}
]
@ -723,7 +723,7 @@
"skills": [
{
"name": "legion",
"value": 5,
"value": 7,
"trigger": "preBattle"
}
]
@ -773,7 +773,7 @@
"skills": [
{
"name": "protect",
"value": 5,
"value": 6,
"trigger": "preBattle"
}
]
@ -786,7 +786,7 @@
"skills": [
{
"name": "protect",
"value": 7,
"value": 9,
"trigger": "preBattle"
}
]
@ -799,7 +799,7 @@
"skills": [
{
"name": "protect",
"value": 10,
"value": 12,
"trigger": "preBattle"
}
]
@ -816,23 +816,10 @@
"rarity": "rare",
"levels": [
{
"attack": 7,
"attack": 8,
"health": 12,
"armor": 0,
"delay": 1,
"skills": [
{
"name": "pierce",
"value": 3,
"trigger": "preAttack"
}
]
},
{
"attack": 11,
"health": 18,
"armor": 0,
"delay": 1,
"skills": [
{
"name": "pierce",
@ -842,22 +829,9 @@
]
},
{
"attack": 16,
"health": 27,
"armor": 1,
"delay": 1,
"skills": [
{
"name": "pierce",
"value": 7,
"trigger": "preAttack"
}
]
},
{
"attack": 24,
"health": 41,
"armor": 1,
"attack": 18,
"health": 18,
"armor": 0,
"delay": 1,
"skills": [
{
@ -868,14 +842,40 @@
]
},
{
"attack": 35,
"attack": 24,
"health": 27,
"armor": 1,
"delay": 1,
"skills": [
{
"name": "pierce",
"value": 17,
"trigger": "preAttack"
}
]
},
{
"attack": 32,
"health": 41,
"armor": 1,
"delay": 1,
"skills": [
{
"name": "pierce",
"value": 20,
"trigger": "preAttack"
}
]
},
{
"attack": 45,
"health": 61,
"armor": 2,
"delay": 1,
"skills": [
{
"name": "pierce",
"value": 15,
"value": 30,
"trigger": "preAttack"
}
]
@ -912,7 +912,7 @@
"skills": [
{
"name": "mortar",
"value": 9,
"value": 12,
"trigger": "preAttack"
}
]
@ -925,7 +925,7 @@
"skills": [
{
"name": "mortar",
"value": 14,
"value": 24,
"trigger": "preAttack"
}
]
@ -938,7 +938,7 @@
"skills": [
{
"name": "mortar",
"value": 20,
"value": 40,
"trigger": "preAttack"
}
]
@ -951,7 +951,7 @@
"skills": [
{
"name": "mortar",
"value": 30,
"value": 55,
"trigger": "preAttack"
}
]
@ -2365,7 +2365,7 @@
"skills": [
{
"name": "berserk",
"value": 2,
"value": 4,
"trigger": "on_attack"
}
]
@ -2378,7 +2378,7 @@
"skills": [
{
"name": "berserk",
"value": 3,
"value": 6,
"trigger": "on_attack"
}
]
@ -2391,7 +2391,7 @@
"skills": [
{
"name": "berserk",
"value": 5,
"value": 10,
"trigger": "on_attack"
}
]
@ -2504,7 +2504,7 @@
"skills": [
{
"name": "siege",
"value": 3,
"value": 4,
"trigger": "preBattle"
}
]
@ -2517,7 +2517,7 @@
"skills": [
{
"name": "siege",
"value": 5,
"value": 8,
"trigger": "preBattle"
}
]
@ -2530,7 +2530,7 @@
"skills": [
{
"name": "siege",
"value": 7,
"value": 14,
"trigger": "preBattle"
}
]
@ -2543,7 +2543,7 @@
"skills": [
{
"name": "siege",
"value": 10,
"value": 25,
"trigger": "preBattle"
}
]
@ -2669,7 +2669,7 @@
"skills": [
{
"name": "weaken",
"value": 2,
"value": 4,
"trigger": "preBattle"
}
]
@ -2682,7 +2682,7 @@
"skills": [
{
"name": "weaken",
"value": 3,
"value": 8,
"trigger": "preBattle"
}
]
@ -2695,7 +2695,7 @@
"skills": [
{
"name": "weaken",
"value": 5,
"value": 15,
"trigger": "preBattle"
}
]
@ -2833,7 +2833,7 @@
"skills": [
{
"name": "enfeeble",
"value": 3,
"value": 5,
"trigger": "preBattle"
}
]
@ -2846,7 +2846,7 @@
"skills": [
{
"name": "enfeeble",
"value": 5,
"value": 8,
"trigger": "preBattle"
}
]
@ -2859,7 +2859,7 @@
"skills": [
{
"name": "enfeeble",
"value": 7,
"value": 12,
"trigger": "preBattle"
}
]
@ -2872,7 +2872,7 @@
"skills": [
{
"name": "enfeeble",
"value": 10,
"value": 18,
"trigger": "preBattle"
}
]
@ -2922,7 +2922,7 @@
"skills": [
{
"name": "swipe",
"value": 2,
"value": 4,
"trigger": "preAttack"
}
]
@ -2935,7 +2935,7 @@
"skills": [
{
"name": "swipe",
"value": 3,
"value": 6,
"trigger": "preAttack"
}
]
@ -2948,7 +2948,7 @@
"skills": [
{
"name": "swipe",
"value": 5,
"value": 10,
"trigger": "preAttack"
}
]
@ -3008,7 +3008,7 @@
"skills": [
{
"name": "pierce",
"value": 2,
"value": 4,
"trigger": "preAttack"
},
{
@ -3026,7 +3026,7 @@
"skills": [
{
"name": "pierce",
"value": 3,
"value": 8,
"trigger": "preAttack"
},
{
@ -3044,7 +3044,7 @@
"skills": [
{
"name": "pierce",
"value": 5,
"value": 16,
"trigger": "preAttack"
},
{
@ -6323,7 +6323,7 @@
"skills": [
{
"name": "hive_link",
"value": 10,
"value": 12,
"trigger": "passive"
}
]
@ -6360,7 +6360,7 @@
"skills": [
{
"name": "carapace",
"value": 1,
"value": 2,
"trigger": "on_defend"
}
]
@ -6373,7 +6373,7 @@
"skills": [
{
"name": "carapace",
"value": 1,
"value": 3,
"trigger": "on_defend"
}
]
@ -6386,7 +6386,7 @@
"skills": [
{
"name": "carapace",
"value": 2,
"value": 6,
"trigger": "on_defend"
}
]
@ -6399,7 +6399,7 @@
"skills": [
{
"name": "carapace",
"value": 2,
"value": 10,
"trigger": "on_defend"
}
]
@ -6423,7 +6423,7 @@
"skills": [
{
"name": "venom",
"value": 1,
"value": 2,
"trigger": "on_attack"
}
]
@ -6436,7 +6436,7 @@
"skills": [
{
"name": "venom",
"value": 2,
"value": 4,
"trigger": "on_attack"
}
]
@ -6449,7 +6449,7 @@
"skills": [
{
"name": "venom",
"value": 3,
"value": 6,
"trigger": "on_attack"
}
]
@ -6462,7 +6462,7 @@
"skills": [
{
"name": "venom",
"value": 4,
"value": 8,
"trigger": "on_attack"
}
]
@ -6475,7 +6475,7 @@
"skills": [
{
"name": "venom",
"value": 5,
"value": 10,
"trigger": "on_attack"
}
]
@ -6525,7 +6525,7 @@
"skills": [
{
"name": "burrow",
"value": 2,
"value": 3,
"trigger": "passive"
}
]
@ -6538,7 +6538,7 @@
"skills": [
{
"name": "burrow",
"value": 3,
"value": 4,
"trigger": "passive"
}
]
@ -6551,7 +6551,7 @@
"skills": [
{
"name": "burrow",
"value": 3,
"value": 5,
"trigger": "passive"
}
]
@ -6568,7 +6568,7 @@
"rarity": "common",
"levels": [
{
"attack": 3,
"attack": 4,
"health": 13,
"armor": 2,
"delay": 0,
@ -6580,7 +6580,7 @@
]
},
{
"attack": 5,
"attack": 7,
"health": 20,
"armor": 3,
"delay": 0,
@ -6592,7 +6592,7 @@
]
},
{
"attack": 7,
"attack": 10,
"health": 29,
"armor": 4,
"delay": 0,
@ -6604,7 +6604,7 @@
]
},
{
"attack": 10,
"attack": 18,
"health": 44,
"armor": 6,
"delay": 0,
@ -6616,7 +6616,7 @@
]
},
{
"attack": 15,
"attack": 24,
"health": 66,
"armor": 9,
"delay": 0,
@ -6664,7 +6664,7 @@
"skills": [
{
"name": "counter",
"value": 3,
"value": 4,
"trigger": "on_defend"
},
{
@ -6682,12 +6682,12 @@
"skills": [
{
"name": "counter",
"value": 5,
"value": 8,
"trigger": "on_defend"
},
{
"name": "carapace",
"value": 1,
"value": 2,
"trigger": "on_defend"
}
]
@ -6700,12 +6700,12 @@
"skills": [
{
"name": "counter",
"value": 7,
"value": 10,
"trigger": "on_defend"
},
{
"name": "carapace",
"value": 2,
"value": 3,
"trigger": "on_defend"
}
]
@ -6718,12 +6718,12 @@
"skills": [
{
"name": "counter",
"value": 10,
"value": 15,
"trigger": "on_defend"
},
{
"name": "carapace",
"value": 2,
"value": 4,
"trigger": "on_defend"
}
]
@ -6853,7 +6853,7 @@
},
{
"name": "swarm",
"value": 1,
"value": 2,
"trigger": "preAttack"
}
]
@ -6871,7 +6871,7 @@
},
{
"name": "swarm",
"value": 2,
"value": 3,
"trigger": "preAttack"
}
]
@ -6889,7 +6889,7 @@
},
{
"name": "swarm",
"value": 3,
"value": 4,
"trigger": "preAttack"
}
]
@ -6907,7 +6907,7 @@
},
{
"name": "swarm",
"value": 5,
"value": 7,
"trigger": "preAttack"
}
]
@ -6925,7 +6925,7 @@
},
{
"name": "swarm",
"value": 7,
"value": 10,
"trigger": "preAttack"
}
]
@ -7182,7 +7182,7 @@
"skills": [
{
"name": "carapace",
"value": 2,
"value": 4,
"trigger": "on_defend"
},
{
@ -7200,7 +7200,7 @@
"skills": [
{
"name": "carapace",
"value": 3,
"value": 5,
"trigger": "on_defend"
},
{
@ -7218,7 +7218,7 @@
"skills": [
{
"name": "carapace",
"value": 3,
"value": 7,
"trigger": "on_defend"
},
{

View File

@ -76,6 +76,9 @@ export class SkirmishDraftScene extends Phaser.Scene {
this.aiRemainingPicks = { legendary: 0, epic: 0, rare: 0, common: 0 };
this.bannerGroup = [];
this.SCROLL_TOP = 80;
this.sectionYPositions = {};
this._lastScrolledSection = null;
this.scrollTween = null;
this._renderStatusBanner();
this._renderCardGrid();
@ -226,9 +229,14 @@ export class SkirmishDraftScene extends Phaser.Scene {
Commanders: '#ffd700', Legendary: '#ffaa00', Epic: '#bb66ff', Rare: '#6699ff', Common: '#999999'
};
if (this.isAlternatingDraft) this.sectionYPositions = {};
for (const section of sections) {
if (section.cards.length === 0) continue;
const sectionKey = section.costKey || 'commanders';
const sectionTopY = cursorY;
const sectionLabel = this.add.text(this.GRID_LEFT, cursorY, section.label, {
fontSize: '18px', color: rarityColors[section.label] || '#d4af37', fontFamily: 'Audiowide'
});
@ -410,6 +418,9 @@ export class SkirmishDraftScene extends Phaser.Scene {
const rows = Math.ceil(section.cards.length / this.COLS);
cursorY = startY + rows * this.CELL_H + 10;
if (this.isAlternatingDraft) {
this.sectionYPositions[sectionKey] = { top: sectionTopY, height: 30 + rows * this.CELL_H };
}
}
// Scrolling bounds
@ -427,6 +438,32 @@ export class SkirmishDraftScene extends Phaser.Scene {
this.scrollContainer.setMask(new Phaser.Display.Masks.GeometryMask(this, maskShape));
}
_scrollToActiveSection() {
if (!this.isAlternatingDraft) return;
const key = (this.draftState === 'PLAYER_COMMANDER' || this.draftState === 'AI_COMMANDER')
? 'commanders'
: (this.currentPhaseRarity || null);
if (!key || key === this._lastScrolledSection) return;
this._lastScrolledSection = key;
const info = this.sectionYPositions[key];
if (!info) return;
const visibleH = this.SCROLL_BOTTOM - this.SCROLL_TOP;
const sectionCenterY = info.top + info.height / 2;
const targetScrollY = Phaser.Math.Clamp(sectionCenterY - visibleH / 2, 0, this.maxScrollY);
if (this.scrollTween) { this.scrollTween.stop(); this.scrollTween = null; }
this.scrollTween = this.tweens.add({
targets: this,
scrollY: targetScrollY,
duration: 450,
ease: 'Cubic.easeInOut',
onUpdate: () => { if (this.scrollContainer) this.scrollContainer.y = -this.scrollY; },
onComplete: () => { this.scrollTween = null; }
});
}
_setupScrolling() {
this.input.on('wheel', (pointer, gameObjects, deltaX, deltaY) => {
if (pointer.x > 1320) return;
@ -1058,6 +1095,7 @@ export class SkirmishDraftScene extends Phaser.Scene {
this._renderStatusBanner();
this._renderCardGrid();
this._renderDualDeckPanel();
this._scrollToActiveSection();
}
}
@ -1066,6 +1104,7 @@ export class SkirmishDraftScene extends Phaser.Scene {
this._renderStatusBanner();
this._renderCardGrid();
this._renderDualDeckPanel();
this._scrollToActiveSection();
this.time.delayedCall(1500, () => {
if (!this.scene.isActive()) return;