summaryrefslogtreecommitdiff
path: root/src/Model/Village.php
blob: cd1c74970d1fa170753874585503ac5b9666c439 (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
129
130
131
132
133
134
135
<?php

namespace App\Model;

use App\DB;
use App\Model\Building\Storage;
use App\Model\Village\StorageConfig;

class Village
{
  public int $id;

  public string $name;

  public int $x;
  public int $y;

  public int $wood;
  public int $clay;
  public int $iron;
  public int $food;

  public int $satisfaction;

  public string $createdAt;
  public string $updatedAt;

  public static function canBuild(Village $village, Building $building): bool
  {
    if ($building->level >= $building->maxLevel) {
      return false;
    }

    $resourceRequirements = $building->getResourceRequirements();
    foreach ($resourceRequirements as $resourceType => $requirement) {
      if ($village->$resourceType < $requirement) {
        return false;
      }
    }

    return true;
  }

  /* DB - Actions */

  public static function get(int $id): ?Village
  {
    return DB::fetch(Village::class, 'select * from villages where id=:id', ['id' => $id])[0] ?? null;
  }

  public static function getByCoordinates(int $x, int $y): ?Village
  {
    return DB::fetch(Village::class, 'select * from villages where x=:x and y=:y', ['x' => $x, 'y' => $y])[0] ?? null;
  }

  public function updateResources(): mixed
  {
    return DB::query(
      'update villages set wood=:wood,clay=:clay,iron=:iron,food=:food where id=:id',
      ['wood' => $this->wood, 'clay' => $this->clay, 'iron' => $this->iron, 'food' => $this->food, 'id' => $this->id]
    );
  }

  /* DB - Relations */

  public static function getBuildings(int $villageId): array
  {
    $buildings = DB::fetch(Building::class, 'select * from village_buildings where village_id=:id', ['id' => $villageId]);

    return array_map(function (Building $building) {
      return $building->cast();
    }, $buildings);
  }

  public static function getBuilding(int $villageId, string $buildingType): ?Building
  {
    $results = DB::fetch(
      Building::resolveType($buildingType),
      'select * from village_buildings where village_id=:id and type=:type',
      ['id' => $villageId, 'type' => $buildingType]
    );

    return isset($results[0]) ? $results[0]->cast() : null;
  }

  public static function getStorage(int $villageId): ?Storage
  {
    return Village::getBuilding($villageId, 'Storage');
  }

  public static function getStorageConfig(int $villageId): ?StorageConfig
  {
    $results = DB::fetch(
      StorageConfig::class,
      'select * from village_storage_config where village_id=:id',
      ['id' => $villageId]
    );

    return $results[0] ?? null;
  }

  public const FETCH_UNIT_HOME_AT_HOME = 1;
  public const FETCH_UNIT_HOME_AT_SUPPORT = 2;
  public const FETCH_UNIT_SUPPORT_AT_HOME = 3;
  public const FETCH_UNIT_RESIDENCE = 4;

  public static function getUnit(string $unitType, int $flag): ?Unit
  {
  }

  /**
   * @param int $flag
   *
   * @return array<int, Unit>
   */
  public static function getUnits(int $villageId, $flag = Village::FETCH_UNIT_ALL): array
  {
    if ($flag == Village::FETCH_UNIT_HOME_AT_HOME) {
      $units = DB::fetch(Unit::class, 'select * from village_units where home_village_id=:id and residence_village_id=:id', ['id' => $villageId]);
    }
    else if ($flag == Village::FETCH_UNIT_HOME_AT_SUPPORT) {
      $units = DB::fetch(Unit::class, 'select * from village_units where home_village_id=:id and residence_village_id!=:id', ['id' => $villageId]);
    }
    else if ($flag == Village::FETCH_UNIT_SUPPORT_AT_HOME) {
      $units = DB::fetch(Unit::class, 'select * from village_units where home_village_id!=:id and residence_village_id=:id', ['id' => $villageId]);
    }
    else if ($flag == Village::FETCH_UNIT_RESIDENCE) {
      $units = DB::fetch(Unit::class, 'select * from village_units where residence_village_id=:id', ['id' => $villageId]);
    }

    return array_map(function (Unit $unit) {
      return $unit->cast();
    }, $units);
  }
}