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

Expansion BlOomberg Markets

Content

Warnings

  1. Required Expansions mismatch between OXP Manifest and Expansion Manager at character position 0167 (DIGIT ZERO vs LATIN SMALL LETTER N)
  2. No version in dependency reference to oolite.oxp.phkb.MarketScriptInterface:null

Manifest

from Expansion Manager's OXP list from Expansion Manifest
Description Varies the in-game economy by generating random events that affect commodity prices. Depends on GNN. Varies the in-game economy by generating random events that affect commodity prices. Depends on GNN.
Identifier oolite.oxp.Ramirez.BlOombergMarkets oolite.oxp.Ramirez.BlOombergMarkets
Title BlOomberg Markets BlOomberg Markets
Category Mechanics Mechanics
Author Ramirez, Svengali, spara, phkb Ramirez, Svengali, spara, phkb
Version 2.9 2.9
Tags
Required Oolite Version
Maximum Oolite Version
Required Expansions
  • oolite.oxp.Svengali.GNN:1.0
  • oolite.oxp.phkb.MarketScriptInterface:0
  • oolite.oxp.Svengali.GNN:1.0
  • oolite.oxp.phkb.MarketScriptInterface:
  • Optional Expansions
    Conflict Expansions
    Information URL https://wiki.alioth.net/index.php/BlOomberg_Markets n/a
    Download URL https://wiki.alioth.net/img_auth.php/3/3f/BlOomberg_Markets_2.9.oxz n/a
    License CC BY-NC-SA 3 CC BY-NC-SA 3
    File Size n/a
    Upload date 1700441776

    Documentation

    Also read http://wiki.alioth.net/index.php/BlOomberg%20Markets

    BlOomberg Markets v2.6.2 Readme.rtf

    {\rtf1\ansi\deff3\adeflang1025
    {\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\fswiss\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\froman\fprq2\fcharset0 Verdana;}{\f6\froman\fprq2\fcharset0 Helvetica{\*\falt Arial};}{\f7\fnil\fprq2\fcharset0 Noto Sans CJK JP DemiLight;}{\f8\fnil\fprq2\fcharset0 FreeSans;}{\f9\fswiss\fprq0\fcharset128 FreeSans;}}
    {\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}
    {\stylesheet{\s0\snext0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038 Normal;}
    {\s15\sbasedon0\snext16\sb240\sa120\keepn\dbch\af7\dbch\af8\afs28\loch\f4\fs28 C\u237\'edmsor;}
    {\s16\sbasedon0\snext16\sl288\slmult1\sb0\sa140 Sz\u246\'f6vegt\u246\'f6rzs;}
    {\s17\sbasedon16\snext17\sl288\slmult1\sb0\sa140\dbch\af9 Lista;}
    {\s18\sbasedon0\snext18\sb120\sa120\noline\i\dbch\af9\afs24\ai\fs24 Felirat;}
    {\s19\sbasedon0\snext19\noline\dbch\af9 T\u225\'e1rgymutat\u243\'f3;}
    }{\*\generator LibreOffice/5.2.7.2$Linux_X86_64 LibreOffice_project/20m0$Build-2}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr2017\mo6\dy3\hr13\min51}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops}\deftab720
    
    {\*\pgdsctbl
    {\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Alap\u233\'e9rtelmezett st\u237\'edlus;}}
    \formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1800\margr1800\margt1440\margb1440\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
    {\*\ftnsep}\pgndec\pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\qc\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\b\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    BlOomberg Markets v2.6.}{\cf1\ulnone\ulc0\b\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    2}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\qc\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\qc\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    An OXP by Ramirez for Oolite }{\cf1\ul\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    v1.82}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\qc\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    This is the second version of BlOomberg Markets, and features integration with the Snoopers OXP news service along with use of the new mission screen handling features introduced in Oolite v1.74.  Further tweaks have been made for compatibility with javascript updates in Oolite v1.75. Changes to the market handling introduced in 1.82 raise the requirement to Oolite 1.82.}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ul\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    What it does}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    BlOomberg Markets creates random events that affect the commodity prices in specific systems.  Prices can go up or down, and it's up to the player to decide whether to take advantage of an event to maximise their profit.  }
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    If you have Snoopers installed, you'll receive any relevant financial information from time to time through the BlOomberg Markets news channel.  Events can last for up to around 20 days; while this is usually enough time to cross much of the galaxy, there's no guarantee that a player will be able to reach any given event.  While an event is ongoing, a note is added to the Ship's Manifest (F5) screen.  Events tend to occur every 30-40 days, so if an event doesn't look that attractive a player can hold out for another one later.  }
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Though the OXP has been designed to create fairly extreme price fluctuations, note that prices will still vary by economy type.  So, a reduction in the price of computers, for example, will result in very low prices in a Rich Industrial system (where computers are already fairly cheap) whereas the reduced prices in a Mainly Industrial system might still be quite high in comparison.  When an event occurs, it's therefore worth checking the exact economy type of a system in order to determine whether a potential deal is worth pursuing.  }
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\fs24\loch\f5\hich\af5
     }
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ul\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Future Developments}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    I've developed a mechanism to create rarer events that affect more than one system, e.g. all those with a particular government or ecomony type, but I'm still working on the actual events and the corresponding mission text.}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\fs24\loch\f5\hich\af5
     }
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ul\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Acknowledgements}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Commander McLane for the concept and event scenarios}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Captain Hesperus for some of the detailed mission text}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    The Snoopers team and Svengali in particular for help with the presentation and integration.}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ul\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Licence}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    As usual, this OXP is licensed under the Creative Commons Attribution Non-Commercial Share-Alike Licence v3.0, details of which are available }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f6\hich\af6
    .  This mean's you're}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    free to use to use bits of it however you want so long as you give attribution to the author, though I'd appreciate it if you let me know if you're going to do so.}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ul\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Version History}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    v2.6.2 03/06/2017 Fixed a % sign in missiontext.plist, thanks to gizmo.}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    v2.6.1 16/06/2016 A marker has been added to the chart for the market event. Small language corrections. -spara-}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    v2.6}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    24/06/2015 The oxp has been updated to work with Oolite v1.82. -spara-}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    v2.5}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    29/10/2011}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Script fixes to correct event resetting; added mission text for minerals variations}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    v2.4}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    04/03/2011}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Compatibility update for Oolite v1.75}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    v2.3}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    18/11/2010}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Minor change to prioritise BlOomberg messages and ensure market resets are reported properly}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    v2.2}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    26/07/2010}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Minor fixes to improve Snoopers integration}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    v2.1}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    17/06/2010}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Minor fixes to typos in mission text}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    v2.0}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    13/04/2010}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Snoopers integration and compatibility with Oolite v1.74}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    v1.0}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    30/01/2010}{\rtlch \ltrch\loch\loch\f5\hich\af5
    \tab }{\cf1\ulnone\ulc0\rtlch \ltrch\loch\fs24\loch\f5\hich\af5
    Initial release}
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch\loch\f5\hich\af5
    
    \par \pard\plain \s0\nowidctlpar\hyphpar0\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\hich\af3\fs24\lang1038\sl240\slmult1\nowidctlpar\li0\ri0\lin0\rin0\fi0\sb0\sa0\rtlch \ltrch\loch
    
    \par }

    readme.txt

    BlOomberg Markets v2.9
    An OXP by Ramirez for Oolite v1.82
    
    This is the second version of BlOomberg Markets, and features integration with the Snoopers OXP news service (now GNN) along with use of the new mission screen handling features introduced in Oolite v1.74.  Further tweaks have been made for compatibility with javascript updates in Oolite v1.75. Changes to the market handling introduced in 1.82 raise the requirement to Oolite 1.82.
    
    What it does
    ============
    BlOomberg Markets creates random events that affect the commodity prices in specific systems.  Prices can go up or down, and it's up to the player to decide whether to take advantage of an event to maximise their profit.  
    
    If you have GNN installed, you'll receive any relevant financial information from time to time through the BlOomberg Markets news channel.  Events can last for up to around 20 days; while this is usually enough time to cross much of the galaxy, there's no guarantee that a player will be able to reach any given event.  While an event is ongoing, a note is added to the Ship's Manifest (F5) screen.  Events tend to occur every 30-40 days, so if an event doesn't look that attractive a player can hold out for another one later.  
    
    Though the OXP has been designed to create fairly extreme price fluctuations, note that prices will still vary by economy type.  So, a reduction in the price of computers, for example, will result in very low prices in a Rich Industrial system (where computers are already fairly cheap) whereas the reduced prices in a Mainly Industrial system might still be quite high in comparison.  When an event occurs, it's therefore worth checking the exact economy type of a system in order to determine whether a potential deal is worth pursuing.  
     
    Future Developments
    ===================
    I've developed a mechanism to create rarer events that affect more than one system, e.g. all those with a particular government or ecomony type, but I'm still working on the actual events and the corresponding mission text.
     
    Acknowledgements
    ================
    Commander McLane for the concept and event scenarios
    Captain Hesperus for some of the detailed mission text
    The Snoopers/GNN team and Svengali in particular for help with the presentation and integration.
    
    Licence
    =======
    As usual, this OXP is licensed under the Creative Commons Attribution Non-Commercial Share-Alike Licence v3.0, details of which are available .  This mean's you're
    free to use to use bits of it however you want so long as you give attribution to the author, though I'd appreciate it if you let me know if you're going to do so.
    
    Version History
    ===============
    v2.9    20/11/2023 Improved robustness when applying market changes.
    v2.8    02/09/2023 Updated to work with MarketScriptInterface.oxp.
    v2.6.2 03/06/2017 Fixed a % sign in missiontext.plist, thanks to gizmo.
    v2.6.1 16/06/2016 A marker has been added to the chart for the market event. Small language corrections. -spara-
    v2.6	24/06/2015 The oxp has been updated to work with Oolite v1.82. -spara-
    v2.5	29/10/2011	Script fixes to correct event resetting; added mission text for minerals variations
    v2.4	04/03/2011	Compatibility update for Oolite v1.75
    v2.3	18/11/2010	Minor change to prioritise BlOomberg messages and ensure market resets are reported properly
    v2.2	26/07/2010	Minor fixes to improve Snoopers integration
    v2.1	17/06/2010	Minor fixes to typos in mission text
    v2.0	13/04/2010	Snoopers integration and compatibility with Oolite v1.74
    v1.0	30/01/2010	Initial release
    
    
    

    Equipment

    This expansion declares no equipment. This may be related to warnings.

    Ships

    This expansion declares no ships. This may be related to warnings.

    Models

    This expansion declares no models. This may be related to warnings.

    Scripts

    Path
    Config/script.js
    "use strict";
    this.name = "SE-main-script";
    this.author = "Ramirez & Svengali";
    this.copyright = "March 2011";
    this.description = "Special events for market prices";
    
    //2.8 updated to work with MarketScriptInterface.oxp
    //2.6.1 added system marker -spara-
    //2.6 fixed to work with Oolite 1.82 -spara-
    
    this.startUp = function () {
    	var harakiri = false;
    	// Check for GNN and react if not found...
    	if (!worldScripts.GNN) harakiri = true;
    	else if (!this.compareVersion(worldScripts.GNN.version, "1.0")) harakiri = true;
    	if (harakiri) {
    		player.consoleMessage("BlOomberg - Minimum GNN version (1.0) not detected. Disabling...", 10);
    		log(this.name, this.name + ': Minimum GNN version (1.0) not detected. Disabling all functionality in BlOomberg.');
    		for (prop in this) { if (prop !== 'name' && prop !== 'version') delete this[prop]; }
    		return;
    	}
    	delete this.compareVersion;
    	this.logging = false; // Must be false for release
    	this.checkShort = false; // Use short time check. Must be false for release
    	if (this.logging) this.getLog('Loaded:');
    
    	var msi = worldScripts.MarketScriptInterface_Main;
    	msi.$addMarketInterface("system_local", "$updateLocalCommodityDefinition", this.name);
    }
    
    this.clearVars = function () {
    	missionVariables.SE_commodity = null;
    	missionVariables.SE_deadline = null;
    	missionVariables.SE_deviation = null;
    	missionVariables.SE_economy_type = null;
    	missionVariables.SE_galaxy_number = null;
    	missionVariables.SE_missiontext_string = null;
    	missionVariables.SE_set = null;
    	missionVariables.SE_status = null;
    	missionVariables.SE_system_economy = null;
    	missionVariables.SE_system_ID = null;
    	missionVariables.SE_system_name = null;
    
    	//used in bloomberg_market.js -spara-
    	missionVariables.SE_market_key = null;
    
    	return;
    }
    
    this.compareVersion = function (strA, strB) {
    	var x = strA.split('.'), y = strB.split('.');
    	var xl = x.length, yl = y.length;
    	for (let i = 0; i < yl; i++) {
    		if (xl <= i) return (false);
    		if (parseInt(x[i]) > y[i]) break;
    		if (parseInt(x[i]) < y[i]) return (false);
    	}
    	return (true);
    }
    
    // Check if screens should be passed or event should be reset
    this.guiScreenChanged = function () {
    	if (player.ship.docked && guiScreen === "GUI_SCREEN_MARKET") this.prepareScreen();
    }
    
    this.shipExitedWitchspace = function () {
    	if (missionVariables.SE_status === "RUNNING" && clock.days > missionVariables.SE_deadline) this.prepareScreen();
    }
    
    this.shipWillEnterWitchspace = function (type) {
    	if (type === "galactic jump") this.resetSpecialEvent();
    }
    
    // Prepare screen for Snoopers
    this.prepareScreen = function () {
    	if (!missionVariables.SE_status) {
    		var event_delay = Math.floor(Math.random() * 10) + 20;
    		if (this.checkShort) missionVariables.SE_set = clock.days;
    		else missionVariables.SE_set = clock.days + event_delay;
    		missionVariables.SE_status = "SET";
    	}
    	if (this.logging) log(this.name, this.name + ': Set is:' + missionVariables.SE_set);
    	var obj = new Object();
    	if (missionVariables.SE_status === "RUNNING") {
    		if (this.logging) log(this.name, this.name + ': Deadline:' + missionVariables.SE_deadline);
    		if (clock.days >= missionVariables.SE_deadline) {
    			obj = { ID: this.name, Message: expandMissionText("SE_reset_event"), Pic: "SE-bloomberg.png", Music: "SE-stockmarket.ogg", Priority: 1 };
    			this.passScreen(obj, null);
    		}
    		return;
    	} else if (clock.days >= missionVariables.SE_set && missionVariables.SE_status === "SET") {
    		missionVariables.SE_system_ID = (Math.floor(Math.random() * 255));
    		missionVariables.SE_galaxy_number = galaxyNumber;
    		missionVariables.SE_system_name = System.systemNameForID([missionVariables.SE_system_ID]);
    		missionVariables.SE_system_economy = System.infoForSystem([missionVariables.SE_galaxy_number], [missionVariables.SE_system_ID]).economy;
    		if (missionVariables.SE_system_economy > 3) {
    			missionVariables.SE_economy_type = "agricultural";
    			missionVariables.SE_commodity = expandDescription("[SE_agricultural_commodity]");
    			missionVariables.SE_deviation = expandDescription("[SE_" + [missionVariables.SE_commodity] + "_" + [missionVariables.SE_economy_type] + "_" + "deviation" + "]");
    			missionVariables.SE_missiontext_string = "SE_" + [missionVariables.SE_commodity] + "_" + [missionVariables.SE_deviation];
    		} else {
    			missionVariables.SE_economy_type = "industrial";
    			missionVariables.SE_commodity = expandDescription("[SE_industrial_commodity]");
    			missionVariables.SE_deviation = expandDescription("[SE_" + [missionVariables.SE_commodity] + "_" + [missionVariables.SE_economy_type] + "_" + "deviation" + "]");
    			missionVariables.SE_missiontext_string = "SE_" + [missionVariables.SE_commodity] + "_" + [missionVariables.SE_deviation];
    		}
    		obj = { ID: this.name, Message: expandMissionText([missionVariables.SE_missiontext_string]), Pic: "SE-bloomberg.png", Music: "SE-stockmarket.ogg", Priority: 2 };
    		if (this.logging) log(this.name, JSON.stringify(obj));
    		this.passScreen(obj, 1);
    	} else if (this.logging) log(this.name, 'Delay.');
    	return;
    }
    
    // Pass the prepared object to GNN and set (or reset) variables
    this.passScreen = function (obj, mode) {
    	if (this.logging) this.getLog('Status prepared:');
    	// Pass the object and get errorcode back
    	var a = worldScripts.GNN._insertNews(obj);
    	if (!a) { // On success
    		if (mode) {
    			missionVariables.SE_status = "INJECTED"; // Set flag for inserted message
    		}
    		if (this.logging) log(this.name, this.name + ': Event passed. Status:' + missionVariables.SE_status);
    	} else {
    		if (a < 0) { // If CRC is still stored or buffers full, add 2 more days and try again
    			if (missionVariables.SE_status === "SET") missionVariables.SE_set = parseInt(missionVariables.SE_set) + 2;
    			if (missionVariables.SE_status === "RUNNING") missionVariables.SE_deadline = parseInt(missionVariables.SE_deadline) + 2;
    			return;
    		}
    		if (this.logging) log(this.name, 'GNN returned:' + a);
    		this.resetSpecialEvent(); // On failure reset everything...
    	}
    	if (this.logging) this.getLog('Status after insertion:');
    	return;
    }
    
    // Callback from GNN
    this.newsDisplayed = function (what) { worldScripts["SE-main-script"].newsReaction(what); return; }
    
    this.newsReaction = function (what) {
    	if (missionVariables.SE_galaxy_number !== null) {
    		if (missionVariables.SE_status === "INJECTED") {
    			missionVariables.SE_market_key = "SE-station-" + [missionVariables.SE_commodity] + "-" + [missionVariables.SE_deviation];
    
    			var mi = expandMissionText("SE_market_information");
    			if (this.logging) log(this.name, "Mission: " + mi);
    			mission.setInstructions(mi, this.name);
    			mission.markSystem({
    				system: missionVariables.SE_system_ID,
    				name: this.name,
    				markerColor: "blueColor",
    				markerShape: "MARKER_DIAMOND"
    			});
    			var event_duration = Math.floor(Math.random() * 8) + 12;
    			if (this.checkShort) missionVariables.SE_deadline = clock.days + 1;
    			else missionVariables.SE_deadline = clock.days + event_duration;
    			missionVariables.SE_status = "RUNNING";
    			if (this.logging) log(this.name, this.name + ': Event set. Duration until:' + missionVariables.SE_deadline);
    		} else if (missionVariables.SE_status === "RUNNING") this.resetSpecialEvent();
    	}
    	if (this.logging) this.getLog('Status after display:');
    	return;
    }
    
    this.resetSpecialEvent = function () {
    	// Can be undefined if status=SET but not yet displayed
    	if (missionVariables.SE_set && missionVariables.SE_galaxy_number !== null) {
    		mission.unmarkSystem({ system: missionVariables.SE_system_ID, name: this.name });
    	}
    	mission.setInstructions(null, this.name);
    	this.clearVars();
    	if (this.logging) this.getLog('Status after cleaning:');
    	return;
    }
    
    this.getLog = function (m) {
    	log(this.name, m);
    	for (let prop in missionVariables) { if (prop.substring(0, 2) === 'SE_') log(this.name, "mV[" + prop + "] : " + missionVariables[prop]); }
    	return;
    }
    
    this.$commodity_lookup = {
    	"Alloys": "alloys",
    	"Computers": "computers",
    	"Firearms": "firearms",
    	"Food": "food",
    	"Furs": "furs",
    	"Gem-stones": "gem_stones",
    	"Gold": "gold",
    	"Liquor/Wines": "liquor_wines",
    	"Minerals": "minerals",
    	"Narcotics": "narcotics",
    	"Platinum": "platinum",
    	"Radioactives": "radioactives",
    	"Slaves": "slaves",
    	"Textiles": "textiles"
    };
    
    this.$originalDefs = {
    	"SE-station-Alloys-decrease" : {
    		"alloys" : [0,0,42,1,1,17,31,31,0]
    	},
    	"SE-station-Alloys-increase" : {
    		"alloys" : [0,0,150,1,1,17,31,31,0]
    	},
    	"SE-station-Computers-decrease" : {
    		"computers" : [0,0,60,14,14,56,3,3,0]
    	},
    	"SE-station-Computers-increase" : {
    		"computers" : [0,0,200,14,14,56,3,3,0]
    	},
    	"SE-station-Firearms-decrease" : {
    		"firearms" : [0,0,10,13,1,60,7,3,0]
    	},
    	"SE-station-Firearms-increase" : {
    		"firearms" : [0,0,155,13,10,50,7,7,0]
    	},
    	"SE-station-Food-decrease" : {
    		"food" : [0,0,12,-1,2,25,1,1,0]
    	},
    	"SE-station-Furs-decrease" : {
    		"furs" : [0,0,100,-9,-9,220,63,63,0]
    	},
    	"SE-station-Furs-increase" : {
    		"furs" : [0,0,220,-9,-9,240,10,63,0]
    	},
    	"SE-station-Gem-stones-decrease" : {
    		"gem_stones" : [0,0,25,-1,-1,250,15,15,2]
    	},
    	"SE-station-Gem-stones-increase" : {
    		"gem_stones" : [0,0,90,-1,-1,250,15,15,2]
    	},
    	"SE-station-Gold-decrease" : {
    		"gold" : [0,0,40,-1,-1,66,7,7,1]
    	},
    	"SE-station-Gold-increase" : {
    		"gold" : [0,0,190,-1,-1,66,7,7,1]
    	},
    	"SE-station-Liquor/Wines-decrease" : {
    		"liquor_wines" : [0,0,64,-5,-5,251,15,15,0]
    	},
    	"SE-station-Liquor/Wines-increase" : {
    		"liquor_wines" : [0,0,180,-5,-5,251,15,15,0]
    	},
    	"SE-station-Minerals-decrease" : {
    		"minerals" : [0,0,10,-1,-1,53,3,3,0]
    	},
    	"SE-station-Minerals-increase" : {
    		"minerals" : [0,0,135,-1,-1,53,3,3,0]
    	},
    	"SE-station-Narcotics-decrease" : {
    		"narcotics" : [0,0,10,5,5,40,20,5,0]
    	},
    	"SE-station-Platinum-decrease" : {
    		"platinum" : [0,0,80,-2,-2,55,31,31,1]
    	},
    	"SE-station-Platinum-increase" : {
    		"platinum" : [0,0,220,-2,-2,55,31,31,1]
    	},
    	"SE-station-Radioactives-decrease" : {
    		"radioactives" : [0,0,20,-3,-3,80,7,7,0]
    	},
    	"SE-station-Radioactives-increase" : {
    		"radioactives" : [0,0,150,-3,-3,2,7,7,0]
    	},
    	"SE-station-Slaves-decrease" : {
    		"slaves" : [0,0,40,-5,-5,20,31,31,0]
    	},
    	"SE-station-Slaves-increase" : {
    		"slaves" : [0,0,230,-5,-5,226,31,31,0]
    	},
    	"SE-station-Textiles-decrease" : {
    		"textiles" : [0,0,5,-1,-1,10,3,3,0]
    	},
    	"SE-station-Textiles-increase" : {
    		"textiles" : [0,0,100,-1,-1,10,3,3,0]
    	}
    };
    
    this.$updateLocalCommodityDefinition = function(goodDefinition, station, systemID) {
    	// even though defined at the system level, this will only apply to one system - wherever the event is taking place
    	if (systemID && 
    		galaxyNumber == missionVariables.SE_galaxy_number && 
    		systemID == missionVariables.SE_system_ID && 
    		goodDefinition.key == this.$commodity_lookup[missionVariables.SE_commodity]) {
    			
    		// if we got here, we are doing an update. make sure the key is setup.
    		if (!missionVariables.SE_market_key) {
    			missionVariables.SE_market_key = "SE-station-" + [missionVariables.SE_commodity] + "-" + [missionVariables.SE_deviation];
    		}
    		var commodity = goodDefinition.key;
    		//mission variable is set in the main script
    		var oldDefs = this.$originalDefs[missionVariables.SE_market_key][commodity];
    
    		//old style definition found for the good. calculate it the old way
    		//only the price is changed
    		if (oldDefs) {
    			var market_base_price = oldDefs[2];
    			var market_eco_adjust_price = oldDefs[3];
    			var market_mask_price = oldDefs[6];
    			var market_rnd = Math.floor(Math.random() * 256);
    
    			var economy = system.economy;
    			
    			var price = (market_base_price + (market_rnd & market_mask_price) + (economy * market_eco_adjust_price)) & 255;
    			price *= 0.4;
    
    			goodDefinition.price = price * 10;
    		}
    	}
    	return goodDefinition;
    };