summaryrefslogtreecommitdiff
path: root/src/EventRunner.php
blob: 4f3bce995ee3c9d7c97d9d609a59494f8b5e7b30 (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
<?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;
use App\Model\Village;

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

    $results = DB::query('select * from events where time < now()')->fetchAll();

    foreach ($results as $row) {
      /**@var Event $event*/
      $event = DB::convertToModel(Event::resolveType($row['type']), $row);
      $event();

      DB::query(
        'delete from events where id=:id',
        ['id' => $event->id]
      );
    }


    // 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)]);
    }
  }
}