1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
|
#ifndef _SCRIPTING_H
#define _SCRIPTING_H
#include "globalincs/globals.h"
#include "globalincs/pstypes.h"
#include "parse/lua.h"
#include <stdio.h>
//**********Scripting languages that are possible
#define SC_LUA (1<<0)
//*************************Scripting structs*************************
#define SCRIPT_END_LIST NULL
struct image_desc
{
char fname[MAX_FILENAME_LEN];
int handle;
};
//**********Main Conditional Hook stuff
#define MAX_HOOK_CONDITIONS 8
//Conditionals
#define CHC_NONE -1
#define CHC_MISSION 0
#define CHC_SHIP 1
#define CHC_SHIPCLASS 2
#define CHC_SHIPTYPE 3
#define CHC_STATE 4
#define CHC_CAMPAIGN 5
#define CHC_WEAPONCLASS 6
#define CHC_OBJECTTYPE 7
#define CHC_KEYPRESS 8
#define CHC_VERSION 9
#define CHC_APPLICATION 10
//Actions
#define CHA_NONE -1
#define CHA_WARPOUT 0
#define CHA_WARPIN 1
#define CHA_DEATH 2
#define CHA_ONFRAME 3
#define CHA_COLLIDESHIP 4
#define CHA_COLLIDEWEAPON 5
#define CHA_COLLIDEDEBRIS 6
#define CHA_COLLIDEASTEROID 7
#define CHA_HUDDRAW 8
#define CHA_OBJECTRENDER 9
#define CHA_SPLASHSCREEN 10
#define CHA_GAMEINIT 11
#define CHA_MISSIONSTART 12
#define CHA_MISSIONEND 13
#define CHA_MOUSEMOVED 14
#define CHA_MOUSEPRESSED 15
#define CHA_MOUSERELEASED 16
#define CHA_KEYPRESSED 17
#define CHA_KEYRELEASED 18
#define CHA_ONSTATESTART 19
#define CHA_ONSTATEEND 20
#define CHA_ONWEAPONDELETE 21
#define CHA_ONWPEQUIPPED 22
#define CHA_ONWPFIRED 23
#define CHA_ONWPSELECTED 24
#define CHA_ONWPDESELECTED 25
#define CHA_GAMEPLAYSTART 26
#define CHA_ONTURRETFIRED 27
#define CHA_PRIMARYFIRE 28
#define CHA_SECONDARYFIRE 29
// management stuff
void scripting_state_init();
void scripting_state_close();
void scripting_state_do_frame(float frametime);
struct script_condition
{
int condition_type;
union
{
char name[NAME_LENGTH];
} data;
script_condition(){condition_type = CHC_NONE; memset(data.name, 0, sizeof(data.name));}
};
struct script_action
{
int action_type;
script_hook hook;
script_action(){action_type = CHA_NONE;}
};
class ConditionedHook
{
private:
SCP_vector<script_action> Actions;
script_condition Conditions[MAX_HOOK_CONDITIONS];
public:
bool AddCondition(script_condition sc);
bool AddAction(script_action sa);
bool ConditionsValid(int action, struct object *objp=NULL, int more_data = 0);
bool IsOverride(class script_state *sys, int action);
bool Run(class script_state *sys, int action, char format='\0', void *data=NULL);
};
//**********Main script_state function
class script_state
{
private:
char StateName[32];
int Langs;
struct lua_State *LuaState;
const struct script_lua_lib_list *LuaLibs;
//Utility variables
SCP_vector<image_desc> ScriptImages;
SCP_vector<ConditionedHook> ConditionalHooks;
private:
void ParseChunkSub(int *out_lang, int *out_index, char* debug_str=NULL);
int RunBytecodeSub(int in_lang, int in_idx, char format='\0', void *data=NULL);
void SetLuaSession(struct lua_State *L);
void OutputLuaMeta(FILE *fp);
//Lua private helper functions
bool OpenHookVarTable();
bool CloseHookVarTable();
//Internal Lua helper functions
void EndLuaFrame();
//Destroy everything
void Clear();
public:
//***Init/Deinit
script_state(char *name);
script_state& operator=(script_state &in);
~script_state();
//***Internal scripting stuff
int LoadBm(char *name);
void UnloadImages();
lua_State *GetLuaSession(){return LuaState;}
//***Init functions for langs
int CreateLuaState();
//***Get data
int OutputMeta(char *filename);
//***Moves data
//void MoveData(script_state &in);
//***Variable handling functions
bool GetGlobal(char *name, char format='\0', void *data=NULL);
void RemGlobal(char *name);
void SetHookVar(char *name, char format, void *data=NULL);
void SetHookObject(char *name, object *objp);
void SetHookObjects(int num, ...);
bool GetHookVar(char *name, char format='\0', void *data=NULL);
void RemHookVar(char *name);
void RemHookVars(unsigned int num, ...);
//***Hook creation functions
bool EvalString(char* string, char *format=NULL, void *rtn=NULL, char *debug_str=NULL);
script_hook ParseChunk(char* debug_str=NULL);
bool ParseCondition(char *filename="<Unknown>");
//***Hook running functions
int RunBytecode(script_hook &hd, char format='\0', void *data=NULL);
bool IsOverride(script_hook &hd);
int RunCondition(int condition, char format='\0', void *data=NULL, struct object *objp = NULL, int more_data = 0);
bool IsConditionOverride(int action, object *objp=NULL);
//*****Other functions
void EndFrame();
};
//**********Script registration functions
void script_init();
//**********Script globals
extern class script_state Script_system;
extern bool Output_scripting_meta;
//**********Script hook stuff (scripting.tbl)
extern script_hook Script_globalhook;
extern script_hook Script_simulationhook;
extern script_hook Script_hudhook;
extern script_hook Script_splashhook;
extern script_hook Script_gameinithook;
//*************************Conditional scripting*************************
#endif //_SCRIPTING_H
|