From 2f59ae1b84bdb0bc13b027233d6d4ab00536b069 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Sun, 17 Mar 2013 16:36:59 +0000
Subject: [PATCH] [Add] Energy is actively in use now. ^.^

---
 TODO           |  1 -
 dat/outfit.xml |  9 ++++++---
 dat/ship.xml   | 12 ++++++------
 dat/start.xml  |  4 ++--
 src/land.c     |  1 +
 src/outfit.c   |  9 +++++++++
 src/outfit.h   | 13 ++++++++-----
 src/pilot.c    | 16 ++++++++++++++--
 8 files changed, 46 insertions(+), 19 deletions(-)

diff --git a/TODO b/TODO
index f1bc131..db8f9b3 100644
--- a/TODO
+++ b/TODO
@@ -2,7 +2,6 @@ Vital:
 	-- Missions
 	-- Save
 		-- Allow multiple ships in storage.
-	-- Make energy do something.
 	-- Main Menu.
 	-- Player death!
 	-- Player faction system.
diff --git a/dat/outfit.xml b/dat/outfit.xml
index 76edf0d..3f6af3b 100644
--- a/dat/outfit.xml
+++ b/dat/outfit.xml
@@ -15,7 +15,8 @@
       <delay>500</delay>
       <speed>550</speed>
       <range>300</range>
-      <accuracy>30</accuracy>
+			<accuracy>30</accuracy>
+			<energy>8</energy>
       <damage>
         <armour>13</armour>
         <shield>10</shield>
@@ -37,7 +38,8 @@
       <delay>300</delay>
       <speed>550</speed>
       <range>300</range>
-      <accuracy>30</accuracy>
+			<accuracy>30</accuracy>
+			<energy>10</energy>
       <damage>
         <armour>13</armour>
         <shield>10</shield>
@@ -131,7 +133,8 @@
       <delay>400</delay>
       <speed>650</speed>
       <range>200</range>
-      <accuracy>15</accuracy>
+			<accuracy>15</accuracy>
+			<energy>5</energy>
       <damage>
         <armour>7</armour>
         <shield>7</shield>
diff --git a/dat/ship.xml b/dat/ship.xml
index 23a7b16..8f684ea 100644
--- a/dat/ship.xml
+++ b/dat/ship.xml
@@ -20,7 +20,7 @@
 			<energy>240</energy>
 			<shield_regen>80</shield_regen>
 			<armour_regen>50</armour_regen>
-			<energy_regen>40</energy_regen>
+			<energy_regen>500</energy_regen>
 		</health>
 		<characteristics>
 			<crew>2</crew>
@@ -52,7 +52,7 @@
       <energy>180</energy>
       <shield_regen>150</shield_regen>
       <armour_regen>60</armour_regen>
-      <energy_regen>40</energy_regen>
+      <energy_regen>500</energy_regen>
     </health>
     <characteristics>
       <crew>2</crew>
@@ -84,7 +84,7 @@
 			<energy>900</energy>
 			<shield_regen>300</shield_regen>
 			<armour_regen>80</armour_regen>
-			<energy_regen>50</energy_regen>
+			<energy_regen>1400</energy_regen>
 		</health>
 		<characteristics>
 			<crew>35</crew>
@@ -118,7 +118,7 @@
 			<energy>360</energy>
 			<shield_regen>180</shield_regen>
 			<armour_regen>60</armour_regen>
-			<energy_regen>50</energy_regen>
+			<energy_regen>1080</energy_regen>
 		</health>
 		<characteristics>
 			<crew>9</crew>
@@ -152,7 +152,7 @@
 			<energy>200</energy>
 			<shield_regen>100</shield_regen>
 			<armour_regen>40</armour_regen>
-			<energy_regen>250</energy_regen>
+			<energy_regen>650</energy_regen>
 		</health>
 		<characteristics>
 			<crew>13</crew>
@@ -184,7 +184,7 @@
 			<energy>300</energy>
 			<shield_regen>240</shield_regen>
 			<armour_regen>420</armour_regen>
-			<energy_regen>240</energy_regen>
+			<energy_regen>600</energy_regen>
 		</health>
 		<characteristics>
 			<crew>1</crew>
diff --git a/dat/start.xml b/dat/start.xml
index 526a73b..96aca8c 100644
--- a/dat/start.xml
+++ b/dat/start.xml
@@ -3,8 +3,8 @@
   <player>
     <ship>Lancer</ship>
     <credits>
-      <low>5000</low>
-      <high>15000</high>
+      <low>50000</low>
+      <high>150000</high>
     </credits>
     <system>
       <name>KonoSys</name>
diff --git a/src/land.c b/src/land.c
index 3d3f6ee..1889b35 100644
--- a/src/land.c
+++ b/src/land.c
@@ -569,6 +569,7 @@ void takeoff(void) {
   // Heal the player.
   player->armour = player->armour_max;
   player->shield = player->shield_max;
+	player->energy = player->energy_max;
 
   space_init(NULL);
 
diff --git a/src/outfit.c b/src/outfit.c
index 8dd39ab..16694e6 100644
--- a/src/outfit.c
+++ b/src/outfit.c
@@ -126,6 +126,13 @@ int outfit_delay(const Outfit* o) {
 	return -1;
 }
 
+double outfit_energy(const Outfit* o) {
+	if(outfit_isWeapon(o)) 			return o->u.blt.energy;
+	else if(outfit_isAmmo(o)) 	return o->u.amm.energy;
+	else if(outfit_isTurret(o)) return o->u.blt.energy;
+	return -1.;
+}
+
 const char* outfit_typename[] = {
   "NULL",
   "Bolt Cannon",
@@ -180,6 +187,7 @@ static void outfit_parseSWeapon(Outfit* tmp, const xmlNodePtr parent) {
     else if(xml_isNode(node, "delay")) tmp->u.blt.delay = xml_getInt(node);
     else if(xml_isNode(node, "range")) tmp->u.blt.range = xml_getFloat(node);
     else if(xml_isNode(node, "accuracy")) tmp->u.blt.accuracy = xml_getFloat(node);
+		else if(xml_isNode(node, "energy")) tmp->u.blt.energy = xml_getFloat(node);
     else if(xml_isNode(node, "gfx")) {
       snprintf(str, strlen(xml_get(node))+sizeof(OUTFIT_GFX)+4, 
 						OUTFIT_GFX"%s.png", xml_get(node));
@@ -241,6 +249,7 @@ static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent) {
     if(xml_isNode(node, "thrust")) tmp->u.amm.thrust = xml_getFloat(node);
     else if(xml_isNode(node, "turn")) tmp->u.amm.turn = xml_getFloat(node);
     else if(xml_isNode(node, "speed")) tmp->u.amm.speed = xml_getFloat(node);
+		else if(xml_isNode(node, "energy")) tmp->u.amm.energy = xml_getFloat(node);
     else if(xml_isNode(node, "duration"))
 			tmp->u.amm.duration = (unsigned int)1000.*xml_getFloat(node);
 		else if(xml_isNode(node, "lockon"))
diff --git a/src/outfit.h b/src/outfit.h
index cb56c61..00d7bd4 100644
--- a/src/outfit.h
+++ b/src/outfit.h
@@ -47,9 +47,10 @@ typedef struct Outfit_ {
   union {
     struct { // Bolt.
       unsigned int delay; // Delay between shots.
-      double speed; // Speed of shot. (not applicable to beam.
+      double speed; 			// Speed of shot. (not applicable to beam.
       double range;
-      double accuracy; // Desviation accuracy.
+      double accuracy; 		// Desviation accuracy.
+			double energy;			// Energy usage.
       double damage_armour, damage_shield; // Damage.
 
       glTexture* gfx_space;
@@ -68,9 +69,10 @@ typedef struct Outfit_ {
     } lau;
     struct { // Ammo.
       unsigned int duration; // Duration.
-  		double speed; // Max speed.
-      double turn; // Turn vel.
-      double thrust; // Acceleration.
+  		double speed; 	// Max speed.
+      double turn; 		// Turn vel.
+      double thrust; 	// Acceleration.
+			double energy; 	// Energy usage.
       double damage_armour, damage_shield; // Damage.
 
 			glTexture* gfx_space;
@@ -98,6 +100,7 @@ int outfit_spfx(const Outfit* o);
 double outfit_dmgShield(const Outfit* o);
 double outfit_dmgArmour(const Outfit* o);
 int outfit_delay(const Outfit* o);
+double outfit_energy(const Outfit* o);
 
 // Load/free outfit stack.
 int outfit_load(void);
diff --git a/src/pilot.c b/src/pilot.c
index 4f00293..41df44e 100644
--- a/src/pilot.c
+++ b/src/pilot.c
@@ -171,6 +171,10 @@ static void pilot_shootWeapon(Pilot* p, PilotOutfit* w, const unsigned int t) {
     switch(w->outfit->type) {
 			case OUTFIT_TYPE_TURRET_BOLT:
       case OUTFIT_TYPE_BOLT:
+				// Enough energy?
+				if(outfit_energy(w->outfit) > p->energy) return;
+
+				p->energy -= outfit_energy(w->outfit);
         weapon_add(w->outfit, p->solid->dir, &p->solid->pos,
 							&p->solid->vel, p->id, t);
 
@@ -185,6 +189,10 @@ static void pilot_shootWeapon(Pilot* p, PilotOutfit* w, const unsigned int t) {
   // Must be secondary weapon, Shooter can't be the target.
   else if(outfit_isLauncher(w->outfit) && (w == p->secondary) && (p->id != t)) {
     if(p->ammo && (p->ammo->quantity > 0)) {
+			// Enough energy?
+			if(outfit_energy(w->outfit) > p->energy) return;
+
+			p->energy -= outfit_energy(w->outfit);
       weapon_add(p->ammo->outfit, p->solid->dir, &p->solid->pos,
 						&p->solid->vel, p->id, t);
 
@@ -349,13 +357,17 @@ static void pilot_update(Pilot* pilot, const double dt) {
     return;
   }
   // We are still alive.
-  else if(pilot->armour < pilot->armour_max)
+  else if(pilot->armour < pilot->armour_max) {
     pilot->armour += pilot->ship->armour_regen*dt;
-  else
+		pilot->energy += pilot->ship->energy_regen*dt;
+	} else {
     pilot->shield += pilot->ship->shield_regen*dt;
+		pilot->energy += pilot->ship->energy_regen*dt;
+	}
 
   if(pilot->armour > pilot->armour_max) pilot->armour = pilot->armour_max;
   if(pilot->shield > pilot->shield_max) pilot->shield = pilot->shield_max;
+	if(pilot->energy > pilot->energy_max) pilot->energy = pilot->energy_max;
 
   // Update the solid.
   (*pilot->solid->update)(pilot->solid, dt);