aboutsummaryrefslogtreecommitdiff
path: root/sword2/function.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sword2/function.cpp')
-rw-r--r--sword2/function.cpp458
1 files changed, 458 insertions, 0 deletions
diff --git a/sword2/function.cpp b/sword2/function.cpp
new file mode 100644
index 0000000000..214924a503
--- /dev/null
+++ b/sword2/function.cpp
@@ -0,0 +1,458 @@
+/* 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 <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "driver/driver96.h"
+#include "build_display.h"
+#include "credits.h"
+#include "debug.h"
+#include "defs.h"
+#include "function.h"
+#include "interpreter.h"
+#include "layers.h" // for 'this_screen' structure
+#include "logic.h"
+#include "memory.h"
+#include "object.h"
+#include "protocol.h"
+#include "resman.h"
+#include "sword2.h" // for CloseGame()
+//------------------------------------------------------------------------------------
+typedef struct
+{
+ uint32 a;
+ uint32 b;
+} test_struct;
+
+//------------------------------------------------------------------------------------
+
+Object_graphic engine_graph; // global for engine
+Object_mega engine_mega; // global for engine
+
+//------------------------------------------------------------------------------------
+int32 FN_test_function(int32 *params)
+{
+//param 0 address of a flag
+ Zdebug(" TEST %d %d", *params, RESULT);
+
+
+ return(IR_CONT);
+}
+//------------------------------------------------------------------------------------
+int32 FN_test_flags(int32 *params)
+{
+//param 0 value of flag
+
+ test_struct *tony;
+
+
+ tony = (test_struct*) *params; //address of structure
+
+
+
+// Zdebug("\nFN_test_flags %d, %d\n", tony->a, tony->b );
+
+ return(IR_CONT);
+}
+//------------------------------------------------------------------------------------
+int32 FN_gosub(int32 *params) //Tony23Sept96
+{
+//hurray, script subroutines
+//param 0 id of script
+
+
+ LLogic.Logic_up(*params);
+
+ return(4); //logic goes up - pc is saved for current level
+}
+//------------------------------------------------------------------------------------
+int32 FN_new_script(int32 *params) //Tony13Nov96
+{
+//change current script - must be followed by a TERMINATE script directive
+//param 0 id of script
+ Zdebug("FN_new_script %d", *params);
+
+ PLAYER_ACTION=0; //must clear this
+
+ LLogic.Logic_replace( *params );
+
+ return(IR_TERMINATE); //drop out no pc save - and around again
+}
+//------------------------------------------------------------------------------------
+int32 FN_interact(int32 *params) //Tony13Nov96
+{
+//run targets action on a subroutine
+//called by player on his base level 0 idle, for example
+
+
+//param 0 id of target from which we derive action script reference
+
+ Zdebug("FN_interact %d", *params);
+ PLAYER_ACTION=0; //must clear this
+
+ LLogic.Logic_up( (*params*65536)+2); //3rd script of clicked on id
+
+ return(IR_GOSUB); //out, up and around again - pc is saved for current level to be returned to
+}
+//------------------------------------------------------------------------------------
+
+// Open & close a resource.
+// Forces a resource into memory before it's "officially" opened for use.
+// eg. if an anim needs to run on smoothly from another, "preloading" gets it into memory in advance
+// to avoid the cacheing delay that normally occurs before the first frame.
+
+int32 FN_preload(int32 *params) // (1Nov96 JEL)
+{
+ res_man.Res_open(params[0]); // open resource
+ res_man.Res_close(params[0]); // close resource
+
+ return(IR_CONT); // continue script
+}
+
+
+// Go fetch resource in the background.
+int32 FN_prefetch(int32 *params)
+{
+ return(IR_CONT);
+}
+
+
+// Fetches a resource in the background but prevents the script from continuing until the resource is in memory.
+int32 FN_fetch_wait(int32 *params)
+{
+ return (IR_CONT);
+}
+
+
+// Releases a resource from memory. Used for freeing memory for sprites that have just been used
+// and will not be used again.
+// Sometimes it is better to kick out a sprite straight away so that the memory can be used for
+// more frequent animations.
+int32 FN_release(int32 *params)
+{
+ return (IR_CONT);
+}
+
+
+//------------------------------------------------------------------------------------
+// Generates a random number between 'min' & 'max' inclusive, and sticks it in the script flag 'result'
+
+int32 FN_random(int32 *params) // (1nov96 JEL)
+{
+ uint32 min = params[0];
+ uint32 max = params[1];
+
+ RESULT = (rand() % (max-min+1)) + min; // return_value = random integer between min and max, inclusive
+
+ return(IR_CONT); // continue script
+}
+//------------------------------------------------------------------------------------
+int32 FN_pause(int32 *params) // (19nov96 JEL)
+{
+ // params: 0 pointer to object's logic structure
+ // 1 number of game-cycles to pause
+
+ //NB. Pause-value of 0 causes script to continue, 1 causes a 1-cycle quit, 2 gives 2 cycles, etc.
+
+ Object_logic *ob_logic = (Object_logic *)params[0];
+
+ 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
+ }
+}
+//------------------------------------------------------------------------------------
+int32 FN_random_pause(int32 *params) // (26nov96 JEL)
+{
+ // params: 0 pointer to object's logic structure
+ // 1 minimum number of game-cycles to pause
+ // 2 maximum number of game-cycles to pause
+
+ Object_logic *ob_logic = (Object_logic *)params[0];
+ int32 pars[2];
+
+
+ if (ob_logic->looping==0)
+ {
+ pars[0] = params[1]; // min
+ pars[1] = params[2]; // max
+
+ FN_random(pars);
+
+ pars[1] = RESULT; // random value between 'min' & 'max' inclusive
+ }
+
+ pars[0] = params[0]; // &logic
+
+ return FN_pause(pars);
+}
+//------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------
+int32 FN_pass_graph(int32 *params) //Tony28Nov96
+{
+//makes an engine local copy of passed graphic_structure and mega_structure - run script 4 of an object to request this
+//used by FN_turn_to(id) etc
+//remember, we cannot simply read a compact any longer but instead must request it from the object itself
+
+//params 0 pointer to a graphic structure *might not need this?
+
+
+ memcpy( &engine_graph, (uint8*)params[0], sizeof(Object_graphic));
+
+ return(IR_CONT); //makes no odds
+}
+//------------------------------------------------------------------------------------
+int32 FN_pass_mega(int32 *params) //Tony28Nov96
+{
+//makes an engine local copy of passed graphic_structure and mega_structure - run script 4 of an object to request this
+//used by FN_turn_to(id) etc
+//remember, we cannot simply read a compact any longer but instead must request it from the object itself
+
+//params 0 pointer to a mega structure
+
+
+ memcpy( &engine_mega, (uint8*)params[0], sizeof(Object_mega));
+
+ return(IR_CONT); //makes no odds
+}
+//------------------------------------------------------------------------------------
+// temp. function!
+// used for setting far-referenced megaset resource field in mega object, from start script
+
+int32 FN_set_value(int32 *params) // (02jan97 JEL)
+{
+ // params: 0 pointer to object's mega structure
+ // 1 value to set it to
+
+ Object_mega *ob_mega = (Object_mega *)params[0];
+
+
+ ob_mega->megaset_res = params[1];
+
+ return(IR_CONT); // continue script
+}
+//------------------------------------------------------------------------------------
+#define BLACK 0
+#define WHITE 1
+#define RED 2
+#define GREEN 3
+#define BLUE 4
+//------------------------------------------------------------------------------------
+uint8 black[4] = {0,0,0,0};
+uint8 white[4] = {255,255,255,0};
+uint8 red[4] = {255,0,0,0};
+uint8 green[4] = {0,255,0,0};
+uint8 blue[4] = {0,0,255,0};
+//------------------------------------------------------------------------------------
+// flash colour 0 (ie. border) - useful during script development
+// eg. FN_flash(BLUE) where a text line is missed; RED when some code missing, etc
+
+int32 FN_flash(int32 *params) // (James14feb97)
+{
+ // params 0: colour to flash
+
+#ifdef _DEBUG
+
+ uint32 count;
+
+ switch (params[0]) // what colour?
+ {
+ case WHITE:
+ SetPalette(0, 1, white, RDPAL_INSTANT);
+ break;
+
+ case RED:
+ SetPalette(0, 1, red, RDPAL_INSTANT);
+ break;
+
+ case GREEN:
+ SetPalette(0, 1, green, RDPAL_INSTANT);
+ break;
+
+ case BLUE:
+ SetPalette(0, 1, blue, RDPAL_INSTANT);
+ break;
+ }
+
+ for (count=0; count<0x80000; count++)
+ {
+ count++;
+ count--;
+ }
+
+ SetPalette(0, 1, black, RDPAL_INSTANT);
+
+#endif // _DEBUG
+
+ return(IR_CONT);
+}
+//------------------------------------------------------------------------------------
+// set border colour - useful during script development
+// eg. set to colour during a timer situation, then black when timed out
+
+int32 FN_colour(int32 *params) // (James14feb97)
+{
+ // params 0: colour (see defines above)
+
+#ifdef _DEBUG
+
+ switch (params[0]) // what colour?
+ {
+ case BLACK:
+ SetPalette(0, 1, black, RDPAL_INSTANT);
+ break;
+
+ case WHITE:
+ SetPalette(0, 1, white, RDPAL_INSTANT);
+ break;
+
+ case RED:
+ SetPalette(0, 1, red, RDPAL_INSTANT);
+ break;
+
+ case GREEN:
+ SetPalette(0, 1, green, RDPAL_INSTANT);
+ break;
+
+ case BLUE:
+ SetPalette(0, 1, blue, RDPAL_INSTANT);
+ break;
+ }
+
+#endif // _DEBUG
+
+ return(IR_CONT);
+}
+//------------------------------------------------------------------------------------
+// Display a message to the user on the screen.
+//
+
+int32 FN_display_msg(int32 *params) // (Chris 15/5/97)
+{
+ // params 0: Text number of message to be displayed.
+ uint32 local_text = params[0]&0xffff;
+ uint32 text_res = params[0]/SIZE;
+
+ // Display message for three seconds.
+ DisplayMsg(FetchTextLine( res_man.Res_open(text_res), local_text )+2, 3); // +2 to skip the encoded text number in the first 2 chars; 3 is duration in seconds
+ res_man.Res_close(text_res);
+ RemoveMsg();
+
+ return(IR_CONT);
+}
+//------------------------------------------------------------------------------------
+// FN_reset_globals is used by the demo - so it can loop back & restart itself
+int32 FN_reset_globals(int32 *params) //Tony29May97
+{
+ int32 size;
+ uint32 *globals;
+ int j;
+
+ size = res_man.Res_fetch_len(1);
+
+ size-=sizeof(_standardHeader);
+
+ Zdebug("\nglobals size %d", size/4);
+
+ globals = (uint32*) ((uint8 *) res_man.Res_open(1)+sizeof(_standardHeader));
+
+ for (j=0;j<size/4;j++)
+ globals[j]=0; //blank each global variable
+
+ res_man.Res_close(1);
+
+ res_man.Kill_all_objects(0); //all objects but george
+
+// SetGlobalInterpreterVariables((int32*)(res_man.Res_open(1)+sizeof(_standardHeader))); //reopen global variables resource & send address to interpreter - it won't be moving
+// res_man.Res_close(1);
+
+ //---------------------------------------------------------------
+ // FOR THE DEMO - FORCE THE SCROLLING TO BE RESET! (James29may97)
+ // - this is taken from FN_init_background
+ this_screen.scroll_flag = 2; // switch on scrolling (2 means first time on screen)
+ //---------------------------------------------------------------
+
+ return(IR_CONT);
+}
+//------------------------------------------------------------------------------------
+// FN_play_credits - Plays the credits?
+// This function just quits the game if this is the playable demo, ie. credits are NOT played in the demo any more!
+
+extern uint8 quitGame; // From sword2.cpp
+extern void UpdateCompSampleStreaming(void); // From d_sound.c
+
+int32 FN_play_credits(int32 *params)
+{
+
+/* uint32 rv; // for Credits() return value
+
+ if (!DEMO) // this ju
+ {
+ _drvDrawStatus ds;
+ _drvSoundStatus ss;
+ _drvKeyStatus ks;
+
+ ClearAllFx(); // Must stop all fx
+ CloseFx(-2); // including leadins
+ CloseFx(-1); // including leadouts
+ StopMusic(); // Stop any streaming music
+
+ for (int i = 0; i<16; i++)
+ UpdateCompSampleStreaming(); // And wait for it to die
+
+ GetDrawStatus (&ds);
+ GetSoundStatus(&ss);
+ GetKeyStatus (&ks);
+
+ rv = Credits(&ds, &ss, res_man.GetCdPath(), GetRenderType()==3, &gotTheFocus, &ks);
+ SetDrawStatus (&ds); // (James14aug97) Because game crashing when trying to close down after credits
+ SetSoundStatus(&ss); // -"-
+ }
+
+ // returns non-zero if Ctrl-Q was pressed to quit the game during the credits
+
+ if (rv || DEMO) // if Ctrl-Q pressed during credits, or if this is the playable demo
+ {
+ Close_game(); //close engine systems down
+ RestoreDisplay();
+ CloseAppWindow();
+ exit(0); // quit the game
+ }
+
+*/
+ return (IR_CONT);
+}
+//------------------------------------------------------------------------------------
+