diff --git a/dat/start.xml b/dat/start.xml index 7d459f1..466e9d0 100644 --- a/dat/start.xml +++ b/dat/start.xml @@ -6,6 +6,10 @@ <low>500000</low> <high>1500000</high> </credits> + <date> + <low>1300</low> + <high>1400</high> + </date> <system> <name>KonoSys</name> <x>0</x> diff --git a/src/hook.h b/src/hook.h index 40ffa99..a0bf51b 100644 --- a/src/hook.h +++ b/src/hook.h @@ -6,7 +6,17 @@ int hook_add(unsigned int parent, char* func, char* stack); void hook_rm(int id); void hook_rmParent(unsigned int parent); -// Run hook. +// ======================================================== +// Run Hooks: +// +// Currently used: +// -- "land" - When landed. +// -- "takeoff" - When taking off. +// -- "jump" - When changing systems. +// -- "time" - When time is increment drastically +// (hyperspace and taking off. +// ======================================================== + int hooks_run(char* stack); // Destroy hook. diff --git a/src/land.c b/src/land.c index 621fde1..d94299c 100644 --- a/src/land.c +++ b/src/land.c @@ -7,6 +7,7 @@ #include "economy.h" #include "hook.h" #include "mission.h" +#include "ltime.h" #include "land.h" // Global/main window. @@ -973,6 +974,7 @@ void land(Planet* p) { // Takeoff from the planet. void takeoff(void) { int sw, sh, i; + char* lt; if(!landed) return; @@ -996,6 +998,12 @@ void takeoff(void) { player->shield = player->shield_max; player->energy = player->energy_max; + // Time goes by, triggers hook before takeoff. + ltime_inc(RNG(2*LTIME_UNIT_LENGTH, 3*LTIME_UNIT_LENGTH)); + lt = ltime_pretty(0); + player_message("taking off from %s on %s", land_planet->name, lt); + free(lt); + space_init(NULL); land_planet = NULL; diff --git a/src/ltime.c b/src/ltime.c new file mode 100644 index 0000000..ebedf29 --- /dev/null +++ b/src/ltime.c @@ -0,0 +1,45 @@ +#include <stdio.h> +#include <string.h> + +#include "lephisto.h" +#include "hook.h" +#include "ltime.h" + +static unsigned int lephisto_time = 0; + +// Get the current time. +unsigned int ltime_get(void) { + return lephisto_time; +} + +// Return the time in pretty text. +char* ltime_pretty(unsigned int t) { + unsigned int lt; + char str[128], *ret; + + if(t == 0) lt = lephisto_time; + else lt = t; + + // Galactic Date. + snprintf(str, 128, "GD %d.%03d", + lt / (1000*LTIME_UNIT_LENGTH), + (lt / (LTIME_UNIT_LENGTH)) % 1000); + + ret = strdup(str); + + return ret; +} + +// Set the time absolutely, does *not* generate an event, used at init. +void ltime_set(unsigned int t) { + lephisto_time = t; +} + +// Set the time relatively. +void ltime_inc(unsigned int t) { + lephisto_time += t; + + hooks_run("time"); +} + + diff --git a/src/ltime.h b/src/ltime.h new file mode 100644 index 0000000..89efd22 --- /dev/null +++ b/src/ltime.h @@ -0,0 +1,13 @@ +#pragma once + +// How long a 'unit' of time is. +#define LTIME_UNIT_LENGTH 1000 + +// Get. +unsigned int ltime_get(void); +char* ltime_pretty(unsigned int t); + +// Set. +void ltime_set(unsigned int t); +void ltime_inc(unsigned int t); + diff --git a/src/player.c b/src/player.c index bc75f05..d539ba0 100644 --- a/src/player.c +++ b/src/player.c @@ -17,6 +17,8 @@ #include "toolkit.h" #include "mission.h" #include "misn_lua.h" +#include "ltime.h" +#include "hook.h" #include "player.h" #define XML_GUI_ID "GUIs" // XML section identifier. @@ -167,7 +169,7 @@ static void player_newMake(void) { char system[20]; uint32_t bufsize; char* buf = pack_readfile(DATA, START_DATA, &bufsize); - int l, h; + int l, h, tl, th; double x, y; xmlNodePtr node, cur, tmp; @@ -196,7 +198,7 @@ static void player_newMake(void) { do { if(xml_isNode(tmp, "low")) l = xml_getInt(tmp); else if(xml_isNode(tmp, "high")) h = xml_getInt(tmp); - } while((tmp = tmp->next)); + } while(xml_nextNode(tmp)); } else if(xml_isNode(cur, "system")) { tmp = cur->children; @@ -206,10 +208,18 @@ static void player_newMake(void) { // Position. else if(xml_isNode(tmp, "x")) x = xml_getFloat(tmp); else if(xml_isNode(tmp, "y")) y = xml_getFloat(tmp); - } while((tmp = tmp->next)); + } while(xml_nextNode(tmp)); } else if(xml_isNode(cur, "combat_crating")) combat_crating = xml_getInt(cur); + + else if(xml_isNode(cur, "date")) { + tmp = cur->children; + do { + if(xml_isNode(tmp, "low")) tl = xml_getInt(tmp); + else if(xml_isNode(tmp, "high")) th = xml_getInt(tmp); + } while(xml_nextNode(tmp)); + } } while((cur = cur->next)); } }while((node = node->next)); @@ -221,6 +231,9 @@ static void player_newMake(void) { // Money. player_credits = RNG(l, h); + // Time. + ltime_set(RNG(tl*1000*LTIME_UNIT_LENGTH, th*1000*LTIME_UNIT_LENGTH)); + // Welcome message. player_message("Welcome to "APPNAME"!"); player_message("v%d.%d.%d", VMAJOR, VMINOR, VREV); @@ -1236,6 +1249,15 @@ void player_jump(void) { // Player actually broke hyperspace (Let's enter a new system). void player_brokeHyperspace(void) { + unsigned int tl, th; + + // Calculate the time it takes, call before space_init. + tl = (unsigned int) floor(sqrt((double)player->solid->mass)/5.); + th = (unsigned int) ceil(sqrt((double)player->solid->mass)/5.); + tl *= LTIME_UNIT_LENGTH; + th *= LTIME_UNIT_LENGTH; + ltime_inc(RNG(tl, th)); + // Enter the new system. space_init(systems_stack[cur_system->jumps[hyperspace_target]].name); @@ -1246,6 +1268,8 @@ void player_brokeHyperspace(void) { // Stop hyperspace. pilot_rmFlag(player, PILOT_HYPERSPACE | PILOT_HYP_BEGIN | PILOT_HYP_PREP); + hooks_run("jump"); + player_message("BANG!"); } diff --git a/src/space.c b/src/space.c index 89905c6..cdaab00 100644 --- a/src/space.c +++ b/src/space.c @@ -12,6 +12,7 @@ #include "weapon.h" #include "toolkit.h" #include "spfx.h" +#include "ltime.h" #include "player.h" #define XML_PLANET_ID "Planets" @@ -50,10 +51,6 @@ int systems_nstack = 0; // Number of star systems. static int nplanets = 0; // Total number of loaded planets - A little silly. StarSystem* cur_system = NULL; // Current star system. -// Current stardate in nice format. -char* stardate = "Stardate"; -unsigned int date = 0; // time since epoch. - // Fleet spawn rate. unsigned int spawn_timer = 0; // Controls spawn rate. @@ -333,6 +330,7 @@ static void space_addFleet(Fleet* fleet) { // Init the system. void space_init(const char* sysname) { + char* lt; int i; // Cleanup some stuff. @@ -350,7 +348,9 @@ void space_init(const char* sysname) { if(i == systems_nstack) ERR("System %s not found in stack", sysname); cur_system = systems_stack+i; - player_message("Entering System %s on %s", sysname, stardate); + lt = ltime_pretty(0); + player_message("Entering System %s on %s", sysname, lt); + free(lt); // Set up stars. nstars = (cur_system->stars*gl_screen.w*gl_screen.h+STAR_BUF*STAR_BUF)/(800*640); diff --git a/src/xml.h b/src/xml.h index 4e75490..bf6219f 100644 --- a/src/xml.h +++ b/src/xml.h @@ -9,6 +9,10 @@ #define xml_isNode(n,s) (((n)->type == XML_NODE_START) && \ (strcmp((char*)(n)->name, s)==0)) +// Get the next node. +#define xml_nextNode(n) \ + ((n!=NULL) && ((n = n->next) != NULL)) + // Get the property s of node n. This mallocs. #define xml_nodeProp(n,s) (char*)xmlGetProp(n, (xmlChar*)s)