Its a bit tough to say without knowing how you game "flow" is put together.
Not something that you could easily explain I think.
But as an idea, how does this sound.
Have three separate player "action"s and when the player shifts from
one game-mode to another, the currently running action calls the next
action type and then aborts itself.
EG.
action player_explore()
{
player = me;
...
while(1)
{
if(key_w) c_move(me, forward_vec, NULL, ....
...
wait(1);
if(mode==2) { player_combat(); break; }
if(mode==3) { player_CutScene(); break; }
}
}
action player_combat()
{
player = me;
...
while(1)
{
if(key_w) c_move(me, forward_vec, NULL, ....
if(key_space) attack();
...
wait(1);
if(mode==1) { player_explore(); break; }
if(mode==3) { player_cutscene(); break; }
}
}
action player_player_cutscene()
{
player = me;
...
while(1)
{
if(key_w) camera.tilt += time_step;
...
wait(1);
if(mode==1) { player_explore(); break; }
if(mode==2) { player_combat(); break; }
}
}