aboutsummaryrefslogtreecommitdiff
path: root/sword2/events.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sword2/events.cpp')
-rw-r--r--sword2/events.cpp405
1 files changed, 405 insertions, 0 deletions
diff --git a/sword2/events.cpp b/sword2/events.cpp
new file mode 100644
index 0000000000..b7f339c99a
--- /dev/null
+++ b/sword2/events.cpp
@@ -0,0 +1,405 @@
+/* Copyright (C) 1994-2003 Revolution Software Ltd
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ */
+
+//------------------------------------------------------------------------------------
+#include <stdio.h>
+
+//#include "src\driver96.h"
+#include "console.h"
+#include "debug.h"
+#include "defs.h"
+#include "events.h"
+#include "interpreter.h"
+#include "logic.h"
+#include "memory.h"
+#include "object.h"
+#include "sync.h"
+//------------------------------------------------------------------------------------
+
+_event_unit event_list[MAX_events];
+
+//------------------------------------------------------------------------------------
+void Init_event_system(void) //Tony4Dec96
+{
+
+ uint32 j;
+
+
+ for (j=0;j<MAX_events;j++)
+ event_list[j].id=0; //denotes free slot
+
+}
+//------------------------------------------------------------------------------------
+uint32 CountEvents(void)
+{
+ uint32 j;
+ uint32 count=0;
+
+ for (j=0; j<MAX_events; j++)
+ {
+ if (event_list[j].id)
+ count++;
+ }
+
+ return (count);
+}
+//------------------------------------------------------------------------------------
+int32 FN_request_speech(int32 *params) //Tony13Nov96
+{
+//change current script - must be followed by a TERMINATE script directive
+
+//param 0 id of target to catch the event and startup speech servicing
+
+ uint32 j=0;
+
+
+
+ while(1)
+ {
+ if (event_list[j].id == (uint32)params[0])
+ break;
+ if (!event_list[j].id)
+ break;
+
+ j++;
+ }
+
+
+
+ if (j==MAX_events)
+ Con_fatal_error("FN_set_event out of event slots (%s line %u)", __FILE__, __LINE__);
+
+//found that slot
+
+ event_list[j].id=params[0]; //id of person to stop
+ event_list[j].interact_id=(params[0]*65536)+6; //full script id to interact with - megas run their own 7th script
+
+
+
+ return(IR_CONT);
+}
+//------------------------------------------------------------------------------------
+void Set_player_action_event(uint32 id, uint32 interact_id) //Tony4Dec96
+{
+ uint32 j=0;
+
+
+
+
+// if ((event_list[j].id!=id)&&(event_list[j].id))
+// while((event_list[j].id!=id)||(event_list[j].id)) //zip along until we find a free slot
+// { j++;
+// };
+
+ while(1)
+ {
+ if (event_list[j].id==id)
+ break;
+ if (!event_list[j].id)
+ break;
+
+ j++;
+ }
+
+
+ if (j==MAX_events)
+ Con_fatal_error("Set_event out of event slots");
+
+//found that slot
+
+ event_list[j].id=id; //id of person to stop
+ event_list[j].interact_id=(interact_id*65536)+2; //full script id of action script number 2
+
+}
+//------------------------------------------------------------------------------------
+int32 FN_set_player_action_event(int32 *params) //Tony10Feb97
+{
+//we want to intercept the player character and have him interact with an object - from script
+//this code is the same as the mouse engine calls when you click on an object - here, a third party does the clicking IYSWIM
+
+//note - this routine used CUR_PLAYER_ID as the target
+
+//params 0 id to interact with
+
+ uint32 j=0;
+
+
+
+
+//search for an existing event or a slot
+
+ while(1)
+ {
+ if (event_list[j].id==CUR_PLAYER_ID)
+ break;
+ if (!event_list[j].id)
+ break;
+
+ j++;
+ }
+
+
+ if (j==MAX_events)
+ Con_fatal_error("Set_event out of event slots");
+
+//found that slot
+
+ event_list[j].id=CUR_PLAYER_ID; //id of person to stop
+ event_list[j].interact_id=(params[0]*65536)+2; //full script id of action script number 2
+
+
+ return(IR_CONT);
+}
+//------------------------------------------------------------------------------------
+int32 FN_send_event(int32 *params) //Tony28Feb97
+{
+//we want to intercept the player character and have him interact with an object - from script
+
+// 0 id to recieve event
+// 1 script to run
+
+
+ uint32 j=0;
+
+
+// Zdebug("*+*+* %d %d", params[0], params[1] );
+
+
+//search for an existing event or a slot
+
+ while(1)
+ {
+ if (event_list[j].id==(uint32)params[0])
+ break;
+ if (!event_list[j].id)
+ break;
+
+ j++;
+ }
+
+
+ if (j==MAX_events)
+ Con_fatal_error("fn_send_event out of event slots");
+
+//found that slot
+
+ event_list[j].id=params[0]; //id of person to stop
+ event_list[j].interact_id=params[1]; //full script id
+
+
+ return(IR_CONT);
+}
+//------------------------------------------------------------------------------------
+int32 FN_check_event_waiting(int32 *params) //Tony4Dec96
+{
+// returns yes/no in RESULT
+
+// no params
+
+ uint32 j;
+
+
+
+ RESULT=0;
+
+
+ for (j=0; j<MAX_events; j++)
+ {
+ if (event_list[j].id == ID) //us?
+ {
+ RESULT=1;
+ break;
+ }
+ }
+
+ return(IR_CONT);
+}
+//------------------------------------------------------------------------------------
+// like FN_check_event_waiting, but starts the event rather than setting RESULT to 1
+
+int32 FN_check_for_event(int32 *params) // James (04mar97)
+{
+ // no params
+
+ uint32 j;
+
+
+ for (j=0; j<MAX_events; j++)
+ {
+ if (event_list[j].id == ID) //us?
+ {
+ // start the event
+ LLogic.Logic_one(event_list[j].interact_id); // run 3rd script of target object on level 1
+ event_list[j].id = 0; // clear the event slot
+ return(IR_TERMINATE);
+ }
+ }
+
+ return(IR_CONT);
+}
+//------------------------------------------------------------------------------------
+// combination of FN_pause & FN_check_for_event
+// - ie. does a pause, but also checks for event each cycle
+
+int32 FN_pause_for_event(int32 *params) // James (04mar97)
+{
+ // returns yes/no in RESULT
+
+ // params: 0 pointer to object's logic structure
+ // 1 number of game-cycles to pause
+
+ Object_logic *ob_logic = (Object_logic *)params[0];
+ uint32 j;
+
+
+ // first, check for an event
+
+ for (j=0; j<MAX_events; j++)
+ {
+ if (event_list[j].id == ID) // us?
+ {
+ ob_logic->looping = 0; // reset the 'looping' flag
+ // start the event
+ LLogic.Logic_one(event_list[j].interact_id); // run 3rd script of target object on level 1
+ event_list[j].id = 0; // clear the event slot
+ return(IR_TERMINATE);
+ }
+ }
+
+
+ // no event, so do the FN_pause bit
+
+
+ if (ob_logic->looping==0) // start the pause
+ {
+ ob_logic->looping = 1;
+ ob_logic->pause = params[1]; // no. of game cycles
+ }
+
+ if (ob_logic->pause) // if non-zero
+ {
+ ob_logic->pause--; // decrement the pause count
+ return(IR_REPEAT); // drop out of script, but call this again next cycle
+ }
+ else // pause count is zerp
+ {
+ ob_logic->looping = 0;
+ return(IR_CONT); // continue script
+ }
+}
+
+//------------------------------------------------------------------------------------
+uint32 Check_event_waiting(void) //Tony4Dec96
+{
+//returns yes/no
+
+
+ uint32 j;
+
+
+ for (j=0;j<MAX_events;j++)
+ if (event_list[j].id == ID) //us?
+ return(1); //yes
+
+ return(0); //no
+}
+//------------------------------------------------------------------------------------
+int32 FN_clear_event(int32 *params) //Tony11Mar97
+{
+// no params
+// no return vaule
+
+
+ uint32 j;
+
+
+ for (j=0;j<MAX_events;j++)
+ if (event_list[j].id == ID) //us?
+ {
+ event_list[j].id=0; //clear the slot
+ return(IR_CONT); //
+ }
+
+ return(IR_CONT); //
+}
+//------------------------------------------------------------------------------------
+void Start_event(void) //Tony4Dec96
+{
+//call this from stuff like fn_walk
+//you must follow with a return(IR_TERMINATE)
+
+ uint32 j;
+
+
+ for (j=0;j<MAX_events;j++)
+ if (event_list[j].id == ID) //us?
+ {
+
+ LLogic.Logic_one( event_list[j].interact_id); //run 3rd script of target object on level 1
+
+ event_list[j].id=0; //clear the slot
+
+ return;
+ }
+
+//oh dear - stop the system
+
+ Con_fatal_error("Start_event can't find event for id %d", ID);
+
+}
+//------------------------------------------------------------------------------------
+int32 FN_start_event(int32 *params) //Tony4Dec96
+{
+
+ uint32 j;
+
+
+ for (j=0;j<MAX_events;j++)
+ if (event_list[j].id == ID) //us?
+ {
+
+ LLogic.Logic_one(event_list[j].interact_id); //run 3rd script of target object on level 1
+
+ event_list[j].id=0; //clear the slot
+
+ return(IR_TERMINATE);
+ }
+
+//oh dear - stop the system
+
+ Con_fatal_error("FN_start_event can't find event for id %d", ID);
+
+ return(0); //never called - but lets stop them bloody errors
+}
+//------------------------------------------------------------------------------------
+void Kill_all_ids_events(uint32 id) //Tony18Dec96
+{
+ uint32 j;
+
+
+ for (j=0;j<MAX_events;j++)
+ if (event_list[j].id == id) //us?
+ event_list[j].id=0; //clear the slot
+
+ if (id);
+}
+//------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------
+