Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 33 additions & 21 deletions src/interactions/map_start/mailboxMainArea.interaction.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,15 @@ const showNewsDetail = async (player, k, newsItem, returnPage = 0) => {
showCustomPrompt(
detailMessage,
options,
(selectedValue) => {
setTimeout(async () => {
if (selectedValue === 'back') {
async (selectedValue) => {
if (selectedValue === 'back') {
// Reopen immediately for navigation
setTimeout(async () => {
player.state.isInDialog = true;
time.paused = true;
await showNewsList(player, k, returnPage);
}
}, 50);
}, 50);
}
},
player,
k,
Expand Down Expand Up @@ -108,22 +111,25 @@ const showNewsList = async (player, k, page = 0) => {
showCustomPrompt(
message,
options,
(selectedValue) => {
// Use setTimeout to avoid closing before showing next prompt
setTimeout(async () => {
if (selectedValue === 'prev') {
await showNewsList(player, k, page - 1);
} else if (selectedValue === 'next') {
await showNewsList(player, k, page + 1);
} else if (selectedValue === 'close') {
// Just close, do nothing
return;
} else {
// It's a news index
const selectedNews = newsCache[selectedValue];
await showNewsDetail(player, k, selectedNews, page);
}
}, 50);
async (selectedValue) => {
if (selectedValue === 'prev' || selectedValue === 'next' || typeof selectedValue === 'number') {
// Reopen immediately for navigation
setTimeout(async () => {
player.state.isInDialog = true;
time.paused = true;

if (selectedValue === 'prev') {
await showNewsList(player, k, page - 1);
} else if (selectedValue === 'next') {
await showNewsList(player, k, page + 1);
} else {
// It's a news index
const selectedNews = newsCache[selectedValue];
await showNewsDetail(player, k, selectedNews, page);
}
}, 50);
}
// 'close' does nothing - closeCustomPrompt handles unlock
},
player,
k,
Expand All @@ -133,9 +139,15 @@ const showNewsList = async (player, k, page = 0) => {

export const interactionWithMainboxMainArea = (player, k, map) => {
player.onCollide('mailbox_mainArea', async () => {
player.vel = k.vec2(0, 0);

time.paused = true;
player.state.isInDialog = true;
abort = new AbortController();

await new Promise(resolve => setTimeout(resolve, 300));

await showNewsList(player, k);
});
};

11 changes: 11 additions & 0 deletions src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,17 @@ export const closeCustomPrompt = (player, k, abort) => {
const statsUI = document.getElementById('stats-container');
statsUI.style.display = 'flex';

player.vel = k.vec2(0, 0);

player.state.isInDialog = false;
time.paused = false;

k.canvas.focus();

['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'w', 'a', 's', 'd'].forEach(key => {
const event = new KeyboardEvent('keyup', { key: key });
k.canvas.dispatchEvent(event);
});
abort.abort();
};