[Add] Mission timers added.
This commit is contained in:
parent
1becd0d68a
commit
6ad8d75d2d
@ -414,6 +414,7 @@ static void update_routine(double dt) {
|
|||||||
weapons_update(dt);
|
weapons_update(dt);
|
||||||
spfx_update(dt);
|
spfx_update(dt);
|
||||||
pilots_update(dt);
|
pilots_update(dt);
|
||||||
|
missions_update(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -69,6 +69,8 @@ static int misn_setMarker(lua_State* L);
|
|||||||
static int misn_factions(lua_State* L);
|
static int misn_factions(lua_State* L);
|
||||||
static int misn_accept(lua_State* L);
|
static int misn_accept(lua_State* L);
|
||||||
static int misn_finish(lua_State* L);
|
static int misn_finish(lua_State* L);
|
||||||
|
static int misn_timerStart(lua_State* L);
|
||||||
|
static int misn_timerStop(lua_State* L);
|
||||||
static const luaL_reg misn_methods[] = {
|
static const luaL_reg misn_methods[] = {
|
||||||
{ "setTitle", misn_setTitle },
|
{ "setTitle", misn_setTitle },
|
||||||
{ "setDesc", misn_setDesc },
|
{ "setDesc", misn_setDesc },
|
||||||
@ -77,6 +79,8 @@ static const luaL_reg misn_methods[] = {
|
|||||||
{ "factions", misn_factions },
|
{ "factions", misn_factions },
|
||||||
{ "accept", misn_accept },
|
{ "accept", misn_accept },
|
||||||
{ "finish", misn_finish },
|
{ "finish", misn_finish },
|
||||||
|
{ "timerStart", misn_timerStart },
|
||||||
|
{ "timerStop", misn_timerStop },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -455,6 +459,77 @@ static int misn_finish(lua_State* L) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @fn static int misn_timerStart(lua_State* L)
|
||||||
|
*
|
||||||
|
* @brief number timerStart( string func, number delay )
|
||||||
|
*
|
||||||
|
* Start a timer.
|
||||||
|
* @param func Function to run when timer is up.
|
||||||
|
* @param delay Seconds to wait for timer.
|
||||||
|
* @return The timer being used.
|
||||||
|
*/
|
||||||
|
static int misn_timerStart(lua_State* L) {
|
||||||
|
LLUA_MIN_ARGS(2);
|
||||||
|
int i;
|
||||||
|
char* func;
|
||||||
|
double delay;
|
||||||
|
|
||||||
|
/* Parse arguments. */
|
||||||
|
if(lua_isstring(L,1))
|
||||||
|
func = (char*)lua_tostring(L,1);
|
||||||
|
else LLUA_INVALID_PARAMETER();
|
||||||
|
if(lua_isnumber(L,2))
|
||||||
|
delay = lua_tonumber(L,2);
|
||||||
|
else LLUA_INVALID_PARAMETER();
|
||||||
|
|
||||||
|
/* Add timer. */
|
||||||
|
for(i = 0; i < MISSION_TIMER_MAX; i++) {
|
||||||
|
if(cur_mission->timer[i] == 0.) {
|
||||||
|
cur_mission->timer[i] = delay;
|
||||||
|
cur_mission->tfunc[i] = strdup(func);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No timer found. */
|
||||||
|
if(i >= MISSION_TIMER_MAX) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the timer id. */
|
||||||
|
lua_pushnumber(L, i);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @fn static int misn_timerStop(lua_State* L)
|
||||||
|
*
|
||||||
|
* @brief timerStop(number t)
|
||||||
|
*
|
||||||
|
* Stop a timer previously started with timerStart().
|
||||||
|
* @param t Timer to stop.
|
||||||
|
*/
|
||||||
|
static int misn_timerStop(lua_State* L) {
|
||||||
|
LLUA_MIN_ARGS(1);
|
||||||
|
int t;
|
||||||
|
|
||||||
|
/* Parse arguments. */
|
||||||
|
if(lua_isnumber(L,1))
|
||||||
|
t = (int)lua_tonumber(L,1);
|
||||||
|
else LLUA_INVALID_PARAMETER();
|
||||||
|
|
||||||
|
/* Stop the timer. */
|
||||||
|
if(cur_mission->timer[t] != 0.) {
|
||||||
|
cur_mission->timer[t] = 0.;
|
||||||
|
if(cur_mission->tfunc[t] != NULL) {
|
||||||
|
free(cur_mission->tfunc[t]);
|
||||||
|
cur_mission->tfunc[t] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* -- Var. -- */
|
/* -- Var. -- */
|
||||||
|
|
||||||
/* Check if a variable exists. */
|
/* Check if a variable exists. */
|
||||||
|
@ -297,6 +297,35 @@ void mission_unlinkCargo(Mission* misn, unsigned int cargo_id) {
|
|||||||
player_rmMissionCargo(cargo_id);
|
player_rmMissionCargo(cargo_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @fn void missions_update(const double dt)
|
||||||
|
*
|
||||||
|
* @brief Update the missions triggering timers if needed.
|
||||||
|
* @param dt Curretn deltatick.
|
||||||
|
*/
|
||||||
|
void missions_update(const double dt) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for(i = 0; i < MISSION_MAX; i++) {
|
||||||
|
/* Mission must be active. */
|
||||||
|
if(player_missions[i].id != 0) {
|
||||||
|
for(j = 0; j < MISSION_TIMER_MAX; i++) {
|
||||||
|
/* Timer must be active. */
|
||||||
|
if(player_missions[i].timer[j] != 0.) {
|
||||||
|
player_missions[i].timer[j] -= dt;
|
||||||
|
|
||||||
|
if(player_missions[i].timer[j] < 0.) {
|
||||||
|
misn_run(&player_missions[i], player_missions[i].tfunc[j]);
|
||||||
|
player_missions[i].timer[j] = 0.;
|
||||||
|
free(player_missions[i].tfunc[j]);
|
||||||
|
player_missions[i].tfunc[j] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Clean up a mission. */
|
/* Clean up a mission. */
|
||||||
void mission_cleanup(Mission* misn) {
|
void mission_cleanup(Mission* misn) {
|
||||||
int i;
|
int i;
|
||||||
@ -327,6 +356,13 @@ void mission_cleanup(Mission* misn) {
|
|||||||
misn->cargo = NULL;
|
misn->cargo = NULL;
|
||||||
misn->ncargo = 0;
|
misn->ncargo = 0;
|
||||||
}
|
}
|
||||||
|
for(i = 0; i < MISSION_TIMER_MAX; i++) {
|
||||||
|
misn->timer[i] = 0.;
|
||||||
|
if(misn->tfunc[i] != NULL) {
|
||||||
|
free(misn->tfunc[i]);
|
||||||
|
misn->tfunc[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
if(misn->L) {
|
if(misn->L) {
|
||||||
lua_close(misn->L);
|
lua_close(misn->L);
|
||||||
misn->L = NULL;
|
misn->L = NULL;
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
#define MISSION_UNIQUE 1 /* Unique missions can't be repeated. */
|
#define MISSION_UNIQUE 1 /* Unique missions can't be repeated. */
|
||||||
|
|
||||||
|
#define MISSION_TIMER_MAX 4 /**< Maximum amount of timers in a mission. */
|
||||||
|
|
||||||
/* Static mission data. */
|
/* Static mission data. */
|
||||||
typedef struct MissionData_ {
|
typedef struct MissionData_ {
|
||||||
char* name; /* the name of the mission. */
|
char* name; /* the name of the mission. */
|
||||||
@ -59,6 +61,10 @@ typedef struct Mission_ {
|
|||||||
|
|
||||||
char* sys_marker; /* Marked system. */
|
char* sys_marker; /* Marked system. */
|
||||||
|
|
||||||
|
/* Timers. */
|
||||||
|
double timer[MISSION_TIMER_MAX];
|
||||||
|
char* tfunc[MISSION_TIMER_MAX];
|
||||||
|
|
||||||
lua_State* L; /* The state of the running lua code. */
|
lua_State* L; /* The state of the running lua code. */
|
||||||
} Mission;
|
} Mission;
|
||||||
|
|
||||||
@ -72,6 +78,7 @@ int mission_accept(Mission* mission);
|
|||||||
void missions_bar(int faction, char* planet, char* sysname);
|
void missions_bar(int faction, char* planet, char* sysname);
|
||||||
|
|
||||||
/* Misc. */
|
/* Misc. */
|
||||||
|
void missions_update(const double dt);
|
||||||
int mission_getID(char* name);
|
int mission_getID(char* name);
|
||||||
MissionData* mission_get(int id);
|
MissionData* mission_get(int id);
|
||||||
void mission_sysMark(void);
|
void mission_sysMark(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user