Back to Index Page generated: Dec 20, 2024, 7:22:10 AM

Expansion Random Hits

Content

Manifest

from Expansion Manager's OXP list from Expansion Manifest
Description Random Hits adds seedy Space Bars to anarchy systems that offer large bounties on the galaxy's Most Wanted Criminals. This oxp adds Missions, Ships, Stations and Features. Random Hits adds seedy Space Bars to anarchy systems that offer large bounties on the galaxy's Most Wanted Criminals. This oxp adds Missions, Ships, Stations and Features.
Identifier oolite.oxp.spara.random_hits oolite.oxp.spara.random_hits
Title Random Hits Random Hits
Category Missions Missions
Author Eric Walch, Little Bear, spara and contributors Eric Walch, Little Bear, spara and contributors
Version 1.11.5 1.11.5
Tags
Required Oolite Version
Maximum Oolite Version
Required Expansions
Optional Expansions
Conflict Expansions
Information URL http://wiki.alioth.net/index.php/Random_Hits_OXP n/a
Download URL https://wiki.alioth.net/img_auth.php/9/9e/Random_hits_1.11.5.oxz n/a
License CC-BY-NC-SA 4.0 CC-BY-NC-SA 4.0
File Size n/a
Upload date 1610873394

Documentation

Also read http://wiki.alioth.net/index.php/Random%20Hits

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\froman\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\froman\fprq2\fcharset0 Times New Roman;}{\f6\froman\fprq2\fcharset0 Symbol;}{\f7\fnil\fprq2\fcharset0 FreeSans;}{\f8\fnil\fprq2\fcharset0 Times New Roman;}{\f9\fnil\fprq2\fcharset0 Symbol;}{\f10\fnil\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}}
{\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\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033 Normal;}
{\s15\sbasedon0\snext16\ql\nowidctlpar\hyphpar0\sb240\sa120\keepn\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f4\fs28 Heading;}
{\s16\sbasedon0\snext16\sl288\slmult1\ql\nowidctlpar\hyphpar0\sb0\sa140\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24 Text Body;}
{\s17\sbasedon16\snext17\sl288\slmult1\ql\nowidctlpar\hyphpar0\sb0\sa140\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24 List;}
{\s18\sbasedon0\snext18\ql\nowidctlpar\hyphpar0\sb120\sa120\ltrpar\cf1\i\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24 Caption;}
{\s19\sbasedon0\snext19\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24 Index;}
}{\*\generator LibreOffice/5.2.7.2$Linux_X86_64 LibreOffice_project/20m0$Build-2}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr2018\mo10\dy28\hr17\min38}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops}\deftab720
\hyphauto0\viewscale100
{\*\pgdsctbl
{\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Default Style;}}
\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\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Random Hits OXP}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.11.}{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
5}{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
 28}{\super\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
th}{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
 August 2018}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* }{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Fixed an integer bug when spawning angry relatives by capping the maximum number of  angry relative to 64.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\rtlch \ltrch\loch

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.11.4 28}{\super\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
th}{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
 August 2018}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed an escape_pod bug on Vampire. Bug spotted and fixed by Rustem.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.11.2-1.11.3 20}{\super\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
th}{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
 June 2017}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed a missionVariable bug in big boss expansions.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Added and updated missionscreen IDs.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.11.1 7}{\super\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
th}{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
 December 2015}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed the behavior when player scoops the escape pod and then jettisons it.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.11 12}{\super\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
th}{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
 September 2015}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Staer9 and Sb-faves shipsets have been cut out from the oxp to reduce size. If they are present as standalone oxps they will be used in RH missions.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Resources pack integrated back to the oxp.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed escort circulation bug in GalTech escort fighter}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.10.3 21th March 2015}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed non-working [clock_days_number] to clock.days.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\ab0\rtlch \ltrch\loch\lang2057

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.10.2 20th February 2015}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed the rank system to work as it most likely was meant to work.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.10.1 18th February 2015}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Corrected a typo from descriptions.plist}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Hopefully fixed revenge description expansion bug}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Use short ship name instead of long name in mission instructions when string too wide}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.10 17th February 2015}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* View long range map in mission offer screens}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed escorts to escort_roles and added some variation to the number of escorts}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* pirate-victim-roles.plist changed to role-categories.plist}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.9.10 26th January 2015}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Mission screens remember entity personality}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fuel up when launching to fight bosses, thargoids or thieves}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* In Oolite 1.81 market capacity is limited to 15 units.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.9.9 8th January 2015}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed Arachnid materials bug.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.9.8 15th December 2014}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Market script for Oolite 1.81 tweaked to be more adaptive.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\ab0\rtlch \ltrch\loch\lang2057

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.9.7 2nd December 2014}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Market works in Oolite 1.81}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* SuperCobra update by CaptSolo}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Drake update by CaptSolo}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* KW shader fix}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Shipdata cleaned of Oolite 1.81 standards warnings}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\ab0\rtlch \ltrch\loch\lang2057

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.9.6 13th August 2014}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed a rare revenge description error.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.9.3-1.9.4 6th August 2014}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed a couple of \u8220\'93mission_random_hits_store_mark_ship\u8221\'94s to  mission_random_hits_store_mark_ship_name from descriptions.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed a rare deathcause error.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.9.2 5th August 2014}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Ambiance ships separated from the oxp to their own oxp.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* SkilledNPCs  support disabled by default.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.9.1 20th July 2014}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed a forgotten external_dependency flag that was throwing errors to the log.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.9 18th July 2014.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Ship handling is now more dynamic and it's possible to use like_shipping. As a test, sb-faves has been removed from the oxp and works now as an external dependency. Reduces the size of the resources by 5 MBs. }
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.8.2 5th July 2014.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Added weapons_auto to shipset ambiance ships}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed diffuse_map bug when no shaders are present}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.8.1 14th May 2014.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Bulletin is available on load from bar}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Removed offers when docking at the station}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.8 11th May 2014.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* 1.79 populator used where possible. Saving at Space Bar is possible.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Redefined shipset roles for 1.79}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.7.1 22th January 2014.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed a bug in mark naming when random shipnames oxp is not present.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Removed attack drone missile from RH ships in core roles.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.7 12th January 2014.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Added support for Random Shipnames oxp. Mark ships are now named with it, if oxp is present. Naming scheme of other ships has been tuned further to better match the oxp.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Added small possibility to meet RH ships and Bosses in core game roles. These ships, except bosses are somewhat toned down (no aft weapons of energy bombs) variants of their RH counterparts.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Added Griffin Mk 1 by Griff.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Updated Wolf Mk 2 and Gnat.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Mark level 2 ships have been toned down a bit (by reducing the number of escorts) to compensate changes in the core game.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Applied language fixes by Keeper to the descriptions.plist}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Various minor bugfixes.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.6  8th October 2013.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Applied plist fix by Commander McLane.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Applied AI fix by Eric Walch.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Updated ships from Staer9's shipset. Updates by Keeper.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Ophidian updated to Griff's model}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Added four new ships: Gnat and Bug by Griff, Arachnid Mark 1 by Shipbuilder and Monitor Mark II by Staer9/Keeper.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.5.4  24th September 2013.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Fixed a bug with station a validator}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.5.3  16th August 2013.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Upped Oolite version requirement to 1.77.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Several minor bugfixes.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Changed all ships' display_name style to look like Random Shipnames oxp's style.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* All ships have been either updated to a newer higher detail model or substituted with a newer high detail ship with about the same specs. A few new ships have been added to the mix to bring more variety. Models, materials, shaders and textures are from Adck, Captain Beatnik, CaptSolo, Dr. Nil, Griff, KillerWolf, Paradox, Shipbuilder, Simon B, Smivs and Staer9.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Added support for Skilled NPCs oxp. Support is added with a shipdata-overrides file so it can be disabled by removing the file.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Added support for Station Validator oxp.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Added a tunnel texture for Space Bar to be used with BGS oxp. Texture by Spara.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Rock texture of Space Bar and surroundings has been updated to a higher detail texture, normal map is added and custom shader is defined. Texture, normal map and shader are from Griff's All-in-1 Shipset.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.18  15th Januar 2013.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Fixed a bug with the revenge_name. Fixed an expansion bug introduced in version 1.4.17 that completely broke the welcome message and even crashed Oolite on a mac. Only with Oolite 1.76 though, only cosmetic problems with Oolite 1.77.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.17   6th Januar 2013.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Renamed all models an textures to unique names. Fixed two more string expansions that go wrong with Oolite 1.77}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.16   17th October 2012.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Fixed some more wrong string definitions that were always there but will log errors after Oolite 1.76.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.15   10th October 2012.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Fixed some wrong string definitions that were always there but will log errors after Oolite 1.76. Mission destinations will have their own colour in Oolite 1.77. In 1.77 it will be possible to enter the mission screen again at the new interface page. (F4)}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.14   20th September 2012.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Fixed a bug with the Hopper exhaust plume and a bug introduced in 1.4.13 when having two revenge ships. Fixed interlacing of  the Imp Courier.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.13   23th June 2012.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Fixed a bug with inconsistent gender in messages that could appear on the 4th or higher mission page.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.12   12th November 2011.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Reinstalled the fix for bad randomness that was not used with Oolite 1.75. But randomness is still bad in 1.75}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.11   3th July 2011.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Removed a bug were mission selection could fail near an isolated system. (= System not connected to the other systems). It worked with 1.74, but since 1.75 this can generate an error, resulting in the player seeing the message: 'slow computer'.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\lang2057\loch\f5\hich\af5
 }
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.10   21th March 2011.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Rearranged the code for mission generation. Is significant faster now for better avoiding the "slow computer" message on some systems. Starting with Oolite 1.75.2 there will be more time for JS code on docking, making this message even more rare on slower computers.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.9   4th March 2011.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Corrected a "slow computer" warning after having docked as an offender at a spacebar.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.8   20th February 2011.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to work correctly with Oolite 1.75.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.6   14th January 2011.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Missions were not renewed without loading a game. (Bug introduced in version 1.4.3). Mission description was often the same for a certain system. Better randomized now. Fixed a bug in the JS script that is ignored by Oolite 1.74 but will generate errors with 1.75.1. Changed commodity pricing in the bars as suggested by Switeck.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.5   18th September 2010.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
When the player killed a clean spacebar guard ship, he got a undefined bounty on his head that could be extremely high. (Up to several millions.) fixed now.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.4   7th August 2010.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Forgot to remove the mark from the system with the new "cancel" option from version 1.4.1.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.3   18th July 2010.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Added improved shaders for some cards that had problems with the old shaders. Added an option to show extra hit missions on faster computers. 3 is default but 6 or 9 pages could be possible on very fast computers. }
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4.1   2nd July 2010.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Added a option to cancel a running mission. Flattened the hopper, so it physical fits the docking port.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.4   27th June 2010.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
First full release of the JS version of this oxp. Added two new missions. Added a distance to mark system in the mission offer. And many other small changes that were made possible by Oolite 1.74.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.3.8  May/June 2010.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
The main code is completely rewritten in Java Script with the use of some special features of Oolite 1.74. The bar and its surrounding ships have no longer a significant influence on overall performances in anarchy systems. This version is only released as a limited test version in different revisions.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.3.7 unreleased.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.3.6 5th August 2009.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
The previous version of Random Hits contained a character in its descriptions.plist file, which is valid on Vista, but not on the Mac. This update fixes this (thanks to Eric Walch for finding the needle in the haystack!). If you found that all the Bulletin Boards and other OXP messages came out as gobbley-gook when you tried to play 1.3.5 then you should update to this version. No other new features are added by 1.3.6, so if 1.3.5 worked fine for you, then there is no need to update.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
(For the new features added in 1.3.5 Beta please see the \u8216\'91Spoilers\u8217\'92 Document)}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Updated to 1.3.5 Beta on 5/6/09}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
OXP Script / MissionText / Shipdata / AIs / Code & Words for the Random Generator by "LittleBear". Guest Ships by Murgh, Wolfwood, Giles, Ramon, Selezen, 8bitapocalypse, CyberTiger and Dr. Nil. Seedy Space Bar by Griff. Graphics and shaders for the neon signs by Arexack Heretic. Additional Contributions to the Words Data Base from Commander Maegil, Disembodied, Dr Nil, Arexack Heretic Ahruman and Commander McLane.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Thanks in particular to Eric Walch, Another Commander, Sevngali and Kaks for a lot of help with debugging Versions 1.1 and Versions 1.0, improvements to the AIs and help with Java Scripting.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Random Hits is an Add On for Oolite by Giles Williams, based on "Elite" by Ian Bell and David Braben. Do what you like with the code in the OXP as long as you don't sell it or charge for it. If you do use any of the code in your own OXP, could you let me know by PM so I can take it into account in future versions and please remember to rename your version something else, so the two OXPs don't clash!}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
This OXP }{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
requires Version 1.75 of Oolite or higher}{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
. If you install it on a lower version of Oolite then it won\u8217\'92t do anything at all. You do not however need a powerful system to play. If your system cannot support shaders, then these additional features are automatically turned off. If your system does support shaders you will see an animated neon sign adorning the space bars you encounter. If not, then the sign is left blank. This pack adds Missions, Ships, Stations and Features.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
NB : Although this OXP uses ships from other OXPs, you do not need to install any other OXPs to play it, as all the models and textures necessary to run them are included in the Random Hits OXP pack. The Random Hits OXP does not add any ships to the Ooniverse generally (apart from the space bars). All the special ships in this OXP only appear when a mission relating to a Character who happens to be flying one of them is running.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
List of Updates from Version 1.1}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Please Note version 1.2 of Random Hits now requires version 1.71 (or higher) of Oolite. It will not run properly on a lower version (including 1.70). This new version takes account of several command name charges between Version 1.70 and Version 1.71 of Oolite. It will now run properly on Version V1.71 and higher. Changes :-}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab All instances of \u8220\'93system.legacy_spawn\u8221\'94 changed to \u8220\'93this.ship.spawn\u8221\'94.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab All instances of \u8220\'93this.beingAttacked\u8221\'94 changed to \u8220\'93this.shipBeingAttacked\u8221\'94.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab All instances of \u8220\'93scriptActionOnTarget\u8221\'94 changed to \u8220\'93safeScriptActionOnTarget\u8221\'94.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab Descriptions commented out from Java Scripts.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab Space Bars now have Station Scan Class (i.e. they show as green on the scanner).}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab Couple of tweaks to the AIs.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab A few more typos, grammar errors and spelling mistakes fixed.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
List of Updates from Version 1.0:-}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab Bug with Characters in Asp Explorers not appearing fixed.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab Bug with clones of dead Characters sometimes appearing fixed.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab Java Script added to check who killed or scooped Characters.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab Problem with low frame rate whist fighting a Character fixed.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab A lot of recursion bugs in the AIs fixed.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab Requires.plist added (ie the OXP won\u8217\'92t run on a version lower than 1.71)}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab Prices of goods at a Bar will now not be quite the same as the prices of goods at the Main Station, some being cheaper or having greater quantities in stock, some will be more expensive or have less in stock. }
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab More depth added to the random generator (5,000 extra words added).}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab Some Characters now have escorts and henchmen.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab Space Bars are now armed with Plasma Turrets.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
-\tab The Rank held by an NPC bounty hunter is now shown in brackets after the name of his ship when targeted with the Identification Computer.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ul\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Overview}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
The Ooniverse can be a lawless place with all manor of beings on the run for hideous crimes from simple piracy to committing the most unspeakable acts with edible poets. GalCop\u8217\'92s resources are frequently stretched thinly and thus the Galactic Authorities often rely upon private individuals to bring criminals to justice. }
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
In the space lanes of Anarchy Systems throughout the eight Galaxies, professional hunters gather aboard speedy space bars. Over a pint of fabled Riedquatian brown ale and a side-order of fried Laveian tree grubs, Commanders may view the local Bounty Hunters\u8217\'92 Bulletin Boards. Do you have what it takes to capture an unpleasant blue-feathered avian wanted for committing unnatural acts with a long-eared frog? Will your combat skills be good enough to destroy the dastardly fiend who set fire to the Onriraian Pontiff\u8217\'92s priceless artificial leg?}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ul\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Difficulty Rating}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
"Easy to Hard". The OXP does not add any new ships to the game generally; all ships only appear when a mission relating to a Character is running. Even a Harmless Jameson can safely install the OXP, as the space bars do not present a threat to Clean Commanders. Indeed, if you are passing a space bar and come under attack by pirates, hunters aboard the Bar are likely to put down their drinks and launch to eliminate the brigands. Remember though that these guys are mercenaries not cops. If you are being harassed by three \u8216\'91Offender\u8217\'92 pirates, the hunters may well decide to collect the larger bounty on a passing non-hostile \u8216\'91Fugitive\u8217\'92 slave trader before coming to your aid! Approaching a space bar if you yourself have a price on your head could prove extremely hazardous to your health.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Missions vary in difficulty, depending on the Credits being offered for a successful kill or capture. None of the ships in the OXP are uber; if a Character is flying a Cobra Mk III then his ship is just the standard Cowell & McRath model available in all good shipyards. The equipment fitted to a Character\u8217\'92s ship will vary.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
A scheming horned solicitor wanted for tax evasion may only have equipped his craft with the most basic equipment. On the other hand a homicidal blood-sucking goat, suspected of industrial espionage against Voltaire Stinger Pulse Drives Limited, will be likely to have blinged her vessel out as a fully equipped iron ass.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Whilst any Commander is welcome to view the Bulletin Boards and offer his services for a mission, the advertisers are looking for a skilled liquidator and will refuse the offer if the applicant has too few kills to his name. You need more kills to be accepted for the difficult missions than the easier missions, so you will find that you can\u8217\'92t bite off more than you can chew. It is advisable though to have a reasonably well equipped ship before taking on any of these missions. An E.C.M. System, Witch fuel injectors and a Beam Laser or better should be regarded as the minimum kit necessary for a would-be bounty hunter. If you intend to take any of your victims alive rather than killing them outright, Fuel Scoops will be necessary in order to scoop up the rotter\u8217\'92s escape craft.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ul\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Main Features}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Every Bulletin Board entry, mission description, incoming message, communications hail and mission briefing screen is procedurally generated using a similar method to that used to create all the crazy planet descriptions in Oolite.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
The messages are created using a database of over 30,000 words, generating over one trillion different missions and bulletin board entries. The missions are therefore effectively never-ending, rather like the Bulletin Board in Frontier. Every time you visit a space bar a new set of bulletin board messages are generated. Due to the way Oolite\u8217\'92s 'dice' work though, new missions are usually generated when you enter a system from hyperspace. For example if you jump from Lave to Riedquat and dock at the Worlds End Bar, a new set of Bulletin Board entries will be displayed. If you launch, flip over and re-dock, the missions will generally be the same as the ones you have just seen. This is not always the case though and sometimes the missions will change whilst you are browsing the boards. Jumping out of the system and returning later will always cause a new set of missions to be generated. }
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
I have included in the database all the words from Classic Elite (so watch out for killer arts graduates, lesser spotted yaks and so on), but I have also added to the call list a lot of other references to the Elite series of games. Procedurally generated organizations and companies also feature in the OXP and the names of the Characters include the names of most of the regular posters on the Oolite Bulletin Boards. If you are a poster on the real life Oolite Bulletin Boards, you may find a contract on your own life being advertised here! }
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Characters will use tactics not used by typical pirates. They may have (and use) Q-Mines and aft mounted weapons. Don\u8217\'92t expect them to always fight to the death, they may just run away on injectors or make a hyperspace jump, requiring you to pursue them through the wormhole. You are being paid to terminate the scoundrel not merely his ship, so if your victim manages to abandon ship in an escape pod, you must kill or capture the pod to complete the mission. }
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Don\u8217\'92t expect to catch a ruffian napping with a Q-Mine, most are smart enough to hit the injectors as soon as one is launched. Although you can complete a mission by using an Energy Bomb (or whilst cloaked like a cowardly custard), you will be fined for using such dishonorable tactics and you will not earn any titles or improve your reputation as a bounty hunter by resorting to such low-spirited means!}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* A Space Bar with its own individual name is added to every Anarchy System.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Over one trillion different missions and Bulletin Board advertisements.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Any given mission will have at least eight different endings.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* A Statute Book of over 20,000 different crimes and misdemeanors.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Over 10,000 different Companies, Organizations and Powers.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* A cast of over one million different Characters from over 7,000 different species.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Characters fly over 50 types of space craft.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Over 5,000 new hails and messages.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Employers keep in contact with the player by Galactic E-Mail.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* New AIs, using tricks not included in the unexpanded game.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* New and customized escape craft.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Titles and Ranks to be won.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
* Hidden features and easter eggs.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ul\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Bug Reporting}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
If you find a bug could you tell me:-}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af9\rtlch \ltrch\lang2057\loch\f6\hich\af6
\u8226\'95}{\ulnone\ulc0\b0\dbch\af9\rtlch \ltrch\loch\lang2057\loch\f6\hich\af6
\tab }{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
If a bug happened at a space bar, the name of the Bar and the system in which it was.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af9\rtlch \ltrch\lang2057\loch\f6\hich\af6
\u8226\'95}{\ulnone\ulc0\b0\dbch\af9\rtlch \ltrch\loch\lang2057\loch\f6\hich\af6
\tab }{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
If a bug happened when you were chasing a victim, his name, the ship he was flying and the System where he was (or should be).}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi-360\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\tx-720\hyphpar0\li-360\ri-5\lin-360\rin-5\fi-360{\ulnone\ulc0\b0\dbch\af9\rtlch \ltrch\lang2057\loch\f6\hich\af6
\u8226\'95}{\ulnone\ulc0\b0\dbch\af9\rtlch \ltrch\loch\lang2057\loch\f6\hich\af6
\tab }{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
 If a bug happened when you were trying to scoop or kill his pod, the type of pod he ejected in.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
As there are literally trillions of missions running in all 8 galaxies, I really will need to know this in order to find a bug. I think they\u8217\'92re all squashed by V1.1, but just in case!}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ul\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Installing and Playing}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
To play the OXP, unzip the download file. This will create a folder called "RandomHitsV1_2". Open this folder and you will see a folder named "RandomHits.oxp" and this readme. Move the RandomHits.oxp folder to Oolite's AddOns folder.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
If you are updating from Version 1.1, just move the new RandomHits.oxp folder in the usual way and overwrite the old version. }{\ulnone\ulc0\b\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Remember to hold down the SHIFT key}{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
 whilst Oolite loads up for the first time after updating. You need to do this so that Oolite updates its cache. If you don\u8217\'92t do it, Oolite will continue to use the code from the OLD version of Random Hits and so you won\u8217\'92t get the benefit of the updates!}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
You are now ready to play, so slip an Ingram hand laser into your shoulder holster and set your course for the nearest Anarchy System. Upon entering the system set your Advanced Space Compass to \u8216\'91B\u8217\'92 in order to locate the local space bar.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
If you do not have an Advanced Space Compass, not to worry, the bars are constructed inside large hollowed out asteroids amongst fair sized clusters. Set your course for the planet and keep your eyes open.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Before you get too near the bar, remember to check your Legal Status. Once you come within 25 kilometers, the Bar\u8217\'92s Sentinel Satellites will perform an automatic scan of your legal records. You don\u8217\'92t want to be within striking range of the bar if you are anything less than squeaky clean! }
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Target the Bar with your Identification Computer and either turn the docking over to the auto-pilot or dock manually. Upon docking, check that your hand weapon is fully charged (these places can be a little rough) and head for the bar area. Try not to give yourself away as a newcomer by ogling the furry feline pole dancers and take care not to spill the pint of}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
the large amour-clad treeoid standing next to you.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Order yourself a shot of Geteveian evil brew and log in to the Bulletin Board. You are free to browse through all advertisements before deciding which, if any, you wish to offer your}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
services. If none take your fancy, log off and pay your bar bill.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
If you offer your services for an assignment you will receive a reply from the poster of the advertisement. Assuming your offer was accepted, the mission details will be stored on your Status Screen and your destination will be marked on the local Galactic Chart. Once a mission is accepted, the unique transponder code of your victim will be downloaded to your}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
onboard computer, allowing you to identify your mark. When a mark is targeted with an ID computer the fact that he is marked for death is shown in brackets by the name of his ship. Eg:- "Cobra Mk III (Contract Target)". This ensures you won't accidentally shoot down the wrong ship!}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
The missions offered by the OXP are compatible with all other missions in Oolite, so you can, if you wish, play missions from Random Hits at the same time as other missions. For example, if you are trekking across the Galaxy to deliver a package for the U.P.S. Courier Company, feel free to stop by a space bar and see whether you can eliminate a bandit or two}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
on the way. If you accept a mission and leave the Galaxy in which it was offered, the mission will be abandoned. There is no penalty for doing so and you will be able to take a new assignment in the new Galaxy.}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
Good Luck with your career as a bounty hunter and remember, lets be careful out there\u8230\'85}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0\ulnone\ulc0\dbch\af8\ab0\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5

\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0\li0\ri-5\lin0\rin-5\fi0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
LittleBear}
\par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf1\kerning1\dbch\af7\langfe1081\dbch\af10\afs24\alang1033\loch\f3\fs24\lang1033\sl240\slmult1\nowidctlpar\hyphpar0{\ulnone\ulc0\b0\dbch\af8\rtlch \ltrch\loch\lang2057\loch\f5\hich\af5
29th April 200}
\par }

Shaders/griff_readme.txt

Updated files for Random Hits 1.4.3

List of Changes
---------------

Config folder:-
shipdata.plist - updated shader definitions on the 'griff_...' objects to include Texture uniforms required for Oolite 1.74 and up. Added Materials to the spacebar object to enable illumination maps whilst in playing Oolite with shaders disabled (requires Oolite 1.74 and higher)

Models folder:-
griff_spacebar_ah_sign.dat - default texture reference updated to "A_H_wormhole_animation_no_shader.png"
griff_spacebar_turret_gun.dat - edited the model slightly so it would work with the recoil effect in the new "griff_spacebar_turret.vertex" shader


Shaders folder:-
Edited most of the fragment & vertex shaders to remove the use of gl_TexCoord[0] which can be problematic with certain ATI driver releases, added a new shader "griff_spacebar_turret.vertex" for the space bar turrect so they will recoil slightly when firing whilst playing with shaders enabled


Textures folder:-
"A_H_wormhole_animation_no_shader.png" - New texture based on a single frame from A_H's original artwork, for use when playing Oolite with shaders disabled

Griff

Equipment

Name Visible Cost [deci-credits] Tech-Level
random hits attackworm yes 500 101+
random hits mining pod yes 500 101+

Ships

Name
griff_1_pipe
griff_4_pipe
griff_rock1
griff_rock2
griff_rock3
griff_rock4
Neonsign
Backsection
entrydock
entrysection
pipe
Platform
Rock
solarpanel
Error: Sub-Entry in the wrong role!
Turret Barrel
griff_spacebar_turret_gun2
griff_spacebar_turret_gun3
griff_spacebar_turret_gun4
griff_spacebar_turret_gun5
griff_spacebar_turret_gun6
griff_spacebar_turret_gun7
griff_spacebar_turret_gun8
griff_spacebar_turret_gun9
Turret Base
processor1_fourpipe_rock2
processor1_fourpipe_rock3
processor1_fourpipe_rock4
GalMine AutoMiner
processor1_nopipe_rock2
processor1_nopipe_rock3
processor1_nopipe_rock4
processor1_onepipe_rock2
processor1_onepipe_rock3
processor1_onepipe_rock4
processor2_rock1
processor2_rock2
processor2_rock3
processor2_rock4
processor3_rock1
processor3_rock2
processor3_rock3
processor3_rock4
Worm Attack Drone
random_hits_big_boss_cobra4
random_hits_big_boss_cobra4_spacelane
random_hits_big_boss_fighter_adder
random_hits_big_boss_fighter_aphid
random_hits_big_boss_fighter_arachnid
random_hits_big_boss_fighter_asp
random_hits_big_boss_fighter_aspmk1
random_hits_big_boss_fighter_attackworm
random_hits_big_boss_fighter_attackworm2
random_hits_big_boss_fighter_bug
random_hits_big_boss_fighter_bushmaster
random_hits_big_boss_fighter_cat
random_hits_big_boss_fighter_chameleon
random_hits_big_boss_fighter_cobra1
random_hits_big_boss_fighter_cobra2
random_hits_big_boss_fighter_cobra2x
random_hits_big_boss_fighter_cobra3-alternate
random_hits_big_boss_fighter_cobra3courier
random_hits_big_boss_fighter_cobra3courierSE-trader
random_hits_big_boss_fighter_cobra3rapier
random_hits_big_boss_fighter_cobraclipper
random_hits_big_boss_fighter_cobras9
random_hits_big_boss_fighter_cutlass
random_hits_big_boss_fighter_drake
random_hits_big_boss_fighter_drake2
random_hits_big_boss_fighter_dttmk1
random_hits_big_boss_fighter_ferdelance
random_hits_big_boss_fighter_galtech_escort_fighter
random_hits_big_boss_fighter_gecko
random_hits_big_boss_fighter_ghavial
random_hits_big_boss_fighter_gnat
random_hits_big_boss_fighter_griffin1
random_hits_big_boss_fighter_krait
random_hits_big_boss_fighter_mamba
random_hits_big_boss_fighter_manta
random_hits_big_boss_fighter_monitor
random_hits_big_boss_fighter_moray
random_hits_big_boss_fighter_mussurana
random_hits_big_boss_fighter_mw-asp
random_hits_big_boss_fighter_phaze
random_hits_big_boss_fighter_salamander
random_hits_big_boss_fighter_sidewinder
random_hits_big_boss_fighter_sidewinderx
random_hits_big_boss_fighter_yacht
random_hits_big_boss_guard_arachnid
random_hits_big_boss_guard_asp
random_hits_big_boss_guard_aspmk1
random_hits_big_boss_guard_cat
random_hits_big_boss_guard_cobra3-alternate
random_hits_big_boss_guard_cobra3courier
random_hits_big_boss_guard_cobra3courierSE-trader
random_hits_big_boss_guard_cobra3rapier
random_hits_big_boss_guard_cobras9
random_hits_big_boss_guard_cutlass
random_hits_big_boss_guard_ferdelance
random_hits_big_boss_guard_galtech_escort_fighter
random_hits_big_boss_guard_gnat
random_hits_big_boss_guard_mussurana
random_hits_big_boss_guard_mw-asp
random_hits_big_boss_guard_phaze
random_hits_big_boss_guard_salamander
random_hits_big_boss_iguana
random_hits_big_boss_iguana_spacelane
random_hits_big_boss_impcourier
random_hits_big_boss_impcourier_spacelane
random_hits_big_boss_imptrader
random_hits_big_boss_imptrader_spacelane
random_hits_big_boss_pitviper
random_hits_big_boss_pitviper_spacelane
random_hits_big_boss_supercobra
random_hits_big_boss_supercobra_spacelane
random_hits_big_boss_vamppurg
random_hits_big_boss_vamppurg_spacelane
random_hits_big_boss_wolfmk2SE
random_hits_big_boss_wolfmk2SE_spacelane
Error: Entry in the wrong role!
random_hits_gravemarker2
random_hits_gravemarker3
A Seedy Space Bar
random_hits_griff_spacebar1
random_hits_griff_spacebar10
random_hits_griff_spacebar11
random_hits_griff_spacebar12
random_hits_griff_spacebar13
random_hits_griff_spacebar14
random_hits_griff_spacebar15
random_hits_griff_spacebar16
random_hits_griff_spacebar17
random_hits_griff_spacebar18
random_hits_griff_spacebar19
random_hits_griff_spacebar2
random_hits_griff_spacebar20
random_hits_griff_spacebar21
random_hits_griff_spacebar22
random_hits_griff_spacebar23
random_hits_griff_spacebar24
random_hits_griff_spacebar25
random_hits_griff_spacebar26
random_hits_griff_spacebar27
random_hits_griff_spacebar28
random_hits_griff_spacebar29
random_hits_griff_spacebar3
random_hits_griff_spacebar30
random_hits_griff_spacebar31
random_hits_griff_spacebar32
random_hits_griff_spacebar33
random_hits_griff_spacebar34
random_hits_griff_spacebar35
random_hits_griff_spacebar36
random_hits_griff_spacebar37
random_hits_griff_spacebar38
random_hits_griff_spacebar39
random_hits_griff_spacebar4
random_hits_griff_spacebar40
random_hits_griff_spacebar5
random_hits_griff_spacebar6
random_hits_griff_spacebar7
random_hits_griff_spacebar8
random_hits_griff_spacebar9
random_hits_mark_adder
random_hits_mark_anaconda
random_hits_mark_aphid
random_hits_mark_arachnid
random_hits_mark_asp
random_hits_mark_aspmk1
random_hits_mark_aspspec
random_hits_mark_boa
random_hits_mark_boa2
Bug
random_hits_mark_bushmaster
random_hits_mark_cat
random_hits_mark_chameleon
random_hits_mark_cobra1
random_hits_mark_cobra2
random_hits_mark_cobra3
random_hits_mark_cobra3courier
random_hits_mark_cobra3rapier
random_hits_mark_cobra4
random_hits_mark_cobraclipper
random_hits_mark_cobras9
random_hits_mark_cutlass
Drake
random_hits_mark_drake2
DTT Mark I
random_hits_mark_ferdelance
random_hits_mark_galtech_escort_fighter
random_hits_mark_gecko
random_hits_mark_ghavial
random_hits_mark_gnat
Griffin Mk I
random_hits_mark_igu
random_hits_mark_imp
Imperial Trader
random_hits_mark_krait
random_hits_mark_mamba
random_hits_mark_manta
random_hits_mark_monitor
random_hits_mark_monitor2
random_hits_mark_moray
random_hits_mark_mussurana
random_hits_mark_pcc
random_hits_mark_phaze
random_hits_mark_pitviper
random_hits_mark_python
random_hits_mark_pythonet
random_hits_mark_revenge1
random_hits_mark_revenge10
random_hits_mark_revenge11
random_hits_mark_revenge13
random_hits_mark_revenge14
random_hits_mark_revenge15
random_hits_mark_revenge16
random_hits_mark_revenge2
random_hits_mark_revenge3
random_hits_mark_revenge4
random_hits_mark_revenge6
random_hits_mark_revenge7
random_hits_mark_revenge8
random_hits_mark_revenge9
random_hits_mark_revenge_wing1
random_hits_mark_revenge_wing10
random_hits_mark_revenge_wing11
random_hits_mark_revenge_wing12
random_hits_mark_revenge_wing13
random_hits_mark_revenge_wing14
random_hits_mark_revenge_wing2
random_hits_mark_revenge_wing3
random_hits_mark_revenge_wing4
random_hits_mark_revenge_wing5
random_hits_mark_revenge_wing6
random_hits_mark_revenge_wing8
random_hits_mark_salamander
random_hits_mark_sidewinder
random_hits_mark_sidewinderx
random_hits_mark_supercobra
random_hits_mark_vamppurg
random_hits_mark_wolf
Ophidian Yacht
random_hits_markguard1
random_hits_markguard10
random_hits_markguard12
random_hits_markguard14
random_hits_markguard15
random_hits_markguard16
random_hits_markguard17
random_hits_markguard18
random_hits_markguard19
random_hits_markguard2
random_hits_markguard20
random_hits_markguard21
random_hits_markguard22
random_hits_markguard23
random_hits_markguard24
random_hits_markguard25
random_hits_markguard3
random_hits_markguard4
random_hits_markguard5
random_hits_markguard6
random_hits_markguard8
random_hits_markguard9
Mine Sweeper Satellite Radar Dish
Sentinel Satellite
GalMine Hopper
GalMine Cargo Pod
random_hits_mining_pod2
random_hits_patrol_aphid
Arachnid Mark 1
random_hits_patrol_asp
Asp Mark I
random_hits_patrol_cat
random_hits_patrol_cobra2x
random_hits_patrol_cobra3-alternate
Cobra Courier
Cobra Courier SE
random_hits_patrol_cobra3rapier
Cobra Mark IV Black
random_hits_patrol_cobraclipper
Cobra S9
random_hits_patrol_cutlass
Drake Mark II
random_hits_patrol_ferdelance
GalTech Escort Fighter
Gnat
random_hits_patrol_iguana
Imperial Courier
DTT Manta
random_hits_patrol_moray
random_hits_patrol_mussurana
random_hits_patrol_mw-asp
Purple Haze
Pitviper Mark II
random_hits_patrol_python-cruiser
random_hits_patrol_salamander
SuperCobra
Vampire Mark II Purgatori
Wolf Mark II
random_hits_pod1
random_hits_pod2
random_hits_pod3
random_hits_qbomb
Imperial Trader Engine
Cobra-S9-gun
rh_griff_rock_template
rh_manta_wings
rh_staer9_cat_left_gun
rh_staer9_cat_right_gun
gun
gun
gun
gun
gun
gun
gun
gun
gun

Models

This expansion declares no models.

Scripts

Path
Config/script.js
"use strict";
this.name      = "Random_Hits"; 
this.author    = "eric walch, spara"; 
this.copyright = "2010 - 2017 Little Bear";
this.description = "Mission board for generating hit targets. Written by Little Bear and ported to JS by Eric Walch";
this.licence     = "CC BY-NC-SA 3.0";

// setup some general arrays.
this.spaceBars = ["The Blue Parrot", "The Fox and Hound", "Jon Snorrad's Pub", "Lobbie's Can-Can Lounge", "The Old Spacer", "The Skull and Bones", "The Golden Gargle Blaster", "The Smoke Dragon Lounge", "The Grounded Spacer", "The Finders Keepers Bar", "The Wanted Dead or Alive", "The Marooned Spacer", "The Flying Dutchman", "The Red Pincers", "The Crash and Burn", "Joe's Bar and Grill", "The Bell and Braben", "The Carnal Pleasures Bar", "The Red Light", "The Eject Handle", "The Spacers' Hangout", "The Bearded Parrot", "The Last Wishes", "The Fat Feline", "The Furry Humanoid", "The Slimy Frog", "The Horny Lobster Hotel", "The Pink Slug", "The Colonial's Rest", "The Terminus Hotel", "The Viper and Whistle", "The Habitat Bar", "The Twisted Torus Hotel", "The Blue Lagrange", "O'Neill's Repose", "Giles's Grotto", "The Black Moon", "The Raxxla Ritz Hotel", "The Loving Feline", "The Worlds End", "Seedy Bar"];

this.$markKeys = [Ship.keysForRole("random_hits_mark_1"), Ship.keysForRole("random_hits_mark_2"), Ship.keysForRole("random_hits_mark_3")];

this.hitMissionEndings = ["COMPLETE", "SCOOPED", "JUMPED", "PODEDOUT", "FAILED", "NPCKILL"];
this.spacebarPositions = [[-5106, 5174, 388275], [12644, 13830, 353962], [25774, -10946, 314064], [-48509, -9524, 266555], [-41190, 33291, 240408]];
this.pages = [{},{},{},{},{},{},{},{},{}]; // create storageroom for 9 hit pages.
this.sets = 3; // Defines how many sets of missions are offered as max. 1 set is 3 contracts. Only 1,2 or 3 sets are allowed.

this.startUp = function (){
    /*
    When the OXP is installed, set the player's score to zero and his title and rank to the lowest 
    Clear all OXP variables in case the player had a test alpha version of the OXP installed
    */
    if (!missionVariables.random_hits_playertitle){
        missionVariables.random_hits_score = 0;
        this.updateStatus();
        delete missionVariables.random_hits_store_showship;
        delete missionVariables.random_hits_fine;
        delete missionVariables.random_hits_npcmoney;
        delete missionVariables.random_hits_markposition;
    } else if (missionVariables.random_hits_mark_galaxy && missionVariables.random_hits_mark_galaxy !== galaxyNumber){
        // player has proceed to new galaxy while the oxp was not installed. Reset all stuff now.
        this.playerEnteredNewGalaxy();        
    }
    
    /*
    A new feature for V1.4 is the player's Criminal Hatred Factor.
    This variable effects wheather 5 Scripted Random Events / Mini-Missions are called and unlocks a special mission.
    On install this is set to zero and the other variables are set up.
    */
    if (!missionVariables.random_hits_criminal_hate_score){
        var inits = ["criminal_hate_score", "events_timer", "events_dice", "special_mission_timer", "dockings_number", 
        "criminal_kill_score", "events_number", "hunter_kill_score", "total_boss_kills", "total_player_boss_kills"];
        for (var i=0; i<inits.length; i++) missionVariables["random_hits_"+inits[i]] = 0;
        missionVariables.random_hits_special_mission = "WAITING"; // yet unused
    }
    if (!missionVariables.random_hits_revenge){
        missionVariables.random_hits_revenge = "NO"; // make sure the variable exists.
        missionVariables.random_hits_striketime = "NOT_NOW";
        missionVariables.random_hits_timer = 0;
    }
    this.firstLaunch = true; // used for setting up space on the first launch. 
};

//generate offers when loading from bar
this.startUpComplete = function (){
    if (player.ship.docked && player.ship.dockedStation.name === "A Seedy Space Bar"){
        this.shipDockedWithStation();
        this.random_hits_docked = true;
    }
};

this.shipDockedWithStation = function (){
    if (player.ship.docked && player.ship.dockedStation.name === "A Seedy Space Bar"){
		this.$spacebar.setInterface("RandomHits",{ 
			title: "Random hits bulletin board",
			category: "Contracts",
			summary: "Bounty contracts to remove the most wanted criminals from existence. An E.C.M. System, Fuel Injectors and a Beam Laser is the minimum recommended kit.",
			callback: this.$restartHitPages.bind(this)
		});
        // All bars have the same name, only the displayName differs.

        // This point is only reached if docked at a Space Bar. Now we are checking witch pages must be shown.
        // missionScreenOpportunity will fire immediately after this and will deal with the results.
        
        this.setupDockedVariables(); // first define some variables we only needed while docked.
        missionVariables.random_hits_dockings_number++;
        
        // Add a backup mechanism to exit elegant with trunk builds that have a short code limiter setting.
        // This should never trigger in release builds with a limitter value of one second.
        if (this.pagesAreBeingBuild)
        {
            this.hitPageDate = 0;
            log(this.name, "Pages and variables were not set up properly.");
        }
        this.pagesAreBeingBuild = true;
        this.showScreen = "timeOut";

        if(!this.hitPageDate || (this.hitPageDate + 60 < clock.minutes)) this.setupHitpages(); // refresh hitpages, but not within 1 hour.

        this.pendingMessages = [];  // create an empty list. (errases previous lists)
        
        if (player.ship.bounty > 0){
            this.breakStuff(); 
            this.showScreen = "rejectPage";
            this.pagesAreBeingBuild = false; // ready building pages
            return; // no further evaluation!!
        }
        
        this.readHitpage(1); // prepare values for the first page.
        
        // now we have created a message stack and are going to look for events that display a missionscreen.
		
		//Don't show mission screen about running mission when docking
		/*
        if (missionVariables.random_hits_status === "RUNNING"){
            this.pendingMessages.push("busyPageDocking"); // push this name on the pendingMessage stack.
        }
        */

        if (missionVariables.random_hits_status && this.hitMissionEndings.indexOf(missionVariables.random_hits_status) > -1){
            this.pendingMessages.push("missionReport"); // The hit mission is finisched
        }
        
        //Before any can trigger, the player must first qualify for the News Feed Upgrade
        //This is given once the player holds the rank of a Deputy and an Elite rating of Competant and is docked at any bar.
        if (missionVariables.random_hits_score > 10 && player.score > 127){
    
            // add revenge warnings.
            if (missionVariables.random_hits_revenge === "YES" && Math.random() < 0.2){
                this.pendingMessages.push("revengeWarning");
            }
            
            var dice = missionVariables.random_hits_events_dice;
            
            // 1st Type of Random Event - 11% Chance of a group of Super Criminals attacking the Bar
            // If the Chance of a Bar Attack by Super Criminals is Called, show the mission screen asking if the Player wants to join in.
            if (dice > 0 && dice < 12 && !this.bigBossAttack && missionVariables.random_hits_dockings_number > 3){
                this.pendingMessages.push("barAttackStarted");
                missionVariables.random_hits_events_dice = 0;
            }
            
            // test for big bosses and other events now.
            if (this.bigBossAttack){
                this.pendingMessages.push(this.setBigBossMessages()); // setBigBossMessages returns:  "barAttackEnded" or "barAttackInProgress"
            }
            
            // 2nd Type of Random Event - 3% Chance of a increased Thargoid Activity in the System.
            // Extra Thargoids are added to the spacelanes and also near the bar.
            if (dice > 20 && dice < 25 && !this.thargoidAttack && missionVariables.random_hits_dockings_number > 5){
                this.pendingMessages.push("thargoidAttackStarted");
                missionVariables.random_hits_events_dice = 0;
            }

            // test for thargoid events now.
            if (this.thargoidAttack){
                this.pendingMessages.push(this.setThargoidMessages()); // returns:  "barAttackThargoidEnded" or "barAttackThargoidInProgress"
            }
            
            // 3th Type of Random Event - 3% Chance of miningpod theft.
            // Adding ships scooping miningpods.
            if (dice > 30 && dice < 35 && !this.miningpodTheft && missionVariables.random_hits_dockings_number > 5){
                this.pendingMessages.push("miningpodTheftStarted");
                missionVariables.random_hits_events_dice = 0;
            }

            // test for thargoid events now.
            if (this.miningpodTheft){
                this.pendingMessages.push(this.setMiningpodTheftMessages()); // returns:  "miningpodTheftEnded" or "miningpodTheftInProgress"
            }
            
            // Add a welcome message only once for each galaxy (resets after every galactic jump)
            if (!missionVariables.random_hits_has_news_feed){
                this.pendingMessages.push("newsFeedIntro");
                missionVariables.random_hits_has_news_feed = "TRUE";
            }
        }
        if (this.hasNoPendingMessages()){
			//don't show offers when docking/loading from bar
			this.showScreen = null;
            //this.showScreen = "firstPage"; // default page (used, unless there were pending messages).
        }
        this.pagesAreBeingBuild = false; // ready building pages and messages
        
    }
};

this.missionScreenOpportunity = function (){
    if (player.ship.docked) {
        this.missionOffers();
    }
}

this.dealWithRevenge = function (){
    missionVariables.random_hits_timer++;
    // Before the chance of revenge ships appearing is called, clean players get a warning from a helpful bounty hunter within 2 to 5 jumps.
    // If the player is not Clean, no warning is given and the timer for the attack starts running within 2 - 5 jumps anyway.
    if(!missionVariables.random_hits_revenge_warned && (Math.random() > 0.65 || missionVariables.random_hits_timer > 4)){
        missionVariables.random_hits_revenge_warned = "YES";
        if (player.bounty === 0){
			system.setPopulator("rh_patrol", {
				callback: function(pos) {
					var patrol = system.addShips("random_hits_patrol", 1, pos);
					if (patrol.length > 0) patrol[0].switchAI("randomhitspatrolwarnAI.plist"); // give it a new AI
				}.bind(this),
				location: "WITCHPOINT"
			});
        }
        missionVariables.random_hits_timer = 0;
    }
    // Timer now running. There will be a delay before the chance of the ships being added in the spacelanes can be called.
    // If the player is avoiding the spacelanes, the attack ships will eventually jump him by the witchpoint.
    if (missionVariables.random_hits_revenge_warned){
        if (!missionVariables.random_hits_revenge_count) {
            missionVariables.random_hits_revenge_count = Math.min(Math.ceil(Math.random() * missionVariables.random_hits_criminal_hate_score / 50), 64);
        }
        var shipCount = missionVariables.random_hits_revenge_count;
        if (missionVariables.random_hits_timer > 1 && missionVariables.random_hits_striketime === "SOON" && Math.random() > 0.69){
            this.addRevengeShips(shipCount, "LANE_WP", 0);
            missionVariables.random_hits_striketime = expandDescription("[random_hits_revenge_dice2a]");
        }else if (missionVariables.random_hits_timer > 3 && missionVariables.random_hits_striketime === "QUITE_SOON" && Math.random() > 0.39){
            this.addRevengeShips(shipCount, "LANE_WP", 0);
            missionVariables.random_hits_striketime = expandDescription("[random_hits_revenge_dice2a]");
        }else if (missionVariables.random_hits_timer > 5 && missionVariables.random_hits_striketime === "SLOW_BURN" && Math.random() > 0.29){
            this.addRevengeShips(shipCount, "LANE_WP", 0);
            missionVariables.random_hits_striketime = "JUMP_POINT";
        }
        // If no encounter has occoured within 9 jumps force the timer to call a Jump Point encounter with a 50% chance.
        if (missionVariables.random_hits_timer > 8 && ["SLOW_BURN", "SOON", "QUITE_SOON"].indexOf(missionVariables.random_hits_striketime) > -1 
                            && Math.random() > 0.49){
            this.addRevengeShips(shipCount, "WITCHPOINT", 1);
            missionVariables.random_hits_striketime = expandDescription("[random_hits_revenge_dice2]");
        }
        if (missionVariables.random_hits_timer > 2 && missionVariables.random_hits_striketime === "JUMP_POINT" && Math.random() > 0.49){
            this.addRevengeShips(shipCount, "WITCHPOINT", 2);
            missionVariables.random_hits_striketime = expandDescription("[random_hits_revenge_dice2]");
        }
        //log(this.name, "Revenge striketime:"+missionVariables.random_hits_striketime+" Revenge jumps: "+missionVariables.random_hits_timer);
    }
};

this.playerEnteredNewGalaxy = function(){
    if (missionVariables.random_hits_status === "RUNNING"){
        player.consoleMessage(expandDescription("[random_hits_abandoned]"));
        this.decreaseCriminalHateBy(this.anyInt(6,8));
        this.updateStatus(); // also deletes destination and mission related variables.
        delete missionVariables.random_hits_has_news_feed; // reset it here so you get the intro message in every galaxy.
    }
};

this.missionOffers = function (){

    // test for completed missions at main stations.
    if (player.ship.dockedStation.isMainStation){
        if (missionVariables.random_hits_status && this.hitMissionEndings.indexOf(missionVariables.random_hits_status) > -1){
            this.showScreen = "missionReport";
        }
        // setup the page display sequence for the random hits station.
        if (this.showScreen) switch (this.showScreen){
            case "missionReport": {
                missionVariables.random_hits_security_bar_text_close = expandDescription("[random_hits_security_bar_text_close_extra4-0]");
                this.reportMissionEnded();
                break;
            }
            case "freepod": {
                mission.runScreen({
						screenID: "random_hits",
						title: "Random Hits",
						messageKey: "random_hits_freepod",
						music: "randomhitsmail.ogg",
						model: "police", choicesKey: "random_hits_pause4"
					},
					this.choiceEvaluation
				);
                this.decreaseCriminalHateBy(this.anyInt(6,10));
                player.credits += missionVariables.random_hits_galcop;
                this.updateStatus();
                break;
            }
            case "killedTarget": {
                mission.runScreen({
						screenID: "random_hits",
						title: "Random Hits",
						messageKey: "random_hits_killpod",
						music: "randomhitsmail.ogg",
						model: "random_hits_gravemarker",
						choicesKey: "random_hits_pause"
					},
					this.choiceEvaluation
				);
                missionVariables.random_hits_criminal_hate_score += this.anyInt(6,10);
                player.credits += missionVariables.random_hits_store_mark_fee;
                this.testRevenge();
                this.updateStatus();
                break;
            }
            default:  break;
         }
    } 

    // Docked at one of the spacebars ...
    if (this.random_hits_docked){
		
        //Check if the Player has more than one message waiting. If so the Second Message Display will wait until the 1st one has been read

        // setup the page display sequence for the random hits station.
        if (this.showScreen) {
			if (this.$restoreDestination) {
				player.ship.targetSystem = this.$restoreDestination;
				delete this.$restoreDestination;
			}
			switch (this.showScreen){
				case "firstPage":
				case "secondPage":
				case "thirdPage": {		
					if (++this.hitpageNumber > this.hitpageMaxNumber) this.hitpageNumber = 1;
					this.targetLevel = modulo(this.hitpageNumber-1, 3)+1; // returns 1, 2 or 3
					this.readHitpage(this.hitpageNumber);
					var page = "level_"+this.targetLevel+"_mark_advert";
					mission.runScreen({title: missionVariables.random_hits_seedy_spacebar_header, messageKey: page,
										model: "[" + missionVariables.random_hits_mark_ship + "]",
										modelPersonality: missionVariables.random_hits_mark_ship_personality,
										choicesKey: "random_hits_board_choice"+this.targetLevel},
										this.choiceEvaluation);
					break;
				}
				case "barBill": {
					this.evaluateRevengeStatus();
					var message = expandMissionText("random_hits_barbill", {random_hits_billdue: this.random_hits_billdue});
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits Bar",
							message: message,
							music: "randomhitsmail.ogg",
							model: "random_hits_griff_spacebar",
							choicesKey: "random_hits_bill_pause"
						},
						this.choiceEvaluation
					);
					mission.displayModel.orientation = [0.707,-0.707,0,0];
					player.credits -= this.random_hits_billdue;
					break;
				}
				case "noExperience": {
					mission.runScreen({
							screenID: "random_hits",
							title: missionVariables.random_hits_seedy_spacebar_header,
							messageKey: "random_hits_refused",
							music: "randomhitsmail.ogg",
							model: "[" + missionVariables.random_hits_mark_ship + "]",
							modelPersonality: missionVariables.random_hits_mark_ship_personality,
							choicesKey: "random_hits_board_choice0"
						},
						this.choiceEvaluation
					);
					break;
				}
				case "markAccepted": {
					this.setStoreVariables(this.hitpageNumber);
					mission.runScreen({
							screenID: "random_hits",
							title: missionVariables.random_hits_seedy_spacebar_header,
							messageKey: "random_hits_jobaccepted",
							music: "randomhitsmail.ogg",
							model: "[" + missionVariables.random_hits_mark_ship + "]",
							modelPersonality: missionVariables.random_hits_mark_ship_personality,
							choicesKey: "random_hits_board_choice4"
						},
						this.choiceEvaluation
					);
					this.$markSystem(missionVariables.random_hits_planetnumber);
					
					//random shipnames sometimes makes very long names that don't fit in one missionline.
					//if that happens we'll use plain ship name instead.
					var instructions = expandMissionText("random_hits_shortdescription");
					if (defaultFont.measureString(instructions) > 32) {
						missionVariables.random_hits_mark_ship_short_name = Ship.shipDataForKey(missionVariables.random_hits_mark_ship)["name"];
						instructions = expandMissionText("random_hits_shorterdescription");
					}
					mission.setInstructions(instructions);
					delete missionVariables.random_hits_mark_ship_short_name;
					//mission.setInstructionsKey("random_hits_shortdescription");
					
					this.setupMarkPosition(); // sets mark position and various fees.
					missionVariables.random_hits_status ="RUNNING";
					break;
				}
				case "busyPage": {
					if (missionVariables.random_hits_store_mark_fee/10 < player.credits) {
						mission.runScreen({
								screenID: "random_hits",
								title: "Random Hits Current Mission Target",
								messageKey: "random_hits_busy",
								music: "randomhitsmail.ogg",
								model: "[" + missionVariables.random_hits_mark_ship + "]",
								modelPersonality: missionVariables.random_hits_mark_ship_personality,
								choicesKey: "random_hits_board_choice5"
							},
							this.choiceEvaluation
						);
					}
					else {
						mission.runScreen({
								screenID: "random_hits",
								title: "Random Hits Current Mission Target",
								messageKey: "random_hits_busy",
								music: "randomhitsmail.ogg",
								model: "[" + missionVariables.random_hits_mark_ship + "]",
								modelPersonality: missionVariables.random_hits_mark_ship_personality,
								choicesKey: "random_hits_board_choice5_no_cancel"
							},
							this.choiceEvaluation
						);
					}
					break;
				}
				//used to be used on docking to show offers
				/*
				case "busyPageDocking": {
					if (missionVariables.random_hits_store_mark_fee/10 < player.credits) {
					mission.runScreen({title: "Random Hits Current Mission Target", messageKey: "random_hits_busy_docking", music: "randomhitsmail.ogg",
										model: this.getMarkRole(missionVariables.random_hits_store_mark_ship),
										choicesKey: "random_hits_board_choice6"},
										this.choiceEvaluation);
					} else {
					mission.runScreen({title: "Random Hits Current Mission Target", messageKey: "random_hits_busy_docking", music: "randomhitsmail.ogg",
										model: this.getMarkRole(missionVariables.random_hits_store_mark_ship),
										choicesKey: "random_hits_board_choice6_no_cancel"},
										this.choiceEvaluation);
					}
					break;
				}
				*/
				case "rejectPage": {
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits Bar",
							messageKey: "random_hits_notwelcome",
							choicesKey: "random_hits_eject"
						},
						this.choiceEvaluation
					);
					break;
				}
				case "newsFeedIntro" : {
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_news_feed_award",
							model: "random_hits_griff_spacebar",
							choicesKey: "random_hits_pause6",
							music: "randomhitsmail.ogg"
						},
						this.choiceEvaluation
					);
					break;
				}
				case "missionReport": {
					this.reportMissionEnded();
					break;
				}
				case "freepod": {
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits",
							messageKey: "random_hits_freepod",
							music: "randomhitsmail.ogg",
							model: "police",
							choicesKey: "random_hits_pause4"
						},
						this.choiceEvaluation
					);
					missionVariables.random_hits_criminal_hate_score += this.anyInt(6,10);
					player.credits += missionVariables.random_hits_galcop;
					this.updateStatus();
					break;
				}
				case "killedTarget": {
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits",
							messageKey: "random_hits_killpod",
							music: "randomhitsmail.ogg",
							model: "random_hits_gravemarker",
							choicesKey: "random_hits_pause_goto_board"
						},
						this.choiceEvaluation
					);
					missionVariables.random_hits_criminal_hate_score += this.anyInt(6,10);
					player.credits += missionVariables.random_hits_store_mark_fee;
					this.testRevenge();
					this.updateStatus();
					break;
				}
				case "barAttackStarted" : {
					missionVariables.random_hits_reward_offer_name = expandDescription("[random_hits_security_bar_text9]");
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_big_boss_alert",
							model: "random_hits_big_boss",
							choicesKey: "random_hits_big_boss_alert_first_choice",
							music: "siren.ogg"
						},
						this.choiceEvaluation
					);
					missionVariables.random_hits_dockings_number = 0;
					missionVariables.random_hits_criminal_kill_score = 0;
					missionVariables.random_hits_hunter_kill_score = 0;
					missionVariables.random_hits_total_boss_kills = 0;
					missionVariables.random_hits_total_player_boss_kills = 0;
					missionVariables.random_hits_events_number++;
					missionVariables.random_hits_battle_time = clock.days;
					missionVariables.random_hits_battle_system = system.info.name;
					missionVariables.random_hits_battle_bar = player.ship.dockedStation.displayName;
					var pos = player.ship.dockedStation.position;
					var bossCount = this.anyInt(3,6);
					missionVariables.random_hits_battle_boss_number = bossCount;
					missionVariables.random_hits_battle_fighter_number = 6;
					system.addGroup("random_hits_big_boss", bossCount, pos, 10000);
					system.addGroup("random_hits_big_boss_fighter", 6, pos, 10000);
					this.bigBossAttack = true;
					break;
				}
				case "barAttackInProgress" : {
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_big_boss_alert2",
							model: "random_hits_big_boss",
							choicesKey: "random_hits_big_boss_alert_second_choice",
							music: "siren.ogg"
						},
						this.choiceEvaluation
					);
					player.credits += missionVariables.random_hits_criminal_kill_payment;
					this.clearBigBossDescriptions();
				   break;
				}
				case "barAttackEnded" : {
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_big_boss_alert3",
							model: "random_hits_gravemarker",
							choicesKey: "random_hits_pause5",
							music: "randomhitsmail.ogg"
						},
						this.choiceEvaluation
					);
					player.credits += missionVariables.random_hits_criminal_kill_payment;
					this.clearBigBossDescriptions();
					delete missionVariables.random_hits_battle_time;
					delete missionVariables.random_hits_battle_system;
					delete missionVariables.random_hits_battle_bar;
					delete missionVariables.random_hits_describe_total_player_kills;
					delete missionVariables.random_hits_describe_prize;
					missionVariables.random_hits_dockings_number = 0;
					missionVariables.random_hits_hunter_kill_score = 0;
					missionVariables.random_hits_total_boss_kills = 0;
					missionVariables.random_hits_total_player_boss_kills = 0;		
					this.bigBossAttack = false;
					break;
				}
				case "thargoidAttackStarted": {
					var pos = player.ship.dockedStation.position;
					// first add a dummy message to prevent the player from looking at a black screen, because adding thargoids takes time
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_pause_message",
							music: "siren.ogg"
						}
					);
					missionVariables.random_hits_player_thargoid_kills = 0;
					missionVariables.random_hits_thargoid_reward = this.anyRoundedInt(500,1600);  //  check this value. to low/to high ??
					// the new ship adding commands return a group. Use this group as parameter to setup the rewards for that group.
					this.setUpThargoidRewards(system.addGroup("thargoid", this.anyInt(3,6), pos, 10000));
					this.setUpThargoidRewards(system.addGroup("thargoid", this.anyInt(3,6), pos, 30000));
					mission.addMessageText("\n\n              nearly done.....");
					if (player.ship.dockedStation.minesweepers.count > 1) {
						// scans for explosive tharglets. 
						player.ship.dockedStation.minesweepers.ships[1].AIState = "LOOK_FOR_TARGOIDS";
					}
					for (var i=1; i<5; i++) {
						this.setUpThargoidRewards(system.addGroupToRoute("thargoid", 1, 0.2*i, "wp"));
					}
					missionVariables.random_hits_thargoid_number = system.countShipsWithPrimaryRole("thargoid");
					missionVariables.random_hits_thargoid_number_close = system.shipsWithPrimaryRole("thargoid", player.ship.dockedStation, 25E3).length;
					missionVariables.random_hits_reward_offer_name = expandDescription("[random_hits_security_bar_text9]");
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_thargoid_spacelane_alert",
							model: "thargoid",
							choicesKey: "random_hits_thargoid_alert_first_choice",
							music: "siren.ogg"
						},
						this.choiceEvaluation
					);
					this.thargoidAttack = true;
					missionVariables.random_hits_dockings_number = 0;
					missionVariables.random_hits_events_number++;
					break;
				}
				case "barThargoidAttackInProgress": {
					missionVariables.random_hits_reward_offer_name = expandDescription("[random_hits_security_bar_text9]");
					missionVariables.random_hits_thargoid_total_reward = missionVariables.random_hits_thargoid_reward * missionVariables.random_hits_player_thargoid_kills;
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_thargoid_spacelane_alert_progressing",
							model: "thargoid",
							choicesKey: "random_hits_thargoid_alert_first_choice",
							music: "siren.ogg"
						},
						this.choiceEvaluation
					);
					missionVariables.random_hits_player_thargoid_kills = 0;
					player.credits += missionVariables.random_hits_thargoid_total_reward;
					missionVariables.random_hits_thargoid_total_reward = 0;
					break;
				}
				case "barThargoidAttackEnded": {
					missionVariables.random_hits_reward_offer_name = expandDescription("[random_hits_security_bar_text9]");
					missionVariables.random_hits_thargoid_total_reward = missionVariables.random_hits_thargoid_reward * missionVariables.random_hits_player_thargoid_kills;
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_thargoid_spacelane_alert_over",
							model: "random_hits_gravemarker",
							choicesKey: "random_hits_pause5",
							music: "randomhitsmail.ogg"
						},
						this.choiceEvaluation
					);
					player.credits += missionVariables.random_hits_thargoid_total_reward;
					delete missionVariables.random_hits_player_thargoid_kills;
					delete missionVariables.random_hits_thargoid_number_close;
					delete missionVariables.random_hits_thargoid_number;
					delete missionVariables.random_hits_thargoid_reward;
					delete missionVariables.random_hits_thargoid_total_reward;
					break;
				}
				case "miningpodTheftStarted": {
					var pos = player.ship.dockedStation.position;
					missionVariables.random_hits_miningpodThief_reward = this.anyRoundedInt(300,800);  //  check this value. to low/to high ??
					missionVariables.random_hits_miningpodThief_number = this.setUpMiningpodThief(system.addGroup("pirate", this.anyInt(5,10), pos, 35000));
					missionVariables.random_hits_miningpodThief_player_kill = 0;
					missionVariables.random_hits_miningpodThief_groupname = expandDescription("[random_hits_podThief_alert_subject]");
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_miningpodThief",
							model: "random_hits_mining_pod",
							choicesKey: "random_hits_miningpod_thief_first_choice",
							music: "siren.ogg"
						},
						this.choiceEvaluation
					);
					this.miningpodTheft = true;
					missionVariables.random_hits_dockings_number = 0;
					missionVariables.random_hits_events_number++;
					break;
				}
				case "miningpodTheftInProgress": {
					missionVariables.random_hits_miningpodThief_total_reward = missionVariables.random_hits_miningpodThief_player_kill * missionVariables.random_hits_miningpodThief_reward;
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_miningpodThief_progressing",
							model: "random_hits_mining_pod",
							choicesKey: "random_hits_miningpod_thief_first_choice",
							music: "siren.ogg"
						},
						this.choiceEvaluation
					);
					player.credits += missionVariables.random_hits_miningpodThief_total_reward;
					missionVariables.random_hits_miningpodThief_player_kill = 0;
					break;
				}
				case "miningpodTheftEnded": {
					missionVariables.random_hits_miningpodThief_total_reward = missionVariables.random_hits_miningpodThief_player_kill * missionVariables.random_hits_miningpodThief_reward;
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_miningpodThief_over",
							model: "random_hits_griff_autominer",
							choicesKey: "random_hits_pause5",
							music: "randomhitsmail.ogg"
						},
						this.choiceEvaluation
					);
					player.credits += missionVariables.random_hits_miningpodThief_total_reward;
					delete missionVariables.random_hits_miningpodThief_total_reward;
					delete missionVariables.random_hits_miningpodThief_player_kill;
					delete missionVariables.random_hits_miningpodThief_reward;
					delete missionVariables.random_hits_miningpodThief_number;
					delete missionVariables.random_hits_miningpodThief_groupname;
					break;
				}
				case "revengeWarning": {
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits News",
							messageKey: "random_hits_revenge_alert",
							choicesKey: "random_hits_pause5",
							music: "randomhitsmail.ogg"
						},
						this.choiceEvaluation
					);
					break;
				}
				case "cancelMission": {
					this.decreaseCriminalHateBy(this.anyInt(6,10));
					missionVariables.random_hits_store_mark_fee /= 10;
					player.credits -=  missionVariables.random_hits_store_mark_fee;
					missionVariables.random_hits_score -= missionVariables.random_hits_store_skill;
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits",
							messageKey: "random_hits_cancelledMission",
							music: "randomhitsmail.ogg",
							model: "random_hits_gravemarker",
							choicesKey: "random_hits_pause7"
						},
						this.choiceEvaluation
					);
					this.testRevenge();
					this.updateStatus();
					break;
				}
				case "timeOut": {
					mission.runScreen({
							screenID: "random_hits",
							title: "Random Hits",
							messageKey: "random_hits_slowComputer",
							model: "random_hits_gravemarker"
						}
					);
					log(this.name, "Succeeded in generating "+this.hitpageMaxNumber + " hitpages. You should only see this message with Oolite debug builds or in release builds at slow computers.");
					missionVariables.random_hits_assassination_board_address1 = expandDescription("[assassination_board_address1-1]");
					missionVariables.random_hits_assassination_board_address2 = expandDescription("[assassination_board_address2-1]");
					this.showScreen = "barBill";
					break;
				}

				default: {
					log(this.name,"Error **** Got request to show unknown page: "+this.showScreen);
					break;
				}
			}
        }
    }
};

this.choiceEvaluation = function (choice){
    switch(choice){
		case "random_hits_7map": {
			this.$restoreDestination = player.ship.targetSystem;
			player.ship.targetSystem = System.systemIDForName(missionVariables.random_hits_mark_system);
			this.hitpageNumber--;
			mission.runScreen({
					screenID: "random_hits_map",
					title: missionVariables.random_hits_assassination_board_subject,
					messageKey: "random_hits_hit_details",
					backgroundSpecial: "LONG_RANGE_CHART_QUICKEST"
				},
				this.missionOffers
			);
			break;
		}
        case "random_hits_bill_paid": {// do nothing (random_hits_bill_pause)
            if (hasNoPendingMessages()) this.showScreen = false; // no more pages to display.
            break;
        }
        case "random_hits_accept": { //  (random_hits_board_choice1, random_hits_board_choice2, random_hits_board_choice3)
            this.showScreen = "markAccepted";
            if ((this.targetLevel === 1 && player.score < 32) || (this.targetLevel === 2 && player.score < 128)
                                         || (this.targetLevel === 3 && player.score < 512)) this.showScreen = "noExperience";
            if (missionVariables.random_hits_status === "RUNNING") this.showScreen = "busyPage";
            break;
        }

        case "random_hits_2nd_hit": { //  (random_hits_board_choice1)
            this.showScreen = "secondPage";
            break;
        }

        case "random_hits_3th_hit": { //  (random_hits_board_choice2)
            this.showScreen = "thirdPage";
            break;
        }

        case "random_hits_returnwithjob":  //  (random_hits_board_choice4)
        case "random_hits_refusedreturn": //  (random_hits_board_choice0)
        case "random_hits_returnbusy": // (random_hits_board_choice5)
        case "random_hits_1st_hit": { //  (random_hits_board_choice3)
            // test for pending messages. If not found, show the first screen
            if (hasNoPendingMessages()) this.showScreen = "firstPage"; // NB the main station has no "firstPage" and just skips this.
            break;
        }
		
		//take us straight to the status screen instead of offers or bar bill
		case "random_hits_failedbynpc": // (random_hits_pause3)
		case "random_hits_failedplayer": // (random_hits_pause2)
		case "random_hits_paidplayer": // (random_hits_pause)
		case "random_hits_big_boss_battle_over": //  (random_hits_pause5)
		case "random_hits_goto_board": //(random_hits_pause_goto_board)
		case "random_hits_failedself": // (random_hits_pause4)
		case "random_hits_news_awarded": { // (random_hits_pause6)
			if (hasNoPendingMessages()) this.showScreen = null;
			break;
		}

		case "random_hits_big_boss_alert_first_choice_notnow": // (random_hits_big_boss_alert_first_choice)
        case "random_hits_big_boss_alert_second_choice_notnow": //(random_hits_big_boss_alert_second_choice)		
        case "random_hits_thargoid_alert_first_choice_notnow": //(random_hits_thargoid_alert_second_choice)
        case "random_hits_zexitwithjob": // (random_hits_board_choice4)
        case "random_hits_zrefusedexit": // (random_hits_board_choice0)
        case "random_hits_zexitbusy": // (random_hits_board_choice5)
        case "random_hits_zexit": { //  (random_hits_board_choice1, random_hits_board_choice2, random_hits_board_choice3)
            // test for pending messages. Else show the bill
            if (hasNoPendingMessages()) this.showScreen = "barBill";
            break;
        }

        case "random_hits_live": { // (random_hits_livedie)
            // choose a new board poster name for this one.
            missionVariables.random_hits_store_assassination_board_poster_title = expandDescription("[assassination_board_poster_name]");
            this.showScreen = "freepod";
            delete missionVariables.random_hits_status;
            break;
        }
        case "random_hits_murder":{ // (random_hits_livedie)
            this.showScreen = "killedTarget";
            delete missionVariables.random_hits_status;
            break;
        }
        case "random_hits_kickout":{ // (random_hits_notwelcome)
            this.decreaseCriminalHateBy(this.anyInt(6,10));
            this.launchPlayerFromBar();
            break;
        }
        case "random_hits_big_boss_alert_first_choice_launch":{ // (random_hits_big_boss_alert_first_choice)
            missionVariables.random_hits_criminal_hate_score++;
            var pos = player.ship.dockedStation.position;
            var bossCount = this.anyInt(1,3);
            missionVariables.random_hits_battle_boss_number += bossCount;
            system.addGroup("random_hits_big_boss", bossCount, pos, 8000);
            player.ship.fuel = 100;
            this.launchPlayerFromBar();
            break;
        }
        case "random_hits_miningpod_thief_first_choice_launch":
        case "random_hits_thargoid_alert_first_choice_launch":
        case "random_hits_big_boss_alert_second_choice_launch":{
			player.ship.fuel = 100;
            this.launchPlayerFromBar();
            break;
        }
        case "random_hits_the_cancellation":{ // (random_hits_board_choice6)
            this.showScreen = "cancelMission";
            break;
        }

        default: log(this.name,"Got unknown mission choice: "+choice);
    }
};

// Process the mission ended in a seperate routine because it is handled a bit different for main stations and seedy bars.
// In the bars it is preceeded by an incoming mail message. 

this.reportMissionEnded = function (){
    switch(missionVariables.random_hits_status){
        case "COMPLETE": {
                mission.runScreen({
						screenID: "random_hits",
						title: "Random Hits Mission Completed",
						messageKey: "random_hits_paid",
						music: "randomhitsmail.ogg",
						model: "random_hits_gravemarker",
						choicesKey: "random_hits_pause"
					},
					this.choiceEvaluation
				);
                this.testRevenge();
                player.credits +=  missionVariables.random_hits_store_mark_fee;
                if (!missionVariables.random_hits_criminal){
                    missionVariables.random_hits_score += missionVariables.random_hits_store_skill;
                }
                this.updateStatus(); // clears also several other stored mission variables and destination system..
                break;
        }
        case "SCOOPED": {
				//moved here from pod script -spara-
				missionVariables.random_hits_store_skill++;
                mission.runScreen({
						screenID: "random_hits",
						title: "Random Hits Mission Completed",
						messageKey: "random_hits_markscooped",
						music: "randomhitsmail.ogg",
						model: missionVariables.random_hits_store_showship,
						modelPersonality: missionVariables.random_hits_store_mark_ship_personality,
						choicesKey: "random_hits_livedie"
					},
					this.choiceEvaluation
				);
                if (!missionVariables.random_hits_criminal){
                    missionVariables.random_hits_score += missionVariables.random_hits_store_skill;
                // no update status here. Do it after the choice.
				}
                break;
        }
        case "JUMPED": {
                mission.runScreen({
						screenID: "random_hits",                          
						title: "Random Hits Mission Failed",
						messageKey: "random_hits_jumpfail",
						music: "randomhitsmail.ogg",
						model: missionVariables.random_hits_store_showship,
						modelPersonality: missionVariables.random_hits_store_mark_ship_personality,
						choicesKey: "random_hits_pause2"
					},
					this.choiceEvaluation
				);
                this.updateStatus(); // clears also several other stored mission variables.
                break;
        }
        case "PODEDOUT": this.removeEscapePod();
        case "FAILED": {
                mission.runScreen({
						screenID: "random_hits",                       
						title: "Random Hits Mission Failed",
						messageKey: "random_hits_failed",
						music: "randomhitsmail.ogg",
						model: missionVariables.random_hits_store_showship,
						modelPersonality: missionVariables.random_hits_store_mark_ship_personality,
						choicesKey: "random_hits_pause2"
					},
					this.choiceEvaluation
				);
                this.updateStatus(); // clears also several other stored mission variables.
                break;
        }
        case "NPCKILL": {
                mission.runScreen({
						screenID: "random_hits",
						title: "Random Hits Mission Failed",
						messageKey: "random_hits_npckill",
						music: "randomhitsmail.ogg",
						model: "random_hits_gravemarker",
						choicesKey: "random_hits_pause3"
					},
					this.choiceEvaluation
				);
                player.credits +=  missionVariables.random_hits_npcmoney;
                this.updateStatus(); // clears also several other stored mission variables.
                break;
        }
        default: log(this.name, "***** Found an unknown key during missionreport: "+missionVariables.random_hits_status);
                break;
    }
};

this.removeEscapePod = function () {
  // TODO
};

this.launchPlayerFromBar = function (){
    this.pendingMessages = [];  // empty the message list.
    player.ship.launch();
}

this.shipLaunchedFromStation = function()
{
	if (missionVariables.random_hits_status === "RUNNING" && missionVariables.random_hits_planetnumber === system.ID)
		player.consoleMessage(expandDescription("[random_hits_intro]"), 12);

    delete this.shipLaunchedFromStation;//just run on first launch    
};

this.systemWillPopulate = function (){

			//If the player has a mission running, check that he is at the victim's system.
			if (missionVariables.random_hits_status === "RUNNING" && missionVariables.random_hits_planetnumber === system.ID){
				//  add the mark's ship somewhere in the spacelanes.
				system.setPopulator("rh_mark", {
					callback: function(pos) {
						system.addShips("[" + missionVariables.random_hits_store_mark_ship + "]", 1, pos);
					}.bind(this),
					location: "COORDINATES",
					coordinates: new Vector3D(system.mainStation.position).multiply(missionVariables.random_hits_markposition/100)
				});
			}			
			if (system.government === 0){
				var barNumber = Math.floor(system.ID/6.4); // generates 0...39 (bar nr 1...40)
				var barPosition = new Vector3D(this.spacebarPositions[this.modulo(barNumber,5)]); // generates 0...4
				barNumber++;
				
				var validatorBarRole = "random_hits_spacebar" + barNumber;
				if (worldScripts.station_validator && (worldScripts.station_validator.$deaths(validatorBarRole).length !== 0))
					return;
				
				barPosition = system.mainPlanet.position.subtract(barPosition); // translate pwu into wpu

				var barRole = "random_hits_spacebar" + barNumber;
				var barName = this.spaceBars[barNumber - 1];


				this.setupSpacebar(barNumber, barPosition);
				
				// Random Bar Attacks
				if (Math.random() < 0.15){
					system.setPopulator("rh_bar_attack", {
						callback: function(pos) {
							system.addGroup("random_hits_big_boss", this.anyInt(3,6), pos, 10000);
							system.addGroup("random_hits_big_boss_fighter", 6, pos, 10000);
						}.bind(this),
						location: "COORDINATES",
						coordinates: barPosition
					});
				}
			}
			//run only after ws exit
			if (!this.firstLaunch) {
				if (missionVariables.random_hits_revenge === "YES" && missionVariables.random_hits_criminal_hate_score > 0){
					this.dealWithRevenge();
				}
			} else this.firstLaunch = false;
};

this.shipExitedWitchspace = function()
{
    /*
    Increase the timer, but reduce the hate score on each jump.
    Constant hunting therefore keeps the score up, but stopping hunting for a time causes it to fade away.
    */
    this.decreaseCriminalHateBy(1);
    missionVariables.random_hits_events_timer++;
    missionVariables.random_hits_special_mission_timer++;
    missionVariables.random_hits_events_dice = Math.floor(Math.random()*100);

	if (missionVariables.random_hits_status === "RUNNING" && missionVariables.random_hits_planetnumber === system.ID)
		player.consoleMessage(expandDescription("[random_hits_intro]"), 12);
    
    // If the player jumps out leaving a launched pod alive, give a mission failed message and reset the short description.
    if (missionVariables.random_hits_status && missionVariables.random_hits_status === "PODEDOUT"){
		mission.setInstructionsKey("random_hits_shortdescription5");
		player.consoleMessage(expandDescription("[random_hits_failed]"));
		this.$unmarkSystem(missionVariables.random_hits_planetnumber);
		missionVariables.random_hits_status = "FAILED";
    }

    // Clear Space Bar name on leaving an Anarchy System
    if (system.government > 0){
		delete missionVariables.random_hits_seedy_spacebar_name;
        delete missionVariables.random_hits_seedy_spacebar_header;
    }
    
};

this.addRevengeShips = function (count, position, id){
	system.setPopulator("rh_revenge"+id, {
		callback: function(pos) {
			system.addGroup("random_hits_mark_revenge", count, pos);
		}.bind(this),
		location: position
	});
    missionVariables.random_hits_timer = 0;
    // log(this.name, "Added "+count+" revengeship at position "+pos+" from witchpont");
};

this.setupSpacebar = function (barNumber, barPosition){
	system.setPopulator("rh_space_bar", {
		callback: function(pos) {
			var barRole = "random_hits_spacebar" + barNumber;
			var barName = this.spaceBars[barNumber - 1];
			missionVariables.random_hits_seedy_spacebar_header = this.barDescription(barName);
			this.$spacebar = system.addShips(barRole, 1, pos, 0)[0];
			this.$spacebar.primaryRole = "random_hits_spacebar";
			this.$spacebar.displayName = barName;
			this.$spacebar.orientation = new Quaternion(100, 100, 0, system.ID).normalize(); // always the same in a system.
			}.bind(this),
		location: "COORDINATES",
		coordinates: barPosition,
		deterministic: true,
		priority: 101
	});
	system.setPopulator("rh_space_bar_hood", {
		callback: function(pos) {
			system.addShips("random_hits_griff_autominer", this.anyInt(7,12), pos, 15000);
			this.$spacebar.minesweepers = new ShipGroup("Minesweepers");
			this.$spacebar.minesweepers.leader = this.$spacebar;
			system.addShips("asteroid", this.anyInt(6,9), pos, 25000);
			var minesweeper;
			for (var i = 0; i<3; i++){
				minesweeper = system.addShips("random_hits_minesweeper", 1, pos.add(new Vector3D.randomDirection(8000)), 5)[0];
				this.$spacebar.minesweepers.addShip(minesweeper);
				minesweeper.group = this.$spacebar.minesweepers;
			}
			function allShips(entity) {return entity.isShip}; 
				var problem = system.filteredEntities(this, allShips, this.$spacebar, 5E3); // look for any nearby ships during spawning.
				for (var i=0; i< problem.length; i++){
				// rocks, added to close to the bar can block launches. move them a bit outward from the bar.
					var direction = problem[i].position.subtract(this.$spacebar.position).direction();
					problem[i].position = problem[i].position.add(direction.multiply(5E3)); // place 5000 m further away.
				}
		}.bind(this),
		location: "COORDINATES",
		coordinates: barPosition,
		priority: 102
	});
};

this.barDescription = function (name){
    // create a centered barname, independent of the used font.
    /*
    var barTitle = " You are viewing " + name + " Bulletin Board. ";
    var titleSize = defaultFont.measureString(barTitle); // missionscreen width = 32 em
    var starSize = defaultFont.measureString("**");
    var stars = "******************************".substr(0, Math.floor((32 - titleSize)/starSize));
    barTitle = stars + barTitle + stars;
    if ((32 - defaultFont.measureString(barTitle)) > starSize/2) barTitle = barTitle + "*";
    */
    
    //map option takes one more line, so I move the text title to mission screen title.
    var barTitle = name + " Bulletin Board";
    return barTitle;
}

this.anyInt = function (min, max){
    return Math.floor(Math.random()*(1+max-min))+min;
};

this.anyRoundedInt = function (min, max){
    return Math.floor(this.anyInt(min, max)/5)*5;
};

this.modulo = function (a,b){
    return Math.round(((a/b) - Math.floor(a/b))*b);
};

this.hasNoPendingMessages = function (){
    var result = true;
    var count = 0;
    var news = "";
    if (this.pendingMessages){
        var count = this.pendingMessages.length;
        if (count > 0){
            this.showScreen = this.pendingMessages.pop(); // get the last message
            result = false;
            count--;
        }
    }
    news = expandDescription("[random_hits_security_bar_text_close_extra4-"+count+"]");
    missionVariables.random_hits_security_bar_text_close = news; //set the botom line
    return result;
};

this.setStoreVariables = function (nr){
    missionVariables.random_hits_planetnumber = System.systemIDForName(missionVariables.random_hits_mark_system);
    missionVariables.random_hits_mark_galaxy = galaxyNumber;
    missionVariables.random_hits_show_galaxy = galaxyNumber+1;
    var transfers = ["assassination_board_poster_title", "assassination_board_job_name", "assassination_board_poster_name", 
    "assassination_board_poster_system", "assassination_board_subject", "assassination_board_address1", "assassination_board_address2", 
    "assassination_board_part1", "mark_first_name", "mark_nick_name", "mark_second_name", "mark_race_part1", "mark_race_part2",
    "assassination_board_part2", "assassination_board_part3", "mark_ship_description", "mark_ship", "mark_ship_name", "mark_ship_personality",  "mark_ship_ad_name", "assassination_board_part4", "mark_system", "assassination_board_part5", "mark_fee", "assassination_board_part6", "mark_gender", "assassination_board_part7", "showship"];
    for (var i=0; i<transfers.length; i++) missionVariables["random_hits_store_"+transfers[i]] = missionVariables["random_hits_"+transfers[i]];
    missionVariables.random_hits_store_skill = nr;
    missionVariables.random_hits_criminal_hate_score += (this.anyInt(6,10) + nr);
};

this.resetStoreVariables = function (){
    var deletions = ["planetnumber", "mark_galaxy", "show_galaxy", "galcop", "store_assassination_board_poster_title",
    "store_assassination_board_job_name", "store_assassination_board_poster_name", "store_assassination_board_poster_system",
    "store_assassination_board_subject", "store_assassination_board_address1", "store_assassination_board_address2", 
    "store_assassination_board_part1", "store_mark_first_name", "store_mark_nick_name", "store_mark_second_name", "store_mark_race_part1", 
    "store_mark_race_part2", "store_assassination_board_part2", "store_assassination_board_part3", "store_mark_ship_description", 
    "store_mark_ship", "store_mark_ship_name", "store_mark_ship_ad_name", "store_mark_ship_personality", "store_assassination_board_part4", "store_mark_system", "store_assassination_board_part5", "store_mark_fee", "store_assassination_board_part6", "store_mark_gender", "store_assassination_board_part7", "store_showship", "store_skill", "deathcause", "npcdays", 
    "npcmoney", "markposition", "store_showship", "fine"];
    for (var i=0; i<deletions.length; i++) delete missionVariables["random_hits_"+deletions[i]];
};

// Break stuff when docking at a bar while not clean. We don't use a predefined list but select equipment from
// any equipment a player carries. Could be oxp added equipment.
this.breakStuff = function (){
    var myEquipmentList = player.ship.equipment;
    var myEquipment = myEquipmentList[Math.floor(myEquipmentList.length * Math.random())];
    var myName = myEquipment.name;
    // log(this.name, "Evaluate to break a: "+myName);
    if (myEquipment.effectiveTechLevel < Math.random() * 15 && player.ship.equipmentStatus(myEquipment.equipmentKey) === "EQUIPMENT_OK"){
        player.ship.setEquipmentStatus(myEquipment.equipmentKey, "EQUIPMENT_DAMAGED")
        myName = expandDescription("[random_hits_notwelcome_damaged] "+myName);
    } else {
        myName = expandDescription("[random_hits_nothing]");
    }
    missionVariables.random_hits_broken = myName;
};

this.setupMarkPosition = function (){
    // set the mark's position, the fine for using an e-bomb or q-mine and the consolation payment 
    // if an npc kills the mark and payment for taking him alive
    missionVariables.random_hits_npcmoney = this.anyRoundedInt(55,270);
    missionVariables.random_hits_markposition = this.anyInt(10,90);
    var skill = missionVariables.random_hits_store_skill;
    missionVariables.random_hits_fine = 1000 * skill + this.anyRoundedInt(300,995);
    var lowScore = skill===1 ? 250 : (skill===2 ? 1250 : 5250);
    var highScore = skill===1 ? 850 : (skill===2 ? 6325 : 9325);
    missionVariables.random_hits_galcop = this.anyRoundedInt(lowScore, highScore);
}

this.selectSystemsInRange = function(minRange, maxRange){
    // Create an array of systems suitable for missions. (called once on docking a seedy bar)
    var thisSystem = system.info;
    
    var targetSystems = SystemInfo.filteredSystems(this, function(other){ 
		return (other.systemID !== thisSystem.systemID) && (thisSystem.distanceToSystem(other) >= minRange) && (thisSystem.distanceToSystem(other) <= maxRange && other.government < 6 && !system.sun.hasGoneNova); 
    }); 

    return targetSystems;
};

this.selectOneSystemInRange = function(targetSystems, minRange, maxRange){
    // select a system by distance from the pre-selected system list. (called for every generated mission)
    if (!targetSystems) return system.info; // current system
    var thisSystem = system.info;
    
    targetSystems = targetSystems.filter(function(other){ 
		return (other.systemID !== thisSystem.systemID) && (thisSystem.distanceToSystem(other) >= minRange) && (thisSystem.distanceToSystem(other) <= maxRange); 
    }); 
    
    if (!targetSystems) return system.info; // current system
    
    var count = targetSystems.length;
    var targetSystem = targetSystems[Math.floor(Math.random()*count)];
    var i = 0;
    var route = System.infoForSystem(galaxyNumber, targetSystem.systemID).routeToSystem(thisSystem);
    while ((!route || !route.distance) && i<count){
        // log(this.name, "Found a system without a route to it: " + targetSystem.name + ". Selecting a new system");
        targetSystem = targetSystems[i++];  // Make sure there is a route, so no destinations in isolated areas are selected.
        route = System.infoForSystem(galaxyNumber, targetSystem.systemID).routeToSystem(thisSystem);
    }

    return targetSystem;
};

this.setupDockedVariables = function (){
    missionVariables.random_hits_seedy_spacebar_name = player.ship.dockedStation.displayName;
    // Below is the local bartender name and the consumption fee set.
    missionVariables.random_hits_billdue_name = expandDescription("[assassination_board_poster_name]"); 
    this.random_hits_billdue = (this.anyInt(21,49)/10).toFixed(1); // random decimal value as formatted string.
};

this.$restartHitPages = function (){
    this.showScreen = "firstPage";
    this.setupDockedVariables();
    this.missionOffers();
};

this.setupHitpages = function (){
    // create all the variables for the 3 different mission pages for later retrieval.
    this.hitpageNumber = 0; // reset number here.
    var count = Math.round(Math.random()*5);
    var name = "";
    //if (0 < oolite.compareVersion("1.76")) for (var i=0; i<count; i++) name = expandDescription("[nom2]"); // mix up the random generator
    var startTime = Date.now();
    var maximumTime = 350; // time in msec.
    this.hitPageDate = clock.minutes;
    if (this.sets > 3) this.sets = 3; // maximum allowed is 3 sets. 3 sets means 9 mission pages but might give a long gap on slower systems.
    this.hitpageMaxNumber = 0;
    var targetSystems = this.selectSystemsInRange(5, 33);
    for (var j=0; j<this.sets; j++){
        for (var i=0; i<3; i++){
            var nr = i+3*j;
            var targetSystem = this.selectOneSystemInRange(targetSystems, 5+i*2, 21+i*4);
            var distance = system.info.distanceToSystem(targetSystem).toFixed(1);
            this.pages[nr].mark_system = targetSystem.name;
            this.pages[nr].mark_direction = "(at "+distance+" LY to the "+this.positionToDirection(targetSystem.coordinates)+")";
            this.pages[nr].assassination_board_poster_system = System.systemNameForID(Math.floor(Math.random()*256));
            /*
            if (0 < oolite.compareVersion("1.76")) // bad randomness is not fixed in 1.75 so we still need the next two lines.
            {
                count = Math.round(Math.random()*10);
                for (var k=0; k<count; k++) name = expandDescription("[nom2]"); // mix up the random generator
            }
            */
            this.pages[nr].mark_gender = expandDescription("[mark_gender]");
            missionVariables.random_hits_mark_gender = this.pages[nr].mark_gender;// must be known later on.
            this.pages[nr].mark_ship_description = expandDescription("[mark_ship_description-"+(i+1)+"]");
                        
            this.pages[nr].mark_first_name = expandDescription("[mark_first_name-"+(i+1)+"]");
            this.pages[nr].mark_nick_name = expandDescription("[mark_nick_name-"+(i+1)+"]");
            this.pages[nr].mark_second_name = expandDescription("[mark_second_name-"+(i+1)+"]");
            this.pages[nr].mark_race_part1 = expandDescription("[mark_race_part1-"+(i+1)+"]");
            this.pages[nr].mark_race_part2 = expandDescription("[mark_race_part2-"+(i+1)+"]");
            missionVariables.random_hits_assassination_board_poster_system = this.pages[nr].assassination_board_poster_system; // needed below
            this.pages[nr].assassination_board_poster_title = expandDescription("[assassination_board_poster_title-"+(i+1)+"]");
            this.pages[nr].assassination_board_job_name = expandDescription("[assassination_board_job_name-"+(i+1)+"]");
            this.pages[nr].assassination_board_poster_surname = expandDescription("%N");
            this.pages[nr].assassination_board_poster_name = expandDescription("[assassination_board_poster_name-"+(i+1)+"]");
            this.pages[nr].assassination_board_address1 = expandDescription("[assassination_board_address1-"+(i+1)+"]");
            this.pages[nr].assassination_board_address2 = expandDescription("[assassination_board_address2-"+(i+1)+"]");
            this.pages[nr].assassination_board_part1 = expandDescription("[assassination_board_part1-"+(i+1)+"]");
            this.pages[nr].assassination_board_part2 = expandDescription("[assassination_board_part2-"+(i+1)+"]");
            this.pages[nr].assassination_board_part3 = expandDescription("[assassination_board_part3-"+(i+1)+"]");
            this.pages[nr].assassination_board_part4 = expandDescription("[assassination_board_part4-"+(i+1)+"]");
            this.pages[nr].assassination_board_part5 = expandDescription("[assassination_board_part5-"+(i+1)+"]");
            this.pages[nr].assassination_board_part6 = expandDescription("[assassination_board_part6-"+(i+1)+"]");
            this.pages[nr].assassination_board_part7 = expandDescription("[assassination_board_part7-"+(i+1)+"]");
            this.pages[nr].assassination_board_subject = expandDescription("[assassination_board_subject-"+(i+1)+"]");
            this.pages[nr].mark_ship = this.$markKeys[i][Math.floor(Math.random()*this.$markKeys[i].length)];
            
            var markShipName = Ship.shipDataForKey(this.pages[nr].mark_ship)["name"];

            //Random shipname for marks if oxp is present
            if (!worldScripts.randomshipnames) {
				this.pages[nr].mark_ship_name = markShipName;
				this.pages[nr].mark_ship_ad_name = markShipName;
			}
			else {
				var randomName = worldScripts.randomshipnames.$randomTraderName(player.ship);
				this.pages[nr].mark_ship_name = markShipName + ": " + randomName;
				this.pages[nr].mark_ship_ad_name = markShipName + ": '" + randomName + "'";
			}
			
			this.pages[nr].mark_ship_personality = Math.floor(Math.random() * 32768);
            
            this.pages[nr].mark_fee = this.anyRoundedInt(350 + i*i*1650, 700+i*4150);
            // select marks by a JS array because that give a better random selection than those from desciptions.plist
            this.hitpageMaxNumber++;
            // log(this.name, "Created page "+this.hitpageMaxNumber+" after "+(Date.now() - startTime)+" msec.");
        }
        if (Date.now() - startTime > maximumTime){
           // we are busy for 0.5 (or 0.25) seconds. Don't generate more pages on slower machines because you get noticeable pauses
           // on docking and there is a risk of hitting the time-limiter introduced in Oolite 1.75.
           break;
           //j = 3;
        }
    }
    missionVariables.random_hits_show_galaxy = galaxyNumber+1;
};

this.readHitpage = function (nr){
    // fetch the previous stored page nr.
    nr--; // make zero based
    missionVariables.random_hits_mark_system = this.pages[nr].mark_system;
    missionVariables.random_hits_mark_direction = this.pages[nr].mark_direction;
    missionVariables.random_hits_mark_gender = this.pages[nr].mark_gender;
	missionVariables.random_hits_assassination_board_poster_title = this.pages[nr].assassination_board_poster_title;
	missionVariables.random_hits_assassination_board_job_name = this.pages[nr].assassination_board_job_name;
	missionVariables.random_hits_assassination_board_poster_surname = this.pages[nr].assassination_board_poster_surname;
	missionVariables.random_hits_assassination_board_poster_name = this.pages[nr].assassination_board_poster_name;
	missionVariables.random_hits_assassination_board_poster_system = this.pages[nr].assassination_board_poster_system;
    missionVariables.random_hits_assassination_board_subject =  this.pages[nr].assassination_board_subject;
	missionVariables.random_hits_assassination_board_address1 = this.pages[nr].assassination_board_address1;
	missionVariables.random_hits_assassination_board_address2 = this.pages[nr].assassination_board_address2;
	missionVariables.random_hits_assassination_board_part1 = this.pages[nr].assassination_board_part1;
	missionVariables.random_hits_mark_first_name = this.pages[nr].mark_first_name;
	missionVariables.random_hits_mark_nick_name = this.pages[nr].mark_nick_name;
	missionVariables.random_hits_mark_second_name = this.pages[nr].mark_second_name;
	missionVariables.random_hits_mark_race_part1 = this.pages[nr].mark_race_part1;
	missionVariables.random_hits_mark_race_part2 = this.pages[nr].mark_race_part2;
	missionVariables.random_hits_assassination_board_part2 = this.pages[nr].assassination_board_part2;
	missionVariables.random_hits_assassination_board_part3 = this.pages[nr].assassination_board_part3;
	missionVariables.random_hits_mark_ship_description = this.pages[nr].mark_ship_description;
	missionVariables.random_hits_mark_ship = this.pages[nr].mark_ship;
	missionVariables.random_hits_mark_ship_name = this.pages[nr].mark_ship_name;
	missionVariables.random_hits_mark_ship_ad_name = this.pages[nr].mark_ship_ad_name;
	missionVariables.random_hits_assassination_board_part4 = this.pages[nr].assassination_board_part4;
	missionVariables.random_hits_assassination_board_part5 = this.pages[nr].assassination_board_part5;
	missionVariables.random_hits_mark_fee = this.pages[nr].mark_fee;
	missionVariables.random_hits_assassination_board_part6 = this.pages[nr].assassination_board_part6;
	missionVariables.random_hits_assassination_board_part7 = this.pages[nr].assassination_board_part7;
	missionVariables.random_hits_mark_ship_personality = this.pages[nr].mark_ship_personality;
	missionVariables.random_hits_showship = this.pages[nr].mark_ship;
};

this.positionToDirection = function(pos){
    var pos1 = system.info.coordinates;
    var pos2 = new Vector3D(pos);
    var dx, dy, x2, y2;
    
    dx = pos2.x - pos1.x;
    dy = pos2.y - pos1.y;
    x2 = Math.abs(dx);
    y2 = Math.abs(dy);
    
    if (x2 > 2.41421 * y2){  // x2 > y2 / Math.tan(Math.PI/8)
        return dx > 0? "east" : "west";
    }
    if (y2 > 1.732 * x2){
        return dy < 0? "north" : "south";
    }
    if (dx > 0){
        return dy < 0? "north-east" : "south-east";
    }else{
        return dy < 0? "north-west" : "south-west";
    }
};

this.updateStatus = function (){
		
		//remove the victim from cargo hold
		if (this.showScreen === "killedTarget" || this.showScreen === "freepod") {
			player.ship.manifest["slaves"]--;
		}
		
        // Set the short description back to display current ranking following an completed mission.
        this.$unmarkSystem(missionVariables.random_hits_planetnumber);
        this.resetStoreVariables();
        this.setRank();
        this.updateTitle();
        if (missionVariables.random_hits_score <= 0){
            mission.setInstructionsKey("random_hits_shortdescription9");
        } else {
            mission.setInstructionsKey("random_hits_shortdescription3");
        }
        delete missionVariables.random_hits_status;
};

this.setRank = function (){
    var score = missionVariables.random_hits_score; // missionVariables are slow in processing;
    var rank;
    if (score <= 1) rank = expandDescription("[random_hits_rank1a]")
    else if (score === 2) rank = expandDescription("[random_hits_rank1b]")
    else if (score === 3) rank = expandDescription("[random_hits_rank1c]")
    else if (score === 4) rank = expandDescription("[random_hits_rank1d]")
    else if (score === 5) rank = expandDescription("[random_hits_rank1]")
    else if (score === 6) rank = expandDescription("[random_hits_rank2]")
    else if (score === 7) rank = expandDescription("[random_hits_rank3]")
    else if (score === 8) rank = expandDescription("[random_hits_rank4]")
    else if (score === 9) rank = expandDescription("[random_hits_rank5]")
    else if (score === 10) rank = expandDescription("[random_hits_rank6]")
    else if (score < 101) rank = expandDescription("[random_hits_rank" + (((score - 1) % 10) + 1) + "]");
    else if (score < 150) rank = expandDescription("[random_hits_rank" + (Math.floor((score - 100) / 5) + 1) + "]");
	else rank = expandDescription("[random_hits_rank11]")
    missionVariables.random_hits_currentrank = rank;
};

this.updateTitle = function (){
    var score = missionVariables.random_hits_score;
    var title;
    if (score < 1) title = "random_hits_huntertitle0"
    else if (score < 5) title = "random_hits_huntertitle1"
    else if (score < 101) title = "random_hits_huntertitle"+Math.floor((score-1)/10+2)// one title higher for every 10 points
    else if (score < 150) title = "random_hits_huntertitle12"
    else title = "random_hits_huntertitle13";
    missionVariables.random_hits_playertitle = expandDescription("["+title+"]");
};

this.decreaseCriminalHateBy = function (hate){
    missionVariables.random_hits_criminal_hate_score -= hate;
    if (missionVariables.random_hits_criminal_hate_score < 0){
        missionVariables.random_hits_criminal_hate_score = 0;
    }
};

this.testRevenge = function(){
    //  Roll dice to see if Victim's relatives will take revenge following a hit! 
    if (missionVariables.random_hits_revenge === "YES") return;
    
    // don't revenge if there's no one to be avenged
    if (!missionVariables.random_hits_revenge_mark_first_name) return;
	
    if (missionVariables.random_hits_revenge === "NO" || missionVariables.random_hits_revenge === "KILLED"){
			missionVariables.random_hits_revenge = (Math.random() < 0.33) ? "YES" : "NO";
			missionVariables.random_hits_striketime  = expandDescription("[random_hits_revenge_dice2]");
			missionVariables.random_hits_timer = 0;
			missionVariables.random_hits_criminal_hate_score += this.anyInt(6,10);
            delete missionVariables.random_hits_revenge_warned;
    }    
};

this.evaluateRevengeStatus = function (){
    log(this.name, expandDescription("(Hatred : [mission_random_hits_criminal_hate_score]. Events Timer : [mission_random_hits_events_timer]. Dockings : [mission_random_hits_dockings_number]. Events Number : [mission_random_hits_events_number]. Special Mission Timer : [mission_random_hits_special_mission_timer]. Revenge Status : [mission_random_hits_revenge]. Time to Strike : [mission_random_hits_striketime]. Revenge Jumps Made : [mission_random_hits_timer]. Special Mission : [mission_random_hits_special_mission]. Master Timer : [mission_random_hits_events_timer]. Dice Roll : [mission_random_hits_events_dice])"));
    var hate = missionVariables.random_hits_criminal_hate_score;
    var rank;
    if (hate < 5) rank = "an innocent fighter"
    else if (hate < 25) rank = "an annoyance"
    else if (hate < 50) rank = "a "+expandDescription("[random_hits_notwelcome_para3e]")+" pilot"
    else if (hate < 70) rank = "a target that must be "+expandDescription("[random_hits_complete2]")
    else if (hate < 90) rank = "on their top ten hit list of "+expandDescription("[random_hits_notwelcome_para3e]")+" pilots"
    else rank = "their top priority for being "+expandDescription("[random_hits_complete2]");
    missionVariables.random_hits_triad_rank = rank;
};

this.broadcastBigBossCount = function (){
    // This function is also called by shipscripts so don't change its name !! 
    if (!this.bigBossAttack) return;
    this.countBigBosses();
    if (!player.ship.docked){
        if (missionVariables.random_hits_battle_boss_number === 0 && missionVariables.random_hits_battle_fighter_number === 0){
            player.commsMessage(expandDescription("[random_hits_big_boss_inform_over]"), 10);
        } else {
            player.consoleMessage(expandDescription("[random_hits_big_boss_inform]"), 6);
        }
    }
    delete missionVariables.random_hits_describe_player_kill_count_up;
    delete missionVariables.random_hits_describe_boss_number;
    delete missionVariables.random_hits_describe_fighter_number;
};

this.countBigBosses = function (){
    missionVariables.random_hits_battle_boss_number = system.countShipsWithPrimaryRole("random_hits_big_boss");
    missionVariables.random_hits_battle_fighter_number = system.countShipsWithPrimaryRole("random_hits_big_boss_fighter");
    switch(missionVariables.random_hits_battle_boss_number){
        case 0: missionVariables.random_hits_describe_boss_number = expandDescription("[random_hits_big_boss_inform_no_boss]");
                break;
        case 1: missionVariables.random_hits_describe_boss_number = expandDescription("[random_hits_big_boss_inform_one_boss]");
                break;
        default: missionVariables.random_hits_describe_boss_number = expandDescription("[random_hits_big_boss_inform_many_boss]");
    }
    switch(missionVariables.random_hits_battle_fighter_number){
        case 0: missionVariables.random_hits_describe_fighter_number = expandDescription("[random_hits_big_boss_inform_no_fighters]");
                break;
        case 1: missionVariables.random_hits_describe_fighter_number = expandDescription("[random_hits_big_boss_inform_one_fighters]");
                break;
        default: missionVariables.random_hits_describe_fighter_number = expandDescription("[random_hits_big_boss_inform_many_fighters]");
    }
    switch(missionVariables.random_hits_total_player_boss_kills){
        case 0: missionVariables.random_hits_describe_player_kill_count_up = expandDescription("[random_hits_big_boss_inform_no_kills]");
                break;
        case 1: missionVariables.random_hits_describe_player_kill_count_up = expandDescription("[random_hits_big_boss_inform_one_kill]");
                break;
        default: missionVariables.random_hits_describe_player_kill_count_up = expandDescription("[random_hits_big_boss_inform_many_kills]");
    }
};

this.setThargoidMessages = function (){
    missionVariables.random_hits_thargoid_number = system.countShipsWithPrimaryRole("thargoid");
    missionVariables.random_hits_thargoid_number_close = system.shipsWithPrimaryRole("thargoid", player.ship.dockedStation, 25E3).length;
    if (missionVariables.random_hits_thargoid_number_close === 0){
        this.thargoidAttack = false;
        return "barThargoidAttackEnded";
    } else {
        return "barThargoidAttackInProgress";
    }
};

this.setMiningpodTheftMessages = function (){
    missionVariables.random_hits_miningpodThief_number = system.shipsWithPrimaryRole("random_hits_miningpodThief", player.ship.dockedStation, 25E3).length;
    if (missionVariables.random_hits_miningpodThief_number === 0){
        this.miningpodTheft = false;
        return "miningpodTheftEnded";
    } else {
        return "miningpodTheftInProgress";
    }
};

this.setUpThargoidRewards = function (group){
    // Insert a counter in the script of all groupmember death-actions.
    for (var i = 0; i < group.count; i++){
        var thargoid = group.ships[i];
        if (thargoid.script.shipDied) thargoid.script.randomHitsOriginal = thargoid.script.shipDied;
        thargoid.script.shipDied = function (who, why){ 
            if (who && who.isPlayer){
                missionVariables.random_hits_player_thargoid_kills++;
            }
            if (this.randomHitsOriginal) this.randomHitsOriginal(who, why);
        } 
    }
};

this.setUpMiningpodThief = function (group){
    // convert plain pirates in to miningpod thieves.
    group.name = "Cargo Thieves";
    group.leader = group.ships[0]; // select a random leader
    for (var i = 0; i < group.count; i++){
        var thief = group.ships[i];
        thief.setScript("oolite-random-hits-miningpod-thief.js");
        thief.switchAI("randomhitsminingpodthiefAI.plist");
        thief.primaryRole = "random_hits_miningpodThief";
        thief.bounty = 0; // start clean to not alert the police.
        if (thief.equipmentStatus("EQ_FUEL_SCOOPS") === "EQUIPMENT_UNAVAILABLE") thief.awardEquipment("EQ_FUEL_SCOOPS");
    }
    return group.count;
};

this.setUpBigBossSpacelaneFighter = function (group){
    // convert plain big_boss_fighters (or plain pirates) to their spacelane variant. 
    // these ships are currently unused in the code.
    for (var i = 0; i < group.count; i++){
        var fighter = group.ships[i];
        fighter.setScript("oolite-random-hits-bigboss-fighter.js");
        fighter.switchAI("randomhitsbigbossAI.plist");
        fighter.primaryRole = "random_hits_big_boss_fighter_spacelane";
    }
    return group.count;
};

this.setBigBossMessages = function (){
    missionVariables.random_hits_battle_boss_number = system.countShipsWithPrimaryRole("random_hits_big_boss");
    missionVariables.random_hits_battle_fighter_number = system.countShipsWithPrimaryRole("random_hits_big_boss_fighter");
    log(this.name, "The player killed; " + missionVariables.random_hits_total_player_boss_kills + " bosses");
    
    // If the battle is over do a body count and set up strings to comment on this.
    if (missionVariables.random_hits_battle_boss_number === 0 && missionVariables.random_hits_battle_fighter_number === 0){
        var total_player_boss_kills = missionVariables.random_hits_total_player_boss_kills;
        var kills, prize;
        if (total_player_boss_kills === 0){
            kills = expandDescription("[random_hits_security_bar_text_describe0]");
            prize = expandDescription("[random_hits_big_boss_prize_npc]");
        } else if (total_player_boss_kills === 1){
            kills = expandDescription("[random_hits_security_bar_text_describe1]");
            prize = expandDescription("[random_hits_big_boss_prize_npc1]");
        } else if (total_player_boss_kills < 4){
            kills = expandDescription("[random_hits_total_player_big_boss_kills]");
            prize = expandDescription("[random_hits_big_boss_prize_npc2]");
        } else if (total_player_boss_kills < 7){
            kills = expandDescription("[random_hits_total_player_big_boss_kills]");
            prize = expandDescription("[random_hits_big_boss_prize_npc2]");
        } else {
            kills = expandDescription("[random_hits_total_player_big_boss_kills]");
            prize = expandDescription("[random_hits_big_boss_prize_player]");
        }
        missionVariables.random_hits_describe_total_player_kills = kills;
        missionVariables.random_hits_describe_prize = prize;

        if (total_player_boss_kills < 8){
            missionVariables.random_hits_total_boss_kills = expandDescription("[random_hits_unseen_kills_number]");
        }

        if (missionVariables.random_hits_hunter_kill_score === 0){
            missionVariables.random_hits_security_bar_text_describe_hunter_kills = expandDescription("[random_hits_security_bar_text_describe_hunters0_alt]");
            missionVariables.random_hits_security_bar_text_describe_hunter_kills_pre = expandDescription("[random_hits_security_bar_text_describe_hunters0_pre_none]");
        } else if (missionVariables.random_hits_hunter_kill_score === 1){
            missionVariables.random_hits_security_bar_text_describe_hunter_kills = expandDescription("[random_hits_security_bar_text_describe_hunters1_alt]");
            missionVariables.random_hits_security_bar_text_describe_hunter_kills_pre = expandDescription("[random_hits_security_bar_text_describe_hunters0_pre_some]");
        } else {
            missionVariables.random_hits_security_bar_text_describe_hunter_kills = expandDescription("[random_hits_security_bar_text_describe_hunters2_alt]");
            missionVariables.random_hits_security_bar_text_describe_hunter_kills_pre = expandDescription("[random_hits_security_bar_text_describe_hunters0_pre_some]");
        }
        
        // Following the battle, check if any further bounty payments are due.
        this.calculateBigBossPayments();
        this.bigBossAttack = false;
        return "barAttackEnded";
        
    } else {
        var boss_number = missionVariables.random_hits_battle_boss_number;
        if (boss_number > 2) boss_number = 2;  // boss_number is 0, 1 or 2.
        missionVariables.random_hits_describe_boss_left = expandDescription("[random_hits_security_bar_text_boss_describe"+boss_number+"]");

        var fighter_number = missionVariables.random_hits_battle_fighter_number;
        if (fighter_number > 2) fighter_number = 2;
        missionVariables.random_hits_describe_fighter_left = expandDescription("[random_hits_security_bar_text_fighter_describe"+fighter_number+"]");

        this.calculateBigBossPayments();
        
        // If the Player docks with a battle in progress, count up his kills if any.
        var kill_score = missionVariables.random_hits_hunter_kill_score;
        if (kill_score > 2) kill_score = 2;
        missionVariables.random_hits_security_bar_text_describe_hunter_kills = 
                                        expandDescription("[random_hits_security_bar_text_describe_hunters"+kill_score+"]");
    }
    return "barAttackInProgress";
};

this.clearBigBossDescriptions = function (){
    var deletions = ["criminal_kill_payment", "security_bar_text_describe_kills", "describe_boss_left", "describe_fighter_left", 
    "security_bar_text_describe_payment", "security_bar_text_describe_hunter_kills", "security_bar_text_describe_hunter_kills_pre", 
    "battle_boss_number", "battle_fighter_number"];
    for (var i=0; i<deletions.length; i++) delete missionVariables["random_hits_"+deletions[i]];
    missionVariables.random_hits_criminal_kill_score = 0;
};

this.calculateBigBossPayments = function (){
    var score = missionVariables.random_hits_criminal_kill_score;
    var describe_kills, describe_payment;
    if (score === 0){
        missionVariables.random_hits_criminal_kill_payment = 0;
        describe_kills = expandDescription("[random_hits_security_bar_text_describe0]");
        describe_payment = expandDescription("[random_hits_security_bar_text_describe_payment0]");
    } else if (score === 1){
        missionVariables.random_hits_criminal_kill_payment = this.anyRoundedInt(250, 450);
        describe_kills = expandDescription("[random_hits_security_bar_text_describe1]");
        describe_payment = expandDescription("[random_hits_security_bar_text_describe_payment1]");
    } else if (score < 4){
        missionVariables.random_hits_criminal_kill_payment = this.anyRoundedInt(450, 600);
        describe_kills = expandDescription("[random_hits_security_bar_text_describe2]");
        describe_payment = expandDescription("[random_hits_security_bar_text_describe_payment1]");
    } else if (score < 8){
        missionVariables.random_hits_criminal_kill_payment = this.anyRoundedInt(600, 800);
        describe_kills = expandDescription("[random_hits_security_bar_text_describe2]");
        describe_payment = expandDescription("[random_hits_security_bar_text_describe_payment1]");
    } else {
        missionVariables.random_hits_criminal_kill_payment = this.anyRoundedInt(850, 1050);
        describe_kills = expandDescription("[random_hits_security_bar_text_describe2]");
        describe_payment = expandDescription("[random_hits_security_bar_text_describe_payment1]");
    }
    missionVariables.random_hits_security_bar_text_describe_kills = describe_kills;
    missionVariables.random_hits_security_bar_text_describe_payment = describe_payment;
};

this.$markSystem = function (ID) {
	mission.markSystem({
			   system: ID,
			   name: "Random_Hits",
			   markerColor: "yellowColor",
			   markerScale: 1.0,
			   markerShape: "MARKER_SQUARE"
	});
    this.systemUnmarked = false;
}

this.$unmarkSystem = function (ID) {
    if (this.systemUnmarked) return; // don't unmark twice.
	var ok = mission.unmarkSystem({system: ID, name: "Random_Hits"})
	if (!ok) mission.unmarkSystem(ID); // must be an old legacy marker.
    this.systemUnmarked = true;
}
Scripts/oolite-random-hits-autominer.js
"use strict";
this.name = "oolite-random-hits-autominer";
this.author = "LittleBear, Eric Walch & Thargoid";
this.copyright = "December 2008 - But do what you like with it in your OXPs!";
this.description	= "Stops miners trying to mine the asteroids with mining machines on them.";
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.1";

/*
The autominer no longer scans for the hopper. It now has just a dumb AI that is mainly idle. Not constant 
canning for the hopper saves cpu time. The hopper now finds its target and sends the autominer a
signel to proceed with its AI. After some tome the AI falls back to its idle state.
*/

this.shipSpawned = function ()
{
    this.ship.displayName = expandDescription("[random_hits_autominer_name]"); // Show the Victim's name on the ID Computer when targeted.
    delete this.shipSpawned;
}

this.shipDied = function ()
{
    var pods = Math.round(Math.random()*5);
    var splinters = Math.round(Math.random()*5);
    if (pods > 0) this.ship.spawn("random_hits_mining_pod2", pods);
    if (splinters > 0) this.ship.spawn("splinter", splinters);
}

this.shipBeingAttacked = function (who)
{
    if (!who) return;
    this.ship.bounty = 0;
    if (who.primaryRole === "random_hits_patrol" || who.primaryRole === "miner") 
    {
        who.target = null;
        who.reactToAIMessage("TARGET_LOST"); // Stops hunter or miner odd behaviour. 
        return;		
    }
	if (who.isPlayer) 
    {
        this.ship.reactToAIMessage("ENEMY_ATTACK"); 
        player.bounty |= 25;			
    }		
}

/*
Since 1.74 all missiles for a ship are already created when the mother ship is added to the system. Therefor the maximum
number a ship can carry is reduced. Also the ship gets a certain percentage random, real missiles. That is unwanted here, so  
we start with zero missiles in shipData.plist and add them here before use, so we are sure we fire the right stuff.
*/
this.dumpMiningPod = function () // called by an AI script message.
{
    this.ship.awardEquipment("random_hits_mining_pod_MISSILE"); // load a missile
    this.ship.fireMissile(); // and fire it.
}
Scripts/oolite-random-hits-bigboss-fighter.js
"use strict";
this.name = "oolite-random-hits-bigboss-fighter";
this.author = "LittleBear";
this.copyright = "March 2009 - But do what you like with it in your OXPs!";
this.description	= "Gives Big Boss Criminals Support Fighters an indiviual name on the ID computer and sets them to the right AI.";
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.4";

this.shipSpawned = function ()
{
    //this.ship.name = "Big Boss Fighter";
	this.ship.displayName = this.ship.name+": "+expandDescription("[random_hits_bigboss_fighter_name]"); // Show the Criminal's name on the ID Computer when targeted.
    this.ship.bounty += Math.random()*6+2;
    delete this.shipSpawned;
};

this.shipBeingAttacked = function (who)
{
    if (!who) return;
    if (who.roles.indexOf("bigBos_revenge_clan") > -1) 
    {
        this.ship.reactToAIMessage("FRIENDLY_FIRE");
        return;		
    }

    if (who.primaryRole === "random_hits_spacebar") 
    {
        this.ship.reactToAIMessage("SPACEBAR_ATTACK");
        return;		
    }

	// The AIs of criminals do not react to the nomal "ATTACKED" message, only this special one. They therefore ignore attacks by their own side.	
	this.ship.reactToAIMessage("ENEMY_ATTACK"); 
};

this.shipDied = function (whom)
{
    missionVariables.random_hits_total_boss_kills++;
    
    if (whom && whom.isPlayer)
	{
        missionVariables.random_hits_criminal_hate_score++;
        missionVariables.random_hits_criminal_kill_score++;
        missionVariables.random_hits_total_player_boss_kills++;
        this.ship.commsMessage(expandDescription("[random_hits_criminal_curses]"));
	}
    this.broadcastBigBossCount();
};

this.shipWillEnterWormhole = function ()
{
    this.broadcastBigBossCount();
};

this.broadcastBigBossCount = function ()
{
    // sets variables in the main script + display messages when needed.
    worldScripts["Random_Hits"].broadcastBigBossCount();
};
Scripts/oolite-random-hits-bigboss-guard.js
"use strict";
this.name = "oolite-random-hits-bigboss-guard";
this.author = "LittleBear";
this.copyright = "March 2009 - But do what you like with it in your OXPs!";
this.description	= "Gives Big Boss Criminals Escorts an indiviual name on the ID computer and sets them to the right AI.";
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.4";

this.shipSpawned = function ()
{
    //this.ship.name = "Big Boss escort";
	this.ship.displayName = this.ship.name + ": " + expandDescription("[random_hits_bigboss_guard_name]");
    this.ship.switchAI("randomhitsescort3AI.plist")
    this.ship.bounty += Math.random()*50+50;
    delete this.shipSpawned;
}

this.shipBeingAttacked = function (who)
{
    if (!who) return;
    if (who.roles.indexOf("bigBos_revenge_clan") > -1) 
    {
        this.ship.reactToAIMessage("FRIENDLY_FIRE");
        return;		
    }

    if (who.primaryRole === "random_hits_spacebar") 
    {
        this.ship.reactToAIMessage("SPACEBAR_ATTACK");
        return;		
    }

	// The AIs of criminals do not react to the nomal "ATTACKED" message, only this special one. They therefore ignore attacks by their own side.	
	this.ship.reactToAIMessage("ENEMY_ATTACK"); 
}

this.shipDied = function (whom)
{
    if (whom && whom.isPlayer)
	{
        missionVariables.random_hits_criminal_hate_score += 2;
        missionVariables.random_hits_criminal_kill_score++;
	}
}
Scripts/oolite-random-hits-bigboss.js
"use strict";
this.name = "oolite-random-hits-bigboss";
this.author = "LittleBear";
this.copyright = "March 2009 - But do what you like with it in your OXPs!";
this.description	= "Gives Big Boss Criminals an indiviual name on the ID computer and sets them to the right AI."
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.4";

this.shipSpawned = function ()
{
    //this.ship.name = "Big Boss";
	this.ship.displayName = this.ship.name + ": " + expandDescription("[random_hits_bigboss_name]"); // Show the Criminal's name on the ID Computer when targeted.
    this.ship.bounty += Math.random()*400+73;

	//log("rh", "boss:"+this.ship.displayName);

    delete this.shipSpawned;
};


this.shipBeingAttacked = function (who)
{
    if (!who) return;
    if (who.roles.indexOf("bigBos_revenge_clan") > -1) 
    {
        this.ship.reactToAIMessage("FRIENDLY_FIRE");
        return;		
    }

    if (who.primaryRole === "random_hits_spacebar") 
    {
        this.ship.reactToAIMessage("SPACEBAR_ATTACK");
        return;		
    }

	// The AIs of criminals do not react to the nomal "ATTACKED" message, only this special one. They therefore ignore attacks by their own side.	
	this.ship.reactToAIMessage("ENEMY_ATTACK"); 
};

this.shipDied = function (whom)
{
    missionVariables.random_hits_total_boss_kills++;
    this.ship.commsMessage(expandDescription("[random_hits_criminal_curses]"));
    
    if (whom && whom.isPlayer)
	{
        missionVariables.random_hits_criminal_hate_score += 4;
        missionVariables.random_hits_criminal_kill_score++;
        missionVariables.random_hits_total_player_boss_kills++;
	}
    this.broadcastBigBossCount();
};

this.shipWillEnterWormhole = function ()
{
    this.broadcastBigBossCount();
};

this.broadcastBigBossCount = function ()
{
    // sets variables in the main script + display messages when needed.
    worldScripts["Random_Hits"].broadcastBigBossCount();
};

this.doScan = function () 
{ 
	// create an array with all ships (exclude barrels and rocks) 
	function allShips(entity) {return entity.isShip && entity.scanClass !== "CLASS_ROCK" && entity.scanClass !== "CLASS_CARGO"}; 
	var anyShips = system.filteredEntities(this, allShips, this.ship, this.ship.scannerRange);
    
    // anyShips now holds all real ships in scanner range. From now only analyse this small list further to save time.
    
    // Unlike AI scans, this scan already sets the target. So don't use "setTargetToFoundTarget" because the foundTarget
    // could be something completely unexpected that was left behind from a previous scan.

	// do player first.
	function isPlayer(entity) {return entity.isPlayer}; 
    var playerPresent = (anyShips.filter(isPlayer).length > 0);
    if (playerPresent && Math.random()>0.66) //find the player in 1 out of 3 scans
    {
        this.ship.target = player.ship;
        this.ship.reactToAIMessage("CLEAN_SHIP_FOUND"); // player needs not to be clean to be found.
        return;
    }

	// do clean ships when no player found.
	function cleanShips(entity) {return entity.bounty === 0};
    var cleans = anyShips.filter(cleanShips); 
    if (cleans.length > 0){
        this.ship.target = cleans[Math.floor(Math.random()*cleans.length)];
        this.ship.reactToAIMessage("CLEAN_SHIP_FOUND");
    } else {
        this.ship.reactToAIMessage("NOTHING_FOUND");
    }
};
Scripts/oolite-random-hits-guard.js
"use strict";
this.name = "oolite-random-hits-guard";
this.author = "LittleBear";
this.copyright = "September 2008 - But do what you like with it in your OXPs!";
this.description	= "Gives each of a Mark's Guards an indiviual name on the ID computer, sets them to the right AI and stops a kill of an escort being treated as a kill of the Mark.";
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.4";

this.shipSpawned = function ()
{
    //this.ship.name = "Mark escort";
	this.ship.displayName = this.ship.name + ": " + expandDescription("[random_hits_guard_name]");
    this.ship.bounty += Math.ceil(Math.random()*10);
    this.leader = this.ship.group.leader.displayName;
    delete this.shipSpawned;
};

this.shipBeingAttacked = function (whom)
{
    if (missionVariables.random_hits_status === "RUNNING")
    {
        /* As the Mark and his escorts are all part of the same group the game will regard an attack on an escort as an
        attack on the Mark. To get round this an attack on an escort ship resets the variable. Only an attack on the
        Mark himself will therefore cause the variable to be set. The ships still act as a group and defend each other.
        Shooting the ship after the leader died has no effect.
        */
        if (this.ship.group && this.ship.group.leader)
        {
            this.ship.group.leader.script.random_hits_whoshot = "NPC_ATTACK";
        }
    }
};

this.playerWillEnterWitchspace = function (){
    if (missionVariables.random_hits_status === "COMPLETE"){
        // player jumped to another system while the leader or its pod is killed but the guard is not.
        log(this.name, "The mark escort with name: "+this.ship.displayName+" wants to say that the player killed his boss: "+this.leader);
        missionVariables.random_hits_criminal_hate_score += 2; // player left withness of the kill behind.
    }
};
Scripts/oolite-random-hits-hopper.js
"use strict";
this.name = "oolite-random-hits-hopper";
this.author = "LittleBear, Eric Walch & Thargoid";
this.copyright = "November 2008 - But do what you like with it in your OXPs!";
this.description	= "Sets the GalMine Hopper to the correct AI and causes it to ignore friendly fire.";
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.2";

/*
The hopper is part of the station group with the seedy bar as its group leader. Programming it this we never have to scan 
for the mother as we always have a direct link over the group.
*/

this.shipSpawned = function ()
{
    this.ship.displayName = expandDescription("[random_hits_hopper_name]") // Show the Hopper's Registration on the ID Computer when targeted.
    delete this.shipSpawned;
}

this.shipBeingAttacked = function (who)
{
    if (!who) return;
    if ((who.group && this.ship.group && who.group === this.ship.group) || who.isPolice) 
    {
        this.ship.reactToAIMessage("FRIENDLY_FIRE");
        this.ship.bounty = 0
        return;		
    }
    if (who.isPlayer) 
    {
        player.bounty |= 25;			
    }		
    // The AIs of the bars and hunters do not react to the nomal "ATTACKED" message, only this special one. 
    // They therefore ignore attacks by their own side.
    this.ship.reactToAIMessage("ENEMY_ATTACK");	
    this.ship.bounty = 0;
}

this.shipDied = function (who, cause)
{
    if (this.ship.group && this.ship.group.leader)
    {
        this.ship.group.leader.script.hopperLaunch = true; // tell mom to launch a replacement.
    }
    log(this.name, "The miningHopper: "+this.ship.displayName+" was killed by "+who+" because of "+cause);
}

this.getNewCoordinates = function ()
{
    var pos;
    if (this.ship.group && this.ship.group.leader) 
    {
        pos = this.ship.group.leader.position; // bar position
    }
    else
    {
        pos = this.ship.position; // happens only when the bar has exploded
        this.ship.reactToAIMessage("FLY_HOME"); // we lost the bar. It's now pointless to stay around.
    }
    
    pos = pos.add(Vector3D.randomDirection(15E3));
    this.ship.savedCoordinates = pos;
}

this.signalArrival = function ()
{
    if (this.ship.target)
    {
        this.ship.target.target = this.ship;
        this.ship.target.reactToAIMessage("HOPPER_ARRIVED");
    }
}
Scripts/oolite-random-hits-hunter.js
"use strict";
this.name = "oolite-random-hits-hunter";
this.author = "LittleBear, Eric Walch & Thargoid";
this.copyright = "November 2008 - But do what you like with it in your OXPs!";
this.description	= "Gives the Bounty Hunter NPCs from the Space Bars an individual name and rank on the ID computer and sets them to the right AI. Also causes hunters to regard hits from the spacebar's turret gunners or other hunters as friendly fire and ignore rather than attack."
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.4";
 
/*
Oolites random generator has a flaw that it is regularly reset by ships asking for the witchspace location. 
This results in that "random" descriptions often give the same result. This problem is not present on system
setup, but after ships starting to fly. And because this ship is added afterwards by launching from a
seedy bar, they tend to get the same name. I tryed to fix this by first doing a random number of string
expansions. Its easy fixable in Oolite itself but other oxp's might want the predictable "randomness"
that is different for different systems.
*/

this.shipSpawned = function ()
{
    //this.ship.name = "Random Hits Patrol";
    var count = Math.round(Math.random()*15);
	var level = parseInt(this.ship.scriptInfo.level);
	var name = "";
	if (0 < oolite.compareVersion("1.75.4"))
	{
		// Before 1.75.4 radomness of string expantions at this point was bad.
		for (var i=0; i<count; i++) name = expandDescription("[nom11]"); // mix up the random generator.
	}
	switch(level)
	{
		case 1: name = expandDescription("[random_hits_hunterlow_name]"); break;
		case 2: name = expandDescription("[random_hits_huntermedium_name]"); break;
		case 3: name = expandDescription("[random_hits_hunterhigh_name]"); break;
		default: name = "unknown"; // means a wrong level definition in shipData.plist. 
	}
	this.ship.displayName = this.ship.name+": "+name; // Show the Hunters name on the ID Computer when targeted.
	
    this.legalPenalty = 4*count + 25;
    delete this.shipSpawned;
}

this.shipBeingAttacked = function(who)
{
    if (!who) return;
    this.ship.bounty = 0;
    if (who.primaryRole === "random_hits_patrol") 
    {
        this.ship.reactToAIMessage("FRIENDLY_FIRE");
        if (who.target == this.ship) who.reactToAIMessage("TARGET_LOST");
        return;		
    }
	if (who.isPolice) 
    {
        this.ship.reactToAIMessage("FRIENDLY_FIRE");
        if (who.target == this.ship) who.reactToAIMessage("TARGET_LOST");
        return;		
    }
				
    if (who.primaryRole === "random_hits_spacebar")
    {
        this.ship.reactToAIMessage("FRIENDLY_FIRE");
        who.reactToAIMessage("TARGET_LOST");
        if (who.target == this.ship) who.reactToAIMessage("TARGET_LOST");
        return;		
    }
	if (who.isPlayer) 
    {
        this.ship.reactToAIMessage("ENEMY_ATTACK"); 
        player.bounty |= this.legalPenalty;
        return;		
    }				
    else
    {
        this.ship.reactToAIMessage("ENEMY_ATTACK"); // The AIs of the bars and hunters do not react to the nomal "ATTACKED" message, only this special one. They therefore ignore attacks by their own side.	
    }
}

this.shipDied = function (whom)
{
	missionVariables.random_hits_hunter_kill_score++

    if (whom && whom.isPlayer)
	{
        missionVariables.random_hits_criminal_hate_score -= parseInt(this.ship.scriptInfo.hateScore);
        player.bounty += parseInt(this.ship.scriptInfo.bounty);
	}
}

this.shipWillEnterWormhole = function ()
{
    if (this.ship.group && this.ship.group.leader && this.ship.group.leader.script.name === "oolite-random-hits-spacebar")
    {
        // increase the available patrol count of the spacebar when it is part of the spacebar group.
        this.ship.group.leader.script.patrols++;
        this.ship.group = null; // release from the group after jumping.
    }
};

this.doScan = function () 
{ 
	// create an array with all ships (exclude barrels and rocks) 
	function allShips(entity) {return entity.isShip && entity.scanClass !== "CLASS_ROCK" && entity.scanClass !== "CLASS_CARGO"}; 
	var anyShips = system.filteredEntities(this, allShips, this.ship, this.ship.scannerRange);
    
    // anyShips now holds all real ships in scanner range. From now only analyse this small list further to save time.
    
    // Unlike AI scans this scan already sets the target. so don't use "setTargetToFoundTarget" because the foundTarget
    // could be something completely unexpected that was left behind from a previous scan.

	// do player first.
	function isPlayer(entity) {return entity.isPlayer}; 
    var playerPresent = (anyShips.filter(isPlayer).length > 0);
    if (playerPresent && player.ship.bounty > 0)
    {
        this.ship.target = player.ship;
        this.ship.reactToAIMessage("OFFENDER_FOUND");
        return;
    }

	// do fugitive ships (Most thargoids are also fugitive, so noneed for a special scan)
	function fugitiveShips(entity) {return entity.bounty > 64};
    var fugitives = anyShips.filter(fugitiveShips); 
    if (fugitives.length > 0){
        this.ship.target = fugitives[Math.floor(Math.random()*fugitives.length)];
        this.ship.reactToAIMessage("OFFENDER_FOUND");
        return;
    } 
    
    // do offender ships, forget about minor offenders.
	function offenderShips(entity) {return entity.bounty > 5}; 
    var offenders = anyShips.filter(offenderShips); 
    if (offenders.length > 0){
        this.ship.target = offenders[Math.floor(Math.random()*offenders.length)];
        this.ship.reactToAIMessage("OFFENDER_FOUND");
    } else {
        this.ship.reactToAIMessage("NOTHING_FOUND");
    }
};

/*
Get exit coordinates at a random location on a sphere round the station. This is called 3 times after a fight. That way the
ship makes 3 random patrol legs around the station before jumpung out. It is scanning during these patrols, but probably
the scanning by the hunters can be omitted as the station also scanns and issues a groupAttackShip to its
hunters when it finds a target. By also letting the hunters scan, they will be able to find ships outside the bar's scan range.
*/
this.getPatrolCoordinates = function ()
{
    var pos;
    if (this.ship.group && this.ship.group.leader) 
    {
        pos = this.ship.group.leader.position; // bar position
    }
    else
    {
        pos = this.ship.position; // happens only when the bar has exploded
    }
    
    pos = pos.add(Vector3D.randomDirection(20E3));
    this.ship.savedCoordinates = pos;
};

this.getExitCoordinates = function ()
{
    var pos;
    if (this.ship.group && this.ship.group.leader) 
    {
        pos = this.ship.group.leader.position; // bar position
        var direction = this.ship.position.subtract(pos).direction(); // unit vector pointing from bar to ship.
        pos = pos.add(direction.multiply(35E3));
    }
    else
    {
        pos = this.ship.position; // happens only when the bar has exploded
    }
    
    this.ship.savedCoordinates = pos;
}
Scripts/oolite-random-hits-mark.js
"use strict";
this.name = "oolite-random-hits-mark";
this.author = "LittleBear";
this.copyright = "September 2008 - But do what you like with it in your OXPs!";
this.description	= "Tests who destroyed a RandomHits OXP Victim Ship and how they did it. The main script acts on the setting of variables.";
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.8";

//2.8 fixed mark naming when random shipnames oxp is not present. -spara-

/*
All the marks have a similar AI. The only difference is the random factor in decicions. So instead of maintaining 6 versions of
the AI it is easyer to just have one AI that calls the shipscript for making the desicions. The level of the target is defined
in the script_info of ships in  shipData.plist.
Level 1 marks had two different scripts. The 1s version had a higher tendency to beg for life than the 1 version and I gave it a level 0 value
for the differentiation between both. (it was only the boy-racer with the 1s script) The 2a and the 3a version had just no "fireMissile" command.
Therefor I introduced a "hasExtraMissileLauncher" variable. Now all ships call the scriptMessage to fire a missile, but only those that used
to fire missiles by AI will actually fire missiles. 1.74 will also allow missile manipulation so you could create a ship that always selects a
random type of the installed missiles.
*/

this.shipSpawned = function ()
{
	
    //this.ship.name = "Random Hits Mark"; // name only visible in debugging logs.
    if (!worldScripts.randomshipnames)
		this.ship.displayName = this.ship.name + ": " + expandDescription("[random_hits_main_name]");
	else
		this.ship.displayName = missionVariables.random_hits_store_mark_ship_name;
	// Show the Criminal's name on the ID Computer when targeted.
		
    this.random_hits_whoshot = "NO_ATTACK"; // start with assuming its no-attack.
    // this.ship.inspect(); // this line opens the target inspector on a mac with the debugConsole.oxp installed
    this.hasExtraMissileLauncher = this.ship.scriptInfo.extraMissileLauncher;
    if (this.hasExtraMissileLauncher === "no") this.hasExtraMissileLauncher = false; // test needed in case the code is in open-step plist
    this.level = parseInt(this.ship.scriptInfo.markLevel); // the level of the mark.
    this.ship.accuracy = this.level * ( 1 + 4 * missionVariables.random_hits_markposition / 100) - 6; // -4.6 till 7.8
    delete this.shipSpawned;
}

this.shipBeingAttacked = function (who)
{
    if (!who) return;
    if (who.isPlayer)
    {
        this.random_hits_whoshot = "PLAYER_ATTACK"; // Shooter was the player not using an e-bomb, q-mine or cloak. The variable remains undefined if the player e-bombs, q-mines or kills the victim whilst cloaked as thisBeingAttacked does not get run. The main script then awards the player the credit for the kill, but fines him for dishonerable conduct!
    }
    else
    {
        this.random_hits_whoshot = "NPC_ATTACK"; // Shooter was NPC ship. Every time the victim is hit, the variable is reset. Once he's dead the variable is not longer reset. So the last ship to hit him was also the killer!
        log(this.name, "Mark was hit by: "+who);
    }
};

this.shipDied = function (whom, cause)
{
    log(this.name, "Mark was killed by: " + whom + " Because of: " + cause + ". Last recorded hit: "+this.random_hits_whoshot);
    if (whom && whom.isPlayer)
    {
        if (this.random_hits_whoshot === "NPC_ATTACK" || cause === "cascade weapon")
        // Player has finished off a Mark attacked by an NPC or with an e-bomb or by q-bomb.
        // The Player is credited with the kill, but as he's a cowardly custard he is fined and he won't earn any points for completing this hit!
        {
            missionVariables.random_hits_status = "COMPLETE"; // Record the fact that the Victim's ship has been destroyed.
            worldScripts["Random_Hits"].$unmarkSystem(missionVariables.random_hits_planetnumber);
            player.credits -= missionVariables.random_hits_fine;
            mission.setInstructionsKey("random_hits_shortdescription2", "Random_Hits"); // Update the mission info.
            player.consoleMessage(expandDescription("[random_hits_complete_ebomb]"));
            missionVariables.random_hits_store_skill = 0;
        }
        else // The player did a honest kill...
        {
            if (Math.random() < parseFloat(this.ship.scriptInfo.podChance)) // Chance of Victim making it to his pod.
            {
                log(this.name, "Mark podded out of his ship");
                missionVariables.random_hits_status = "PODEDOUT"; // Set the variable to reflect that the player still needs to kill or scoop the Pod!
                this.ship.awardEquipment("EQ_ESCAPE_POD"); // Award an escape capsule
                this.ship.abandonShip(); // and bail out. Any shooting or scooping of the Pod is handled by the Pod's own Script.
                mission.setInstructionsKey("random_hits_shortdescription4", "Random_Hits"); // Update the mission info.
                player.consoleMessage(expandDescription("[random_hits_poded]"));
                return;

            }

            if (Math.random() < parseFloat(this.ship.scriptInfo.qmineChance)) // Chance of Victim dropping a q-mine.
            {	
                this.ship.spawnOne("RANDOM_HITS_MINE"); // Spawn a Q-Mine which taunts the player before exploding! Nasty!
            }
            missionVariables.random_hits_status = "COMPLETE"; // Record the fact that the Victim's ship has been destroyed.
            worldScripts["Random_Hits"].$unmarkSystem(missionVariables.random_hits_planetnumber);
            mission.setInstructionsKey("random_hits_shortdescription2", "Random_Hits"); // Update the mission info.
            player.consoleMessage(expandDescription("[random_hits_complete_comms]"));
        }
        this.setRevengeMark();
    }
    else // whom is not the player
    {
        if (this.random_hits_whoshot === "NPC_ATTACK") // If an NPC fired the fatal shot ...
        {	
            missionVariables.random_hits_deathcause = expandDescription("[random_hits_deathcause]");
            mission.setInstructionsKey("random_hits_shortdescription6", "Random_Hits"); // Update the mission info.
            player.consoleMessage(expandDescription("[random_hits_npckill]"));
        }
        else // Deals with any other situation where cause of death was neither the player nor an NPC Laser. EG: Victim did somthing silly like crashing, burnt up near the Sun or some other odd death!
        {	
            missionVariables.random_hits_deathcause = expandDescription("[random_hits_deathcause_accident]");
            mission.setInstructionsKey("random_hits_shortdescription6a", "Random_Hits"); // Update the mission info.
            player.consoleMessage(expandDescription("[random_hits_accident]"));
        }
        missionVariables.random_hits_status = "NPCKILL"; // Record the fact that the Victim's ship has been destroyed.
        missionVariables.random_hits_npcdays = clock.days;
        worldScripts["Random_Hits"].$unmarkSystem(missionVariables.random_hits_planetnumber);
    }
};

this.shipWillEnterWormhole = function ()
{
    log(this.name, "Mark has jumped out of the "+system.info.name+" system.");
    // If the mark jumped out of the system, set the mission description to tell the player to follow him.
    missionVariables.random_hits_status = "JUMPED";
    mission.setInstructionsKey("random_hits_shortdescription7", "Random_Hits"); // Update the mission info.
    player.consoleMessage(expandDescription("[random_hits_jumped_comms]"));
    worldScripts["Random_Hits"].$unmarkSystem(missionVariables.random_hits_planetnumber);
};

this.shipExitedWormhole = function ()
{
    log(this.name, "Mark has jumped into the "+system.info.name+" system.");
    // when the mark jumped enough to become clean, let him play the innocent trader. 
    if (this.ship.bounty === 0)
    {
        this.ship.switchAI("route1traderAI.plist");
        system.addShips("police", 1);
        system.addShips("hunter", 2);
    }
};

this.setRevengeMark = function(){
    missionVariables.random_hits_revenge_mark_first_name = missionVariables.random_hits_store_mark_first_name;
    missionVariables.random_hits_revenge_mark_second_name = missionVariables.random_hits_store_mark_second_name;
};

this.fireMissile = function (){
    // just give some ships the ability to fire missiles at will by the AI, not all.
    if (this.hasExtraMissileLauncher) this.ship.fireMissile();
};


/*
    below are chace functions called by AI, based on mark levels.
    Level 0 is a special case of level 1 that is only used for some ships but are part
    of the easy targets in the mission screens.
*/
this.reactToPlayer = function ()
{
    var chance = Math.random();
    switch(this.level)
    {
        case 0:
        case 1:
        {
            if (chance < 0.66) this.ship.reactToAIMessage("ON_COURSE")
            else if (chance < 0.88) this.ship.reactToAIMessage("FIGHT_PLAYER")
            else this.ship.reactToAIMessage("FLEE_PLAYER");
            break;
        }
        case 2:
        {
            if (chance < 0.11) this.ship.reactToAIMessage("ON_COURSE")
            else if (chance < 0.66) this.ship.reactToAIMessage("FIGHT_PLAYER")
            else this.ship.reactToAIMessage("FLEE_PLAYER");
            break;
        }
        case 3:
        {
            if (chance < 0.22) this.ship.reactToAIMessage("ON_COURSE")
            else this.ship.reactToAIMessage("FIGHT_PLAYER");
            break;
        }
        default:
        {
            this.ship.reactToAIMessage("FIGHT_PLAYER");
            break;
        }
    }
}

this.reactToPlayerAttack = function ()
{
    var chance = Math.random();
    switch(this.level)
    {
        case 0:
        case 1:
        {
            if (chance < 0.77) this.ship.reactToAIMessage("FIGHT_PLAYER")
            else this.ship.reactToAIMessage("FLEE_PLAYER");
            break;
        }
        case 2:
        case 3:
        {
            if (chance < 0.88) this.ship.reactToAIMessage("FIGHT_PLAYER")
            else this.ship.reactToAIMessage("FLEE_PLAYER");
            break;
        }
        default:
        {
            this.ship.reactToAIMessage("FIGHT_PLAYER");
            break;
        }
    }
}

this.markHurt = function ()
{
    var chance = Math.random();
    switch(this.level)
    {
        case 0:
        {
            if (chance < 0.37) this.ship.reactToAIMessage("BEG_FOR_LIFE")
            else if (chance < 0.59) this.ship.reactToAIMessage("FLEE_PLAYER")
            else if (chance < 0.58) this.ship.reactToAIMessage("FIGHT_PLAYER")
            else this.ship.reactToAIMessage("JUMP_OUT");
            break;
        }
        case 1:
        {
            if (chance < 0.33) this.ship.reactToAIMessage("BEG_FOR_LIFE")
            else if (chance < 0.55) this.ship.reactToAIMessage("FLEE_PLAYER")
            else if (chance < 0.77) this.ship.reactToAIMessage("FIGHT_PLAYER")
            else this.ship.reactToAIMessage("JUMP_OUT");
            break;
        }
        case 2:
        {
            if (chance < 0.11) this.ship.reactToAIMessage("BEG_FOR_LIFE")
            else if (chance < 0.33) this.ship.reactToAIMessage("FLEE_PLAYER")
            else if (chance < 0.66) this.ship.reactToAIMessage("FIGHT_PLAYER")
            else this.ship.reactToAIMessage("JUMP_OUT");
            break;
        }
        case 3:
        {
            if (chance < 0.11) this.ship.reactToAIMessage("BEG_FOR_LIFE")
            else if (chance < 0.66) this.ship.reactToAIMessage("FIGHT_PLAYER")
            else this.ship.reactToAIMessage("JUMP_OUT");
            break;
        }
        default:
        {
            this.ship.reactToAIMessage("FIGHT_PLAYER");
            break;
        }
    }
}

this.fleeMine = function ()
{
    var chance = Math.random();
    switch(this.level)
    {
        case 0:
        case 1:
        {
            if (chance < 0.5) this.ship.reactToAIMessage("JUMP_OUT")
            else this.ship.reactToAIMessage("MINE_RUN");
            break;
        }
        case 2:
        case 3:
        {
            if (chance < 0.66) this.ship.reactToAIMessage("JUMP_OUT")
            else this.ship.reactToAIMessage("MINE_RUN");
            break;
        }
        default:
        {
            this.ship.reactToAIMessage("JUMP_OUT");
            break;
        }
    }
}
Scripts/oolite-random-hits-minesweeper.js
"use strict";
this.name = "oolite-random-hits-minesweeper";
this.author = "LittleBear, Eric Walch & Thargoid";
this.copyright = "November 2008 - But do what you like with it in your OXPs!";
this.description	= "Stops some rare silly NPC behaviour involving minesweepers! When jumping out after a battle hunters pick a random object to fly away from, having orientated in a random direction. This is just to stop them creating a wormhole right in front of a bar, which then any hunters launched fly straight into. For some reason I can't quite figure out, occasionally they fire at minesweepers with their rear gun whilst flying to jump distance. This looks silly so this script stops them. (scanclass is set to CLASS_CARGO to prevent miners firing at it but, class_cargo also prevent ships from finding it in a scan for a role.)";
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.1";

this.quirium = ["EQ_QC_MINE", "EQ_CASCADE_MISSILE", "EQ_LAW_MISSILE", "EQ_OVERRIDE_MISSILE", "energy-bomb", "RANDOM_HITS_MINE"];

this.shipBeingAttacked = function (who)
{
    if (!who) return;
    this.ship.bounty = 0
    if (who.primaryRole === "random_hits_patrol") 
    {
        log(this.name, "A patrol ship with target: "+who.target+" hit a minesweeper.");
        who.target = null;
        who.reactToAIMessage("LOST_TARGET"); // Stops hunter odd behaviour. 
        return;		
    }
    if (who.isPlayer) 
    {
        this.ship.reactToAIMessage("ENEMY_ATTACK"); 
        player.bounty |= 25;
    }		
}

this.doScan = function () 
{ 
	// create an array with all weapons in range.
	function allShips(entity) {return entity.isShip && entity.isWeapon}; 
	var missiles = system.filteredEntities(this, allShips, this.ship, this.ship.scannerRange);

    for (var i = 0; i < missiles.length; i++)
    {
        if (this.quirium.indexOf(missiles[i].primaryRole) > -1) 
        {
            this.ship.commsMessage(expandDescription("[random_hits_mine_found]"));
            missiles[i].explode();
            this.ship.fireECM();
            break; // found one
        }
    }
}

this.thargoidScan = function () 
{ 
	// create an array with all thargoids in range.
	function allShips(entity) {return entity.isShip && entity.isThargoid}; 
	var thargoids = system.filteredEntities(this, allShips, this.ship, this.ship.scannerRange);

    for (var i = 0; i < thargoids.length; i++)
    {
        if (thargoids[i].hasRole("secondWave_mineTharglet")) 
        {
            this.ship.commsMessage(expandDescription("[random_hits_mine_found2]"));
            thargoids[i].explode();
            this.ship.fireECM();
            break; // found one
        }
    }
}
Scripts/oolite-random-hits-miningpod-thief.js
"use strict";
this.name = "oolite-random-hits-miningpod-thief";
this.author = "LittleBear, Eric Walch & Thargoid";
this.copyright = "November 2008 - But do what you like with it in your OXPs!";
this.description	= "This script is attached to random ships with a 'pirate' role."
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.5";

this.shipSpawned = function ()
{
    //this.ship.name = "Miningpod thief";

	this.ship.displayName = this.ship.name + ": " + expandDescription("[random_hits_bigboss_fighter_name]");
	// Show the Criminal's name on the ID Computer when targeted.
    delete this.shipSpawned;
}

this.shipDied = function (who, cause)
{
    if (who && who.isPlayer){
        missionVariables.random_hits_miningpodThief_player_kill++;
        this.ship.commsMessage(expandDescription("[random_hits_criminal_curses]"));
    }
}

this.signalArrival = function ()
{
    if (this.ship.target)
    {
        this.ship.target.target = this.ship;
        this.ship.target.reactToAIMessage("HOPPER_ARRIVED"); // this is a lie!
    }
}

this.shipScoopedOther = function (pod)
{
    // log(this.name, this.ship.name + " scooped up: " + pod.name);
    this.ship.bounty += Math.ceil(Math.random()*70)/10;
}
Scripts/oolite-random-hits-miningpod.js
"use strict";
this.name = "oolite-random-hits-miningpod";
this.author = "LittleBear";
this.copyright = "December 2008 - But do what you like with it in your OXPs!";
this.description	= "Fines scoopers of GalMine AutoPay Pods for the theft."
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.2";

this.shipSpawned = function ()
{
    if (Math.random() < 0.1) this.ship.switchAI("homeAI.plist");
    this.ship.setCargo("Minerals", 1);
    delete this.shipSpawned;
    // log(this.name, "Pod created by: "+this.ship.owner.name);
};

this.shipWasScooped = function (scooper)
{
	if (scooper.isPlayer)
	{
        if (player.ship.cargoSpaceAvailable >= 1 && !this.wasScooped)
        {
            manifest["machinery"]++;
            this.wasScooped = true; // only award machinery once
        }
		player.consoleMessage(expandDescription("[random_hits_pod_theft]"), 4);
	}
    var barMember = this.isBarGroupMember(scooper);
    //log(this.name, "Pod scooped by: "+scooper.name+ " who is barmember: "+barMember);
    if (!barMember) scooper.bounty += Math.ceil(Math.random()*250)/10;
};

this.shipDied  = function (who, why)
{
  	if (!who || !why || why != "energy damage") return;
    var barMember = this.isBarGroupMember(who);
    if (!barMember) who.bounty += Math.ceil(Math.random()*250)/10;
};

this.isBarGroupMember = function (ship)
{
    if (ship.group && ship.group.leader && ship.group.leader.primaryRole === "random_hits_spacebar") return true;
    return false;
};
Scripts/oolite-random-hits-pod.js
"use strict";
this.name = "oolite-random-hits-pod1";
this.author = "LittleBear";
this.copyright = "September 2008 - But do what you like with it in your OXPs!";
this.description	= "Tests who killed or scooped a RandomHits OXP Escape Pod carring the mission target and how they did it. The main script acts on the setting of variables."
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.3";

//2.3 fixed deathcause error
//2.2 podded criminal's name is preserved for revenge

this.shipSpawned = function ()
{
	missionVariables.random_hits_store_showship = this.ship.scriptInfo.podType // The ship the victim is flying is shown on mission briefing screens. So I switch the ship to a Pod as he's now abandoned ship.
    this.ship.displayName = expandDescription("[random_hits_escape_name]") // Show the Victim's name on the ID Computer when targeted.
	delete this.shipSpawned;
}

this.shipWasScooped = function (scooper)
{
	if (missionVariables.random_hits_status == "PODEDOUT") // first check if the mission is still running
    {
        if (scooper.isPlayer)
        {
            mission.setInstructionsKey("random_hits_shortdescription8", "Random_Hits"); // Update the mission info.
            player.consoleMessage(expandDescription("[random_hits_scooped_comms]"));
            missionVariables.random_hits_status = "SCOOPED";
            //no point in rewarding for just scooping the pod. this is moved to the script to trigger when the player delivers the pod.  -spara-
            //missionVariables.random_hits_store_skill++;
        }
        else
        {
			missionVariables.random_hits_deathcause = expandDescription("[random_hits_deathcause_scoop]");
            mission.setInstructionsKey("random_hits_shortdescription6", "Random_Hits"); // Update the mission info.
            missionVariables.random_hits_npcdays = clock.days;
            player.consoleMessage(expandDescription("[random_hits_npckill]"));
            missionVariables.random_hits_status = "NPCKILL";
        }
        this.setRevengeMark();
        mission.unmarkSystem({system: missionVariables.random_hits_planetnumber, name: "Random_Hits"});
    }
}

this.shipWasDumped = function(dumper) {
	mission.setInstructionsKey("random_hits_shortdescription4", "Random_Hits"); // Update the mission info.
	missionVariables.random_hits_status = "PODEDOUT";
}

this.shipDied = function (whom, cause)
{
    log(this.name, "Pod was killed by: "+whom+" Because of: "+cause);
	if (missionVariables.random_hits_status === "PODEDOUT") // first check if the mission is still running. the second check is for case when player scoops the escape pod and then jettisons it.
    {
        if (whom && whom.isPlayer && cause !== "cascade weapon")
        {
            missionVariables.random_hits_status = "COMPLETE"; // Record the fact that the Victim's ship has been destroyed.
            mission.setInstructionsKey("random_hits_shortdescription2", "Random_Hits"); // Update the mission info.
            player.consoleMessage(expandDescription("[random_hits_complete_comms]"));
        }
        else
        {	
            missionVariables.random_hits_status = "NPCKILL"; // Record the fact that the Victim's ship has been destroyed.
            missionVariables.random_hits_deathcause = expandDescription("[random_hits_deathcause]");
            mission.setInstructionsKey("random_hits_shortdescription6", "Random_Hits"); // Update the mission info.
            player.consoleMessage(expandDescription("[random_hits_npckill]"));
            missionVariables.random_hits_npcdays = expandDescription("[clock_days_number]");
        }
        this.setRevengeMark();
        mission.unmarkSystem({system: missionVariables.random_hits_planetnumber, name: "Random_Hits"});
    }
}

this.setRevengeMark = function(){
    missionVariables.random_hits_revenge_mark_first_name = missionVariables.random_hits_store_mark_first_name;
    missionVariables.random_hits_revenge_mark_second_name = missionVariables.random_hits_store_mark_second_name;
};
Scripts/oolite-random-hits-revenge.js
"use strict";
this.name = "oolite-random-hits-revenge";
this.author = "LittleBear";
this.copyright = "September 2008 - But do what you like with it in your OXPs!";
this.description	= "Gives a ship appearing to take revenge for a previous victim an indiviual name on the ID computer."
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.5";

//2.5 fixed a small bug when timer and striketimer are nullified. -spara-

/*
Script is used both by the revenge ships as well as by its escorts.
*/
this.shipSpawned = function ()
{
    if (this.ship.primaryRole === "escort") 
    {

		this.ship.displayName = this.ship.name + ": " + expandDescription("[random_hits_guard_name]");
        this.ship.bounty += Math.random()*4+1;
        delete this.shipDied; // we don't want this code for the revenge escorts
    }
    else
    {
		this.ship.displayName = this.ship.name + ": " + expandDescription("[random_hits_revenge_name]");
        this.ship.bounty += Math.random()*15+8; // Boosts the Criminals bounty set in shipdata by a random number between 8 and 23.
    }
    delete this.shipSpawned;
}

this.shipBeingAttacked = function (who)
{
    if (!who) return;
    if (who.roles.indexOf("spacebar_clan") > -1) 
    {
        this.ship.reactToAIMessage("FRIENDLY_FIRE");
        return;		
    }

    if (who.primaryRole === "random_hits_spacebar") 
    {
        this.ship.target = who;
        this.ship.reactToAIMessage("SPACEBAR_ATTACK");
        return;		
    }

	// The AIs of criminals do not react to the nomal "ATTACKED" message, only this special one. They therefore ignore attacks by their own side.	
	this.ship.reactToAIMessage("ENEMY_ATTACK"); 
}

this.shipDied = function (whom)
{
    if (--missionVariables.random_hits_revenge_count <= 0)
    {
        // last ship died, clear variables.
        missionVariables.random_hits_timer = 0;
        missionVariables.random_hits_striketime = "NOT_NOW";
        missionVariables.random_hits_revenge_mark_first_name = null;
        missionVariables.random_hits_revenge_mark_second_name = null;
        missionVariables.random_hits_revenge_warned = null;
        missionVariables.random_hits_revenge = "KILLED"; // Clear all revenge variables, so once a Revenge Ship is killed it won't appear again.
        missionVariables.random_hits_revenge_count = null;
    }

    if (whom && whom.isPlayer)
	{
        missionVariables.random_hits_criminal_hate_score++;
	}
}
Scripts/oolite-random-hits-spacebar.js
"use strict";
this.name = "oolite-random-hits-spacebar";
this.author = "LittleBear, Eric Walch & Thargoid";
this.copyright = "November 2008 - But do what you like with it in your OXPs!";
this.description	= "Checks the role of a ship attacking a spacebar to avoid friendly fire incidents between the bar's turret gunners and hunters launched by the bar."
this.licence     = "CC BY-NC-SA 3.0";
this.version = "2.3";

//2.3 cleaned ship_name related variables in ship launch

this.launchTime = clock.seconds;
this.playerWelcomed = false;
this.hopperLaunch = false; // toggled to true by hopper script.
this.quirium = ["EQ_QC_MINE", "EQ_CASCADE_MISSILE", "EQ_LAW_MISSILE", "EQ_OVERRIDE_MISSILE", "energy-bomb", "RANDOM_HITS_MINE"];
this.offenders = 0;
this.offenderCount = 0;

this.shipSpawned = function ()
{
    this.patrols = this.ship.dockedDefenders;  // set maximum number of launchable patrols
    this.hoppers = this.ship.dockedContractors;  // set maximum number of launchable hoppers
    this.maxPatrols = Math.round(Math.random()*5)+5; // 5 .. 10 out simultaneously
    this.launchHopper(); // launch the first hopper.
    this.ship.group.name = "spacebar group" ;
    this.ship.primaryRole = "random_hits_spacebar"; // all bars the same role for easier finding in scripts.
    delete this.shipSpawned;
}

this.shipBeingAttacked = function (who)
{
    if (!who) return;
    this.ship.bounty = 0;
    if (who.primaryRole === "random_hits_patrol") 
    {
        who.target = null;
        who.reactToAIMessage("TARGET_LOST"); // The AIs of the bars and hunters do not react to the nomal "ATTACKED" message, only the special "ENEMY_ATTACK". They therefore ignore attacks by their own side and the police. The lawful attacker has it's AI set to randomhitsbackoffAI which forces it to back off and stop attacking, before being returned to its normalAI.
        return;		
    }
	if (who.isPolice) 
    {
        who.target = null;
        who.reactToAIMessage("TARGET_LOST");  // Since neither police or hunter ships will deliberatley target a Clean Target - bar is kept clean at all times - The Bar takes attackes by ships with these roles as a friendly fire stray shot and does not fire back.
        return;		
    }	
		
	if (who.isPlayer) 
    {
        player.bounty |= 128;			
    }		
    
    this.ship.target = who;
    this.ship.reactToAIMessage("ENEMY_ATTACK"); // Any other attack is met with deadly force! 
};

this.doScan = function () 
{ 
	// create an array with all ships (exclude barrels and rocks) 
	function allShips(entity) {return entity.isShip && entity.scanClass !== "CLASS_ROCK" && entity.scanClass !== "CLASS_CARGO"}; 
	var anyShips = system.filteredEntities(this, allShips, this.ship, this.ship.scannerRange);
    // anyShips now holds all real ships in scanner range. From now only analyse this list further to save time.

	// do offender ships 
    var offenders = anyShips.filter(function(entity) {return entity.bounty > 5}); 
    this.offenderCount = offenders.length; // this.offenderCount is also used outside this scan function.
    if (this.offenderCount > 0){
        this.ship.target = offenders[0]; // set target to first in the list.
        this.launchPatrol(true); // priority launch
        this.ship.reactToAIMessage("OFFENDER_FOUND"); // this broacasts a groupAttackTarget.
        if (this.ship.target.bounty > 64) this.ship.alertCondition++;        

        // check for hostile offenders (Turrets shoot only at targeted hostile ships)
        // function hostiles(entity) {return entity.hasHostileTarget}; 
        var hostileShips = offenders.filter(function(entity) {return entity.hasHostileTarget}); 
        if (hostileShips.length > 0)
        {
            this.ship.target = hostileShips[0]; // set target to first in the list.
        }
    }
    
	// do missiles & mines
	// function weapons(entity) {return entity.isWeapon}; 
	var missiles = anyShips.filter(function(entity) {return entity.isWeapon}); 
    if (missiles.length > 0)
    {
        if (this.quirium.indexOf(missiles[0].primaryRole) > -1) 
        {
            this.ship.alertCondition++;
            this.ship.commsMessage(expandDescription("Quirium detected"));
            if (this.ship.minesweepers.count > 1) missiles[0].switchAI("nullAI.plist");
        }
    }

	// do player 
	//function isPlayer(entity) {return entity.isPlayer}; 
    var playerPresent = (anyShips.filter(function(entity) {return entity.isPlayer}).length > 0);
    if (playerPresent)
    {
        if (player.ship.bounty > 20)
        {
            this.ship.target = player.ship;
            this.launchPatrol(true);
            this.ship.alertCondition++;
            if (!this.playerWelcomed) this.ship.commsMessage(expandDescription("[spacebar-warning]"));
        }
        if (player.ship.bounty === 0)
        {
            this.ship.alertCondition--;
            if (!this.playerWelcomed) this.ship.commsMessage(expandDescription("[spacebar-greeting]"));
        }
        this.playerWelcomed = true;

        // 5 seconds pause means: 12 scans/minute * 8% chance = about one launch per minute.
        if (Math.random() < 0.08) this.launchPatrol(false); // random launches, no priority.
        if (this.hopperLaunch && Math.random() < 0.15) this.launchHopper();
    }
}

this.otherShipDocked = function (ship)
{
    if (!ship) return;
    
    if (ship.primaryRole === "random_hits_patrol")
    {
        this.patrols++;
    }
    if (ship.primaryRole === "random_hits_mining_hopper") 
    {
        this.hoppers++;
        this.hopperLaunch = true;
    }
    if (ship.isPlayer)
    {
        worldScripts.Random_Hits.random_hits_docked = true;
    }

}

this.stationLaunchedShip = function (ship)
{
    if (ship && ship.isPlayer)
    {
        // no need tho keep these temporary variables around after launch.
        var deletions = ["mark_system", "mark_direction", "mark_gender", "assassination_board_poster_title", "assassination_board_job_name", 
        "assassination_board_poster_surname", "assassination_board_poster_name", "assassination_board_poster_system", "assassination_board_subject",
        "assassination_board_address1", "assassination_board_address2", "assassination_board_part1", "mark_first_name", "mark_nick_name",
        "mark_second_name", "mark_race_part1", "mark_race_part2", "assassination_board_part2", "assassination_board_part3", "mark_ship_description",
        "mark_ship", "mark_ship_ad_name", "mark_ship_name", "assassination_board_part4", "assassination_board_part5", "mark_fee", "assassination_board_part6", "assassination_board_part7", 
        "billdue_name", "billdue", "security_bar_text_close", "criminal"];
        for (var i=0; i<deletions.length; i++) delete missionVariables["random_hits_"+deletions[i]];
        
        var that = worldScripts.Random_Hits;
        that.random_hits_docked = false;

        // When launching into a Battle near a Space Bar, Count Up the number of Enemies and tell the player.
        if (that.bigBossAttack){
            that.broadcastBigBossCount();
        }
        if (that.showScreen) delete that.showScreen; // prevents triggering missionscreens at normal stations
    }
}

/*
 Launch only patrols when the station has still some avalable. Patrols that launch are subtracted while patrols 
 that dock or leave the system are added again.
 Spread the launches with a 15 second interval.
 Also make sure there are no to many around. Only launch with a group count of less han 10 (The station and the hopper
 are included in the count)
 Keep track of the offendercount and don't do massive launches with just a few offenders around.
 */
this.launchPatrol = function (priority)
{
    var groupSize = this.ship.group.count;
    if (this.patrols > 0 && this.launchTime + groupSize*5 + 5 < clock.seconds && groupSize < this.maxPatrols+2 && groupSize < this.offenderCount + 4)
    {
        this.patrols--;
        this.launchTime = clock.seconds;
        var patrolShip = this.ship.launchShipWithRole("random_hits_patrol", priority);
        this.ship.group.addShip(patrolShip); // make it part of the space bar group
        patrolShip.group = this.ship.group;
    }
}

this.launchHopper = function ()
{
    if (this.hoppers > 0 && this.ship.alertCondition === 1)
    {
        this.hoppers--;
        var hopperShip = this.ship.launchShipWithRole("random_hits_mining_hopper");
        this.ship.group.addShip(hopperShip); // make it part of the space bar group
        hopperShip.group = this.ship.group;
        this.hopperLaunch = false;
    }
}
Scripts/random-hits-market.js
"use strict";

this.name = "random-hits-market";
this.author = "spara";
this.copyright = "2014 spara";
this.license     = "CC BY-NC-SA 4.0"; 

this.$originalDefs = {
      "food" : [0, 0, 25, -1, -1, 250, 5, 5, 0],
      "textiles" : [0, 0, 18, -1, 0, 250, 5, 10, 0],
      "radioactives" : [0, 0, 53, -2, -3, 0, 7, 15, 0],
      "slaves" : [0, 0, 20, -2, -1, 5, 0, 3, 0],
      "liquor_wines" : [0, 0, 130, -1, -1, 250, 15, 5, 0],
      "luxuries" : [0, 0, 190, 8, -1, 250, 9, 21, 0],
      "narcotics" : [0, 0, 36, -5, -9, 250, 5, 5, 0],
      "computers" : [0, 0, 150, 14, -1, 250, 3, 21, 0],
      "machinery" : [0, 0, 120, 6, 1, 250, 31, 10, 0],
      "alloys" : [0, 0, 88, 3, 1, 250, 21, 10, 0],
      "firearms" : [0, 0, 100, 13, 0, 0, 63, 0, 0],
      "furs" : [0, 0, 170, -9, -1, 250, 63, 21, 0],
      "minerals" : [0, 0, 16, -1, -2, 15, 3, 31, 0],
      "gold" : [0, 0, 100, 0, 0, 0, 4, 0, 1],
      "platinum" : [0, 0, 181, 0, 0, 0, 21, 0, 1],
      "gem_stones" : [0, 0, 50, 0, 0, 0, 10, 0, 2],
      "alien_items" : [0, 0, 125, 1, 0, 0, 31, 0, 0]
};

this.updateLocalCommodityDefinition = function(goodDefinition) {
	var commodity = goodDefinition.key;
	var oldDefs = this.$originalDefs[commodity];
	
	//this is a small market close to the main station
	goodDefinition.capacity = 15;
	
	//old style definition found for the good. calculate it the old way
	if (oldDefs) {
		var market_base_price = oldDefs[2];
		var market_eco_adjust_price = oldDefs[3];
		var market_eco_adjust_quantity = oldDefs[4];
		var market_base_quantity = oldDefs[5];
		var market_mask_price = oldDefs[6];
		var market_mask_quantity = oldDefs[7];
		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;
		
		var quantity = (market_base_quantity + (market_rnd & market_mask_quantity) - (economy * market_eco_adjust_quantity)) & 255;
		if (quantity > 127) quantity = 0;
		
		quantity &= 63;
		
		goodDefinition.quantity = quantity;
		goodDefinition.price = price * 10;
	}
	//no definition found. just add some variance to the system market (+/-5%)
	else {
		goodDefinition.price = goodDefinition.price * (1.05 - Math.random() * 0.1);
		goodDefinition.quantity = Math.floor(goodDefinition.quantity * (1.05 - Math.random() * 0.1));
	}
	//scale down if quantity too high
	if (goodDefinition.quantity > goodDefinition.capacity)
		goodDefinition.quantity = Math.floor(goodDefinition.quantity / 127 * goodDefinition.capacity);

	return goodDefinition;
};