add-files (#1)
This commit is contained in:
parent
a26f093796
commit
484a72072c
29
README.md
29
README.md
@ -1,2 +1,29 @@
|
|||||||
# Template
|
# Модификация предметов.
|
||||||
|
|
||||||
|
Модуль модификации предметов для `LegBK`.
|
||||||
|
|
||||||
|
На вход подаются:
|
||||||
|
- `$item_data`: Текущие параметры конкретного предмета. В базе LegBK можно искать по запросу
|
||||||
|
```sql
|
||||||
|
SELECT `data` FROM items_users WHERE ...
|
||||||
|
```
|
||||||
|
- `$item_data_default`: Параметры по умолчанию для предмета такого типа. На эти параметры будет сброшен предмет в случае провала операции. В базе LegBK можно искать по запросу
|
||||||
|
```sql
|
||||||
|
SELECT `data` FROM items_main_data WHERE items_id = ...
|
||||||
|
```
|
||||||
|
|
||||||
|
На выходе двумерный массив:
|
||||||
|
```php
|
||||||
|
[
|
||||||
|
'new_item_data' => string,
|
||||||
|
'operation_cost' => integer,
|
||||||
|
'status' => integer,
|
||||||
|
]
|
||||||
|
```
|
||||||
|
1. Новые параметры предмета.
|
||||||
|
1. Стоимость услуги.
|
||||||
|
1. Статус успеха операции.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Написано на `PHP 5.4`.
|
237
src/Sharpen.php
Normal file
237
src/Sharpen.php
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
<?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))));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user