237 lines
9.3 KiB
PHP
237 lines
9.3 KiB
PHP
<?php
|
||
|
||
namespace Insallah\LegBK\Magic;
|
||
|
||
class Sharpen
|
||
{
|
||
private $sharp_chance;
|
||
private $itemDataArray;
|
||
private $status;
|
||
|
||
private $item_data;
|
||
private $item_data_default;
|
||
|
||
/** === Настройки скрипта. */
|
||
|
||
/** Базовая стоимость заточки */
|
||
const SHARP_PRICE = 50;
|
||
/** На сколько повышаем мф. */
|
||
const SHARP_MF_BONUS = 5;
|
||
/** На сколько повышаем статы. */
|
||
const SHARP_STAT_BONUS = 1;
|
||
/** На сколько повышаем хиты и ману. */
|
||
const SHARP_PARAM_BONUS = 30;
|
||
/** Возвращаемый статус ошибки. */
|
||
const ERROR = 0;
|
||
/** Возвращаемый статус успеха. */
|
||
const SUCCESS = 1;
|
||
|
||
# PHP5.4 не умеет обрабатывать константы-массивы. :(
|
||
|
||
private static function getStatNames()
|
||
{
|
||
return [
|
||
's1' => 'Сила',
|
||
's2' => 'Ловкость',
|
||
's3' => 'Интуиция',
|
||
's4' => 'Выносливость',
|
||
's5' => 'Интеллект',
|
||
's6' => 'Мудрость',
|
||
's7' => 'Духовность',
|
||
's8' => 'Воля',
|
||
's9' => 'Свобода духа',
|
||
's10' => 'Божественность',
|
||
's11' => 'Энергия',
|
||
];
|
||
}
|
||
|
||
private static function getMfNames()
|
||
{
|
||
return [
|
||
'm1' => 'Мф. критического удара (%)',
|
||
'm2' => 'Мф. против критического удара (%)',
|
||
'm3' => 'Мф. мощности крит. удара (%)',
|
||
'm4' => 'Мф. увертывания (%)',
|
||
'm5' => 'Мф. против увертывания (%)',
|
||
'm6' => 'Мф. контрудара (%)',
|
||
'm7' => 'Мф. парирования (%)',
|
||
'm8' => 'Мф. блока щитом (%)',
|
||
'm9' => 'Мф. удара сквозь броню (%)',
|
||
'm14' => 'Мф. абс. критического удара (%)',
|
||
'm15' => 'Мф. абс. увертывания (%)',
|
||
'm16' => 'Мф. абс. парирования (%)',
|
||
'm17' => 'Мф. абс. контрудара (%)',
|
||
'm18' => 'Мф. абс. блока щитом (%)',
|
||
'm19' => 'Мф. абс. магический промах (%)',
|
||
'm20' => 'Мф. удача (%)',
|
||
];
|
||
}
|
||
|
||
private static function getParamNames()
|
||
{
|
||
return [
|
||
'hpAll' => 'Уровень жизни (HP)',
|
||
'mpAll' => 'Уровень маны',
|
||
'enAll' => 'Уровень энергии',
|
||
];
|
||
}
|
||
|
||
/** === Конец настроек. */
|
||
|
||
/**
|
||
* Sharpen constructor.
|
||
*
|
||
* @param string $item_data Текущие параметры конкретного предмета.
|
||
* @param string $item_data_default Параметры по умолчанию для предмета такого типа.
|
||
*
|
||
*/
|
||
public function __construct($item_data, $item_data_default)
|
||
{
|
||
$this->item_data = $item_data;
|
||
$this->item_data_default = $item_data_default;
|
||
$this->itemDataArray = $this->strToArr($this->item_data);
|
||
|
||
/**
|
||
* Если ключа нет, значит предмет ещё не бывал в модификации.
|
||
* Введена, чтобы не прописывать значение в базе руками в каждом предмете.
|
||
*/
|
||
if (!array_key_exists('sharp_level', $this->itemDataArray)) {
|
||
$this->itemDataArray['sharp_level'] = 0;
|
||
}
|
||
|
||
$this->sharp_chance = $this->successRateCheck();
|
||
|
||
/** Заточка.
|
||
* Возвращает INT значение успешности операции SUCCESS или ERROR.
|
||
* Константы меняются в конфигурации.
|
||
*/
|
||
$this->sharp();
|
||
|
||
/** Конечная стоимость заточки: базовая цена умноженная на следующий уровень заточки.*/
|
||
return [
|
||
'new_item_data' => $this->arrToStr($this->itemDataArray),
|
||
'operation_cost' => self::SHARP_PRICE * $this->itemDataArray['sharp_level'],
|
||
'status' => $this->status,
|
||
];
|
||
}
|
||
|
||
/** Подсчёт шанса успешной заточки. Каждый уровень заточки снижает шанс успеха на 5%. 5% - абсолютный минимум.
|
||
* @return float|int
|
||
*/
|
||
private function successRateCheck()
|
||
{
|
||
return $this->itemDataArray['sharp_level'] < 10 ? 100 - $this->itemDataArray['sharp_level'] * 5 : 5;
|
||
}
|
||
|
||
/** Событие заточки.
|
||
*/
|
||
private function sharp()
|
||
{
|
||
/** Заточка не удалась, сброс параметров предмета до базового уровня. */
|
||
if (mt_rand(0, 100) > $this->sharp_chance) {
|
||
$this->resetItem();
|
||
$this->status = self::ERROR;
|
||
} else {
|
||
$this->updateItem();
|
||
$this->status = self::SUCCESS;
|
||
}
|
||
}
|
||
|
||
/** Повышение статов, параметров и модификаторов (логика).
|
||
*
|
||
*/
|
||
private function updateItem()
|
||
{
|
||
/** Массивы элементов, которые будут меняться.
|
||
* Уже со значениями, которые будут прибавляться к существующим.
|
||
* Значения суммируются со старыми. Размер увеличивается в конфиге.
|
||
*/
|
||
$statsArray = $this->arrMaker(self::getStatNames(), self::SHARP_STAT_BONUS);
|
||
$paramArray = $this->arrMaker(self::getParamNames(), self::SHARP_PARAM_BONUS);
|
||
$mfArray = $this->arrMaker(self::getMfNames(), self::SHARP_MF_BONUS);
|
||
|
||
/** Конечный массив всех изменяемых значений.
|
||
* Если нужно больше гибкости, можно вручную перезаписывать значения, которые будут суммироваться.
|
||
* Например: $finArray['add_some_var'] = 5 - перезапишет или добавит соответствующий элемент.
|
||
*/
|
||
$finArray = $statsArray + $paramArray + $mfArray;
|
||
|
||
$finArray = array_intersect_key($finArray, $this->itemDataArray);
|
||
/** Объединение массивов. */
|
||
foreach ($finArray as $key => $value) {
|
||
if (empty($this->itemDataArray[$key])) {
|
||
$this->itemDataArray[$key] = $value;
|
||
} else {
|
||
$this->itemDataArray[$key] += $value;
|
||
}
|
||
}
|
||
|
||
/** Повышаем уровень заточки.*/
|
||
$this->itemDataArray['sharp_level'] += 1;
|
||
}
|
||
|
||
private function resetItem()
|
||
{
|
||
/** Массив значений предмета по умолчанию. */
|
||
$this->itemDataArray = $this->strToArr($this->item_data_default);
|
||
/** Сброс уровня заточки. */
|
||
$this->itemDataArray['sharp_level'] = 0;
|
||
$this->itemDataArray['mf_stats'] = 0;
|
||
$this->itemDataArray['mf_mod'] = 0;
|
||
$this->itemDataArray['upgrade'] = 0;
|
||
}
|
||
|
||
/** Конвертирует строку вида "a=1|b=2|c=3" в ассоциатвный массив ['a'=>1,'b'=>2,'c'=>3].
|
||
*
|
||
* @param $string
|
||
*
|
||
* @return array
|
||
*/
|
||
private function strToArr($string)
|
||
{
|
||
$arr = [];
|
||
$toArr = explode("|", $string);
|
||
for ($i = 0; $i < count($toArr); $i++) {
|
||
$kv = explode("=", $toArr[$i]);
|
||
// Пусть страдает тот, кто пишет в базу ключ без значения как параметр.
|
||
if (empty($kv[1])) {
|
||
$arr[$kv[0]] = null;
|
||
} else {
|
||
$arr[$kv[0]] = $kv[1];
|
||
}
|
||
}
|
||
return $arr;
|
||
}
|
||
|
||
/** Конвертирует ассоциатвный массив вида ['a'=>1,'b'=>2,'c'=>3] в строку "a=1|b=2|c=3".
|
||
*
|
||
* @param array $array
|
||
*
|
||
* @return string
|
||
*/
|
||
private function arrToStr(array $array)
|
||
{
|
||
$temp = [];
|
||
foreach ($array as $k => $v) {
|
||
$temp[] = $k . '=' . $v;
|
||
}
|
||
return implode("|", $temp);
|
||
}
|
||
|
||
/** Берёт ключи входящего массива, добавляет к ним необходимый для записи в БД "add_"
|
||
* и возвращает массив со значениями, переданными в $values.
|
||
*
|
||
* @param $array
|
||
* @param int $values
|
||
*
|
||
* @return array
|
||
*/
|
||
private function arrMaker($array, $values = 0)
|
||
{
|
||
return array_map(function () use ($values) {
|
||
return $values;
|
||
}, array_flip(array_map(function ($key) {
|
||
return 'add_' . $key;
|
||
}, array_keys($array))));
|
||
}
|
||
} |