[Add] Implemented pilot hooks with the "death" hook as an example.
This commit is contained in:
		
							parent
							
								
									2e5606b845
								
							
						
					
					
						commit
						8e1745bd7a
					
				
							
								
								
									
										16
									
								
								src/hook.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								src/hook.c
									
									
									
									
									
								
							| @ -24,8 +24,10 @@ static int              hook_runningstack   = 0;  // Check if stack is running. | |||||||
| 
 | 
 | ||||||
| // Extern.
 | // Extern.
 | ||||||
| extern int misn_run(Mission* misn, char* func); | extern int misn_run(Mission* misn, char* func); | ||||||
|  | // Intern.
 | ||||||
|  | static int hook_run(Hook* hook); | ||||||
| 
 | 
 | ||||||
| int hook_run(Hook* hook) { | static int hook_run(Hook* hook) { | ||||||
|   int i; |   int i; | ||||||
|   Mission* misn; |   Mission* misn; | ||||||
| 
 | 
 | ||||||
| @ -129,6 +131,18 @@ int hooks_run(char* stack) { | |||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Run a single hook by id.
 | ||||||
|  | void hook_runID(int id) { | ||||||
|  |   int i; | ||||||
|  | 
 | ||||||
|  |   for(i = 0; i < hook_nstack; i++) | ||||||
|  |     if(hook_stack[i].id == id) { | ||||||
|  |       hook_run(&hook_stack[i]); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |   DEBUG("Attempting to run hook of id '%d' which is not in the stack", id); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Clean upi after ourselves.
 | // Clean upi after ourselves.
 | ||||||
| void hook_cleanup(void) { | void hook_cleanup(void) { | ||||||
|   free(hook_stack); |   free(hook_stack); | ||||||
|  | |||||||
| @ -18,6 +18,7 @@ void hook_rmParent(unsigned int parent); | |||||||
| // ========================================================
 | // ========================================================
 | ||||||
| 
 | 
 | ||||||
| int hooks_run(char* stack); | int hooks_run(char* stack); | ||||||
|  | void hook_runID(int id); // Runs hook of specific id.
 | ||||||
| 
 | 
 | ||||||
| // Destroy hook.
 | // Destroy hook.
 | ||||||
| void hook_cleanup(void); | void hook_cleanup(void); | ||||||
|  | |||||||
| @ -10,6 +10,7 @@ | |||||||
| #include "space.h" | #include "space.h" | ||||||
| #include "toolkit.h" | #include "toolkit.h" | ||||||
| #include "land.h" | #include "land.h" | ||||||
|  | #include "pilot.h" | ||||||
| #include "player.h" | #include "player.h" | ||||||
| #include "ltime.h" | #include "ltime.h" | ||||||
| #include "misn_lua.h" | #include "misn_lua.h" | ||||||
| @ -148,10 +149,12 @@ static const luaL_Reg tk_methods[] = { | |||||||
| static int hook_land(lua_State* L); | static int hook_land(lua_State* L); | ||||||
| static int hook_takeoff(lua_State* L); | static int hook_takeoff(lua_State* L); | ||||||
| static int hook_time(lua_State* L); | static int hook_time(lua_State* L); | ||||||
|  | static int hook_pilotDeath(lua_State* L); | ||||||
| static const luaL_Reg hook_methods[] = { | static const luaL_Reg hook_methods[] = { | ||||||
|   { "land",     hook_land     }, |   { "land",       hook_land       }, | ||||||
|   { "takeoff",  hook_takeoff  }, |   { "takeoff",    hook_takeoff    }, | ||||||
|   { "time",     hook_time     }, |   { "time",       hook_time       }, | ||||||
|  |   { "pilotDeath", hook_pilotDeath }, | ||||||
|   { 0, 0 } |   { 0, 0 } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -730,8 +733,8 @@ static int hook_generic(lua_State* L, char* stack) { | |||||||
|         cur_mission->data->name); |         cur_mission->data->name); | ||||||
|     return 0; |     return 0; | ||||||
|   } |   } | ||||||
|   hook_add(cur_mission->id, func, stack); |   i = hook_add(cur_mission->id, func, stack); | ||||||
|   return 0; |   return i; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int hook_land(lua_State* L) { | static int hook_land(lua_State* L) { | ||||||
| @ -749,3 +752,20 @@ static int hook_time(lua_State* L) { | |||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int hook_pilotDeath(lua_State* L) { | ||||||
|  |   MIN_ARGS(2); | ||||||
|  |   int h; | ||||||
|  |   unsigned int p; | ||||||
|  | 
 | ||||||
|  |   if(lua_isnumber(L, -2)) p = (unsigned int) lua_tonumber(L, -2); | ||||||
|  |   else { | ||||||
|  |     MISN_DEBUG("Invalid first param"); | ||||||
|  |     return 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   h = hook_generic(L, "death"); // We won't actually call the death stack directly.
 | ||||||
|  |   pilot_addHook(pilot_get(p), PILOT_HOOK_DEATH, h); | ||||||
|  | 
 | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | |||||||
							
								
								
									
										15
									
								
								src/pilot.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								src/pilot.c
									
									
									
									
									
								
							| @ -9,6 +9,7 @@ | |||||||
| #include "xml.h" | #include "xml.h" | ||||||
| #include "spfx.h" | #include "spfx.h" | ||||||
| #include "rng.h" | #include "rng.h" | ||||||
|  | #include "hook.h" | ||||||
| #include "pilot.h" | #include "pilot.h" | ||||||
| 
 | 
 | ||||||
| #define XML_ID    "Fleets" // XML section identifier.
 | #define XML_ID    "Fleets" // XML section identifier.
 | ||||||
| @ -274,6 +275,10 @@ void pilot_dead(Pilot* p) { | |||||||
| 
 | 
 | ||||||
|   // Our pilot is now deadz.
 |   // Our pilot is now deadz.
 | ||||||
|   pilot_setFlag(p, PILOT_DEAD); |   pilot_setFlag(p, PILOT_DEAD); | ||||||
|  | 
 | ||||||
|  |   // Run hook if pilot has a death hook.
 | ||||||
|  |   if(p->hook_type == PILOT_HOOK_DEATH) | ||||||
|  |     hook_runID(p->hook); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void pilot_setSecondary(Pilot* p, const char* secondary) { | void pilot_setSecondary(Pilot* p, const char* secondary) { | ||||||
| @ -712,6 +717,12 @@ int pilot_rmCargo(Pilot* pilot, Commodity* cargo, int quantity) { | |||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Add a hook to the pilot.
 | ||||||
|  | void pilot_addHook(Pilot* pilot, int type, int hook) { | ||||||
|  |   pilot->hook_type = type; | ||||||
|  |   pilot->hook = hook; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ==Init pilot.===========================================
 | // ==Init pilot.===========================================
 | ||||||
| // ship  : Ship pilot is flying.
 | // ship  : Ship pilot is flying.
 | ||||||
| // name  : Pilot's name, if NULL, ships name will be used.
 | // name  : Pilot's name, if NULL, ships name will be used.
 | ||||||
| @ -778,6 +789,10 @@ void pilot_init(Pilot* pilot, Ship* ship, char* name, int faction, | |||||||
|   pilot->ncommodities = 0; |   pilot->ncommodities = 0; | ||||||
|   pilot->cargo_free = pilot->ship->cap_cargo; |   pilot->cargo_free = pilot->ship->cap_cargo; | ||||||
| 
 | 
 | ||||||
|  |   // Hooks.
 | ||||||
|  |   pilot->hook_type = PILOT_HOOK_NONE; | ||||||
|  |   pilot->hook = 0; | ||||||
|  | 
 | ||||||
|   // Set flags and functions.
 |   // Set flags and functions.
 | ||||||
|   if(flags & PILOT_PLAYER) { |   if(flags & PILOT_PLAYER) { | ||||||
|     pilot->think = player_think; // Players don't need to thing! :P
 |     pilot->think = player_think; // Players don't need to thing! :P
 | ||||||
|  | |||||||
							
								
								
									
										14
									
								
								src/pilot.h
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/pilot.h
									
									
									
									
									
								
							| @ -17,8 +17,12 @@ | |||||||
| #define HYPERSPACE_FADEOUT        1000  // Time fadeout.
 | #define HYPERSPACE_FADEOUT        1000  // Time fadeout.
 | ||||||
| 
 | 
 | ||||||
| // Aproximation for pilot size.
 | // Aproximation for pilot size.
 | ||||||
| #define PILOT_SIZE_APROX      0.8 | #define PILOT_SIZE_APROX          0.8 | ||||||
| #define PILOT_DISABLED_ARMOUR 0.3 // Based on armour percentage.
 | #define PILOT_DISABLED_ARMOUR     0.3   // Based on armour percentage.
 | ||||||
|  | 
 | ||||||
|  | // Hooks.
 | ||||||
|  | #define PILOT_HOOK_NONE           0     // No hook.
 | ||||||
|  | #define PILOT_HOOK_DEATH          1     // Pilot died.
 | ||||||
| 
 | 
 | ||||||
| // Flags.
 | // Flags.
 | ||||||
| #define pilot_isFlag(p,f)   (p->flags & (f)) | #define pilot_isFlag(p,f)   (p->flags & (f)) | ||||||
| @ -98,6 +102,10 @@ typedef struct Pilot_ { | |||||||
|   uint32_t flags; // Used for AI etc.
 |   uint32_t flags; // Used for AI etc.
 | ||||||
|   unsigned int ptimer;  // Generic timer for internal pilot use.
 |   unsigned int ptimer;  // Generic timer for internal pilot use.
 | ||||||
| 
 | 
 | ||||||
|  |   // Hook attached to the pilot.
 | ||||||
|  |   int hook_type; | ||||||
|  |   int hook; | ||||||
|  | 
 | ||||||
|   // AI.
 |   // AI.
 | ||||||
|   AI_Profile* ai; // Ai personality profile.
 |   AI_Profile* ai; // Ai personality profile.
 | ||||||
|   unsigned int tcontrol; // Timer for control tick.
 |   unsigned int tcontrol; // Timer for control tick.
 | ||||||
| @ -174,3 +182,5 @@ void fleet_free(void); | |||||||
| void pilots_update(double dt); | void pilots_update(double dt); | ||||||
| void pilots_render(void); | void pilots_render(void); | ||||||
| 
 | 
 | ||||||
|  | void pilot_addHook(Pilot* pilot, int type, int hook); | ||||||
|  | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Allanis
						Allanis