Для проектирования таблицы в базе данных для типов местности (биомов) учитывая нужные нам характеристики, нам потребуется структура данных, которая вмещала бы всю эту информацию. Вот созданная мной структура таблицы для этой цели:
CREATE TABLE biomes (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
danger_level_text VARCHAR(50),
danger_level INT,
survival_difficulty_text VARCHAR(50),
survival_difficulty INT,
occurrence_rate DECIMAL(5,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Пояснения к структуре таблицы:
id: Уникальный идентификатор биома.name: Название биома.description: Описание биома.danger_level_text: Текстовое описание уровня опасности биома.danger_level: Числовое значение уровня опасности (от 1 до 10).survival_difficulty_text: Текстовое описание сложности выживания в биоме.survival_difficulty: Числовое значение сложности выживания (от 1 до 10).occurrence_rate: Процентная частота встречаемости биома на карте.created_at: Дата и время создания записи.updated_at: Дата и время последнего обновления записи.
Эта структура позволит нам эффективно хранить информацию о каждом биоме и легко выполнять запросы для получения данных о них. А также можно будет добавить другие поля, если возникнет необходимость в дальнейшем расширении функциональности игры или детализации информации о биомах.
Реализация на CodeIgniter 4
Для реализации был создан файл миграции, в котором содержался такой код:
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class CreateBiomesTable extends Migration
{
public function up()
{
$this->forge->addField([
'id' => [
'type' => 'INT',
'constraint' => 5,
'unsigned' => true,
'auto_increment' => true,
],
'name' => [
'type' => 'VARCHAR',
'constraint' => 100,
],
'description' => [
'type' => 'TEXT',
],
'danger_level_text' => [
'type' => 'VARCHAR',
'constraint' => 50,
'null' => true,
],
'danger_level' => [
'type' => 'INT',
'constraint' => 2,
'null' => true,
],
'survival_difficulty_text' => [
'type' => 'VARCHAR',
'constraint' => 50,
'null' => true,
],
'survival_difficulty' => [
'type' => 'INT',
'constraint' => 2,
'null' => true,
],
'occurrence_rate' => [
'type' => 'DECIMAL',
'constraint' => '5,2',
],
'created_at' => [
'type' => 'DATETIME',
'null' => true,
'default' => null,
],
'updated_at' => [
'type' => 'DATETIME',
'null' => true,
'default' => null,
]
]);
$this->forge->addPrimaryKey('id');
$this->forge->createTable('biomes');
}
public function down()
{
$this->forge->dropTable('biomes');
}
}
Ну и как следствие мы получили в таблице структуру и готовый каркас для заполнения всех биомов, которые могут быть на карте игрового мира. Какое в этой таблице есть преимущество?
- Можно по примеру и структуре добавлять любое количество биомов даже когда уже игра будет работать и в нее будут играть
- Можно без особого труда для каждой генерации мира (каждый вайп — обнуление игровой карты и всех данных игроков) менять % количества этого биома на карте
- Можно добавлять любое количество полей, которые могут со временем понадобиться в игровом мире или логике игры

Вот такие данные, пока что у нас есть в таблице отвечающей за биомы. Важно отметить, что балансировка местности в процентном соотношении каких биомов сколько должно быть на карте еще не производилась, это будет в будущем. Скорее всего на том этапе, где будет писаться логика автоматической генерации игрового мира.
