add solar_panels and calculate energy gen/use
[browser-rts.git] / src / repository / city.ts
index 28af69a252f387b1f77610f5751163a76e51a7a5..1094f10cff35e9ee13f205eea58ba82ffa4a5dff 100644 (file)
@@ -5,7 +5,7 @@ import * as config from '../config';
 import { BuildQueue, BuildQueueRepository } from './build-queue';
 import { DateTime, Duration } from 'luxon';
 import { UnitTrainingQueue, UnitTrainingQueueRepository } from './training-queue';
-import { coalesce } from '../lib/util';
+import { coalesce, pluck } from '../lib/util';
 import { Building, BuildingRepository } from './buildings';
 import { Unit, UnitRepository } from './unit';
 import _, { random } from 'lodash';
@@ -29,6 +29,7 @@ export type City = {
     homes: number;
     farms: number;
     warehouses: number;
+    solar_panels: number;
     barracks: number;
     special_attacker_trainer: number;
     special_defender_trainer: number;
@@ -77,6 +78,7 @@ export class CityRepository extends Repository<City> {
             homes: 20,
             farms: 5,
             warehouses: 5,
+            solar_panels: 5,
             barracks: 0,
             special_attacker_trainer: 0,
             special_defender_trainer: 0,
@@ -349,12 +351,23 @@ where l.sector_id = ?`, [sector_id]);
       )
     }
 
-    async energyProductionPerTic(city: City): Promise<number> {
-      return 0;
+    async energyProductionPerTick(city: City): Promise<number> {
+      return city.solar_panels * 125;
     }
 
     async energyUsagePerTick(city: City): Promise<number> {
-      return 0;
+      const buildings = await this.buildingRepository.list();
+      const buildingsMap = pluck<Building>(buildings, 'slug');
+      const totalEnergy = _.sum([
+        city.farms * buildingsMap['farms'].energy,
+        city.barracks * buildingsMap['barracks'].energy,
+        city.special_defender_trainer * buildingsMap['special_defender_trainer'].energy,
+        city.special_attacker_trainer * buildingsMap['special_attacker_trainer'].energy,
+        city.homes * buildingsMap['homes'].energy,
+        city.warehouses * buildingsMap['warehouses'].energy,
+        city.solar_panels * buildingsMap['solar_panels'].energy
+      ]);
+      return totalEnergy;
     }
 
     async attack(attacker: CityWithLocation, attacked: CityWithLocation, army: Army): Promise<ArmyQueue> {