diff --git a/src/f_finale.c b/src/f_finale.c index baaad10b0..b30160b87 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -79,7 +79,13 @@ static patch_t *ttspop7; static void F_SkyScroll(INT32 scrollspeed); +// +// PROMPT STATE +// static boolean promptactive = false; +static mobj_t *promptmo; +static INT16 promptpostexectag; +static boolean promptblockcontrols; // // CUTSCENE TEXT WRITING @@ -2063,9 +2069,20 @@ static void F_AdvanceToNextPage(void) void F_EndTextPrompt(void) { promptactive = false; + + // \todo net safety, maybe loop all player thinkers? + if (promptpostexectag) + P_LinedefExecute(promptpostexectag, promptmo, NULL); + + // \todo reset blocked controls and frozen realtime? + + P_SetTarget(&promptmo, NULL); // \todo tmthing crash upon teleporting? see test map + + // \todo if !promptactive, block player jumping if BT_JUMP is set + // so player does not immediately jump upon prompt close } -void F_StartTextPrompt(INT32 promptnum, INT32 pagenum) +void F_StartTextPrompt(INT32 promptnum, INT32 pagenum, mobj_t *mo, UINT16 postexectag, boolean blockcontrols, boolean freezerealtime) { // We share vars, so no starting text prompts over cutscenes or title screens! keypressed = false; @@ -2075,6 +2092,13 @@ void F_StartTextPrompt(INT32 promptnum, INT32 pagenum) stoptimer = 0; skullAnimCounter = 0; + // Set up state + P_SetTarget(&promptmo, mo); //promptmo = mo; + promptpostexectag = postexectag; + promptblockcontrols = blockcontrols; + (void)freezerealtime; // \todo freeze player->realtime, maybe this needs to cycle through player thinkers + + // Initialize current prompt and scene cutnum = (textprompts[promptnum]) ? promptnum : INT32_MAX; scenenum = (pagenum <= textprompts[cutnum]->numpages-1) ? pagenum : INT32_MAX; promptactive = (cutnum != INT32_MAX && scenenum != INT32_MAX); @@ -2157,7 +2181,8 @@ void F_TextPromptDrawer(void) V_DrawString(textx, namey, V_SNAPTOBOTTOM, textprompts[cutnum]->page[scenenum].name); // Draw chevron - V_DrawString(textr-8, chevrony + (skullAnimCounter/5), (V_SNAPTOBOTTOM|V_YELLOWMAP), "\x1B"); // down arrow + if (promptblockcontrols) // \todo if !CloseTimer + V_DrawString(textr-8, chevrony + (skullAnimCounter/5), (V_SNAPTOBOTTOM|V_YELLOWMAP), "\x1B"); // down arrow } void F_TextPromptTicker(void) @@ -2176,25 +2201,35 @@ void F_TextPromptTicker(void) skullAnimCounter = 8; // button handling - for (i = 0; i < MAXPLAYERS; i++) + if (promptblockcontrols) { - if (netgame && i != serverplayer && i != adminplayer) - continue; + // \todo loop through all players that have a text prompt + if (promptmo && promptmo->player) + promptmo->player->powers[pw_nocontrol] = 1; - if ((players[i].cmd.buttons & BT_USE) || (players[i].cmd.buttons & BT_JUMP)) + for (i = 0; i < MAXPLAYERS; i++) { - if (keypressed) - return; + if (netgame && i != serverplayer && i != adminplayer) + continue; - cutscene_boostspeed = 1; - if (timetonext) - timetonext = 2; - F_AdvanceToNextPage(); - keypressed = true; // prevent repeat events + if ((players[i].cmd.buttons & BT_USE) || (players[i].cmd.buttons & BT_JUMP)) + { + if (keypressed) + return; + + cutscene_boostspeed = 1; + if (timetonext) + timetonext = 2; + F_AdvanceToNextPage(); + keypressed = true; // prevent repeat events + + if (promptactive) + S_StartSound(NULL, sfx_menu1); + } + else if (!(players[i].cmd.buttons & BT_USE) && !(players[i].cmd.buttons & BT_JUMP)) + keypressed = false; + + break; } - else if (!(players[i].cmd.buttons & BT_USE) && !(players[i].cmd.buttons & BT_JUMP)) - keypressed = false; - - break; } } diff --git a/src/f_finale.h b/src/f_finale.h index eb5872fca..66b608e21 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -51,7 +51,7 @@ void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean reset void F_CutsceneDrawer(void); void F_EndCutScene(void); -void F_StartTextPrompt(INT32 promptnum, INT32 pagenum); +void F_StartTextPrompt(INT32 promptnum, INT32 pagenum, mobj_t *mo, UINT16 postexectag, boolean blockcontrols, boolean freezerealtime); void F_TextPromptDrawer(void); void F_EndTextPrompt(void); diff --git a/src/p_spec.c b/src/p_spec.c index 2771c85f7..cd4dd76cf 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3462,28 +3462,18 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { INT32 promptnum = max(0, (sides[line->sidenum[0]].textureoffset>>FRACBITS)-1); INT32 pagenum = max(0, (sides[line->sidenum[0]].rowoffset>>FRACBITS)-1); + INT32 postexectag = (line->sidenum[1] != 0xFFFF) ? abs(sides[line->sidenum[1]].textureoffset>>FRACBITS) : 0; boolean closetextprompt = (line->flags & ML_BLOCKMONSTERS); + boolean runpostexec = (line->flags & ML_EFFECT1); + boolean blockcontrols = !(line->flags & ML_EFFECT2); + boolean freezerealtime = !(line->flags & ML_EFFECT3); + //boolean freezethinkers = (line->flags & ML_EFFECT4); if (closetextprompt) F_EndTextPrompt(); else - F_StartTextPrompt(promptnum, pagenum); -#if 0 - - INT32 postexectag = (line->sidenum[1] != 0xFFFF) ? abs(sides[line->sidenum[1]].textureoffset>>FRACBITS) : 0; - INT32 closedelay = (line->sidenum[1] != 0xFFFF) ? abs(sides[line->sidenum[1]].rowoffset>>FRACBITS) : 0; - - boolean runpostexec = (line->flags & ML_EFFECT1); - boolean blockcontrols = !(line->flags & ML_EFFECT2); - boolean freezetimer = !(line->flags & ML_EFFECT3); - boolean freezethinkers = (line->flags & ML_EFFECT4); - - // if (closetextprompt && !promptnum) - // F_EndTextPrompt(closedelay, runpostexec ? postexectag : 0, mo); - // else - // F_StartTextPrompt(promptnum, pagenum, closetextprompt ? closedelay : 0, runpostexec ? postexectag : 0, mo, blockcontrols, freezethinkers); -#endif + F_StartTextPrompt(promptnum, pagenum, mo, runpostexec ? postexectag : 0, blockcontrols, freezerealtime); } break;