bump mission rewards and add first-clear card logic

- Increased gold rewards for several Imperial missions to improve progression pacing.
- Reformatted `missions.json` for consistency (multi-line arrays).
- Set default starting gold to 300 in `SaveManager`.
- Implemented first-clear-only card rewards in `BattleScene`; subsequent wins grant gold but no duplicate cards.
- Added consolation gold (50% of mission reward) on defeat.
- Fixed `CollectionScene` input priority and improved terminal typing speed and line wrapping.
This commit is contained in:
Brian Fertig 2026-03-22 14:54:40 -06:00
parent 8b6ccba887
commit 739cf18603
9 changed files with 35 additions and 47 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

View File

@ -668,7 +668,7 @@
{
"name": "legion",
"value": 1,
"trigger": "passive"
"trigger": "preBattle"
}
]
},
@ -681,7 +681,7 @@
{
"name": "legion",
"value": 2,
"trigger": "passive"
"trigger": "preBattle"
}
]
},
@ -694,7 +694,7 @@
{
"name": "legion",
"value": 3,
"trigger": "passive"
"trigger": "preBattle"
}
]
},
@ -707,7 +707,7 @@
{
"name": "legion",
"value": 4,
"trigger": "passive"
"trigger": "preBattle"
}
]
},
@ -720,7 +720,7 @@
{
"name": "legion",
"value": 5,
"trigger": "passive"
"trigger": "preBattle"
}
]
}
@ -972,7 +972,7 @@
{
"name": "jam",
"value": 2,
"trigger": "on_attack"
"trigger": "preBattle"
},
{
"name": "protect",
@ -990,7 +990,7 @@
{
"name": "jam",
"value": 4,
"trigger": "on_attack"
"trigger": "preBattle"
},
{
"name": "protect",
@ -1008,7 +1008,7 @@
{
"name": "jam",
"value": 6,
"trigger": "on_attack"
"trigger": "preBattle"
},
{
"name": "protect",
@ -1026,7 +1026,7 @@
{
"name": "jam",
"value": 9,
"trigger": "on_attack"
"trigger": "preBattle"
},
{
"name": "protect",
@ -1044,7 +1044,7 @@
{
"name": "jam",
"value": 12,
"trigger": "on_attack"
"trigger": "preBattle"
},
{
"name": "protect",
@ -1457,7 +1457,7 @@
{
"name": "legion",
"value": 2,
"trigger": "passive"
"trigger": "preBattle"
},
{
"name": "heal",
@ -1475,7 +1475,7 @@
{
"name": "legion",
"value": 3,
"trigger": "passive"
"trigger": "preBattle"
},
{
"name": "heal",
@ -1493,7 +1493,7 @@
{
"name": "legion",
"value": 5,
"trigger": "passive"
"trigger": "preBattle"
},
{
"name": "heal",
@ -1511,7 +1511,7 @@
{
"name": "legion",
"value": 7,
"trigger": "passive"
"trigger": "preBattle"
},
{
"name": "heal",
@ -1529,7 +1529,7 @@
{
"name": "legion",
"value": 9,
"trigger": "passive"
"trigger": "preBattle"
},
{
"name": "heal",
@ -3753,7 +3753,7 @@
]
}
],
"flavorText": "He demands a tithe of blood from all — even himself.",
"flavorText": "He demands a tithe of blood from all \u2014 even himself.",
"artKey": "bt_bloodlord_1"
},
{

View File

@ -3802,6 +3802,8 @@ export class BattleScene extends Phaser.Scene {
}
_showResult() {
if (this._resultShown) return;
this._resultShown = true;
if (this.autoTimer) this.autoTimer.remove();
const { width, height } = this.scale;
const won = this.engine.winner === 'player';

View File

@ -14,6 +14,11 @@ export class BootScene extends Phaser.Scene {
// Load all JSON data files
this.load.image('vs', 'assets/images/ui/vs.png');
this.load.image('attacksFirst', 'assets/images/ui/attacksFirst.png');
this.load.image('card_back_imperial', 'assets/images/cards/card_back_imperial.png');
this.load.image('card_back_raider', 'assets/images/cards/card_back_raider.png');
this.load.image('card_back_bloodthirsty', 'assets/images/cards/card_back_bloodthirsty.png');
this.load.image('card_back_xeno', 'assets/images/cards/card_back_xeno.png');
this.load.image('card_back_right', 'assets/images/cards/card_back_right.png');
this.load.spritesheet('attacks', 'assets/images/spritesheets/attacks.png', { frameWidth: 460, frameHeight: 460 });
this.load.json('cards', 'data/cards.json');
this.load.json('packs', 'data/packs.json');

View File

@ -16,6 +16,14 @@ const RARITY_COLORS = {
legendary: 0xffaa00
};
const CARD_BACK_KEYS = {
imperial: 'card_back_imperial',
raider: 'card_back_raider',
bloodthirsty: 'card_back_bloodthirsty',
xeno: 'card_back_xeno',
righteous: 'card_back_right'
};
const FACTION_LABELS = {
imperial: 'IMPERIAL',
raider: 'RAIDER',
@ -272,37 +280,10 @@ export class StoreScene extends Phaser.Scene {
// Card back container
const backContainer = this.add.container(cx, cardY).setDepth(101);
// Back rectangle
const backRect = this.add.rectangle(0, 0, CARD_W, CARD_H, 0x1a1a2e)
.setStrokeStyle(3, factionColor);
backContainer.add(backRect);
// Cross-hatch pattern
const hatch = this.add.graphics();
const hatchAlpha = 0.15;
hatch.lineStyle(1, factionColor, hatchAlpha);
for (let d = -CARD_H; d < CARD_W + CARD_H; d += 18) {
hatch.lineBetween(
Math.max(-CARD_W / 2, d - CARD_H / 2), Math.max(-CARD_H / 2, -d + CARD_W / 2 - CARD_H),
Math.min(CARD_W / 2, d + CARD_H / 2), Math.min(CARD_H / 2, -d + CARD_W / 2 + CARD_H)
);
}
backContainer.add(hatch);
// Center emblem
const emblemCircle = this.add.circle(0, -15, 50, factionColor, 0.4)
.setStrokeStyle(3, factionColor, 0.8);
backContainer.add(emblemCircle);
const questionMark = this.add.text(0, -18, '?', {
fontSize: '52px', color: '#ffffff', fontFamily: 'RaiderCrusader'
}).setOrigin(0.5).setAlpha(0.7);
backContainer.add(questionMark);
// Faction label on back
const backLabel = this.add.text(0, 90, FACTION_LABELS[pack.faction] || '', {
fontSize: '16px', color: '#ffffff', fontFamily: 'Audiowide'
}).setOrigin(0.5).setAlpha(0.4);
backContainer.add(backLabel);
// Card back image
const backKey = CARD_BACK_KEYS[pack.faction] || 'card_back_imperial';
const backImg = this.add.image(0, 0, backKey).setDisplaySize(CARD_W, CARD_H);
backContainer.add(backImg);
// Special golden border
if (card._slotSpecial) {