var pop;
var resources;
var numResources;
var buildings;
var unlockedBuildings;
var researches;
var unlockedResearch;
var research_points;
var workers;
var all_buildings={
hut:{
ings:{
wood:15
},
attributes:{
maxPop:2
}
},
house:{
ings:{
wood:30,
metal:5
},
attributes:{
maxPop:4
}
},
lab:{
ings:{
wood:30,
metal:15
},
attributes:{
max_research_points:150
}
},
storehouse:{
ings:{
wood:60
},
attributes: {
max_resources:100
}
},
"trading post":{
ings:{
wood:100,
metal:50
}
}
};
var allWorkers={
lumberjack:"wood",
miner:"metal",
scientist:"research_points"
};
var worker_rate=0.1;
var all_researches={
"Faster workers":{
maxLevel:6,
cost:100,
effects:{
worker_rate:0.2
}
}
};
var multiplier=1.17;
var trading_rates={
wood:1,
metal:10
};
var startingStorage=100;
var shelters=[];
function initializeShelterArray() {
for (var name in all_buildings) {
var building=all_buildings[name];
var attrbs=building.attributes;
if (attrbs) {
var maxpop=attrbs.maxPop;
if (maxpop) {
shelters.push(name);
}
}
}
}
function getBuildingAttribute(name,attrname) {
var attr=all_buildings[name].attributes[attrname];
if (attr==undefined) {
attr=0;
}
return attr;
}
function numOfBuilding(name) {
var count=buildings[name]
if (count==undefined) {
count=0;
}
return count;
}
function tenthRound(number) {
return Math.round(number*10)/10;
}
function maxResources() {
var numStorehouses=numOfBuilding("storehouse");
var storehouseResources=getBuildingAttribute("storehouse","max_resources");
var extraStorage=numStorehouses*storehouseResources;
return startingStorage+extraStorage;
}
function max_research_points() {
var numLabs=numOfBuilding("labs");
var labRpoints=getBuildingAttribute("lab","max_research_points");
return numLabs*labRpoints;
}
function maxPop() {
var maxpop=0;
for (var i in shelters) {
var shelter=shelters[i];
if (numOfBuilding(shelter)>0) {
maxpop+=numOfBuilding(shelter)*getBuildingAttribute(shelter,"maxPop");
}
}
return maxpop;
}
function updateShown() {
var has_resources=Object.keys(resources).length>0;
var has_lab=Object.keys(buildings).includes("lab");
var has_tpost=Object.keys(buildings).includes("trading post");
var has_shelter=false
for (var i in shelters) {
var shelter=shelters[i];
if (Object.keys(buildings).includes(shelter)) {
has_shelter=true;
break;
}
}
$(".shelter_required").toggle(has_shelter);
$("#link_population").toggle(has_shelter);
$(".resources_required").toggle(has_resources);
$("#link_buildings").toggle(has_resources);
$("#link_research").toggle(has_lab);
$(".research_required").toggle(has_lab);
$("#link_trading").toggle(has_tpost);
}
function incResource(name,amount=1) {
if (name=="research_points") {
if (research_points>max_research_points()) {
return;
}
research_points+=amount;
if (research_points>max_research_points()) {
research_points-=amount;
return;
}
research_points=tenthRound(research_points);
updateResearchPointInfo();
updateResearchButtons();
} else {
if (numResources>=maxResources()) {
return;
}
if (resources[name]) {
resources[name]+=amount;
} else {
resources[name]=amount;
}
numResources+=amount;
if (numResources>maxResources()) {
decResource(name,amount);
return;
}
resources[name]=tenthRound(resources[name]);
numResources=tenthRound(numResources);
updateResourceInfo();
updateCraftButtons();
updateTradingButtons();
}
updateShown();
}
function decResource(name,amount=1) {
if (resources[name] "+capName+": "+resources[name]+" "+capName+": "+buildings[name]+"
");
} else {
$("#craft_buttons").append("
");
}
}
}
}
function updatePopulation() {
if(pop>0) {
updateWorkerInfo();
}
if (pop
"+name+": Level "+researches[name]+"
"); } } function applyResearches() { for (var research in researches) { var effects=all_researches[research].effects; var level=researches[research]; for (var effect in effects) { if (effect=="worker_rate") { worker_rate=0.5; worker_rate+=effects[effect]*level; } } } } function research(name) { research_points-=all_researches[name].cost; if (researches[name]) { researches[name]+=1; } else { researches[name]=1; } updateResearchButtons(); updateResearchInfo(); applyResearches(); } function hire(type) { if (workers[type]) { workers[type]+=1; } else { workers[type]=1; } updateWorkerInfo(); } function fire(type) { if (workers[type]) { workers[type]-=1; } else { throw new Error("Cannot fire a never hired employee"); } updateWorkerInfo(); } function autoInc() { for (var worker in allWorkers) { worker_amount=workers[worker]; var amount=worker_rate*worker_amount; if (amount>0) { if (worker=="scientist") { var usedMetal=Math.ceil(worker_amount*0.4); if (resources["metal"]>=usedMetal) { incResource(allWorkers[worker],amount); decResource("metal",usedMetal); } } else { incResource(allWorkers[worker],amount); } } } } function save() { gamestate={ pop:pop, workers:workers, resources:resources, numResources:numResources, buildings:buildings, unlockedBuildings:unlockedBuildings, researches:researches, unlockedResearch:unlockedResearch, research_points:research_points, } localStorage.setItem("game",JSON.stringify(gamestate)); } function load() { var gamestate=JSON.parse(localStorage.getItem("game")); if (gamestate==null) { return false; } pop=gamestate.pop; workers=gamestate.workers; resources=gamestate.resources; numResources=gamestate.numResources; buildings=gamestate.buildings; unlockedBuildings=gamestate.unlockedBuildings; researches=gamestate.researches; unlockedResearch=gamestate.unlockedResearch; research_points=gamestate.research_points; return true; } function reset() { localStorage.removeItem("game"); if (load()!=false) { alert("Unable to reset game"); } init(); } function init() { if (!load()) { pop=0; resources={}; numResources=0; buildings={}; unlockedBuildings=[]; researches={}; unlockedResearch=[]; research_points=0; workers={ lumberjack:0, miner:0, scientist:0 }; } set_tab("main"); updateShown(); updateResourceInfo(); updateBuildingInfo(); updatePopulationInfo(); updateWorkerInfo(); updateCraftButtons(); updateResearchPointInfo(); updateResearchButtons(); updateResearchInfo(); applyResearches(); updateTradingButtons(); } function set_tab(tab) { if ($("#link_"+tab).is(":visible")) { $("[id^='tab_']").hide(); $("[id^='link_']").removeClass("active"); $("#tab_"+tab).show(); $("#link_"+tab).addClass("active"); } } function canSell(name,amount=1) { var goldGotten=trading_rates[name]*amount; var spacesNeeded=goldGotten-amount; return maxResources()-numResources>=spacesNeeded; } function buy(name,amount=1) { decResource("gold",trading_rates[name]*amount); incResource(name,amount); } function sell(name,amount=1) { decResource(name,amount); incResource("gold",trading_rates[name]*amount); } $(document).ready(function() { initializeShelterArray(); init(); $(window).on("unload",function(e){ save(); }); window.setInterval(function() { updatePopulation(); }, 10000); window.setInterval(function() { autoInc(); }, 2000); });