summaryrefslogtreecommitdiff
path: root/src/EventRunner.php
blob: 7dd773d6d1e96b29beb4175132fa7fe3ed845f6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php

namespace App;

use App\Model\Building;
use App\Model\Building\ClayPit;
use App\Model\Building\Farm;
use App\Model\Building\IronMine;
use App\Model\Building\ResourceGenerator;
use App\Model\Building\Storage;
use App\Model\Building\WoodCutter;
use App\Model\Event\SendUnits;
use App\Model\Event\TrainUnits;
use App\Model\Event\UpgradeBuilding;
use App\Model\Village;

class EventRunner
{
  public function __construct()
  {
    // Events

    # Upgrade Building

    $results = DB::query(<<<SQL
      select * from events
      inner join events_upgrade_building as event
      on events.id = event.event_id
      where events.time < now()
    SQL)->fetchAll();

    foreach ($results as $row) {
      /**@var UpgradeBuilding $event*/
      $event = DB::convertToModel(UpgradeBuilding::class, $row);
      $event();

      $event->dbDelete();
    }

    # Train Units

    $results = DB::query(<<<SQL
      select * from events
      inner join events_train_units as event
      on events.id = event.event_id
      where events.time < now()
    SQL)->fetchAll();

    foreach ($results as $row) {
      /**@var TrainUnits $event*/
      $event = DB::convertToModel(TrainUnits::class, $row);
      $event();

      $event->dbDelete();
    }

    # Send Units

    $results = DB::query(<<<SQL
      select * from events
      inner join events_send_units as event
      on events.id = event.event_id
      where events.time < now()
    SQL)->fetchAll();

    foreach ($results as $row) {
      /**@var SendUnits $event*/
      $event = DB::convertToModel(SendUnits::class, $row);
      $event();

      $event->dbDelete();
    }


    // Resources

    $lastTick = json_decode(DB::query('select value from system where key=:key', ['key' => 'last_resource_tick'])->fetchColumn());
    if ($lastTick) {
      $lastTick = new \DateTime($lastTick);
    } else {
      $lastTick = (new \DateTime())->modify('- 1 min');
    }

    $diff = (new \DateTime())->diff($lastTick);
    $tickMultiplier = $diff->i;

    if ($tickMultiplier > 0) {
      $villages = DB::fetch(Village::class, 'select id,wood,clay,iron,food from villages');
      foreach ($villages as $village) {
        /**@var Village $village*/

        /**@var array<int, WoodCutter|ClayPit|IronMine|Farm> $resourceGenerators*/
        $resourceGenerators = [];

        /**@var Storage $storage*/
        $storage = null;

        /**@var Building[] $buildings*/
        $buildings = DB::fetch(ResourceGenerator::class, 'select level,type,village_id from village_buildings where village_id=:id', ['id' => $village->id]);
        foreach ($buildings as $building) {
          if ($building->type == 'Storage') {
            $storage = $building->cast();
          }
          else if (in_array($building->type, ['WoodCutter', 'ClayPit', 'IronMine', 'Farm'])) {
            $resourceGenerators[] = $building->cast();
          }
        }

        $resources = [];
        foreach ($resourceGenerators as $generator) {
          $village->{$generator->resourceType} = min(
            $village->{$generator->resourceType} + ($generator->getResourceIncrementor() * $tickMultiplier),
            $storage->getResourceCapacity($generator->resourceType)
          );
        }

        DB::query(
          'update villages set wood=:wood, clay=:clay, iron=:iron, food=:food where id=:id',
          ['wood' => $village->wood, 'clay' => $village->clay, 'iron' => $village->iron, 'food' => $village->food, 'id' => $village->id]
        );
      }

      DB::query('delete from system where key=:key', ['key' => 'last_resource_tick']);
      $lastResourceTickMinute = (new \DateTime((new \DateTime())->format('Y-m-d H:i')))->format('c');
      DB::query('insert into system (key,value) VALUES (:key,:value)', ['key' => 'last_resource_tick', 'value' => json_encode($lastResourceTickMinute)]);
    }
  }
}