diff --git a/.ci/travis/after_script.sh b/.ci/travis/after_script.sh
new file mode 100644
index 000000000..5b5a96448
--- /dev/null
+++ b/.ci/travis/after_script.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+set -ev
+
+cd Resources
+rm *.dll
+cd ../doc
+rm -r gh-pages
+rm -r build
+cd ../
\ No newline at end of file
diff --git a/.ci/travis/before_script.sh b/.ci/travis/before_script.sh
new file mode 100644
index 000000000..a0fc9529a
--- /dev/null
+++ b/.ci/travis/before_script.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+set -ev
+
+if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then
+ echo "Build from within the home repository, encryption enabled."
+ wget --quiet https://github.com/KSP-KOS/KSP_LIB/blob/master/kos-${KSP_VERSION}.tar.enc?raw=true -O kos-${KSP_VERSION}.tar.enc
+ openssl aes-256-cbc -K $encrypted_6287ee711a27_key -iv $encrypted_6287ee711a27_iv -in kos-${KSP_VERSION}.tar.enc -out kos-${KSP_VERSION}.tar -d
+else
+ echo "Build from pull request outside of the home repository, encryption disabled."
+ wget --quiet https://github.com/KSP-KOS/KSP_LIB/blob/master/kos-${KSP_VERSION}.tar?raw=true -O kos-${KSP_VERSION}.tar
+fi
+
+mkdir -p Resources
+tar -xvf kos-${KSP_VERSION}.tar -C Resources/
+
+python --version
+pip --version
+# workaround for not being able to use pip outside of a python project
+export PATH=$HOME/.local/bin:$PATH
+pip install --user $USER sphinx_rtd_theme
\ No newline at end of file
diff --git a/.ci/travis/script-sphinxdocs.sh b/.ci/travis/script-sphinxdocs.sh
new file mode 100644
index 000000000..ebd714dab
--- /dev/null
+++ b/.ci/travis/script-sphinxdocs.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+set -ev
+
+cd doc
+sphinx-build -b html -q -W -d build/doctrees source gh-pages
+#make html
+cd ../
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..771770f38
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,8 @@
+# Auto detect text files and perform LF normalization
+# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/
+* text=auto
+
+*.cs diff=csharp
+
+*.csproj text=auto merge=union
+*.sln text=auto eol=crlf merge=union
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 4f721b922..4bb455988 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,27 @@
-bin/
-obj/
+# VisualStudio
+[Bb]in/
+[Oo]bj/
*.suo
packages/
/src/kOS.sln.ide
+
+# Monodevelop
+[Ee]xported[Oo]bj/
+*.userprefs
+
+# Unity
+[Ll]ibrary/
+[Tt]emp/
+/*.pidb
+/*.user
+
+# Build products and files generated during gameplay
+Resources/GameData/kOS/Plugins/
+!Resources/GameData/kOS/ICSharpCode.SharpZipLib.dll
+
+# Symlink to KSP directory
+KSPdirlink
+
+# OS Specific
+.DS_STORE*
+[Tt]humbs.db
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..906a8ea63
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,43 @@
+language: csharp
+solution: src/kOS.sln
+sudo: false
+
+addons:
+ apt:
+ packages:
+ - python-sphinx
+ - nunit-console
+
+env:
+ global:
+ - KSP_VERSION="1.0.5"
+
+# Pre-shared token for pushing notifications to slack chat
+notifications:
+ slack: ksp-kos:51DTQ4ZBP9SlGNnLWJ5D84vp
+
+# Before the install the library dlls need to be downloaded
+before_script:
+- chmod +x .ci/travis/before_script.sh && ./.ci/travis/before_script.sh
+
+script:
+- xbuild /p:Configuration=Release $TRAVIS_SOLUTION
+# I know framework 4.0 is wrong, just trying it to see if it fixes the test
+- nunit-console -framework=4.0 src/kOS.Safe.Test/bin/Release/kOS.Safe.Test.dll
+# - chmod +x .ci/travis/script-sphinxdocs.sh && ./.ci/travis/script-sphinxdocs.sh
+
+# Cleanup the downloaded resources
+after_script:
+- chmod +x .ci/travis/after_script.sh && ./.ci/travis/after_script.sh
+
+before_deploy:
+- mkdir src/kOS/bin/dist
+- tar -zcvf src/kOS/bin/dist/build_$TRAVIS_BUILD_NUMBER.tgz src/kOS/bin/Release/kOS*.dll
+
+deploy:
+ provider: s3
+ access_key_id: "AKIAINHSGTBU5O3DKV2Q"
+ secret_access_key: "$S3_DEPLOY_SECRET"
+ bucket: "kos-artifacts"
+ skip_cleanup: true
+ local_dir: "src/kOS/bin/dist/"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 53d83b5dc..8a8f19306 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,265 @@
kOS Mod Changelog
=================
-# v0.17.1
+# v0.19.1
+
+This release is a patch to v0.19.0, fixing some things
+found by the user community in the two days shortly after
+v0.19.0 released.
+
+It also happens to contain a few terminal window features
+that were being worked on before v0.19.0 but were not deemed
+ready yet when 0.19.0 was released.
+
+### NEW FEATURES
+* PIDLoop tutorial section in the docs edited to mention new PIDLoop()
+ function that did not exist back when that page was first written.
+ (http://ksp-kos.github.io/KOS_DOC/tutorials/pidloops.html)
+* New Terminal GUI doodads and widgets: A brightness slider,
+ and the ability to zoom the character width and height. Also
+ made the transparency and dimming of the 'non-active' terminals
+ a bit less severe so you can still read them when un-focused.
+ Also, these new features can be script controlled by new
+ suffixes, however it is unclear if that feature (doing it from
+ a script) will remain in the future so use it with care:
+ (http://ksp-kos.github.io/KOS_DOC/structures/misc/terminal.html)
+
+### BUG FIXES
+* Fixed file rename bug on local hard disks:
+ (https://github.com/KSP-KOS/KOS/issues/1498)
+* Fixed boot files can be larger than the local disk
+ (https://github.com/KSP-KOS/KOS/issues/1094)
+* Fixed a bug where Infernal Robotics would break when switching vessels or
+ reverting. (https://github.com/KSP-KOS/KOS/issues/1501)
+* Fixes problems with using PartModule's SetField(), and infernal Robotics which
+ had been failing for all cases where the field was a "float".
+ (https://github.com/KSP-KOS/KOS/issues/1503).
+ There may have been other places this bug affected, but this is
+ where it was noticed. Hypothetically, anywhere the stock game's
+ library insists on only accepting a single-precision float and
+ not a double would have had the problem.
+* Improve steering when small control magnitudes are required.
+ (https://github.com/KSP-KOS/KOS/issues/1512)
+
+# v0.19.0
+
+### BREAKING CHANGES
+* As usual, you must recompile any KSM files when using the new version.
+* Vecdraw :SCALE no longer applied to :START. Only applied to :VEC.
+* Varying power consumption might make it so if you have high IPU settings some designs might run out of power when they didn't before. (in most cases it should draw less power for most people).
+* !!!! Default extension of ".ks" is no longer applied to all new filenames created. But it still will be looked for when reading existing files if you leave the extension off !!!!
+* FileInfo information now moved to Volume (http://ksp-kos.github.io/KOS_DOC/structures/volumes_and_files/volume.html).
+* VOLUME:FILES was returning a LIST(), now it returns a LEXICON who's keys are the filename.
+* String sort-order comparisons with "<" and ">" operators were implemented wrongly and just compared lengths. Now they do a character-by-character comparison (case-insensitively). On the off chance that anyone was actually trying to use the previous weird length-comparison behavior, that would break.
+
+### NEW FEATURES
+* Art asset rework. The meshes and textures of the kOS CPU parts have recieved an update, and a new KAL9000 high-end computer part was included.
+* Varying power consumption. Units of electric charge used now varies depending on CPU speed and how much the CPU is being actually used. If your IPU setting is low, or if your program isn't doing very much and is just stuck on a `wait` statement, it won't use as much power. (http://ksp-kos.github.io/KOS_DOC/general/cpu_hardware#electricdrain)
+* Ability to read and write whole files at a time as one big string. (http://ksp-kos.github.io/KOS_DOC/structures/volumes_and_files/volumefile.html)
+* User Functions can now be referred to with function pointers, or "delegates". (http://ksp-kos.github.io/KOS_DOC/language/delegates.html)
+* Automatic serialization system to save/load some kinds of data values to JSON-format files (http://ksp-kos.github.io/KOS_DOC/commands/files.html#writejson-object-filename)
+* User Programs and Functions now allow trailing optional parameters with defaulted values. (http://ksp-kos.github.io/KOS_DOC/language/user_functions.html#optional-parameters-parameter-defaults).
+* There are now some suffixes that work on all value types, even primitive scalars. To accomplish this, a new "encapsulation" system has wrapped all kOS structures and primitive types inside a generic base type. (http://ksp-kos.github.io/KOS_DOC/structures/reflection.html)
+* ENGINE type now supports multi-mode cases and has its gimbal accessible through :GIMBAL suffix (http://ksp-kos.github.io/KOS_DOC/structures/vessels/engine.html)
+* Added GIMBAL:LIMIT suffix. (http://ksp-kos.github.io/KOS_DOC/structures/vessels/gimbal.html)
+* Better support for DMagic's Orbital Science mod (http://ksp-kos.github.io/KOS_DOC/addons/OrbitalScience.html)
+* Char() and Unchar() functions for translating unicode numbers to characters and visa versa (http://ksp-kos.github.io/KOS_DOC/math/basic.html#function:CHAR)
+* New Range type for iterating over hardcoded lists (http://ksp-kos.github.io/KOS_DOC/structures/collections/range.html).
+* Ability to iterate over the characters in a string using a FOR loop, as if the string was a LIST() of chars.
+* New higher level cpu part. (https://github.com/KSP-KOS/KOS/pull/1380)
+* HASTARGET and HASNODE functions (http://ksp-kos.github.io/KOS_DOC/bindings.html?highlight=hastarget)
+* :JOIN suffix for LIST to make a string of the elements (http://ksp-kos.github.io/KOS_DOC/structures/collections/list.html#method:LIST:JOIN)
+* KUNIVERSE now lets you read hours per day setting (http://ksp-kos.github.io/KOS_DOC/structures/misc/kuniverse.html#attribute:KUNIVERSE:HOURSPERDAY)
+* The reserved word ARCHIVE is now a first-class citizen with proper binding, so you can do SET FOO TO ARCHIVE and it will work like you'd expect.
+* New Lexicon creation syntax to make a Lexicon and populate it all in one statement. (http://ksp-kos.github.io/KOS_DOC/structures/collections/lexicon.html?highlight=lexicon#constructing-a-lexicon)
+
+### BUG FIXES
+* Numerous additional checks to prevent control of other vessels the kOS CPU isn't attached to.
+* The error beep and keyboard click sounds now obey game's UI volume settings. (https://github.com/KSP-KOS/KOS/pull/1287)
+* Fixed two bugs with obtaining waypoints by name. (https://github.com/KSP-KOS/KOS/issues/1313) (https://github.com/KSP-KOS/KOS/pull/1319)
+* Removed unnecessary rounding of THRUSTLIMIT to nearest 0.5%, now it can be more precise. (https://github.com/KSP-KOS/KOS/pull/1329)
+* Removed the ability to activate both modes on multi-mode engine simultaneously.
+* LIST ENGINES now lists all engines and displays part names instead of module names. (https://github.com/KSP-KOS/issues/1251)
+* Fixed bug that caused hitting ESC to crash the telnet server. (https://github.com/KSP-KOS/KOS/issues/1328)
+* Some exceptions didn't cause beep, now they all do. (https://github.com/KSP-KOS/KOS/issues/1317)
+* Vecdraw :SCALE no longer applied to :START. Only applied to :VEC. (https://github.com/KSP-KOS/KOS/issues/1200)
+* Fixed bug that made up-arrow work incorrectly when the cursor is at the bottom of the terminal window. (https://github.com/KSP-KOS/KOS/issues/1289)
+* A multitude of small documentation fixes (https://github.com/KSP-KOS/KOS/pull/1341)
+* Fixed a bug when performing an undock (https://github.com/KSP-KOS/KOS/issues/1321)
+* IR:AVAILABLE was reporting incorrectly ()
+* Boot files now wait until the ship is fully unpacked and ready (https://github.com/KSP-KOS/KOS/issues/1280)
+* The Vessel :HASBODY (aliases :HASOBT and :HASORBIT) suffix was in the documentation, but had been lost in a refactor last year. It is put back now.
+* String sort-order comparisons with "<" and ">" operators were implemented wrongly and just compared lengths. Now they do a character-by-character comparison (case-insensitively)
+* Small documentation edits and clarifications all over the place.
+
+### KNOWN issues
+* Using `lock` variables in compiled scripts with a duplicate identifier (like "throttle") throws an error (https://github.com/KSP-KOS/KOS/issues/1347 and https://github.com/KSP-KOS/KOS/issues/1253).
+* Occasionally staging with a probe core or root part in the ejected stage will break cooked steering (https://github.com/KSP-KOS/KOS/issues/1492).
+* The limitations of RemoteTech integration can be bypassed by storing a volume in a variable before the ship looses a connection to the KSC (https://github.com/KSP-KOS/KOS/issues/1464).
+
+### CONTRIBUTORS THIS RELEASE
+
+(These are generated from records on Github of anyone who's Pull Requests are part of this release.)
+(Names are simply listed here alphabetically, not by code contribution size. Anyone who even had so much as one line of change is mentioned.)
+
+Stephan Andreev (ZiwKerman) https://github.com/ZiwKerman
+Bert Cotton (BertCotton) https://github.com/BertCotton
+Kevin Gisi (gisikw) https://github.com/gisikw
+Peter Goddard (pgodd) https://github.com/pgodd
+Steven Mading (Dunbaratu) https://github.com/Dunbaratu
+Eric A. Meyer (meyerweb) https://github.com/meyerweb
+Tomek Piotrowski (tomekpiotrowski) https://github.com/tomekpiotrowski
+Brad White (hvacengi) https://github.com/hvacengi
+Chris Woerz (erendrake) https://github.com/erendrake (repository owner)
+(name not public in github profile) (alchemist_ch) https://github.com/AlchemistCH
+(name not public in github profile) (tdw89) https://github.com/TDW89
+
+# v0.18.2
+
+[Insert witty title here :-P]
+------------------------------
+
+### BREAKING CHANGES
+* As usual, you MUST recompile all KSM files before running them on the new version. Some of the changes have altered how the VM works.
+* Nothing else... we hope.
+
+### NEW FEATURES
+* Compatibility with KSP version 1.0.5
+* `run once ...` syntax to run a script only once per session ( http://ksp-kos.github.io/KOS_DOC/commands/files.html#run-once-program )
+* Volumes and processors have better integration ( http://ksp-kos.github.io/structures/vessels/volume.html#structure:VOLUME )
+* Volume titles default to the name tag of the Processor part (only on launch) ( http://ksp-kos.github.io/KOS_DOC/general/volumes.html#naming-volumes )
+* New suffixes for interacting with kOS Processor modules (including `core`) ( http://ksp-kos.github.io/KOS_DOC/commands/processors.html )
+* `debuglog(...)` function to print directly to the KSP log file ( http://ksp-kos.github.io/KOS_DOC/structures/misc/kuniverse.html#method:KUNIVERSE:DEBUGLOG )
+* New `queue` and `stack` data structures ( http://ksp-kos.github.io/KOS_DOC/structures/misc/queue.html and http://ksp-kos.github.io/KOS_DOC/structures/misc/stack.html )
+
+### BUG FIXES
+* The processor's mode (on/off/starved) is now saved and restored ( https://github.com/KSP-KOS/KOS/issues/1172 )
+* Fixed stage resources again to address a change in KSP 1.0.5 ( https://github.com/KSP-KOS/KOS/issues/1242 )
+* Fix occasional instances of flight controls getting disabled during a docking/undocking/staging event ( https://github.com/KSP-KOS/KOS/issues/1205 )
+* kOS can now trigger module events with RemoteTech installed and no KSC connection ( https://github.com/RemoteTechnologiesGroup/RemoteTech/issues/437 )
+* Fixed handling of multiple thrust/gimbal transforms and corrected some of their directions ( https://github.com/KSP-KOS/KOS/issues/1259 )
+
+# v0.18.1
+
+Steering More Much Betterer
+----------------------
+
+### Changes
+* Changed default MaxStoppingTime to 2 seconds ( was 1 )
+
+### BUG FIXES
+* Fixed a issue where the effect of the Kd parameter of PIDLoop was having a reversed effect #1229
+* Fixes an issue where NO_FLOW resources ( eg SolidFuel ) were not reporting correctly #1231
+
+# v0.18
+
+Steering Much Betterer
+----------------------
+
+### BREAKING CHANGES
+* As usual, you MUST recompile all KSM files before running them on the new version. Some of the changes have altered how the VM works.
+* New LOADDISTANCE obsoletes the previous way it worked ( http://ksp-kos.github.io/KOS_DOC/structures/misc/loaddistance.html )
+* Fixed broken spelling of "ACQUIRE" on docking ports. The old spelling of "AQUIRE" won't work anymore.
+* Changed the bound variable "SURFACESPEED" to "GROUNDSPEED" instead, as the meaning of "SURFACESPEED" was confusingly ambiguous.
+* New arg/param matching checks make some previously usable varying argument techniques not work. (We don't think anyone was using them anyway).
+* Disabled the ability to control vessels the kOS computer part is not actually attached to. This always used to be possible, but it shouldn't have been as it breaks the theme of kOS. This affects all the following: vessel:control, part:controlfrom, part:tag (can still get, but not set), partmodule:doaction, partmodule:doevent, partmodule:setfield (can still getfield). These things become read-only when operating on any vessel other than the one the executing kOS module is actually part of.
+
+### NEW FEATURES
+* THE BIG ONE: Fix to Cooked Steering! Should help people using torque-less craft like with Realism Overhaul. Removed the old steering logic and replaced it with a nice auto-tuning system. ( https://github.com/KSP-KOS/KOS/pull/1118 )
+* SteeringManager structure to let users tweak parts of the new steering system ( http://ksp-kos.github.io/KOS_DOC/structures/misc/steeringmanager.html )
+* PIDLoop structure to let users see parts of the new steering system, and to let them use the built-in PID system for their own needs ( http://ksp-kos.github.io/KOS_DOC/structures/misc/pidloop.html )
+* String manipulation methods. ( http://ksp-kos.github.io/KOS_DOC/structures/misc/string.html )
+* New Lexicon (Associateive Array) type. ( http://ksp-kos.github.io/KOS_DOC/structures/misc/lexicon.html )
+* New Science Experiment control interface allows scripts to directly execute science experiments, bypassing the on-screen prompts. ( http://ksp-kos.github.io/KOS_DOC/structures/vessels/scienceexperiment.html )
+* CrewMember API to let you query the registered crew - their class, gender, and skill ( http://ksp-kos.github.io/KOS_DOC/structures/vessels/crewmember.html )
+* Infernal Robotics API now lets you get Part containing a servo ( https://github.com/KSP-KOS/KOS/issues/1103 )
+* (user docs) Better tutorial for KSP 1.0 areo mode. ( https://github.com/KSP-KOS/KOS/pull/1081 )
+* A few more constants: C, ATMTOKPA, KPATOATM. ( http://ksp-kos.github.io/KOS_DOC/math/basic.html )
+* DYNAMICPRESSURE, or Q ( https://github.com/KSP-KOS/KOS/pull/1085 )
+* DEFINED keyword ( http://ksp-kos.github.io/KOS_DOC/language/variables.html#defined )
+* Load and Pack Distance manipulation ( http://ksp-kos.github.io/KOS_DOC/structures/misc/loaddistance.html )
+* KUniverse structure letting you break the 4th wall and revert from a script ( http://ksp-kos.github.io/KOS_DOC/structures/misc/kuniverse.html )
+* Added SolarPrimeVector to provide universal longitude direction ( http://ksp-kos.github.io/KOS_DOC/bindings.html#solarprimevector )
+
+### BUG FIXES
+* Made `stage:liquidfuel` more sane. ( https://github.com/KSP-KOS/KOS/issues/513 )
+* LIST BODIES returned unusuable structure type ( https://github.com/KSP-KOS/KOS/issues/1090 )
+* Made "ORBIT" and alias for "OBT" and visa versa ( https://github.com/KSP-KOS/KOS/issues/1089 )
+* Made vecdraws stop showing bogus atmospheric burning effects ( https://github.com/KSP-KOS/KOS/pull/1108 )
+* Removed non-functional broken attempts to save/restore variables ( https://github.com/KSP-KOS/KOS/issues/1098 )
+* KSM files didn't store relative jumps right, breaking short-circuit boolean logic ( https://github.com/KSP-KOS/KOS/issues/1137 )
+* (user docs) many minor docs fixes.
+* Lock throttle inside a FROM loop was broken ( https://github.com/KSP-KOS/KOS/issues/1117 )
+* Unlock anything inside a Trigger body was broken ( https://github.com/KSP-KOS/KOS/issues/1151 )
+* Replaced KSP's incorrect ground speed with our own calculation ( https://github.com/KSP-KOS/KOS/issues/1097 )
+* SASMODE "radialin" and "raidialout" were swapped in the KSP API ( https://github.com/KSP-KOS/KOS/issues/1130 )
+* Bug with remote tech allowing access without antenna in one case ( https://github.com/KSP-KOS/KOS/pull/1171 )
+* Wheelsteering by integer compass heading was broken ( https://github.com/KSP-KOS/KOS/issues/1141 )
+* SHUTDOWN didn't shut down immediately ( https://github.com/KSP-KOS/KOS/issues/1120 )
+* Remote Tech delay, and the `wait` command, were ignoring the time warp multiplier ( https://github.com/KSP-KOS/KOS/issues/723 )
+* Better detection of arg/param matching. ( https://github.com/KSP-KOS/KOS/issues/1107 )
+* Doing PRINT AT that runs offscreen threw an error ( https://github.com/KSP-KOS/KOS/issues/813 )
+
+# v0.17.3
+
+1.0.4 Release
+-----------
+
+### BREAKING CHANGES
+* Removed all `ETA_` and `ALT_` bindings, please use `ETA:` and `ALT:` instead
+* `TRUEANOMALY` and `MEANANOMALYATEPOCH` are now expressed in degrees to conform to our policy
+* Deprecated INCOMMRANGE - now throws an exception with instructions to use the new addons:rt methods.
+* Updated maxtthrust and availablethrust calculations for KSP v1.0.x. Due to the way KSP handles thrust, neither available thrust nor maxthrust values are constant at all altitudes around bodies with atmospheres.
+* Boot files are now stored on local hard drives with their original names. You may get or set the boot file name using CORE:BOOTFILENAME suffix.
+* Some undocumented and nonsensical bool math operations have been removed
+* The Steering deadzone is much smaller now, this will allow for every precise RCS maneuvers.
+
+### New Hotness
+* You can now point RemoteTech antenna directly from script
+* You can now get RemoteTech's 'local control' status
+* Infernal Robotics integration improvements
+* New loop structure to allow for more flexible iteration
+* New struct object `CORE:` to interact with the currently running processor.
+* Added vessel:dockingports and vessel:elements suffixes.
+* Added element:dockingports and element:vessel suffixes.
+* Added availablethrust suffix to engines which mirrors the availablethrust suffix for vessels.
+* Added maxthrustat, availablethrustat, and ispat suffixes to engines to read the values at specified atmoshperic pressures. See the documentation for details.
+* Added maxthrustat and availablethrustat suffixes to vessels to read the values at a specified atmospheric pressures. See the documentation for details.
+* You can now use bootfiles while "Start on Archive volume" is enabled
+* Many new sound effects have been added (error, beep, and an option for key click)
+* Boolean AND and OR operations can now short circuit
+* Add new WARPTO command that uses the new KSP function
+* Added new `BODY:SOIRADIUS`
+* Added new suffixes to part that lets you get the bare names of events, actions, and modules
+* Many new sound effects have been added (error, beep, and an option for key click)
+* Added `CLEARVECDRAWS` that will remove all VECDRAWS
+* Any floating point value that has no floating component will be converted to an integer
+
+### Old and busted
+* Fixed empty return statements crashing with an argument count exception #934
+* Fix setting vector:mag to a new value actually setting the magnitude to 1 #952
+* Fix electricity being consumed while the game was paused #526
+* Fix Part Resource string representation #1062
+* Fix UNLOCK inside brace statements #1048 #1051
+* Fix setting PHYSICS warp mode #989
+* Fix printing engine list duplication #1026, #1057
+* Fix terminal lockout when RemoteTech has no connection to the KSC, but the ship has local control.
+* Fixed a crappy parser error that was causing `,` to do bizarre things to some code #925
+* Fix running an empty program resetting the parent #858
+* Fix some error printing related to nodes #905
+* Fix kOS processor sinking into launch pad #980
+* Fix `rename file` command #971
+* Fix `return` statement breaking closure #923
+* Fix docking port query #937
+* better expression support inside square brackets #935
+* you can now `LOCK` in a loop #954
+* the kOS toolbar button should be better behaved now
+* Volume indexes will truncate floating values rather than throwing an error
+* `LIST FILES IN` syntax now works for archive
+* electricity consumption is better behaved
+* setting the target to an empty string will always unset target
+
+# v0.17.2
1.0 Release
-----------
@@ -14,29 +272,29 @@ kOS Mod Changelog
### Old and busted
-* fixes keyword lexxing
+* fixes keyword lexxing
# v0.17.1
-Corrections and omissions
+Corrections and omissions
-------------------------
### "New" features
* Due to erendrake's inability to correctly use git. The new list constructor was omitted from the 0.17.0 release binaries.
-
+
### Bug Fixes:
* Many Doc fixes
* Fixed bug with setting KAC Alarm action to correct value
-* Fixed some unneeded log spamming
+* Fixed some unneeded log spamming
# v0.17.0
FUNCTIONS! FUNCTIONS! FUNCTIONS!
--------------------------------
-Big feature: You can make your own user-defined functions, that
+Big feature: You can make your own user-defined functions, that
can handle recursion, and can use local variable scoping. You can
build a library of your own function calls and load them into your
script.
@@ -169,7 +427,7 @@ this fixes #603 the mess that I made of the Node structure, thanks Tabris from t
caution to the wind, you can tell it to stop using loopback and use your real IP address.
Be aware of the security risk if you choose this.
* Added HUDTEXT that lets you add text to the screen. Thanks @pgodd !
- * more information here: http://ksp-kos.github.io/KOS_DOC/commands/terminal.html#HUDTEXT
+ * more information here: http://ksp-kos.github.io/KOS_DOC/commands/terminal.html#HUDTEXT
* #72 - Added STAGE:NUMBER and STAGE:READY to allow for staging very close together
* #522 - Added BODY:GEOPOSITIONOF and BODY:ALTITUDEOF for getting body-relative info about a 3D point in space.
* #524 and #523 - mission waypoints now have 3d positions
@@ -200,14 +458,14 @@ this fixes #603 the mess that I made of the Node structure, thanks Tabris from t
### New Features
* (AGX) Action Groups Extended Support! Thanks @SirDiazo
* Getting or setting groups 11-250 should behave the same as the stock groups if you have AGX installed.
- * Groundwork is laid for getting parts and modules by the new action groups.
+ * Groundwork is laid for getting parts and modules by the new action groups.
* Gimbals are now a well known module. providing read access to its state
* Added PART:GETMODULEBYINDEX(int). This is most useful when you have a part with the same module twice. Thanks @jwvanderbeck
* More documentation work. http://ksp-kos.github.io/KOS_DOC/
### Bug Fixes
* Fixes RemoteTech Integration
-* Structures can now be correctly ==, <> and concatenated with +
+* Structures can now be correctly ==, <> and concatenated with +
* STAGE:RESOURCE[?]:CAPACITY is now spell correctly :P
# v0.15.5
@@ -299,7 +557,7 @@ Please follow the links to see the full information on the new features.
* Added suffixes to OBT for [walking orbit conic patches](http://ksp-kos.github.io/KOS_DOC/structure/orbit/index.html)
* ORB:HASNEXTPATCH - A boolean that shows the presence of a future patch
- * ORB:NEXTPATCH - The next OBT patch
+ * ORB:NEXTPATCH - The next OBT patch
* Added better techniques for selecting the Part you want from a Vessel:
* Ability to give any part any name you like with the [new nametag feature](http://ksp-kos.github.io/KOS_DOC/summary_topics/nametag/index.html).
@@ -412,7 +670,7 @@ Please follow the links to see the full information on the new features.
~~~
* (WHEN and ON) Triggers that are taking longer than an Update is meant to take, and thus can freeze KSP are caught and reported (Github issue #104). Gives the user an explanatory message about the problem.
* WARNING: Because of a change that had to be done for this, it is **_Highly_ recommended that you increase your *InstructionsPerUpdate* setting in config.xml to 150% as much** as it was before (i.e. from 100 to 150, or if it was 200, make it 300.).
-* Multiple Terminal Windows - possible to have one open per CPU part. (Github issue #158)
+* Multiple Terminal Windows - possible to have one open per CPU part. (Github issue #158)
![Multiple Windows!](https://github.com/KSP-KOS/KOS/blob/master/Docs/Images/MultiEdit.png)
@@ -420,7 +678,7 @@ Please follow the links to see the full information on the new features.
* "rename" was deleting files instead of moving them. (Github issue #220).
* Was parsing array index brakets "[..]" incorrectly when they were on the lefthand side of an assignment. (Github issue #219)
* SHIP:SENSORS were reading the wrong ship's sensors sometimes in multi-ship scenarios. (GIthub issue #218 )
-* Integer and Floating point numbers were not quite properly interchangable like they were meant to be. (Github issue #209)
+* Integer and Floating point numbers were not quite properly interchangable like they were meant to be. (Github issue #209)
# v0.13.1
@@ -429,7 +687,7 @@ Please follow the links to see the full information on the new features.
# v0.13
## MAJOR
-* BREAKING: Commrange has more or less been removed from stock kOS, we realized that most of the behavior of it was copied by other mods and was invisible to users
+* BREAKING: Commrange has more or less been removed from stock kOS, we realized that most of the behavior of it was copied by other mods and was invisible to users
* BREAKING: All direction references are now relative to the controlling part, not the vessel, this will only break on vessels there these two directions are not the same.
* BREAKING: Direction:Vector will always return a unit vector.
* BREAKING: Body:Velocity now returns a pair of orbit/surface velocities just like Vessel:Velocity does. (previously it returned just the orbit velocity as a single vector.)
@@ -441,7 +699,7 @@ Please follow the links to see the full information on the new features.
## New Features
* Added the ability to get and set the current timewarp "Mode" either RAILS or PHYSICS
-* Added Boot files that will run when you get to the pad automatically, you select which one will run in the VAB thanks @WazWaz
+* Added Boot files that will run when you get to the pad automatically, you select which one will run in the VAB thanks @WazWaz
* Vessels and Bodies now can be used interchangeably as much as possible.
* Three new prediction routines for finding state of an object at a future time:
* POSITIONAT( Object, Time ).
@@ -449,14 +707,14 @@ Please follow the links to see the full information on the new features.
* ORBITATAT( Object, Time ).
* you can now get the FACING of all parts.
* ITERATOR:END is now split into :NEXT and :ATEND
-* Direction can now always return a proper vector.
+* Direction can now always return a proper vector.
* IE SHIP:FACING returned V(0,0,0) before
-* Added a 3d Drawing tool for letting you draw lines and labels.
+* Added a 3d Drawing tool for letting you draw lines and labels.
* Tour: https://www.youtube.com/watch?v=Vn6lUozVUHA
* Added a new and improved file editor so the edit command actually works again in game!
* Added the ability to switch to MapView and back in code
* ACTIVESHIP alias links to the ship that is currently under user direct control
-* added GEOPOSITION suffixes BODY and TERRAINHEIGHT
+* added GEOPOSITION suffixes BODY and TERRAINHEIGHT
## Known Issues
@@ -467,7 +725,7 @@ Please follow the links to see the full information on the new features.
* increased power requirement of the kOS Module
* Bodies are now targetable
* MAXTHRUST no longer includes flamed out engines
-* resource floating values are now truncated to 2 significant digits to match the game UI and behavior
+* resource floating values are now truncated to 2 significant digits to match the game UI and behavior
* files saved to the local volume maintain their linebreaks
* radar altimiter now returns a double
* fixed an issues where setting some controls blocked the rest.
@@ -489,7 +747,7 @@ BREAKING: DOCKINGPORT:ORIENTATION is now DOCKINGPORT:FACING
* Fixed LOCK s in subprograms
* Fixed RemoteTech integration blowing up everything
* Fixed flight controls not releasing when they should
-* Disabled RemoteTech Integration while RT development is stalled
+* Disabled RemoteTech Integration while RT development is stalled
* Fix exception when trying to type a multiline instruction in the interpreter
* srfprograde is available as a new shortcut
* BODY now has an OBT suffix
@@ -510,7 +768,7 @@ BREAKING: DOCKINGPORT:ORIENTATION is now DOCKINGPORT:FACING
* Added List square brackets [] as list subelement accessor
* you can use variables as arguments for PRINT AT statements
-This version adds a new 0.625m part. Thanks to SMA on this neat new addition.
+This version adds a new 0.625m part. Thanks to SMA on this neat new addition.
* it works as a kOS computer core
* has 5000 units of code space
* as a smaller part it is unlocked with "precision engineering" in career mode.
@@ -518,13 +776,13 @@ This version adds a new 0.625m part. Thanks to SMA on this neat new addition.
Bug fixes
-* Cannot "set" a variable that later will become a "lock" #13
-* Sanitize values sent to KSP #14
-* Strange order of operations: "and" seems to evaluate before ">" #20
+* Cannot "set" a variable that later will become a "lock" #13
+* Sanitize values sent to KSP #14
+* Strange order of operations: "and" seems to evaluate before ">" #20
* moved some names back to "kOS"
* Work on some structure's ToString return.
* Parameters now get passed in the correct order
-* Ship resources no longer generate an error if they arent present
+* Ship resources no longer generate an error if they arent present
* Ctrl+C now interrupts correctly once again.
* ETA:TRANSITION returns the correct time.
* Better handling of types.
@@ -567,7 +825,7 @@ Bug fixes
* TOP - Translation (1 to -1)
* ROTATION - Vector
* TRANSLATION - Vector
- * NEUTRAL - bool,
+ * NEUTRAL - bool,
* MAINTHROTTLE (1 to -1)
* WHEELTHROTTLE (1 to -1)
* WHEELSTEER (1 to -1)
@@ -580,26 +838,26 @@ Bug fixes
* TOP - Translation (1 to -1)
* ROTATION - Vector
* TRANSLATION - Vector
- * NEUTRALIZE - bool, releases vessel control,
+ * NEUTRALIZE - bool, releases vessel control,
* MAINTHROTTLE (1 to -1)
* WHEELTHROTTLE (1 to -1)
* WHEELSTEER (1 to -1)
-* changing systems vessel load distance
+* changing systems vessel load distance
* LOADDISTANCE get/set for adjusting load distance for every vessel
* VESSELTARGET:LOAD bool - is the vessel loaded
* VESSELTARGET:PACKDISTANCE - Setter for pack distance for every vessel.
* Added RANDOM() generator (0 - 1)
-* Power requirements are now directly tied to the active volume's size, the ARCHIVE's size is unlimited so it is capped at the equivalent of 50KB.
+* Power requirements are now directly tied to the active volume's size, the ARCHIVE's size is unlimited so it is capped at the equivalent of 50KB.
### 0.11.0
-- Thanks to enkido and jwvanderbeck for your help.
+- Thanks to enkido and jwvanderbeck for your help.
- BREAKING: BODY, SHIP:BODY, TARGET:BODY now all return a Body structure rather than the name of the body
- BREAKING: Removed NODE:APOAPSIS and NODE:PERIAPSIS. They are now available in NODE:ORBIT:APOAPSIS
-- Basic RemoveTech Intergration
+- Basic RemoveTech Intergration
- Added VOLUME:NAME to getting the current volume
- Lists can now be populated with basic data that you can loop over or index [Full Info](/wiki/List/)
- Bodies (eg Kerbin, Mun, Duna)
@@ -617,7 +875,7 @@ Bug fixes
### 0.10.0
- Compatible with KSP 0.23 Thanks to Logris and MaHuJa for Commits
-- Added List() which creates a collection and the following commands
+- Added List() which creates a collection and the following commands
- ADD - Adds the value of any variable
- CONTAINS - Tests and returns if the value exists in the list
- REMOVE - removes the item from the list if the list contains the item
@@ -640,19 +898,19 @@ Bug fixes
- Adding a few BODY members
- RADIUS
- MU - G * Body Mass
- - G - Gravitational Constant
+ - G - Gravitational Constant
- ATM atmosphere info with sub elements
- EXISTS
- HASOXYGEN
- SCALE
- HEIGHT
-
+
- Added ORBIT to NODE
- Added the following commands
- UNSET #VARIABLE - remove the variable, ALL removes all variables Thanks a1070
- FOR #USERVARIABLE IN #LIST takes a list and loops over it, exposing each item in the collection as a user defined variable
- New close window action binding
-- Performance fixes
+- Performance fixes
### 0.9.2
@@ -791,11 +1049,11 @@ Bug fixes
### 0.3
-- Support for loops
+- Support for loops
- Support for the IF statement
- Support for the BREAK statement
-### 0.2
+### 0.2
- Initial public release!
- Execution system redesigned to be more heirarchical
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 5a5fe2360..41ea0c071 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,2 +1,32 @@
+Pull Requests
+=============
+
* All PRs must be related to an open issue
* If a PR changes the scripting API, it must include all related changes to the documentation.
+
+Setting Up Your Environment
+===========================
+
+1. Copy `Resources/GameData/kOS` to `$KSP/GameData/`, `where $KSP` is your
+ Kerbal Space Program installation directory.
+
+2. Download the latest KSPAPIExtensions.dll from
+ https://github.com/Swamp-Ig/KSPAPIExtensions/releases, and copy
+ it to `$KSP/GameData/kOS/Plugins`.
+
+3. Create a file at src/kOS/kOS.csproj.user conaining the following XML,
+ replacing /path/to/KSP with your own KSP install directory.
+
+
+
+
+
+ /path/to/KSP/KSP_Data/Managed;
+ /path/to/KSP/GameData/kOS/Plugins
+
+
+
+
+4. If you want building the solution to update the dlls in your KSP
+ directory, create a symbolic link called `KSPdirlink` from the root
+ of this repository to your KSP installation directory.
diff --git a/README.md b/README.md
index 3d70c3b11..1fe61a6fc 100644
--- a/README.md
+++ b/README.md
@@ -9,3 +9,4 @@ Addon release thread: http://forum.kerbalspaceprogram.com/threads/68089-0-23-kOS
Addon development thread: http://forum.kerbalspaceprogram.com/threads/68096-kOS-Autopilot
+Contribution : If you have contributed to the development of the mod, and wish to be named a certain way in the next release notes, then add your edit to the ``### Contributors`` section of the CHANGELOG.md file in your pull request.
diff --git a/RELEASECHECKLIST.md b/RELEASECHECKLIST.md
index f11c1b600..fadd5379a 100644
--- a/RELEASECHECKLIST.md
+++ b/RELEASECHECKLIST.md
@@ -1,7 +1,6 @@
# This is a precursor to an automated build system
### Pre-Build
-* Update the kOS.Core.cs VersionInfo
* Update AssemblyInfo for kOS project
* Update AssemblyInfo for kOS.Safe project
* Update Resources\GameData\kOS\kOS.version
@@ -10,7 +9,7 @@
### Build
* Build kOS solution in release mode
-* Copy kOS.dll and kOS.Safe.dll to \Resources\GameData\kOS\Plugins\
+* Ensure that all required resources are in place (ie KSP API Extensions DLL, ModuleManager DLL)
* Create zip file with a root starting in the \Resources\ directory
* Name the zip file with the following pattern kOS.v...zip (eg kOS.v0.14.2.zip )
* Build the documentation in \docs\
diff --git a/Resources/GameData/kOS/GFX/brightness-button.png b/Resources/GameData/kOS/GFX/brightness-button.png
new file mode 100644
index 000000000..10ef08fb6
Binary files /dev/null and b/Resources/GameData/kOS/GFX/brightness-button.png differ
diff --git a/Resources/GameData/kOS/GFX/error.wav b/Resources/GameData/kOS/GFX/error.wav
new file mode 100644
index 000000000..7dc81bdd0
Binary files /dev/null and b/Resources/GameData/kOS/GFX/error.wav differ
diff --git a/Resources/GameData/kOS/GFX/font-height-button.png b/Resources/GameData/kOS/GFX/font-height-button.png
new file mode 100644
index 000000000..b17ad735f
Binary files /dev/null and b/Resources/GameData/kOS/GFX/font-height-button.png differ
diff --git a/Resources/GameData/kOS/GFX/font-width-button.png b/Resources/GameData/kOS/GFX/font-width-button.png
new file mode 100644
index 000000000..f72acdb14
Binary files /dev/null and b/Resources/GameData/kOS/GFX/font-width-button.png differ
diff --git a/Resources/GameData/kOS/GFX/monitor_minimal_frame.png b/Resources/GameData/kOS/GFX/monitor_minimal_frame.png
new file mode 100644
index 000000000..7ac64931f
Binary files /dev/null and b/Resources/GameData/kOS/GFX/monitor_minimal_frame.png differ
diff --git a/Resources/GameData/kOS/GFX/monitor_minimal_frame_active.png b/Resources/GameData/kOS/GFX/monitor_minimal_frame_active.png
new file mode 100644
index 000000000..3496bf89a
Binary files /dev/null and b/Resources/GameData/kOS/GFX/monitor_minimal_frame_active.png differ
diff --git a/Resources/GameData/kOS/GFX/terminal-beep.wav b/Resources/GameData/kOS/GFX/terminal-beep.wav
new file mode 100644
index 000000000..11e0901bf
Binary files /dev/null and b/Resources/GameData/kOS/GFX/terminal-beep.wav differ
diff --git a/Resources/GameData/kOS/GFX/terminal-click.wav b/Resources/GameData/kOS/GFX/terminal-click.wav
new file mode 100644
index 000000000..5112203cd
Binary files /dev/null and b/Resources/GameData/kOS/GFX/terminal-click.wav differ
diff --git a/Resources/GameData/kOS/Parts/KOSCherryLight/Cherrylight.mu b/Resources/GameData/kOS/Parts/KOSCherryLight/Cherrylight.mu
new file mode 100644
index 000000000..736519a93
Binary files /dev/null and b/Resources/GameData/kOS/Parts/KOSCherryLight/Cherrylight.mu differ
diff --git a/Resources/GameData/kOS/Parts/KOSCherryLight/Metal_Silver.mbm b/Resources/GameData/kOS/Parts/KOSCherryLight/Metal_Silver.mbm
new file mode 100644
index 000000000..288a01e01
Binary files /dev/null and b/Resources/GameData/kOS/Parts/KOSCherryLight/Metal_Silver.mbm differ
diff --git a/Resources/GameData/kOS/Parts/KOSCherryLight/dirty aluminum.mbm b/Resources/GameData/kOS/Parts/KOSCherryLight/dirty aluminum.mbm
new file mode 100644
index 000000000..e155873ea
Binary files /dev/null and b/Resources/GameData/kOS/Parts/KOSCherryLight/dirty aluminum.mbm differ
diff --git a/Resources/GameData/kOS/Parts/KOSCherryLight/part.cfg b/Resources/GameData/kOS/Parts/KOSCherryLight/part.cfg
new file mode 100644
index 000000000..9c4a1db3e
--- /dev/null
+++ b/Resources/GameData/kOS/Parts/KOSCherryLight/part.cfg
@@ -0,0 +1,44 @@
+PART
+{
+
+ name = Cherry Light
+ module = Part
+ author = Peter Goddard (pgodd) and Brad White (hvacengi)
+ mesh = model/cherrylight.mu
+ scale = 1
+ rescaleFactor = 1
+ node_stack_bottom = 0, -0.01, 0, 0, -90, 0, 0
+ node_attach = 0.0, -0.01, 0.0, 0, -90, 0, 0
+ TechRequired = advElectrics
+ cost = 500
+ entryCost = 1200
+ category = Utility
+ subcategory = 0
+ title = Cherry Light
+ manufacturer = kOS Peripherals
+ description = Watch out! It's the coppers! Fool your friends, be the life of the party with our simulated police style light. Not for use by real police.
+ attachRules = 1,1,0,0,0
+ mass = 0.001
+ dragModelType = default
+ maximum_drag = .002
+ minimum_drag = .002
+ angularDrag = 2
+ crashTolerance = 9
+ maxTemp = 2400
+ MODULE
+ {
+ name = ModuleLight
+ lightName = PowerLight
+ isOn = true
+ lightR = 0.5
+ lightG = 0
+ lightB = 0
+ }
+ MODULE
+ {
+ name = kOSLightModule
+ resourceAmount = 0.02
+ animationName = Rotation
+ }
+
+}
diff --git a/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_1_EMIS.mbm b/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_1_EMIS.mbm
index 294e13f18..c858c1db7 100644
Binary files a/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_1_EMIS.mbm and b/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_1_EMIS.mbm differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_1_d_NRM.mbm b/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_1_d_NRM.mbm
old mode 100644
new mode 100755
index 680de75b1..0511d03d8
Binary files a/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_1_d_NRM.mbm and b/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_1_d_NRM.mbm differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_d.mbm b/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_d.mbm
old mode 100644
new mode 100755
index 57a12f292..e496380dc
Binary files a/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_d.mbm and b/Resources/GameData/kOS/Parts/kOSMachine0m/KR-2042_uv_layout_d.mbm differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachine0m/model.mu b/Resources/GameData/kOS/Parts/kOSMachine0m/model.mu
index b0cbcac24..b7fd6a978 100644
Binary files a/Resources/GameData/kOS/Parts/kOSMachine0m/model.mu and b/Resources/GameData/kOS/Parts/kOSMachine0m/model.mu differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachine0m/part.cfg b/Resources/GameData/kOS/Parts/kOSMachine0m/part.cfg
old mode 100644
new mode 100755
index 4b29b640b..08ca110c9
--- a/Resources/GameData/kOS/Parts/kOSMachine0m/part.cfg
+++ b/Resources/GameData/kOS/Parts/kOSMachine0m/part.cfg
@@ -1,9 +1,9 @@
PART
{
// --- general parameters ---
-name = kOSMachine0m
+name = KR-2042
module = Part
-author = SMA
+author = SMA and Peter Goddard
// --- asset parameters ---
mesh = model/model.mu
@@ -12,8 +12,8 @@ rescaleFactor = 1
// --- node definitions ---
// definition format is Position X, Position Y, Position Z, Up X, Up Y, Up Z, connector node size
-node_stack_bottom = 0.0, -0.0566, 0.0, 0.0, 1.0, 0.0, 0
-node_stack_top = 0.0, 0.0466, 0.0, 0.0, 1.0, 0.0, 0
+node_stack_bottom = 0.0, -0.081, 0.0, 0.0, -1.0, 0.0, 0
+node_stack_top = 0.0, -0.003, 0.0, 0.0, 1.0, 0.0, 0
// --- Tech tree ---
@@ -29,7 +29,7 @@ manufacturer = Compotronix
description = Would you trust life and limb to a mindless autopilot, powered by untested software you hastily wrote yourself? Spacefaring kerbals would!
// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
-attachRules = 1,0,1,1,1
+attachRules = 1,0,1,0,0
// --- standard part parameters ---
mass = 0.08
@@ -44,6 +44,8 @@ MODULE
{
name = kOSProcessor
diskSpace = 5000
+ ECPerBytePerSecond = 0
+ ECPerInstruction = 0.000004
}
RESOURCE
@@ -57,15 +59,17 @@ MODULE
{
name = ModuleLight
lightName = PowerLight
- useAnimationDim = true
- lightBrightenSpeed = 4
- lightDimSpeed = 4
- resourceAmount = 0.01
- animationName = PowerLight
- useResources = true
- startEventGUIName = "Power Off"
- endEventGUIName = "Power On"
+ lightR = 0
+ lightG = 0.1
+ lightB = 0
}
+MODULE
+{
+ name = kOSLightModule
+ resourceAmount = 0.02
+ animationName = flickerStart
+}
-}
\ No newline at end of file
+
+}
diff --git a/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/KR-2042_uv_layout_1_EMIS.mbm b/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/KR-2042_uv_layout_1_EMIS.mbm
new file mode 100644
index 000000000..02250eb61
Binary files /dev/null and b/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/KR-2042_uv_layout_1_EMIS.mbm differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/KR-2042_uv_layout_1_d_NRM.mbm b/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/KR-2042_uv_layout_1_d_NRM.mbm
new file mode 100644
index 000000000..0511d03d8
Binary files /dev/null and b/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/KR-2042_uv_layout_1_d_NRM.mbm differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/KR-2042_uv_layout_d.mbm b/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/KR-2042_uv_layout_d.mbm
new file mode 100644
index 000000000..a4b5a062f
Binary files /dev/null and b/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/KR-2042_uv_layout_d.mbm differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/model.mu b/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/model.mu
new file mode 100644
index 000000000..b6e63e26d
Binary files /dev/null and b/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/model.mu differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/part.cfg b/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/part.cfg
new file mode 100644
index 000000000..7d1fd2924
--- /dev/null
+++ b/Resources/GameData/kOS/Parts/kOSMachine0mLegacy/part.cfg
@@ -0,0 +1,71 @@
+PART
+{
+// --- general parameters ---
+name = kOSMachine0m
+module = Part
+author = SMA and Peter Goddard
+
+// --- asset parameters ---
+mesh = model/model.mu
+scale = 1
+rescaleFactor = 1
+
+// --- node definitions ---
+// definition format is Position X, Position Y, Position Z, Up X, Up Y, Up Z, connector node size
+node_stack_bottom = 0.0, -0.04, 0.0, 0.0, -1.0, 0.0, 0
+node_stack_top = 0.0, 0.03, 0.0, 0.0, 1.0, 0.0, 0
+
+
+// --- Tech tree ---
+TechRequired = precisionEngineering
+
+// --- editor parameters ---
+cost = 1200
+entryCost = 6800
+category = -1
+subcategory = 0
+title = KR-2042 b Scriptable Control System
+manufacturer = Compotronix
+description = Would you trust life and limb to a mindless autopilot, powered by untested software you hastily wrote yourself? Spacefaring kerbals would!
+
+// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
+attachRules = 1,0,1,1,0
+
+// --- standard part parameters ---
+mass = 0.08
+dragModelType = default
+maximum_drag = 0.2
+minimum_drag = 0.2
+angularDrag = 2
+crashTolerance = 9
+maxTemp = 3400
+
+MODULE
+{
+ name = kOSProcessor
+ diskSpace = 5000
+}
+
+RESOURCE
+{
+ name = ElectricCharge
+ amount = 5
+ maxAmount = 5
+}
+
+MODULE
+{
+ name = ModuleLight
+ lightName = PowerLight
+ useAnimationDim = true
+ lightBrightenSpeed = 8
+ lightDimSpeed = 4
+ resourceAmount = 0.01
+ animationName = PowerLight
+ useResources = true
+ startEventGUIName = "Power Off"
+ endEventGUIName = "Power On"
+}
+
+
+}
diff --git a/Resources/GameData/kOS/Parts/kOSMachine1m/model.mu b/Resources/GameData/kOS/Parts/kOSMachine1m/model.mu
old mode 100644
new mode 100755
index 54bb0f434..111c8ae8f
Binary files a/Resources/GameData/kOS/Parts/kOSMachine1m/model.mu and b/Resources/GameData/kOS/Parts/kOSMachine1m/model.mu differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachine1m/model001.mbm b/Resources/GameData/kOS/Parts/kOSMachine1m/model001.mbm
deleted file mode 100644
index 337f39893..000000000
Binary files a/Resources/GameData/kOS/Parts/kOSMachine1m/model001.mbm and /dev/null differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachine1m/model000.mbm b/Resources/GameData/kOS/Parts/kOSMachine1m/model002.mbm
old mode 100644
new mode 100755
similarity index 86%
rename from Resources/GameData/kOS/Parts/kOSMachine1m/model000.mbm
rename to Resources/GameData/kOS/Parts/kOSMachine1m/model002.mbm
index a2196892f..9f79a976a
Binary files a/Resources/GameData/kOS/Parts/kOSMachine1m/model000.mbm and b/Resources/GameData/kOS/Parts/kOSMachine1m/model002.mbm differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachine1m/part.cfg b/Resources/GameData/kOS/Parts/kOSMachine1m/part.cfg
old mode 100644
new mode 100755
index fa8a0c5bd..078ea9b44
--- a/Resources/GameData/kOS/Parts/kOSMachine1m/part.cfg
+++ b/Resources/GameData/kOS/Parts/kOSMachine1m/part.cfg
@@ -1,9 +1,9 @@
PART
{
-// --- general parameters ---
+// --- general parameters --- V2~ fixed collision mesh
name = kOSMachine1m
module = Part
-author = KevinLaity
+author = KevinLaity / Peter Goddard
// --- asset parameters ---
mesh = model/model.mu
@@ -44,6 +44,8 @@ MODULE
{
name = kOSProcessor
diskSpace = 10000
+ ECPerBytePerSecond = 0
+ ECPerInstruction = 0.000004
}
RESOURCE
diff --git a/Resources/GameData/kOS/Parts/kOSMachineRad/Model.mu b/Resources/GameData/kOS/Parts/kOSMachineRad/Model.mu
old mode 100644
new mode 100755
index 4c23dbd54..9a65fa250
Binary files a/Resources/GameData/kOS/Parts/kOSMachineRad/Model.mu and b/Resources/GameData/kOS/Parts/kOSMachineRad/Model.mu differ
diff --git a/Resources/GameData/kOS/Parts/kOSMachineRad/colorTexture.mbm b/Resources/GameData/kOS/Parts/kOSMachineRad/colorTexture.mbm
old mode 100644
new mode 100755
diff --git a/Resources/GameData/kOS/Parts/kOSMachineRad/part.cfg b/Resources/GameData/kOS/Parts/kOSMachineRad/part.cfg
index c4f313189..149e764f5 100755
--- a/Resources/GameData/kOS/Parts/kOSMachineRad/part.cfg
+++ b/Resources/GameData/kOS/Parts/kOSMachineRad/part.cfg
@@ -1,71 +1,73 @@
-PART
-{
-// --- general parameters ---
-name = kOSMachineRad
-module = Part
-author = Peter Goddard
-
-// --- asset parameters ---
-mesh = model/model.mu
-scale = 1
-rescaleFactor = 0.99999999999
-iconCenter = 0, 0, 0
-
-// --- node definitions ---
-node_attach = 0.0, 0.0, 0.0, 1, 0, 0
-
-// --- Tech tree ---
-TechRequired = unmannedTech
-
-// --- editor parameters ---
-cost = 2200
-entryCost = 4200
-category = Control
-subcategory = 0
-title = CompoMax Radial Tubeless
-manufacturer = Squalid-State Devices Inc.
-description = Would you trust life and limb to a mindless autopilot, powered by untested software you hastily wrote yourself? Spacefaring kerbals would!
-
-// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
-attachRules = 0,1,0,0,1
-
-// --- standard part parameters ---
-mass = 0.03
-dragModelType = default
-maximum_drag = 0.0
-minimum_drag = 0.0
-angularDrag = 0
-crashTolerance = 6
-maxTemp = 3400
-
-
-MODULE
-{
- name = kOSProcessor
- diskSpace = 60000
-}
-MODULE
-{
- name = ModuleDeployableSolarPanel
- sunTracking = false
- raycastTransformName = suncatcher
- pivotName = suncatcher
- isBreakable = false
- resourceName = ElectricCharge
- chargeRate = 0.5
- powerCurve
- {
- key = 206000000000 0 0 0
- key = 13599840256 1 0 0
- key = 68773560320 0.5 0 0
- key = 0 10 0 0
- }
-}
-}
-RESOURCE
-{
- name = ElectricCharge
- amount = 10
- maxAmount = 10
-}
-}
+PART
+{
+// --- general parameters ---
+name = kOSMachineRad
+module = Part
+author = Peter Goddard
+
+// --- asset parameters ---
+mesh = model/model.mu
+scale = 1
+rescaleFactor = 1
+iconCenter = 0, 0, 0
+
+// --- node definitions ---
+node_attach = 0.0, 0.0, 0.0, 1, 0, 0
+
+// --- Tech tree ---
+TechRequired = unmannedTech
+
+// --- editor parameters ---
+cost = 2200
+entryCost = 4200
+category = Control
+subcategory = 0
+title = CompoMax Radial Tubeless
+manufacturer = Squalid-State Devices Inc.
+description = Would you trust life and limb to a mindless autopilot, powered by untested software you hastily wrote yourself? Spacefaring kerbals would!
+
+// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
+attachRules = 0,1,0,0,1
+
+// --- standard part parameters ---
+mass = 0.03
+dragModelType = default
+maximum_drag = 0.0
+minimum_drag = 0.0
+angularDrag = 0
+crashTolerance = 6
+maxTemp = 3400
+
+
+MODULE
+{
+ name = kOSProcessor
+ diskSpace = 60000
+ ECPerBytePerSecond = 0
+ ECPerInstruction = 0.000004
+}
+MODULE
+{
+ name = ModuleDeployableSolarPanel
+ sunTracking = false
+ raycastTransformName = suncatcher
+ pivotName = suncatcher
+ isBreakable = false
+ resourceName = ElectricCharge
+ chargeRate = 0.5
+ powerCurve
+ {
+ key = 206000000000 0 0 0
+ key = 13599840256 1 0 0
+ key = 68773560320 0.5 0 0
+ key = 0 10 0 0
+ }
+}
+}
+RESOURCE
+{
+ name = ElectricCharge
+ amount = 10
+ maxAmount = 10
+}
+}
diff --git a/Resources/GameData/kOS/Parts/kOSkal9000/kal9000.mbm b/Resources/GameData/kOS/Parts/kOSkal9000/kal9000.mbm
new file mode 100644
index 000000000..8da51e9ac
Binary files /dev/null and b/Resources/GameData/kOS/Parts/kOSkal9000/kal9000.mbm differ
diff --git a/Resources/GameData/kOS/Parts/kOSkal9000/kal9000back.mbm b/Resources/GameData/kOS/Parts/kOSkal9000/kal9000back.mbm
new file mode 100644
index 000000000..021066a02
Binary files /dev/null and b/Resources/GameData/kOS/Parts/kOSkal9000/kal9000back.mbm differ
diff --git a/Resources/GameData/kOS/Parts/kOSkal9000/kal9000eye.mbm b/Resources/GameData/kOS/Parts/kOSkal9000/kal9000eye.mbm
new file mode 100644
index 000000000..9ca359503
Binary files /dev/null and b/Resources/GameData/kOS/Parts/kOSkal9000/kal9000eye.mbm differ
diff --git a/Resources/GameData/kOS/Parts/kOSkal9000/model.mu b/Resources/GameData/kOS/Parts/kOSkal9000/model.mu
new file mode 100644
index 000000000..d47a6b3f0
Binary files /dev/null and b/Resources/GameData/kOS/Parts/kOSkal9000/model.mu differ
diff --git a/Resources/GameData/kOS/Parts/kOSkal9000/part.cfg b/Resources/GameData/kOS/Parts/kOSkal9000/part.cfg
new file mode 100644
index 000000000..e8000c891
--- /dev/null
+++ b/Resources/GameData/kOS/Parts/kOSkal9000/part.cfg
@@ -0,0 +1,60 @@
+PART
+{
+// --- general parameters ---
+name = KAL9000
+module = Part
+author = Peter Goddard and kOS Crew
+
+// --- asset parameters ---
+mesh = model/model.mu
+scale = 1
+rescaleFactor = 1
+
+// --- node definitions ---
+node_attach = 0.01, 0.0, 0.0, 1, 0, 0, 0
+
+// --- Tech tree ---
+TechRequired = automation
+
+// --- editor parameters ---
+cost = 1200
+entryCost = 6800
+category = Control
+subcategory = 0
+title = KAL9000 Scriptable Control System
+manufacturer = Squalid State Devices
+description = Mildly Malevolent artificial entity, use caution on EVA's
+
+// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
+attachRules = 0,1,0,0,0
+
+// --- standard part parameters ---
+mass = 0.0005
+dragModelType = default
+maximum_drag = 0
+minimum_drag = 0
+angularDrag = 0
+crashTolerance = 9
+maxTemp = 3400
+
+MODULE
+{
+ name = kOSProcessor
+ diskSpace = 255000
+}
+MODULE
+{
+ name = ModuleLight
+ lightName = PowerLight
+ lightR = 0.5
+ lightG = 0
+ lightB = 0
+}
+
+MODULE
+{
+ name = kOSLightModule
+ resourceAmount = 0.02
+ animationName = KAL9000Lives
+}
+}
diff --git a/Resources/GameData/kOS/kOS.ckan b/Resources/GameData/kOS/kOS.ckan
deleted file mode 100644
index 5803fa6bf..000000000
--- a/Resources/GameData/kOS/kOS.ckan
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "spec_version" : 1,
- "identifier" : "kOS",
- "$kref" : "#/ckan/kerbalstuff",
- "license" : "GPL-3.0",
- "release_status" : "stable",
- "resources" : {
- "manual" : "http://ksp-kos.github.io/KOS_DOC/",
- "github" : {
- "url" : "https://github.com/KSP-KOS/KOS",
- "releases" : true
- }
- },
- "install" : [
- {
- "file" : "GameData/kOS",
- "install_to" : "GameData"
- }
- ],
- "recommends": [
- {
- "name": "ModuleManager",
- "min_version": "2.5.6",
- "comment": "Earlier versions of MM have forward compatibility problems, according to the MM release notes."
- }
- ],
- "suggests": [
- {
- "name": "RemoteTech",
- "min_version": "1.5.1",
- "comment": "RT gives incentive to having local control of craft, even unmanned ones"
- }
- ],
-}
diff --git a/Resources/GameData/kOS/kOS.version b/Resources/GameData/kOS/kOS.version
index ead55c775..2cbbf45ae 100644
--- a/Resources/GameData/kOS/kOS.version
+++ b/Resources/GameData/kOS/kOS.version
@@ -1,8 +1,8 @@
{
"NAME": "kOS",
"URL": "https://raw.githubusercontent.com/KSP-KOS/KOS/master/Resources/GameData/kOS/kOS.version",
- "DOWNLOAD":"TODO - when release..."
- "CHANGE_LOG_URL":"https://raw.githubusercontent.com/KSP-KOS/KOS/master/CHANGELOG.md",
+ "DOWNLOAD": "TODO - when release...",
+ "CHANGE_LOG_URL": "https://raw.githubusercontent.com/KSP-KOS/KOS/master/CHANGELOG.md",
"GITHUB": {
"USERNAME":"KSP-KOS",
"REPOSITORY":"KOS",
@@ -10,22 +10,22 @@
},
"VERSION": {
"MAJOR": 0,
- "MINOR": 17,
- "PATCH": 2
+ "MINOR": 19,
+ "PATCH": 1
},
"KSP_VERSION": {
- "MAJOR": 0,
- "MINOR": 90,
- "PATCH": 0
- }
+ "MAJOR": 1,
+ "MINOR": 0,
+ "PATCH": 5
+ },
"KSP_VERSION_MIN": {
- "MAJOR": 0,
- "MINOR": 90,
- "PATCH": 0
+ "MAJOR": 1,
+ "MINOR": 0,
+ "PATCH": 4
},
"KSP_VERSION_MAX": {
- "MAJOR": 0,
- "MINOR": 90,
+ "MAJOR": 1,
+ "MINOR": 0,
"PATCH": 99
}
}
diff --git a/doc/KerboscriptLexer.py b/doc/KerboscriptLexer.py
new file mode 100644
index 000000000..09db02720
--- /dev/null
+++ b/doc/KerboscriptLexer.py
@@ -0,0 +1,69 @@
+#
+# File used for syntax-highlighting code sections in the documentation.
+#
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, \
+ this, inherit, default, words
+from pygments.util import get_bool_opt
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+ Number, Punctuation, Error
+
+class KerboscriptLexer(RegexLexer):
+
+ name = 'Kerboscript'
+ aliases = ['kerboscript']
+ filenames = ['*.ks']
+ # mimetypes = ['text/somethinghere'] # We don't have a kerboscript mime type (yet?)
+
+ flags = re.MULTILINE | re.DOTALL | re.IGNORECASE
+
+ __all__ = ['KerboscriptLexer']
+
+ tokens = {
+ #
+ # See http://pygments.org/docs/tokens/ for a list of parts of speech
+ # to assign things to in this list
+ #
+ 'root': [
+ #
+ # Note: Precedence in a tie is to pick the one that
+ # came earlier in this list.
+ #
+ # Warning: In my experimentation I found that if a rule is
+ # present in the list below where a string of zero length
+ # matches the regex, this causes Pygment to just get stuck
+ # in an infinite loop.
+ # For example, if the whitespace regex was:
+ # [\t\s\r\n]*
+ # Instead of :
+ # [\t\s\r\n]+
+ # Then zero chars would be a valid match. So
+ # Pygment matches the rule without advancing
+ # any further into the input, and just gets
+ # stuck doing that forever.
+ #
+ (r'//[^\r\n]*[\r\n]', Comment.Single),
+ (r'"[^"]*"', String),
+ (r'[\t\s\r\n]+', Text), #whitespace
+ (r'[*/+|?<>=#^\-]', Operator),
+ (r'\b(to|is|not|and|or|all)\b', Operator.Word),
+ (r'[()\[\]\.,:\{\}@]', Punctuation),
+ (words(( 'set', 'if', 'else', 'until', 'step', 'do',
+ 'lock', 'unlock', 'print', 'at', 'toggle', 'wait',
+ 'when', 'then', 'stage', 'clearscreen', 'add', 'remove',
+ 'log', 'break', 'preserve', 'declare', 'defined', 'local',
+ 'global', 'return', 'switch', 'copy', 'from', 'rename',
+ 'volume', 'file', 'delete', 'edit', 'run', 'once', 'compile',
+ 'list', 'reboot', 'shutdown', 'for', 'unset'), suffix=r'\b'), Keyword),
+ (r'\b(declare|local|global|parameter|function)\b', Keyword.Declaration),
+ (r'\b(true|false|on|off)\b', Name.Builtin),
+ (r'\b[a-z_][a-z_\d]*\b', Name.Variable), # TODO - we could differentiate type of name: i.e. built-in vs user.
+ (r'\b(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+\b', Number.Float),
+ (r'\b(\d+)+\b', Number.Float), # markup ints just like floats
+ ]
+ }
+
+def setup(app):
+ app.add_lexer("kerboscript", KerboscriptLexer())
diff --git a/doc/source/_images/general/disk_space_slider.png b/doc/source/_images/general/disk_space_slider.png
new file mode 100644
index 000000000..c9beaade2
Binary files /dev/null and b/doc/source/_images/general/disk_space_slider.png differ
diff --git a/doc/source/_images/kos_logo.png b/doc/source/_images/kos_logo.png
new file mode 100644
index 000000000..35b9db752
Binary files /dev/null and b/doc/source/_images/kos_logo.png differ
diff --git a/doc/source/_images/kos_logo_small.png b/doc/source/_images/kos_logo_small.png
new file mode 100644
index 000000000..8eed4bfe6
Binary files /dev/null and b/doc/source/_images/kos_logo_small.png differ
diff --git a/doc/source/_images/tutorials/quickstart/MyFirstRocket.craft b/doc/source/_images/tutorials/quickstart/MyFirstRocket.craft
new file mode 100644
index 000000000..fc446acad
--- /dev/null
+++ b/doc/source/_images/tutorials/quickstart/MyFirstRocket.craft
@@ -0,0 +1,2200 @@
+ship = My First Rocket
+version = 1.0.4
+description =
+type = VAB
+size = 3.127958,17.63077,4.510109
+PART
+{
+ part = probeStackSmall_4287645852
+ partName = Part
+ pos = 0,15,0
+ attPos = 0,0,0
+ attPos0 = 0,15,0
+ rot = 0,0,0,1
+ attRot = 0,0,0,1
+ attRot0 = 0,0,0,1
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 0
+ dstg = 0
+ sidx = -1
+ sqor = -1
+ sepI = 0
+ attm = 0
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ link = noseCone_4287640986
+ link = kOSMachine1m_4294064856
+ attN = bottom,kOSMachine1m_4294064856
+ attN = top,noseCone_4287640986
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleCommand
+ isEnabled = True
+ controlSrcStatusText =
+ EVENTS
+ {
+ MakeReference
+ {
+ active = True
+ guiActive = True
+ guiIcon = Control From Here
+ guiName = Control From Here
+ category = Control From Here
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ RenameVessel
+ {
+ active = True
+ guiActive = True
+ guiIcon = Rename Vessel
+ guiName = Rename Vessel
+ category = Rename Vessel
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = ModuleReactionWheel
+ isEnabled = True
+ stateString = Active
+ WheelState = Active
+ EVENTS
+ {
+ OnToggle
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Toggle Torque
+ guiName = Toggle Torque
+ category = Toggle Torque
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ Activate
+ {
+ actionGroup = None
+ }
+ Deactivate
+ {
+ actionGroup = None
+ }
+ Toggle
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = ModuleSAS
+ isEnabled = True
+ standaloneToggle = True
+ standaloneToggle_UIFlight
+ {
+ controlEnabled = True
+ }
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = ModuleTripLogger
+ isEnabled = True
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ Log
+ {
+ flight = 0
+ }
+ }
+ RESOURCE
+ {
+ name = ElectricCharge
+ amount = 15
+ maxAmount = 15
+ flowState = True
+ isTweakable = True
+ hideFlow = False
+ flowMode = Both
+ }
+}
+PART
+{
+ part = noseCone_4287640986
+ partName = Part
+ pos = 0,15.1,0
+ attPos = 0,0,0
+ attPos0 = 0,0.1000004,0
+ rot = 0,0,0,1
+ attRot = 0,0,0,1
+ attRot0 = 0,0,0,1
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 0
+ dstg = 0
+ sidx = -1
+ sqor = -1
+ sepI = 0
+ attm = 0
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ attN = bottom01,probeStackSmall_4287645852
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
+PART
+{
+ part = kOSMachine1m_4294064856
+ partName = Part
+ pos = 0,14.727,0
+ attPos = 0,0,0
+ attPos0 = 0,-0.2730007,0
+ rot = 0,0,0,1
+ attRot = 0,0,0,1
+ attRot0 = 0,0,0,1
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 0
+ dstg = 0
+ sidx = -1
+ sqor = -1
+ sepI = 0
+ attm = 0
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ link = fuelTank_4294699826
+ link = solarPanels5_4290881882
+ link = solarPanels5_4290881686
+ link = solarPanels5_4290881652
+ link = solarPanels5_4290881618
+ attN = bottom,fuelTank_4294699826
+ attN = top,probeStackSmall_4287645852
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = kOSProcessor
+ isEnabled = True
+ bootFile = boot.ks
+ diskSpace = 10000
+ baseDiskSpace = 10000
+ baseModuleCost = 0
+ basePartMass = 0.12
+ additionalCost = 0
+ MaxPartId = 100
+ RequiredPower = 0
+ bootFile_UIEditor
+ {
+ controlEnabled = False
+ }
+ EVENTS
+ {
+ Activate
+ {
+ active = True
+ guiActive = True
+ guiIcon = Open Terminal
+ guiName = Open Terminal
+ category = Open Terminal
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ TogglePower
+ {
+ active = True
+ guiActive = True
+ guiIcon = Toggle Power
+ guiName = Toggle Power
+ category = Toggle Power
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ Activate
+ {
+ actionGroup = None
+ }
+ Deactivate
+ {
+ actionGroup = None
+ }
+ Toggle
+ {
+ actionGroup = Custom01
+ }
+ TogglePower
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+ RESOURCE
+ {
+ name = ElectricCharge
+ amount = 5
+ maxAmount = 5
+ flowState = True
+ isTweakable = True
+ hideFlow = False
+ flowMode = Both
+ }
+}
+PART
+{
+ part = fuelTank_4294699826
+ partName = Part
+ pos = 0,13.58831,0
+ attPos = 0,0,0
+ attPos0 = 0,-1.138691,0
+ rot = 0,0,0,1
+ attRot = 0,0,0,1
+ attRot0 = 0,0,0,1
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 0
+ dstg = 0
+ sidx = -1
+ sqor = -1
+ sepI = 0
+ attm = 0
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ link = liquidEngine3_4294696668
+ attN = top,kOSMachine1m_4294064856
+ attN = bottom,liquidEngine3_4294696668
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+ RESOURCE
+ {
+ name = LiquidFuel
+ amount = 180
+ maxAmount = 180
+ flowState = True
+ isTweakable = True
+ hideFlow = False
+ flowMode = Both
+ }
+ RESOURCE
+ {
+ name = Oxidizer
+ amount = 220
+ maxAmount = 220
+ flowState = True
+ isTweakable = True
+ hideFlow = False
+ flowMode = Both
+ }
+}
+PART
+{
+ part = liquidEngine3_4294696668
+ partName = Part
+ pos = 0,12.40519,0
+ attPos = 0,0,0
+ attPos0 = 0,-1.183123,0
+ rot = 0,0,0,1
+ attRot = 0,0,0,1
+ attRot0 = 0,0,0,1
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 0
+ dstg = 0
+ sidx = 0
+ sqor = 0
+ sepI = 0
+ attm = 0
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ link = stackDecoupler_4294691790
+ attN = top,fuelTank_4294699826
+ attN = bottom,stackDecoupler_4294691790
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleEngines
+ isEnabled = True
+ staged = False
+ flameout = False
+ EngineIgnited = False
+ engineShutdown = False
+ currentThrottle = 0
+ thrustPercentage = 100
+ manuallyOverridden = False
+ thrustPercentage_UIFlight
+ {
+ controlEnabled = True
+ minValue = 0
+ maxValue = 100
+ stepIncrement = 0.5
+ }
+ EVENTS
+ {
+ Activate
+ {
+ active = True
+ guiActive = True
+ guiIcon = Activate Engine
+ guiName = Activate Engine
+ category = Activate Engine
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ Shutdown
+ {
+ active = False
+ guiActive = True
+ guiIcon = Shutdown Engine
+ guiName = Shutdown Engine
+ category = Shutdown Engine
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ OnAction
+ {
+ actionGroup = None
+ }
+ ShutdownAction
+ {
+ actionGroup = None
+ }
+ ActivateAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = ModuleGimbal
+ isEnabled = True
+ gimbalLock = False
+ gimbalLimiter = 100
+ gimbalLock_UIFlight
+ {
+ controlEnabled = True
+ }
+ gimbalLimiter_UIFlight
+ {
+ controlEnabled = True
+ minValue = 0
+ maxValue = 100
+ stepIncrement = 1
+ }
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ ToggleAction
+ {
+ actionGroup = None
+ }
+ LockAction
+ {
+ actionGroup = None
+ }
+ FreeAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = ModuleAnimateHeat
+ isEnabled = True
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = ModuleJettison
+ isEnabled = True
+ isJettisoned = False
+ EVENTS
+ {
+ Jettison
+ {
+ active = False
+ guiActive = True
+ guiIcon = Jettison
+ guiName = Jettison
+ category = Jettison
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ JettisonAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = ModuleTestSubject
+ isEnabled = True
+ EVENTS
+ {
+ RunTestEvent
+ {
+ active = False
+ guiActive = True
+ guiIcon = Run Test
+ guiName = Run Test
+ category = Run Test
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = ModuleSurfaceFX
+ isEnabled = True
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
+PART
+{
+ part = stackDecoupler_4294691790
+ partName = Part
+ pos = 0,11.86732,0
+ attPos = 0,0,0
+ attPos0 = 0,-0.5378656,0
+ rot = 0,0,0,1
+ attRot = 0,0,0,1
+ attRot0 = 0,0,0,1
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 0
+ dstg = 1
+ sidx = 1
+ sqor = 0
+ sepI = 1
+ attm = 0
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ link = fuelTank.long_4294687468
+ attN = bottom,fuelTank.long_4294687468
+ attN = top,liquidEngine3_4294696668
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleDecouple
+ isEnabled = True
+ ejectionForcePercent = 100
+ isDecoupled = False
+ ejectionForcePercent_UIFlight
+ {
+ controlEnabled = True
+ minValue = 0
+ maxValue = 100
+ stepIncrement = 1
+ }
+ EVENTS
+ {
+ Decouple
+ {
+ active = True
+ guiActive = True
+ guiIcon = Decouple
+ guiName = Decouple
+ category = Decouple
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ DecoupleAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = ModuleTestSubject
+ isEnabled = True
+ EVENTS
+ {
+ RunTestEvent
+ {
+ active = False
+ guiActive = True
+ guiIcon = Run Test
+ guiName = Run Test
+ category = Run Test
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
+PART
+{
+ part = fuelTank.long_4294687468
+ partName = Part
+ pos = 0,9.85933,0
+ attPos = 0,0,0
+ attPos0 = 0,-2.007995,0
+ rot = 0,0,0,1
+ attRot = 0,0,0,1
+ attRot0 = 0,0,0,1
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 2
+ dstg = 2
+ sidx = -1
+ sqor = -1
+ sepI = 1
+ attm = 0
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ link = fuelTank.long_4294687162
+ attN = top,stackDecoupler_4294691790
+ attN = bottom,fuelTank.long_4294687162
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+ RESOURCE
+ {
+ name = LiquidFuel
+ amount = 360
+ maxAmount = 360
+ flowState = True
+ isTweakable = True
+ hideFlow = False
+ flowMode = Both
+ }
+ RESOURCE
+ {
+ name = Oxidizer
+ amount = 440
+ maxAmount = 440
+ flowState = True
+ isTweakable = True
+ hideFlow = False
+ flowMode = Both
+ }
+}
+PART
+{
+ part = fuelTank.long_4294687162
+ partName = Part
+ pos = 0,6.096828,0
+ attPos = 0,0,0
+ attPos0 = 0,-3.7625,0
+ rot = 0,0,0,1
+ attRot = 0,0,0,1
+ attRot0 = 0,0,0,1
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 2
+ dstg = 2
+ sidx = -1
+ sqor = -1
+ sepI = 1
+ attm = 0
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ link = liquidEngine2_4294683890
+ link = winglet3_4294678112
+ link = winglet3_4294677872
+ link = winglet3_4294677826
+ link = winglet3_4294677780
+ link = launchClamp1_4294673818
+ attN = top,fuelTank.long_4294687468
+ attN = bottom,liquidEngine2_4294683890
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+ RESOURCE
+ {
+ name = LiquidFuel
+ amount = 360
+ maxAmount = 360
+ flowState = True
+ isTweakable = True
+ hideFlow = False
+ flowMode = Both
+ }
+ RESOURCE
+ {
+ name = Oxidizer
+ amount = 440
+ maxAmount = 440
+ flowState = True
+ isTweakable = True
+ hideFlow = False
+ flowMode = Both
+ }
+}
+PART
+{
+ part = liquidEngine2_4294683890
+ partName = Part
+ pos = 0,3.307501,0
+ attPos = 0,0,0
+ attPos0 = 0,-2.789327,0
+ rot = 0,0,0,1
+ attRot = 0,0,0,1
+ attRot0 = 0,0,0,1
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 1
+ dstg = 2
+ sidx = 0
+ sqor = 1
+ sepI = 1
+ attm = 0
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ attN = top,fuelTank.long_4294687162
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleEngines
+ isEnabled = True
+ staged = False
+ flameout = False
+ EngineIgnited = False
+ engineShutdown = False
+ currentThrottle = 0
+ thrustPercentage = 100
+ manuallyOverridden = False
+ thrustPercentage_UIFlight
+ {
+ controlEnabled = True
+ minValue = 0
+ maxValue = 100
+ stepIncrement = 0.5
+ }
+ EVENTS
+ {
+ Activate
+ {
+ active = True
+ guiActive = True
+ guiIcon = Activate Engine
+ guiName = Activate Engine
+ category = Activate Engine
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ Shutdown
+ {
+ active = False
+ guiActive = True
+ guiIcon = Shutdown Engine
+ guiName = Shutdown Engine
+ category = Shutdown Engine
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ OnAction
+ {
+ actionGroup = None
+ }
+ ShutdownAction
+ {
+ actionGroup = None
+ }
+ ActivateAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = ModuleJettison
+ isEnabled = True
+ isJettisoned = True
+ EVENTS
+ {
+ Jettison
+ {
+ active = False
+ guiActive = True
+ guiIcon = Jettison
+ guiName = Jettison
+ category = Jettison
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ JettisonAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = ModuleGimbal
+ isEnabled = True
+ gimbalLock = False
+ gimbalLimiter = 100
+ gimbalLock_UIFlight
+ {
+ controlEnabled = True
+ }
+ gimbalLimiter_UIFlight
+ {
+ controlEnabled = True
+ minValue = 0
+ maxValue = 100
+ stepIncrement = 1
+ }
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ ToggleAction
+ {
+ actionGroup = None
+ }
+ LockAction
+ {
+ actionGroup = None
+ }
+ FreeAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = ModuleAnimateHeat
+ isEnabled = True
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = ModuleAlternator
+ isEnabled = True
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = ModuleSurfaceFX
+ isEnabled = True
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = ModuleTestSubject
+ isEnabled = True
+ EVENTS
+ {
+ RunTestEvent
+ {
+ active = False
+ guiActive = True
+ guiIcon = Run Test
+ guiName = Run Test
+ category = Run Test
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+ RESOURCE
+ {
+ name = ElectricCharge
+ amount = 0
+ maxAmount = 0
+ flowState = True
+ isTweakable = False
+ hideFlow = True
+ flowMode = Both
+ }
+}
+PART
+{
+ part = winglet3_4294678112
+ partName = Part
+ pos = -0.7810385,5.095463,-0.7810386
+ attPos = 0,0,0
+ attPos0 = -0.7810386,-1.001366,-0.7810386
+ rot = 5.671899E-09,0.3826834,-1.369318E-08,-0.9238796
+ attRot = 0,0,0,1
+ attRot0 = 5.671899E-09,0.3826834,-1.369318E-08,-0.9238796
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 2
+ dstg = 2
+ sidx = -1
+ sqor = -1
+ sepI = 1
+ attm = 1
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ sym = winglet3_4294677872
+ sym = winglet3_4294677826
+ sym = winglet3_4294677780
+ srfN = srfAttach,fuelTank.long_4294687162
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleControlSurface
+ isEnabled = True
+ ignorePitch = False
+ ignoreYaw = False
+ ignoreRoll = False
+ deploy = False
+ deployInvert = False
+ ignorePitch_UIFlight
+ {
+ controlEnabled = True
+ }
+ ignoreYaw_UIFlight
+ {
+ controlEnabled = True
+ }
+ ignoreRoll_UIFlight
+ {
+ controlEnabled = True
+ }
+ deploy_UIFlight
+ {
+ controlEnabled = True
+ }
+ deployInvert_UIFlight
+ {
+ controlEnabled = True
+ }
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ ActionToggle
+ {
+ actionGroup = None
+ }
+ ActionExtend
+ {
+ actionGroup = None
+ }
+ ActionRetract
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
+PART
+{
+ part = winglet3_4294677872
+ partName = Part
+ pos = -0.7810385,5.095463,0.7810385
+ attPos = 0,0,0
+ attPos0 = -0.7810386,-1.001366,0.7810385
+ rot = -5.671899E-09,-0.3826835,-1.369318E-08,-0.9238796
+ attRot = 0,0,0,1
+ attRot0 = -5.6719E-09,-0.3826835,-1.369318E-08,-0.9238796
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 2
+ dstg = 2
+ sidx = -1
+ sqor = -1
+ sepI = 1
+ attm = 1
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ sym = winglet3_4294678112
+ sym = winglet3_4294677826
+ sym = winglet3_4294677780
+ srfN = srfAttach,fuelTank.long_4294687162
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleControlSurface
+ isEnabled = True
+ ignorePitch = False
+ ignoreYaw = False
+ ignoreRoll = False
+ deploy = False
+ deployInvert = False
+ ignorePitch_UIFlight
+ {
+ controlEnabled = True
+ }
+ ignoreYaw_UIFlight
+ {
+ controlEnabled = True
+ }
+ ignoreRoll_UIFlight
+ {
+ controlEnabled = True
+ }
+ deploy_UIFlight
+ {
+ controlEnabled = True
+ }
+ deployInvert_UIFlight
+ {
+ controlEnabled = True
+ }
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ ActionToggle
+ {
+ actionGroup = None
+ }
+ ActionExtend
+ {
+ actionGroup = None
+ }
+ ActionRetract
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
+PART
+{
+ part = winglet3_4294677826
+ partName = Part
+ pos = 0.7810385,5.095463,0.7810386
+ attPos = 0,0,0
+ attPos0 = 0.7810386,-1.001366,0.7810386
+ rot = -1.369318E-08,-0.9238796,-5.671899E-09,-0.3826834
+ attRot = 0,0,0,1
+ attRot0 = -1.369318E-08,-0.9238796,-5.671899E-09,-0.3826834
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 2
+ dstg = 2
+ sidx = -1
+ sqor = -1
+ sepI = 1
+ attm = 1
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ sym = winglet3_4294678112
+ sym = winglet3_4294677872
+ sym = winglet3_4294677780
+ srfN = srfAttach,fuelTank.long_4294687162
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleControlSurface
+ isEnabled = True
+ ignorePitch = False
+ ignoreYaw = False
+ ignoreRoll = False
+ deploy = False
+ deployInvert = False
+ ignorePitch_UIFlight
+ {
+ controlEnabled = True
+ }
+ ignoreYaw_UIFlight
+ {
+ controlEnabled = True
+ }
+ ignoreRoll_UIFlight
+ {
+ controlEnabled = True
+ }
+ deploy_UIFlight
+ {
+ controlEnabled = True
+ }
+ deployInvert_UIFlight
+ {
+ controlEnabled = True
+ }
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ ActionToggle
+ {
+ actionGroup = None
+ }
+ ActionExtend
+ {
+ actionGroup = None
+ }
+ ActionRetract
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
+PART
+{
+ part = winglet3_4294677780
+ partName = Part
+ pos = 0.7810385,5.095463,-0.7810385
+ attPos = 0,0,0
+ attPos0 = 0.7810385,-1.001366,-0.7810386
+ rot = -1.369318E-08,-0.9238796,5.671899E-09,0.3826835
+ attRot = 0,0,0,1
+ attRot0 = -1.369318E-08,-0.9238796,5.6719E-09,0.3826835
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 2
+ dstg = 2
+ sidx = -1
+ sqor = -1
+ sepI = 1
+ attm = 1
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ sym = winglet3_4294678112
+ sym = winglet3_4294677872
+ sym = winglet3_4294677826
+ srfN = srfAttach,fuelTank.long_4294687162
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleControlSurface
+ isEnabled = True
+ ignorePitch = False
+ ignoreYaw = False
+ ignoreRoll = False
+ deploy = False
+ deployInvert = False
+ ignorePitch_UIFlight
+ {
+ controlEnabled = True
+ }
+ ignoreYaw_UIFlight
+ {
+ controlEnabled = True
+ }
+ ignoreRoll_UIFlight
+ {
+ controlEnabled = True
+ }
+ deploy_UIFlight
+ {
+ controlEnabled = True
+ }
+ deployInvert_UIFlight
+ {
+ controlEnabled = True
+ }
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ ActionToggle
+ {
+ actionGroup = None
+ }
+ ActionExtend
+ {
+ actionGroup = None
+ }
+ ActionRetract
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
+PART
+{
+ part = launchClamp1_4294673818
+ partName = Part
+ pos = -4.488975E-07,3.385004,-1.426199
+ attPos = 0,0,0
+ attPos0 = -4.513211E-07,-2.711823,-1.426199
+ rot = 1.711427E-08,-3.132037E-07,-5.360253E-15,-1
+ attRot = 0,0,0,1
+ attRot0 = 1.711427E-08,-3.132037E-07,-5.360253E-15,-1
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 1
+ dstg = 2
+ sidx = 1
+ sqor = 1
+ sepI = 2
+ attm = 1
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ srfN = srfAttach,fuelTank.long_4294687162
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = LaunchClamp
+ isEnabled = True
+ scaleFactor = 1.603186
+ height = 4.045155
+ towerRot = -1.711427E-08,3.132037E-07,5.360253E-15,-1
+ EVENTS
+ {
+ Release
+ {
+ active = False
+ guiActive = True
+ guiIcon = Release Clamp
+ guiName = Release Clamp
+ category = Release Clamp
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ ReleaseClamp
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = ModuleGenerator
+ isEnabled = True
+ generatorIsActive = False
+ throttle = 0
+ EVENTS
+ {
+ Activate
+ {
+ active = True
+ guiActive = True
+ guiIcon = Activate Generator
+ guiName = Activate Generator
+ category = Activate Generator
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ Shutdown
+ {
+ active = True
+ guiActive = True
+ guiIcon = Shutdown Generator
+ guiName = Shutdown Generator
+ category = Shutdown Generator
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ ToggleAction
+ {
+ actionGroup = None
+ }
+ ActivateAction
+ {
+ actionGroup = None
+ }
+ ShutdownAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = ModuleTestSubject
+ isEnabled = True
+ EVENTS
+ {
+ RunTestEvent
+ {
+ active = False
+ guiActive = True
+ guiIcon = Run Test
+ guiName = Run Test
+ category = Run Test
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
+PART
+{
+ part = solarPanels5_4290881882
+ partName = Part
+ pos = -4.842877E-08,14.65845,-0.597011
+ attPos = 0,0,0
+ attPos0 = -5.215406E-08,-0.06854534,-0.597011
+ rot = 0,1,0,-5.464577E-08
+ attRot = 0,0,0,1
+ attRot0 = 0,1,0,-5.464577E-08
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 0
+ dstg = 0
+ sidx = -1
+ sqor = -1
+ sepI = 0
+ attm = 1
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ sym = solarPanels5_4290881686
+ sym = solarPanels5_4290881652
+ sym = solarPanels5_4290881618
+ srfN = srfAttach,kOSMachine1m_4294064856
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleDeployableSolarPanel
+ isEnabled = True
+ currentRotation = (0, 0, 0, 0)
+ stateString = RETRACTED
+ storedAnimationTime = 0
+ storedAnimationSpeed = 0
+ EVENTS
+ {
+ Extend
+ {
+ active = True
+ guiActive = True
+ guiIcon = Extend Panels
+ guiName = Extend Panels
+ category = Extend Panels
+ guiActiveUnfocused = True
+ unfocusedRange = 4
+ externalToEVAOnly = True
+ }
+ Retract
+ {
+ active = True
+ guiActive = True
+ guiIcon = Retract Panels
+ guiName = Retract Panels
+ category = Retract Panels
+ guiActiveUnfocused = True
+ unfocusedRange = 4
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ ExtendPanelsAction
+ {
+ actionGroup = None
+ }
+ ExtendAction
+ {
+ actionGroup = None
+ }
+ RetractAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
+PART
+{
+ part = solarPanels5_4290881686
+ partName = Part
+ pos = -0.597011,14.65845,1.722947E-08
+ attPos = 0,0,0
+ attPos0 = -0.5970109,-0.06854534,1.676381E-08
+ rot = 0,0.7071068,0,-0.7071068
+ attRot = 0,0,0,1
+ attRot0 = 0,0.7071068,0,-0.7071069
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 0
+ dstg = 0
+ sidx = -1
+ sqor = -1
+ sepI = 0
+ attm = 1
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ sym = solarPanels5_4290881882
+ sym = solarPanels5_4290881652
+ sym = solarPanels5_4290881618
+ srfN = srfAttach,kOSMachine1m_4294064856
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleDeployableSolarPanel
+ isEnabled = True
+ currentRotation = (0, 0, 0, 0)
+ stateString = RETRACTED
+ storedAnimationTime = 0
+ storedAnimationSpeed = 0
+ EVENTS
+ {
+ Extend
+ {
+ active = True
+ guiActive = True
+ guiIcon = Extend Panels
+ guiName = Extend Panels
+ category = Extend Panels
+ guiActiveUnfocused = True
+ unfocusedRange = 4
+ externalToEVAOnly = True
+ }
+ Retract
+ {
+ active = True
+ guiActive = True
+ guiIcon = Retract Panels
+ guiName = Retract Panels
+ category = Retract Panels
+ guiActiveUnfocused = True
+ unfocusedRange = 4
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ ExtendPanelsAction
+ {
+ actionGroup = None
+ }
+ ExtendAction
+ {
+ actionGroup = None
+ }
+ RetractAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
+PART
+{
+ part = solarPanels5_4290881652
+ partName = Part
+ pos = 1.005828E-07,14.65845,0.597011
+ attPos = 0,0,0
+ attPos0 = 1.043081E-07,-0.06854534,0.597011
+ rot = 0,-9.835716E-08,0,-1
+ attRot = 0,0,0,1
+ attRot0 = 0,-9.835716E-08,0,-1
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 0
+ dstg = 0
+ sidx = -1
+ sqor = -1
+ sepI = 0
+ attm = 1
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ sym = solarPanels5_4290881882
+ sym = solarPanels5_4290881686
+ sym = solarPanels5_4290881618
+ srfN = srfAttach,kOSMachine1m_4294064856
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleDeployableSolarPanel
+ isEnabled = True
+ currentRotation = (0, 0, 0, 0)
+ stateString = RETRACTED
+ storedAnimationTime = 0
+ storedAnimationSpeed = 0
+ EVENTS
+ {
+ Extend
+ {
+ active = True
+ guiActive = True
+ guiIcon = Extend Panels
+ guiName = Extend Panels
+ category = Extend Panels
+ guiActiveUnfocused = True
+ unfocusedRange = 4
+ externalToEVAOnly = True
+ }
+ Retract
+ {
+ active = True
+ guiActive = True
+ guiIcon = Retract Panels
+ guiName = Retract Panels
+ category = Retract Panels
+ guiActiveUnfocused = True
+ unfocusedRange = 4
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ ExtendPanelsAction
+ {
+ actionGroup = None
+ }
+ ExtendAction
+ {
+ actionGroup = None
+ }
+ RetractAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
+PART
+{
+ part = solarPanels5_4290881618
+ partName = Part
+ pos = 0.597011,14.65845,-8.800998E-08
+ attPos = 0,0,0
+ attPos0 = 0.5970109,-0.06854534,-8.754432E-08
+ rot = 0,-0.7071068,0,-0.7071068
+ attRot = 0,0,0,1
+ attRot0 = 0,-0.7071069,0,-0.7071068
+ mir = 1,1,1
+ symMethod = Radial
+ istg = 0
+ dstg = 0
+ sidx = -1
+ sqor = -1
+ sepI = 0
+ attm = 1
+ modCost = 0
+ modMass = 0
+ modSize = (0.0, 0.0, 0.0)
+ sym = solarPanels5_4290881882
+ sym = solarPanels5_4290881686
+ sym = solarPanels5_4290881652
+ srfN = srfAttach,kOSMachine1m_4294064856
+ EVENTS
+ {
+ }
+ ACTIONS
+ {
+ }
+ PARTDATA
+ {
+ }
+ MODULE
+ {
+ name = ModuleDeployableSolarPanel
+ isEnabled = True
+ currentRotation = (0, 0, 0, 0)
+ stateString = RETRACTED
+ storedAnimationTime = 0
+ storedAnimationSpeed = 0
+ EVENTS
+ {
+ Extend
+ {
+ active = True
+ guiActive = True
+ guiIcon = Extend Panels
+ guiName = Extend Panels
+ category = Extend Panels
+ guiActiveUnfocused = True
+ unfocusedRange = 4
+ externalToEVAOnly = True
+ }
+ Retract
+ {
+ active = True
+ guiActive = True
+ guiIcon = Retract Panels
+ guiName = Retract Panels
+ category = Retract Panels
+ guiActiveUnfocused = True
+ unfocusedRange = 4
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ ExtendPanelsAction
+ {
+ actionGroup = None
+ }
+ ExtendAction
+ {
+ actionGroup = None
+ }
+ RetractAction
+ {
+ actionGroup = None
+ }
+ }
+ }
+ MODULE
+ {
+ name = KOSNameTag
+ isEnabled = True
+ nameTag =
+ EVENTS
+ {
+ PopupNameTagChanger
+ {
+ active = True
+ guiActive = True
+ guiActiveEditor = True
+ guiIcon = Change Name Tag
+ guiName = Change Name Tag
+ category = Change Name Tag
+ guiActiveUnfocused = False
+ unfocusedRange = 2
+ externalToEVAOnly = True
+ }
+ }
+ ACTIONS
+ {
+ }
+ }
+}
diff --git a/doc/source/_images/tutorials/quickstart/example_2_0.png b/doc/source/_images/tutorials/quickstart/example_2_0.png
new file mode 100644
index 000000000..4af649893
Binary files /dev/null and b/doc/source/_images/tutorials/quickstart/example_2_0.png differ
diff --git a/doc/source/_images/tutorials/quickstart/example_2_1.png b/doc/source/_images/tutorials/quickstart/example_2_1.png
index 469e5b5cb..f33cfe0bc 100644
Binary files a/doc/source/_images/tutorials/quickstart/example_2_1.png and b/doc/source/_images/tutorials/quickstart/example_2_1.png differ
diff --git a/doc/source/_images/tutorials/quickstart/example_2_2.png b/doc/source/_images/tutorials/quickstart/example_2_2.png
index 747bb0a59..18688e7eb 100644
Binary files a/doc/source/_images/tutorials/quickstart/example_2_2.png and b/doc/source/_images/tutorials/quickstart/example_2_2.png differ
diff --git a/doc/source/_images/tutorials/quickstart/example_2_3.png b/doc/source/_images/tutorials/quickstart/example_2_3.png
index 6833d466d..9aeb740c5 100644
Binary files a/doc/source/_images/tutorials/quickstart/example_2_3.png and b/doc/source/_images/tutorials/quickstart/example_2_3.png differ
diff --git a/doc/source/_images/tutorials/quickstart/example_2_4.png b/doc/source/_images/tutorials/quickstart/example_2_4.png
index 3898ec833..6d6ef0be9 100644
Binary files a/doc/source/_images/tutorials/quickstart/example_2_4.png and b/doc/source/_images/tutorials/quickstart/example_2_4.png differ
diff --git a/doc/source/_images/tutorials/quickstart/example_2_5.png b/doc/source/_images/tutorials/quickstart/example_2_5.png
index c51a301e5..93c259f14 100644
Binary files a/doc/source/_images/tutorials/quickstart/example_2_5.png and b/doc/source/_images/tutorials/quickstart/example_2_5.png differ
diff --git a/doc/source/_images/tutorials/quickstart/example_2_6.png b/doc/source/_images/tutorials/quickstart/example_2_6.png
index 3fab8a28e..34702abaf 100644
Binary files a/doc/source/_images/tutorials/quickstart/example_2_6.png and b/doc/source/_images/tutorials/quickstart/example_2_6.png differ
diff --git a/doc/source/_images/tutorials/quickstart/example_2_7.png b/doc/source/_images/tutorials/quickstart/example_2_7.png
new file mode 100644
index 000000000..3a04d23f2
Binary files /dev/null and b/doc/source/_images/tutorials/quickstart/example_2_7.png differ
diff --git a/doc/source/_static/css/kos_theme.css b/doc/source/_static/css/kos_theme.css
new file mode 100644
index 000000000..756c06d8d
--- /dev/null
+++ b/doc/source/_static/css/kos_theme.css
@@ -0,0 +1,20 @@
+/* start from read-the-docs' standard theme: */
+@import url("theme.css");
+
+/* Some of the syntax highlighing done by
+ * read-the-docs is barely visible unless the
+ * font is zoomed large. At 10 point or 12 point,
+ * boldface doesn't stand out on the font they use,
+ * and many of the keywords are only highlighted
+ * by being bold. So doing a slight tint from
+ * the default black just to make it stand out a
+ * little bit more:
+ */
+.k { color:#042; } /*keywords*/
+.o { color:#024; } /*operators*/
+
+a.reference span.pre { color: #2980B9; }
+
+/* It is possible to do a lot more here, but let's
+ * leave it at that for now.
+ */
diff --git a/doc/source/about.rst b/doc/source/about.rst
index 7b0d1e362..f7bf0d948 100644
--- a/doc/source/about.rst
+++ b/doc/source/about.rst
@@ -4,6 +4,6 @@ About **kOS** and **KerboScript**
=================================
kOS was originally created by Nivekk.
-It is under `active development`_ by the
+It is under active development by the
`kOS Team `_ and is licensed under terms of GNU General Public License Version 3, 29 June 2007, Copyright © 2007 `Free Software Foundation, Inc. `_
diff --git a/doc/source/addons.rst b/doc/source/addons.rst
index ab715c98c..71723ac94 100644
--- a/doc/source/addons.rst
+++ b/doc/source/addons.rst
@@ -12,6 +12,7 @@ Addon Reference
RemoteTech
Kerbal Alarm Clock
Infernal Robotics
+ DMagic Orbital Science
To help KOS scripts identify whether or not certain mod is installed and available following suffixed functions were introduced in version 0.17
diff --git a/doc/source/addons/IR.rst b/doc/source/addons/IR.rst
index 5cf064e1e..6dee5caed 100644
--- a/doc/source/addons/IR.rst
+++ b/doc/source/addons/IR.rst
@@ -16,19 +16,19 @@ Access structure IRAddon via `ADDONS:IR`.
.. structure:: IRAddon
- ===================================== ========================= =============
- Suffix Type Description
- ===================================== ========================= =============
- :attr:`AVAILABLE` bool(readonly) Returns True if mod Infernal Robotics is installed, available to KOS and applicable to current craft.
- :attr:`GROUPS` List (readonly) Lists all Servo Groups for current focused vessel
- :attr:`ALLSERVOS` List (readonly) Lists all Servos for current focused vessel
- ===================================== ========================= =============
+ ===================================== ==================================== =============
+ Suffix Type Description
+ ===================================== ==================================== =============
+ :attr:`AVAILABLE` :ref:`boolean ` (readonly) Returns True if mod Infernal Robotics is installed, available to KOS and applicable to current craft.
+ :attr:`GROUPS` List (readonly) Lists all Servo Groups for the Vessel on which CPU runs this command (see details below).
+ :attr:`ALLSERVOS` List (readonly) Lists all Servos for the Vessel on which CPU runs this command (see details below).
+ ===================================== ==================================== =============
.. attribute:: IRAddon:AVAILABLE
- :type: bool
+ :type: :ref:`boolean `
:access: Get only
Returns True if mod Infernal Robotics is installed, available to KOS and applicable to current craft.
@@ -44,7 +44,8 @@ Access structure IRAddon via `ADDONS:IR`.
:type: List of :struct:`IRControlGroup` objects
:access: Get only
- Lists all Servo Groups for current focused vessel. Example of use::
+ Lists all Servo Groups for the Vessel on which the script is being executed. On IR versions prior to 0.21.5 will always return servo groups for current focused vessel.
+ Example of use::
for g in ADDONS:IR:GROUPS
{
@@ -57,7 +58,8 @@ Access structure IRAddon via `ADDONS:IR`.
:type: List of :struct:`IRServo` objects
:access: Get only
- Lists all Servos for current focused vessel. Example of use::
+ Lists all Servos for the Vessel on which the script is being executed. On IR versions prior to 0.21.5 will always return servos for current focused vessel.
+ Example of use::
for s in ADDONS:IR:ALLSERVOS
{
@@ -70,12 +72,13 @@ Access structure IRAddon via `ADDONS:IR`.
===================================== ========================= =============
Suffix Type Description
===================================== ========================= =============
- :attr:`NAME` string Name of the Control Group
- :attr:`SPEED` float Speed multiplier set in the IR UI
- :attr:`EXPANDED` bool True if Group is expanded in IR UI
- :attr:`FORWARDKEY` string Key assigned to forward movement
- :attr:`REVERSEKEY` string Key assigned to reverse movement
+ :attr:`NAME` :ref:`string ` Name of the Control Group
+ :attr:`SPEED` :ref:`scalar ` Speed multiplier set in the IR UI
+ :attr:`EXPANDED` :ref:`Boolean ` True if Group is expanded in IR UI
+ :attr:`FORWARDKEY` :ref:`string ` Key assigned to forward movement
+ :attr:`REVERSEKEY` :ref:`string ` Key assigned to reverse movement
:attr:`SERVOS` List (readonly) List of servos in the group
+ :attr:`VESSEL` :struct:`Vessel` Vessel object, owning this servo group. Readonly, requires IR version 0.21.5 or later.
:meth:`MOVERIGHT()` void Commands servos in the group to move in positive direction
:meth:`MOVELEFT()` void Commands servos in the group to move in negative direction
@@ -87,35 +90,35 @@ Access structure IRAddon via `ADDONS:IR`.
.. attribute:: IRControlGroup:NAME
- :type: string
+ :type: :ref:`string `
:access: Get/Set
Name of the Control Group (cannot be empty).
.. attribute:: IRControlGroup:SPEED
- :type: float
+ :type: :ref:`scalar `
:access: Get/Set
Speed multiplier as set in the IR user interface. Avoid setting it to 0.
.. attribute:: IRControlGroup:EXPANDED
- :type: bool
+ :type: :ref:`Boolean `
:access: Get/Set
True if Group is expanded in IR UI
.. attribute:: IRControlGroup:FORWARDKEY
- :type: string
+ :type: :ref:`string `
:access: Get/Set
Key assigned to forward movement. Can be empty.
.. attribute:: IRControlGroup:REVERSEKEY
- :type: string
+ :type: :ref:`string `
:access: Get/Set
Key assigned to reverse movement. Can be empty.
@@ -136,6 +139,13 @@ Access structure IRAddon via `ADDONS:IR`.
}
}
+.. attribute:: IRControlGroup:VESSEL
+
+ :type: :struct:`Vessel`
+ :access: Get only
+
+ If IR 0.21.5 or later is installed will return a Vessel that owns this ServoGroup, otherwise will return current focused Vessel
+
.. method:: IRControlGroup:MOVERIGHT()
:return: void
@@ -175,115 +185,155 @@ Access structure IRAddon via `ADDONS:IR`.
.. structure:: IRServo
- ===================================== ========================= =============
- Suffix Type Description
- ===================================== ========================= =============
- :attr:`NAME` string Name of the Servo
- :attr:`UID` int Unique ID of the servo part (part.flightID).
- :attr:`HIGHLIGHT` bool (set-only) Set Hightlight status of the part.
- :attr:`POSITION` float (readonly) Current position of the servo.
- :attr:`MINCFGPOSITION` float (readonly) Minimum position for servo as defined by part creator in part.cfg
- :attr:`MAXCFGPOSITION` float (readonly) Maximum position for servo as defined by part creator in part.cfg
- :attr:`MINPOSITION` float Minimum position for servo, from tweakable.
- :attr:`MAXPOSITION` float Maximum position for servo, from tweakable.
- :attr:`CONFIGSPEED` float (readonly) Servo movement speed as defined by part creator in part.cfg
- :attr:`SPEED` float Servo speed multiplier, from tweakable.
- :attr:`CURRENTSPEED` float (readonly) Current Servo speed.
- :attr:`ACCELERATION` float Servo acceleration multiplier, from tweakable.
-
- :meth:`MOVERIGHT()` void Commands servo to move in positive direction
- :meth:`MOVELEFT()` void Commands servo to move in negative direction
- :meth:`MOVECENTER()` void Commands servo to move to default position
- :meth:`MOVENEXTPRESET()` void Commands servo to move to next preset
- :meth:`MOVEPREVPRESET()` void Commands servo to move to previous preset
- :meth:`STOP()` void Commands servo to stop
- :meth:`MOVETO(position, speedMult)` void Commands servo to move to `position` with `speedMult` multiplier
- ===================================== ========================= =============
+ ===================================== ==================================== =============
+ Suffix Type Description
+ ===================================== ==================================== =============
+ :attr:`NAME` :ref:`string ` Name of the Servo
+ :attr:`UID` :ref:`scalar ` (int) Unique ID of the servo part (part.flightID).
+ :attr:`HIGHLIGHT` :ref:`Boolean ` (set-only) Set Hightlight status of the part.
+ :attr:`POSITION` :ref:`scalar ` (readonly) Current position of the servo.
+ :attr:`MINCFGPOSITION` :ref:`scalar ` (readonly) Minimum position for servo as defined by part creator in part.cfg
+ :attr:`MAXCFGPOSITION` :ref:`scalar ` (readonly) Maximum position for servo as defined by part creator in part.cfg
+ :attr:`MINPOSITION` :ref:`scalar ` Minimum position for servo, from tweakable.
+ :attr:`MAXPOSITION` :ref:`scalar ` Maximum position for servo, from tweakable.
+ :attr:`CONFIGSPEED` :ref:`scalar ` (readonly) Servo movement speed as defined by part creator in part.cfg
+ :attr:`SPEED` :ref:`scalar ` Servo speed multiplier, from tweakable.
+ :attr:`CURRENTSPEED` :ref:`scalar ` (readonly) Current Servo speed.
+ :attr:`ACCELERATION` :ref:`scalar ` Servo acceleration multiplier, from tweakable.
+ :attr:`ISMOVING` :ref:`Boolean ` (readonly) True if Servo is moving
+ :attr:`ISFREEMOVING` :ref:`Boolean ` (readonly) True if Servo is uncontrollable (ex. docking washer)
+ :attr:`LOCKED` :ref:`Boolean ` Servo's locked status, set true to lock servo.
+ :attr:`INVERTED` :ref:`Boolean ` Servo's inverted status, set true to invert servo's axis.
+ :attr:`PART` :struct:`Part` A reference to a Part containing servo module.
+
+ :meth:`MOVERIGHT()` void Commands servo to move in positive direction
+ :meth:`MOVELEFT()` void Commands servo to move in negative direction
+ :meth:`MOVECENTER()` void Commands servo to move to default position
+ :meth:`MOVENEXTPRESET()` void Commands servo to move to next preset
+ :meth:`MOVEPREVPRESET()` void Commands servo to move to previous preset
+ :meth:`STOP()` void Commands servo to stop
+ :meth:`MOVETO(position, speedMult)` void Commands servo to move to `position` with `speedMult` multiplier
+ ===================================== ==================================== =============
.. attribute:: IRServo:NAME
- :type: string
+ :type: :ref:`string `
:access: Get/Set
Name of the Control Group (cannot be empty).
.. attribute:: IRServo:UID
- :type: int
+ :type: :ref:`scalar `
:access: Get
Unique ID of the servo part (part.flightID).
.. attribute:: IRServo:HIGHLIGHT
- :type: bool
+ :type: :ref:`Boolean `
:access: Set
Set Hightlight status of the part.
.. attribute:: IRServo:POSITION
- :type: float
+ :type: :ref:`scalar `
:access: Get
Current position of the servo.
.. attribute:: IRServo:MINCFGPOSITION
- :type: float
+ :type: :ref:`scalar `
:access: Get
Minimum position for servo as defined by part creator in part.cfg
.. attribute:: IRServo:MAXCFGPOSITION
- :type: float
+ :type: :ref:`scalar `
:access: Get
Maximum position for servo as defined by part creator in part.cfg
.. attribute:: IRServo:MINPOSITION
- :type: float
+ :type: :ref:`scalar `
:access: Get/Set
Minimum position for servo, from tweakable.
.. attribute:: IRServo:MAXPOSITION
- :type: float
+ :type: :ref:`scalar `
:access: Get/Set
Maximum position for servo, from tweakable.
.. attribute:: IRServo:CONFIGSPEED
- :type: float
+ :type: :ref:`scalar `
:access: Get
Servo movement speed as defined by part creator in part.cfg
.. attribute:: IRServo:SPEED
- :type: float
+ :type: :ref:`scalar `
:access: Get/Set
Servo speed multiplier, from tweakable.
.. attribute:: IRServo:CURRENTSPEED
- :type: float
+ :type: :ref:`scalar `
:access: Get
Current Servo speed.
.. attribute:: IRServo:ACCELERATION
- :type: float
+ :type: :ref:`scalar `
:access: Get/Set
Servo acceleration multiplier, from tweakable.
+.. attribute:: IRServo:ISMOVING
+
+ :type: :ref:`Boolean `
+ :access: Get
+
+ True if Servo is moving
+
+.. attribute:: IRServo:ISFREEMOVING
+
+ :type: :ref:`Boolean `
+ :access: Get
+
+ True if Servo is uncontrollable (ex. docking washer)
+
+.. attribute:: IRServo:LOCKED
+
+ :type: :ref:`Boolean `
+ :access: Get/Set
+
+ Servo's locked status, set true to lock servo.
+
+.. attribute:: IRServo:INVERTED
+
+ :type: :ref:`Boolean `
+ :access: Get/Set
+
+ Servo's inverted status, set true to invert servo's axis.
+
+.. attribute:: IRServo:PART
+
+ :type: :struct:`Part`
+ :access: Get
+
+ Returns reference to the :struct:`Part` containing servo module. Please note that Part:UID does not equal IRServo:UID.
+
.. method:: IRServo:MOVERIGHT()
diff --git a/doc/source/addons/KAC.rst b/doc/source/addons/KAC.rst
index 3052be904..4ec13d60f 100644
--- a/doc/source/addons/KAC.rst
+++ b/doc/source/addons/KAC.rst
@@ -54,38 +54,38 @@ Access structure KACAddon via `ADDONS:KAC`.
.. structure:: KACAlarm
- ===================================== ========================= =============
- Suffix Type Description
- ===================================== ========================= =============
- :attr:`ID` string (readonly) Unique identifier
- :attr:`NAME` string Name of the alarm
- :attr:`ACTION` string What should the Alarm Clock do when the alarm fires
- :attr:`TYPE` string (readonly) What type of Alarm is this - affects icon displayed and some calc options
- :attr:`NOTES` string Long description of the alarm (optional)
- :attr:`REMAINING` scalar (s) Time remaining until alarm is triggered
- :attr:`REPEAT` bool Should the alarm be repeated once it fires
- :attr:`REPEATPERIOD` scalar (s) How long after the alarm fires should the next alarm be set up
- :attr:`ORIGINBODY` string Name of the body the vessel is departing from
- :attr:`TARGETBODY` string Name of the body the vessel is arriving at
- ===================================== ========================= =============
+ ===================================== ============================ =============
+ Suffix Type Description
+ ===================================== ============================ =============
+ :attr:`ID` :struct:`string` (readonly) Unique identifier
+ :attr:`NAME` :struct:`string` Name of the alarm
+ :attr:`ACTION` :struct:`string` What should the Alarm Clock do when the alarm fires
+ :attr:`TYPE` :struct:`string` (readonly) What type of Alarm is this - affects icon displayed and some calc options
+ :attr:`NOTES` :struct:`string` Long description of the alarm (optional)
+ :attr:`REMAINING` :struct:`scalar` (s) Time remaining until alarm is triggered
+ :attr:`REPEAT` :struct:`boolean` Should the alarm be repeated once it fires
+ :attr:`REPEATPERIOD` :struct:`scalar` (s) How long after the alarm fires should the next alarm be set up
+ :attr:`ORIGINBODY` :struct:`string` Name of the body the vessel is departing from
+ :attr:`TARGETBODY` :struct:`string` Name of the body the vessel is arriving at
+ ===================================== ============================ =============
.. attribute:: KACAlarm:ID
- :type: string
+ :type: :ref:`string `
:access: Get only
Unique identifier of the alarm.
.. attribute:: KACAlarm:NAME
- :type: string
+ :type: :ref:`string `
:access: Get/Set
Name of the alarm. Displayed in main KAC window.
.. attribute:: KACAlarm:ACTION
- :type: string
+ :type: :ref:`string `
:access: Get/Set
Should be one of the following
@@ -99,7 +99,7 @@ Access structure KACAddon via `ADDONS:KAC`.
.. attribute:: KACAlarm:TYPE
- :type: string
+ :type: :ref:`string `
:access: Get only
Can only be set at Alarm creation.
@@ -126,7 +126,7 @@ Access structure KACAddon via `ADDONS:KAC`.
.. attribute:: KACAlarm:NOTES
- :type: string
+ :type: :ref:`string `
:access: Get/Set
Long description of the alarm. Can be seen when alarm pops or by double-clicking alarm in UI.
@@ -135,35 +135,35 @@ Access structure KACAddon via `ADDONS:KAC`.
.. attribute:: KACAlarm:REMAINING
- :type: double
+ :type: :ref:`scalar `
:access: Get only
Time remaining until alarm is triggered.
.. attribute:: KACAlarm:REPEAT
- :type: bool
- :access: Get/Set
+ :type: :ref:`boolean `
+ :access: Get/Set
- Should the alarm be repeated once it fires.
+ Should the alarm be repeated once it fires.
.. attribute:: KACAlarm:REPEATPERIOD
- :type: double
- :access: Get/Set
+ :type: :ref:`scalar `
+ :access: Get/Set
- How long after the alarm fires should the next alarm be set up.
+ How long after the alarm fires should the next alarm be set up.
.. attribute:: KACAlarm:ORIGINBODY
- :type: string
+ :type: :ref:`string `
:access: Get/Set
Name of the body the vessel is departing from.
.. attribute:: KACAlarm:TARGETBODY
- :type: string
+ :type: :ref:`string `
:access: Get/Set
Name of the body the vessel is arriving to.
@@ -193,7 +193,7 @@ Available Functions
.. function:: LISTALARMS(alarmType)
If `alarmType` equals "All", returns :struct:`List` of *all* :struct:`KACAlarm` objects attached to current vessel or have no vessel attached.
- Otherwise returns :struct:`List` of all :struct:`KACAlarm` objects with `KACAlarm:TYPE` equeal to `alarmType' and attached to current vessel or have no vessel attached.::
+ Otherwise returns :struct:`List` of all :struct:`KACAlarm` objects with `KACAlarm:TYPE` equeal to `alarmType` and attached to current vessel or have no vessel attached.::
set al to listAlarms("All").
for i in al
diff --git a/doc/source/addons/OrbitalScience.rst b/doc/source/addons/OrbitalScience.rst
new file mode 100644
index 000000000..965f4648d
--- /dev/null
+++ b/doc/source/addons/OrbitalScience.rst
@@ -0,0 +1,41 @@
+.. _orbitalscience:
+
+DMagic Orbital Science
+======================
+
+DMagic Orbital Science is a modification for Squad’s "Kerbal Space Program" (KSP) which adds extra science experiments to the game. Those experiments under the hood work differently
+than stock ones and require dedicated support (see :ref:`ScienceExperimentModule `).
+
+- Download: http://spacedock.info/mod/128/DMagic%20Orbital%20Science or https://github.com/DMagic1/Orbital-Science/releases
+- Sources: https://github.com/DMagic1/Orbital-Science
+
+Most of the time Orbital Science experiments should work exactly like stock ones,
+they inherit all suffixes from :ref:`ScienceExperimentModule `::
+
+ SET P TO SHIP:PARTSTAGGED("")[0].
+ SET M TO P:GETMODULE("dmmodulescienceanimate").
+
+ PRINT M:ISRERUNNABLE.
+ PRINT M:INOPERABLE.
+ M:DEPLOY.
+ WAIT UNTIL M:HASDATA.
+ M:TRANSMIT.
+
+All Orbital Science experiments do get an extra :code:`TOGGLE` suffix that activates and
+deactivates them::
+
+
+ SET P TO SHIP:PARTSTAGGED("collector")[0].
+ SET M TO P:GETMODULE("dmsolarcollector").
+
+ M:TOGGLE.
+
+`Submersible Oceanography and Bathymetry` has two extra suffixes that turn the experiment's
+lights on and off::
+
+ SET P TO SHIP:PARTSTAGGED("bathymetry")[0].
+ SET M TO P:GETMODULE("dmbathymetry").
+
+ M:LIGHTSON.
+ WAIT 3.
+ M:LIGHTSOFF.
diff --git a/doc/source/addons/RemoteTech.rst b/doc/source/addons/RemoteTech.rst
index 1ad08f764..6cc594f4c 100644
--- a/doc/source/addons/RemoteTech.rst
+++ b/doc/source/addons/RemoteTech.rst
@@ -15,25 +15,40 @@ Interaction with kOS
When you have RemoteTech installed you can only interact with the core's terminal when you have a connection to KSC on any unmanned craft. Scripts launched when you still had a connection will continue to execute even if your unmanned craft loses connection to KSC. But you should note, that when there is no connection to KSC the archive volume is inaccessible. This will require you to plan ahead and copy necessary scripts for your mission to probe hard disk, if your kerbals and/or other scripts need to use them while not connected.
+If you launch a manned craft while using RemoteTech, you are still able to input commands from the terminal even if you do not have a connection to the KSC. The archive will still be inaccessible without a connection to the KSC. Under the current implementation, there is no delay when accessing the archive with a local terminal. This implementation may change in the future to account for delays in reading and writing data over the connection.
+
+It is possible to activate/deactivate RT antennas, as well as set their targets using kOS::
+
+ SET p TO SHIP:PARTSNAMED("mediumDishAntenna")[0].
+ SET m to p:GETMODULE("ModuleRTAntenna").
+ m:DOEVENT("activate").
+ m:SETFIELD("target", "mission-control").
+ // or
+ m:SETFIELD("target", mun).
+ m:SETFIELD("target", "minmus").
+
+Acceptable values for `"target"` are: `"no-target"`, `"active-vessel"`, `"mission-control"`, a :struct:`Body`, a :struct:`Vessel`, or a string containing the name of a body or vessel.
+
Starting version 0.17 of kOS you can access structure RTAddon via `ADDONS:RT`.
.. structure:: RTAddon
- ===================================== ========================= =============
- Suffix Type Description
- ===================================== ========================= =============
- :attr:`AVAILABLE` bool(readonly) True if RT is installed and RT integration enabled.
- :meth:`DELAY(vessel)` double Get shortest possible delay to given :struct:`Vessel`
- :meth:`KSCDELAY(vessel)` double Get delay from KSC to given :struct:`Vessel`
- :meth:`HASCONNECTION(vessel)` bool True if given :struct:`Vessel` has any connection
- :meth:`HASKSCCONNECTION(vessel)` bool True if given :struct:`Vessel` has connection to KSC
- ===================================== ========================= =============
+ ===================================== ===================================== =============
+ Suffix Type Description
+ ===================================== ===================================== =============
+ :attr:`AVAILABLE` :ref:`Boolean ` (readonly) True if RT is installed and RT integration enabled.
+ :meth:`DELAY(vessel)` :ref:`scalar ` Get shortest possible delay to given :struct:`Vessel`
+ :meth:`KSCDELAY(vessel)` :ref:`scalar ` Get delay from KSC to given :struct:`Vessel`
+ :meth:`HASCONNECTION(vessel)` :ref:`Boolean ` True if given :struct:`Vessel` has any connection
+ :meth:`HASKSCCONNECTION(vessel)` :ref:`Boolean ` True if given :struct:`Vessel` has connection to KSC
+ :meth:`HASLOCALCONTROL(vessel)` :ref:`Boolean ` True if given :struct:`Vessel` has local control
+ ===================================== ===================================== =============
.. attribute:: RTADDON:AVAILABLE
- :type: bool
+ :type: :ref:`Boolean `
:access: Get only
True if RT is installed and RT integration enabled.
@@ -41,27 +56,34 @@ Starting version 0.17 of kOS you can access structure RTAddon via `ADDONS:RT`.
.. method:: RTAddon:DELAY(vessel)
:parameter vessel: :struct:`Vessel`
- :return: (double) seconds
+ :return: (:ref:`scalar `) seconds
Returns shortest possible delay for `vessel` (Will be less than KSC delay if you have a local command post).
.. method:: RTAddon:KSCDELAY(vessel)
:parameter vessel: :struct:`Vessel`
- :return: (double) seconds
+ :return: (:ref:`scalar `) seconds
Returns delay in seconds from KSC to `vessel`.
.. method:: RTAddon:HASCONNECTION(vessel)
:parameter vessel: :struct:`Vessel`
- :return: bool
+ :return: :ref:`Boolean `
Returns True if `vessel` has any connection (including to local command posts).
.. method:: RTAddon:HASKSCCONNECTION(vessel)
:parameter vessel: :struct:`Vessel`
- :return: bool
+ :return: :ref:`Boolean `
Returns True if `vessel` has connection to KSC.
+
+.. method:: RTAddon:HASLOCALCONTROL(vessel)
+
+ :parameter vessel: :struct:`Vessel`
+ :return: :ref:`Boolean `
+
+ Returns True if `vessel` has local control (and thus not requiring a RemoteTech connection).
diff --git a/doc/source/bindings.rst b/doc/source/bindings.rst
index 451203c0b..455a5dc0b 100644
--- a/doc/source/bindings.rst
+++ b/doc/source/bindings.rst
@@ -16,19 +16,41 @@ NAMED VESSELS AND BODIES
SHIP:
-| **Variable name**: SHIP
-| **Gettable**: yes
-| **Settable**: no
-| **Type**: `Vessel `__
-| **Description**: Whichever vessel happens to be the one containing the CPU part that is running this Kerboscript code at the moment. This is the `CPU Vessel `__.
+- **Variable name**: SHIP
+- **Gettable**: yes
+- **Settable**: no
+- **Type**: `Vessel `__
+- **Description**: Whichever vessel happens to be the one containing the
+ CPU part that is running this Kerboscript code at the moment. This is
+ the `CPU Vessel `__.
TARGET:
-| **Variable Name**: TARGET
-| **Gettable**: yes
-| **Settable**: yes
-| **Type**: `Vessel `__ or `Body `__
-| **Description**: Whichever `Orbitable `__ object happens to be the one selected as the current KSP target. If set to a string, it will assume the string is the name of a vessel being targetted and set it to a vessel by that name. For best results set it to Body("some name") or Vessel("some name") explicitly.
+- **Variable Name**: TARGET
+- **Gettable**: yes
+- **Settable**: yes
+- **Type**: `Vessel `__ or
+ `Body `__
+- **Description**: Whichever `Orbitable `__
+ object happens to be the one selected as the current KSP target. If set
+ to a string, it will assume the string is the name of a vessel being
+ targeted and set it to a vessel by that name. For best results set it
+ to Body("some name") or Vessel("some name") explicitly. This will
+ throw an exception if called from a vessel other than the active vessel,
+ as limitations in how KSP sets the target vessel limit the
+ implementation to working with only the active vessel.
+
+.. _hastarget:
+
+HASTARGET:
+
+- **Variable Name**: TARGET
+- **Gettable**: yes
+- **Settable**: no
+- **Type**: boolean
+- **Description**: Will return true if the ship has a target selected.
+ This will always return false when not on the active vessel, due to
+ limitations in how KSP sets the target vessel.
Alias shortcuts for SHIP fields
-------------------------------
@@ -57,12 +79,11 @@ BODY Same as SHIP:BODY
ANGULARMOMENTUM Same as SHIP:ANGULARMOMENTUM
ANGULARVEL Same as SHIP:ANGULARVEL
ANGULARVELOCITY Same as SHIP:ANGULARVEL
-COMMRANGE Same as SHIP:COMMRANGE
MASS Same as SHIP:MASS
VERTICALSPEED Same as SHIP:VERTICALSPEED
-SURFACESPEED Same as SHIP:SURFACESPEED
+GROUNDSPEED Same as SHIP:GROUNDSPEED
+SURFACESPEED This has been obsoleted as of kOS 0.18.0. Replace it with GROUNDSPEED.
AIRSPEED Same as SHIP:AIRSPEED
-VESSELNAME Same as SHIP:VESSELNAME
ALTITUDE Same as SHIP:ALTITUDE
APOAPSIS Same as SHIP:APOAPSIS
PERIAPSIS Same as SHIP:PERIAPSIS
@@ -71,9 +92,64 @@ SRFPROGRADE Same as SHIP:SRFPROGRADE
SRFREROGRADE Same as SHIP:SRFREROGRADE
OBT Same as SHIP:OBT
STATUS Same as SHIP:STATUS
-VESSELNAME Same as SHIP:NAME
+SHIPNAME Same as SHIP:NAME
================ ==============================================================================
+Constants (pi, e, etc)
+----------------------
+
+Get-only.
+
+The variable ``constant`` provides a way to access a few
+:ref:`basic math and physics constants `, such as Pi, Euler's
+number, and so on.
+
+Example::
+
+ print "Kerbin's circumference: " + (2*constant:pi*Kerbin:radius) + "meters.".
+
+The full list is here: :ref:`constants page `.
+
+Terminal
+--------
+
+Get-only. ``terminal`` returns a :struct:`terminal` structure describing
+the attributes of the current terminal screen associated with the
+CPU this script is running on.
+
+Core
+----
+
+Get-only. ``core`` returns a :struct:`core` structure referring to the CPU you
+are running on.
+
+Archive
+-------
+
+Get-only. ``archive`` returns a :struct:`Volume` structure referring to the archive.
+You can read more about what archive is on the :ref:`File & volumes ` page.
+
+Stage
+-----
+
+Get-only. ``stage`` returns a :struct:`stage` structure used to count resources
+in the current stage. Not to be confused with the COMMAND stage
+which triggers the next stage.
+
+NextNode
+--------
+
+Get-only. ``nextnode`` returns the next planned maneuver :struct:`node` in the SHIP's flight plan. Will throw an exception if
+no node exists, or if called on a ship that is not the active vessel.
+
+.. _hasnode:
+
+HasNode
+--------
+
+Get-only. ``hasnode`` returns true if there is a planned maneuver :struct:`node` in the SHIP's flight plan. This will always return
+false for the non-active vessel, as access to maneuver nodes is limited to the active vessel.
+
Resource Types
--------------
@@ -92,7 +168,7 @@ corner of the screen in the KSP window. |Resources|
All of the above resources can be queried using either the prefix SHIP
or STAGE, depending on whether you are trying to query how much is left
-in the curent stage or the entire ship:
+in the current stage or the entire ship:
How much liquid fuel is left in the entire ship:
@@ -118,45 +194,46 @@ the term exactly as it appears in the resources window.
You can also get a list of all resources, either in SHIP: or STAGE: with the :RESOURCES suffix.
+.. |Resources| image:: /_images/reference/bindings/resources.png
+
ALT ALIAS
---------
-The special variable ALT is a unique exception. It behaves like a
-structure with suffixes but it's actually a bit "fake" in that it's not
-really a structure. The following terms are just exceptions that don't
-fit anywhere else:
+The special variable `ALT `__ gives you
+access to a few altitude predictions:
+
+ALT:APOAPSIS
+
+ALT:PERIAPSIS
+
+ALT:RADAR
+
+Further details are found on the `ALT page `__ .
-============== ======== ==========
-Variable Type Meaning
-============== ======== ==========
-ALT:APOAPSIS number The altitude of the apoapsis of the current ship. Identical to SHIP:APOAPSIS.
-ALT:PERIAPSIS number The altitude of the periapsis of the current ship. Identical to SHIP:PERIAPSIS.
-ALT:RADAR number The altitude of the current ship above the terrain. Does not have an alias anywhere.
-============== ======== ==========
ETA ALIAS
---------
-The special variable ETA is a unique exception. It behaves like a
-structure with suffixes but it's actually a bit "fake" in that it's not
-really a structure. The following terms are just exceptions that don't
-fit anywhere else:
+The special variable `ETA `__ gives you
+access to a few time predictions:
+
+ETA:APOAPSIS
-============== ======== ==========
-Variable Type Meaning
-============== ======== ==========
-ETA:APOAPSIS number seconds until SHIP will reach its apoapsis.
-ETA:PERIAPSIS number seconds until SHIP will reach its periapsis.
-ETA:TRANSITION number seconds until SHIP will leave its SOI to enter the SOI of another body.
-============== ======== ==========
+ETA:PERIAPSIS
+
+ETA:TRANSITION
+
+Further details are found on the `ETA page `__ .
ENCOUNTER
---------
-The body being encountered next by the current vessel. Returns the
-special string "None" if there is no expected encounter, or an object of
-type `Body `__ if an encounter is
-expected.
+The orbit patch describing the next encounter with a body the current
+vessel will enter. If there is no such encounter coming, it will return
+the special string "None". If there is an encounter coming, it will
+return an object :ref:`of type Orbit `. (i.e. to obtain the name
+of the planet the encounter is with, you can do:
+``print ENCOUNTER:BODY:NAME.``, for example.).
BOOLEAN TOGGLE FIELDS:
----------------------
@@ -229,16 +306,65 @@ Controls that must be used with LOCK
WHEELTHROTTLE // Separate throttle for wheels
WHEELSTEERING // Separate steering system for wheels
+Time
+----
+
+MISSIONTIME
+~~~~~~~~~~~~~~~~~~~
+
+You can obtain the number of seconds it has been since the current
+CPU vessel has been launched with the bound global variable
+``MISSIONTIME``. In real space programs this is referred to usually
+as "MET" - Mission Elapsed Time, and it's what's being measured when
+you hear that familiar voice saying "T minus 10 seconds..." Point "T"
+is the zero point of the mission elapsed time, and everything before that
+is a negative number and everything after it is a positive number.
+kOS is only capable of returning the "T+" times, not the "T-" times,
+because it doesn't read your mind to know ahead of time when you plan
+to launch.
+
+Time Structure
+~~~~~~~~~~~~~~
+
+`Time `__ is the simulated amount of time that passed since the beginning of the game's universe epoch. (A brand new campaign that just started begins at TIME zero.)
+
+TIME is a useful system variable for calculating the passage of time
+between taking
+physical measurements (i.e. to calculate how fast a phenomenon is
+changing in a loop).
+It returns the KSP *simulated* time, rather than the actual realtime
+sitting in the
+chair playing the game. If everything is running smoothly on a fast
+computer, one
+second of simulated time will match one second of real time, but if
+anything is
+causing the game to stutter or lag a bit, then the simulated time will
+be a bit
+slower than the real time. For any script program trying to calculate
+physical
+properties of the KSP universe, the time that matters is the simulated
+time, which
+is what TIME returns.
+
+It's important to be aware of the `frozen update
+nature `__ of the kOS
+computer when reading TIME.
+
System Variables
----------------
-Returns values about kOS and hardware
+This section is about variables that describe the things that are slightly
+outside the simulated universe of the game and are more about
+the game's user interface or the kOS mod itself. They represent things
+that slightly "break the fourth wall" and let your script access
+something entirely outside the in-character experience.
::
- PRINT VERSION. // Returns operating system version number. i.e. 0.8.6
+ PRINT VERSION. // Returns operating system version number. e.g. 0.8.6
PRINT VERSION:MAJOR. // Returns major version number. e.g. 0
PRINT VERSION:MINOR. // Returns minor version number. e.g. 8
+ PRINT VERSION:BUILD. // Returns build version number. e.g. 6
PRINT SESSIONTIME. // Returns amount of time, in seconds, from vessel load.
NOTE the following important difference:
@@ -250,54 +376,87 @@ TIME is the time since the entire saved game campaign started, in the
kerbal universe's time. i.e. TIME = 0 means a brand new campaign was
just started.
-WARPING
-~~~~~~~
+KUNIVERSE
+~~~~~~~~~
-Time warp can be controlled with WARP, and WARPMODE. See
-:ref:`WARP `
+:ref:`Kuniverse ` is a structure that contains many settings that
+break the fourth wall a little bit and control the game simulation directly.
+The eventual goal is probably to move many of the variables you see listed
+below into ``kuniverse``.
Config
-------
+~~~~~~
CONFIG is a special variable name that refers to the configuration
-settings for
-the kOS mod, and can be used to set or get various options.
+settings for the kOS mod, and can be used to set or get various
+options.
`CONFIG has its own page `__ for further
details.
-Game State
-----------
+WARP and WARPMODE
+~~~~~~~~~~~~~~~~~
-Variables that have something to do with the state of the universe.
+Time warp can be controlled with the variables
+WARP and WARPMODE. See :ref:`WARP `
-========= ====================================== ==============
-Variable Type Meaning
-========= ====================================== ==============
-TIME `Time `__ Simulated amount of time that passed since the beginning of the game's universe epoch. (A brand new campaign that just started begins at TIME zero.)
-MAPVIEW boolean Both settable and gettable. If you query MAPVIEW, it's true if on the map screen, and false if on the flight view screen. If you SET MAPVIEW, you can cause the game to switch between mapview and flight view or visa versa.
-========= ====================================== ==============
+MAPVIEW
+~~~~~~~
-TIME is a useful system variable for calculating the passage of time
-between taking
-physical measurements (i.e. to calculate how fast a phenomenon is
-changing in a loop).
-It returns the KSP *simulated* time, rather than the actual realtime
-sitting in the
-chair playing the game. If everything is running smoothly on a fast
-computer, one
-second of simulated time will match one second of real time, but if
-anything is
-causing the game to stutter or lag a bit, then the simulated time will
-be a bit
-slower than the real time. For any script program trying to calculate
-physical
-properties of the KSP universe, the time that matters is the simulated
-time, which
-is what TIME returns.
+A boolean that is both gettable and settable.
-It's important to be aware of the `frozen update
-nature `__ of the kOS
-computer when reading TIME.
+If you query MAPVIEW, it's true if on the map screen, and false if on the flight view screen. If you SET MAPVIEW, you can cause the game to switch between mapview and flight view or visa versa.
-.. |Resources| image:: /_images/reference/bindings/resources.png
+LOADDISTANCE
+~~~~~~~~~~~~
+
+LOADDISTANCE sets the distance from the active vessel at
+which vessels get removed from the full physics engine and put
+on-rails, or visa versa. Note that as of KSP 1.0 the stock game
+supports multiple different load distance settings for different
+situations such that the value changes depending on where you are.
+But kOS does not support this at the moment so in kOS if you set
+the LOADDISTANCE, you are setting it to the same value
+universally for all situations.
+
+.. _solarprimevector:
+
+SOLARPRIMEVECTOR
+----------------
+
+Gives the Prime Meridian :struct:`Vector` for the Solar System itself, in
+current Ship-Raw XYZ coordinates.
+
+Both the :attr:`Orbit:LONGITUDEOFASCENDINGNODE` orbit suffix and the
+:attr:`Body:ROTATIONANGLE` body suffix are expressed in terms of
+degree offsets from this *Prime Meridian Reference Vector*.
+
+What is the Solar Prime Reference Vector?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The solar prime vector is an arbitrary vector in space used to measure
+some orbital parameters that are supposed to remain fixed to space
+regardless of how the planets underneath the orbit rotate, or where the
+Sun is. In a sense it can be thought of as the celestial "prime
+meridian" of the entire solar system, rather than the "prime meridian" of
+any one particular rotating planet or moon.
+
+In a hypothetical Earthling's solar system our Kerbal scientists have
+hypothesized may exist in a galaxy far away, Earthbound astronomers use
+a reference they called the
+`First Point of Aries `__,
+for this purpose.
+
+For Kerbals, it refers to a more arbitrary line in space, pointing at a fixed
+point in the firmament, also known as the "skybox".
+
+Addons
+------
+
+Get-only. ``addons`` is a special variable used to access various extensions
+to kOS that are designed to support the features introduced by some other mods. More info can be found on the :ref:`addons ` page.
+
+Colors
+------
+
+There are several bound variables associated with :ref:`hardcoded colors ` such as WHITE, BLACK, RED, etc. See the linked page for the full list.
diff --git a/doc/source/changes.rst b/doc/source/changes.rst
index 59ab95495..de72b5df0 100644
--- a/doc/source/changes.rst
+++ b/doc/source/changes.rst
@@ -9,10 +9,383 @@ users familiar with older versions of the documentation who want
only a quick update to the docs without reading the entire set
of documentation again from scratch.
+This list is NOT a comprehensive list of everything. Specifically,
+minor one-line changes, or bug fixes, are not mentioned here.
+
+Most importantly, changes that might have broken previously working
+scripts are not always signposted here. To be sure, you should read
+the change log in the main github repository, which is repeated in the
+release announcements that are made in various places with each
+release.
+
.. contents::
:local:
:depth: 3
+****
+
+Changes in 0.19.1
+-----------------
+
+This change was mostly for small bug fixes and didn't affect the
+documentation much.
+
+Mentioned PIDLoop() function in tutorial
+::::::::::::::::::::::::::::::::::::::::
+
+:ref:`Added section to PID loop tutorial `
+that explains better that there's a new function for doing PID loops.
+The tutorial had been originally written before that function existed.
+
+
+New Terminal brightness and char size features
+::::::::::::::::::::::::::::::::::::::::::::::
+
+:struct:`Terminal` structure now has suffixes, :attr:`TERMINAL:BRIGHTNESS`,
+:attr:`TERMINAL:CHARWIDTH`, and :attr:`TERMINAL:CHARHEIGHT` to go with
+the new widgets on the terminal GUI.
+
+Changes in 0.19.0
+-----------------
+
+Art asset changes
+:::::::::::::::::
+
+Though not represented in these documents, numerous changes to the
+part models and artwork are included as part of this update, including
+the new KAL9000 high-end computer part.
+
+Varying Power Consumption
+:::::::::::::::::::::::::
+
+:ref:`Electrical drain ` is now handled in a dynamically
+changing way that actually notices how much you are using the CPU and
+uses less power if the CPU is mostly idling (if it spends most of its
+time on WAIT statements).
+
+For mods that want to re-balance the meaning of electric charge units,
+the drain factor is also editable in
+:ref:`module config fields ` in the various ``part.cfg``
+files the mod ships with. This opens them up to being changed by
+ModuleManager rules.
+
+Delegates (function pointers)
+:::::::::::::::::::::::::::::
+
+User functions and built-in functions (but not suffixes yet) can
+now be referred to with function pointers called :ref:`delegates `
+along with "currying" of pre-loaded arguments.
+
+Optional Defaulted Parameters
+:::::::::::::::::::::::::::::
+
+User functions and user programs can now be configured to have
+:ref:`optional trailing parameters ` that receive
+unmentioned when calling them.
+
+File I/O
+::::::::
+
+:ref:`VolumeFile ` now lets you read and write arbitrary
+strings in files in a more natural way than using the LOG command,
+and allows you to read the whole file into one big string in one go.
+
+Serialization in JSON
+:::::::::::::::::::::
+
+Automatic serialization system added to the :ref:`file operations `
+to save/load some kinds of data values to
+`JSON-format files. `__
+
+Universal Object Suffixes
+:::::::::::::::::::::::::
+
+All user values now are a kind of :ref:`structure ` and thus
+there are a few universal suffixes that can be used to query what
+type of data a thing is (``:ISTYPE`` and ``:TYPENAME``).
+
+Multimode Engine and Gimbal Support
+:::::::::::::::::::::::::::::::::::
+
+:ref:`Engines ` can now support multiple-mode information, and can
+acces thei gimbal information in the ``:GIMBAL`` suffix.
+
+DMagic Orbital Science
+::::::::::::::::::::::
+
+Better support for :ref:`DMagic's Orbital Science mod `
+
+Range
+:::::
+
+New :ref:`Range ` type for getting arbitrary iterable collections
+of ranges of integers.
+
+Char and Unchar
+:::::::::::::::
+
+:func:`CHAR(a)` and :func:`UNCHAR(a)` functions for getting the Unicode
+value of a character or making a character from its Unicode value.
+
+For loop on string chars
+::::::::::::::::::::::::
+
+The for loop can now iterate over the characters of a :ref:`string `.
+
+HASTARGET, HASNODE
+::::::::::::::::::
+
+:ref:`HASTARGET `.
+:ref:`HASNODE `.
+
+JOIN
+::::
+
+Join suffix on :ref:`lists ` now lets you make a string with a
+delimeter of the list's elements.
+
+Hours per day
+:::::::::::::
+
+:ref:`KUniverse ` now has a suffix to let you read the
+user setting for whether the clock is using a 24 hour day or a
+Kerbin 6 hour day.
+
+Archive
+:::::::
+
+The reserved word ``Archive`` is now a first class citizen so that
+``SET FOO TO ARCHIVE.`` works like you'd expect it to.
+
+Changes in 0.18.2
+-----------------
+
+Queue and Stack
+:::::::::::::::
+
+:ref:`Queues ` and :ref:`Stacks ` are now a feature
+you can use along with lists.
+
+Run Once
+::::::::
+
+:ref:`New ONCE argment to the run command `
+
+Volumes and Processors integration
+::::::::::::::::::::::::::::::::::
+
+:ref:`Volumes ` now get a default name equal to the core
+processor's nametag, and have several suffixes that can be queried.
+
+Get the volume that goes with a :ref:`core `
+
+Debuglog
+::::::::
+
+:ref:`Debuglog ` suffix of KUNIVERSE for writing messages to the
+Unity log file.
+
+
+Changes in 0.18.1
+-----------------
+
+(This update had only bug fixes and nothing that affected these
+user documentation pages.)
+
+Changes in 0.18 - Steering Much Betterer
+----------------------------------------
+
+Steering Overhaul
+:::::::::::::::::
+
+A major change to Cooked Steering!
+
+Should help people using torque-less craft like with Realism Overhaul.
+Removed the old steering logic and replaced it with a nice auto-tuning system.
+
+:ref:`SteeringManager ` structure now lests you acccess and alter parts of the cooked steering system.
+
+:ref:`PIDLoop ` structure now lets you borrow the PID mechanism used by the new cooked steering, for your own purposes.
+
+Lexicon
+:::::::
+
+New :ref:`Lexicon ` structure now allows associative arrays.
+
+String methods
+::::::::::::::
+
+New :ref:`String ` structure now allows string manipulations.
+
+Science Experiment Control
+::::::::::::::::::::::::::
+
+New :ref:`ScienceExperimentModule ` allows you to fire off science experiments bypassing the user
+interface dialog.
+
+Crew Member API
+:::::::::::::::
+
+New :ref:`CrewMember ` structure allows you to query the registered crew - their class, gender, and skill.
+
+LOADISTANCE
+:::::::::::
+
+New :struct:`LOADDISTANCE` obsoletes the previous way it worked.
+
+Infernal Robotics Part suffix
+:::::::::::::::::::::::::::::
+
+Renamed built-ins
+:::::::::::::::::
+
+"AQUIRE" on docking ports is now "ACQUIRE".
+"SURFACESPEED" is now "GROUNDSPEED" instead.
+
+Enforces control of own-vessel only
+:::::::::::::::::::::::::::::::::::
+
+It was previously possible to control vessels that weren't attached to the kOS computer
+running the script. This has been corrected.
+
+New quickstart tutorial
+:::::::::::::::::::::::
+
+`http://ksp-kos.github.io/KOS_DOC/tutorials/quickstart.html `_
+
+A few more constants
+::::::::::::::::::::
+
+:ref:`constants `
+
+Dynamic pressure
+::::::::::::::::
+
+DYNAMICPRESSURE, or Q, a new suffix of :struct:`Vessel`.
+
+DEFINED keyword
+:::::::::::::::
+
+:ref:`DEFINED keyword ` that can be used to check if a variable has been declared.
+
+KUNIVERSE
+:::::::::
+
+:struct:`KUniverse` structure letting you break the 4th wall and revert from a script
+
+SolarPrimeVector
+::::::::::::::::
+
+:ref:`SolarPrimeVector `, a bound variable to provide universal longitude direction.
+
+
+****
+
+Changes in 0.17.3
+-----------------
+
+New Looping control flow, the FROM loop
+:::::::::::::::::::::::::::::::::::::::
+
+There is now a new kind of loop, :ref:`the FROM loop `,
+which is a bit like the typical 3-part for-loop seen in a
+lot of other languages with a separate init, check, and increment
+section.
+
+Short-Circuit Booleans
+::::::::::::::::::::::
+
+Previously, kerboscript's AND and OR operators were not
+short-circuiting. :ref:`Now they are `.
+
+New Infernal Robotics interface
+:::::::::::::::::::::::::::::::
+
+There are a few new helper addon utilities for the Infernal
+Robotics mod, on the :ref:`IR addon page `.
+
+New RemoteTech interface
+::::::::::::::::::::::::
+
+There are a few new helper addon utilities for the RemoteTech
+mod, on the :ref:`RemoteTech addon page `.
+
+Deprecated INCOMMRANGE
+::::::::::::::::::::::::::
+
+Reading from the INCOMMRANGE bound variable will now throw a
+deprecation exception with instructions to use the new
+:struct:`RTAddon` structure for the RT mod.
+
+Updated thrust calculations for 1.0.x
+:::::::::::::::::::::::::::::::::::::
+
+KSP 1.0 caused the thrust calculations to become a LOT more
+complex than they used to be and kOS hadn't caught up yet.
+For a lot of scripts, trying to figure out a good throttle
+setting is no longer a matter of just taking a fraction of the
+engine's MAXTHRUST.
+
+We fixed the existing suffixes of MAXTHRUST and AVAILABLETHRUST for
+:struct:`engine` and :struct:`vessel` to account for the new changes
+in thrust based on
+ISP at different altitudes. MAXTHRUST is now the max the engine can
+put out at the CURRENT atmospheric pressure and current velocity.
+It might not be the maximum it could put out under other conditions.
+The AVAILABLETHRUST suffix is now implemented for engines (it was
+previously only available on vessels). There are also new
+suffixes MAXTHRUSTAT (engines and vessels), AVAILABLETHRUSTAT
+(engines and vessels), and ISPAT (engines only) to
+read the applicable value at a given atmospheric pressure.
+
+New CORE struct
+:::::::::::::::
+
+The :ref:`core ` bound variable gives you a structure you can use
+to access properties of the current in-game CPU the script is running on,
+including the vessel part it's inside of, and the vessel it's inside
+of, as well as the currently selected volume. Moving forward this
+will be the struct where we enable features that interact with
+the processor itself, like local configuration or current
+operational status.
+
+Updated boot file name handling
+:::::::::::::::::::::::::::::::
+
+Boot files are now copied to the local hard disk using their original
+file name. This allows for uniform file name access either on the
+archive or local drive and fixes boot files not working when kOS is
+configured to start on the Archive. You can also get or set the boot
+file using the BOOTFILENAME suffix of the :struct:`CORE` bound variable.
+
+Docking port, element, and vessel references
+::::::::::::::::::::::::::::::::::::::::::::
+
+You can now get a list of docking ports on any element or vessel using
+the DOCKINGPORTS suffix. Vessels also expose a list of their elements
+(the ELEMENTS suffix) and an element will refernce it's parent vessel
+(the VESSEL suffix).
+
+New sounds and terminal features
+::::::::::::::::::::::::::::::::
+
+For purely cosmetic purpopses, there are new sound features and
+ a few terminal tweaks.
+
+- A terminal keyclick option for the in-game GUI terminal.
+- The ability to BEEP when printing ascii code 7 (BEL), although
+ the only way currently to achieve this is with the KSlib's spec_char.ksm
+ file, as kOS has no BEL char, but this will be addressed later.
+- A sound effect on exceptions, which can be turned off on the CONFIG panel.
+
+Clear vecdraws all at once
+::::::::::::::::::::::::::
+
+For convenience, you can clear all vecdraws off the screen at once
+now with the :ref:`clearvecdraws() ` function.
+
+****
+
Changes in 0.17.0
-----------------
diff --git a/doc/source/commands.rst b/doc/source/commands.rst
index 89adff2e7..100639551 100644
--- a/doc/source/commands.rst
+++ b/doc/source/commands.rst
@@ -12,4 +12,5 @@ Command Reference
Parts Information
File I/O
Terminal and GUI
- Resource Transfer
\ No newline at end of file
+ Resource Transfer
+ Processors
diff --git a/doc/source/commands/files.rst b/doc/source/commands/files.rst
index d1eb46687..a50862f65 100644
--- a/doc/source/commands/files.rst
+++ b/doc/source/commands/files.rst
@@ -5,9 +5,25 @@ File I/O
For information about where files are kept and how to deal with volumes see the :ref:`Volumes ` page in the general topics section of this documentation.
+.. contents::
+ :local:
+ :depth: 2
+
.. note::
- All file names (program names) must be valid Identifiers. They can not contain spaces or special characters. For example, you can't have a file name called "this is my-file".
+ *Limitations on file names used for programs*
+
+ All file names used as program names with the ``run`` command must be
+ valid identifiers. They can not contain spaces or special characters. For
+ example, you can't have a program named ``this is my-file.ks``. This rule
+ does not necessarily apply to other filenames such as log files. However
+ to use a filename that contains spaces, you will have to put quotes around
+ it.
+
+ On case-sensitive filesystems typically found on Linux and Mac, you should
+ name program files used with the ``run`` command entirely with
+ lowercase-only filenames or the system may fail to find them when you
+ use the ``run`` command.
.. warning::
@@ -34,8 +50,10 @@ of the RUN command\*\*, follow these rules:
filename.
- A bareword filename may contain file extensions with dots, provided
it does not end in a dot.
-- If the filename does not contain a file extension, kOS will pad it
- with a ".ks" extension and use that.
+- Commands that try to read files will add '.ks' to filenames if
+ the original filename was not found, for example ``RUN abc.``
+ will first look for a file named ``abc``. If such a file is not found
+ it will look for ``abc.ks``.
Putting the above rules together, you can refer to filenames in any of
the following ways:
@@ -77,8 +95,8 @@ example:
- set volNum to 1. copy "myfile" to volNum.
-``COMPILE program (TO compiledProgram).``
------------------------------------------
+COMPILE program (TO compiledProgram).
+-------------------------------------
**(experimental)**
@@ -102,8 +120,8 @@ placed on a separate page.
Please see :ref:`the details of the Kerboscript ML
Executable `.
-``COPY programFile FROM/TO voumeNumber.``
------------------------------------------
+COPY programFile FROM/TO Volume|volumeId|volumeName.
+----------------------------------------------------
Arguments
^^^^^^^^^
@@ -112,7 +130,7 @@ Arguments
- argument 2: Target volume.
Copies a file to or from another volume. Volumes can be referenced by
-their ID numbers or their names if they’ve been given one. See LIST,
+instances of :struct:`Volume`, their ID numbers or their names if they’ve been given one. See LIST,
SWITCH and RENAME.
Understanding how :ref:`volumes
@@ -121,19 +139,22 @@ understanding this command.
Example::
- SWITCH TO 1. // Makes volume 1 the active volume
- COPY file1 FROM 0. // Copies a file called file1.ks from volume 0 to volume 1
- COPY file2 TO 0. // Copies a file called file1.ks from volume 1 to volume 0
- COPY file1.ks FROM 0. // Copies a file called file1.ks from volume 0 to volume 1
- COPY file2.ksm TO 0. // Copies a file called file1.ksm from volume 1 to volume 0
- COPY "file1.ksm" FROM 0. // Copies a file called file1.ksm from volume 0 to volume 1
+ SWITCH TO 1. // Makes volume 1 the active volume
+ COPY file1 FROM 0. // Copies a file called file1.ks from volume 0 to volume 1
+ COPY file2 TO 0. // Copies a file called file2.ks from volume 1 to volume 0
+ COPY file1.ks FROM 0. // Copies a file called file1.ks from volume 0 to volume 1
+ COPY file2.ksm TO 0. // Copies a file called file2.ksm from volume 1 to volume 0
+ COPY "file1.ksm" FROM 0. // Copies a file called file1.ksm from volume 0 to volume 1
COPY "file1" + "." + "ks" FROM 0. // Copies a file called file1.ks from volume 0 to volume 1
+ COPY file2.ksm TO CORE:VOLUME. // Copies a file called file2.ksm to active processor's volume
+ COPY file2.ksm TO "other". // Copies a file called file2.ksm to volume named 'other'
-``DELETE filename FROM volumeNumber.``
---------------------------------------
+DELETE filename FROM Volume|volumeId|volumeName.
+------------------------------------------------
-Deletes a file. You can delete a file from the current volume, or from a named volume.
+Deletes a file. Volumes can be referenced by instances of :struct:`Volume`, their ID numbers or their names
+if they’ve been given one.
Arguments
^^^^^^^^^
@@ -143,15 +164,17 @@ Arguments
Example::
- DELETE file1. // Deletes file1.ks from the active volume.
- DELETE "file1". // Deletes file1.ks from the active volume.
- DELETE file1.txt. // Deletes file1.txt from the active volume.
- DELETE "file1.txt". // Deletes file1.txt from the active volume.
- DELETE file1 FROM 1. // Deletes file1.ks from volume 1
+ DELETE file1. // Deletes file1.ks from the active volume.
+ DELETE "file1". // Deletes file1.ks from the active volume.
+ DELETE file1.txt. // Deletes file1.txt from the active volume.
+ DELETE "file1.txt". // Deletes file1.txt from the active volume.
+ DELETE file1 FROM 1. // Deletes file1.ks from volume 1
+ DELETE file1 FROM CORE:VOLUME. // Deletes file1.ks from active processor's volume
+ DELETE file1 FROM "other". // Deletes file1.ks from volume name 'other'
-``EDIT program.``
------------------
+EDIT program.
+-------------
Edits a program on the currently selected volume.
@@ -173,8 +196,8 @@ Example::
EDIT "filename.txt". // edits filename.txt
-``LOG text TO filename.``
--------------------------
+LOG text TO filename.
+---------------------
Logs the selected text to a file on the local volume. Can print strings, or the result of an expression.
@@ -186,15 +209,19 @@ Arguments
Example::
- LOG “Hello†to mylog.txt. // logs to "mylog.txt".
+ LOG "Hello" to mylog.txt. // logs to "mylog.txt".
LOG 4+1 to "mylog" . // logs to "mylog.ks" because .ks is the default extension.
- LOG “4 times 8 is: “ + (4*8) to mylog. // logs to mylog.ks because .ks is the default extension.
+ LOG "4 times 8 is: " + (4*8) to mylog. // logs to mylog.ks because .ks is the default extension.
+
+RENAME VOLUME Volume|volumeId|oldVolumeName TO name.
+----------------------------------------------------
-``RENAME name1 TO name2.``
---------------------------
+RENAME FILE oldName TO newName.
+-------------------------------
-Renames a file or volume.
+Renames a file or volume. Volumes can be referenced by
+instances of :struct:`Volume`, their ID numbers or their names if they've been given one.
Arguments
^^^^^^^^^
@@ -207,11 +234,22 @@ Example::
RENAME VOLUME 1 TO AwesomeDisk
RENAME FILE MyFile TO AutoLaunch.
-``RUN .``
-------------------
+.. _run_once:
+
+RUN [ONCE] .
+---------------------
Runs the specified file as a program, optionally passing information to the program in the form of a comma-separated list of arguments in parentheses.
+If the optional ``ONCE`` keyword is used after the word ``RUN``, it means
+the run will not actually occur if the program has already been run once
+during the current program context. This is intended mostly for loading library
+program files that may have mainline code in them for initialization purposes
+that you don't want to get run a second time just because you use the library
+in two different subprograms.
+
+``RUN ONCE`` means "Run unless it's already been run, in which case skip it."
+
Arguments
^^^^^^^^^
@@ -227,6 +265,8 @@ Example::
RUN AutoLaunch.ks( 75000, true, "hello" ).
RUN AutoLaunch.ksm( 75000, true, "hello" ).
+ RUN ONCE myLibrary. // run myLibrary unless it's been run already.
+
The program that is reading the arguments sees them in the variables it
mentions in :ref:`DECLARE PARAMETER`.
@@ -245,25 +285,21 @@ RUN only works when the filename is a bareword filename. It cannot use expressio
// called "ProgName.ksm" or "ProgName.ks", when it sees this,
// rather than "MyProgram".
- The reasons for the exception to how filenames work for the RUN
- command are too complex to go into in large detail here. Here's the
- short version: While the kOS system does defer the majority of the
- work
- of actually compiling subprogram scripts until run-time, it still
- has to
- generate some header info about them at compile time, and the
- filename
- has to be set in stone at that time. Changing this would require a
- large re-write of some of the architecture of the virtual machine.
+The reasons for the exception to how filenames work for the RUN command are
+too complex to go into in large detail here. Here's the short version: While
+the kOS system does defer the majority of the work of actually compiling
+subprogram scripts until run-time, it still has to generate some header info
+about them at compile time, and the filename has to be set in stone at that
+time. Changing this would require a large re-write of some of the architecture
+of the virtual machine.
-``SWITCH TO .``
------------------------------
+SWITCH TO Volume|volumeId|volumeName.
+-------------------------------------
-Switches to the specified volume. Volumes can be specified by number, or
-it’s name (if it has one). See LIST and RENAME. Understanding how
-:ref:`volumes work ` is important
-to understanding this command.
+Switches to the specified volume. Volumes can be referenced by
+instances of :struct:`Volume`, their ID numbers or their names if they've been given one. See LIST and RENAME. Understanding how
+:ref:`volumes work ` is important to understanding this command.
Example::
@@ -272,25 +308,79 @@ Example::
SWITCH TO AwesomeDisk. // Switch to volume 1.
PRINT VOLUME:NAME. // Prints "AwesomeDisk".
+EXISTS(FILENAME).
+-----------------
+
+A shortcut for ``CORE:CURRENTVOLUME:EXISTS(FILENAME)``. See :meth:`Volume:EXISTS`.
+
+CREATE(FILENAME).
+-----------------
+
+A shortcut for ``CORE:CURRENTVOLUME:CREATE(FILENAME)``. See :meth:`Volume:CREATE`.
+
+OPEN(FILENAME).
+---------------
+
+A shortcut for ``CORE:CURRENTVOLUME:OPEN(FILENAME)``. See :meth:`Volume:OPEN`.
+
+.. _writejson:
+
+WRITEJSON(OBJECT, FILENAME).
+----------------------------
+
+Serializes the given object to JSON format and saves it under the given filename on the current volume.
+
+**Important:** only certain types of objects can be serialized. If a type is serializable then that fact
+is explicitly mentioned in the type's documentation like so:
+
+.. note::
+
+ This type is serializable.
+
+
+Usage example::
+
+ SET L TO LEXICON().
+ SET NESTED TO QUEUE().
+
+ L:ADD("key1", "value1").
+ L:ADD("key2", NESTED).
+
+ NESTED:ADD("nestedvalue").
+
+ WRITEJSON(l, "output.json").
+
+READJSON(FILENAME).
+-------------------
+
+Reads the contents of a file previously created using ``WRITEJSON`` and deserializes them. Example::
+
+ SET L TO READJSON("output.json").
+ PRINT L["key1"].
+
+
.. _boot:
Special handling of files starting with "boot" (example ``boot.ks``)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+--------------------------------------------------------------------
**(experimental)**
For users requiring even more automation, the feature of custom boot scripts was introduced. If you have at least 1 file in your Archive volume starting with "boot" (for example "boot.ks", "boot2.ks" or even "boot_custom_script.ks"), you will be presented with the option to choose one of those files as a boot script for your kOS CPU.
.. image:: http://i.imgur.com/05kp7Sy.jpg
-As soon as you vessel leaves VAB/SPH and is being initialised on the launchpad (e.g. its status is PRELAUNCH) the assigned script will be copied to CPU's local hard disk and named "boot.ks". This script will be run as soon as CPU boots, e.g. as soon as you bring your CPU in physics range or power on your CPU if it was turned off.
+As soon as you vessel leaves VAB/SPH and is being initialised on the launchpad (e.g. its status is PRELAUNCH) the assigned script will be copied to CPU's local hard disk with the same name. If kOS is configured to start on the archive, the file will not be copied locally automatically. This script will be run as soon as CPU boots, e.g. as soon as you bring your CPU in physics range or power on your CPU if it was turned off. You may get or set the name of the boot file using the :ref:`core:bootfilename` suffix.
+
+.. warning::
+
+ .. versionchanged:: 0.18
+
+ **boot file name changed**
+
+ Previously boot files were copied to the local hard disk as "boot.ks". This behaviour was changed so that boot files could be handled consistently if kOS is configured to start on the Archive. Some scripts may have terminated with a generic "delete boot." line to clear the boot script. Going forward you should use the new core:bootfilename suffix when dealing the boot file.
Important things to consider:
* kOS CPU hard disk space is limited, avoid using complex boot scripts or increase disk space using MM config.
- * If your kOS set to start from Archive, this feature may not work as intended. Possible workaround: disable starting from Archive and create simple default "boot.ks" file like this::
-
- //default boot script, just switches to Archive
- switch to 0.
-
* Boot script runs immediately on initialisation, it should avoid interaction with parts/modules until physics fully load. It is best to wait for couple seconds or until certain trigger.
diff --git a/doc/source/commands/flight/cooked.rst b/doc/source/commands/flight/cooked.rst
index af6e107b6..dbc505210 100644
--- a/doc/source/commands/flight/cooked.rst
+++ b/doc/source/commands/flight/cooked.rst
@@ -3,17 +3,36 @@
Cooked Control
==============
+.. contents:: Contents
+ :local:
+ :depth: 1
+
+For more information, check out the documentation for the :struct:`SteeringManager` structure.
+
In this style of controlling the craft, you do not steer the craft directly, but instead select a goal direction and let kOS pick the way to steer toward that goal. This method of controlling the craft consists primarily of the following two commands:
+The special LOCK variables for cooked steering
+----------------------------------------------
+
.. _LOCK THROTTLE:
-.. object:: LOCK THROTTLE TO value.
+.. object:: LOCK THROTTLE TO expression. // value range [0.0 .. 1.0]
+
+ This sets the main throttle of the ship to *expression*. Where *expression* is a floating point number between 0.0 and 1.0. A value of 0.0 means the throttle is idle, and a value of 1.0 means the throttle is at maximum. A value of 0.5 means the throttle is at the halfway point, and so on.
+
+
+ The expression used in this statement can be any formula and can
+ call your own user functions. Just make sure it returns a value
+ in the range [0..1].
- This sets the main throttle of the ship to *value*. Where *value* is a floating point number between 0.0 and 1.0. A value of 0.0 means the throttle is idle, and a value of 1.0 means the throttle is at maximum. A value of 0.5 means the throttle is at the halfway point, and so on.
+.. warning::
+
+ You cannot ``WAIT`` during the execution of the expression in a
+ LOCK THROTTLE. See the note in the next section below.
.. _LOCK STEERING:
-.. object:: LOCK STEERING TO value.
+.. object:: LOCK STEERING TO expression.
- This sets the direction **kOS** should point the ship where *value* is a :struct:`Vector` or a :ref:`Direction ` created from a :ref:`Rotation ` or :ref:`Heading `:
+ This sets the direction **kOS** should point the ship where *expression* is a :struct:`Vector` or a :ref:`Direction ` created from a :ref:`Rotation ` or :ref:`Heading `:
:ref:`Rotation `
@@ -51,6 +70,132 @@ In this style of controlling the craft, you do not steer the craft directly, but
Like all ``LOCK`` expressions, the steering and throttle continually update on their own when using this style of control. If you lock your steering to velocity, then as your velocity changes, your steering will change to match it. Unlike with other ``LOCK`` expressions, the steering and throttle are special in that the lock expression gets executed automatically all the time in the background, while other ``LOCK`` expressions only get executed when you try to read the value of the variable. The reason is that the **kOS** computer is constantly querying the lock expression multiple times per second as it adjusts the steering and throttle in the background.
+.. warning::
+
+ You cannot ``WAIT`` during the execution of the expression in a
+ LOCK STEERING. See the note in the next section below.
+
+
+.. _LOCK WHEELTHROTTLE:
+.. object:: LOCK WHEELTHROTTLE TO expression. // value range [-1.0 .. 1.0]
+
+ **(For Rovers)** This is used to control the throttle that is used when
+ driving a wheeled vehicle on the ground. It is an entirely independent
+ control from the flight throttle used with ``LOCK THROTTLE`` above.
+ It is analogous to holding the 'W' (value of +1) or 'S' (value of -1)
+ key when driving a rover manually under default keybindings.
+
+ ``WHEELTHROTTLE`` allows you to set
+ a negative value, up to -1.0, while ``THROTTLE`` can't go below zero.
+ A negative value means you are trying to accelerate in reverse.
+
+ Unlike trying to drive manually, using ``WHEELTHROTTLE`` in kOS does
+ not cause the torque wheels to engage as well. In stock KSP using
+ the 'W' or 'S' keys on a rover engages both the wheel driving AND the
+ torque wheel rotational power. In kOS those two features are
+ done independently.
+
+ The expression used in this statement can be any formula and can
+ call your own user functions. Just make sure it returns a value
+ in the range [0..1].
+
+.. warning::
+
+ You cannot ``WAIT`` during the execution of the expression in a
+ LOCK WHEELTHROTTLE. See the note in the next section below.
+
+.. _LOCK WHEELSTEERING:
+.. object:: LOCK WHEELSTEERING TO expression.
+
+ **(For Rovers)** This is used to tell the rover's cooked steering
+ where to go. The rover's cooked steering doesn't use nearly as
+ sophisticated a PID control system as the flight cooked steering
+ does, but it does usually get the job done, as driving has more
+ physical effects that help dampen the steering down automatically.
+
+ There are 3 kinds of value understood by WHEELSTEERING:
+
+ - :struct:`GeoCoordinates` - If you lock wheelsteering to a
+ :struct:`GetCoordinates`, that will mean the rover will try to steer in
+ whichever compass direction will aim at that location.
+
+ - :struct:`Vessel` - If you try to lock wheelsteering to a vessel,
+ that will mean the rover will try to steer in whichever compass
+ direction will aim at that vessel. The vessel being aimed at
+ does not need to be landed. If it is in the sky, the rover will
+ attempt to aim at a location directly underneath it on the ground.
+
+ - *Scalar Number* - If you try to lock wheelsteering to just a plain
+ scalar number, that will mean the rover will try to aim at that
+ compass heading. For example ``lock wheelsteering to 45.`` will
+ try to drive the rover northeast.
+
+ For more precise control over steering, you can use raw steering to
+ just directly tell the rover to yaw left and right as it drives and
+ that will translate into wheel steering provided the vessel is landed
+ and you have a probe core aiming the right way.
+
+ **A warning about WHEELSTEERING and vertically mounted probe cores**:
+
+ If you built your rover in such a way that the probe core controlling it
+ is stack-mounted facing up at the sky when the rover is driving, that
+ will confuse the ``lock WHEELSTEERING`` cooked control mechanism. This
+ is a common building pattern for KSP players and it seems to work okay
+ when driving manually, but when driving by a kOS script, the fact that
+ the vessel's facing is officially pointing up at the sky causes it to
+ get confused. If you notice that your rover tends to drive in the
+ correct direction only when on a flat or slight downslope, but then
+ turns around and around in circles when driving toward the target
+ requires going up a slope, then this may be exactly what's happening.
+ When it tilted back, the 'forward' vector aiming up at the sky started
+ pointing behind it, and the cooked steering thought the rover was
+ aimed in the opposite direction to the way it was really going.
+ To fix this problem, either mount your rover probe core facing the
+ front of the rover, or perform a "control from here" on some forward
+ facing docking port or something like that to get it to stop thinking
+ of the sky as "forward".
+
+.. warning::
+
+ You cannot ``WAIT`` during the execution of the expression in a
+ LOCK WHEELSTEERING. See the note in the next section below.
+
+
+Cannot 'WAIT' during cooked control calculation
+-----------------------------------------------
+
+Be aware that because LOCK THROTTLE, LOCK STEERING, LOCK
+WHEELTHROTTLE, and LOCK WHEELSTEERING cause your expression
+to be calculated every single physics update tick behind
+the scenes, you cannot execute a ``WAIT`` command during
+the evaluation of the value used in them.
+
+For example, if you attempt this::
+
+ function get_throttle {
+ wait 1. // this line won't work.
+ return 0.5.
+ }
+ lock throttle to get_throttle().
+
+Then the ``WAIT`` command won't work. You can't make the
+system pause execution while it's trying to run the
+expression that tells it what to do 25 times a second.
+
+The entire expression that you LOCK any of the four cooked
+controls to must execute and finish quickly enough that it can
+be called 25 times a second (on typical default game settings
+that's how often the steering manager will run your expression).
+
+Normally when you use a LOCK command, the expression is only evaluated
+when it needs to be by some other part of the script that is trying
+to read the value. But with these special cooked control locks,
+remember that the kOS system *itself* will query the value repeatedly
+in the background so it knows how to adjust the piloting. Unlike
+normal LOCKs, these LOCKs will be executed again and again even when
+you're not explicitly trying to get their values.
+
+
Unlocking controls
------------------
@@ -61,7 +206,312 @@ If you ``LOCK`` the ``THROTTLE`` or ``STEERING``, be aware that this prevents th
When the program ends, these automatically unlock as well, which means that to control a craft you must make sure the program doesn't end. The moment it ends it lets go of the controls.
+.. _cooked_tuning:
+
+Tuning cooked steering
+----------------------
+
+.. versionadded:: 0.18.0
+
+ Version 0.18 of kOS completely gutted the internals of the old steering
+ system and replaced them with the system described below. Anything
+ said below this point is pertinent to version 0.18 and higher only.
+
+While cooked steering tries to come balanced to perform decently without user
+interaction, there are some instances where you may need to help tune the
+behavior. There are a number of settings you can adjust to tweak the
+behavior of the cooked steering if it's not performing exactly as you'd
+like. It may be the case that making your own control mechanism from
+scratch, while entirely possible with kOS, might be unnecessary if all
+you really want to do is just make the cooked steering behave slightly
+differently.
+
+The adjustments described below all come from the
+:ref:`SteeringManager ` structure, which
+has its own detailed documentation page.
+
+Some simple suggestions to try fixing common problems
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you don't want to understand the intricate details of the cooked
+steering system, here's some quick suggestions for changes to the
+settings that might help solve some problems, in the list below:
+
+- **problem**: A large vessel with low torque doesn't seem to be even trying to
+ rotate very quickly. The controls may be fluctuating around the zero point,
+ but it doesn't seem to want to even try to turn faster.
+
+ - **solution**: Increase `STEERINGMANAGER:MAXSTOPPINGTIME` to about 5 or
+ 10 seconds or so. Also, slightly increase `STEERINGMANAGER:PITCHPID:KD`
+ and `STEERINGMANAGER:YAWPID:KD` to about 1 or 2 as well to go with it.
+
+ - **explanation**: Once the steering manager gets such a ship rotating at
+ a tiny rate, it stops trying to make it rotate any faster than that
+ because it's "afraid" of allowing it to obtain a larger momentum than it
+ thinks it could quickly stop. It needs to be told that in this case
+ it's okay to build up more "seconds worth" of rotational velocity. The
+ reason for increasing the Kd term as well is to tell it to anticipate
+ the need to starting slowing down rotation sooner than it normally
+ would.
+
+- **problem**: A vessel seems to reasonably come to the desired direction
+ sensibly, but once it's there the ship vibrates back and forth by about 1
+ degree or less excessively around the setpoint.
+
+ - **solution**: Increase `STEERINGMANAGER:PITCHTS` and
+ `STEERINGMANAGER:YAWTS` to several seconds.
+
+ - **explanation**: Once it's
+ at the desired orientation and it has mostly zeroed the rotational
+ velocity, it's trying to hold it there with microadjustments to the
+ controls, and those microadjustments are "too tight".
+
+- **problem**: The vessel's nose seems to be waving slowly back and forth
+ across the set direction, taking too long to center on it, and you notice
+ the control indicators are pushing all the way to the extremes as it does
+ so.
+
+ - **solution**: Increase `STEERINGMANAGER:PITCHPID:KD` and
+ `STEERINGMANGER:YAWPID:KD`.
+
+ - **explanation**: The ship is *trying* to
+ push its rotation rate too high when almost at the setpoint. It needs
+ to anticipate the fact that it is going to reach the desired direction
+ and start slowing down BEFORE it gets there.
+
+- **problem**: The vessel's nose seems to be waving slowly back and forth across
+ the set direction, taking too long to center on it, but you notice that the
+ control indicators are NOT pushing all the way to the extremes as it does
+ so. Instead they seem to be staying low in magnitude, wavering around zero
+ and may be getting smaller over time.
+
+ - **solution**: Decrease `STEERINGMANAGER:PITCHTS` and/or
+ `STEERINGMANAGER:YAWTS`
+
+ - **explanation**: While larger values for the
+ settling time on the Torque PID controller will help to smooth out
+ spikes in the controls, it also results in a longer time period before
+ the steering comes to a rest at the setpoint (also knows as settling).
+ If you had previously increased the settling time to reduce
+ oscillations, try picking a value half way between the default and the
+ new value you previously selected.
+
+
+But to understand how to tune the cooked steering in a more complex way than
+just with that simple list, you first have to understand what a PID controller
+is, at least a little bit, so you know what the settings you can tweak
+actually do.
+
+If you don't know what a PID controller is and want to learn more, you can
+read numerous descriptions of the concept on the internet that can be found
+in moments by a web search. If you just want to know a two minute explanation
+for the sake of tuning the cooked steering a bit, read on.
+
+Quick and Dirty description of a PID controller
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You can think of a PID controller as a magic mathematical black box that can
+learn where to set a control lever in order to achieve a given goal. A good
+example of this is cruise control on a car. You tell the cruise control
+what speed you'd like it to maintain, and it attempts to move the accelerator
+pedal to the necessary position that will maintain that constant speed.
+
+That, in a nutshell is the goal of a PID controller - to perform tasks
+like that. You have control over a lever or dial of some sort, and it
+indirectly affects a phenomenon you can measure, and you feed the
+mathematical black box of the PID controller the measurement of the
+phenomenon, and obey its instructions of where to set the control lever.
+Over time, the PID controller, under the assumption that you are obeying
+its instructions of where to set the control lever, learns how to fine
+tune its commands about how to set the lever to get the measurement to
+settle on the value you asked for.
+
+A more complex discussion of PID controllers than that is outside the
+scope of this document, but you can check out :ref:`the PID Loop tutorial. `
+
+Cooked Steering's use of PID controllers
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. highlight:: none
+
+kOS's cooked steering uses two nested PID controllers per axis of rotation::
+
+ Seek direction Current Direction Measurement
+ | |
+ | |
+ \|/ \|/
+ +-seek me---------cur val---+
+ | |
+ | Rotational Velocity PID |
+ | |
+ +-output--------------------+
+ desired
+ rotational
+ velocity
+ (i.e. "I'd like to be rotating at 3 degrees per second downward")
+ |
+ |
+ | Current Rotational Velocity measurement
+ | |
+ | |
+ \|/ \|/
+ +-seek me---------cur val---+
+ | |
+ | Torque PID |
+ | |
+ +-output--------------------+
+ desired
+ control
+ setting
+ (i.e. "ship:control:pitch should be -0.2")
+ |
+ |
+ |
+ |
+ \|/
+ Feed this control value to KSP. (This is the value you can see
+ on the control indicator meters in the lower-left of the screen).
+
+.. highlight:: kerboscript
+
+.. _cooked_omega_pid:
+
+The Rotational Velocity PID
+:::::::::::::::::::::::::::
+
+The first PID controller looks at the current direction the ship is pointed,
+versus the direction the ship is meant to be pointed, and uses the offset
+between the two to decide how to set the desired rotational velocity (rate
+at which the angle is changing).
+
+The suffixes to :ref:`SteeringManager ` allow direct
+manipulation of the rotational velocity's PID tuning parameters.
+
+.. _cooked_torque_pid:
+
+The Torque PID
+::::::::::::::
+
+But there is no such thing as a lever that directly controls the rotational
+velocity. What there is, is a lever that directly controls the rotational
+*acceleration*. When you pull on the yoke (i.e. hold down the "S" key),
+you are telling the ship to either rotate *faster* or *slower* than it
+already is.
+
+So given a result from the Rotational Velocity PID, with a desired
+rotational velocity to seek, the second PID controller takes over,
+the Torque PID, which uses that information to choose how to set
+the actual controls themselves (i.e. the WASDQE controls) to accelerate
+toward that goal rotational velocity.
+
+The suffixes to :ref:`SteeringManager ` don't quite
+allow direct manipulation of the torque PID tuning parameters Kp, Ki,
+and Kd, because they are calculated indirectly from the ship's own
+attributes. However, there are several suffixes to
+:ref:`SteeringManager ` that allow you to make
+indirect adjustments to them that are used in calculating the values
+it uses for Kp, Ki, and Kd.
+
+****
+
+This technique of using two different PID controllers, the first one
+telling the second one which seek value to use, and the second one
+actually being connected to the control "lever", is one of many ways of dealing
+with a phenomenon with two levels of indirection from the control.
+
+Keeping the above two things separate, the rotational velocity PID
+versus the Torque PID, is important in knowing which setting
+you need to tweak in order to achieve the desired effect.
+
+One pair of PID's per axis of rotation
+::::::::::::::::::::::::::::::::::::::
+
+The above pair of controllers is replicated per each of the 3 axes of
+rotation, for a total of 6 altogether. Some of the settings you can
+adjust affect all 3 axes together, while others are specific to just
+one. See the descriptions of each setting carefully to know which is
+which.
+
+Corrects 2 axes first, then the 3rd
+:::::::::::::::::::::::::::::::::::
+
+The cooked steering tries to correct first the pitch and yaw, to aim
+the rocket at the desired pointing vector, then only after it's very
+close to finishing that task does it allow the 3rd axis, the roll axis,
+to correct itself. This is because if you try correcting all three at
+the same time, it causes the cooked steering to describe a curved arc
+toward its destination orientation, rather than rotating straight
+towards it.
+
+This behavior is correct for rockets with radial symmetry, but is
+probably a bit wrong for trying to steer an airplane to a new heading
+while in atmosphere. For flying an airplane to a new heading, it's
+still best to make your own control scheme from scratch with raw steering.
+
+
+The settings to change
+::::::::::::::::::::::
+
+First, you can modify how kOS decides how fast the ship should turn::
+
+ // MAXSTOPPINGTIME tells kOS how to calculate the maximum allowable
+ // angular velocity the Rotational Velocity PID is allowed to output.
+ // Increasing the value will result in the ship turning
+ // faster, but it may introduce more overshoot.
+ // Adjust this setting if you have a small amount of torque on a large mass,
+ // or if your ship appears to oscillate back and forth rapidly without
+ // moving towards the target direction.
+ SET STEERINGMANAGER:MAXSTOPPINGTIME TO 10.
+
+ // You can also modify the PID constants that calculate desired angular
+ // velocity based on angular error, in the angular velocity PID controller.
+ // Note that changes made directly to the PIDLoop's MINIMUM and MAXIMUM
+ // suffixes will be overwritten based on the value MAXSTOPPINGTIME, the
+ // ship's torque and moment of inertia.
+ // These values will require precision and testing to ensure consistent
+ // performance.
+ // Beware of large KD values: Due to the way angular velocity and part
+ // facing directions are calculated in KSP, it is normal to have small rapid
+ // fluctuations which may introduce instability in the derivative component.
+ SET STEERINGMANAGER:PITCHPID:KP TO 0.85.
+ SET STEERINGMANAGER:PITCHPID:KI TO 0.5.
+ SET STEERINGMANAGER:PITCHPID:KD TO 0.1.
+
+Second, you can change how the controls are manipulated to achieve the desired
+angular velocity. This is for the Torque PID mentioned above. Internally,
+kOS uses the ship's available torque and moment of inertial to dynamically
+calculate the PID constants. Then the desired torque is calculated based on
+the desired angular velocity. The steering controls are then set based on
+the the percentage the desired torque is of the available torque. You can
+change the settling time for the torque calculation along each axis::
+
+ // Increase the settling time to slow down control reaction time and
+ // reduce control spikes. This is helpful in vessels that wobble enough to
+ // cause fluctuations in the measured angular velocity.
+ // This is recommended if your ship turns towards the target direction well
+ // but then oscillates when close to the target direction.
+ SET STEERINGMANAGER:PITCHTS TO 10.
+ SET STEERINGMANAGER:ROLLTS TO 5.
+
+If you find that kOS is regularly miscalculating the available torque, you can
+also define an adjust bias, or factor. Check out these :struct:`SteeringManager`
+suffixes for more details: PITCHTORQUEADJUST, YAWTORQUEADJUST, ROLLTORQUEADJUST,
+PITCHTORQUEFACTOR, YAWTORQUEFACTOR, ROLLTORQUEFACTOR
+
Advantages/Disadvantages
------------------------
-The advantge of "Cooked" control is that it is simpler to write scripts for, but the disadvantage is that you have no control over the details of the motion. You can't dictate how fast or slow the craft rotates, or which axis it tries to rotate around first, and if your craft is wobbly, you can't dampen the wobbliness.
+The advantage of "Cooked" control is that it is simpler to write scripts
+for, but the disadvantage is that you have only partial control over
+the details of the motion.
+
+Cooked controls perform best on ships that do not rely heavily on control
+surfaces, have medium levels of torque, and are structurally stable. You can
+improve the control by placing the ship's root part or control part close to the
+center of mass (preferably both). Adding struts to critical joints (like
+decouplers) or installing a mod like Kerbal Joint Reinforcement will also help.
+
+But because of the impossibility of finding one setting that is universally
+correct for all possible vessels, sometimes the only way to make cooked
+steering work well for you is to adjust the parameters as described above,
+or to make your own steering control from scratch using raw steering.
diff --git a/doc/source/commands/flight/pilot.rst b/doc/source/commands/flight/pilot.rst
index 9a4383be9..67b79f386 100644
--- a/doc/source/commands/flight/pilot.rst
+++ b/doc/source/commands/flight/pilot.rst
@@ -20,66 +20,66 @@ Will ensure that the throttle will be 0 when execution stops. These suffixes all
- Equivalent Key
* - :ref:`PILOTMAINTHROTTLE `
- - scalar [0,1]
+ - :ref:`scalar ` [0,1]
- ``LEFT-CTRL``, ``LEFT-SHIFT``
* - :ref:`PILOTYAW `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``D``, ``A``
* - :ref:`PILOTPITCH `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``W``, ``S``
* - :ref:`PILOTROLL `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``Q``, ``E``
* - :ref:`PILOTROTATION `
- :struct:`Vector`
- ``(YAW,PITCH,ROLL)``
* - :ref:`PILOTYAWTRIM `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``ALT+D``, ``ALT+A``
* - :ref:`PILOTPITCHTRIM `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``ALT+W``, ``ALT+S``
* - :ref:`PILOTROLLTRIM `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``ALT+Q``, ``ALT+E``
* - :ref:`PILOTFORE `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``N``, ``H``
* - :ref:`PILOTSTARBOARD `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``L``, ``J``
* - :ref:`PILOTTOP `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``I``, ``K``
* - :ref:`PILOTTRANSLATION `
- :struct:`Vector`
- ``(STARBOARD,TOP,FORE)``
* - :ref:`PILOTWHEELSTEER `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``A``, ``D``
* - :ref:`PILOTWHEELTHROTTLE `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``W``, ``S``
* - :ref:`PILOTWHEELSTEERTRIM `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``ALT+A``, ``ALT+D``
* - :ref:`PILOTWHEELTHROTTLETRIM `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``ALT+W``, ``ALT+S``
* - :ref:`PILOTNEUTRAL `
- - boolean
+ - :ref:`Boolean `
- Is **kOS** Controlling?
.. _SHIP CONTROL PILOTMAINTHROTTLE:
-.. object:: SHIP:CONTROL:MAINTHROTTLE
+.. object:: SHIP:CONTROL:PILOTMAINTHROTTLE
Returns the pilot's input for the throttle. This is the only ``PILOT`` variable that is settable and is used to set the throttle upon termination of the current **kOS** program.
diff --git a/doc/source/commands/flight/raw.rst b/doc/source/commands/flight/raw.rst
index 12532f5b0..6cd0aea6a 100644
--- a/doc/source/commands/flight/raw.rst
+++ b/doc/source/commands/flight/raw.rst
@@ -43,7 +43,14 @@ Raw Flight Controls Reference
These "Raw" controls allow you the direct control of flight parameters while the current program is running.
.. note::
- The ``MAINTHROTTLE`` requires active engines and, of course, sufficient and appropriate fuel. The rotational controls ``YAW``, ``PITCH`` and ``ROW`` require active reaction wheels with sufficient energy or *RCS* to be ON with properly placed thrusters and appropriate fuel. The translational controls ``FORE``, ``STARBOARD`` and ``TOP`` require *RCS* to be ON with properly placed thrusters and appropriate fuel.
+ The ``MAINTHROTTLE`` requires active engines and, of course,
+ sufficient and appropriate fuel. The rotational controls ``YAW``,
+ ``PITCH`` and ``ROW`` require one of the following: active reaction
+ wheels with sufficient energy, *RCS* to be ON with properly placed
+ thrusters and appropriate fuel, or control surfaces with an atmosphere
+ in which to operate. The translational controls ``FORE``, ``STARBOARD``
+ and ``TOP`` only work with *RCS*, and require RCS to be ON with
+ properly placed thrusters and appropriate fuel.
.. list-table::
@@ -55,64 +62,64 @@ These "Raw" controls allow you the direct control of flight parameters while the
- Equivalent Key
* - :ref:`MAINTHROTTLE `
- - scalar [0,1]
+ - :ref:`scalar ` [0,1]
- ``LEFT-CTRL``, ``LEFT-SHIFT``
* - :ref:`YAW `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``D``, ``A``
* - :ref:`PITCH `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``W``, ``S``
* - :ref:`ROLL `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``Q``, ``E``
* - :ref:`ROTATION `
- :struct:`Vector`
- ``(YAW,PITCH,ROLL)``
* - :ref:`YAWTRIM `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``ALT+D``, ``ALT+A``
* - :ref:`PITCHTRIM `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``ALT+W``, ``ALT+S``
* - :ref:`ROLLTRIM `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``ALT+Q``, ``ALT+E``
* - :ref:`FORE `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``N``, ``H``
* - :ref:`STARBOARD `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``L``, ``J``
* - :ref:`TOP `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``I``, ``K``
* - :ref:`TRANSLATION `
- :struct:`Vector`
- ``(STARBOARD,TOP,FORE)``
* - :ref:`WHEELSTEER `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``A``, ``D``
* - :ref:`WHEELTHROTTLE `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``W``, ``S``
* - :ref:`WHEELSTEERTRIM `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``ALT+A``, ``ALT+D``
* - :ref:`WHEELTHROTTLETRIM `
- - scalar [-1,1]
+ - :ref:`scalar ` [-1,1]
- ``ALT+W``, ``ALT+S``
* - :ref:`NEUTRAL `
- - boolean
+ - :ref:`Boolean `
- Is **kOS** Controlling?
* - :ref:`NEUTRALIZE `
- - boolean
+ - :ref:`Boolean `
- Releases Control
@@ -136,7 +143,7 @@ These "Raw" controls allow you the direct control of flight parameters while the
.. _SHIP CONTROL ROLL:
.. object:: SHIP:CONTROL:ROLL
- Rotation about the logintudinal axis of the ship left-wing-down :math:`(-1)` or left-wing-up :math:`(+1)`.
+ Rotation about the longitudinal axis of the ship left-wing-down :math:`(-1)` or left-wing-up :math:`(+1)`.
.. _SHIP CONTROL ROTATION:
.. object:: SHIP:CONTROL:ROTATION
@@ -217,7 +224,8 @@ These "Raw" controls allow you the direct control of flight parameters while the
Unlocking controls
------------------
-Once any of the ``SET SHIP:CONTROL`` commands have been used to control the ship, then the manual control by the player is locked out. To give control back to the player you must execute::
+Setting any one of ``SHIP:CONTROL`` values will prevent player from manipulating that specific control manually. Other controls will not be locked.
+To free any single control, set it back to zero. To give all controls back to the player you must execute::
SET SHIP:CONTROL:NEUTRALIZE to TRUE.
diff --git a/doc/source/commands/flight/systems.rst b/doc/source/commands/flight/systems.rst
index 204e8960c..48962c7ff 100644
--- a/doc/source/commands/flight/systems.rst
+++ b/doc/source/commands/flight/systems.rst
@@ -4,9 +4,17 @@ Ship Systems
============
.. _CONTROLFROM:
-.. object:: SET somepart:CONTROLFROM TO (true|false).
- If you have a handle on a part, from ``LIST PARTS``, you can select that part to set the orientation of the craft, just like using the "control from here" in the right-click menu in the game. For more information see :attr:`Part:CONTROLFROM`.
+ e.g.::
+
+ set somepart to ship:partstagged("my favorite docking port")[0].
+ somepart:CONTROLFROM().
+
+ If you have a handle on a part, from ``LIST PARTS``, you can select that part to set the orientation of the craft, just like using the "control from here" in the right-click menu in the game. For more information see :attr:`Part:CONTROLFROM`.
+ All vessels must have at least one "control from"
+ part on them somewhere, which is why there's no mechanism for un-setting
+ the "control from" setting other than to pick another part and set it
+ to that part instead.
.. global:: RCS
@@ -31,15 +39,15 @@ Ship Systems
:access: Get/Set
:type: string
- Getting this variable will return the currently selected mode. Where ``value`` is one of the valid strings listed below, this will set the stock SAS mode for the cpu vessel::
+ Getting this variable will return the currently selected mode. Where ``value`` is one of the valid strings listed below, this will set the stock SAS mode for the cpu vessel::
SET SASMODE TO value.
- It is the equivalent to clicking on the buttons next to the nav ball while manually piloting the craft, and will respect the current mode of the nav ball (orbital, surface, or target velocity). Valid strings for ``value`` are ``"PROGRADE"``, ``"RETROGRADE"``, ``"NORMAL"``, ``"ANTINORMAL"``, ``"RADIALOUT"``, ``"RADIALIN"``, ``"TARGET"``, ``"ANTITARGET"``, ``MANEUVER``, ``"STABILITYASSIST"``, and ``"STABILITY"``. A null or empty string will default to stability assist mode, however any other invalid string will throw an exception. This feature will respect career mode limitations, and will throw an exception if the current vessel is not able to use the mode passed to the command. An exception is also thrown if ``"TARGET"`` or ``"ANTITARGET"`` are used, but no target is selected.
+ It is the equivalent to clicking on the buttons next to the nav ball while manually piloting the craft, and will respect the current mode of the nav ball (orbital, surface, or target velocity). Valid strings for ``value`` are ``"PROGRADE"``, ``"RETROGRADE"``, ``"NORMAL"``, ``"ANTINORMAL"``, ``"RADIALOUT"``, ``"RADIALIN"``, ``"TARGET"``, ``"ANTITARGET"``, ``"MANEUVER"``, ``"STABILITYASSIST"``, and ``"STABILITY"``. A null or empty string will default to stability assist mode, however any other invalid string will throw an exception. This feature will respect career mode limitations, and will throw an exception if the current vessel is not able to use the mode passed to the command. An exception is also thrown if ``"TARGET"`` or ``"ANTITARGET"`` are used, but no target is selected.
.. warning:: SASMODE does not work with RemoteTech
- Due to the way that RemoteTech disables flight control input, the built in SAS modes do not function properly when there is no connection to the KSC or a Command Center. If you are writing scripts for use with RemoteTech, make sure to take this into account.
+ Due to the way that RemoteTech disables flight control input, the built in SAS modes do not function properly when there is no connection to the KSC or a Command Center. If you are writing scripts for use with RemoteTech, make sure to take this into account.
.. global:: LIGHTS
diff --git a/doc/source/commands/flight/warp.rst b/doc/source/commands/flight/warp.rst
index d8a4348bb..b152afe96 100644
--- a/doc/source/commands/flight/warp.rst
+++ b/doc/source/commands/flight/warp.rst
@@ -6,6 +6,10 @@ Time Warping
.. global:: WARP
+ You may use the WARPTO(time) function to automatically warp to the specified time (given in seconds game universal time). If you need more precise control, you can use the other options below.::
+
+ WARPTO(TIME:SECONDS + 60 * 10). // warp to a time 10 minutes in the future
+
The :global:`WARP` global variable can be set to change the game warp to a value between 0 and 7 (for rails warp) or 0 to 3 (for physics warp)::
SET WARP TO 5. // Sets warp to 1000x
diff --git a/doc/source/commands/list.rst b/doc/source/commands/list.rst
index b6be33b35..0f5b9e612 100644
--- a/doc/source/commands/list.rst
+++ b/doc/source/commands/list.rst
@@ -48,6 +48,8 @@ Vessel Lists
These generate :struct:`lists ` of items on the :struct:`Vessel`:
+``Processors``
+ :struct:`List` of :struct:`Processors `
``Resources``
:struct:`List` of :struct:`AggregateResources `
``Parts``
@@ -67,9 +69,9 @@ File System Lists
These generate :struct:`lists ` about the files in the system:
``Files``
- :struct:`List` the :struct:`files ` on the current Volume. (note below)
+ :struct:`List` the :struct:`files ` on the current Volume. (note below)
``Volumes``
- :struct:`List` all the :ref:`volumes` that exist.
+ :struct:`List` all the :struct:`volumes ` that exist.
.. note::
@@ -82,7 +84,7 @@ Examples::
LIST VOLUMES. // which volumes can be seen by this CPU?
LIST FILES IN fileList. // fileList is now a LIST() containing file structures.
-The file structures returned by ``LIST FILES IN fileList.`` are documented :ref:`on a separate page `.
+The file structures returned by ``LIST FILES IN fileList.`` are documented :ref:`on a separate page `.
Here are some more examples::
diff --git a/doc/source/commands/prediction.rst b/doc/source/commands/prediction.rst
index 4939ebb5a..217adf60a 100644
--- a/doc/source/commands/prediction.rst
+++ b/doc/source/commands/prediction.rst
@@ -13,6 +13,23 @@ Predictions of Flight Path
Using the Add and Remove commands as described on that page, you may alter the flight plan of the CPU\_vessel, however kOS does not automatically execute the nodes. You still have to write the code to decide how to successfully execute a planned maneuver node.
+.. warning::
+
+ Be aware that a limitation of KSP makes it so that some vessels'
+ maneuver node systems cannot be accessed. KSP appears to limit the
+ maneuver node system to only functioning on the current PLAYER
+ vessel, under the presumption that its the only vessel that needs
+ them, as ever other vessel cannot be maneuvered. kOS can maneuver a
+ vessel that is not the player vessel, but it cannot overcome this
+ limitation of the base game that unloads the maneuver node system
+ for other vessels.
+
+ Be aware that the effect this has is that when you try to predict
+ another vessel's position, it will sometimes give you answers that
+ presume that other vessel will be purely drifting, and not following
+ its maneuver nodes.
+
+
The following prediction functions do take into account the future maneuver nodes planned, and operate under the assumption that they will be executed as planned.
These return predicted information about the future position and velocity of an object.
@@ -27,6 +44,11 @@ These return predicted information about the future position and velocity of an
Returns a prediction of where the :struct:`Orbitable` will be at some :ref:`universal Timestamp `. If the :struct:`Orbitable` is a :struct:`Vessel`, and the :struct:`Vessel` has planned :ref:`maneuver nodes `, the prediction assumes they will be executed exactly as planned.
+ *Prerequisite:* If you are in a career mode game rather than a
+ sandbox mode game, This function requires that you have your space
+ center's buildings advanced to the point where you can make maneuver
+ nodes on the map view, as described in :struct:`Career:CANMAKENODES`.
+
.. function:: VELOCITYAT(orbitable,time)
:param orbitable: A :struct:`Vessel`, :struct:`Body` or other :struct:`Orbitable` object
@@ -37,6 +59,11 @@ These return predicted information about the future position and velocity of an
Returns a prediction of what the :ref:`Orbitable's ` velocity will be at some :ref:`universal Timestamp `. If the :struct:`Orbitable` is a :struct:`Vessel`, and the :struct:`Vessel` has planned :struct:`maneuver nodes `, the prediction assumes they will be executed exactly as planned.
+ *Prerequisite:* If you are in a career mode game rather than a
+ sandbox mode game, This function requires that you have your space
+ center's buildings advanced to the point where you can make manuever
+ nodes on the map view, as described in :struct:`Career:CANMAKENODES`.
+
.. function:: ORBITAT(orbitable,time)
:param orbitable: A :Ref:`Vessel `, :struct:`Body` or other :struct:`Orbitable` object
@@ -47,6 +74,11 @@ These return predicted information about the future position and velocity of an
Returns the :ref:`Orbit patch ` where the :struct:`Orbitable` object is predicted to be at some :ref:`universal Timestamp `. If the :struct:`Orbitable` is a :struct:`Vessel`, and the :struct:`Vessel` has planned :ref:`maneuver nodes