Back to Index Page generated: May 8, 2024, 6:16:03 AM

Expansion Market Ads

Content

Manifest

from Expansion Manager's OXP list from Expansion Manifest
Description Enhances the market screen by showing ads when docked. Enhances the market screen by showing ads when docked.
Identifier oolite.oxp.spara.market_ads oolite.oxp.spara.market_ads
Title Market Ads Market Ads
Category Ambiance Ambiance
Author spara spara
Version 1.0 1.0
Tags
Required Oolite Version
Maximum Oolite Version
Required Expansions
Optional Expansions
Conflict Expansions
Information URL http://wiki.alioth.net/index.php/MarketObserver n/a
Download URL https://wiki.alioth.net/img_auth.php/1/1f/Market_ads_1.0.oxz n/a
License CC-BY-NC-SA 4.0 CC-BY-NC-SA 4.0
File Size n/a
Upload date 1610873245

Documentation

Also read http://wiki.alioth.net/index.php/Market%20Ads

Equipment

This expansion declares no equipment.

Ships

This expansion declares no ships.

Models

This expansion declares no models.

Scripts

Path
Scripts/market_ads.js
"use strict";

this.name = "market_ads";
this.author = "spara";
this.description = "Add ads to the market screen when docked";

this.startUp = function() {
	this.$marketHud = "market_ads_hud.plist";//init market hud
	this.$restoreHud = player.ship.hud;//init restore hud
	this.$restoreTargetSensitivity = player.ship.reticleTargetSensitive;//for restoring target sensivity
}

this.guiScreenChanged = function(to, from) {
	//no ads in-flight
	if (!player.ship.docked) return;
	if (guiScreen.indexOf("GUI_SCREEN_MARKET") !== -1) { //swap to market hud
		if (player.ship.hud !== this.$marketHud) {
			this.$restoreHud = player.ship.hud;
			this.$restoreTargetSensitivity = player.ship.reticleTargetSensitive;
		}
		
		//set ads & swap hud
		var adService = worldScripts["market_ads_service"];
		var leftAd = adService._getHorizontalAd();
		var rightAd = adService._getHorizontalAd();
		
		player.ship.setCustomHUDDial("marketAdLeft", leftAd);
		player.ship.setCustomHUDDial("marketAdRight", rightAd);
		
		player.ship.hud = this.$marketHud;
	} 
	//restore hud
	else if (player.ship.hud === this.$marketHud) {
		player.ship.hud = this.$restoreHud;
		player.ship.reticleTargetSensitive = this.$restoreTargetSensitivity;
	}
}

Scripts/market_ads_service.js
"use strict";

this.name        = "market_ads_service"; 
this.author      = "spara";
this.description = "Pooling ad service";

this.$horzAdPool = [];

//public function for adding horizontal ad to pool. the parameter is the filename of the ad.
this._setHorzAd = function(ad) {
  this.$horzAdPool.push(ad);
}

this.startUp = function() {
  //add horizontal ads to pools
  for (var i = 1; i <= 379; i++) {
    this.$horzAdPool.push("market_ad_horz_" + i + ".png");
  }
}

this.startUpComplete = function() {
  //shuffle the pools
  this.$horzAdPool = this._shuffle(this.$horzAdPool);
  
	//Pools are divided to two parts to prevent the same ad to be seen in a quick succession. Pools are split into two parts and a primary part is randomly selected. When the active part is emptied, then the secondary part is used. When that is emptied too, pool is initialized and we draw from the primary part again.

  this._initHorzPool();
	this.$horzPrimary = Math.round(Math.random());
}

this._shuffle = function(pool) {
  var shuffled = new Array();
  var poolSize = pool.length;
  for (var i = poolSize; i > 0; i--) {
    shuffled.push(pool.splice(Math.floor(Math.random() * i), 1)[0]);
  }
  return shuffled;
}

this._initHorzPool = function() {
	var horzPoolSize = this.$horzAdPool.length;
  this.$horzPool = [this.$horzAdPool.slice(0, Math.floor(horzPoolSize / 2)), this.$horzAdPool.slice(Math.ceil(horzPoolSize / 2), horzPoolSize - 1)];
}

//public function that returns a random horizontal ad filename from the pool
this._getHorizontalAd = function() {
	if (this.$horzPool[this.$horzPrimary].length === 0) {
		this.$horzPrimary = (this.$horzPrimary + 1) % 2;
		if (this.$horzPool[this.$horzPrimary].length === 0) {
			this._initHorzPool();
		};
	};
	var adNum = Math.floor(Math.random() * this.$horzPool[this.$horzPrimary].length);
	return this.$horzPool[this.$horzPrimary].splice(adNum, 1)[0];
}