Additions

+Added the beerfest (in the brewery)
+Added a better catapult targets checking system
+Updated the sql struct with the new one
This commit is contained in:
iopietro
2018-09-22 15:13:04 +02:00
parent 0065cb3970
commit b4da6e2274
15 changed files with 1013 additions and 1320 deletions
+5
View File
@@ -1,3 +1,8 @@
-- 21.09.2018 changed a column type and added a column, changed 23 attributes and 12 columns default value
ALTER TABLE `s1_a2b` CHANGE `ckey` `ckey` CHAR(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0';
ALTER TABLE `s1_vdata` CHANGE `owner` `owner` INT(11) NOT NULL DEFAULT '5', CHANGE `name` `name` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL, CHANGE `capital` `capital` TINYINT(1) NOT NULL DEFAULT '0', CHANGE `pop` `pop` INT(11) NOT NULL DEFAULT '2', CHANGE `cp` `cp` INT(11) NOT NULL DEFAULT '0', CHANGE `celebration` `celebration` INT(11) NOT NULL DEFAULT '0', CHANGE `type` `type` INT(11) NOT NULL DEFAULT '3', CHANGE `wood` `wood` FLOAT(12,2) NOT NULL DEFAULT '0', CHANGE `clay` `clay` FLOAT(12,2) NOT NULL DEFAULT '0', CHANGE `iron` `iron` FLOAT(12,2) NOT NULL DEFAULT '0', CHANGE `maxstore` `maxstore` INT(11) NOT NULL DEFAULT '0', CHANGE `crop` `crop` FLOAT(12,2) NOT NULL DEFAULT '0', CHANGE `maxcrop` `maxcrop` INT(11) NOT NULL DEFAULT '0', CHANGE `lastupdate` `lastupdate` INT(11) NOT NULL DEFAULT '0', CHANGE `lastupdate2` `lastupdate2` INT(11) NOT NULL DEFAULT '0', CHANGE `loyalty` `loyalty` FLOAT(9,6) NOT NULL DEFAULT '100.000000', CHANGE `exp1` `exp1` INT(11) NOT NULL DEFAULT '0', CHANGE `exp2` `exp2` INT(11) NOT NULL DEFAULT '0', CHANGE `exp3` `exp3` INT(11) NOT NULL DEFAULT '0', CHANGE `created` `created` INT(11) NOT NULL DEFAULT '0', CHANGE `natar` `natar` TINYINT(1) NOT NULL DEFAULT '0', CHANGE `starv` `starv` INT(11) NOT NULL DEFAULT '0', CHANGE `starvupdate` `starvupdate` INT(11) NOT NULL DEFAULT '0', CHANGE `evasion` `evasion` TINYINT(1) NOT NULL DEFAULT '0';
ALTER TABLE `s1_users` ADD `beerfest` INT(11) NOT NULL DEFAULT '0' AFTER `timestamp`;
-- 19.09.2018 added a column, an index, changed 15 columns default value and 14 columns attribute
ALTER TABLE `s1_a2b` ADD `from` INT(11) NOT NULL AFTER `ckey`;
ALTER TABLE `s1_a2b` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT, CHANGE `ckey` `ckey` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0', CHANGE `from` `from` INT(11) NOT NULL DEFAULT '0', CHANGE `to` `to` INT(11) NOT NULL DEFAULT '0', CHANGE `u1` `u1` INT(11) NOT NULL DEFAULT '0', CHANGE `u2` `u2` INT(11) NOT NULL DEFAULT '0', CHANGE `u3` `u3` INT(11) NOT NULL DEFAULT '0', CHANGE `u4` `u4` INT(11) NOT NULL DEFAULT '0', CHANGE `u5` `u5` INT(11) NOT NULL DEFAULT '0', CHANGE `u6` `u6` INT(11) NOT NULL DEFAULT '0', CHANGE `u7` `u7` INT(11) NOT NULL DEFAULT '0', CHANGE `u8` `u8` INT(11) NOT NULL DEFAULT '0', CHANGE `u9` `u9` INT(11) NOT NULL DEFAULT '0', CHANGE `u10` `u10` INT(11) NOT NULL DEFAULT '0', CHANGE `u11` `u11` INT(11) NOT NULL DEFAULT '0', CHANGE `type` `type` SMALLINT(1) NOT NULL DEFAULT '0';
+57
View File
@@ -3,6 +3,8 @@
namespace TravianZ\Data\Buildings;
use TravianZ\Entity\Building;
use TravianZ\Entity\Village;
use TravianZ\Entity\BeerFest;
final class Brewery extends Building
{
@@ -37,4 +39,59 @@ final class Brewery extends Building
$buildingRequirements
);
}
/**
* Check if the passed village has enough resources to start a beer fest
*
* @param Village $village
* @return array Returns the needed resources (with the right keys) to start a beer fest
*/
public function checkEnoughBeerFestResources(Village $village): array
{
// Initialize
$neededResources = [];
// Check the resources quantity
foreach (BeerFest::NEEDED_RESOURCES as $key => $value) {
// Set the new key
$newKey = array_keys($village->getResources())[$key];
// Check if the resource isn't enough
if ($village->getResources()[$newKey] < BeerFest::NEEDED_RESOURCES[$key]) {
return [];
}
// Add the resource
$neededResources[$newKey] = -BeerFest::NEEDED_RESOURCES[$key];
}
return $neededResources;
}
/**
* Start a beerfest
*
* @param Village $village
*/
public function startBeerFest(Village $village)
{
// Check if the beer fest hasn't already been started
if ($village->owner->isBeerFestActive()) {
return;
}
// Initialize
$neededResources = $this->checkEnoughBeerFestResources($village);
// Check if the beer fest can be started
if (empty($neededResources)) {
return;
}
// Start the beerFest
(new BeerFest($this->getDatabase(), $village->owner))->start();
// Remove the resources from the village
$village->updateResources($neededResources);
}
}
+24 -14
View File
@@ -155,7 +155,12 @@ final class RallyPoint extends Building
* {@inheritdoc}
* @see \TravianZ\Entity\Building::getBonus()
*/
public function getBonus(){
public function getBonus(int $level = 0){
// Check if a level has been defined
if ($level > 0) {
return $this->bonus[$level];
}
// Initialize
$bonus = [];
@@ -841,7 +846,7 @@ final class RallyPoint extends Building
// Check if it's a normal attack and there is atleast one catapult
if ($parameters['c'] == MovementEnums::NORMAL && $parameters['units'][8] > 0) {
$catapultTargets = $this->getBonus();
$catapultTargets = $this->getBonus($village->owner->isBeerFestActive() ? 1 : 0);
}
// Set the buildings
@@ -849,7 +854,7 @@ final class RallyPoint extends Building
foreach ($targets as $buildingID) {
$building = BuildingsFactory::newBuilding($buildingID, 0, 0);
$catapultTarget['id'] = $building->id;
$catapultTarget['name'] = $building->name;
$catapultTarget['name'] = $buildingID == BuildingEnums::EMPTY ? RANDOM : $building->name;
$catapultTargetBuildings[$type][] = $catapultTarget;
}
}
@@ -980,27 +985,32 @@ final class RallyPoint extends Building
// Initialize
$validTargets = 0;
// Check the catapult targets correctness
foreach ($this->getBonus() as $validCatapultTargets) {
foreach ($this->getBonus($village->owner->isBeerFestActive() ? 1 : 0) as $validCatapultTargets) {
foreach ($validCatapultTargets as $buildingID) {
// Check if the selected targets are on the list
if (
($parameters['ctar1'] == BuildingEnums::EMPTY ||
$parameters['ctar1'] == $buildingID) ||
($parameters['ctar2'] == BuildingEnums::EMPTY ||
$parameters['ctar2'] == -1 ||
$parameters['ctar2'] == $buildingID)
) {
if ($parameters['ctar1'] == $buildingID) {
$validTargets++;
}
// Check if the selected targets are on the list
// and if there are more than 20 catapults, in case of double target
if (
($parameters['ctar2'] ?? - 1) == -1 ||
($parameters['ctar2'] == $buildingID &&
$preparedUnits['units'][8] >= 20)
) {
$validTargets++;
}
// If all targets are valid, break the for
if ($validTargets == 2) {
break;
}
}
}
// Check if the selected targets are valid
if ($validTargets < 2) {
return [];
@@ -1024,7 +1034,7 @@ final class RallyPoint extends Building
}
// Set the hero if present
if ($parameters['units'][11] > 0) {
if ($preparedUnits['units'][11] > 0) {
$units[$i] = $village->getUnits()[11];
}
+1 -1
View File
@@ -101,7 +101,7 @@ abstract class Attack extends Movement
$this->units[10]->amount ?? 0,
$this->units[11]->amount ?? 0,
$this->catapultTargets[0] ?? 0,
$this->catapultTargets[1] ?? 0,
$this->catapultTargets[1] ?? -1,
$this->spy ?? 0
);
+71
View File
@@ -0,0 +1,71 @@
<?php
/*
* This file is part of the TravianZ Project
*
* Source code: <https://github.com/Shadowss/TravianZ/>
*
* Author: iopietro <https://github.com/iopietro>
*
* License: GNU GPL-3.0 <https://github.com/Shadowss/TravianZ/blob/master/LICENSE>
*
* Copyright 2010-2018 TravianZ Team
*/
namespace TravianZ\Entity;
use TravianZ\Database\IDbConnection;
/**
* @author iopietro
*/
class BeerFest
{
/**
* @var int The base duration of a beer fest (3 days)
*/
const BASE_DURATION = 259200;
/**
* @var int The needed resources to start a beer fest
*/
const NEEDED_RESOURCES = [3870, 1680, 215, 10900];
/**
* @var User The beerFest owner
*/
public $owner;
/**
* @var IDbConnection
*/
private $db;
public function __construct(
IDbConnection $db,
User $owner
) {
$this->db = $db;
$this->owner = $owner;
}
/**
* Start a beerfest
*/
public function start()
{
// Set the new beer fest time and update it on the database
$this->owner->setBeerFestEndTime(time() + self::BASE_DURATION);
$this->owner->setUserFields(['beerfest'], [$this->owner->getBeerFestEndTime()]);
}
/**
* Get the total needed resources
*
* @return int Returns the total needed resources
*/
public function getTotalNeededResources(): int
{
return array_sum(self::NEEDED_RESOURCES);
}
}
+36 -2
View File
@@ -127,6 +127,11 @@ class User
*/
public $selectedVillage;
/**
* @var int The beer fest end time
*/
private $beerFestTime;
/**
* @var bool Determines if the User has enabled the vacation mode.
*/
@@ -297,8 +302,6 @@ class User
$this->access = $res['access'];
$this->beginnerProtectionEndTime = $res['protect'];
$this->ok = $res['ok'];
$this->vacationModeEnabled = $res['vac_mode'];
$this->vacationTime = $res['vac_time'];
$this->questNumber = $res['quest'];
$this->maxEvasion = $res['maxevasion'];
$this->selectedVillage = $res['actualvillage'];
@@ -306,6 +309,9 @@ class User
// Set private properties
$this->sitters = [$res['sit1'], $res['sit2']];
$this->password = $res['password'];
$this->beerFestTime = $res['beerfest'];
$this->vacationModeEnabled = $res['vac_mode'];
$this->vacationTime = $res['vac_time'];
// Set the User's villages
$this->setVillages();
@@ -351,6 +357,34 @@ class User
return $this->vacationModeEnabled && $this->vacationTime > time();
}
/**
* Check if the user is on vacation
*
* @return bool Returns true if the User is on vaction, false otherwise
*/
public function isBeerFestActive(): bool
{
return $this->beerFestTime > time();
}
/**
* Get the beer fest end time
*
* @return bool Returns the beer fest end time
*/
public function getBeerFestEndTime(): int
{
return $this->beerFestTime;
}
/**
* Set the beer fest end time
*/
public function setBeerFestEndTime(int $newTime)
{
$this->beerFestTime = $newTime;
}
/**
* Check if the user started the account deletion process
*
+11 -6
View File
@@ -195,16 +195,21 @@ abstract class BuildingsFactory
return array_combine(range(0, 20), range(100, 300, 10));
case BuildingEnums::RALLY_POINT:
return [
1 => [],
1 => [
0 =>
[
BuildingEnums::EMPTY
]
],
3 => [
2 =>
3 =>
[
BuildingEnums::WAREHOUSE,
BuildingEnums::GRANARY
]
],
],
5 => [
0 =>
1 =>
[
BuildingEnums::WOODCUTTER,
BuildingEnums::CLAY_PIT,
@@ -218,7 +223,7 @@ abstract class BuildingsFactory
]
],
10 => [
1 =>
2 =>
[
BuildingEnums::ACADEMY,
BuildingEnums::BARRACKS,
@@ -234,7 +239,7 @@ abstract class BuildingsFactory
BuildingEnums::TOURNAMENT_SQUARE
],
2 =>
3 =>
[
2 => BuildingEnums::BREWERY,
BuildingEnums::EMBASSY,
+4
View File
@@ -686,6 +686,10 @@ define("PASSWORD_SENT", "If the email address exists, a new password has been se
define("PASSWORD_SET_SUCCESS", "The password was set successfully.");
define("NEW_PASSWORD_ERROR", "Invalid code, password or the password has already been set.");
//BEER FEST
define("BEER_FEST","Beer fest");
define("CELEBRATION","Celebration");
//ATTACKS ETC.
define("TROOP_MOVEMENTS","Troop Movements:");
define("ARRIVING_REINF_TROOPS","Arriving reinforcing troops");
+31
View File
@@ -38,6 +38,8 @@ use TravianZ\Exceptions\InvalidParametersException;
use TravianZ\Factory\BuildingsFactory;
use TravianZ\Mvc\Model;
use TravianZ\Utils\Generator;
use TravianZ\Data\Buildings\Brewery;
use TravianZ\Entity\BeerFest;
/**
* @author iopietro
@@ -879,4 +881,33 @@ class BuildingModel extends Model
['villageFarmLists' => $farmLists]
);
}
/**
* Manage the brewery
*
* @param Brewery $building
* @param Village $village
* @param array $parameters
*/
public function manageBrewery(Brewery $building, Village $village, array $parameters)
{
// Check if there's an action to execute
// TODO: Don't repeat it every time
if (isset($parameters['POST']['action'])) {
$action = $parameters['POST']['action'];
if (method_exists($building, $action)) {
$results = $building->$action($village, $parameters['POST']);
}
}
return [
'beerFest' => [
'neededResources' => BeerFest::NEEDED_RESOURCES,
'duration' => Generator::getTimeFormat(BeerFest::BASE_DURATION),
'error' => $village->owner->isBeerFestActive() ?
Generator::getTimeFormat($village->owner->getBeerFestEndTime() - $this->time) :
(empty($building->checkEnoughBeerFestResources($village)) ? TOO_FEW_RESOURCES : '')
]
];
}
}
+2 -4
View File
@@ -69,13 +69,11 @@
<tr>
<th>{$smarty.const.DESTINATION}:</th>
<td colspan="{$colspan}">
{$targetName = 'ctar1'}
{$randomTargetValue = 0}
{$targetType = 1}
{include file=$smarty.const.TEMPLATES_DIR|cat:'sendUnits/catapultTargets.tpl'}
{if $units[8] >= 20}
{$targetName = 'ctar2'}
{$randomTargetValue = -1}
{$targetType = 2}
{include file=$smarty.const.TEMPLATES_DIR|cat:'sendUnits/catapultTargets.tpl'}
{/if}
</td>
+12 -6
View File
@@ -1,10 +1,16 @@
{$groupNames = [$smarty.const.RESOURCES, $smarty.const.INFRASTRUCTURE, $smarty.const.MILITARY]}
{$groupNames = [1 => $smarty.const.RESOURCES, $smarty.const.INFRASTRUCTURE, $smarty.const.MILITARY]}
<select name="{$targetName}" class="dropdown">
{if $randomTargetValue < 0}
<option value="{$randomTargetValue + 1}">-</option>
<select name="ctar{$targetType}" class="dropdown">
{if $targetType > 1}
<option value="-1">-</option>
{/if}
<option value="{$randomTargetValue}">{$smarty.const.RANDOM}</option>
{if !empty($catapultTargetBuildings[0])}
{foreach $catapultTargetBuildings[0] as $building}
<option value="{$building.id}">{$building.name}</option>
{/foreach}
{/if}
{foreach $groupNames as $type => $groupName}
{if !empty($catapultTargetBuildings[$type])}
<optgroup label="{$groupName}">
@@ -14,4 +20,4 @@
</optgroup>
{/if}
{/foreach}
</select>
</select>
+3 -1
View File
@@ -1,2 +1,4 @@
{assign var=bonusTexts value=[$smarty.const.CURRENT_BONUS, $smarty.const.BONUS_LEVEL, $smarty.const.PERCENT]}
{include file={$smarty.const.TEMPLATES_DIR}|cat:'village/buildings/showBonus.tpl'}
{include file={$smarty.const.TEMPLATES_DIR}|cat:'village/buildings/showBonus.tpl'}
<br />
{include file={$smarty.const.TEMPLATES_DIR}|cat:'village/buildings/brewery/beerFest.tpl'}
@@ -0,0 +1,40 @@
<form action="build.php?id={$parameters['id']}" method="post" id="start">
<input type="hidden" name="action" value="startBeerFest">
<table cellpadding="1" cellspacing="1" class="build_details">
<thead>
<tr>
<td>{$smarty.const.CELEBRATION}</td>
<td>{$smarty.const.ACTION}</td>
</tr>
</thead>
<tbody>
<tr>
<td class="desc">
<div class="tit">
<a href="#" onClick="return Popup(0, 1);">{$smarty.const.BEER_FEST}</a>
</div>
<div class="details">
<img class="r1" src="assets/img/x.gif" alt="{$smarty.const.LUMBER}" title="{$smarty.const.LUMBER}" />{$beerFest['neededResources'][0]}|
<img class="r2" src="assets/img/x.gif" alt="{$smarty.const.CLAY}" title="{$smarty.const.CLAY}" />{$beerFest['neededResources'][1]}|
<img class="r3" src="assets/img/x.gif" alt="{$smarty.const.IRON}" title="{$smarty.const.IRON}" />{$beerFest['neededResources'][2]}|
<img class="r4" src="assets/img/x.gif" alt="{$smarty.const.CROP}" title="{$smarty.const.CROP}" />{$beerFest['neededResources'][3]}|
<img class="clock" src="assets/img/x.gif" alt="{$smarty.const.DURATION}" title="{$smarty.const.DURATION}" />{$beerFest.duration}
{if $gold >= 3 && $isMarketplaceBuilt && $villageTotalResources >= $beerFest['totalResources']} |
<a href="build.php?gid=17&t=3&r1={$beerFest['neededResources'][0]}&r2={$beerFest['neededResources'][1]}&r3={$beerFest['neededResources'][2]}&r4={$beerFest['neededResources'][3]}">
<img class="npc" src="assets/img/x.gif"alt="{$smarty.const.NPC_TRADE}" title="{$smarty.const.NPC_TRADE}" />
</a>
{/if}
</div>
</td>
{if !empty($beerFest.error)}
<td class="{if $beerFest.error|strstr:':'}timer{else}none{/if}">{$beerFest.error}</td>
{else}
<td class="act">
<a class="research" href="#" onclick="document.getElementById('start').submit();">{$smarty.const.START}</a>
</td>
{/if}
</tr>
</tbody>
</table>
</form>
+1 -1
View File
@@ -37,7 +37,7 @@
<td class="none">{$research.error}</td>
{else}
<td class="act">
<a class="research" href="build.php?id={$parameters['id']}&amp;a={$unit}&amp;c={$sessionChecker}">{$smarty.const.RESEARCH}</a>
<a class="research" href="build.php?id={$parameters['id']}&a={$unit}&c={$sessionChecker}">{$smarty.const.RESEARCH}</a>
</td>
{/if}
</tr>
+715 -1285
View File
File diff suppressed because it is too large Load Diff