Back to Index | Page generated: Nov 12, 2024, 11:02:04 PM |
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 |
Also read http://wiki.alioth.net/index.php/Random%20Hits
{\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 }
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
Name | Visible | Cost [deci-credits] | Tech-Level |
---|---|---|---|
random hits attackworm | yes | 500 | 101+ |
random hits mining pod | yes | 500 | 101+ |
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; }; |