From 2e53094b484fed920a538eb3da2c5d37b654fcc9 Mon Sep 17 00:00:00 2001 From: novgorodschi catalin Date: Fri, 24 Jul 2026 08:34:50 +0300 Subject: [PATCH] Add T4 Hero Resource and some fix Add T4 Hero Resource and some fix --- Admin/Templates/config.tpl | 17 +- Admin/Templates/editServerSet.tpl | 21 +++ GameEngine/Admin/Mods/config_template.php | 4 + GameEngine/Admin/Mods/editServerSet.php | 26 ++- GameEngine/Database.php | 2 + GameEngine/Database/DatabaseHeroQueries.php | 27 ++++ GameEngine/HeroItems.php | 170 +++++++++++++++++++- GameEngine/Lang/en.php | 11 ++ GameEngine/Lang/ro.php | 11 ++ GameEngine/Village.php | 66 ++++++++ Templates/Build/37_auction.tpl | 77 +++++++++ Templates/Build/37_hero.tpl | 127 ++++++++++++++- Templates/Notice/26.tpl | 8 +- Templates/header.tpl | 44 +++++ Templates/res.tpl | 29 ---- img/hero/merchant.png | Bin 0 -> 20940 bytes install/data/constant_format.tpl | 14 ++ install/process.php | 24 +++ install/templates/config.tpl | 4 + var/db/struct.sql | 2 + 20 files changed, 641 insertions(+), 43 deletions(-) create mode 100644 img/hero/merchant.png diff --git a/Admin/Templates/config.tpl b/Admin/Templates/config.tpl index bd8f44bc..b9b16f01 100644 --- a/Admin/Templates/config.tpl +++ b/Admin/Templates/config.tpl @@ -92,7 +92,22 @@ $editIcon = ' ? ?Enabled" : "Disabled"; ?> ? - Hero base regeneration ?Hit points the hero recovers per day, independent of the regeneration attribute and of equipped items. 0 disables it. HP / day + + Hero base regeneration ?Hit points the hero recovers per day, independent of the regeneration attribute and of equipped items. 0 disables it. + HP / day + + + Hero exchange rates ?Rates of the exchange office in the auction house. The difference between the two directions is the house margin, so trading back and forth loses value instead of creating it. + 1 gold → silver +  |  + silver → 1 gold + + + Hero resource production ?Hourly resources produced by each point the hero invested in the Resources attribute, in the village where the hero is. Players choose freely between spreading it over all four resources or concentrating it on one. + of each +  |  + of one type + diff --git a/Admin/Templates/editServerSet.tpl b/Admin/Templates/editServerSet.tpl index 29faa89f..f0b4eb4b 100644 --- a/Admin/Templates/editServerSet.tpl +++ b/Admin/Templates/editServerSet.tpl @@ -349,6 +349,27 @@ function refresh(tz) { value=""> HP / day + + Hero exchange rates ?Exchange office in the auction house. Keep the second value higher than the first, otherwise players could trade back and forth to create gold out of nothing. + + 1 gold → + silver +  |  + silver → 1 gold + + + + Hero resource production ?Hourly resources per point invested in the hero's Resources attribute. The first value applies when the player spreads the bonus over all four resources, the second when it is concentrated on a single one. Both scale with server speed. + + of each +  |  + of one type + + diff --git a/GameEngine/Admin/Mods/config_template.php b/GameEngine/Admin/Mods/config_template.php index 43aa7022..abeb84de 100644 --- a/GameEngine/Admin/Mods/config_template.php +++ b/GameEngine/Admin/Mods/config_template.php @@ -99,6 +99,10 @@ if (!function_exists('admin_config_template_path')) { // regenerarea de baza a eroului: acelasi tratament, sa nu fie resetata $cleanupDefaults['%HEROBASEREGEN%'] = array('HERO_BASE_REGEN', 10); + $cleanupDefaults['%HEROSILVERPERGOLD%'] = array('HERO_SILVER_PER_GOLD', 10); + $cleanupDefaults['%HEROSILVERTOGOLD%'] = array('HERO_SILVER_TO_GOLD', 25); + $cleanupDefaults['%HERORESALL%'] = array('HERO_RES_PER_POINT_ALL', 3); + $cleanupDefaults['%HERORESONE%'] = array('HERO_RES_PER_POINT_ONE', 10); foreach ($overrides as $ovPlaceholder => $ovValue) { if (strpos($text, $ovPlaceholder) !== false) { diff --git a/GameEngine/Admin/Mods/editServerSet.php b/GameEngine/Admin/Mods/editServerSet.php index b105c0ff..aeaf71b3 100755 --- a/GameEngine/Admin/Mods/editServerSet.php +++ b/GameEngine/Admin/Mods/editServerSet.php @@ -80,7 +80,31 @@ $heroBaseRegen = isset($_POST['hero_base_regen']) ? (int) $_POST['hero_base_rege if ($heroBaseRegen < 0) { $heroBaseRegen = 0; } if ($heroBaseRegen > 100) { $heroBaseRegen = 100; } -$text = admin_config_template_contents(array('%HEROBASEREGEN%' => $heroBaseRegen)); +// Ratele casei de schimb aur <-> argint. +$silverPerGold = isset($_POST['hero_silver_per_gold']) ? (int) $_POST['hero_silver_per_gold'] : 10; +$silverToGold = isset($_POST['hero_silver_to_gold']) ? (int) $_POST['hero_silver_to_gold'] : 25; + +if ($silverPerGold < 1) { $silverPerGold = 1; } +if ($silverPerGold > 10000) { $silverPerGold = 10000; } +if ($silverToGold < 1) { $silverToGold = 1; } +if ($silverToGold > 10000) { $silverToGold = 10000; } + +// Productia de resurse a eroului (atributul "Resources"). +$heroResAll = isset($_POST['hero_res_all']) ? (int) $_POST['hero_res_all'] : 3; +$heroResOne = isset($_POST['hero_res_one']) ? (int) $_POST['hero_res_one'] : 10; + +if ($heroResAll < 0) { $heroResAll = 0; } +if ($heroResAll > 10000) { $heroResAll = 10000; } +if ($heroResOne < 0) { $heroResOne = 0; } +if ($heroResOne > 10000) { $heroResOne = 10000; } + +$text = admin_config_template_contents(array( + '%HEROBASEREGEN%' => $heroBaseRegen, + '%HEROSILVERPERGOLD%' => $silverPerGold, + '%HEROSILVERTOGOLD%' => $silverToGold, + '%HERORESALL%' => $heroResAll, + '%HERORESONE%' => $heroResOne, +)); $text = preg_replace("'%ERRORREPORT%'", $_POST['error'], $text); $text = preg_replace("'%ERROR%'", $_POST['error'], $text); $text = preg_replace("'%SERVERNAME%'", $_POST['servername'], $text); diff --git a/GameEngine/Database.php b/GameEngine/Database.php index e2729840..5749030a 100755 --- a/GameEngine/Database.php +++ b/GameEngine/Database.php @@ -275,6 +275,8 @@ class MYSQLi_DB implements IDbConnection { * @var array Cache of heroes. */ $heroCache = [], + // cache per request pentru eroul care produce resurse intr-un sat + $heroVillageCache = [], /** * @var array Cache of hero field values. diff --git a/GameEngine/Database/DatabaseHeroQueries.php b/GameEngine/Database/DatabaseHeroQueries.php index d4006641..c36f48f4 100644 --- a/GameEngine/Database/DatabaseHeroQueries.php +++ b/GameEngine/Database/DatabaseHeroQueries.php @@ -23,6 +23,33 @@ use App\Utils\Math; trait DatabaseHeroQueries { + /** + * Eroul care produce resurse in satul dat (atributul T4 "Resources"). + * + * Se ia eroul VIU, terminat de antrenat, al carui sat de resedinta (wref) + * este satul cerut. Intoarce null daca nu exista. + * Rezultatul e cache-uit per request, fiindcă productia se calculeaza des. + */ + function getHeroForVillage($wid, $use_cache = true) { + $wid = (int) $wid; + + if ($use_cache && isset(self::$heroVillageCache[$wid])) { + return self::$heroVillageCache[$wid]; + } + + $q = "SELECT heroid, uid, wref, resources, res_type + FROM " . TB_PREFIX . "hero + WHERE wref = " . $wid . " + AND dead = 0 + AND COALESCE(intraining, 0) = 0 + LIMIT 1"; + + $result = mysqli_query($this->dblink, $q); + $row = $result ? mysqli_fetch_assoc($result) : null; + + return self::$heroVillageCache[$wid] = ($row ?: null); + } + function getHero($uid=0, $all=0, $include_dead = false, $use_cache = true) { list($uid,$all) = $this->escape_input((int) $uid,$all); diff --git a/GameEngine/HeroItems.php b/GameEngine/HeroItems.php index 7cb2073e..cded35b7 100644 --- a/GameEngine/HeroItems.php +++ b/GameEngine/HeroItems.php @@ -264,6 +264,162 @@ class HeroItems * - anything already in that slot is unequipped first (atomic enough for * a per-user action; both statements touch only this user's rows) */ + /* ========================================================================= + * SCHIMB AUR <-> ARGINT (casa de licitatii) + * ===================================================================== */ + + const EXCHANGE_OK = 1; + const EXCHANGE_NO_HERO = 2; + const EXCHANGE_NOT_ENOUGH = 3; + const EXCHANGE_INVALID = 4; + const EXCHANGE_FAILED = 5; + + /** Cat argint primesti pentru 1 aur (implicit 10, ca in Travian). */ + public static function silverPerGold() + { + return defined('HERO_SILVER_PER_GOLD') ? max(1, (int) HERO_SILVER_PER_GOLD) : 10; + } + + /** Cat argint costa 1 aur la schimbul invers (implicit 25 - diferenta e marja casei). */ + public static function silverForOneGold() + { + return defined('HERO_SILVER_TO_GOLD') ? max(1, (int) HERO_SILVER_TO_GOLD) : 25; + } + + /** + * Aur -> argint. $gold = cat aur dai. + * + * Ambele scrieri (scaderea aurului si adaugarea argintului) sunt intr-o + * TRANZACTIE: sunt tabele diferite (users si hero), iar fara tranzactie o + * eroare intre ele ar lasa jucatorul fara aur si fara argint. Scaderea are + * conditia "gold >= ?" chiar in UPDATE, deci doua cereri trimise simultan nu + * pot cheltui acelasi aur de doua ori. + */ + public function exchangeGoldToSilver($uid, $gold) + { + $uid = (int) $uid; + $gold = (int) $gold; + + if ($gold <= 0 || $gold > 100000) { + return self::EXCHANGE_INVALID; + } + + $silver = $gold * self::silverPerGold(); + + return $this->runExchange($uid, $gold, $silver, true); + } + + /** + * Argint -> aur. $gold = cat aur vrei sa primesti. + */ + public function exchangeSilverToGold($uid, $gold) + { + $uid = (int) $uid; + $gold = (int) $gold; + + if ($gold <= 0 || $gold > 100000) { + return self::EXCHANGE_INVALID; + } + + $silver = $gold * self::silverForOneGold(); + + return $this->runExchange($uid, $gold, $silver, false); + } + + /** + * Executa schimbul. $goldToSilver = true inseamna "dai aur, primesti argint". + */ + private function runExchange($uid, $gold, $silver, $goldToSilver) + { + // Fara erou nu exista unde tine argintul. + if ($this->heroRowId($uid) === 0) { + return self::EXCHANGE_NO_HERO; + } + + $this->db->begin_transaction(); + + try { + if ($goldToSilver) { + $take = $this->db->prepare( + "UPDATE " . TB_PREFIX . "users SET gold = gold - ? WHERE id = ? AND gold >= ? LIMIT 1" + ); + $take->bind_param('iii', $gold, $uid, $gold); + $take->execute(); + $taken = $take->affected_rows; + $take->close(); + + if ($taken < 1) { + $this->db->rollback(); + return self::EXCHANGE_NOT_ENOUGH; + } + + $give = $this->db->prepare( + "UPDATE " . TB_PREFIX . "hero SET silver = silver + ? WHERE uid = ? LIMIT 1" + ); + $give->bind_param('ii', $silver, $uid); + $give->execute(); + $given = $give->affected_rows; + $give->close(); + + if ($given < 1) { + $this->db->rollback(); + return self::EXCHANGE_FAILED; + } + + } else { + $take = $this->db->prepare( + "UPDATE " . TB_PREFIX . "hero SET silver = silver - ? WHERE uid = ? AND silver >= ? LIMIT 1" + ); + $take->bind_param('iii', $silver, $uid, $silver); + $take->execute(); + $taken = $take->affected_rows; + $take->close(); + + if ($taken < 1) { + $this->db->rollback(); + return self::EXCHANGE_NOT_ENOUGH; + } + + $give = $this->db->prepare( + "UPDATE " . TB_PREFIX . "users SET gold = gold + ? WHERE id = ? LIMIT 1" + ); + $give->bind_param('ii', $gold, $uid); + $give->execute(); + $given = $give->affected_rows; + $give->close(); + + if ($given < 1) { + $this->db->rollback(); + return self::EXCHANGE_FAILED; + } + } + + $this->db->commit(); + + return self::EXCHANGE_OK; + + } catch (Throwable $e) { + $this->db->rollback(); + return self::EXCHANGE_FAILED; + } + } + + /** Id-ul randului de erou al jucatorului, 0 daca nu exista. */ + private function heroRowId($uid) + { + $uid = (int) $uid; + $stmt = $this->db->prepare( + "SELECT heroid FROM " . TB_PREFIX . "hero WHERE uid = ? LIMIT 1" + ); + $stmt->bind_param('i', $uid); + $stmt->execute(); + $stmt->bind_result($heroid); + $found = $stmt->fetch(); + $stmt->close(); + + return $found ? (int) $heroid : 0; + } + /* ========================================================================= * DISPONIBILITATEA EROULUI PENTRU SCHIMBAREA ECHIPAMENTULUI * ===================================================================== */ @@ -547,14 +703,20 @@ class HeroItems if (!$hero) { return self::USE_INVALID; } - // Refund all spent points: 5 free points per level gained (same - // convention as Automation::calculateLevelUp). Attributes return to 0. + // FIX: un erou porneste cu 5 puncte la nivelul 0 (vezi INSERT-ul din + // 37_train.tpl), iar fiecare nivel mai da 5 (Automation::calculateLevelUp). + // Formula veche, "level * 5", uita punctele initiale: cartea returna cu 5 + // mai putin decat avusese jucatorul, iar la nivelul 0 le pierdea pe toate + // si lasa eroul cu 0 puncte si toate atributele pe zero. $level = (int) $hero['level']; - $points = $level * 5; + $points = 5 + ($level * 5); + + // resources intra si el in reset (punctele se redistribuie doar cu cartea); + // res_type ramane neatins - alegerea resursei se schimba oricand, gratis. $stmt = $this->db->prepare( "UPDATE " . TB_PREFIX . "hero SET points = ?, attack = 0, defence = 0, attackbonus = 0, - defencebonus = 0, regeneration = 0 + defencebonus = 0, regeneration = 0, resources = 0 WHERE heroid = ? LIMIT 1" ); $heroid = (int) $hero['heroid']; diff --git a/GameEngine/Lang/en.php b/GameEngine/Lang/en.php index 0185f601..16687243 100755 --- a/GameEngine/Lang/en.php +++ b/GameEngine/Lang/en.php @@ -2818,6 +2818,17 @@ tz_def('HERO_T4_TAB_ITEMS', 'Inventory'); tz_def('HERO_T4_TAB_ADVENTURES', 'Adventures'); tz_def('HERO_T4_TAB_AUCTION', 'Auctions'); +tz_def('HERO_EXCHANGE', 'Exchange office'); +tz_def('HERO_EXCHANGE_G2S', 'Gold to silver'); +tz_def('HERO_EXCHANGE_S2G', 'Silver to gold'); +tz_def('HERO_EXCHANGE_OK', 'Exchange completed.'); +tz_def('HERO_EXCHANGE_NOTENOUGH', 'You do not have enough for this exchange.'); +tz_def('HERO_EXCHANGE_FAIL', 'The exchange could not be completed.'); +tz_def('HERO_EXCHANGE_HINT', 'The amount you type is the gold given or received; silver is calculated at the rate shown.'); +tz_def('HERO_RES_PRODUCTION', 'Resources'); +tz_def('HERO_RES_TYPE', 'Produced resource'); +tz_def('HERO_RES_ALL', 'All resources'); +tz_def('HERO_RES_TYPE_HINT', 'Can be changed at any time, free of charge.'); tz_def('HERO_SILVER', 'Silver'); tz_def('HERO_EXPERIENCE', 'Experience'); tz_def('RESOURCES', 'Resources'); diff --git a/GameEngine/Lang/ro.php b/GameEngine/Lang/ro.php index 2c7ee2b2..31bf7571 100644 --- a/GameEngine/Lang/ro.php +++ b/GameEngine/Lang/ro.php @@ -2803,6 +2803,17 @@ tz_def('HERO_ITEM_USE_FAIL', 'Acest obiect nu poate fi folosit acum.'); tz_def('HERO_QUANTITY', 'Cantitate'); tz_def('HERO_RELEASE_ANIMALS', 'Elibereaza'); tz_def('HERO_RELEASE_CONFIRM', 'Eliberezi aceste animale? Vor disparea definitiv.'); +tz_def('HERO_EXCHANGE', 'Casa de schimb'); +tz_def('HERO_EXCHANGE_G2S', 'Aur in argint'); +tz_def('HERO_EXCHANGE_S2G', 'Argint in aur'); +tz_def('HERO_EXCHANGE_OK', 'Schimb efectuat.'); +tz_def('HERO_EXCHANGE_NOTENOUGH', 'Nu ai suficient pentru acest schimb.'); +tz_def('HERO_EXCHANGE_FAIL', 'Schimbul nu a putut fi efectuat.'); +tz_def('HERO_EXCHANGE_HINT', 'Valoarea introdusa e aurul dat sau primit; argintul se calculeaza la rata afisata.'); +tz_def('HERO_RES_PRODUCTION', 'Resurse'); +tz_def('HERO_RES_TYPE', 'Resursa produsa'); +tz_def('HERO_RES_ALL', 'Toate resursele'); +tz_def('HERO_RES_TYPE_HINT', 'Se poate schimba oricand, gratuit.'); tz_def('HERO_SILVER', 'Argint'); tz_def('HERO_SLOT_1', 'Coif'); tz_def('HERO_SLOT_2', 'Armura'); diff --git a/GameEngine/Village.php b/GameEngine/Village.php index 14fa4108..7467048b 100755 --- a/GameEngine/Village.php +++ b/GameEngine/Village.php @@ -43,6 +43,9 @@ class Village { public $enforcetome = []; public $enforcetoyou = []; public $enforceoasis = []; + + /** cache per sat pentru productia adusa de erou (null = neincarcat) */ + private $heroProd = null; public $currentcel = 0; public $currentfestival = 0; public $allcrop = 0; @@ -306,11 +309,74 @@ class Village { $amount += $amount / 100 * $bonusPct; } + // Productia de resurse a eroului (atributul "Resources", ca in T4). + // Se adauga DUPA bonusurile de cladiri si oaze (alea se aplica doar campurilor) + // dar INAINTE de bonusul de 25% si de inmultirea cu SPEED, fiindca in T4 si + // bonusul de 25% si viteza serverului se aplica si productiei eroului. + $amount += $this->getHeroProdFor($type); + if ($this->sess->{$cfg['sessionBonus']} == 1) $amount *= 1.25; return round($amount * SPEED); } + /** + * Productia orara adusa de atributul "Resources" al eroului, pentru satul asta. + * + * Regula T4: fiecare punct produce 3 din FIECARE resursa (res_type = 0) sau 10 + * dintr-un singur tip (res_type = 1..4 pentru lemn/lut/fier/cereale). + * Bonusul merge in satul in care se afla eroul (hero.wref), deci mutarea + * eroului muta si productia. + * + * Randul de erou se citeste O SINGURA DATA per instanta de sat. + */ + private function getHeroProdFor(string $type): float { + + if ($this->heroProd === null) { + $this->heroProd = $this->loadHeroProd(); + } + + return $this->heroProd[$type] ?? 0.0; + } + + /** Citeste eroul acestui sat si transforma punctele in productie per resursa. */ + private function loadHeroProd(): array { + + $empty = ['wood' => 0.0, 'clay' => 0.0, 'iron' => 0.0, 'crop' => 0.0]; + + if (!defined('NEW_FUNCTIONS_HERO_T4') || !NEW_FUNCTIONS_HERO_T4) { + return $empty; + } + + $row = $this->db->getHeroForVillage($this->wid); + + if (!$row) { + return $empty; + } + + $points = (int) $row['resources']; + + if ($points <= 0) { + return $empty; + } + + $resType = (int) $row['res_type']; + $map = [1 => 'wood', 2 => 'clay', 3 => 'iron', 4 => 'crop']; + + // 0 = raspandit egal: 3 din fiecare. Altfel: 10 dintr-un singur tip. + if ($resType === 0 || !isset($map[$resType])) { + $each = $points * (defined('HERO_RES_PER_POINT_ALL') ? (int) HERO_RES_PER_POINT_ALL : 3); + return ['wood' => $each, 'clay' => $each, 'iron' => $each, 'crop' => $each]; + } + + $single = $points * (defined('HERO_RES_PER_POINT_ONE') ? (int) HERO_RES_PER_POINT_ONE : 10); + + $out = $empty; + $out[$map[$resType]] = $single; + + return $out; + } + /** * W1 #4: scans the f1..f38 fields ONLY once per load (instead of 4 passes) * and buckets them by type. diff --git a/Templates/Build/37_auction.tpl b/Templates/Build/37_auction.tpl index 6b5c89ff..468c130d 100644 --- a/Templates/Build/37_auction.tpl +++ b/Templates/Build/37_auction.tpl @@ -23,6 +23,36 @@ $t4Auction = new HeroAuction(); $t4Msg = ''; if (isset($_POST['t4action'])) { + // --- SCHIMB AUR <-> ARGINT ------------------------------------------- + // Validarea si atomicitatea sunt in HeroItems::exchange*(); aici doar + // afisam rezultatul si tinem sesiunea sincronizata cu noul sold de aur. + if (($_POST['t4action'] === 'g2s' || $_POST['t4action'] === 's2g') && isset($_POST['amount'])) { + $t4Items = new HeroItems(); + $t4Amount = (int) $_POST['amount']; + + $t4Ex = ($_POST['t4action'] === 'g2s') + ? $t4Items->exchangeGoldToSilver($session->uid, $t4Amount) + : $t4Items->exchangeSilverToGold($session->uid, $t4Amount); + + if ($t4Ex === HeroItems::EXCHANGE_OK) { + $t4Msg = defined('HERO_EXCHANGE_OK') ? HERO_EXCHANGE_OK : 'Exchange completed.'; + + // soldul de aur din sesiune trebuie reimprospatat, altfel pagina ar + // arata vechea valoare pana la expirarea cache-ului de utilizator + $t4NewGold = (int) $database->getUserField($session->uid, 'gold', 0); + $session->gold = $t4NewGold; + $_SESSION['gold'] = $t4NewGold; + unset($_SESSION['cache_user_' . (isset($_SESSION['username']) ? $_SESSION['username'] : '')]); + + } elseif ($t4Ex === HeroItems::EXCHANGE_NOT_ENOUGH) { + $t4Msg = defined('HERO_EXCHANGE_NOTENOUGH') ? HERO_EXCHANGE_NOTENOUGH : 'You do not have enough for this exchange.'; + } elseif ($t4Ex === HeroItems::EXCHANGE_NO_HERO) { + $t4Msg = defined('HERO_LOCKED_NOHERO') ? HERO_LOCKED_NOHERO : 'You have no hero yet.'; + } else { + $t4Msg = defined('HERO_EXCHANGE_FAIL') ? HERO_EXCHANGE_FAIL : 'The exchange could not be completed.'; + } + } + if ($_POST['t4action'] === 'bid' && isset($_POST['aucid'], $_POST['maxbid'])) { $t4Result = $t4Auction->placeBid($session->uid, (int) $_POST['aucid'], (int) $_POST['maxbid']); if ($t4Result === HeroAuction::BID_OK) { @@ -62,6 +92,53 @@ foreach ($t4HeroItems->getInventory($session->uid) as $t4Row) {

+getSilver($session->uid); +$t4Gold = (int) $session->gold; +$t4RateG2S = HeroItems::silverPerGold(); +$t4RateS2G = HeroItems::silverForOneGold(); +?> + + + + + + + + + + +
+

+ : +    + : +

+ +
+ + + + (1 : ) +
+ +
+ + + + ( : 1) +
+ +

+ +

+
+ +
+ diff --git a/Templates/Build/37_hero.tpl b/Templates/Build/37_hero.tpl index 373ac341..8066c233 100644 --- a/Templates/Build/37_hero.tpl +++ b/Templates/Build/37_hero.tpl @@ -40,6 +40,19 @@ $heroStatColumns = [ 'reg' => 'regeneration', ]; +// Atributul "Resources" apartine sistemului de erou T4: apare si poate primi +// puncte doar cand functiile T4 sunt pornite. Tot flag-ul asta decide si daca +// productia se aplica (vezi Village::loadHeroProd), deci cele doua nu pot ajunge +// in dezacord - altfel jucatorii ar investi in ceva care nu produce nimic. +// In plus, cu flag-ul stins interogarile de mai jos nu mai ating coloanele +// `resources` / `res_type`, deci pagina merge si pe un server care inca nu a +// rulat scriptul add-hero-resources.sql. +$t4HeroRes = defined('NEW_FUNCTIONS_HERO_T4') && NEW_FUNCTIONS_HERO_T4; + +if ($t4HeroRes) { + $heroStatColumns['res'] = 'resources'; +} + // Render the "(+)" link for a stat, or "(+)" uneditable // if the hero has no more points or the stat is already at the top (100). // Identical behavior to the original 5 if/else blocks. @@ -113,6 +126,58 @@ $renderAddLink = function ($action) use ($hero_info, $id, $heroStatColumns) { + + + + + + + + + + + + + + + @@ -260,6 +325,58 @@ $renderAddLink = function ($action) use ($hero_info, $id, $heroStatColumns) { // are, sau peste 100 la o statistica), conditiile nu se potrivesc, UPDATE-ul nu // afecteaza niciun rand si nu se schimba nimic. Fiind o singura instructiune, // nici doua cereri trimise simultan nu pot cheltui aceleasi puncte de doua ori. +// Schimbarea resursei favorizate. In T4 setarea asta e libera: nu costa puncte +// si nu are nevoie de Book of Wisdom, doar redistribuie acelasi bonus. +if ($t4HeroRes && isset($_POST['t4restype'])) { + + $t4Type = (int) $_POST['t4restype']; + + if ($t4Type >= 0 && $t4Type <= 4) { + // Interogarea se construieste din $heroStatColumns, deci acopera automat + // exact atributele active (cu sau fara "resources"). + $t4Cols = array_values($heroStatColumns); + $t4Set = array(); + $t4Guard = array(); + + foreach ($t4Cols as $t4Col) { + $t4Set[] = "`" . $t4Col . "` = `" . $t4Col . "` + ?"; + $t4Guard[] = "`" . $t4Col . "` + ? <= 100"; + } + + $t4Stmt = $database->dblink->prepare( + "UPDATE " . TB_PREFIX . "hero SET " . implode(", ", $t4Set) . ", + `points` = `points` - ? + WHERE `heroid` = ? + AND `points` >= ? + AND " . implode("\n\t\t\t AND ", $t4Guard) + ); + + if ($t4Stmt) { + $t4HeroId = (int) $hero_info['heroid']; + + // ordinea parametrilor: cresteri, punctele scazute, heroid, garda de + // puncte, apoi garzile de maxim 100 pentru fiecare atribut + $t4Values = array(); + + foreach ($t4Cols as $t4Col) { $t4Values[] = $t4Alloc[$t4Col]; } + + $t4Values[] = $t4Total; + $t4Values[] = $t4HeroId; + $t4Values[] = $t4Total; + + foreach ($t4Cols as $t4Col) { $t4Values[] = $t4Alloc[$t4Col]; } + + $t4Stmt->bind_param(str_repeat('i', count($t4Values)), ...$t4Values); + + $t4Stmt->execute(); + $t4Stmt->close(); + } + } + + header("Location: build.php?id=" . $id); + exit; +} + if (isset($_POST['t4points'])) { $t4Alloc = array(); @@ -284,6 +401,7 @@ if (isset($_POST['t4points'])) { `attackbonus` = `attackbonus` + ?, `defencebonus` = `defencebonus` + ?, `regeneration` = `regeneration` + ?, + `resources` = `resources` + ?, `points` = `points` - ? WHERE `heroid` = ? AND `points` >= ? @@ -291,19 +409,20 @@ if (isset($_POST['t4points'])) { AND `defence` + ? <= 100 AND `attackbonus` + ? <= 100 AND `defencebonus` + ? <= 100 - AND `regeneration` + ? <= 100" + AND `regeneration` + ? <= 100 + AND `resources` + ? <= 100" ); if ($t4Stmt) { $t4HeroId = (int) $hero_info['heroid']; $t4Stmt->bind_param( - 'iiiiiiiiiiiii', + 'iiiiiiiiiiiiiii', $t4Alloc['attack'], $t4Alloc['defence'], $t4Alloc['attackbonus'], - $t4Alloc['defencebonus'], $t4Alloc['regeneration'], + $t4Alloc['defencebonus'], $t4Alloc['regeneration'], $t4Alloc['resources'], $t4Total, $t4HeroId, $t4Total, $t4Alloc['attack'], $t4Alloc['defence'], $t4Alloc['attackbonus'], - $t4Alloc['defencebonus'], $t4Alloc['regeneration'] + $t4Alloc['defencebonus'], $t4Alloc['regeneration'], $t4Alloc['resources'] ); $t4Stmt->execute(); diff --git a/Templates/Notice/26.tpl b/Templates/Notice/26.tpl index b38f80f0..b5929cdf 100644 --- a/Templates/Notice/26.tpl +++ b/Templates/Notice/26.tpl @@ -92,10 +92,10 @@ $diffLabel = $difficulty === 1 diff --git a/Templates/header.tpl b/Templates/header.tpl index 983a903c..056d4778 100644 --- a/Templates/header.tpl +++ b/Templates/header.tpl @@ -170,6 +170,30 @@ if ($hour > 1759 || $hour < 500) { + + gold)) { + ?> +
+ gold <= 1) { + echo ' + ' . GOLD . ' + ' . $session->gold . ' ' . GOLD . ' + '; + } else { + echo '' . GOLD . ' + ' . $session->gold . ' ' . GOLD; + } + ?> +
+ + + 1759 || $hour < 500) { display: inline-block; } + /* GOLD IN CERCUL VERDE */ + #goldHeader { + position: absolute; + left: 380px; /* << AICI ESTE CERCUL VERDE - muta 370-400 daca e nevoie */ + top: 18px; /* centrat pe bara gri */ + width: auto; + min-width: 100px; + height: 22px; + line-height: 22px; + text-align: center; + font-size: 11px; + font-weight: bold; + z-index: 50; + } + + #goldHeader img { + vertical-align: middle; + margin-right: 4px; + } + diff --git a/Templates/res.tpl b/Templates/res.tpl index 6a8a0657..df571d45 100644 --- a/Templates/res.tpl +++ b/Templates/res.tpl @@ -112,35 +112,6 @@ if (!empty($village)) {
+ 'r1', 2 => 'r2', 3 => 'r3', 4 => 'r4']; + + if ($t4ResType >= 1 && $t4ResType <= 4) { + echo ' '; + echo (int) round($t4ResPoints * $t4PerOne * SPEED); + } else { + foreach ($t4ResIcons as $t4Ico) { + echo ' ' + . (int) round($t4ResPoints * $t4PerAll * SPEED) . ' '; + } + } + ?> + / + +
+
+ : + + + + + +
+
- - - - + <?php echo LUMBER; ?> + <?php echo CLAY; ?> + <?php echo IRON; ?> + <?php echo CROP; ?>
- - - - - - - - - - - - - - - -
                                                                     - gold <= 1) { - echo ' - ' . GOLD . ' - ' . $session->gold . ' ' . GOLD . ' - '; - } else { - echo '' . GOLD . ' - ' . $session->gold . ' ' . GOLD; - } - ?> -
- diff --git a/img/hero/merchant.png b/img/hero/merchant.png new file mode 100644 index 0000000000000000000000000000000000000000..52288a2e10133675dfa73a22511dc9f31f085598 GIT binary patch literal 20940 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 10 argint, +// dar 25 argint -> 1 aur). +define('HERO_SILVER_PER_GOLD', %HEROSILVERPERGOLD%); +define('HERO_SILVER_TO_GOLD', %HEROSILVERTOGOLD%); + +// Atributul de erou "Resources" (T4): cate resurse produce un punct pe ora. +// ALL = cand bonusul e raspandit egal pe toate patru (implicit 3 din fiecare) +// ONE = cand e concentrat pe o singura resursa (implicit 10) +define('HERO_RES_PER_POINT_ALL', %HERORESALL%); +define('HERO_RES_PER_POINT_ONE', %HERORESONE%); + ////////////////////////////////// // ***** SERVER SETTINGS *****// ////////////////////////////////// diff --git a/install/process.php b/install/process.php index 8215dc5c..96fe44ab 100644 --- a/install/process.php +++ b/install/process.php @@ -155,6 +155,30 @@ class Process { if ($heroRegen > 100) { $heroRegen = 100; } $findReplace["%HEROBASEREGEN%"] = $heroRegen; + + // Ratele casei de schimb (aur <-> argint), din formularul de instalare. + $silverPerGold = isset($_POST['hero_silver_per_gold']) ? (int) $_POST['hero_silver_per_gold'] : 10; + $silverToGold = isset($_POST['hero_silver_to_gold']) ? (int) $_POST['hero_silver_to_gold'] : 25; + + if ($silverPerGold < 1) { $silverPerGold = 1; } + if ($silverPerGold > 10000) { $silverPerGold = 10000; } + if ($silverToGold < 1) { $silverToGold = 1; } + if ($silverToGold > 10000) { $silverToGold = 10000; } + + $findReplace["%HEROSILVERPERGOLD%"] = $silverPerGold; + $findReplace["%HEROSILVERTOGOLD%"] = $silverToGold; + + // Atributul de erou "Resources": cate resurse da un punct pe ora. + $resAll = isset($_POST['hero_res_all']) ? (int) $_POST['hero_res_all'] : 3; + $resOne = isset($_POST['hero_res_one']) ? (int) $_POST['hero_res_one'] : 10; + + if ($resAll < 0) { $resAll = 0; } + if ($resAll > 10000) { $resAll = 10000; } + if ($resOne < 0) { $resOne = 0; } + if ($resOne > 10000) { $resOne = 10000; } + + $findReplace["%HERORESALL%"] = $resAll; + $findReplace["%HERORESONE%"] = $resOne; $findReplace["%DOMAIN%"] = $_POST['domain']; $findReplace["%HOMEPAGE%"] = $_POST['homepage']; $findReplace["%SERVER%"] = $_POST['server']; diff --git a/install/templates/config.tpl b/install/templates/config.tpl index 1a5ccbee..754dc79e 100644 --- a/install/templates/config.tpl +++ b/install/templates/config.tpl @@ -310,6 +310,10 @@ foreach($mechs as $k => $l){
+
+
+
+
Automation runs from cron.php instead of players' page loads. One cron invocation keeps working for diff --git a/var/db/struct.sql b/var/db/struct.sql index a4157111..41adeb29 100644 --- a/var/db/struct.sql +++ b/var/db/struct.sql @@ -1002,6 +1002,8 @@ CREATE TABLE IF NOT EXISTS `%PREFIX%hero` ( `attackbonus` tinyint(3) NULL, `defencebonus` tinyint(3) NULL, `regeneration` tinyint(3) NULL, + `resources` tinyint(3) NOT NULL DEFAULT 0, + `res_type` tinyint(1) NOT NULL DEFAULT 0, `autoregen` int(2) NULL, `lastupdate` int(11) NULL, `trainingtime` int(11) NULL,