Sharpen

Sharpen

Нет прав для скачивания
Делал кому-то на продажу, заточенный под конкретные параметры и конкретную базу, с дополнительными опциями, чтобы прямо в нём обновлялись записи в базе и вообще вся эта автоматика.
Решил выложить упрощённый вариант, отвязанный от БД. Может кто захочет на этой основе сделать что-то своё. Писалось для LegBK, используя PHP 5.4. Поэтому должно быть совместимо с его базами. Всё дотошно сдобрено комментариями.

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))));
    }
}

Как подключать и как с этим работать
PHP:
include_once 'Sharpen.php';
$use = new \Insallah\LegBK\Magic\Sharpen($item_data, $item_data_default);

На вход подаются:
  • $item_data: select [data] from [items_users] where [...]
  • $item_data_default: select [data] from [items_main_data] where [items_id = ...]

На выходе массив:
  1. Новые параметры предмета.
  2. Стоимость услуги.
  3. Статус успеха операции.
  • Like
Реакции: k880TR и NorD
Автор
Insallah
Скачивания
1
Просмотры
301
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя Insallah

Сверху