Config/script.js |
/* global system log worldScripts player mission missionVariables */
this.name = "ZeroMap";
this.author = "SMax";
this.copyright = "2016 SMax";
this.licence = "CC-BY-NC-SA 4.0";
this.description = "Hide map. Show only visited planets and nearby planets. Visited - all info. In 7LY - only names. In 10LY - as dots (for search isolated regions).";
this.version = "0.6";
"use strict";
this._DEBUG = false;
this._visitedSystems = [
[],
[],
[],
[],
[],
[],
[],
[]
];
// 0 - full info
// 100 - name
// 200 - as dot
// 300 - hide
// [not vis, visited, 7LY, targets, 10LY]
this._LEVEL = [
[200, 0, 0, 100, 100], // Easy
[300, 0, 100, 200, 200], // Normal
[300, 0, 200, 200, 300], // Hard
[0, 0, 0, 0, 0] // Disable
];
this._LEVEL_CURRENT = 1;
this._timer_start = new Date();
this._logger = function(msg, ignore_ts) {
if (this._DEBUG) {
if (ignore_ts) {
log(this.name, msg);
}
else {
var t = new Date();
log(this.name, msg + " [+" + (t.getTime() - this._timer_start.getTime()) + "ms]");
this._timer_start = t;
}
}
};
// Импорт данных из Explorers Club
this._importFromExplorersClub = function() {
this._logger("this._importFromExplorersClub()");
var g = system.info.galaxyID;
if (this._visitedSystems[g].length == 0) {
this._visitedSystems[g] = [];
for (var i = 0; i < 256; i++) {
this._visitedSystems[g][i] = 0;
}
var EC = worldScripts["Explorers Club"];
if (EC) {
for (var i = 0; i < 256; i++) {
if (EC._playerVisited(g, i)) {
this._markVisitedSystem(g, i);
}
}
}
}
this._logger("this._importFromExplorersClub END");
};
// Показать все системы (чтобы отработал System.infoForSystem как надо)
this._showAll = function(g) {
this._logger("this._showAll(" + g + ")");
for (var i = 0; i < 256; i++) {
System.infoForSystem(g, i).setProperty(2, "concealment", null);
}
this._logger("this._showAll END");
};
// Скрыть все системы согласно this._visitedSystems
this._hideAll = function(g) {
this._logger("this._hideAll(" + g + ")");
var settings = this._LEVEL[this._LEVEL_CURRENT];
for (var i = 0; i < 256; i++) {
var c = settings[this._visitedSystems[g][i]];
if (typeof c == 'undefined') {
c = 0;
}
System.infoForSystem(g, i).setProperty(2, "concealment", c);
}
this._logger("this._hideAll END");
};
// Пометить систему и ее соседей как видимые (полостью или частично)
this._markVisitedSystem = function(g, i) {
this._logger("this._markVisitedSystem(" + g + "," + i + ")", 1);
this._visitedSystems[g][i] = 1;
var s = System.infoForSystem(g, i).systemsInRange();
this._logger("Step 1: System.infoForSystem: " + s.length, 1);
for (var j = 0; j < s.length; j++) {
this._logger(s[j].name + ":" + this._visitedSystems[g][s[j].systemID]);
if (this._visitedSystems[g][s[j].systemID] != 1) {
this._visitedSystems[g][s[j].systemID] = 2;
}
}
// Покажем ближайшие системы как результат визуального наблюдения
s = System.infoForSystem(g, i).systemsInRange(10);
this._logger("Step 2: System.infoForSystem: " + s.length, 1);
for (var j = 0; j < s.length; j++) {
this._logger(s[j].name + ":" + this._visitedSystems[g][s[j].systemID]);
if (this._visitedSystems[g][s[j].systemID] == 0 || this._visitedSystems[g][s[j].systemID] == 3) {
this._visitedSystems[g][s[j].systemID] = 4;
}
}
this._logger("this._markVisitedSystem END", 1);
};
this._isInteger = function(value) {
return typeof value === "number" &&
isFinite(value) &&
Math.floor(value) === value;
};
this._markTargetSystems = function() {
this._logger("this._markTargetSystems()");
var g = system.info.galaxyID;
// Убирем старые отметки
for (var i = 0; i < 256; i++) {
if (this._visitedSystems[g][i] == 3) {
this._visitedSystems[g][i] = 0;
}
}
// Контракты на доставу
var contracts = player.ship.contracts;
for (var i = 0; i < contracts.length; i++) {
this._markTarget(g, contracts[i].destination);
}
// Перевозка пассажиров
var passengers = player.ship.passengers;
for (var i = 0; i < passengers.length; i++) {
this._markTarget(g, passengers[i].destination);
}
// Доставка посылок
var parcels = player.ship.parcels;
for (var i = 0; i < parcels.length; i++) {
this._markTarget(g, parcels[i].destination);
}
// Отмеченные системы
var markedSystems = mission.markedSystems;
for (var i = 0; i < markedSystems.length; i++) {
var obj = markedSystems[i];
if (typeof obj.system != 'undefined') {
if (obj.name != "exclubmap") { // Игнорим метки от Explorers Club (чтобы всю карту не показывать)
this._markTarget(g, obj.system);
}
}
else {
this._markTarget(g, obj);
}
}
this._logger("this._markTargetSystems() END");
};
this._markTarget = function(g, i) {
this._logger("this._markTarget(" + g + "," + i + ")", 1);
if (this._visitedSystems[g][i] == 0) {
this._visitedSystems[g][i] = 3;
}
};
// Выполнить "полный" цикл работы - импорт из ExplorersClub + малый цикл.
this._doWorkFull = function() {
this._logger("this._doWorkFull()");
this._importFromExplorersClub();
this._doWork();
this._logger("this._doWorkFull END");
};
// Выполнить "малый" цикл работы
this._doWork = function() {
this._logger("this._doWork()");
// Если мы не в межсистемном пространстве
if (system.ID != -1) {
var g = system.info.galaxyID;
this._markVisitedSystem(g, system.ID);
}
this._logger("this._doWork END");
};
// Старт игры
this.startUpComplete = function() {
this._logger("this.startUpComplete()");
this._loadData();
// Тестирование видимости и достижимости систем (проверка изолированных систем)
//this._setInRangeTester();
this._doWorkFull();
this._showMission(player.ship.dockedStation);
this._logger("this.startUpComplete END");
};
// Определение "Достижимых" и "видимых визуально" систем из текущей
this._setInRangeTester = function() {
var arr = [];
arr.push(system.ID);
var g = system.info.galaxyID;
this._visitedSystems = [
[],
[],
[],
[],
[],
[],
[],
[]
];
for (var i = 0; i < 256; i++) {
this._visitedSystems[g][i] = 0;
}
while (arr.length != 0) {
this._logger(arr);
var id = arr.pop();
this._visitedSystems[g][id] = 1;
var s = System.infoForSystem(g, id).systemsInRange();
//this._logger("Step 1: System.infoForSystem: " + s.length, 1);
for (var j = 0; j < s.length; j++) {
//this._logger(s[j].name + ":" + this._visitedSystems[g][s[j].systemID]);
if (this._visitedSystems[g][s[j].systemID] != 1) {
this._visitedSystems[g][s[j].systemID] = 1;
arr.push(s[j].systemID);
}
}
// Покажем ближайшие системы как результат визуального наблюдения
s = System.infoForSystem(g, id).systemsInRange(10);
//this._logger("Step 2: System.infoForSystem: " + s.length, 1);
for (var j = 0; j < s.length; j++) {
//this._logger(s[j].name + ":" + this._visitedSystems[g][s[j].systemID]);
if (this._visitedSystems[g][s[j].systemID] == 0) {
this._visitedSystems[g][s[j].systemID] = 4;
}
}
}
this._logger("Not showing " + g);
for (var i = 0; i < 256; i++) {
if (this._visitedSystems[g][i] != 1) {
var t = System.infoForSystem(g, id);
this._logger(t.name + ":" + this._visitedSystems[g][i]);
}
}
this._logger("Not showing END");
};
// Сохранение
this.playerWillSaveGame = function() {
this._logger("this.playerWillSaveGame()");
this._saveData();
this._logger("this.playerWillSaveGame END");
};
// Выход из гипера
this.shipExitedWitchspace = function() {
this._logger("this.shipExitedWitchspace()");
this._doWork();
this._logger("this.shipExitedWitchspace END");
};
// Переход между галактиками
this.playerEnteredNewGalaxy = function() {
this._logger("this.playerEnteredNewGalaxy()");
if (system.isInterstellarSpace) {
return;
}
this._doWorkFull();
this._logger("this.playerEnteredNewGalaxy END");
};
// Изменение экрана
this.guiScreenWillChange = function(to, from) {
this._logger("this.guiScreenWillChange(): " + from + " -> " + to);
this._mapShowOrHide(to, from);
this._logger("this.guiScreenWillChange END");
};
this.guiScreenChanged = function(to, from) {
this._logger("this.guiScreenChanged(): " + from + " -> " + to);
this._mapShowOrHide(to, from);
this._logger("this.guiScreenChanged END");
};
this._mapShowOrHide = function(to, from) {
var g = system.info.galaxyID;
if (to == 'GUI_SCREEN_SHORT_RANGE_CHART' || to == 'GUI_SCREEN_LONG_RANGE_CHART' || to == 'GUI_SCREEN_MISSION' || to == 'GUI_SCREEN_SYSTEM_DATA') {
this._hideGUIScreen();
//this._timer = new Timer(this, this._hideGUIScreen, 0, -1);
}
else {
this._showAll(g);
}
};
this._hideGUIScreen = function() {
this._logger("this._hideGUIScreen()");
var g = system.info.galaxyID;
this._markTargetSystems();
this._hideAll(g);
this._logger("this._hideGUIScreen END");
};
this._saveData = function() {
// Сохраняем в save-файл посещения
missionVariables.ZeroMap_VISITED_SYSTEMS__0_3 = JSON.stringify(this._visitedSystems);
missionVariables.ZeroMap_SETTINGS_LEVEL = this._DIFFICULTY[this._LEVEL_CURRENT];
};
this._loadData = function() {
// Инициализируем посещения
this._visitedSystems = [
[],
[],
[],
[],
[],
[],
[],
[]
];
// Загружаем настройки
var level = missionVariables.ZeroMap_SETTINGS_LEVEL;
if (this._DIFFICULTY.indexOf(level) != -1) {
this._logger("Level: " + level);
this._LEVEL_CURRENT = this._DIFFICULTY.indexOf(level);
}
// Загружаем посещения
var tmp = JSON.parse(missionVariables.ZeroMap_VISITED_SYSTEMS__0_3);
// Если загрузка не произошла - пытаемся импортировать исторические данные
if (!tmp) {
tmp = this._importFromOld();
}
// Если загрузили успешно
if (tmp) {
this._visitedSystems = tmp;
}
};
this._importFromOld = function() {
// Удаляем данные до версии 0.3
delete missionVariables.ZeroMap_VISITED_SYSTEMS;
return null;
};
this.shipDockedWithStation = function(station) {
this._showMission(station);
};
this._DIFFICULTY = ["Easy", "Normal", "Hard", "Disable"];
this._showMission = function(station) {
this._logger("ZeroMap difficulty: " + this._LEVEL_CURRENT + " : " + this._DIFFICULTY[this._LEVEL_CURRENT]);
station.setInterface("ZeroMap_OXP", {
title: "ZeroMap",
category: "Options",
summary: "ZeroMap OXP settings",
callback: this._missionCallBack.bind(this)
});
};
this._missionCallBack = function(state) {
player.ship.hudHidden = false;
var states = ["ZeroMap_01_EASY", "ZeroMap_02_NORMAL", "ZeroMap_03_HARD", "ZeroMap_04_OFF"];
if (state == "ZeroMap_OXP") {
var choices_arr = [{
text: "Easy",
//alignment: "LEFT"
}, {
text: "Normal",
//alignment: "LEFT"
}, {
text: "Hard",
//alignment: "LEFT"
}, {
text: "Disable",
//alignment: "LEFT"
}];
var choices = {};
for (var i = 0; i < choices_arr.length; i++) {
choices[states[i]] = choices_arr[i];
}
choices.ZeroMap_00_Diff = {
text: "Difficulty",
//alignment: "LEFT",
unselectable: true,
color: "whiteColor"
};
choices.ZeroMap_50 = {
text: "",
//alignment: "LEFT"
};
choices.ZeroMap_99_EXIT = {
text: "Exit",
//alignment: "LEFT"
};
var current = current = choices_arr[this._LEVEL_CURRENT];
current.text = "* " + current.text + " *";
current.color = "greenColor";
player.ship.hudHidden = true;
mission.runScreen({
title: "Select ZeroMap difficulty",
message: this._buildDescription(this._difficultyDescription),
choices: choices,
initialChoicesKey: "ZeroMap_99_EXIT",
exitScreen: "GUI_SCREEN_SHORT_RANGE_CHART"
},
this._missionCallBack);
}
if (states.indexOf(state) != -1) {
this._LEVEL_CURRENT = states.indexOf(state);
player.ship.hudHidden = true;
mission.runScreen({
allowInterrupt: true,
title: "ZeroMap difficulty: " + this._DIFFICULTY[this._LEVEL_CURRENT],
message: "Saved. Current settings are:\n\n" + this._buildDescription(this._difficultyDescription[this._LEVEL_CURRENT]),
//backgroundSpecial: "SHORT_RANGE_CHART",
exitScreen: "GUI_SCREEN_SHORT_RANGE_CHART"
},
this._missionCallBack);
}
};
this._buildDescription = function(desc) {
var str = "";
for (var i = 0; i < desc.length; i++) {
var d = desc[i];
if (Array.isArray(d)) {
str += this._buildDescription(d) + "\n";
}
else {
str += d + "\n";
}
}
return str;
};
this._difficultyDescription = [
[
"Easy - shows full map of the Galaxy without names of systems.",
"* Visited systems - all information.",
"* Systems in 7LY - all information.",
"* Systems in 10LY - only name of system."
],
[
"Normal - hides map of the Galaxy. Some information about the surrounding systems are available. Isolated regions can be founded.",
"* Visited systems - all information.",
"* Systems in 7LY - only name of system.",
"* Systems in 10LY - without name of system."
],
[
"Hard - hides map of the Galaxy. Minimum information about the surrounding systems are available.",
"* Visited systems - all information.",
"* Systems in 7LY - without name of system."
],
[
"Disable - shows standard map of the Galaxy."
]
]; |