157 lines
3.2 KiB
JavaScript
157 lines
3.2 KiB
JavaScript
import { TILE } from './constants.js';
|
||
|
||
// Все мутабельные переменные игры в одном объекте состояния
|
||
export const state = {
|
||
// Камера
|
||
camX: 0,
|
||
camY: 0,
|
||
|
||
// День/ночь
|
||
worldTime: 0,
|
||
isNightTime: false,
|
||
|
||
// Мультиплеер
|
||
isMultiplayer: false,
|
||
mySocketId: null,
|
||
socket: null,
|
||
|
||
// Инвентарь/UI
|
||
selected: 0,
|
||
showFullInventory: false,
|
||
craftOpen: false,
|
||
inventoryOpen: false,
|
||
chatOpen: false,
|
||
modeIdx: 0,
|
||
|
||
// Мир
|
||
worldSeed: Math.floor(Math.random() * 1000000),
|
||
|
||
// Погода
|
||
isRaining: false,
|
||
rainIntensity: 0,
|
||
weatherTimer: 0,
|
||
weatherChangeInterval: 60 + Math.random() * 120,
|
||
|
||
// Мобы/спавн
|
||
spawnT: 0,
|
||
|
||
// Цикл
|
||
last: 0,
|
||
prevJump: false,
|
||
|
||
// Сеть — throttle отправки позиции
|
||
lastMoveSendTime: 0,
|
||
lastSentX: 0,
|
||
lastSentY: 0,
|
||
|
||
// Игрок
|
||
player: {
|
||
x: 6 * TILE,
|
||
y: 0 * TILE,
|
||
w: 34,
|
||
h: 34,
|
||
vx: 0,
|
||
vy: 0,
|
||
grounded: false,
|
||
inWater: false,
|
||
headInWater: false,
|
||
hp: 100,
|
||
hunger: 100,
|
||
o2: 100,
|
||
invuln: 0,
|
||
fallStartY: 0,
|
||
lastStepTime: 0,
|
||
sleeping: false,
|
||
inBoat: false,
|
||
armor: 0,
|
||
equippedArmor: null
|
||
},
|
||
|
||
// Точка спавна
|
||
spawnPoint: { x: 6 * TILE, y: 0 * TILE },
|
||
|
||
// Инвентарь
|
||
inv: {
|
||
dirt: 6, stone: 0, sand: 0, gravel: 0, clay: 0,
|
||
wood: 0, planks: 0, ladder: 0, leaves: 0, coal: 0,
|
||
copper_ore: 0, iron_ore: 0, gold_ore: 0, diamond_ore: 0,
|
||
brick: 0, glass: 0,
|
||
tnt: 1, campfire: 0, torch: 0,
|
||
meat: 0, cooked: 0, arrow: 0,
|
||
wood_pickaxe: 0, stone_pickaxe: 0, iron_pickaxe: 0,
|
||
wood_sword: 0, stone_sword: 0, iron_sword: 0,
|
||
iron_armor: 0,
|
||
bow: 0, furnace: 0,
|
||
bed: 0, boat: 0,
|
||
iron_ingot: 0, gold_ingot: 0, copper_ingot: 0
|
||
},
|
||
|
||
// Лодка
|
||
boat: {
|
||
x: 0, y: 0,
|
||
w: 34, h: 34,
|
||
vx: 0, vy: 0,
|
||
active: false,
|
||
inWater: false
|
||
},
|
||
|
||
// Ввод
|
||
inp: { up: false, down: false, left: false, right: false, jump: false, mine: false, build: false, bow: false },
|
||
|
||
// Мышь
|
||
mouse: { x: 0, y: 0 },
|
||
|
||
// Другие игроки (MP)
|
||
otherPlayers: new Map(),
|
||
|
||
// Серверные мобы (MP)
|
||
serverMobs: new Map(),
|
||
|
||
// Мобы
|
||
mobs: [],
|
||
|
||
// Снаряды
|
||
projectiles: [],
|
||
|
||
// Отслеживание изменений мира
|
||
placedBlocks: [],
|
||
removedBlocks: [],
|
||
|
||
// Серверные изменения
|
||
serverOverrides: new Map(),
|
||
|
||
// Чат
|
||
chatMessages: [],
|
||
|
||
// Погода — капли
|
||
raindrops: [],
|
||
|
||
// Облака
|
||
clouds: Array.from({ length: 10 }, () => ({
|
||
x: Math.random() * 2000,
|
||
y: -200 - Math.random() * 260,
|
||
w: 80 + Math.random() * 120,
|
||
s: 12 + Math.random() * 20
|
||
})),
|
||
|
||
// Частицы
|
||
parts: [],
|
||
|
||
// Активный TNT
|
||
activeTNT: new Set(),
|
||
|
||
// Прочность инструментов
|
||
toolDurability: new Map(),
|
||
|
||
// Последние выбранные предметы
|
||
recentItems: [],
|
||
|
||
// Активные печи
|
||
activeFurnaces: new Map(),
|
||
|
||
// Сгенерированные колонны
|
||
generated: new Set(),
|
||
|
||
// Изображение героя
|
||
heroImg: null
|
||
}; |