Skip to content

Раздел 7: Визуализация

> Версия: 1.0 (черновик)
> Статус: MVP
> Дата: 2025-01-24

Референс

Стилистика: Game Dev Tycoon, упрощённая изометрия.

Ключевые характеристики:

  • Чистые линии, минимум деталей
  • Плоские цвета без градиентов
  • Читаемость важнее реализма

Изометрическая проекция

Принцип

Стандартная изометрия 2:1 — каждый пиксель по горизонтали соответствует 0.5 пикселя по вертикали.

Базовый тайл

Ромб 64×32 px — основа для построения всех элементов.

Структура офиса

Динамическая компоновка

Офис строится автоматически на основе данных из БД:

  1. Агенты группируются по parent_module (отделы)
  2. Каждый отдел — визуальная зона с подписью
  3. Столы внутри отдела: сетка 4 в ряд с переносом
  4. Отделы располагаются вертикально
┌─────────────────────────────────────────────────┐
│  WATCHER                                        │
│  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│  ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐               │
│  │Agent│ │Agent│ │Agent│ │Agent│               │
│  └─────┘ └─────┘ └─────┘ └─────┘               │
│  ┌─────┐                                        │
│  │Agent│                                        │
│  └─────┘                                        │
├─────────────────────────────────────────────────┤
│  REPUTATION                                     │
│  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│  ┌─────┐ ┌─────┐                                │
│  │Agent│ │Agent│                                │
│  └─────┘ └─────┘                                │
├─────────────────────────────────────────────────┤
│  KNOWLEDGE                                      │
│  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│  ┌─────┐                                        │
│  │Agent│                                        │
│  └─────┘                                        │
└─────────────────────────────────────────────────┘

Слои (z-index)

СлойСодержимоеz-index
FloorЦветовые зоны отделов0
LabelsПодписи отделов5
FurnitureСтолы, стулья10
CharactersАватары (GIF)20
EffectsПодсветка, иконки30
UIМодальные окна100

Элементы

Отдел (Department)

Визуальная группа:

  • Цветовая зона (фон)
  • Подпись модуля (заголовок)
  • Сетка столов агентов

Рабочее место

Состав:

  • Стол (поверхность + ножки) — SVG
  • Стул — SVG
  • Подпись агента — текст
  • Аватар — GIF

Размер: 2×1 тайла (128×64 px)

Аватар сотрудника (GIF)

Универсальный аватар для всех агентов. Различимость через позицию стола + подпись.

Файлы:

ФайлСостояниеОписание
working.gifok + задачаСидит, печатает
idle.gifok + ожиданиеСидит, смотрит
tired.gifwarningСидит устало
error.giferrorЛежит на столе

Характеристики:

  • Размер: 64×64 px
  • Цикл анимации: 1-2 секунды
  • Формат: GIF (прозрачный фон)
  • Количество кадров: 4-8

Индикаторы

Иконки над рабочим местом:

  • Размер: 16×16 px
  • Позиция: над головой аватара
  • Стиль: emoji или простые SVG-иконки

Цветовая палитра

Статусы (подсветка стола)

СтатусПодсветкаHEX
okЗелёный#4CAF50
warningЖёлтый#FFC107
errorКрасный#F44336

Цветовые зоны отделов

МодульЦвет зоныHEX
watcherСветло-фиолетовый#F3E5F5
reputationСветло-оранжевый#FFF3E0
content_factoryСветло-зелёный#E8F5E9
marketingСветло-красный#FFEBEE
scoutСветло-бирюзовый#E0F7FA
knowledgeСветло-синий#E3F2FD
cfoСветло-коричневый#EFEBE9
lexСветло-индиго#E8EAF6

Общие элементы

ЭлементЦветHEX
СтолДерево#8D6E63
СтулТёмно-серый#616161
РазделительСерый#BDBDBD
Подпись отделаТёмно-серый#424242
Подпись агентаСерый#757575

Алгоритм компоновки

javascript
function buildOfficeLayout(agents) {
  // 1. Группировка по модулям
  const departments = groupBy(agents, 'parent_module');
  
  // 2. Сортировка отделов (по алфавиту)
  const sortedModules = Object.keys(departments).sort();
  
  let yOffset = 0;
  
  for (const module of sortedModules) {
    const moduleAgents = departments[module];
    
    // 3. Отрисовка заголовка отдела
    renderDepartmentHeader(module, yOffset);
    yOffset += HEADER_HEIGHT;
    
    // 4. Отрисовка цветовой зоны
    const rows = Math.ceil(moduleAgents.length / 4);
    renderDepartmentZone(module, yOffset, rows);
    
    // 5. Расстановка столов (4 в ряд)
    moduleAgents.forEach((agent, index) => {
      const col = index % 4;
      const row = Math.floor(index / 4);
      renderDesk(agent, col, yOffset + row * DESK_HEIGHT);
    });
    
    yOffset += rows * DESK_HEIGHT + PADDING;
  }
}

Состояния аватаров

Маппинг статус → GIF

statuscurrent_taskGIF-файл
okестьworking.gif
okпусто/nullidle.gif
warningлюбойtired.gif
errorлюбойerror.gif

Анимации подсветки (CSS)

СтатусАнимация стола
okСтатичная подсветка
warningМягкий pulse (2s)
errorИнтенсивный pulse (1s)

Принцип реализации

SVG + GIF структура

xml
<svg id="office" viewBox="0 0 640 800">
  <!-- Динамически генерируется -->
  
  <!-- Отдел Watcher -->
  <g id="dept-watcher" class="department">
    <rect class="dept-zone" fill="#F3E5F5" />
    <text class="dept-label">Watcher</text>
    
    <g class="desk" data-agent="watcher_price_monitor">
      <use href="#desk-template"/>
      <foreignObject>
        <img src="/static/office/avatars/working.gif" class="avatar" />
      </foreignObject>
      <text class="agent-label">Мониторинг цен</text>
    </g>
    
    <!-- ... другие столы ... -->
  </g>
  
  <!-- Отдел Reputation -->
  <g id="dept-reputation" class="department">
    <!-- ... -->
  </g>
</svg>

CSS

css
/* Зона отдела */
.dept-zone {
  rx: 8px;
  opacity: 0.7;
}

/* Заголовок отдела */
.dept-label {
  font-size: 14px;
  font-weight: bold;
  fill: #424242;
}

/* Подпись агента */
.agent-label {
  font-size: 11px;
  fill: #757575;
  text-anchor: middle;
}

/* Подсветка стола */
.desk--ok .desk-glow { fill: #4CAF50; opacity: 0.3; }
.desk--warning .desk-glow { fill: #FFC107; animation: pulse 2s infinite; }
.desk--error .desk-glow { fill: #F44336; animation: pulse 1s infinite; }

@keyframes pulse {
  0%, 100% { opacity: 0.3; }
  50% { opacity: 0.6; }
}

JavaScript: динамическое построение

javascript
async function renderOffice() {
  const response = await fetch('/api/v1/office/agents');
  const data = await response.json();
  
  const svg = document.getElementById('office');
  svg.innerHTML = ''; // Очистка
  
  buildOfficeLayout(data.departments);
}

// Polling
setInterval(renderOffice, 30000);

Адаптивность

ViewportПоведение
Desktop (>1024px)Полный размер
Tablet (768-1024px)Scale 0.8, вертикальный скролл
Mobile (<768px)Не поддерживается в MVP

Файловая структура

/static/office/
  ├── office.css          # Стили
  ├── office.js           # Логика компоновки
  ├── sprites.svg         # SVG-шаблоны (стол, стул)
  └── avatars/
      ├── working.gif     # Работает
      ├── idle.gif        # Ожидает
      ├── tired.gif       # Устал
      └── error.gif       # Ошибка

Ограничения MVP

  • Порядок отделов по алфавиту (без кастомизации)
  • Фиксированная сетка 4 стола в ряд
  • Без drag-and-drop
  • Только вертикальный скролл при большом количестве агентов
  • Только desktop

Документация ADOLF Platform