btl
Browse files
src/lib/components/Battle/BattleControls.svelte
CHANGED
@@ -16,6 +16,9 @@
|
|
16 |
export let onAction: (action: string) => void;
|
17 |
export let onMoveSelect: (move: any) => void;
|
18 |
export let onPicletSelect: (piclet: PicletInstance) => void;
|
|
|
|
|
|
|
19 |
|
20 |
// Use the roster passed from parent instead of loading it here
|
21 |
$: availablePiclets = rosterPiclets;
|
@@ -29,7 +32,14 @@
|
|
29 |
|
30 |
<!-- Action Area -->
|
31 |
<div class="action-area">
|
32 |
-
{#if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
<ActionButtons
|
34 |
{isWildBattle}
|
35 |
{playerPiclet}
|
@@ -40,6 +50,7 @@
|
|
40 |
{onAction}
|
41 |
{onMoveSelect}
|
42 |
{onPicletSelect}
|
|
|
43 |
/>
|
44 |
{/if}
|
45 |
</div>
|
|
|
16 |
export let onAction: (action: string) => void;
|
17 |
export let onMoveSelect: (move: any) => void;
|
18 |
export let onPicletSelect: (piclet: PicletInstance) => void;
|
19 |
+
export let onBack: () => void;
|
20 |
+
export let waitingForContinue: boolean = false;
|
21 |
+
export let onContinueTap: () => void;
|
22 |
|
23 |
// Use the roster passed from parent instead of loading it here
|
24 |
$: availablePiclets = rosterPiclets;
|
|
|
32 |
|
33 |
<!-- Action Area -->
|
34 |
<div class="action-area">
|
35 |
+
{#if waitingForContinue}
|
36 |
+
<!-- Tap to continue overlay -->
|
37 |
+
<div class="tap-continue-overlay" on:click={onContinueTap}>
|
38 |
+
<div class="tap-indicator">
|
39 |
+
<span>Tap to continue</span>
|
40 |
+
</div>
|
41 |
+
</div>
|
42 |
+
{:else if battlePhase === 'main' && !processingTurn && !battleEnded}
|
43 |
<ActionButtons
|
44 |
{isWildBattle}
|
45 |
{playerPiclet}
|
|
|
50 |
{onAction}
|
51 |
{onMoveSelect}
|
52 |
{onPicletSelect}
|
53 |
+
{onBack}
|
54 |
/>
|
55 |
{/if}
|
56 |
</div>
|
src/lib/components/Pages/Battle.svelte
CHANGED
@@ -38,6 +38,12 @@
|
|
38 |
let playerTrainerSlideOut = false;
|
39 |
let enemyTrainerSlideOut = false;
|
40 |
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
// HP animation states
|
42 |
let playerHpPercentage = playerPiclet.currentHp / playerPiclet.maxHp;
|
43 |
let enemyHpPercentage = enemyPiclet.currentHp / enemyPiclet.maxHp;
|
@@ -183,25 +189,9 @@
|
|
183 |
const filteredLogEntries = newLogEntries.filter(message => !message.includes('fainted'));
|
184 |
const result = { log: filteredLogEntries };
|
185 |
|
186 |
-
// Show battle messages with
|
187 |
if (result.log && result.log.length > 0) {
|
188 |
-
|
189 |
-
function showNextBattleMessage() {
|
190 |
-
if (messageIndex < result.log.length) {
|
191 |
-
const message = result.log[messageIndex];
|
192 |
-
currentMessage = message;
|
193 |
-
|
194 |
-
// Trigger visual effects based on message content
|
195 |
-
triggerVisualEffectsFromMessage(message);
|
196 |
-
|
197 |
-
messageIndex++;
|
198 |
-
setTimeout(showNextBattleMessage, 1500);
|
199 |
-
} else {
|
200 |
-
// After all messages, check battle end or continue
|
201 |
-
finalizeTurn();
|
202 |
-
}
|
203 |
-
}
|
204 |
-
showNextBattleMessage();
|
205 |
} else {
|
206 |
finalizeTurn();
|
207 |
}
|
@@ -210,12 +200,12 @@
|
|
210 |
// Update UI state from battle engine
|
211 |
updateUIFromBattleState();
|
212 |
|
213 |
-
// Check for battle end -
|
214 |
if (battleState.winner) {
|
215 |
battleEnded = true;
|
216 |
const defeatedPiclet = battleState.winner === 'player' ? currentEnemyPiclet : currentPlayerPiclet;
|
217 |
|
218 |
-
//
|
219 |
currentMessage = `${defeatedPiclet.nickname} fainted!`;
|
220 |
|
221 |
// Trigger faint animation for the defeated Piclet
|
@@ -225,18 +215,10 @@
|
|
225 |
playerFaint = true;
|
226 |
}
|
227 |
|
228 |
-
// Wait for faint message
|
229 |
-
setTimeout(() => {
|
230 |
-
|
231 |
-
|
232 |
-
: 'You lost!';
|
233 |
-
currentMessage = winMessage;
|
234 |
-
|
235 |
-
// Process battle results with XP and level ups
|
236 |
-
setTimeout(async () => {
|
237 |
-
await handleBattleResults(battleState.winner === 'player');
|
238 |
-
}, 1500);
|
239 |
-
}, 2500); // Increased wait time to ensure faint message is seen
|
240 |
} else {
|
241 |
setTimeout(() => {
|
242 |
currentMessage = `What will ${currentPlayerPiclet.nickname} do?`;
|
@@ -475,25 +457,9 @@
|
|
475 |
const filteredLogEntries = newLogEntries.filter(message => !message.includes('fainted'));
|
476 |
const result = { log: filteredLogEntries };
|
477 |
|
478 |
-
// Show battle messages with
|
479 |
if (result.log && result.log.length > 0) {
|
480 |
-
|
481 |
-
function showNextBattleMessage() {
|
482 |
-
if (messageIndex < result.log.length) {
|
483 |
-
const message = result.log[messageIndex];
|
484 |
-
currentMessage = message;
|
485 |
-
|
486 |
-
// Trigger visual effects based on message content
|
487 |
-
triggerVisualEffectsFromMessage(message);
|
488 |
-
|
489 |
-
messageIndex++;
|
490 |
-
setTimeout(showNextBattleMessage, 1500);
|
491 |
-
} else {
|
492 |
-
// After all messages, check battle end or continue
|
493 |
-
finalizeSwitchTurn();
|
494 |
-
}
|
495 |
-
}
|
496 |
-
showNextBattleMessage();
|
497 |
} else {
|
498 |
finalizeSwitchTurn();
|
499 |
}
|
@@ -502,12 +468,12 @@
|
|
502 |
// Update UI state from battle engine
|
503 |
updateUIFromBattleState();
|
504 |
|
505 |
-
// Check for battle end -
|
506 |
if (battleState.winner) {
|
507 |
battleEnded = true;
|
508 |
const defeatedPiclet = battleState.winner === 'player' ? currentEnemyPiclet : currentPlayerPiclet;
|
509 |
|
510 |
-
//
|
511 |
currentMessage = `${defeatedPiclet.nickname} fainted!`;
|
512 |
|
513 |
// Trigger faint animation for the defeated Piclet
|
@@ -517,18 +483,10 @@
|
|
517 |
playerFaint = true;
|
518 |
}
|
519 |
|
520 |
-
// Wait for faint message
|
521 |
-
setTimeout(() => {
|
522 |
-
|
523 |
-
|
524 |
-
: 'You lost!';
|
525 |
-
currentMessage = winMessage;
|
526 |
-
|
527 |
-
// Process battle results with XP and level ups
|
528 |
-
setTimeout(async () => {
|
529 |
-
await handleBattleResults(battleState.winner === 'player');
|
530 |
-
}, 1500);
|
531 |
-
}, 2500); // Increased wait time to ensure faint message is seen
|
532 |
} else {
|
533 |
setTimeout(() => {
|
534 |
currentMessage = `What will ${currentPlayerPiclet.nickname} do?`;
|
|
|
38 |
let playerTrainerSlideOut = false;
|
39 |
let enemyTrainerSlideOut = false;
|
40 |
|
41 |
+
// Message progression system
|
42 |
+
let waitingForContinue = false;
|
43 |
+
let messageQueue: string[] = [];
|
44 |
+
let currentMessageIndex = 0;
|
45 |
+
let continueCallback: (() => void) | null = null;
|
46 |
+
|
47 |
// HP animation states
|
48 |
let playerHpPercentage = playerPiclet.currentHp / playerPiclet.maxHp;
|
49 |
let enemyHpPercentage = enemyPiclet.currentHp / enemyPiclet.maxHp;
|
|
|
189 |
const filteredLogEntries = newLogEntries.filter(message => !message.includes('fainted'));
|
190 |
const result = { log: filteredLogEntries };
|
191 |
|
192 |
+
// Show battle messages with tap-to-continue system
|
193 |
if (result.log && result.log.length > 0) {
|
194 |
+
showMessageSequence(result.log, finalizeTurn);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
195 |
} else {
|
196 |
finalizeTurn();
|
197 |
}
|
|
|
200 |
// Update UI state from battle engine
|
201 |
updateUIFromBattleState();
|
202 |
|
203 |
+
// Check for battle end - only show faint message
|
204 |
if (battleState.winner) {
|
205 |
battleEnded = true;
|
206 |
const defeatedPiclet = battleState.winner === 'player' ? currentEnemyPiclet : currentPlayerPiclet;
|
207 |
|
208 |
+
// Show the faint message and trigger animation
|
209 |
currentMessage = `${defeatedPiclet.nickname} fainted!`;
|
210 |
|
211 |
// Trigger faint animation for the defeated Piclet
|
|
|
215 |
playerFaint = true;
|
216 |
}
|
217 |
|
218 |
+
// Wait for faint message, then process battle results
|
219 |
+
setTimeout(async () => {
|
220 |
+
await handleBattleResults(battleState.winner === 'player');
|
221 |
+
}, 2500); // Wait time for faint message and animation
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
222 |
} else {
|
223 |
setTimeout(() => {
|
224 |
currentMessage = `What will ${currentPlayerPiclet.nickname} do?`;
|
|
|
457 |
const filteredLogEntries = newLogEntries.filter(message => !message.includes('fainted'));
|
458 |
const result = { log: filteredLogEntries };
|
459 |
|
460 |
+
// Show battle messages with tap-to-continue system
|
461 |
if (result.log && result.log.length > 0) {
|
462 |
+
showMessageSequence(result.log, finalizeSwitchTurn);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
463 |
} else {
|
464 |
finalizeSwitchTurn();
|
465 |
}
|
|
|
468 |
// Update UI state from battle engine
|
469 |
updateUIFromBattleState();
|
470 |
|
471 |
+
// Check for battle end - only show faint message
|
472 |
if (battleState.winner) {
|
473 |
battleEnded = true;
|
474 |
const defeatedPiclet = battleState.winner === 'player' ? currentEnemyPiclet : currentPlayerPiclet;
|
475 |
|
476 |
+
// Show the faint message and trigger animation
|
477 |
currentMessage = `${defeatedPiclet.nickname} fainted!`;
|
478 |
|
479 |
// Trigger faint animation for the defeated Piclet
|
|
|
483 |
playerFaint = true;
|
484 |
}
|
485 |
|
486 |
+
// Wait for faint message, then process battle results
|
487 |
+
setTimeout(async () => {
|
488 |
+
await handleBattleResults(battleState.winner === 'player');
|
489 |
+
}, 2500); // Wait time for faint message and animation
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
490 |
} else {
|
491 |
setTimeout(() => {
|
492 |
currentMessage = `What will ${currentPlayerPiclet.nickname} do?`;
|