diff --git a/src/Player.js b/src/Player.js index 27ad67086..2b98f50d5 100644 --- a/src/Player.js +++ b/src/Player.js @@ -634,24 +634,108 @@ PlayerObject.prototype.resetWorkStatus = function() { document.getElementById("work-in-progress-text").innerHTML = ""; } -PlayerObject.prototype.gainWorkExp = function() { - this.gainHackingExp(this.workHackExpGained); - this.gainStrengthExp(this.workStrExpGained); - this.gainDefenseExp(this.workDefExpGained); - this.gainDexterityExp(this.workDexExpGained); - this.gainAgilityExp(this.workAgiExpGained); - this.gainCharismaExp(this.workChaExpGained); +PlayerObject.prototype.processWorkEarnings(numCycles=1) { + var hackExpGain = this.workHackExpGainRate * numCycles; + var strExpGain = this.workStrExpGainRate * numCycles; + var defExpGain = this.workDefExpGainRate * numCycles; + var dexExpGain = this.workDexExpGainRate * numCycles; + var agiExpGain = this.workAgiExpGainRate * numCycles; + var chaExpGain = this.workChaExpGainRate * numCycles; + + this.gainHackingExp(hackExpGain); + this.gainStrengthExp(strExpGain); + this.gainDefenseExp(defExpGain); + this.gainDexterityExp(dexExpGain); + this.gainAgilityExp(agiExpGain); + this.gainCharismaExp(chaExpGain); + this.workHackExpGained += hackExpGain; + this.workStrExpGained += strExpGain; + this.workDefExpGained += defExpGain; + this.workDexExpGained += dexExpGain; + this.workAgiExpGained += agiExpGain; + this.workChaExpGained += chaExpGain; + this.workRepGained += this.workRepGainRate * numCycles; + this.workMoneyGained += this.workMoneyGainRate * numCycles; } /* Working for Company */ +PlayerObject.prototype.startWork = function() { + this.resetWorkStatus(); + this.isWorking = true; + this.workType = CONSTANTS.WorkTypeCompany; + + 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.timeNeededToCompleteWork = CONSTANTS.MillisecondsPer8Hours; + + //Remove all old event listeners from Cancel button + var newCancelButton = clearEventListeners("work-in-progress-cancel-button"); + newCancelButton.innerHTML = "Cancel Work"; + newCancelButton.addEventListener("click", function() { + Player.finishWork(true); + return false; + }); + + //Display Work In Progress Screen + Engine.loadWorkInProgressContent(); +} + +PlayerObject.prototype.work = function(numCycles) { + //Cap the number of cycles being processed to whatever would put you at + //the work time limit (8 hours) + var overMax = false; + if (this.timeWorked + (Engine._idleSpeed * numCycles) >= CONSTANTS.MillisecondsPer8Hours) { + overMax = true; + numCycles = Math.round((CONSTANTS.MillisecondsPer8Hours - this.timeWorked) / Engine._idleSpeed); + } + this.timeWorked += Engine._idleSpeed * numCycles; + + this.workRepGainRate = this.getWorkRepGain(); + this.processWorkEarnings(numCycles); + + //If timeWorked == 8 hours, then finish. You can only gain 8 hours worth of exp and money + if (overMax || this.timeWorked >= CONSTANTS.MillisecondsPer8Hours) { + return this.finishWork(false); + } + + var comp = Companies[this.companyName], companyRep = "0"; + if (comp == null || !(comp instanceof Company)) { + console.log("ERROR: Could not find Company: " + this.companyName); + } else { + companyRep = comp.playerReputation; + } + + var txt = document.getElementById("work-in-progress-text"); + txt.innerHTML = "You are currently working as a " + this.companyPosition.positionName + + " at " + this.companyName + " (Current Company Reputation: " + + formatNumber(companyRep, 0) + ")

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

" + + "You have earned:

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

" + + formatNumber(this.workRepGained, 4) + " (" + formatNumber(this.workRepGainRate * cyclesPerSec, 4) + " / sec) reputation for this company

" + + formatNumber(this.workHackExpGained, 4) + " (" + formatNumber(this.workHackExpGainRate * cyclesPerSec, 4) + " / sec) hacking exp

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

" + + formatNumber(this.workChaExpGained, 4) + " (" + formatNumber(this.workChaExpGainRate * cyclesPerSec, 4) + " / 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 reputation you've earned so far." +} + PlayerObject.prototype.finishWork = function(cancelled, sing=false) { //Since the work was cancelled early, player only gains half of what they've earned so far if (cancelled) { this.workRepGained /= 2; } - this.gainWorkExp(); - var company = Companies[this.companyName]; company.playerReputation += (this.workRepGained); @@ -698,91 +782,6 @@ PlayerObject.prototype.finishWork = function(cancelled, sing=false) { this.resetWorkStatus(); } -PlayerObject.prototype.startWork = function() { - this.resetWorkStatus(); - this.isWorking = true; - this.workType = CONSTANTS.WorkTypeCompany; - - 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.timeNeededToCompleteWork = CONSTANTS.MillisecondsPer8Hours; - - //Remove all old event listeners from Cancel button - var newCancelButton = clearEventListeners("work-in-progress-cancel-button"); - newCancelButton.innerHTML = "Cancel Work"; - newCancelButton.addEventListener("click", function() { - Player.finishWork(true); - return false; - }); - - //Display Work In Progress Screen - Engine.loadWorkInProgressContent(); -} - -PlayerObject.prototype.work = function(numCycles) { - this.workRepGainRate = this.getWorkRepGain(); - - 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 >= CONSTANTS.MillisecondsPer8Hours) { - var maxCycles = CONSTANTS.GameCyclesPer8Hours; - 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); - return; - } - - var comp = Companies[this.companyName], companyRep = "0"; - if (comp == null || !(comp instanceof Company)) { - console.log("ERROR: Could not find Company: " + this.companyName); - } else { - companyRep = comp.playerReputation; - } - - var txt = document.getElementById("work-in-progress-text"); - txt.innerHTML = "You are currently working as a " + this.companyPosition.positionName + - " at " + this.companyName + " (Current Company Reputation: " + - formatNumber(companyRep, 0) + ")

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

" + - "You have earned:

" + - "$" + formatNumber(this.workMoneyGained, 2) + " ($" + formatNumber(this.workMoneyGainRate * cyclesPerSec, 2) + " / sec)

" + - formatNumber(this.workRepGained, 4) + " (" + formatNumber(this.workRepGainRate * cyclesPerSec, 4) + " / sec) reputation for this company

" + - formatNumber(this.workHackExpGained, 4) + " (" + formatNumber(this.workHackExpGainRate * cyclesPerSec, 4) + " / sec) hacking exp

" + - formatNumber(this.workStrExpGained, 4) + " (" + formatNumber(this.workStrExpGainRate * cyclesPerSec, 4) + " / sec) strength exp
" + - formatNumber(this.workDefExpGained, 4) + " (" + formatNumber(this.workDefExpGainRate * cyclesPerSec, 4) + " / sec) defense exp
" + - formatNumber(this.workDexExpGained, 4) + " (" + formatNumber(this.workDexExpGainRate * cyclesPerSec, 4) + " / sec) dexterity exp
" + - formatNumber(this.workAgiExpGained, 4) + " (" + formatNumber(this.workAgiExpGainRate * cyclesPerSec, 4) + " / sec) agility exp

" + - formatNumber(this.workChaExpGained, 4) + " (" + formatNumber(this.workChaExpGainRate * cyclesPerSec, 4) + " / 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 reputation you've earned so far." - -} - PlayerObject.prototype.startWorkPartTime = function() { this.resetWorkStatus(); this.isWorking = true; @@ -811,39 +810,34 @@ PlayerObject.prototype.startWorkPartTime = function() { } PlayerObject.prototype.workPartTime = function(numCycles) { - this.workRepGainRate = this.getWorkRepGain(); - - 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; - + //Cap the number of cycles being processed to whatever would put you at the + //work time limit (8 hours) + var overMax = false; + if (this.timeWorked + (Engine._idleSpeed * numCycles) >= CONSTANTS.MillisecondsPer8Hours) { + overMax = true; + numCycles = Math.round((CONSTANTS.MillisecondsPer8Hours - this.timeWorked) / Engine._idleSpeed); + } this.timeWorked += Engine._idleSpeed * numCycles; + this.workRepGainRate = this.getWorkRepGain(); + this.processWorkEarnings(numCycles); + //If timeWorked == 8 hours, then finish. You can only gain 8 hours worth of exp and money - if (this.timeWorked >= CONSTANTS.MillisecondsPer8Hours) { - var maxCycles = CONSTANTS.GameCyclesPer8Hours; - 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.finishWorkPartTime(); - return; + if (overMax || this.timeWorked >= CONSTANTS.MillisecondsPer8Hours) { + return this.finishWorkPartTime(); + } + + var comp = Companies[this.companyName], companyRep = "0"; + if (comp == null || !(comp instanceof Company)) { + console.log("ERROR: Could not find Company: " + this.companyName); + } else { + companyRep = comp.playerReputation; } var txt = document.getElementById("work-in-progress-text"); txt.innerHTML = "You are currently working as a " + this.companyPosition.positionName + - " at " + Player.companyName + "

" + + " at " + Player.companyName + " (Current Company Reputation: " + + formatNumber(companyRep, 0) + ")

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

" + "You have earned:

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

" + @@ -860,8 +854,6 @@ PlayerObject.prototype.workPartTime = function(numCycles) { } PlayerObject.prototype.finishWorkPartTime = function(sing=false) { - this.gainWorkExp(); - var company = Companies[this.companyName]; company.playerReputation += (this.workRepGained); @@ -903,51 +895,6 @@ PlayerObject.prototype.finishWorkPartTime = function(sing=false) { } /* Working for Faction */ -PlayerObject.prototype.finishFactionWork = function(cancelled, sing=false) { - this.gainWorkExp(); - - 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:
" + - "$" + formatNumber(this.workMoneyGained, 2) + "
" + - formatNumber(this.workRepGained, 4) + " reputation for the faction
" + - formatNumber(this.workHackExpGained, 4) + " hacking exp
" + - formatNumber(this.workStrExpGained, 4) + " strength exp
" + - formatNumber(this.workDefExpGained, 4) + " defense exp
" + - formatNumber(this.workDexExpGained, 4) + " dexterity exp
" + - formatNumber(this.workAgiExpGained, 4) + " agility exp
" + - formatNumber(this.workChaExpGained, 4) + " charisma exp
"; - if (!sing) {dialogBoxCreate(txt);} - - var mainMenu = document.getElementById("mainmenu-container"); - mainMenu.style.visibility = "visible"; - - this.isWorking = false; - - Engine.loadFactionContent(); - displayFactionContent(faction.name); - if (sing) { - var res="You worked for your faction " + faction.name + " for a total of " + convertTimeMsToTimeElapsedString(this.timeWorked) + ". " + - "You earned " + - formatNumber(this.workRepGained, 4) + " rep, " + - formatNumber(this.workHackExpGained, 4) + " hacking exp, " + - formatNumber(this.workStrExpGained, 4) + " str exp, " + - formatNumber(this.workDefExpGained, 4) + " def exp, " + - formatNumber(this.workDexExpGained, 4) + " dex exp, " + - formatNumber(this.workAgiExpGained, 4) + " agi exp, and " + - formatNumber(this.workChaExpGained, 4) + " cha exp."; - this.resetWorkStatus(); - return res; - } - this.resetWorkStatus(); -} - PlayerObject.prototype.startFactionWork = function(faction) { //Update reputation gain rate to account for faction favor var favorMult = 1 + (faction.favor / 100); @@ -1088,6 +1035,50 @@ PlayerObject.prototype.workForFaction = function(numCycles) { "There is no penalty for cancelling earlier."; } +PlayerObject.prototype.finishFactionWork = function(cancelled, sing=false) { + this.gainWorkExp(); + + 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:
" + + "$" + formatNumber(this.workMoneyGained, 2) + "
" + + formatNumber(this.workRepGained, 4) + " reputation for the faction
" + + formatNumber(this.workHackExpGained, 4) + " hacking exp
" + + formatNumber(this.workStrExpGained, 4) + " strength exp
" + + formatNumber(this.workDefExpGained, 4) + " defense exp
" + + formatNumber(this.workDexExpGained, 4) + " dexterity exp
" + + formatNumber(this.workAgiExpGained, 4) + " agility exp
" + + formatNumber(this.workChaExpGained, 4) + " charisma exp
"; + if (!sing) {dialogBoxCreate(txt);} + + var mainMenu = document.getElementById("mainmenu-container"); + mainMenu.style.visibility = "visible"; + + this.isWorking = false; + + Engine.loadFactionContent(); + displayFactionContent(faction.name); + if (sing) { + var res="You worked for your faction " + faction.name + " for a total of " + convertTimeMsToTimeElapsedString(this.timeWorked) + ". " + + "You earned " + + formatNumber(this.workRepGained, 4) + " rep, " + + formatNumber(this.workHackExpGained, 4) + " hacking exp, " + + formatNumber(this.workStrExpGained, 4) + " str exp, " + + formatNumber(this.workDefExpGained, 4) + " def exp, " + + formatNumber(this.workDexExpGained, 4) + " dex exp, " + + formatNumber(this.workAgiExpGained, 4) + " agi exp, and " + + formatNumber(this.workChaExpGained, 4) + " cha exp."; + this.resetWorkStatus(); + return res; + } + this.resetWorkStatus(); +} //Money gained per game cycle PlayerObject.prototype.getWorkMoneyGain = function() {