diff --git a/_incl_data/autoload.php b/_incl_data/autoload.php
index 4c68d220..d5f54a2b 100644
--- a/_incl_data/autoload.php
+++ b/_incl_data/autoload.php
@@ -1,4 +1,5 @@
false,
+ 'progress' => [
+ 'current' => 0,
+ 'need' => 1,
+ ]
+ ];
+ }
}
\ No newline at end of file
diff --git a/_incl_data/class/DarksLight2/Training/Steps/FirstStep.php b/_incl_data/class/DarksLight2/Training/Steps/ChatFirstQuest.php
similarity index 55%
rename from _incl_data/class/DarksLight2/Training/Steps/FirstStep.php
rename to _incl_data/class/DarksLight2/Training/Steps/ChatFirstQuest.php
index 4e93b75e..9c4f5f8d 100644
--- a/_incl_data/class/DarksLight2/Training/Steps/FirstStep.php
+++ b/_incl_data/class/DarksLight2/Training/Steps/ChatFirstQuest.php
@@ -4,17 +4,17 @@ namespace DarksLight2\Training\Steps;
use DarksLight2\Training\StepFactory;
-class FirstStep extends StepFactory
+class ChatFirstQuest extends StepFactory
{
public function getTitle(): string
{
- return 'Первое знакомство';
+ return 'Начало.';
}
public function getMessage(): string
{
- return 'test';
+ return 'Отправьте сообщение в общий чат.';
}
public function getRewards(): array
@@ -24,7 +24,11 @@ class FirstStep extends StepFactory
public function getShortName(): string
{
- return 'first_step';
+ return 'chat_first_quest';
}
+ public function isInfo(): bool
+ {
+ return false;
+ }
}
\ No newline at end of file
diff --git a/_incl_data/class/DarksLight2/Training/Steps/ChatFirstStep.php b/_incl_data/class/DarksLight2/Training/Steps/ChatFirstStep.php
new file mode 100644
index 00000000..debe5c5e
--- /dev/null
+++ b/_incl_data/class/DarksLight2/Training/Steps/ChatFirstStep.php
@@ -0,0 +1,30 @@
+
+ Все игроки имеют свободные очки распределения параметров, что они дают игрокам конкретные модификаторы в зависимости от того, в какой из параметров распределяются очки распределения.
+ --- если можно, добавить скрин как выглядит эта кнопка ---
+ Сила - Увеличивает мощность рубящего урона ( для Силачей )
+ Ловкость - Увеличивает мощность колющего урона ( для Критоуворотов и Уворотов )
+ Интуиция - Увеличивает мощность режущего урона ( для Критовиков )
+ Выносливость - Увеличивает защиту от урона и магии, а так же добавит немного жизней. ( для Танков )
+ Интелект - Увеличивает мощность магии. ( Для Любого Мага )
+ Мудрость - Увеличивает колличество маны. ( Для Любого Мага )
+
+ Дополнительно, игроки имеют очки распределения Мастерства Оружия, это позволит воинам увеличить урон, а магам, открыть новые приемы.
+ Очки распределения Оружий распределяются точно так же, как и очки распределения параметров ( статов ).
+
+ В случае, если вы распределили неверно любые доступные очки распределения, или хотите их изменить, вы можете это сделать, поднявшись на 2 этаж здания " Бойцовский Клуб ".';
+ }
+
+ public function getShortName(): string
+ {
+ return 'my_user_fourth_step';
+ }
+
+ public function getRewards(): array
+ {
+ return [];
+ }
+
+ public function getAnswer(): string
+ {
+ return '';
+ }
+
+}
\ No newline at end of file
diff --git a/_incl_data/class/DarksLight2/Training/Steps/MyUserSecondQuest.php b/_incl_data/class/DarksLight2/Training/Steps/MyUserSecondQuest.php
new file mode 100644
index 00000000..7e23fbd3
--- /dev/null
+++ b/_incl_data/class/DarksLight2/Training/Steps/MyUserSecondQuest.php
@@ -0,0 +1,35 @@
+
+ Текущий уровень - Отображает ваш текущий уровень персонажа.
+ Победы - Отображает сумму всех ваших побед, в любых поединках.
+ Поражения - Отображает сумму всех ваших поражений, в любых поединках.
+ Ничьих - Отображает сумму всех поединков, которые завершились в ничью.
+ Кредиты - Обычная игровая валюта - кредиты ( креды ), которые можно потратить в обычном магазине.
+ Еврокредиты - Покупная игровая валюта - еврокредиты ( екры ) , которые можно потратить в магазине " Берёзка ".
+ Воинственность - Дополнительная игровая валюта, потратить её можно в Подпольной Лавке.
+ Ежедневное задание - Отображает текущее ежедневное задание либо предоставляет возможность его взятия.
+ Бонус - Позволяет получить немного кредитов или еврокредитов.';
+ }
+
+ public function getShortName(): string
+ {
+ return 'my_user_second_step';
+ }
+
+ public function getRewards(): array
+ {
+ return [];
+ }
+
+}
\ No newline at end of file
diff --git a/_incl_data/class/DarksLight2/Training/Steps/MyUserThirdQuest.php b/_incl_data/class/DarksLight2/Training/Steps/MyUserThirdQuest.php
new file mode 100644
index 00000000..7c78455b
--- /dev/null
+++ b/_incl_data/class/DarksLight2/Training/Steps/MyUserThirdQuest.php
@@ -0,0 +1,40 @@
+
+ Критовик - Убивает Танков и Магов, основное оружие - Мечи
+ Уворот - Убивает Критовиков и Силачей, основное оружие - Кинжалы
+ Танк - Убивает Уворотов и Силачей, основное оружие - Дубина и щит.
+ Силач - Убивает Критовиков и Магов, основное оружие - Топоры
+ Критоуворот - Убивает Силачей и с небольшим шансом Критовиков и Уворотов, основное оружие - Кинжалы.
+
+ Маг Огня - Атакующий маг, убивает Уворотов и Танков.
+ Маг Воздуха - Атакующий маг, убивает Уворотов и Танков.
+ Маг Земли - Защищающийся маг, слабый урон, хорошая защита.
+ Маг Воды - Защищающийся маг, слабый урон, хорошая защита.';
+ }
+
+ public function getShortName(): string
+ {
+ return 'my_user_third_step';
+ }
+
+ public function getRewards(): array
+ {
+ return [];
+ }
+
+ public function allowedToMove(): array
+ {
+ return ['cp1'];
+ }
+
+}
\ No newline at end of file
diff --git a/_incl_data/class/DarksLight2/Training/TrainingManager.php b/_incl_data/class/DarksLight2/Training/TrainingManager.php
index 7e892719..1cb3060a 100644
--- a/_incl_data/class/DarksLight2/Training/TrainingManager.php
+++ b/_incl_data/class/DarksLight2/Training/TrainingManager.php
@@ -3,24 +3,125 @@
namespace DarksLight2\Training;
use Core\Db;
+use DarksLight2\Training\Steps\ChatFirstStep;
+use DarksLight2\Training\Steps\MyUserFirstQuest;
+use DarksLight2\Training\Steps\MyUserFirstStep;
+use DarksLight2\Training\Steps\MyUserFourthQuest;
+use DarksLight2\Training\Steps\MyUserFourthStep;
+use DarksLight2\Training\Steps\MyUserSecondQuest;
+use DarksLight2\Training\Steps\MyUserSecondStep;
+use DarksLight2\Training\Steps\MyUserThirdQuest;
+use DarksLight2\Training\Steps\MyUserThirdStep;
use DarksLight2\Traits\Singleton;
-use PDO;
-use stdClass;
+use PassGen;
+use User;
class TrainingManager
{
-
use Singleton;
-
- private $database_records = false;
- private array $steps_data;
private int $user_id;
- private array $steps;
+ public string $current_step = '';
+ private array $registered_steps;
+ private array $completed_steps;
+ private array $active_steps;
- public function __construct(int $user_id)
+ private $database;
+
+ public function __construct(int $user_id, $refresh_token = true)
{
+ try {
+ $this->register([
+ new ChatFirstStep(),
+ new MyUserFirstStep(),
+ new MyUserFirstQuest(),
+ new MyUserSecondStep(),
+ new MyUserSecondQuest(),
+ new MyUserThirdStep(),
+ new MyUserThirdQuest(),
+ new MyUserFourthStep(),
+ new MyUserFourthQuest(),
+ ]);
+ } catch (TrainingException $e) {
+ }
+
$this->user_id = $user_id;
+ if($refresh_token) {
+ $this->generateToken();
+ }
+
+ $this->database = Db::getRow('SELECT * FROM user_training WHERE user_id = ?', [$user_id]);
+
+ $this->createDatabaseRecord();
+
+ $this->database['data'] = json_decode($this->database['data'], true);
+
+ $this->selectActiveSteps();
+ }
+
+ public function getCurrentStepName(): string
+ {
+ if(empty($this->current_step)) {
+ $this->current_step = array_key_first($this->active_steps) ?? '';
+ }
+
+ return $this->current_step;
+ }
+ public function getRegistered(): array
+ {
+ return $this->registered_steps;
+ }
+
+ public function getDatabaseData()
+ {
+ return $this->database;
+ }
+
+ public function addPoint($short_name, $closure = null)
+ {
+ if($short_name === $this->getCurrentStepName()) {
+ $this->database['data'][$short_name]['progress']['current']++;
+ if(isset($closure)) {
+ $closure($this);
+ }
+ }
+ }
+
+ public function nextStep()
+ {
+
+ if($this->database['data'][$this->getCurrentStepName()]['progress']['need'] <= $this->database['data'][$this->getCurrentStepName()]['progress']['current']) {
+ $this->database['data'][$this->getCurrentStepName()]['progress']['current'] = 0;
+ $this->database['data'][$this->getCurrentStepName()]['completed'] = true;
+ unset($this->active_steps[$this->getCurrentStepName()]);
+ $this->current_step = array_key_first($this->active_steps) ?? '';
+ $this->database['current'] = $this->getCurrentStepName();
+ }
+ }
+
+ public function previousStep()
+ {
+ $this->current_step = end($this->completed_steps) ?? '';
+ $this->database['current'] = $this->current_step;
+ $this->database['data'][$this->getCurrentStepName()]['completed'] = false;
+ }
+
+ public function selectActiveSteps()
+ {
+ foreach ($this->database['data'] as $step_name => $data) {
+ if($data['completed'] === false) {
+ $this->active_steps[$step_name] = $data;
+ continue;
+ }
+
+ $this->completed_steps[] = $step_name;
+
+ }
+ }
+
+ public function store()
+ {
+ Db::sql('UPDATE user_training SET data = ?, current = ? WHERE user_id = ?', [json_encode($this->database['data']), $this->database['current'], $this->user_id]);
}
/**
@@ -37,104 +138,55 @@ class TrainingManager
foreach ($steps as $step) {
if($step instanceof StepFactory) {
- $this->steps[$step->getShortName()] = new class (
- $step->getMessage(),
- $step->getTitle(),
- $step->getRewards(),
- $this->stepData($step->getShortName())->complete,
- $step->getShortName(),
- $this->stepData($step->getShortName())->progress
- ) {
- public string $message;
- public string $title;
- public string $short_name;
- public array $rewards;
- public bool $isComplete;
-
- public stdClass $progress;
-
- public function __construct(
- string $message,
- string $title,
- array $rewards,
- bool $isComplete,
- string $short_name,
- stdClass $progress
- ) {
- $this->rewards = $rewards;
- $this->title = $title;
- $this->isComplete = $isComplete;
- $this->message = $message;
- $this->short_name = $short_name;
- $this->progress = $progress;
- }
-
- public function render()
- {
- $path = $_SERVER['DOCUMENT_ROOT'] . '/modules_data/steps/' . $this->short_name . '.php';
-
- if(file_exists($path)) {
- require $path;
- return;
- }
-
- throw TrainingException::noRenderingFile();
- }
- };
+ $this->registered_steps[$step->getShortName()] = $step;
}
}
}
-
- private function stepData(string $short_name): object
+ private function generateToken($length = 16)
{
- return json_decode($this->getDatabaseRecords()->data)->$short_name;
- }
- private function getDatabaseRecords()
- {
- if(!$this->database_records) {
- $this->database_records = Db::run('SELECT * FROM user_training WHERE user_id = ?', [$this->user_id])
- ->fetch(PDO::FETCH_OBJ);
- }
-
- return $this->database_records;
+ Db::run('UPDATE user_training SET api_token = ? WHERE user_id = ?', [
+ PassGen::new($length),
+ $this->user_id
+ ]);
}
public function createDatabaseRecord()
{
- if(!$this->getDatabaseRecords()) {
- Db::run('INSERT INTO user_training (user_id, data) VALUES (?, ?)', [
+ if(!$this->database) {
+
+ $data = [];
+
+ foreach ($this->registered_steps as $step) {
+ $data[$step->getShortName()] = $step->databaseRecord();
+ }
+
+ Db::sql('INSERT INTO user_training (user_id, data, current) VALUES (?, ?, ?)', [
$this->user_id,
- json_encode($this->firstRecordData())
+ json_encode($data, true),
+ array_key_first($data)
]);
+
+ $this->database = Db::getRow('SELECT * FROM user_training WHERE user_id = ?', [$this->user_id]);
}
}
- private function firstRecordData(): array
+ /**
+ * @throws \DarksLight2\Training\TrainingException
+ */
+ public function render()
{
- return [
- 'first_step' => [
- 'complete' => 0,
- 'progress' => [
- 'current' => 0,
- 'need' => 0,
- ]
- ]
- ];
- }
+ if(in_array(User::start()->room['file'], $this->registered_steps[$this->getCurrentStepName()]->onLocations()) || in_array('all', $this->registered_steps[$this->getCurrentStepName()]->onLocations())) {
+ $path = $_SERVER['DOCUMENT_ROOT'] . '/modules_data/steps/step.php';
- public function __get(string $name)
- {
- return $this->steps[$name];
- }
-
- public function addPoint(string $short_name)
- {
- $this->$short_name->progress++;
- }
-
- public function store()
- {
+ if (file_exists($path)) {
+ $short_name = $this->getCurrentStepName();
+ $answer = $this->registered_steps[$this->getCurrentStepName()]->getAnswer();
+ require $path;
+ return;
+ }
+ throw TrainingException::noRenderingFile();
+ }
}
}
\ No newline at end of file
diff --git a/_incl_data/class/Priems.php b/_incl_data/class/Priems.php
index 7af8851b..dfac9620 100644
--- a/_incl_data/class/Priems.php
+++ b/_incl_data/class/Priems.php
@@ -1,6 +1,7 @@
u->info['id'] . '" LIMIT 1'
);
if ($upd) {
+ TrainingManager::getInstance()
+ ->addPoint('my_user_fourth_quest', function (TrainingManager $manager) {
+ $manager->store();
+ });
$this->u->info['priems'] = $p;
}
} else {
diff --git a/api/.htaccess b/api/.htaccess
new file mode 100644
index 00000000..6705c6ff
--- /dev/null
+++ b/api/.htaccess
@@ -0,0 +1,5 @@
+