function SynchronizeShips(data) { // Обновляем данные: (Очищать массив нельзя - корабль сильно мельтешит!) var serverShipsCount = data.ships.length; var clientShipsCount = SHIP.Ships.length; var indexes = []; // Если с сервера пришел пустой массив, очищаем клиентский массив (и таблицу статистики) if (data.ships.length === 0) { for (var i = 0; i < clientShipsCount; i++) { GAME.Statistics.DeleteStatRow(SHIP.Ships[i]); } SHIP.Ships = []; SHIP.MyShip.State = "Inactive"; } else { for (i = 0; i < serverShipsCount; i++) { // *** Смещение карты (если это наш корабль) *** if (data.ships[i].ID === SHIP.MyShip.ID) { // Старые координаты ЦЕНТРА корабля var x = SHIP.MyShip.X + SHIP.ShipSize / 2 - GAME.SpaceShiftX; var y = SHIP.MyShip.Y + SHIP.ShipSize / 2 - GAME.SpaceShiftY; // Смещение за последний шаг var dX = Math.abs(data.ships[i].X - SHIP.MyShip.X); var dY = Math.abs(data.ships[i].Y - SHIP.MyShip.Y); if (dX !== 0 || dY !== 0) { // "Зона вхождения" (аналогия с наведением мыши) var zoneX = SHIP.ShipSize * 10; // цифра 10 - произвольная, чтобы получить "зону вхождения" побольше var zoneY = SHIP.ShipSize * 10; // Сдвигаем карту (если корабль на краю канвы, но не на краю космоса) GAME.ShiftSpace(x, y, dX, dY, zoneX, zoneY); SPACE.Sun.GetCenter(); // Обновляем координаты корабля SHIP.MyShip.X = data.ships[i].X; // X, Y - для центрирования карты по кораблю SHIP.MyShip.Y = data.ships[i].Y; } if (data.ships[i].State === "Active" && SHIP.MyShip.State.indexOf("Explode") !== -1) { GAME.CenterSpaceToShip(); SPACE.Sun.GetCenter(); } SHIP.MyShip.State = data.ships[i].State; // observable SHIP.MyShip.SkillPoints(data.ships[i].SkillPoints); // Skill points function tryChangeSkill(skill) { var current = skill + "Current"; var limit = skill + "Limit"; var checkCurrent = (SHIP.MyShip[current]() !== data.ships[i][current]); var checkLimit = (SHIP.MyShip[limit]() !== data.ships[i][limit]); if (checkCurrent) { SHIP.MyShip[current](data.ships[i][current]); } if (checkLimit) { SHIP.MyShip[limit](data.ships[i][limit]); } } function tryChangeSkills() { tryChangeSkill("HP"); tryChangeSkill("MP"); tryChangeSkill("Armor"); tryChangeSkill("Speed"); tryChangeSkill("AngleSpeed"); } tryChangeSkills(); } var isShipFound = false; // Цикл только по исходному списку (добавленные в ходе проверки корабли не учитываются - они добавляются в конец массива) for (var j = 0; j < clientShipsCount; j++) { if (SHIP.Ships[j].ID !== data.ships[i].ID) { // сравниваем массивы - локальный (Javascript) и пришедший (JSON) continue; // если не одинаковые имена - берем следующий } indexes.push(j); // запомнили индекс найденного элемента isShipFound = true; // если корабль встретился в массиве JS - обновляем данные (только те, которые изменились) if (SHIP.Ships[j].Name === "") { SHIP.Ships[j].Name = data.ships[i].Name; } if (SHIP.Ships[j].State === "Inactive") { GAME.Statistics.AddStatRow(SHIP.Ships[j]); } SHIP.Ships[j].State = data.ships[i].State; SHIP.Ships[j].Stealth = data.ships[i].Stealth; SHIP.Ships[j].MaxHP = data.ships[i].HPCurrent * SHIP.HPMult; SHIP.Ships[j].HP = data.ships[i].HP; SHIP.Ships[j].MaxMP = data.ships[i].MPCurrent * SHIP.MPMult; SHIP.Ships[j].MP = data.ships[i].MP; SHIP.Ships[j].X = data.ships[i].X; SHIP.Ships[j].Y = data.ships[i].Y; SHIP.Ships[j].Speed = data.ships[i].Speed; SHIP.Ships[j].SpeedCurrent = data.ships[i].SpeedCurrent; SHIP.Ships[j].Angle = data.ships[i].Angle; SHIP.Ships[j].Image = data.ships[i].Image; SHIP.Ships[j].Kill = data.ships[i].Kill; SHIP.Ships[j].Death = data.ships[i].Death; RefreshBombs(SHIP.Ships[j], data.ships[i].Bombs); // обнуляем и заполняем массив данными с сервера GAME.Statistics.RefreshStatRow(SHIP.Ships[j]); break; } if (!isShipFound) { // если корабля не было в массиве JS, то добавляем его в в массив data.ships[i].Image = parseInt(data.ships[i].Image); var otherShip = new Ship(data.ships[i]); RefreshBombs(otherShip, data.ships[i].Bombs); GAME.Statistics.AddStatRow(otherShip); SHIP.Ships.push(otherShip); } } } }
my.DeleteShip = function (id) { ship = UTILS.GetElement(SHIP.Ships, "ID", id); ship.State = "Inactive"; GAME.Statistics.DeleteStatRow(ship); };