| Config/script.js | "use strict";
this.name           = "commodity_markets";
this.author         = "spara";
this.copyright      = "2013-2015 Mika SpÄra";
this.description    = "Different prices for buying and selling at every station.";
this.licence    	= "CC BY-NC-SA 4.0";
this.startUp = function() {
	
	//flag for prices' status
	this.$fixedPrices = false;
	
	//restore pricefactors
	if (missionVariables.commodityMarketsPriceFactors2) {
		this.$priceFactors = JSON.parse(missionVariables.commodityMarketsPriceFactors2);
	} 
	else {
		//init individual pricefactors
		this.$priceFactors = new Object();
		var i;
		var sMarket = system.mainStation.market;
		for (var i in sMarket)
			this.$priceFactors[i] = 1.02 + 0.03 * Math.random();
	}
	
	//these are for more efficient tabbing
	this.$tabs = [""];
	for (var i = 1; i < 10; i++) {
		var tab = " ";
		//keep on adding spaces until we go one space over.
		while (defaultFont.measureString(tab + " ") < i)
			tab += " ";
		this.$tabs.push(tab);
	}
	
	//calculate new prices
	this.$createPrices();
	
	//take control of playerBoughtCargo handlers from other scripts
	this.$injectOXPs();
}
//set prices on docking
this.shipDockedWithStation = function(station) {
	
	//5% change for an individual commodity price to fluctuate
	for (var i in station.market) {
		if (Math.random() < 0.05)
			this.$priceFactors[i] = 1.02 + 0.03 * Math.random();		
	}
	
	this.$createPrices();
}
//restore prices on launch
this.shipWillLaunchFromStation = function(station) {
	if (this.$fixedPrices) this.$restorePrices();
}
this.guiScreenWillChange = function(to, from) {
	//only touch prices when docked
	if (!player.ship.docked) return;
	
	//fix prices when switching to market screen
	if (to === "GUI_SCREEN_MARKET" && !this.$fixedPrices) {
		var dMarket = player.ship.dockedStation.market;
		for (var i in dMarket) {
			player.ship.dockedStation.setMarketPrice(i, this.$commodities[i][2]);
			if (!worldScripts["market_observer3"])
				manifest.setShortComment(i, this.$tabulate("", 7)+this.$formatCredits(this.$commodities[i][1]));
		}
		this.$fixedPrices = true;
	}
}
this.guiScreenChanged = function(to, from) {
	//restore original prices when leaving market screen
	if (guiScreen.indexOf("GUI_SCREEN_MARKET") === -1 && this.$fixedPrices)
		this.$restorePrices();
}
//restore original prices
this.$restorePrices = function(){
	var dMarket = player.ship.dockedStation.market;
	for (var i in dMarket) {
		if (!worldScripts["market_observer3"])
			manifest.setShortComment(i, "");
		player.ship.dockedStation.setMarketPrice(i, this.$commodities[i][0]);
	}
	this.$fixedPrices = false;
}
//create an object holding the prices
this.$createPrices = function() {
	this.$commodities = new Object();
	var dMarket = player.ship.dockedStation.market;
	for (var i in dMarket) {
		var priceFactor = this.$priceFactors[i];
		var originalPrice = player.ship.dockedStation.market[i].price;
		var buyPrice = Math.round(priceFactor * originalPrice);
		//if (buyPrice > 1020) buyPrice = 1020;//not needed anymore?
		var sellPrice = Math.round(originalPrice / priceFactor);
		this.$commodities[i] = [originalPrice, buyPrice, sellPrice];
	}
}
this.playerBoughtCargo = function(commodity, units, price) {
	var correctPrice = price;
	var correctUnits = units;
	//don't touch, if for some mysterious reason original prices
	if (this.$fixedPrices) {
		
		//calculate the correct values
		correctPrice = this.$commodities[commodity][1];
		var creditsBefore = player.credits + Math.round(units * price) / 10;
		while (correctPrice * correctUnits > creditsBefore * 10)
			correctUnits--;
		
		//reverse buying with sell prices
		player.ship.dockedStation.setMarketQuantity(commodity, (player.ship.dockedStation.market[commodity].quantity + units));
		player.credits += (units * price) / 10;
		player.ship.manifest[commodity] -= units;
		
		//buy again with correct prices
		if (correctUnits > 0) {
			player.ship.dockedStation.setMarketQuantity(commodity, (player.ship.dockedStation.market[commodity].quantity - correctUnits));
			player.credits -= correctUnits * correctPrice / 10;
			player.ship.manifest[commodity] += correctUnits;
		}
	}
	
	//activate handlers in other scripts
	for (var i in this.$buyScripts) {
		var scriptName = this.$buyScripts[i];
		if (worldScripts[scriptName].$cmPlayerBoughtCargo) 
			worldScripts[scriptName].$cmPlayerBoughtCargo(commodity, correctUnits, correctPrice);
	}
}
//rename playerBoughtCargo handlers so that they won't be called by the game. calling is handled from this script
this.$injectOXPs = function() {
	this.$buyScripts = new Array();
	for (var i in worldScriptNames) {
		var scriptName = worldScriptNames[i];
		if (worldScripts[scriptName] && scriptName !== this.name  && worldScripts[scriptName].playerBoughtCargo) {
			this.$buyScripts.push(scriptName);
			worldScripts[scriptName].$cmPlayerBoughtCargo = worldScripts[scriptName].playerBoughtCargo;
			delete worldScripts[scriptName].playerBoughtCargo;
		}
	}
}
//save pricefactors
this.playerWillSaveGame = function() {
	missionVariables.commodityMarketsPriceFactors2 = JSON.stringify(this.$priceFactors);
}
//tabbing function
this.$tabulate = function(string, col) {
	//start with spaces
	var tab = this.$tabs[Math.floor(col - defaultFont.measureString(string))];
	while (defaultFont.measureString(string + tab + " ") < col) {
		tab += " ";
	}
	
	//fine tune with hair spaces
	var hairSpace = String.fromCharCode(31);
	while (defaultFont.measureString(string + tab + hairSpace) < col) {
		tab += hairSpace;
	}
	
	return(string + tab);
}
//helper to format credits on screen
this.$formatCredits = function(credits) {
	if (credits < 99.5) 
		return "    " + formatCredits(credits/10, true, false);
	else if (credits < 999.5)
		return "  " + formatCredits(credits/10, true, false);
	else return formatCredits(credits/10, true, false);
}
 |