void run_unhandled_event (int evnt) { if (play.check_interaction_only) return; int evtype=0; if (strnicmp(evblockbasename,"hotspot",7)==0) evtype=1; else if (strnicmp(evblockbasename,"object",6)==0) evtype=2; else if (strnicmp(evblockbasename,"character",9)==0) evtype=3; else if (strnicmp(evblockbasename,"inventory",9)==0) evtype=5; else if (strnicmp(evblockbasename,"region",6)==0) return; // no unhandled_events for regions // clicked Hotspot 0, so change the type code if ((evtype == 1) & (evblocknum == 0) & (evnt != 0) & (evnt != 5) & (evnt != 6)) evtype = 4; if ((evtype==1) & ((evnt==0) | (evnt==5) | (evnt==6))) ; // character stands on hotspot, mouse moves over hotspot, any click else if ((evtype==2) & (evnt==4)) ; // any click on object else if ((evtype==3) & (evnt==4)) ; // any click on character else if (evtype > 0) { can_run_delayed_command(); QueueScriptFunction(kScInstGame, "unhandled_event", 2, RuntimeScriptValue().SetInt32(evtype), RuntimeScriptValue().SetInt32(evnt)); } }
void NewRoom(int nrnum) { if (nrnum < 0) quitprintf("!NewRoom: room change requested to invalid room number %d.", nrnum); if (displayed_room < 0) { // called from game_start; change the room where the game will start playerchar->room = nrnum; return; } DEBUG_CONSOLE("Room change requested to room %d", nrnum); EndSkippingUntilCharStops(); can_run_delayed_command(); if (play.stop_dialog_at_end != DIALOG_NONE) { if (play.stop_dialog_at_end == DIALOG_RUNNING) play.stop_dialog_at_end = DIALOG_NEWROOM + nrnum; else { quitprintf("!NewRoom: two NewRoom/RunDialog/StopDialog requests within dialog; last was called in \"%s\", line %d", last_in_dialog_request_script_pos.Section.GetCStr(), last_in_dialog_request_script_pos.Line); } return; } get_script_position(last_in_dialog_request_script_pos); if (in_leaves_screen >= 0) { // NewRoom called from the Player Leaves Screen event -- just // change which room it will go to in_leaves_screen = nrnum; } else if (in_enters_screen) { setevent(EV_NEWROOM,nrnum); return; } else if (in_inv_screen) { inv_screen_newroom = nrnum; return; } else if ((inside_script==0) & (in_graph_script==0)) { new_room(nrnum,playerchar); return; } else if (inside_script) { curscript->queue_action(ePSANewRoom, nrnum, "NewRoom"); // we might be within a MoveCharacterBlocking -- the room // change should abort it if ((playerchar->walking > 0) && (playerchar->walking < TURNING_AROUND)) { // nasty hack - make sure it doesn't move the character // to a walkable area mls[playerchar->walking].direct = 1; StopMoving(game.playercharacter); } } else if (in_graph_script) gs_to_newroom = nrnum; }
void CallRoomScript (int value) { can_run_delayed_command(); if (!inside_script) quit("!CallRoomScript: not inside a script???"); play.roomscript_finished = 0; RuntimeScriptValue rval_null; curscript->run_another("$on_call", RuntimeScriptValue().SetInt32(value), rval_null /*0*/); }