//Netburner Player class function PlayerObject() { //Skills and stats this.hacking_skill = 1; //Fighting this.strength = 1; //Damage dealt this.defense = 1; //Damage received this.dexterity = 1; //Accuracy this.agility = 1; //Dodge % //Labor stats this.charisma = 1; //Intelligence, perhaps? //Hacking multipliers this.hacking_chance_mult = 2; //Increase through ascensions/augmentations //this.hacking_speed_mult = 5; //Decrease through ascensions/augmentations this.hacking_speed_mult = 1; //Make it faster for debugging this.hacking_money_mult = .001; //Increase through ascensions/augmentations. Can't go above 1 //Note: "Lifetime" refers to current ascension, "total" refers to the entire game history //Accumulative stats and skills this.total_hacking = 1; this.total_strength = 1; this.total_defense = 1; this.total_dexterity = 1; this.total_agility = 1; this.total_charisma = 1; this.lifetime_hacking = 1; this.lifetime_strength = 1; this.lifetime_defense = 1; this.lifetime_dexterity = 1; this.lifetime_agility = 1; this.lifetime_charisma = 1; //Experience and multipliers this.hacking_exp = 0; this.strength_exp = 0; this.defense_exp = 0; this.dexterity_exp = 0; this.agility_exp = 0; this.charisma_exp = 0; this.hacking_mult = 1; this.strength_mult = 1; this.defense_mult = 1; this.dexterity_mult = 1; this.agility_mult = 1; this.charisma_mult = 1; this.hacking_exp_mult = 1; this.strength_exp_mult = 1; this.defense_exp_mult = 1; this.dexterity_exp_mult = 1; this.agility_exp_mult = 1; this.charisma_exp_mult = 1; this.company_rep_mult = 1; this.faction_rep_mult = 1; //Money this.money = 0; this.total_money = 0; this.lifetime_money = 0; //IP Address of Starting (home) computer this.homeComputer = ""; //Location information this.city = Locations.Sector12; this.location = ""; //Company Information this.companyName = ""; //Name of Company, equivalent to an object from Locations this.companyPosition = ""; //CompanyPosition object //Servers this.currentServer = ""; //IP address of Server currently being accessed through terminal this.discoveredServers = []; //IP addresses of secret servers not in the network that you have discovered this.purchasedServers = []; //Factions this.factions = []; //Names of all factions player has joined //Augmentations this.augmentations = []; //Names of all installed augmentations this.numAugmentations = 0; //Misc statistics this.numPeopleKilled = 0; this.numPeopleKilledTotal = 0; this.numPeopleKilledLifetime = 0; //Achievements and achievement progress //Flag to let the engine know the player is starting an action // Current actions: hack, analyze this.startAction = false; this.actionTime = 0; //Flags/variables for working (both Company and faction) this.isWorking = false; this.currentWorkFactionName = ""; this.currentWorkFactionDescription = ""; this.workHackExpGainRate = 0; this.workStrExpGainRate = 0; this.workDefExpGainRate = 0; this.workDexExpGainRate = 0; this.workAgiExpGainRate = 0; this.workChaExpGainRate = 0; this.workRepGainRate = 0; this.workMoneyGainRate = 0; this.workHackExpGained = 0; this.workStrExpGained = 0; this.workDefExpGained = 0; this.workDexExpGained = 0; this.workAgiExpGained = 0; this.workChaExpGained = 0; this.workRepGained = 0; this.workMoneyGained = 0; this.timeWorked = 0; //in ms this.work_money_mult = 1; //Used to store the last update time. this.lastUpdate = new Date().getTime(); }; PlayerObject.prototype.init = function() { /* Initialize Player's home computer */ var t_homeComp = new Server(); t_homeComp.init(createRandomIp(), "home", "Home PC", true, true, true, true, 1); this.homeComputer = t_homeComp.ip; this.currentServer = t_homeComp.ip; AddToAllServers(t_homeComp); this.getHomeComputer().programs.push("PortHack.exe"); } PlayerObject.prototype.getCurrentServer = function() { return AllServers[this.currentServer]; } PlayerObject.prototype.getHomeComputer = function() { return AllServers[this.homeComputer]; } //Calculates skill level based on experience. The same formula will be used for every skill // At the maximum possible exp (MAX_INT = 9007199254740991), the hacking skill will be 1796 TODO REcalculate this // Gets to level 1000 hacking skill at (TODO Determine this) PlayerObject.prototype.calculateSkill = function(exp) { return Math.max(Math.floor(32 * Math.log(exp + 534.5) - 200), 1); } PlayerObject.prototype.updateSkillLevels = function() { //TODO Account for total and lifetime stats for achievements and stuff this.hacking_skill = Math.floor(this.calculateSkill(this.hacking_exp) * this.hacking_mult); this.strength = Math.floor(this.calculateSkill(this.strength_exp) * this.strength_mult); this.defense = Math.floor(this.calculateSkill(this.defense_exp) * this.defense_mult); this.dexterity = Math.floor(this.calculateSkill(this.dexterity_exp) * this.dexterity_mult); this.agility = Math.floor(this.calculateSkill(this.agility_exp) * this.agility_mult); this.charisma = Math.floor(this.calculateSkill(this.charisma_exp) * this.charisma_mult); } //Calculates the chance of hacking a server //The formula is: // (hacking_chance_multiplier * hacking_skill - requiredLevel) 100 - difficulty // ----------------------------------------------------------- * ----------------- // (hacking_chance_multiplier * hacking_skill) 100 PlayerObject.prototype.calculateHackingChance = function() { var difficultyMult = (100 - this.getCurrentServer().hackDifficulty) / 100; var skillMult = (this.hacking_chance_mult * this.hacking_skill); var skillChance = (skillMult - this.getCurrentServer().requiredHackingSkill) / skillMult; return (skillChance * difficultyMult); } //Calculate the time it takes to hack a server in seconds. Returns the time //The formula is: // (requiredLevel * difficulty) // ------------------------------- * hacking_speed_multiplier // hacking_skill PlayerObject.prototype.calculateHackingTime = function() { var difficultyMult = this.getCurrentServer().requiredHackingSkill * this.getCurrentServer().hackDifficulty; var skillFactor = (difficultyMult + 500) / (this.hacking_skill + 100); return skillFactor * this.hacking_speed_mult; } //Calculates the PERCENTAGE of a server's money that the player will hack from the server if successful //The formula is: // (hacking_skill - (requiredLevel-1)) 100 - difficulty // --------------------------------------* ----------------------- * hacking_money_multiplier // hacking_skill 100 PlayerObject.prototype.calculatePercentMoneyHacked = function() { var difficultyMult = (100 - this.getCurrentServer().hackDifficulty) / 100; var skillMult = (this.hacking_skill - (this.getCurrentServer().requiredHackingSkill - 1)) / this.hacking_skill; var percentMoneyHacked = difficultyMult * skillMult * this.hacking_money_mult; console.log("Percent money hacked calculated to be: " + percentMoneyHacked); return percentMoneyHacked; } //Returns how much EXP the player gains on a successful hack //The formula is: // difficulty * requiredLevel * hacking_multiplier // // Note: Keep it at an integer for now, PlayerObject.prototype.calculateExpGain = function() { return Math.round(this.getCurrentServer().hackDifficulty * this.getCurrentServer().requiredHackingSkill * this.hacking_exp_mult); } //Hack/Analyze a server. Return the amount of time the hack will take. This lets the Terminal object know how long to disable itself for //This assumes that the server being hacked is not purchased by the player, that the player's hacking skill is greater than the //required hacking skill and that the player has admin rights. PlayerObject.prototype.hack = function() { this.actionTime = this.calculateHackingTime(); console.log("Hacking time: " + this.actionTime); //Set the startAction flag so the engine starts the hacking process this.startAction = true; } PlayerObject.prototype.analyze = function() { //TODO Analyze only takes 5 seconds for now..maybe change this in the future? this.actionTime = 5; this.startAction = true; } PlayerObject.prototype.gainMoney = function(money) { this.money += money; this.total_money += money; this.lifetime_money += money; } /* Working for Company */ PlayerObject.prototype.finishWork = function(cancelled) { //Since the work was cancelled early, player only gains half of what they've earned so far var cancMult = 1; if (cancelled) { cancMult = 2; } if (Engine.Debug) { console.log("Player finishWork() called with " + this.workMoneyGained / cancMult + " $ gained"); } this.hacking_exp += (this.workHackExpGained / cancMult); this.strength_exp += (this.workStrExpGained / cancMult); this.defense_exp += (this.workDefExpGained / cancMult); this.dexterity_exp += (this.workDexExpGained / cancMult); this.agility_exp += (this.workAgiExpGained / cancMult); this.charisma_exp += (this.workChaExpGained / cancMult); var company = Companies[this.companyName]; company.playerReputation += (this.workRepGained / cancMult); this.gainMoney(this.workMoneyGained / cancMult); this.updateSkillLevels(); var txt = ""; if (cancelled) { txt = "You worked a short shift of " + convertTimeMsToTimeElapsedString(this.timeWorked) + "

" + "Since you cancelled your work early, you only gained half of the experience, money, and reputation you earned.

" + "You earned a total of:
" + "$" + (this.workMoneyGained / cancMult).toFixed(2) + "
" + (this.workRepGained / cancMult).toFixed(3) + " reputation for the company
" + (this.workHackExpGained / cancMult).toFixed(3) + " hacking exp
" + (this.workStrExpGained / cancMult).toFixed(3) + " strength exp
" + (this.workDefExpGained / cancMult).toFixed(3) + " defense exp
" + (this.workDexExpGained / cancMult).toFixed(3) + " dexterity exp
" + (this.workAgiExpGained / cancMult).toFixed(3) + " agility exp
" + (this.workChaExpGained / cancMult).toFixed(3) + " charisma exp
"; } else { txt = "You worked a full shift of 8 hours!

" + "You earned a total of:
" + "$" + (this.workMoneyGained / cancMult) + "
" + (this.workRepGained / cancMult) + " reputation for the company
" + (this.workHackExpGained / cancMult) + " hacking exp
" + (this.workStrExpGained / cancMult) + " strength exp
" + (this.workDefExpGained / cancMult) + " defense exp
" + (this.workDexExpGained / cancMult) + " dexterity exp
" + (this.workAgiExpGained / cancMult) + " agility exp
" + (this.workChaExpGained / cancMult) + " charisma exp
"; } dialogBoxCreate(txt); var mainMenu = document.getElementById("mainmenu-container"); mainMenu.style.visibility = "visible"; Player.isWorking = false; Engine.loadTerminalContent(); } PlayerObject.prototype.startWork = function() { this.isWorking = true; this.workHackExpGainRate = this.getWorkHackExpGain(); this.workStrExpGainRate = this.getWorkStrExpGain(); this.workDefExpGainRate = this.getWorkDefExpGain(); this.workDexExpGainRate = this.getWorkDexExpGain(); this.workAgiExpGainRate = this.getWorkAgiExpGain(); this.workChaExpGainRate = this.getWorkChaExpGain(); this.workRepGainRate = this.getWorkRepGain(); this.workMoneyGainRate = this.getWorkMoneyGain(); this.workHackExpGained = 0; this.workStrExpGained = 0; this.workDefExpGained = 0; this.workDexExpGained = 0; this.workAgiExpGained = 0; this.workChaExpGained = 0; this.workRepGained = 0; this.workMoneyGained = 0; this.timeWorked = 0; var cancelButton = document.getElementById("work-in-progress-cancel-button"); //Remove all old event listeners from Cancel button var newCancelButton = cancelButton.cloneNode(true); cancelButton.parentNode.replaceChild(newCancelButton, cancelButton); newCancelButton.addEventListener("click", function() { Player.finishWork(true); return false; }); //Display Work In Progress Screen Engine.loadWorkInProgressContent(); } PlayerObject.prototype.work = function(numCycles) { this.workHackExpGained += this.workHackExpGainRate * numCycles; this.workStrExpGained += this.workStrExpGainRate * numCycles; this.workDefExpGained += this.workDefExpGainRate * numCycles; this.workDexExpGained += this.workDexExpGainRate * numCycles; this.workAgiExpGained += this.workAgiExpGainRate * numCycles; this.workChaExpGained += this.workChaExpGainRate * numCycles; this.workRepGained += this.workRepGainRate * numCycles; this.workMoneyGained += this.workMoneyGainRate * numCycles; var cyclesPerSec = 1000 / Engine._idleSpeed; this.timeWorked += Engine._idleSpeed * numCycles; //If timeWorked == 8 hours, then finish. You can only gain 8 hours worth of exp and money if (this.timeWorked >= 28800000) { var maxCycles = 144000; //Number of cycles in 8 hours this.workHackExpGained = this.workhackExpGainRate * maxCycles; this.workStrExpGained = this.workStrExpGainRate * maxCycles; this.workDefExpGained = this.workDefExpGainRate * maxCycles; this.workDexExpGained = this.workDexExpGainRate * maxCycles; this.workAgiExpGained = this.workAgiExpGainRate * maxCycles; this.workChaExpGained = this.workChaExpGainRate * maxCycles; this.workRepGained = this.workRepGainRate * maxCycles; this.workMoneyGained = this.workMoneyGainRate * maxCycles; this.finishWork(false); } var txt = document.getElementById("work-in-progress-text"); txt.innerHTML = "You are currently working as a " + this.companyPosition.positionName + " at " + Player.companyName + "

" + "You have been working for " + convertTimeMsToTimeElapsedString(this.timeWorked) + "

" + "You have earned:

" + "$" + this.workMoneyGained + " (" + (this.workMoneyGainRate * cyclesPerSec).toFixed(2) + " / sec)

" + this.workRepGained.toFixed(3) + " (" + (this.workRepGainRate * cyclesPerSec).toFixed(3) + " / sec) reputation for this company

" + this.workHackExpGained.toFixed(3) + " (" + (this.workHackExpGainRate * cyclesPerSec).toFixed(3) + " / sec) hacking exp

" + this.workStrExpGained.toFixed(3) + " (" + (this.workStrExpGainRate * cyclesPerSec).toFixed(3) + " / sec) strength exp
" + this.workDefExpGained.toFixed(3) + " (" + (this.workDefExpGainRate * cyclesPerSec).toFixed(3) + " / sec) defense exp
" + this.workDexExpGained.toFixed(3) + " (" + (this.workDexExpGainRate * cyclesPerSec).toFixed(3) + " / sec) dexterity exp
" + this.workAgiExpGained.toFixed(3) + " (" + (this.workAgiExpGainRate * cyclesPerSec).toFixed(3) + " / sec) agility exp

" + this.workChaExpGained.toFixed(3) + " (" + (this.workChaExpGainRate * cyclesPerSec).toFixed(3) + " / sec) charisma exp

" + "You will automatically finish after working for 8 hours. You can cancel earlier if you wish,
" + "but you will only gain half of the experience, money, and reputation you've earned so far." } /* Working for Faction */ PlayerObject.prototype.finishFactionWork = function(cancelled, faction) { this.hacking_exp += (this.workHackExpGained); this.strength_exp += (this.workStrExpGained); this.defense_exp += (this.workDefExpGained); this.dexterity_exp += (this.workDexExpGained); this.agility_exp += (this.workAgiExpGained); this.charisma_exp += (this.workChaExpGained); var faction = Factions[this.currentWorkFactionName]; faction.playerReputation += (this.workRepGained); this.gainMoney(this.workMoneyGained); this.updateSkillLevels(); var txt = "You worked for your faction " + faction.name + " for a total of " + convertTimeMsToTimeElapsedString(this.timeWorked) + "

" + "You earned a total of:
" + "$" + (this.workMoneyGained).toFixed(2) + "
" + (this.workRepGained).toFixed(3) + " reputation for the company
" + (this.workHackExpGained).toFixed(3) + " hacking exp
" + (this.workStrExpGained).toFixed(3) + " strength exp
" + (this.workDefExpGained).toFixed(3) + " defense exp
" + (this.workDexExpGained).toFixed(3) + " dexterity exp
" + (this.workAgiExpGained).toFixed(3) + " agility exp
" + (this.workChaExpGained).toFixed(3) + " charisma exp
"; dialogBoxCreate(txt); var mainMenu = document.getElementById("mainmenu-container"); mainMenu.style.visibility = "visible"; Player.isWorking = false; Engine.loadTerminalContent(); } PlayerObject.prototype.startFactionWork = function(faction) { this.isWorking = true; this.currentWorkFactionName = faction.name; this.workHackExpGained = 0; this.workStrExpGained = 0; this.workDefExpGained = 0; this.workDexExpGained = 0; this.workAgiExpGained = 0; this.workChaExpGained = 0; this.workRepGained = 0; this.workMoneyGained = 0; this.timeWorked = 0; var cancelButton = document.getElementById("work-in-progress-cancel-button"); //Remove all old event listeners from Cancel button var newCancelButton = cancelButton.cloneNode(true); cancelButton.parentNode.replaceChild(newCancelButton, cancelButton); newCancelButton.addEventListener("click", function() { Player.finishFactionWork(true, faction); return false; }); //Display Work In Progress Screen Engine.loadWorkInProgressContent(); } PlayerObject.prototype.startFactionHackWork = function(faction) { this.workHackExpGainRate = .1 * this.hacking_exp_mult; this.workStrExpGainRate = 0; this.workDefExpGainRate = 0; this.workDexExpGainRate = 0; this.workAgiExpGainRate = 0; this.workChaExpGainRate = 0; this.workRepGainRate = this.hacking_skill / CONSTANTS.MaxSkillLevel * this.faction_rep_mult; this.workMoneyGainRate = 0; this.currentWorkFactionDescription = "carrying out hacking contracts"; this.startFactionWork(faction); } PlayerObject.prototype.startFactionFieldWork = function(faction) { this.workHackExpGainRate = .05 * this.hacking_exp_mult; this.workStrExpGainRate = .05 * this.strength_exp_mult; this.workDefExpGainRate = .05 * this.defense_exp_mult; this.workDexExpGainRate = .05 * this.dexterity_exp_mult; this.workAgiExpGainRate = .05 * this.agility_exp_mult; this.workChaExpGainRate = .05 * this.charisma_exp_mult; this.workRepGainRate = this.getFactionFieldWorkRepGain(); this.workMoneyGainRate = 0; this.currentWorkFactionDescription = "carrying out field missions" this.startFactionWork(faction); } PlayerObject.prototype.startFactionSecurityWork = function(faction) { this.workHackExpGainRate = .1 * this.hacking_exp_mult; this.workStrExpGainRate = 0; this.workDefExpGainRate = 0; this.workDexExpGainRate = 0; this.workAgiExpGainRate = 0; this.workChaExpGainRate = 0; this.workRepGainRate = this.getFactionFieldWorkRepGain(); this.workMoneyGainRate = 0; this.currentWorkFactionDescription = "performing security detail" this.startFactionWork(faction); } PlayerObject.prototype.workForFaction = function(numCycles) { var faction = Factions[this.currentWorkFactionName]; this.workHackExpGained += this.workHackExpGainRate * numCycles; this.workStrExpGained += this.workStrExpGainRate * numCycles; this.workDefExpGained += this.workDefExpGainRate * numCycles; this.workDexExpGained += this.workDexExpGainRate * numCycles; this.workAgiExpGained += this.workAgiExpGainRate * numCycles; this.workChaExpGained += this.workChaExpGainRate * numCycles; this.workRepGained += this.workRepGainRate * numCycles; this.workMoneyGained += this.workMoneyGainRate * numCycles; var cyclesPerSec = 1000 / Engine._idleSpeed; this.timeWorked += Engine._idleSpeed * numCycles; //If timeWorked == 20 hours, then finish. You can only work for the faction for 20 hours if (this.timeWorked >= 72000000) { var maxCycles = 360000; //Number of cycles in 20 hours this.workHackExpGained = this.workhackExpGainRate * maxCycles; this.workStrExpGained = this.workStrExpGainRate * maxCycles; this.workDefExpGained = this.workDefExpGainRate * maxCycles; this.workDexExpGained = this.workDexExpGainRate * maxCycles; this.workAgiExpGained = this.workAgiExpGainRate * maxCycles; this.workChaExpGained = this.workChaExpGainRate * maxCycles; this.workRepGained = this.workRepGainRate * maxCycles; this.workMoneyGained = this.workMoneyGainRate * maxCycles; this.finishFactionWork(false, faction); } var txt = document.getElementById("work-in-progress-text"); txt.innerHTML = "You are currently " + this.currentWorkFactionDescription + " for your faction " + faction.name + "." + "You have been doing this for " + convertTimeMsToTimeElapsedString(this.timeWorked) + "

" + "You have earned:

" + "$" + this.workMoneyGained + " (" + (this.workMoneyGainRate * cyclesPerSec).toFixed(2) + " / sec)

" + this.workRepGained.toFixed(3) + " (" + (this.workRepGainRate * cyclesPerSec).toFixed(3) + " / sec) reputation for this company

" + this.workHackExpGained.toFixed(3) + " (" + (this.workHackExpGainRate * cyclesPerSec).toFixed(3) + " / sec) hacking exp

" + this.workStrExpGained.toFixed(3) + " (" + (this.workStrExpGainRate * cyclesPerSec).toFixed(3) + " / sec) strength exp
" + this.workDefExpGained.toFixed(3) + " (" + (this.workDefExpGainRate * cyclesPerSec).toFixed(3) + " / sec) defense exp
" + this.workDexExpGained.toFixed(3) + " (" + (this.workDexExpGainRate * cyclesPerSec).toFixed(3) + " / sec) dexterity exp
" + this.workAgiExpGained.toFixed(3) + " (" + (this.workAgiExpGainRate * cyclesPerSec).toFixed(3) + " / sec) agility exp

" + this.workChaExpGained.toFixed(3) + " (" + (this.workChaExpGainRate * cyclesPerSec).toFixed(3) + " / sec) charisma exp

" + "You will automatically finish after working for 8 hours. You can cancel earlier if you wish.
" + "There is no penalty for cancelling earlier"; } //Money gained per game cycle PlayerObject.prototype.getWorkMoneyGain = function() { var company = Companies[this.companyName]; return this.companyPosition.baseSalary * company.salaryMultiplier * this.work_money_mult; } //Hack exp gained per game cycle PlayerObject.prototype.getWorkHackExpGain = function() { var company = Companies[this.companyName]; return this.companyPosition.hackingExpGain * company.expMultiplier * this.hacking_exp_mult; } //Str exp gained per game cycle PlayerObject.prototype.getWorkStrExpGain = function() { var company = Companies[this.companyName]; return this.companyPosition.strengthExpGain * company.expMultiplier * this.strength_exp_mult; } //Def exp gained per game cycle PlayerObject.prototype.getWorkDefExpGain = function() { var company = Companies[this.companyName]; return this.companyPosition.defenseExpGain * company.expMultiplier * this.defense_exp_mult; } //Dex exp gained per game cycle PlayerObject.prototype.getWorkDexExpGain = function() { var company = Companies[this.companyName]; return this.companyPosition.dexterityExpGain * company.expMultiplier * this.dexterity_exp_mult; } //Agi exp gained per game cycle PlayerObject.prototype.getWorkAgiExpGain = function() { var company = Companies[this.companyName]; return this.companyPosition.agilityExpGain * company.expMultiplier * this.agility_exp_mult; } //Charisma exp gained per game cycle PlayerObject.prototype.getWorkChaExpGain = function() { var company = Companies[this.companyName]; return this.companyPosition.charismaExpGain * company.expMultiplier * this.charisma_exp_mult; } //Reputation gained per game cycle PlayerObject.prototype.getWorkRepGain = function() { var jobPerformance = this.companyPosition.calculateJobPerformance(this.hacking_skill, this.strength, this.defense, this.dexterity, this.agility, this.charisma); return jobPerformance * this.company_rep_mult; } PlayerObject.prototype.getFactionSecurityWorkRepGain = function() { var t = (this.hacking_skill / CONSTANTS.MaxSkillLevel + this.strength / CONSTANTS.MaxSkillLevel + this.defense / CONSTANTS.MaxSkillLevel + this.dexterity / CONSTANTS.MaxSkillLevel + this.agility / CONSTANTS.MaxSkillLevel) / 5; return t * this.faction_rep_mult; } PlayerObject.prototype.getFactionFieldWorkRepGain = function() { var t = (this.hacking_skill / CONSTANTS.MaxSkillLevel + this.strength / CONSTANTS.MaxSkillLevel + this.defense / CONSTANTS.MaxSkillLevel + this.dexterity / CONSTANTS.MaxSkillLevel + this.agility / CONSTANTS.MaxSkillLevel + this.charisma / CONSTANTS.MaxSkillLevel) / 6; return t * this.faction_rep_mult; } //Functions for saving and loading the Player data PlayerObject.prototype.toJSON = function() { return Generic_toJSON("PlayerObject", this); } PlayerObject.fromJSON = function(value) { return Generic_fromJSON(PlayerObject, value.data); } Reviver.constructors.PlayerObject = PlayerObject; Player = new PlayerObject();