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