<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.pioneerspacesim.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sturnclaw</id>
	<title>PioneerWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pioneerspacesim.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sturnclaw"/>
	<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/wiki/Special:Contributions/Sturnclaw"/>
	<updated>2026-07-05T18:49:07Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Places_of_interest&amp;diff=4652</id>
		<title>Places of interest</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Places_of_interest&amp;diff=4652"/>
		<updated>2024-08-23T02:27:41Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
If you've found something bizarre and/or wonderful, let other players know where here. Though if it's a bug it should be on the [https://github.com/pioneerspacesim/pioneer/issues Issue tracker.]&lt;br /&gt;
&lt;br /&gt;
Note that many of these discoveries are out-of-date or perhaps no longer existing as the results of procedural generation change with fixes and improvements. Many of these discoveries still exist in the universe, but simply somewhere else, waiting for an intrepid explorer to find them again and document them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Timing (Eclipses, etc.)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Epsilon Eridani (1,-1,-1), New Hope, Itzalean space port, at January 1 3200 22:00 there is an eclipse as Hades blocks out the light from Epsilon Eridani. &lt;br /&gt;
*Go to Vetiar (-14, -12, -11) A's colony Brennan Base on the world Morales's Mine and wait until 3204 Apr 25 around 2:53. A double sunset awaits. &lt;br /&gt;
*Canen (-89,0,1), Valášek Colony, Fort Robinson: 3208, July 10th, 19:24:52, the medium gas giant Canen b's decent-sized rings partially eclipse the red giant Canen through the oxygen atmosphere of Valášek Colony. &lt;br /&gt;
*Zelia (-16, -3, 1), 11 June 3201, at around 19:30 go stay near the sunny side of Zelia A,B e and you will see a merged 8-shaped shadow of it's two moons.&lt;br /&gt;
*Canack(-3127, 0, 2), 16 January 3200, land on asteroid Canack a a, around coordinates S 005°12'49&amp;quot; W 152°14'22&amp;quot;. At around 4:20, the brown dwarf Canack a will block the red hypergiant Canack. The exact time and place provided is not a must, as this star-star eclipse is a regular occurence due to Canack a and Canack a a having similar orbital planes relative to Canack.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Vastness'''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Waioeth (-13, -9, -13) is a red supergiant roughly 1.7 AU wide. At the distant world of Fox Colony, one can buy basic military drives, hyperspace cloud analyzers, and a variety of other interesting sundries. A heck of a vacation spot. &lt;br /&gt;
*Ackay (-13, -13, -10), a red giant star 0.15 wide. The planets are far enough away from each other to make missions between them completely impractical. A superjupiter as far away as Pluto! &lt;br /&gt;
*Ethandce (-32, -36, 0) is a triple star system formed by hypergiant and supergiants. In addition, two of these stars (Ethandce A and Ethandce B) are very close to each other. &lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Life, But Not As We Know It&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
*Gretia (-7, -6, -8)'s world Sampson looks like a partially terraformed Mars. Its ecosystem is reputedly quite complex, and the planet is studded with human settlements. Not exactly undiscovered country, but if all you want is to see an exotic lifeform in its natural habitat, and you don't ''really'' want to just get away from it all, it's a great place to start. You'll also get a look at life under an M class star! &lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Terrain Features&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
*In Edack (4, -2, 0) system, on Espinoza's Rock (the innermost planet), near Foley City; there is a very interesting canyon with bizzare pillar-like structures. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;'''&amp;lt;u&amp;gt;Man Made&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
*Olsina's Rock, the innermost planet&amp;amp;nbsp;in Gliese 205 (2, -1, -1) has 20&amp;amp;nbsp;space stations orbiting it. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Galactic Center'''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Sagittarius A* (-3125, 0, 0) system houses the galactic anchor; a supermassive black hole which keeps the Milky Way Galaxy together with it's strong gravity. The system also houses 2 terrestrial bodies and 3 orbital stations. &lt;br /&gt;
*Terminus, a planet in the Sagittarius A* (-3125, 0, 0) system rotates so fast that it's surface's tagential speed exceeds the escape velocity of the planet;&amp;amp;nbsp;ships have to accelerate towards the ground in order to land! &lt;br /&gt;
*Having no stars in the system, it can be quite hard to see ships and planets since there are no natural light sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Sol System'''&amp;lt;/u&amp;gt;&lt;br /&gt;
Travel to Thebe's vicinity at the Sol System (0, 0, 0) right when game starts (recommended to start at Mars). If you did it correctly, you will see Jupiter about to block out Sol's light! (Note that Thebe is a moon of Jupiter and you can always try again because of it's proximity to the planet). Speed time up to 100x real time and enjoy the eclipse!&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Manual&amp;diff=4495</id>
		<title>Manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Manual&amp;diff=4495"/>
		<updated>2023-09-15T03:27:51Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pioneer is a space adventure game set in the Milky-way galaxy at the turn of the 31st century. The game is open-ended, and you are free to explore the millions of star systems in the game. You can land on planets, slingshot past gas giants, and burn yourself to a crisp flying between binary star systems.&lt;br /&gt;
&lt;br /&gt;
This reference manual provides a brief overview of the game.&lt;br /&gt;
&lt;br /&gt;
This manual is a good bit out of date, but is slowly being improved.&lt;br /&gt;
&lt;br /&gt;
== Main menu ==&lt;br /&gt;
[[File:00_main_menu.png|right|600px]]&lt;br /&gt;
* '''Quick Load''': Loads the game you saved using quick save (ctrl+F9)&lt;br /&gt;
* '''Start at Earth''': You start the game in the Solar system, on Earth, at London Spaceport with an outfitted [[Sinonatrix]]. It can be considered an easy start. Sol is the capital of the Solar Federation&lt;br /&gt;
* '''Start at New Hope''': You start in Epsilon Eridani, the capital of the Commonwealth of Independend Worlds. Your [[Pumpkinseed]] stands on Itzalean Spaceport on New Hope. This is a bit more difficult starting point than Earth. Itzalean is in an area of frequent solar eclipses.&lt;br /&gt;
* '''Start at Barnard's Star''': You start on the dock of High Security Prison Tranquility, orbiting Barnard's Star, not far from Sol. You have a poorly outfitted [[Xylophis]], so you can consider it a difficult start.&lt;br /&gt;
* '''Load Game''': You can load previously saved games here. Saves created with older versions of Pioneer might not load. This usually happens when some major thing changes in the game.&lt;br /&gt;
* '''Options''': you can access Pioneer's [[Settings Menu]]. You can set up graphics, controls, volumes or language for example.&lt;br /&gt;
* '''Quit''': Exit the game.&lt;br /&gt;
* '''Build''': this number is the build of the game you are running. Basically a version number, useful for reporting bugs for example.&lt;br /&gt;
&lt;br /&gt;
==Flight==&lt;br /&gt;
Flight physics in Pioneer is Newtonian, which means there's no arbitrary limit to speed, orientation or position. The ships don't slow down in space, until it actively thrusts in the opposite direction it's flying. Or hits something. Ship acceleration depends on ship mass and engine thrust.&lt;br /&gt;
Speed only have a meaning relative to something, so you have to pick a point of reference. This is automatic, based on the distance to the bodies. You can reach very high speeds compared to what we are used to here on the face of a planet. On the magnitude of thousands of km/s.&lt;br /&gt;
&lt;br /&gt;
There's an aided flight mode which compensates for the drifting in the vacuum of space, called Set Speed mode. It tries to maintain a set speed to the direction the ship is facing, using the maneuvering thrusters. The performance of this aid varies ship to ship, and the cargo load could also have an impact on it.&lt;br /&gt;
&lt;br /&gt;
Ships in the game are quite powerful in terms of acceleration, cargo and delta-v capacity compared to real spacecrafts. It's entirely possible to travel to the edge of a star system even with the smallest shuttle. It will just take significantly more time.&lt;br /&gt;
&lt;br /&gt;
Gravity is simulated on a two-body level. You can orbit any planet or moon, but only the closest body's gravity affects your ship. This is the same body you measure your speed to. This also means that you have to take the planets gravity into account when you are flying close to it, landing, or taking off. You can also use this to your advantage to alter your course using less fuel for example.&lt;br /&gt;
Distances are realistic, so space travel can take several days or even weeks in a large system. Time could be accelerated up to 10000 times to shorten travel for the player. This doesn't correspond with any device or technology in the game universe though. It's just a UI/Gameplay feature.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Flight UI ===&lt;br /&gt;
&lt;br /&gt;
Beginners are strongly recommended a look at the [http://pioneerwiki.com/wiki/Basic_flight Basic flight] article, to learn how to control the ship.&lt;br /&gt;
&lt;br /&gt;
When you pick your starting point, you will get behind the controls of your ship. [[File:Manual flight ui 01.png|right|600px|Manual flight ui 01.png]] There are several things on the flight UI:&lt;br /&gt;
&lt;br /&gt;
*'''Prograde marker:''' The direction you are flying relative to the point of reference, &lt;br /&gt;
*'''Speed relative to reference body''': The speed of the ship relative to the point of reference (''&amp;quot;System&amp;quot;'' in this example). &lt;br /&gt;
*'''Prograde marker &amp;amp; speed (target)''': Direction and speed of the ship relative to the target (which itself moves around a star for example) &lt;br /&gt;
*'''Heading''': Only shown, top centre of screen, when close to planet (not shown in screen shot here). Can switch reference system by clicking it to be either in planetary coordinates, heading 0 = north, 90 = east, 180 = south, 270 = west; or in system-wide coordinates, heading is on the celestial sphere (defined by the ecliptic) &lt;br /&gt;
*'''Pitch''': Only shown, at right centre of screen, when close to planet (not shown in screen shot here). Shows elevation of ship direction over horizon. &lt;br /&gt;
*'''Target''': The navigation target, selectable by using the Left Mouse Button. You can set any body or ship as the point of reference with Ctrl+Left Mouse &lt;br /&gt;
**'''Distance to target''': Shows the distance to the selected object. The unit is km for shorter distances and AU for large.   &lt;br /&gt;
*'''Speed lines''': A visual aid showing the direction and speed of motion. &lt;br /&gt;
*'''Fuel reserve''': The&amp;amp;nbsp;% amount of fuel (propellant really) the tanks contain. You can refill it during flight using the Info View screen (F3). Spaceports do not refil your tanks automatically, but you can do it on the station lobby. Note that it only shows&amp;amp;nbsp;%, but your actual deltaV can be more since you continuously expel propellant, so your craft becomes lighter. &lt;br /&gt;
*'''Scanner''': Scanner display which shows nearby contacts. Only works if the ship has a Scanner equipped. This area also shows any messages you receive, like completion or failure of a mission for example. &lt;br /&gt;
*'''Dashboard:''' &lt;br /&gt;
Note: Parts of this section are outdated because of the ongoing UI rewrite.&lt;br /&gt;
**'''Date, Time and time acceleration controls''':&amp;lt;br/&amp;gt; [[File:Manual flight ui 02 time.png|RTENOTITLE]] &lt;br /&gt;
***Shows the current date and time. &lt;br /&gt;
***The Pause, Play, and Fast Forward buttons can be used to speed up time to shorten long trips. Or to wait for better missions or ships on a station. Maximum level of time acceleration might be restricted, especially in the vicinity of stations or planets. &lt;br /&gt;
***This restriction could be overridden by holding ctrl when activating it. Use this with caution, because it could easily wreck your ship.   &lt;br /&gt;
**'''Screens''':&amp;lt;br/&amp;gt; [[File:Manual flight ui 03 screens.png|RTENOTITLE]] &lt;br /&gt;
***These buttons provide access to certain screens like Info View or Maps. You can also use the corresponding F-keys to access them. From left to right: &lt;br /&gt;
***'''View''' (F1): Switches between internal and external views. You can switch back to these views from any other screen using this button or key. &lt;br /&gt;
***'''Maps''' (F2): Sector and System Map and System information screens. You can plan your trip here. &lt;br /&gt;
***'''Info''' (F3): Information screens, about the ship, the player, missions, cargo and crew. &lt;br /&gt;
***'''Comms, Station screen''' (F4): Opens Station Screen while docked to a spaceport. &lt;br /&gt;
****There are six attitude (ship facing) options meant for orbital operations: &lt;br /&gt;
*****Prograde/retrograde: faces the ship in/opposite the direction that you are traveling (changes the height of the orbit) &lt;br /&gt;
*****Normal/anti-normal: faces the ship in the direction [anti-]normal to your orbital plane (changes the orbit inclination) &lt;br /&gt;
*****Radially in/radially out: faces the ship toward/away from the orbited body   &lt;br /&gt;
****If the ship has an autopilot installed, there are also options for automatically flying the ship into a low/medium/high orbit, flying to the vicinity of the navigation target, and flying to the navigation target and docking.     &lt;br /&gt;
**'''Controls''':&amp;lt;br/&amp;gt; [[File:Manual flight ui 04 controls.png|RTENOTITLE]] &lt;br /&gt;
***These are flight related controls, corresponding F-keys could be used also. &lt;br /&gt;
***'''Flight Mode''' (F5): Switches between ''Set Speed'' and ''Manual'' flight mode.&amp;lt;br/&amp;gt; Also switches off the autopilot or could be used to undock or take off. &lt;br /&gt;
***'''Landing gear''' (F6): Rises or lowers the landing gear (undercarriage). &lt;br /&gt;
***'''Hyperdrive''' (F7): Engages hyperdrive. Needs a reachable hyperspace target selected on the Sector Map, and enough fuel for the trip. If it is crossed out, then you are in the hyperperspace limit zone, and jumping is illegal. You need to fly far enough from the station, or the police will chase you down. &lt;br /&gt;
***'''Low Thrust''' (F8): Sets the percentage of low thrust (Thrusting while holding Left Shift) &lt;br /&gt;
***It also displays the desired speed in Set Speed flight mode. On this image it shows the flight mode, which is set to manual. &lt;br /&gt;
***The small '''circular button''' next to the flight mode display show the status of the rotation damping. &lt;br /&gt;
***The '''[!]''' next to the rotation damping indicator shows your alert status. &lt;br /&gt;
***[[File:Manual flight ui 05 controls.png|RTENOTITLE]]&amp;lt;br/&amp;gt; These are controls for Scanner mode, Missiles and equipment (ECM) and Messages respectively.&lt;br /&gt;
&lt;br /&gt;
===Combat===&lt;br /&gt;
Combat in Pioneer is quite straightforward right now. You can buy Pulse cannons or Plasma accelerators of different power and fire rate, if your ship has mount for them. Some ships have a rear mount too. Cannons generate heat when fired, and they need some time to cool down. They can not be fired if they are overheating.&lt;br /&gt;
&lt;br /&gt;
You can also buy several types of missiles, which can be fired using the '''M''' key, if you have a combat target. An ECM can provide protection against missiles by overloading their guidance.&lt;br /&gt;
&lt;br /&gt;
You can target any ship as combat target, using your '''Left Mouse Button'''(which doesn't change the Navigation target). The ship's computer displays the speed of the ship relative to your vessel, and it's distance. There's also a lead indicator, a little cross which shows the predicted location of the target. This is the spot where the ship will be in theory based on it's speed and direction, when the projectiles reach that distance. It's harder than that though, since no sane enemy will fly in a straight line at a constant speed. You shouldn't do that either, and this is where your maneuvering thrusters can be very useful.&lt;br /&gt;
&lt;br /&gt;
Ship durability is determined by it's hull's mass. Lighter ships can take less damage, but they are more maneuverable generally, then a behemoth transport, which might withstand sever punishing before giving in. You can repair any damage you suffer on spaceports, but it will cost you.&lt;br /&gt;
&lt;br /&gt;
There are several additional equipment that can increase your chances in a firefight (and make your life harder if your opponent has them):&lt;br /&gt;
* '''ECM''': Electronic countermeasure against missiles. The Advanced ECM provides protection against more sophisticated missiles.&lt;br /&gt;
* '''Hull Auto-repair system''': As the name implies, it slowly repairs any damage your ship took. It weights 40t, so smaller ships can not have it.&lt;br /&gt;
* '''Hypercloud Analyzer''': You can get readings from a hyperspace cloud remnant, like destination and arrival date. It's useful if you need to follow somebody.&lt;br /&gt;
* '''Laser Cooling Booster''': Speeds up the cooling of cannons, so continuous firing can be maintained longer.&lt;br /&gt;
* '''Scanner''': A sensor system that shows the ships and objects around you. A form of radar basically.&lt;br /&gt;
* '''Radar Mapper''': Provides additional information about the combat target, like the type of ship, mass, condition among others.&lt;br /&gt;
* '''Shield Generator''': Projects a protective screen around your ship, which can take a certain amount of damage before collapsing. It recharges slowly over time. You can mount several Shield Generator to increase its power.&lt;br /&gt;
* '''Shield Energy Booster''': Increases the effectiveness of the shields.&lt;br /&gt;
&lt;br /&gt;
===Flight controls ===&lt;br /&gt;
A brief summary of flight controls. A more detailed list can be found at [[Keyboard and mouse controls]].&lt;br /&gt;
&lt;br /&gt;
*'''Orientation''':&lt;br /&gt;
** '''W, S''': Pitch&lt;br /&gt;
** '''A, D''': Yaw&lt;br /&gt;
** '''Q, E''': Roll&lt;br /&gt;
** '''P''': Kill rotation&lt;br /&gt;
** '''R''': toggle rotation damping&lt;br /&gt;
** '''Right mouse button''': hold to activate mouse control&lt;br /&gt;
*'''Movement''':&lt;br /&gt;
** '''I, K''': Forward and backward thrust&lt;br /&gt;
** '''J, L''': Side thrust&lt;br /&gt;
** '''U, O''': Up and down thrust&lt;br /&gt;
* '''Left Shift''': use lower thrust&lt;br /&gt;
* '''F8''' : Set low thrust percentage&lt;br /&gt;
&lt;br /&gt;
*'''F5''': change flight mode, or undock, takeoff&lt;br /&gt;
** '''Manual flight''': everything is manual&lt;br /&gt;
** '''Set Speed Mode''': the ship tries to maintain the set speed in the direction the ship is looking. Using the thrusters override it temporarily&lt;br /&gt;
***'''Return''': Increase speed&lt;br /&gt;
*** '''Right Shift''': Decrease speed&lt;br /&gt;
*'''F6''': toggle landing gear&lt;br /&gt;
*'''F7''': Engage hyperdrive&lt;br /&gt;
*'''Weapons''':&lt;br /&gt;
** '''Space''': Fire cannon&lt;br /&gt;
** '''M''': Fire missile&lt;br /&gt;
*'''View''':&lt;br /&gt;
**'''F1''': Cycles trough internal, external and sideral views. External rotates with your ship, sideral doesn't.&lt;br /&gt;
**'''Numpad 2 4 6 8 and 1 3''': Rotate the the external views.&lt;br /&gt;
**'''Numapad + -''': Zoom external views.&lt;br /&gt;
**'''Numpad /''': Reset view.&lt;br /&gt;
**'''Internal views''':&lt;br /&gt;
***'''8 2''': Front and rear view. You can shot backwards in rear view if you have a weapon installed on that mount.&lt;br /&gt;
***'''4 6''': Left and right view.&lt;br /&gt;
***'''9 3''': Top and bottom view.&lt;br /&gt;
&lt;br /&gt;
==Map (F2)==&lt;br /&gt;
This is where navigation takes place. You can open the Map view with the F2 key or the button on the dashboard. &lt;br /&gt;
[[File:Manual_map_buttons.png|left]]&lt;br /&gt;
There are several maps you can use.&amp;lt;br/&amp;gt; You can reach them by using their F-key, or the button on the right side of the dashboard. If you come back to the map view you will return to the map screen you were at when you switched to another view. Orbital Map and System info shows the information of the system which is selected on the Sector map.&lt;br /&gt;
===Sector Map (F5)===&lt;br /&gt;
[[File:Manual_map_sector_01.png|right|600px]]&lt;br /&gt;
[[File:Manual_map_sector_02.png|right|600px]]&lt;br /&gt;
&lt;br /&gt;
The sector map shows the star systems in the galaxy, and you can plot your hyperspace route here, or you can just hunt for interesting systems for later visits. Every system is indicated by a sphere. Its colour indicates the primary star type. You can select a system by clicking on it. If it's a system with multiple stars, you can cycle trough them by clicking on the system again, or you can select it on the System Info screen.&lt;br /&gt;
&lt;br /&gt;
The map is divided to 8 light year cubes called sectors. Each sector has a coordinate on each axis; the origin (0,0,0) is Sol. The galaxy is not a flat disk, you can travel quite far on all three axes before you reach the edge of it.&lt;br /&gt;
'''Map view UI:'''&lt;br /&gt;
*'''Current system''': The system you are currently in, with sector coordinates and a brief info about it. The button next to it centers the view on it.&lt;br /&gt;
*'''Hyperspace target''': The system selected as hyperspace target. Shows the coordinates, distance, fuel and travel time needed to reach it, and a brief info about it. It can be locked with Space bar, that way it stays as target even if another system is selected.&lt;br /&gt;
*'''Selected system''': Shows the same info as Hyperspace target if that's not locked. If locked, it shows the same info for the selected system. Useful for system comparison or travel planning.&lt;br /&gt;
*'''Map view settings''':&lt;br /&gt;
**'''Draw vertical lines''': draws a vertical line from the stars in range to the plane of the map to show the height relative to that plane. Clarifies system positions a bit.&lt;br /&gt;
**'''Label out-of-range systems''': Toggles label display for systems that are out of range. The map only shows labels for systems in range by default, so it's a useful option if you look for a specific system for example.&lt;br /&gt;
**'''Label uninhabited systems''': Toggles label display for systems that are uninhabited (no settlements, spaceports).&lt;br /&gt;
*'''Hyperspace range''': the map draws a transparent sphere to show which systems are in jump range. Jump range depends on hyperdrive class, fuel on board and the total mass of the ship.&lt;br /&gt;
*'''View position''': On the lower left corner, distance and coordinate data are displayed regarding to the current view.&lt;br /&gt;
&lt;br /&gt;
'''Map controls:'''&lt;br /&gt;
*'''Translation''': You can move around on the sector map using the '''arrow keys''' and '''Page Up''' and '''Page Down''' for vertical (forward/backward) movement. Movement is based on the view rotation.&lt;br /&gt;
*'''Rotation''': The view can be rotated with the '''W A S D''' keys, or with holding the '''Right Mouse button'''.&lt;br /&gt;
*'''Zoom''': You can zoom with the '''+''' and '''-''' keys, or with the '''Mouse wheel''', or using the two buttons on the top right.&lt;br /&gt;
*'''Faster controls''': Holding '''Shift''' speeds up movement and zoom. Use '''Right Shift''' for smaller speedup and '''Left Shift''' for quite fast movement.&lt;br /&gt;
*'''Selecting system''': Moving around on the map will automatically select the system closest to the center of the view. You can also select any system with the mouse.&lt;br /&gt;
**'''Selecting another star''' In a system with multiple stars (Binary or tertiary systems), you can cycle trough each star by clicking on the system again until you find the one you want to travel to.&lt;br /&gt;
**'''Lock selection''': You can lock your selection as the hyperspace target with the '''Space bar'''. This allows for selecting another system to plan a route, or could be useful for comparing systems.&lt;br /&gt;
**'''Center''': Pressing '''C''' centers the view on the system you are in. '''G''' centers on Selected system and '''H''' centers on the Hyperspace target.&lt;br /&gt;
*'''Reset view''': '''R''' resets view rotation, and zoom.&lt;br /&gt;
*'''Search''': You can type in the name of the system to the Search field on the lower right and it will select the system if it can be found. Note that it doesn't search the entire galaxy, only in a few tens of sectors range. You can also enter coordinates to move the map to any area.&lt;br /&gt;
*'''Tab''': Switches the left side info panel to faction filter.&lt;br /&gt;
'''Zooming out far'''&lt;br /&gt;
&lt;br /&gt;
Zooming out far switches to an overview that only shows color-coded dots for systems based on faction, and brings up the faction filter to the right where you can hide any faction. Map controls are the same as before.&lt;br /&gt;
&lt;br /&gt;
===Orbital map (F6)===&lt;br /&gt;
[[File:Manual_map_orbit_01.png|right|600px]]&lt;br /&gt;
&lt;br /&gt;
You can switch to the Orbital map using F6. It shows the to-scale orbital map of the star system selected on the Sector map. It is useful for in-system navigation. It shows your current position and your course of movement, and the orbit of every body (star, planet, moon, space-station) in the system.&lt;br /&gt;
&lt;br /&gt;
'''Controls''':&lt;br /&gt;
Controls of the orbital map are a bit different from the Sector map. &lt;br /&gt;
*'''Selection''': You can select any orbital body using your '''Left Mouse button'''.&lt;br /&gt;
*'''Targeting''': Any body can be targeted by holding '''Shift''' while selecting the body.&lt;br /&gt;
*'''Translation''':The view is always centered on the body selected. You can't move the view.&lt;br /&gt;
*'''Rotation''': You can rotate either by holding the '''Middle mouse button''', or by using Left Mouse Button on the rotation icon&lt;br /&gt;
*'''Zoom''': You can use the '''Mouse Wheel''' or the buttons on the top right for zooming. Shift accelerates zoom similar to the sector view.&lt;br /&gt;
*'''Time controls''': You can use these buttons to check the position of the bodies in the system (including your ship) in any given time. The button in the center resets it to the current time. This is useful for planning a flight. The set time is shown above the current time on the left.&lt;br /&gt;
&lt;br /&gt;
The Orbital Map shows your position and course in the system, relative to your reference body, be it a stable orbit or an escape trajectory. You can use this to fine-tune your path while you are traveling to your destination for example. Or you can just check if you managed to achieve a stable orbit. &lt;br /&gt;
&lt;br /&gt;
Time controls work on this too, you can check where you will be at any given time. Note that this course display might change when you switch reference bodies, for instance when you get close to a planet.&lt;br /&gt;
&lt;br /&gt;
===System info (F7)===&lt;br /&gt;
[[File:Manual_map_info.gif|right|600px]]&lt;br /&gt;
This screen shows detailed info on the system. If the system has multiple stars, you can select which one you want to be the hyperspace destination, by clicking on it.&lt;br /&gt;
&lt;br /&gt;
F7 switches between these views: &lt;br /&gt;
&lt;br /&gt;
*'''Planetary info''': Shows a general system description. Hovering over any body with the mouse displays more detailed information, like orbital parameters, temperature, atmosphere composition. It also shows the star-ports on the surface of the body. Bodies that have settlement are circled for easier spotting. In systems with multiple stars, the one currently selected as hyper jump target is indicated with a square centered on it.&lt;br /&gt;
&lt;br /&gt;
*'''Economics info''': Shows exports, imports of the system, and the illegal goods. Exported items are cheap, imported items are expensive, so this is a crucial screen for trading. Illegal goods can only be bought or sold at black market retailers found on the star-port BBS. Be careful though, some retailers are undercover cops who will fine you if you attempt to make business with them. Illegal items are based on factions. If you have selected a system other than the one you are currently in, it will compare imports/exports between them and mark commodities of special interest with Green (best, e.g. major export in system A is a major import in B), or white (Major/Minor export in A is a Minor/Major import in B). For Illegal goods only gray or red is used to show if it is legal in one of the systems but illegal in the other.&lt;br /&gt;
&lt;br /&gt;
*'''Demographics''': Shows information on the system, like population, government type and faction.&lt;br /&gt;
&lt;br /&gt;
===Galaxy map (F8)===&lt;br /&gt;
The galaxy map shows an overview of the whole galaxy, highlighting your current position. Brighter areas generally have more stars than darker areas.&lt;br /&gt;
&lt;br /&gt;
==Info View (F3)==&lt;br /&gt;
You can access various information by pressing F3, or the Info View button on the dashboard.&lt;br /&gt;
===Ship Information===&lt;br /&gt;
[[File:Manual_infoview_01_ship.png|600px|right]]&lt;br /&gt;
[[File:Manual_infoview_02_commander.png|600px|right]]&lt;br /&gt;
[[File:Manual_infoview_03_cargo.png|600px|right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Shows information regarding your spaceship&lt;br /&gt;
*'''Hyperdrive &amp;amp; Hyperspace range'''&lt;br /&gt;
The class of hyperdrive installed on the ship. Higher class hyperdrives are heavier, but can jump to greater distances. Common hyperdrives consume Hydrogen, which can be bought on stations, or could be scooped from the atmosphere of gas giants, if the ship has a Fuel Scoop installed. &lt;br /&gt;
&lt;br /&gt;
Military Drives are generally faster, but they use Military fuel, which is more expensive and harder to obtain. Military drives turn fuel into Radioactives that you need to get rid of.&lt;br /&gt;
&lt;br /&gt;
Current Hyperspace range is displayed based on current ship mass and the amount of fuel in the cargo hold. You can see the theoretical maximum range shown in brackets. This changes as you fill your ship with cargo or fuel.&lt;br /&gt;
&lt;br /&gt;
*'''Mass data'''&lt;br /&gt;
** Weight empty: Dry mass of the ship, without any cargo or propellant.&lt;br /&gt;
** Capacity used: Used and available cargo and equipment capacity of the ship.&lt;br /&gt;
** Fuel weight: Amount of propellant, and the maximum capacity of the tanks. Propellant is Hydrogen. Tanks are refilled upon docking or landing on a station, if the player has enough money ($1-6 usually). It's possible to buy extra Hydrogen in the Commodity Market for manual in-flight refill.&lt;br /&gt;
** All-up weight: Sum of hull, cargo and propellant mass.&lt;br /&gt;
*'''Weapons'''&lt;br /&gt;
Cannons installed on front and rear facing hard-point.&lt;br /&gt;
*'''Fuel &amp;amp; Delta-v'''&lt;br /&gt;
Propellant and delta-v reserves.&lt;br /&gt;
Delta-v shows, how much speed change can be done using the propellant in the tanks. Generally, more delta-v means faster in-system travel.&lt;br /&gt;
&lt;br /&gt;
For a brachistochrone transfer (accelerating halfway, then decelerating) you can use up half of the delta-v. If you exceed that, then you will be unable to stop your ship. It's useful to save a good amount of delta-v (about 500-1000 km/s) for course corrections and landing.&lt;br /&gt;
&lt;br /&gt;
Delta-v display doesn't take additional Hydrogen in the cargo hold into account, so refueling with Hydrogen can increase it. Ship mass can also change delta-v capability dramatically.&lt;br /&gt;
&lt;br /&gt;
You can [[Hydrogen_scoop|scoop Hydrogen]] from the atmosphere of a gas giant, if you have Fuel Scoop installed.&lt;br /&gt;
&lt;br /&gt;
You can mine water in the field, if you have a Mining Blaster and Cargo scoop. You need to find a planet that has water (a smaller moon or dwarf planet is easier to mine), shoot the surface and collect any water that's blasted out from it. &lt;br /&gt;
*'''Accelerations'''&lt;br /&gt;
Shows the acceleration the ship is capable of with it's current load. Displayed both in m/s^2 and Gee. A ship with higher acceleration will feel faster, especially around station. It affects travel times less then delta-v.&lt;br /&gt;
&lt;br /&gt;
If Up acceleration is higher then the gravity of the planet, then the ship might not be able to take off or land, especially using the autopilot.&lt;br /&gt;
&lt;br /&gt;
Acceleration increases while the ship uses its propellant, and can be further increased by jettisoning cargo. Selling cargo or equipment can help too.&lt;br /&gt;
&lt;br /&gt;
*'''Crew'''&lt;br /&gt;
Minimum crew shows the needed head count to fly the ship (currently ignored). Crew cabin shows the crew capacity of the craft. Crew are useful in multiple ways, but you have to pay them weekly.&lt;br /&gt;
&lt;br /&gt;
Crew can control the ship, engage the enemy or repair damages. Each crew member has strengths and weaknesses, their abilities improve by time.&lt;br /&gt;
*'''Equipment'''&lt;br /&gt;
Shows the list of installed equipment. These equipments enhance your ship's capabilities, and can even add functions to it.&lt;br /&gt;
&lt;br /&gt;
===Personal Information===&lt;br /&gt;
&lt;br /&gt;
Shows information about your character.&lt;br /&gt;
Currently you see your combat rating, reputation standing, and rank (however, the rank can not be changed in the game yet, and doesn't influence the game either).&lt;br /&gt;
&lt;br /&gt;
Reputation affects mission availability, and can be increased by completing missions or donating to charities. Failed missions decrease your reputation. &lt;br /&gt;
&lt;br /&gt;
You can also change your name, gender and face.&lt;br /&gt;
&lt;br /&gt;
===Economy &amp;amp; Trade===&lt;br /&gt;
&lt;br /&gt;
Shows the contents of the cargo hold in detail, and allows in-flight refueling.&lt;br /&gt;
You can find the list of cargo in your hold, and you can jettison any of them here while in flight. If you have Cargo Scoop installed, you can even retrieve the jettisoned cargo.&lt;br /&gt;
&lt;br /&gt;
Refueling transfers 1t of Hydrogen, if available, to the propellant tanks.&lt;br /&gt;
Available and occupied passenger cabin space can be checked here too.&lt;br /&gt;
&lt;br /&gt;
===Missions===&lt;br /&gt;
[[File:Manual_infoview_04_missions.gif|600px|right]]&lt;br /&gt;
Shows information about accepted missions. You can check the destination and deadline here, and you can see additional information about each mission, using the More info... button on the right.&lt;br /&gt;
&lt;br /&gt;
You can find and take all kinds of missions on any star-port's BBS, but be sure to check if you and your ship is capable of completing it. Failing missions decrease your reputation, which makes it harder to find lucrative offers, so it will be harder to regain your reputation, so be cautious.&lt;br /&gt;
&lt;br /&gt;
===Crew Roster===&lt;br /&gt;
[[File:Manual_infoview_06_crew.gif|600px|right]]&lt;br /&gt;
You can access information about your crew. It shows the salary which you need to pay them weekly. If you can't pay for a while, they will get off on the next port, with some of your reputation.&lt;br /&gt;
&lt;br /&gt;
Some ships need multiple crew members on board even to fly it (this is ignored right now though), and they can perform several tasks, like piloting, engaging in combat or repairing the hull or failed equipment.&lt;br /&gt;
&lt;br /&gt;
== Station view (F4)==&lt;br /&gt;
[[File:Manual_station_bbs.png|600px|right]]&lt;br /&gt;
[[File:Manual_station_market.png|600px|right]]&lt;br /&gt;
Access this screen with F4 or the comms icon on the dash board, while you are docked to a space-port, be it a surface base or an orbital station.&lt;br /&gt;
All screens show the cargo and passenger capacity of your ship, your money and legal status in the footer.&lt;br /&gt;
&lt;br /&gt;
=== Lobby ===&lt;br /&gt;
It's a good idea to request launching clearance before taking off. The station dispatcher will stare at you until you get embarrassed and go about your business.&lt;br /&gt;
&lt;br /&gt;
=== Bulletin Board ===&lt;br /&gt;
&lt;br /&gt;
You will find missions of all sorts here on the BBS. Keep in mind that some might not be suited for your ship in terms of distance and deadline. Some missions are in-system, and will not require any hyperdrive, but will in turn pay less. You should check the system map even in this case, because planets might be in opposition on their courses and you end up traveling across the whole system which can take a while even with a high delta-v ship.&lt;br /&gt;
&lt;br /&gt;
Some missions are riskier, so it's always a good idea to ask if there will be any danger, so you can prepare properly, or avoid the mission altogether until you are better rigged for combat for example. &lt;br /&gt;
&lt;br /&gt;
Local hyperdrive maintenance companies offer their services here too. Old drives may start to misbehave, so if you don't want to strand yourself in the interstellar void, don't forget regular maintenance.&lt;br /&gt;
&lt;br /&gt;
Charities can also turn up from time to time, asking for money for their cases. Donating to them could increase your reputation.&lt;br /&gt;
&lt;br /&gt;
When you start a new game, you will not have any reputation, which must be earned by taking on missions (or donating to charities). You can see your current reputation standing in your personal Info view. Reputation affects what kind of missions you can take on. Completing a mission will increase your reputation, and opens up more job opportunities, and failure decreases it, narrowing the available mission after a while.&lt;br /&gt;
&lt;br /&gt;
Some stations have private black market goods dealers who trade in illegal goods, although some might be undercover police. &lt;br /&gt;
&lt;br /&gt;
You can also hire new crew members if you are in need. Make sure to have good candidates on the BBS before buying a new ship. You can make them sit a test to show their abilities (though those doesn't affect the game right now), and you can negotiate their pay too.&lt;br /&gt;
&lt;br /&gt;
If no mission suits you, then something new might pop up over time. Missions that require better reputation are grayed out, and the advertiser won't talk with you much.&lt;br /&gt;
&lt;br /&gt;
=== Commodity Market ===&lt;br /&gt;
&lt;br /&gt;
You can buy and sell commodities here. Keep in mind, that a heavy ship will have shorter hyperspace range. You can also buy Hydrogen or Military fuel for your hyperdrive here.&lt;br /&gt;
You just need to click on the name of the commodity on the left side to buy 1t of it. The contents of your cargo hold are on the right side, clicking on any item will sell 1t of it. Buy and sell prices are the same right now.&lt;br /&gt;
&lt;br /&gt;
Prices depend on the type of the system. Agricultural systems will pay a lot for farm machinery for example, and you can buy cheap foodstuff. An industrial system on the other hand sells cheap machinery, and pays good money for food. You need to scout out lucrative routes for yourself if you want to turn profit.&lt;br /&gt;
&lt;br /&gt;
Illegal goods can't be found on the market, you need to look for a black market retailer on the BBS. Note that one item can be completely legal in one system, but illegal in another.&lt;br /&gt;
&lt;br /&gt;
=== Shipyard ===&lt;br /&gt;
[[File:Manual_station_shipmarket.png|600px|right]]&lt;br /&gt;
You can buy ships here, trading in your current ship with all of its additional equipment or cargo.&lt;br /&gt;
You can check out the capabilities and stats of the ships offered for purchase, much like the information you have on the Info view screen. The ''After Trade-in'' is the final price you need to pay, and if it's negative, it means your current ship worths more then the one you are looking at. Trade-in value is about the half of the list value of any ship.&lt;br /&gt;
&lt;br /&gt;
Ships are traded continuously, so you just need to wait a few hours if there's nothing interesting there, and new vessels will turn up.&lt;br /&gt;
&lt;br /&gt;
=== Equipment Market ===&lt;br /&gt;
Buy/sell equipment for your ship. Equipment market works similar to the commodities market. Left side shows what's available on the station, right side shows, what's installed on your ship.&lt;br /&gt;
Each equipment has a certain mass, so they occupy space on the ship much like cargo. heavier ships are harder to maneuver, and their delta-v and hyperspace range also decreases. You can't remove any equipment while you are flying, except for using missiles.&lt;br /&gt;
Equipments add extra capabilities to your ship, like radar and targeting information, autopilot, cargo and fuel scooping ability. You can buy weapons, shields and some upgrades to these too.&lt;br /&gt;
&lt;br /&gt;
=== Ship Repairs ===&lt;br /&gt;
Maintaining your ship is important, unless you want to be stranded in an uninhabited system or interstellar space due yo your hyperdrive failing.&lt;br /&gt;
You can repair your hull here too, if needed.&lt;br /&gt;
&lt;br /&gt;
=== Police ===&lt;br /&gt;
If you have any fines you need to pay them or else risk getting shot down by some restless police officer.&lt;br /&gt;
You can get in trouble for trading with illegal goods, or even if you accidentally fire your weapon near any settlement. In the later case it's better to run, then pay the fine later.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=4133</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=4133"/>
		<updated>2021-10-08T13:25:32Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious words, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This will be a multi-step process:&lt;br /&gt;
** Implement some minor features using the ECS paradigm to get started and evaluate requirements. '''Working'''&lt;br /&gt;
** Drive the new ECS-based features from existing code as a temporary measure. '''Working'''&lt;br /&gt;
** Convert a major feature (Ship, BodyOnPlanet, etc) to use the ECS.&lt;br /&gt;
** Continue converting major features until all applicable areas of the code are converted.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are mostly finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
Planned Features:&lt;br /&gt;
* Modular, Lua-exposed input system '''WORKING'''&lt;br /&gt;
* Key-chord inputs, allowing arbitrary modifier keys / buttons. A software &amp;quot;pinkie switch&amp;quot; if you will. '''DONE'''&lt;br /&gt;
* Frame-based input grouping system, allowing multiple conflicting &amp;quot;modes&amp;quot; to be enabled or disabled en-bloc. '''DONE'''&lt;br /&gt;
* Touchscreen input for camera and flight controls. (Investigate: virtual joysticks or whole-screen mouse emulation?)&lt;br /&gt;
&lt;br /&gt;
==== Model System ====&lt;br /&gt;
The model system needs further work and refactoring. It currently bloats savefiles excessively, has a very limited API that ignores file paths, is a pain to build files for release builds, and cannot be multi-threaded.&lt;br /&gt;
&lt;br /&gt;
Planned Improvements:&lt;br /&gt;
* Don't store a list of transform visitors in savefiles; animations should be responsible for node positioning. Possibly use a dirty flag to only store nodes that have been explicitly positioned by code? '''DONE'''&lt;br /&gt;
* Refactor all code and data that touches models to use full paths instead of just the basename component.&lt;br /&gt;
* Refactor model loading to make it asynchronous; run the load step on a separate thread, and add an end-of-frame task on the main thread to upload model data to GPU&lt;br /&gt;
* Allow ModelBody to cache collision objects. This will likely come hand in hand with not creating separate Model instances.&lt;br /&gt;
&lt;br /&gt;
==== Lua Engine ====&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax and implicit &amp;quot;init.lua&amp;quot; support. '''DONE'''&lt;br /&gt;
* Deprecate &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; in favor of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; to support languages that target Lua. '''DONE'''&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error. '''WORKING'''&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
Tangentially to the ECS changes, we need a better method of binding C++ code and data to Lua. Currently the hand-written method is serviceable, but it is akin to &amp;quot;implementing the same thing twice&amp;quot;, doubling the workload for anyone wanting to add something new.&lt;br /&gt;
* Add an automatic solution for binding C++ code to Lua, capable of auto-generating bindings for properties, methods, and POD-structs and full LuaObject classes. '''DONE''' (see LuaMetaType.h)&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
There are a ''huge'' number of new features and wild gameplay ideas that I and others would really like to see added to the game, but this is a more reasonable list of features that can actually be implemented with a few months of work.&lt;br /&gt;
&lt;br /&gt;
* Refactor the camera / view system to better support inputs, allow arbitrary spectator / debug cameras for editor mode, enable first-person and turret cameras. '''WORKING'''&lt;br /&gt;
** Add a &amp;quot;camera offset&amp;quot; axis for internal / cockpit view that can be hooked up to headtracking. '''DONE'''&lt;br /&gt;
** Make the existing camera system use the new InputFrames for input. '''DONE'''&lt;br /&gt;
** Decouple camera systems from the concept of a ship to make them suitable for debug/flying cameras. '''WORKING'''&lt;br /&gt;
** Add cameras for turrets.&lt;br /&gt;
* Completely rewrite the weapons systems to support arbitrary guns and turrets, as well as a better loadout system. '''WORKING'''&lt;br /&gt;
** Arbitrary fixed gun mounts. '''WORKING'''&lt;br /&gt;
** Turret hardpoints&lt;br /&gt;
** Missile racks / hardpoints&lt;br /&gt;
* Rework drag and atmospheric heating to be somewhat accurate. '''WORKING'''&lt;br /&gt;
* Implement atmospheric lift so aerodynamic ships can fly. '''DONE'''&lt;br /&gt;
* Add airframe damage due to excessive G-force and/or dynamic pressure when flying in atmosphere.&lt;br /&gt;
** Possibly damage specific components (landing gear, control surfaces, etc) reducing their effectiveness and/or destroying them.&lt;br /&gt;
&lt;br /&gt;
Higher-level gameplay refactor features include:&lt;br /&gt;
&lt;br /&gt;
* Support procedurally-generated 'planetary outpost' buildings that have to be discovered / scanned.&lt;br /&gt;
** Load outpost configurations from a scene file of some sort?&lt;br /&gt;
* Add power, heat, and EM system simulations to ships.&lt;br /&gt;
** Power is generated by reactor and/or engines, used to operate most ship systems.&lt;br /&gt;
** Heat generated by engines, shields, and weapons; vented through radiators and atmosphere.&lt;br /&gt;
** EM is generated by all systems and used to determine ship sensor profile.&lt;br /&gt;
* Dynamic ship sensor contact system&lt;br /&gt;
** Ships no longer always show up on the map, they have to be &amp;quot;visible&amp;quot; to the player&lt;br /&gt;
** Add scanner mode to discover outposts, ships, etc&lt;br /&gt;
** Dynamic signal strength approximation allowing reasonable stealth gameplay&lt;br /&gt;
** Planetary occlusion of signals&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom, chromatic aberration, motion blur, and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
'''Clouds'''&lt;br /&gt;
&lt;br /&gt;
Possibly using a low-resolution voxelized implementation, atmospheric clouds are a planned feature. They'd need to support transparency, layer over each other without killing performance, and look at least moderately good. Flat clouds are also required when looking at a planet from orbit, which could be static textures or generated from a basic weather simulation for believable construction.&lt;br /&gt;
&lt;br /&gt;
''' Mesh Decals '''&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;br /&gt;
&lt;br /&gt;
* Finish modelling and texturing the Sador Heavy Fighter, including setting it up to use turrets and a new gun / missile system.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=4132</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=4132"/>
		<updated>2021-10-08T13:24:17Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This will be a multi-step process:&lt;br /&gt;
** Implement some minor features using the ECS paradigm to get started and evaluate requirements. '''Working'''&lt;br /&gt;
** Drive the new ECS-based features from existing code as a temporary measure. '''Working'''&lt;br /&gt;
** Convert a major feature (Ship, BodyOnPlanet, etc) to use the ECS.&lt;br /&gt;
** Continue converting major features until all applicable areas of the code are converted.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are mostly finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
Planned Features:&lt;br /&gt;
* Modular, Lua-exposed input system '''WORKING'''&lt;br /&gt;
* Key-chord inputs, allowing arbitrary modifier keys / buttons. A software &amp;quot;pinkie switch&amp;quot; if you will. '''DONE'''&lt;br /&gt;
* Frame-based input grouping system, allowing multiple conflicting &amp;quot;modes&amp;quot; to be enabled or disabled en-bloc. '''DONE'''&lt;br /&gt;
* Touchscreen input for camera and flight controls. (Investigate: virtual joysticks or whole-screen mouse emulation?)&lt;br /&gt;
&lt;br /&gt;
==== Model System ====&lt;br /&gt;
The model system needs further work and refactoring. It currently bloats savefiles excessively, has a very limited API that ignores file paths, is a pain to build files for release builds, and cannot be multi-threaded.&lt;br /&gt;
&lt;br /&gt;
Planned Improvements:&lt;br /&gt;
* Don't store a list of transform visitors in savefiles; animations should be responsible for node positioning. Possibly use a dirty flag to only store nodes that have been explicitly positioned by code? '''DONE'''&lt;br /&gt;
* Refactor all code and data that touches models to use full paths instead of just the basename component.&lt;br /&gt;
* Refactor model loading to make it asynchronous; run the load step on a separate thread, and add an end-of-frame task on the main thread to upload model data to GPU&lt;br /&gt;
* Allow ModelBody to cache collision objects. This will likely come hand in hand with not creating separate Model instances.&lt;br /&gt;
&lt;br /&gt;
==== Lua Engine ====&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax and implicit &amp;quot;init.lua&amp;quot; support. '''DONE'''&lt;br /&gt;
* Deprecate &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; in favor of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; to support languages that target Lua. '''DONE'''&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error. '''WORKING'''&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
Tangentially to the ECS changes, we need a better method of binding C++ code and data to Lua. Currently the hand-written method is serviceable, but it is akin to &amp;quot;implementing the same thing twice&amp;quot;, doubling the workload for anyone wanting to add something new.&lt;br /&gt;
* Add an automatic solution for binding C++ code to Lua, capable of auto-generating bindings for properties, methods, and POD-structs and full LuaObject classes. '''DONE''' (see LuaMetaType.h)&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
There are a ''huge'' number of new features and wild gameplay ideas that I and others would really like to see added to the game, but this is a more reasonable list of features that can actually be implemented with a few months of work.&lt;br /&gt;
&lt;br /&gt;
* Refactor the camera / view system to better support inputs, allow arbitrary spectator / debug cameras for editor mode, enable first-person and turret cameras. '''WORKING'''&lt;br /&gt;
** Add a &amp;quot;camera offset&amp;quot; axis for internal / cockpit view that can be hooked up to headtracking. '''DONE'''&lt;br /&gt;
** Make the existing camera system use the new InputFrames for input. '''DONE'''&lt;br /&gt;
** Decouple camera systems from the concept of a ship to make them suitable for debug/flying cameras. '''WORKING'''&lt;br /&gt;
** Add cameras for turrets.&lt;br /&gt;
* Completely rewrite the weapons systems to support arbitrary guns and turrets, as well as a better loadout system. '''WORKING'''&lt;br /&gt;
** Arbitrary fixed gun mounts. '''WORKING'''&lt;br /&gt;
** Turret hardpoints&lt;br /&gt;
** Missile racks / hardpoints&lt;br /&gt;
* Rework drag and atmospheric heating to be somewhat accurate. '''WORKING'''&lt;br /&gt;
* Implement atmospheric lift so aerodynamic ships can fly. '''DONE'''&lt;br /&gt;
* Add airframe damage due to excessive G-force and/or dynamic pressure when flying in atmosphere.&lt;br /&gt;
** Possibly damage specific components (landing gear, control surfaces, etc) reducing their effectiveness and/or destroying them.&lt;br /&gt;
&lt;br /&gt;
Higher-level gameplay refactor features include:&lt;br /&gt;
&lt;br /&gt;
* Support procedurally-generated 'planetary outpost' buildings that have to be discovered / scanned.&lt;br /&gt;
** Load outpost configurations from a scene file of some sort?&lt;br /&gt;
* Add power, heat, and EM system simulations to ships.&lt;br /&gt;
** Power is generated by reactor and/or engines, used to operate most ship systems.&lt;br /&gt;
** Heat generated by engines, shields, and weapons; vented through radiators and atmosphere.&lt;br /&gt;
** EM is generated by all systems and used to determine ship sensor profile.&lt;br /&gt;
* Dynamic ship sensor contact system&lt;br /&gt;
** Ships no longer always show up on the map, they have to be &amp;quot;visible&amp;quot; to the player&lt;br /&gt;
** Add scanner mode to discover outposts, ships, etc&lt;br /&gt;
** Dynamic signal strength approximation allowing reasonable stealth gameplay&lt;br /&gt;
** Planetary occlusion of signals&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom, chromatic aberration, motion blur, and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
'''Clouds'''&lt;br /&gt;
&lt;br /&gt;
Possibly using a low-resolution voxelized implementation, atmospheric clouds are a planned feature. They'd need to support transparency, layer over each other without killing performance, and look at least moderately good. Flat clouds are also required when looking at a planet from orbit, which could be static textures or generated from a basic weather simulation for believable construction.&lt;br /&gt;
&lt;br /&gt;
''' Mesh Decals '''&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;br /&gt;
&lt;br /&gt;
* Finish modelling and texturing the Sador Heavy Fighter, including setting it up to use turrets and a new gun / missile system.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Strings_and_translation&amp;diff=4131</id>
		<title>Strings and translation</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Strings_and_translation&amp;diff=4131"/>
		<updated>2021-10-08T12:46:49Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Clarity edits, reference lua-5.2 documentation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Internationalization==&lt;br /&gt;
Recommended reading: [https://pioneerwiki.com/wiki/Translations Pioneer translators wikipage]&lt;br /&gt;
&lt;br /&gt;
It is important that scripters are familiar with the translation system. In the previous example '''hello_world.lua''' used strings directly like &amp;lt;code&amp;gt;print(&amp;quot;Hello, World!&amp;quot;)&amp;lt;/code&amp;gt;. In order for Pioneer to be translated we instead use tokens and calls on the &amp;lt;code&amp;gt;'Lang'&amp;lt;/code&amp;gt; module to substitute it for the string in the chosen language. The translated strings are stored together with their 'key' in json format, one language per file that are kept in the [https://github.com/pioneerspacesim/pioneer/tree/master/data/lang data/lang/] directory. If the script file in which they are used is from the '''data/modules''' directory they have names starting with '''module-''' and ending with the name of the module written in one word, in small caps, and with the '.lua' ending omitted. The final translation from English to other languages is done on Pioneer's project page at [https://www.transifex.com/pioneer/pioneer/ Transifex], a dedicated online translation tool. The translations are committed to the pioneer/master branch on GitHub by a bot and are not to be edited manually apart from the '''en.json''' files.&lt;br /&gt;
&lt;br /&gt;
==Translating strings==&lt;br /&gt;
&lt;br /&gt;
Below is a minimal example with one string added into the translation system. It takes two files, one in '''data/modules''' and one in '''data/lang/module-hello'''. The print statement isn't wrapped in a function so it will be executed when the '''hello.lua''' is being parsed on startup. You will have to scroll through the command-line history to find it interleaved with the other output.&lt;br /&gt;
&lt;br /&gt;
'''data/modules/hello.lua'''.&lt;br /&gt;
 local Lang = require 'Lang'&lt;br /&gt;
 local l = Lang.GetResource(&amp;quot;module-hello&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 print(l.HELLO)&lt;br /&gt;
&lt;br /&gt;
And a corresponding file containing the translated string, and a description field shown to the translator, giving the context. &lt;br /&gt;
&lt;br /&gt;
'''data/lang/module-hello/en.json'''&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;HELLO&amp;quot;: {&lt;br /&gt;
     &amp;quot;description&amp;quot;: &amp;quot;A classic message.&amp;quot;,&lt;br /&gt;
     &amp;quot;message&amp;quot;: &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
In short, any script containing strings that needs translation needs to load the &amp;lt;code&amp;gt;'Lang'&amp;lt;/code&amp;gt; module:&lt;br /&gt;
 local Lang = require 'Lang'&lt;br /&gt;
Then load the translation resource they want to use in their module, often just named &amp;lt;code&amp;gt;'l'&amp;lt;/code&amp;gt; as in:&lt;br /&gt;
 local l = Lang.GetResource(&amp;quot;module-hello&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Note: Selecting any other language than a non-English, e.g. Esperanto, will trigger the game to crash, as it will try to replace the english string with a non-existing Esperanto file. This is only an issue when you're working on your code locally, once the script is merged into the master branch, Transifex will duplicate it to all supported languages, and copy it back into the main source repo.&lt;br /&gt;
&lt;br /&gt;
==Working with strings==&lt;br /&gt;
&lt;br /&gt;
Recommended chapters from [https://www.lua.org/pil/contents.html Programming in Lua (first edition) ]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.lua.org/pil/2.4.html 2.4 – Strings]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.lua.org/pil/3.4.html 3.4 – Concatenation]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.lua.org/pil/20.html 20 – The String Library]&amp;lt;br&amp;gt;&lt;br /&gt;
And from the [https://www.lua.org/manual/5.2/ Lua 5.2 Reference Manual]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.lua.org/manual/5.2/manual.html#6.4 6.4 – String Manipulation]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Concatenation===&lt;br /&gt;
&lt;br /&gt;
Instead of serving ready made sentences we can stitch them together with the Lua string concatenation operator &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt;. The following codelines result in the same output.&lt;br /&gt;
 print(&amp;quot;Hello Clarice!&amp;quot;)&lt;br /&gt;
 print(&amp;quot;Hello&amp;quot; .. &amp;quot; &amp;quot; .. &amp;quot;Clarice!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
This could be created by the more generic:&lt;br /&gt;
&lt;br /&gt;
 local Comms = require 'Comms'&lt;br /&gt;
 local Event = require 'Event'&lt;br /&gt;
 local Game = require 'Game'&lt;br /&gt;
 local NameGen = require 'NameGen'&lt;br /&gt;
 &lt;br /&gt;
 local GREETING = 'Hello'&lt;br /&gt;
 local FBIAGENT = NameGen.Surname()&lt;br /&gt;
 &lt;br /&gt;
 local onShipDocked = function (ship)&lt;br /&gt;
   if ship == Game.player then&lt;br /&gt;
     Comms.Message(GREETING .. ' ' .. FBIAGENT .. '!')&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 Event.Register(&amp;quot;onShipDocked&amp;quot;, onShipDocked)&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; operator is used all over the codebase. Try a search for its occurrence. On Linux I would do &amp;lt;code&amp;gt;grep -R &amp;quot; \.\. &amp;quot; data/modules/ data/libs/ data/pigui/&amp;lt;/code&amp;gt; and that will render a lot of output.&lt;br /&gt;
&lt;br /&gt;
===Lua Standard Library - String manipulation===&lt;br /&gt;
&lt;br /&gt;
I would start to search the '''data/''' register for ''''string.'''' to get a feeling for how it's used. Again on Linux i would use the 'grep' command. &amp;lt;code&amp;gt;grep -R &amp;quot;string\.&amp;quot; data/&amp;lt;/code&amp;gt;. You will see that the two most frequently used functions is &amp;lt;code&amp;gt;string.format(&amp;lt;/code&amp;gt;, which is a part of the lua standard library, and &amp;lt;code&amp;gt;string.interp()&amp;lt;/code&amp;gt;, which is a Pioneer global function residing in '''data/libs/autoload.lua''' and is described in the next paragraph.&lt;br /&gt;
&lt;br /&gt;
Some examples from the Lua standard library:&lt;br /&gt;
 Comms.Message(string.lower('wHaT cAsE sHoUlLd I usE?'))&lt;br /&gt;
&lt;br /&gt;
Maybe not the most easy function to fit into Pioneer. But it's there:&lt;br /&gt;
 Comms.Message('Today is opposite day!')&lt;br /&gt;
 Comms.Message(string.reverse('No, today is not opposite day!')&lt;br /&gt;
&lt;br /&gt;
A more complex example from '''[https://github.com/pioneerspacesim/pioneer/blob/452e9468bc32b844b379307f982c5869733bd85b/data/pigui/modules/hyperjump-planner.lua#L140 data/pigui/modules/hyperjump-planner.lua]'''&amp;lt;br&amp;gt;&lt;br /&gt;
Here &amp;lt;code&amp;gt;string.format(&amp;quot;%.2f&amp;quot;, distance)&amp;lt;/code&amp;gt; is used to set the number of decimals in the jump to two. The rest is string variables that are not translated (names) and string concatenation. '''lc''' is used as the short name for the '''core''' translation resource.&amp;lt;br&amp;gt;&lt;br /&gt;
 textLine = jumpIndex ..&amp;quot;: &amp;quot;.. jump_sys.name .. &amp;quot; (&amp;quot; .. string.format(&amp;quot;%.2f&amp;quot;, distance) .. lc.UNIT_LY .. &amp;quot; - &amp;quot; .. fuel .. lc.UNIT_TONNES..&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Here is what the final formatted text looks like (right side, two selected jump routes):&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:hyperjumpplanner.png]]&lt;br /&gt;
&lt;br /&gt;
==String variables==&lt;br /&gt;
&lt;br /&gt;
When you want a string to present variable data such as numbers and names you use the &amp;lt;code&amp;gt;interp()&amp;lt;/code&amp;gt; function. &amp;lt;code&amp;gt;interp()&amp;lt;/code&amp;gt; accepts a table '{}' and the corresponding keys are then embedded in the translated strings enclosed by curly brackets '{}'.&lt;br /&gt;
&lt;br /&gt;
Using ''''module-stationrefuelling'''' we can do:&lt;br /&gt;
 print(l.WELCOME_TO_STATION_FEE_DEDUCTED:interp({station = 'JFK', fee = 50}))&lt;br /&gt;
&lt;br /&gt;
Example from the actual StationRefuelling module:&lt;br /&gt;
&lt;br /&gt;
'''data/modules/StationRefuelling/'''&lt;br /&gt;
 Comms.Message(l.WELCOME_TO_STATION_FEE_DEDUCTED:interp({station = station.label,fee = Format.Money(fee)}))&lt;br /&gt;
&lt;br /&gt;
'''data/lang/module-stationrefuelling/en.json'''&lt;br /&gt;
  &amp;quot;WELCOME_ABOARD_STATION_FEE_DEDUCTED&amp;quot;: {&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Station welcome message, docking in orbit&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;Welcome aboard {station}. Your docking fee of {fee} has been deducted.&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
'''data/lang/module-stationrefuelling/es.json'''&lt;br /&gt;
  &amp;quot;WELCOME_ABOARD_STATION_FEE_DEDUCTED&amp;quot;: {&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;Station welcome message, docking in orbit&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;Bienvenido a bordo de {station}. Le ha sido deducida su cuota de atraque de {fee}.&amp;quot;&lt;br /&gt;
  },&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=FAQ&amp;diff=3985</id>
		<title>FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=FAQ&amp;diff=3985"/>
		<updated>2021-01-12T18:35:34Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Update joystick section.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Frequently Asked Questions =&lt;br /&gt;
&lt;br /&gt;
== About the Game ==&lt;br /&gt;
&lt;br /&gt;
=== What is Pioneer? ===&lt;br /&gt;
&lt;br /&gt;
Pioneer is a freeform single player space adventure in the spirit of [https://en.wikipedia.org/wiki/Frontier:_Elite_II Frontier: Elite II].&lt;br /&gt;
&lt;br /&gt;
=== Is this a game or a simulation? ===&lt;br /&gt;
&lt;br /&gt;
Frontier was a game, but with a newtonian flight model and a slightly more scientific flavour to the universe than usually in space games. Pioneer follows this same path.&lt;br /&gt;
&lt;br /&gt;
=== Can I play online? ===&lt;br /&gt;
&lt;br /&gt;
There will be no multiplayer. This does not rule out the possibility of minor network features, but multiplayer as it is commonly known is not compatible with the core mechanics of Pioneer. See for instance [[Network_features|Network features]], and [[ServerAgent|ServerAgent]] for more, or our dev-forum [http://pioneerspacesim.net/forum/viewtopic.php?f=3&amp;amp;t=216 here]&lt;br /&gt;
&lt;br /&gt;
=== Can I colonize planets, build space stations or conquer the universe? ===&lt;br /&gt;
&lt;br /&gt;
No, these are out of the game scope. While the game universe might not stay static for the duration of a game, the player can not generally influence major events.&lt;br /&gt;
&lt;br /&gt;
=== Can I walk around space stations and planets? ===&lt;br /&gt;
&lt;br /&gt;
No, you cannot exit your ship. The ship is always your avatar. The development team does have [https://pioneerspacesim.net/forum/viewtopic.php?f=3&amp;amp;t=454 aspirations] to push in this direction, for future versions.&lt;br /&gt;
&lt;br /&gt;
=== Is the universe pre-defined or randomly generated? ===&lt;br /&gt;
&lt;br /&gt;
There are millions of stars in the galaxy. A few hundred on them are based on real-world astronomic catalogues. some of the planets (obvious ones being in the Sol system) are pre-defined, but most things are procedurally generated. This means that a planet does not exist until you actually visit it, but it will be generated the same way for every player.&lt;br /&gt;
&lt;br /&gt;
=== Can I hire crew for my ship? ===&lt;br /&gt;
&lt;br /&gt;
Yes. You can hire crew. But they don't do very much at the moment.&lt;br /&gt;
&lt;br /&gt;
=== Are savegames compatible between releases? ===&lt;br /&gt;
&lt;br /&gt;
The development of the game can happen in sudden bursts, some of which change the game universe, or save/load routine, such that old saves are blocked from loading, lest the game might crash. The player can start a new game, and &amp;quot;give&amp;quot; themselves back money, kills, reputation, ship, as it was in the old save, by using the [[Lua_Console|lua console]].&lt;br /&gt;
&lt;br /&gt;
=== Are savegames compatible between Mods? ===&lt;br /&gt;
&lt;br /&gt;
Again as with savegames between different versions of pioneer, compatibility between mods can not be guaranteed. It all depends on what mods you have installed.&lt;br /&gt;
&lt;br /&gt;
=== Where is star system X from Frontier? Can I buy ship Y? ===&lt;br /&gt;
&lt;br /&gt;
Although Pioneer started out as a clone of Frontier, it no longer is, thus references to the Frontier universe have been removed, and we aim at making Pioneer far better than Frontier. Thus, you will have to figure out new trade routes! But don't worry, Newtonian physics will remain, as well as single player.&lt;br /&gt;
&lt;br /&gt;
== Gameplay ==&lt;br /&gt;
&lt;br /&gt;
=== How do I take screenshots? ===&lt;br /&gt;
&lt;br /&gt;
Ctrl+Printscreen saves .png files in the same directory where the game .ini and savegames are. You can cycle through full HUD/HUD without labels and cursor/No HUD and cockpit using TAB as described in [http://pioneerwiki.com/wiki/Keyboard_and_mouse_controls#In_flight [1]].&lt;br /&gt;
&lt;br /&gt;
=== How do I find star X in the star map ===&lt;br /&gt;
&lt;br /&gt;
First it is important to note that just like in real life, names are not unique. The star map allows the player to search for either name or coordinates of a system. The search is done in the local region of the currently selected system.&lt;br /&gt;
&lt;br /&gt;
Thus a standard way of finding a system is to type in the name in the search field in the star map (generally refereed to as &amp;quot;sector view&amp;quot;). If you know the system is within a few ly from your position, then have your current location selected when you do the search, since it only does a &amp;quot;local&amp;quot; search in space. If the search fails, go to the sector where the star is supposed to be, either by typing the coordinates into the search field, or by using arrows, mark a nearby star in that system, and do another search. You can scroll the star map super fast by holding in the Shift key.&lt;br /&gt;
&lt;br /&gt;
=== I have a Taxi mission to system X, but which starport? ===&lt;br /&gt;
&lt;br /&gt;
For Taxi missions any starport will do, as long as you dock before the deadline.&lt;br /&gt;
&lt;br /&gt;
=== Starsystem names are not unique ===&lt;br /&gt;
&lt;br /&gt;
This is not a bug, space is big, and just here on Earth it is quite common with cities and villages sharing the same name, sometimes quite close.&lt;br /&gt;
&lt;br /&gt;
=== I picked up a mission to a starport in a system, but when I search for the system, it seems that it doesn't have the destination starport, or even uninhabited. ===&lt;br /&gt;
&lt;br /&gt;
As mentioned above, there could be multiple systems with the same name. Each mission states the coordinates (Sirius (1,0,-1) for example) of the destination system, and you can enter them into the search field on the sector map, to find the correct system.&lt;br /&gt;
&lt;br /&gt;
=== I end up &amp;quot;a big number&amp;quot; AU away from the star when I hyper jump to a system ===&lt;br /&gt;
&lt;br /&gt;
This happens in binary star systems. You can select the star you want to jump to from the [[Manual#System_info|System View]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Technical FAQ ==&lt;br /&gt;
&lt;br /&gt;
=== How/where do I report my bug/crash ===&lt;br /&gt;
&lt;br /&gt;
Bug reporting is the most important part where you as a player can help the community. When you encounter something that seems strange or odd in the game, please report it, preferably to our [https://github.com/pioneerspacesim/pioneer/issues issue tracker], but you can also stop by the [http://webchat.freenode.net/?channels=#pioneer IRC channel].&lt;br /&gt;
&lt;br /&gt;
When having problems with graphics, or pioneer not starting/crashing, please attach the files '''output.txt''' and '''opengl.txt''' from the pioneer [http://pioneerwiki.com/wiki/FAQ#Where_is_the_configuration_file.2C_saved_games.2C_screenshots.3F config folder] in your home folder / My Documents folder. If you didn't get the '''output.txt''' file, then make sure '''RedirectStdio=1''' in '''config.ini'''.&lt;br /&gt;
&lt;br /&gt;
It is important to include as much of the following information as possible in each issue report, much of this is available to use from the '''output.txt''' and '''opengl.txt''' but if you cannot attach them then please tell us:&lt;br /&gt;
&lt;br /&gt;
*The version of pioneer you are trying to run (''build date or ingame version number'') &lt;br /&gt;
*What operating system you are running, Windows XP/Vista/7/8/10, Linux (''what distribution''), OSX. &lt;br /&gt;
*Your computers system specifications - CPU / RAM / Graphics card. &lt;br /&gt;
*Whether you have downloaded it from our site, or if you are building it from the source code. &lt;br /&gt;
&lt;br /&gt;
=== Where is the configuration file, saved games, screenshots? ===&lt;br /&gt;
&lt;br /&gt;
*Windows: My Documents\Pioneer &lt;br /&gt;
*OS X: /Users/your_username/Library/Application Support/Pioneer &lt;br /&gt;
*Linux: /home/your_username/.pioneer &lt;br /&gt;
&lt;br /&gt;
=== Where is the Mac version? ===&lt;br /&gt;
&lt;br /&gt;
Pioneer's development team is mainly on Linux and Windows, and does currently not have the ability to build and maintain a Mac version. To build a Mac release we actually need access to a Mac machine, which, unfortunately, none of the developers currently have. If you have a Mac which can compile and upload pioneer for us on a regular basis, then please contact us (IRC).&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=== My OpenGL Version is below 3.1, &amp;quot;Pioneer cannot run on your graphics card&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
UPDATE: Pioneer dropped 2.1 support in September, 2018. You need to checkout and compile a version prior to this, and do:&lt;br /&gt;
&lt;br /&gt;
Open your pioneer configuration file, and set: &amp;quot;RendererName=Opengl 2.1&amp;quot;. This should allow pioneer to run, provided your hardware supports OpenGL 2.1, which it should if you were able to run Pioneer up until 2014-11-18 when support was dropped. Note, support for multiple renderers was added 2017-03-03, i.e. both OpenGL 2.1 and 3.1; however, you need to edit your configuration file to select the proper one, as no auto-detection is done. Actually, if your hardware isn't extraordinarily old, OpenGL 3.1 should be supported if you update your drivers.&lt;br /&gt;
&lt;br /&gt;
You can also find older versions (pre 20141119 on [http://www.moddb.com/games/pioneer/downloads moddb].&lt;br /&gt;
&lt;br /&gt;
=== Where do I find older versions of Pioneer ===&lt;br /&gt;
&lt;br /&gt;
You can find older versions starting from December 2014 (2014-12-05) on our [http://sourceforge.net/projects/pioneerspacesim/files sourceforge] page. 2014-11-18 was the last version supporting OpenGL 2, between 2014-11-19 to 2014-12-07 Pioneer required OpenGL 3.2. From 2014-12-08 only OpenGL 3.1 is required. Over at [http://www.moddb.com/games/pioneer/downloads moddb] they have windows version going further back in time.&lt;br /&gt;
&lt;br /&gt;
=== I'm getting graphical issues ===&lt;br /&gt;
&lt;br /&gt;
Such as wrong textures, ships missing from the view, text display glitches. '''Updating the display drivers usually solve these problems.'''&lt;br /&gt;
&lt;br /&gt;
These usually occur on older graphics adapters, or because of outdated GPU drivers. Not too old NVidia and ATI cards are usually enough to play the game, but integrated GPUs are usually not enough.&lt;br /&gt;
&lt;br /&gt;
=== I'm getting graphical issues, such as snow-like sky and transparent terrain ===&lt;br /&gt;
&lt;br /&gt;
This is probably caused by the eclipse shader which isn't supported by some open source graphic drivers. You could install the proprietary drivers, if available, or disable the eclipse effect by adding DisableEclipse=1 to your pioneer configuration file (config.ini).&lt;br /&gt;
&lt;br /&gt;
=== I see blank untextured Gas Giants and I'm using an ATI graphic card under GNU/Linux with open source drivers (Mesa R600) ===&lt;br /&gt;
&lt;br /&gt;
With chipsets using the R600 gallium drivers the shader fails to compile. There is a workaround that uses less noise octaves. This produces less detailed texture maps for the gas/ice giants but they still look good and at least the program runs.&lt;br /&gt;
&lt;br /&gt;
Try setting &amp;lt;code&amp;gt;AMD_MESA_HACKS=1&amp;lt;/code&amp;gt; in ~/.pioneer/config.ini or disable GPU jobs entirely by setting &amp;lt;code&amp;gt;EnableGpujobs=0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== I'm getting text rendering artefacts ===&lt;br /&gt;
&lt;br /&gt;
Some system monitoring HUD utilities, like MSI Afterburner, and Steam overlay&amp;amp;nbsp;can cause distorted text rendering. Try switching them off.&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=== The game freezes at the intro screen ===&lt;br /&gt;
&lt;br /&gt;
If you cannot start the game at all, edit the configuration file and change value DisableShaders to 1.&lt;br /&gt;
&lt;br /&gt;
=== The game crashes on start with an error message about imgui_draw.cpp ===&lt;br /&gt;
&lt;br /&gt;
Check if any parent folder of Pioneer has any accented letters (e.g éáűúóü etc.). If so, copy the game to somewhere, where there's none of these in the folder tree.&lt;br /&gt;
&lt;br /&gt;
=== The game crashes after the loading screen. I'm using ATI free drivers on GNU/Linux. ===&lt;br /&gt;
&lt;br /&gt;
If you are getting a GL_INVALID_ENUM in console, could be because some ships uses textures in a format that, because of patents, is not included in the main mesa package. Search for libtxc-dxtn or libtxc_dxtn in your distribution and install it.&lt;br /&gt;
&lt;br /&gt;
=== The game hangs when I turn on the ''Enable Cockpit (EXPERIMENTAL)'' option ===&lt;br /&gt;
&lt;br /&gt;
It's because it's an experimental feature right now, infrastructure mostly. You need a cockpit model for to be able to use it.&lt;br /&gt;
&lt;br /&gt;
You can find one heavily WIP one posted on the Community Forums. Note that it's a highly experimental feature right no, so please treat it accordingly.&lt;br /&gt;
&lt;br /&gt;
=== My joystick is &amp;quot;drifting&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
It's recommended that you calibrate your joystick using the OS facilities (Joystick Settings on Windows, jstest-gtk on linux) as this fixes 99% of all issues with incorrectly configured joysticks. However, if you want to adjust specific parameters for each joystick axis, support for customizable deadzone and sensitivity is available through the configuration file. Open config.ini and adjust the deadzone (DZ) and sensitivity exponent curve (CV) values of the corresponding axis to your liking.&lt;br /&gt;
&lt;br /&gt;
 ; example joystick configuration&lt;br /&gt;
 [Joystick.03000000a30600006404000000010000]&lt;br /&gt;
 Axis0=DZ0.0 CV1.0&lt;br /&gt;
 Axis1=DZ0.0 CV1.0&lt;br /&gt;
 Axis2=DZ0.0 CV1.0&lt;br /&gt;
 Axis3=DZ0.0 CV1.0&lt;br /&gt;
 Name=Saitek Cyborg USB Stick&lt;br /&gt;
&lt;br /&gt;
=== I'm getting poor performance ===&lt;br /&gt;
&lt;br /&gt;
The heaviest part of the game is planetary terrain generation. Turn down the &amp;quot;Detail distance&amp;quot; and &amp;quot;Fractal detail&amp;quot; settings, they have the most impact for performance. Reducing screen resolution is also recommended, this can be done in the [[Settings_Menu|Settings Menu]], or manually to a custom values by editing your personal configuration file, on Linux: &amp;lt;code&amp;gt;~/.pioneer/config.ini&amp;lt;/code&amp;gt;. On Windows: &amp;lt;code&amp;gt;Documents/pioneer/config.ini&amp;lt;/code&amp;gt; Look for &amp;lt;code&amp;gt;ScrHeight&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ScrWidth&amp;lt;/code&amp;gt; entries. Also consider reducing number of buildings in cities.&lt;br /&gt;
&lt;br /&gt;
=== I've enabled anti-aliasing in the config file, but it does not work ===&lt;br /&gt;
&lt;br /&gt;
Make sure the AA settings are not overridden by your graphics card settings, on NVidia AA should be set to &amp;quot;application controlled&amp;quot; mode.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=== Full screen mode is incorrectly scaled ===&lt;br /&gt;
&lt;br /&gt;
If you are on Windows, try:&lt;br /&gt;
&amp;lt;pre&amp;gt;Sounds like windows 7 desktop-scaling issues.&lt;br /&gt;
Try adding some compatability modes to the Pioneer.exe.&lt;br /&gt;
Right click it and Choose properties -&amp;gt; Compatability -&amp;gt; Tick&lt;br /&gt;
Disable desktop scaling, and Disable desktop composition.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
&lt;br /&gt;
=== What's the history of Pioneer ===&lt;br /&gt;
&lt;br /&gt;
The project started in 2008 by Tom Morton, and was [https://web.archive.org/web/20150326115725/http://spacesimcentral.com/ssc/topic/742-pioneer-new-gpl-frontier-elite-2-style-game/ announced in 2010] on the Space Sim Central forum (for space games), and on [https://forums.frontier.co.uk/threads/the-pioneer-thread.1596/ frontier forum]. For more history, see [http://www.rockpapershotgun.com/2011/12/06/back-to-frontier-pioneer/ Rock Paper Shotgun article], and [[Media_Coverage]]&lt;br /&gt;
&lt;br /&gt;
=== How much development is being made? ===&lt;br /&gt;
&lt;br /&gt;
Development is sporadic, but no month goes by without some change to the source, fixing bugs, cleaning up code, introducing new content and/or features; see [https://github.com/pioneerspacesim/pioneer/blob/master/Changelog.txt Changelog.txt]. All contributors work on pioneer for free when they have time and motivation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== What's the deal with the inconsistent UI interface? ===&lt;br /&gt;
Pioneer started as a pure Frontier clone in 2008, with UI closely matching that game, implemented in pure C++. This UI is referred to, by the developers, as &amp;quot;OldUI&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pioneer started transitioning to a &amp;quot;NewUI&amp;quot; defined in easy-to-change Lua files ([https://github.com/pioneerspacesim/pioneer/pull/2589 #2589], merged in 2013), that do not require recompilation, thus ideal for users to play around with, extend and ideally contribute any improvements back into the project.&lt;br /&gt;
&lt;br /&gt;
Due to lack of time, and coders, transition stalled, with SystemInfo being halfway there ([https://github.com/pioneerspacesim/pioneer/pull/3564 #3564]). At the time of writing this the SectorView (F2) and OrbitView (F6), and others are still defined in the old hard coded C++ source code.&lt;br /&gt;
&lt;br /&gt;
In the summer of 2016 work started to move Pioneer to a [https://github.com/ocornut/imgui dear-imgui] based UI, which developers call &amp;quot;PiGUI&amp;quot;, starting with a new, and vastly improved HUD, with instrumentation that should be familiar to players of Kerbal Spaceprogram, for manually executing orbit manoeuvres. Thus at this moment Pioneer had three UI systems at once: OldUI, NewUI and PiGui.&lt;br /&gt;
&lt;br /&gt;
Update 2021-01-01: We have now killed off NewUI completely, and much of OldUI: [https://github.com/pioneerspacesim/pioneer/pull/5032 #5032], in favour of PiGui, which is much easier to script in. Thus we could be said to only be using 1.1 UI systems.&lt;br /&gt;
&lt;br /&gt;
In the transition to PiGui, the galaxy (image) map (F8) was removed, since motivation in the dev team to purge the code base of NewUI right away was higher than to port it to PiGui, as it didn't have any real purpose for the game, other than as a fun gimmick. (The galaxy image is still used under the hood to compute star density in sectors)&lt;br /&gt;
&lt;br /&gt;
=== Do you accept contributions? ===&lt;br /&gt;
&lt;br /&gt;
Hell yes! Pioneer is not any one persons personal project. It is the sum of the contributions made by the people who play and care about the continued development of the game. See: [[How_you_can_contribute|How to contribute]].&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3956</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3956"/>
		<updated>2020-10-21T20:35:59Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Update THE LIST&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This will be a multi-step process:&lt;br /&gt;
** Implement some minor features using the ECS paradigm to get started and evaluate requirements. '''Working'''&lt;br /&gt;
** Drive the new ECS-based features from existing code as a temporary measure. '''Working'''&lt;br /&gt;
** Convert a major feature (Ship, BodyOnPlanet, etc) to use the ECS.&lt;br /&gt;
** Continue converting major features until all applicable areas of the code are converted.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are mostly finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
Planned Features:&lt;br /&gt;
* Modular, Lua-exposed input system '''WORKING'''&lt;br /&gt;
* Key-chord inputs, allowing arbitrary modifier keys / buttons. A software &amp;quot;pinkie switch&amp;quot; if you will. '''DONE'''&lt;br /&gt;
* Frame-based input grouping system, allowing multiple conflicting &amp;quot;modes&amp;quot; to be enabled or disabled en-bloc. '''DONE'''&lt;br /&gt;
* Touchscreen input for camera and flight controls. (Investigate: virtual joysticks or whole-screen mouse emulation?)&lt;br /&gt;
&lt;br /&gt;
==== Model System ====&lt;br /&gt;
The model system needs further work and refactoring. It currently bloats savefiles excessively, has a very limited API that ignores file paths, is a pain to build files for release builds, and cannot be multi-threaded.&lt;br /&gt;
&lt;br /&gt;
Planned Improvements:&lt;br /&gt;
* Don't store a list of transform visitors in savefiles; animations should be responsible for node positioning. Possibly use a dirty flag to only store nodes that have been explicitly positioned by code?&lt;br /&gt;
* Refactor all code and data that touches models to use full paths instead of just the basename component.&lt;br /&gt;
* Refactor model loading to make it asynchronous; run the load step on a separate thread, and add an end-of-frame task on the main thread to upload model data to GPU&lt;br /&gt;
* Allow ModelBody to cache collision objects. This will likely come hand in hand with not creating separate Model instances.&lt;br /&gt;
&lt;br /&gt;
==== Lua Engine ====&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax and implicit &amp;quot;init.lua&amp;quot; support. '''DONE'''&lt;br /&gt;
* Deprecate &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; in favor of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; to support languages that target Lua. '''DONE'''&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
Tangentially to the ECS changes, we need a better method of binding C++ code and data to Lua. Currently the hand-written method is serviceable, but it is akin to &amp;quot;implementing the same thing twice&amp;quot;, doubling the workload for anyone wanting to add something new.&lt;br /&gt;
* Add an automatic solution for binding C++ code to Lua, capable of auto-generating bindings for properties, methods, and POD-structs and full LuaObject classes. '''DONE''' (see LuaMetaType.h)&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
There are a ''huge'' number of new features and wild gameplay ideas that I and others would really like to see added to the game, but this is a more reasonable list of features that can actually be implemented with a few weeks of work.&lt;br /&gt;
&lt;br /&gt;
* Refactor the camera / view system to better support inputs, allow arbitrary spectator / debug cameras for editor mode, enable first-person and turret cameras. '''WORKING'''&lt;br /&gt;
** Add a &amp;quot;camera offset&amp;quot; axis for internal / cockpit view that can be hooked up to headtracking. '''DONE'''&lt;br /&gt;
** Make the existing camera system use the new InputFrames for input. '''DONE'''&lt;br /&gt;
** Decouple camera systems from the concept of a ship to make them suitable for debug/flying cameras. '''WORKING'''&lt;br /&gt;
** Add cameras for turrets.&lt;br /&gt;
* Completely rewrite the weapons systems to support arbitrary guns and turrets, as well as a better loadout system.&lt;br /&gt;
* Rework drag and atmospheric heating to be actually accurate. '''WORKING'''&lt;br /&gt;
* Implement atmospheric lift so aerodynamic ships can fly. '''DONE'''&lt;br /&gt;
* Add airframe damage due to excessive G-force and/or dynamic pressure when flying in atmosphere.&lt;br /&gt;
** Possibly damage specific components (landing gear, control surfaces, etc) reducing their effectiveness and/or destroying them.&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom, chromatic aberration, motion blur, and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
'''Clouds'''&lt;br /&gt;
&lt;br /&gt;
Possibly using a low-resolution voxelized implementation, atmospheric clouds are a planned feature. They'd need to support transparency, layer over each other without killing performance, and look at least moderately good. Flat clouds are also required when looking at a planet from orbit, which could be static textures or generated from a basic weather simulation for believable construction.&lt;br /&gt;
&lt;br /&gt;
''' Mesh Decals '''&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;br /&gt;
&lt;br /&gt;
* Finish modelling and texturing the Sador Heavy Fighter, including setting it up to use turrets and a new gun / missile system.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Using_git_and_GitHub&amp;diff=3951</id>
		<title>Using git and GitHub</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Using_git_and_GitHub&amp;diff=3951"/>
		<updated>2020-09-28T17:25:58Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: /* Fixing/Updating your pull request */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Developing on pioneer means using the version control tool 'git' and the [https://github.com/ github] website. git especially has a reputation for having a steep learning curve, so here we'll try to give you enough knowledge to be dangerous!&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
A working installation of git, a GitHub account, and comfort with using the command line of your chosen operating system.&lt;br /&gt;
&lt;br /&gt;
The GitHub sign-up page is [https://github.com/signup/free here]. Make a note of your user name as you'll need it to make your local pioneer repository.&lt;br /&gt;
&lt;br /&gt;
On Linux, git is available in all distributions using the standard tools such as APT, yum or emerge. Since there is a wide range of file browsers and graphical environments, this tutorial limits itself to the command line interface.&lt;br /&gt;
&lt;br /&gt;
On Windows you have two options, [http://msysgit.github.com/ Git for Windows] aka msysgit, or [http://windows.github.com/ Github for Windows] which is essentially msysgit but with some extra stuff bundled. Some of which is good ([https://github.com/dahlbyk/posh-git posh git]) and some of which is well, not (github's 'friendly' gui). Since both include the same command line tools and cross platform gui tools, either is fine for our purposes here. The github one may be more convenient to install.&lt;br /&gt;
&lt;br /&gt;
On Mac OS X, git will have been installed with XCode as git is built into the XCode IDE. However, usage of git from from within an IDE isn't something I'm familiar with so isn't covered here. If you want to follow along with this document then if you elected to install the XCode command line tools, then the git commands below should work unaltered from a terminal window. If you didn't then you'll need to use &amp;lt;code&amp;gt;xcrun&amp;lt;/code&amp;gt; to run the commands in terminal, either by adding &amp;lt;code&amp;gt;xcrun&amp;lt;/code&amp;gt; in front of each of the commands or aliasing &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;xcrun git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;xcrun gitk&amp;lt;/code&amp;gt; in your &amp;lt;code&amp;gt;~/.profile&amp;lt;/code&amp;gt;. Have a look at [http://www.cocoanetics.com/2012/07/you-dont-need-the-xcode-command-line-tools/ this guide] for details.&lt;br /&gt;
&lt;br /&gt;
A clear and concrete introduction to git can be seen at this [https://rogerdudler.github.io/git-guide/ Git Guide]&lt;br /&gt;
&lt;br /&gt;
=== Configure git to sane global settings ===&lt;br /&gt;
&lt;br /&gt;
First we need to [http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration configure] git some. You probably want to run these commands:&lt;br /&gt;
&lt;br /&gt;
   git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
   git config --global user.email &amp;quot;you@example.com&amp;quot;&lt;br /&gt;
   git config --global color.ui true&lt;br /&gt;
   git config --global push.default simple&lt;br /&gt;
&lt;br /&gt;
Note, that each commit you do will be stamped by your name and email entered here.&lt;br /&gt;
&lt;br /&gt;
Also, in our [[Coding Conventions]] we use 4 width tab indentation, but the &amp;quot;git diff&amp;quot; and &amp;quot;git show&amp;quot; tools assume 8 character wide tabs. This is fixed by:&lt;br /&gt;
&lt;br /&gt;
   git config --global core.pager 'less -x1,5'&lt;br /&gt;
&lt;br /&gt;
(the cryptic numbers are due to git using the first column for &amp;quot;+&amp;quot;/&amp;quot;-&amp;quot; to show inserted or removed lines)&lt;br /&gt;
&lt;br /&gt;
== Creating your pioneer repositories ==&lt;br /&gt;
&lt;br /&gt;
Git, as a version control system, stores all source files for Pioneer (or any other project you've chosen to manage with git) along with their histories in '''repositories''' (usually shortened to just 'repos'). These are areas of a computer's file system where has git has been told to track and manage changes to the files placed in them.&lt;br /&gt;
&lt;br /&gt;
There are three different repositories that you mainly deal with when developing pioneer.&lt;br /&gt;
&lt;br /&gt;
*The &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt; repo. This is the main Pioneer repository stored on GitHub. This is read-only except to the core team (and even they don't do their development there).&lt;br /&gt;
*The &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; repo. This is a public Pioneer repository personal to you, but stored on GitHub under your username, so other people can see the changes put into it. This is read-only to everyone except you.&lt;br /&gt;
*The &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; repo. This is your personal Pioneer repository on your computer, not accessible by anyone else.&lt;br /&gt;
&lt;br /&gt;
Before you can start developing you need to setup both your Pioneer &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; repositories.&lt;br /&gt;
&lt;br /&gt;
=== Your origin repository ===&lt;br /&gt;
&lt;br /&gt;
Your &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; repository you make on GitHub. To do that, make sure that you're logged in there and go to the main [https://github.com/pioneerspacesim/pioneer GitHub Pioneer page] in your web browser, and click the 'Fork' button at the top of that page: [[File:ForkPioneer.png|RTENOTITLE]]&lt;br /&gt;
&lt;br /&gt;
GitHub will clank and whirr as it makes a copy of the main Pioneer repo under your username. Eventually it will finish, and you'll end up on page almost exactly like the main GitHub Pioneer page, but instead of being named &amp;lt;code&amp;gt;pioneerspacesim/pioneer&amp;lt;/code&amp;gt; your copy is named &amp;lt;code&amp;gt;&amp;amp;lt;your github user name&amp;amp;gt;/pioneer&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Having made your &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; repo, you're now ready to make your local one.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Your local repository ===&lt;br /&gt;
&lt;br /&gt;
You make your &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; repository by cloning a copy of your new &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; repository to your local machine.&lt;br /&gt;
&lt;br /&gt;
At the command line, navigate to where on your filesystem you want to put your local git repos. For instance on Linux I put mine in &amp;lt;code&amp;gt;~/repos&amp;lt;/code&amp;gt; whilst on Windows I put them in &amp;lt;code&amp;gt;c:\develop\github-repos&amp;lt;/code&amp;gt;. You can move the folder at a later time without breaking anything. Once you're there execute the following command replacing &amp;lt;code&amp;gt;your github username&amp;lt;/code&amp;gt; with, well, your github username.&lt;br /&gt;
&lt;br /&gt;
 git clone [git://github.com/your https://github.com/your][https://github.com/your%20gituhub%20username/pioneer.git gituhub username/pioneer.git]&lt;br /&gt;
&lt;br /&gt;
Just like clicking Fork on the main Pioneer GitHub repo made a clone of it under your GitHub account, this makes a clone of that clone to your local machine. Expect this to take some time, just like before, as it copies all the files and the complete history of the project to your filesystem, only now it's sucking the data from GitHub to your machine, rather than copying things around within GitHub's data centre (so it will probably take even longer; however, a modern coputer does it on the order of minutes).&lt;br /&gt;
&lt;br /&gt;
Eventually this operation will complete, and you'll have a shiny new directory named &amp;lt;code&amp;gt;pioneer&amp;lt;/code&amp;gt; which git -- with a little encouragement -- will manage for you, your &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; repo.&lt;br /&gt;
&lt;br /&gt;
We're almost done with repository setup, but there is one more thing we need to attend to. When you did &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt;, it automatically set &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; to point to your Pioneer repository on GitHub. However it didn't set &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt; to point the main Pioneer Repository. We'll need to do that manually.&lt;br /&gt;
&lt;br /&gt;
We must to be inside the repository to do this, in fact all the git commands from now on, you need to be inside a repository to execute any of the git commands shown. So enter the pioneer repository directory, before doing:&lt;br /&gt;
&lt;br /&gt;
 git remote add upstream [git://github.com/pioneerspacesim/pioneer.git git://github.com/pioneerspacesim/pioneer.git]&lt;br /&gt;
&lt;br /&gt;
...to define &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt; as the main Pioneer repository. You'll notice you defined &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt; as a &amp;lt;code&amp;gt;remote&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; is also defined as a &amp;lt;code&amp;gt;remote&amp;lt;/code&amp;gt;. We'll explain more about remotes later on.&lt;br /&gt;
&lt;br /&gt;
You can now view the result of our commands, i.e. see how we link the &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; to your git repo, and upstream to the central pioneer repository.&lt;br /&gt;
&lt;br /&gt;
 git remote -v&lt;br /&gt;
&lt;br /&gt;
or for more details&lt;br /&gt;
&lt;br /&gt;
 git remote show origin&lt;br /&gt;
&lt;br /&gt;
== Basic operations ==&lt;br /&gt;
&lt;br /&gt;
At this point you might want to consider searching for tutorials. There are many good ones on git out there. If you're familiar with svn look [http://git.or.cz/course/svn.html here], and [http://marklodato.github.io/visual-git-guide/index-en.html this] is a nice visual representation of different commands, which might be helpful. Basic git tutorials on youtube: [https://www.youtube.com/watch?v=vaNGbk6HN9Y part 0], [https://www.youtube.com/watch?v=DQUcmNO4diQ part 1]. Below follows a few commands you will be using a lot, and be familiar with, but first make sure to delve into some tutorials. Git is a vast subject.&lt;br /&gt;
&lt;br /&gt;
Show documentation of command&lt;br /&gt;
&lt;br /&gt;
 git help &amp;lt;command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create branch...&lt;br /&gt;
&lt;br /&gt;
 git branch &amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...and move into it:&lt;br /&gt;
&lt;br /&gt;
 git checkout &amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or do both in one go&lt;br /&gt;
&lt;br /&gt;
 git checkout -b &amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check what files have been changed (red), and which have been staged for commit (green)&lt;br /&gt;
&lt;br /&gt;
 git status&lt;br /&gt;
&lt;br /&gt;
Add new or changed/modified file to be &amp;quot;staged&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 git add &amp;lt;file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and commit it (sometimes it's good to check &amp;quot;git status&amp;quot; first, to see what is staged)&lt;br /&gt;
&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
Or do it all in one go (this will not add new files, just changed, already tracked files)&lt;br /&gt;
&lt;br /&gt;
 git commit -a&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
 git commit -am &amp;quot;This is my commit message&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The two above commands (i.e. &amp;quot;git commit -a&amp;quot;) will commit all changes seen when running the highly useful&lt;br /&gt;
&lt;br /&gt;
 git diff&lt;br /&gt;
&lt;br /&gt;
=== Show information ===&lt;br /&gt;
&lt;br /&gt;
Investigating what you've done is always very useful, and instructive when learning git. To show your un-staged changes (changes not staged for commit)&lt;br /&gt;
&lt;br /&gt;
 git diff&lt;br /&gt;
&lt;br /&gt;
One of the most used commands might be to list the commit history&lt;br /&gt;
&lt;br /&gt;
 git log&lt;br /&gt;
 git log -p &amp;lt;file&amp;gt;&lt;br /&gt;
 git log --oneline --graph&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
 git show HEAD&lt;br /&gt;
 git show &amp;lt;commit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or N commits back in history&lt;br /&gt;
&lt;br /&gt;
 git show HEAD~&amp;lt;N&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List local branches&lt;br /&gt;
&lt;br /&gt;
 git branch&lt;br /&gt;
&lt;br /&gt;
List local branches, and show last commit on each&lt;br /&gt;
&lt;br /&gt;
 git branch -v&lt;br /&gt;
&lt;br /&gt;
List local and remote (origin) branches, and show last commit on each&lt;br /&gt;
&lt;br /&gt;
 git branch -va&lt;br /&gt;
&lt;br /&gt;
This is a nice graphical interface to git, that you might prefer&lt;br /&gt;
&lt;br /&gt;
 gitk&lt;br /&gt;
&lt;br /&gt;
=== Common fixes for mistakes ===&lt;br /&gt;
&lt;br /&gt;
Here we outline highly useful knowledge for fixing very common mistakes or situations you will find often yourself in.&lt;br /&gt;
&lt;br /&gt;
It's common to want to add/change or reword the last commit, simply &amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt; if any changes and&lt;br /&gt;
&lt;br /&gt;
 git commit --amend&lt;br /&gt;
&lt;br /&gt;
If you realize you did &amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt; on a file that should not be included in the commit you are about to do, then un-stage it by:&lt;br /&gt;
&lt;br /&gt;
 git reset HEAD&lt;br /&gt;
&lt;br /&gt;
If you need to undo a commit you have already made simply reset the branch to one step back&lt;br /&gt;
&lt;br /&gt;
 git reset HEAD~&lt;br /&gt;
&lt;br /&gt;
or equivalently&lt;br /&gt;
&lt;br /&gt;
 git reset HEAD~1&lt;br /&gt;
&lt;br /&gt;
These reset commands only operates on the git record, not removing any changed files from your hard drive.&lt;br /&gt;
&lt;br /&gt;
If you already pushed the old commit to &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; (your github), then you need to do a forced push&lt;br /&gt;
&lt;br /&gt;
 git push -f origin &lt;br /&gt;
&lt;br /&gt;
== Updating your branches ==&lt;br /&gt;
&lt;br /&gt;
Makes no changes on your local copy, but reads in what changes there are upstream. A safe command.&lt;br /&gt;
&lt;br /&gt;
 git fetch upstream&lt;br /&gt;
&lt;br /&gt;
Or read in changes in all branches, and &amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; to purge, i.e. remove the lingering memory of branches that have been removed in origin&lt;br /&gt;
&lt;br /&gt;
 git fetch --all -p&lt;br /&gt;
&lt;br /&gt;
Now we know what changes have been made to &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt;, i.e. Pioneer space sims's master branch. Now to apply them to your master&lt;br /&gt;
&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git merge upstream/master&lt;br /&gt;
&lt;br /&gt;
Which is the same as&lt;br /&gt;
&lt;br /&gt;
 git pull upstream master&lt;br /&gt;
&lt;br /&gt;
Now, your local master (on your HDD) is synced with upstream (Pioneer's), but you probably want to update your github, &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt;, master branch as well:&lt;br /&gt;
&lt;br /&gt;
 git push origin master&lt;br /&gt;
&lt;br /&gt;
=== Doing a hard reset ===&lt;br /&gt;
&lt;br /&gt;
If you feel you've messed up your master branch, and just want to &amp;quot;start over&amp;quot;, or get a clean copy from upstream Pioneer, you can do a hard reset. However, be ware that this is a dangerous command, as it will remove any changes on the branch it is run from and make it identical to whatever you reset it to.&lt;br /&gt;
&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git fetch --all&lt;br /&gt;
 git reset --hard upstream/hard&lt;br /&gt;
&lt;br /&gt;
or if you want to reset your branch &amp;lt;code&amp;gt;my-branch&amp;lt;/code&amp;gt; to how it looks in your github&lt;br /&gt;
&lt;br /&gt;
 git reset --hard origin/my-branch&lt;br /&gt;
&lt;br /&gt;
Next, since a hard reset completely rewrites the commit history, when you push your updated master (or whatever branch), to origin, it might say that the two branches have conflicting history, thus you need to force push your fresh copy&lt;br /&gt;
&lt;br /&gt;
 git push -f origin master&lt;br /&gt;
&lt;br /&gt;
== Pushing branch (smart way) ==&lt;br /&gt;
&lt;br /&gt;
Normally to push your commit to your github, you might do:&lt;br /&gt;
&lt;br /&gt;
 git push origin &amp;lt;branch name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, it would be nice if your branch on your local git (on your HDD) and your origin (your github) know about each other, that they are the same. Luckily git allows this, by &amp;quot;tracking&amp;quot; the branch thus, typically the first time you push commits in your local branch to github you tell github to track it&lt;br /&gt;
&lt;br /&gt;
 git push --set-upstream origin &amp;lt;branch name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or shorter&lt;br /&gt;
&lt;br /&gt;
 git push origin &amp;lt;branch name&amp;gt; -u&lt;br /&gt;
&lt;br /&gt;
Now, whenever you do the following commands from a tracked branch&lt;br /&gt;
&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
 git pull&lt;br /&gt;
&lt;br /&gt;
it will be from your local &amp;amp;lt;branch-foo&amp;amp;gt; to its remote copy on origin (github). Also, git will show which branch is ahead of which&lt;br /&gt;
&lt;br /&gt;
 git branch -vva&lt;br /&gt;
&lt;br /&gt;
== Resolving Conflicts ==&lt;br /&gt;
&lt;br /&gt;
Conflicts happen when git tries to apply a commit and that commit changes code on the same or neighboring lines of code as some other commit that it's trying to merge with. Typically this can happen when issuing commands such as &amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rebase&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt;. Once you get the hang of it, they're easy to resolve. Just read the error message git spits out, and run&lt;br /&gt;
&lt;br /&gt;
 git status&lt;br /&gt;
&lt;br /&gt;
It will show some files that need to be manually edited. In the file it will show both versions of the lines conflicting. Edit the file to the way it should be then &amp;lt;code&amp;gt;git add &amp;amp;lt;file&amp;amp;gt;&amp;lt;/code&amp;gt; and then &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Making a pull request ==&lt;br /&gt;
&lt;br /&gt;
Make a branch, push it to your Github repository, and you will get a &amp;quot;Compare / Open Pull Request&amp;quot; button when viewing your branch on your Github account if logged in. Press it, and write a description of the changes you've made. Mention what improves by the changes made in the pull request. (For more, see github documentat [https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork here]).&lt;br /&gt;
&lt;br /&gt;
== Fixing/Updating your pull request ==&lt;br /&gt;
&lt;br /&gt;
This addresses the case where you have opened a pull request on Github, only to realize (by yourself, or through a reviewer giving feedback) that you need to change something. Conveniently, Github tracks your branch so any change to it will also update the commits in your pull request.&lt;br /&gt;
&lt;br /&gt;
For example, you make some new change to your branch, add and commit them:&lt;br /&gt;
&lt;br /&gt;
 git commit -am &amp;quot;this is an additional commit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Then just push it to your branch:&lt;br /&gt;
&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
(Note: this assumes your local branch is set up to track your Github branch)&lt;br /&gt;
&lt;br /&gt;
However, doing it like this is only recommended if the new commit actually adds something new to the branch, where it is logical to have it as a separate commit. If it is a bug fix for a previous commit in the same pull request, there is no need for us to see it in the master branch of pioneer once it is merged. Thus the following two subsections describe how to fix the commit log / history.&lt;br /&gt;
&lt;br /&gt;
=== Update / change last commit ===&lt;br /&gt;
&lt;br /&gt;
The first case is the simplest: if you just want to change the last commit in your branch, because you realized some file was missing, or needed an edit.&lt;br /&gt;
&lt;br /&gt;
Make your change, then run &amp;quot;git add&amp;quot; on the changed files. Now update the last commit by:&lt;br /&gt;
&lt;br /&gt;
 git add &amp;lt;changed_file&amp;gt;&lt;br /&gt;
 git commit --amend&lt;br /&gt;
&lt;br /&gt;
And push to your Github, but since the hash id of the last commit has changed, you need to force it&lt;br /&gt;
&lt;br /&gt;
 git push -f&lt;br /&gt;
&lt;br /&gt;
Done. &lt;br /&gt;
&lt;br /&gt;
Note this also lets you reword the commit message.&lt;br /&gt;
&lt;br /&gt;
=== Update / change commit in middle of the branch of the pull request ===&lt;br /&gt;
&lt;br /&gt;
The second case covers if you need to edit commits further back in the commit history, or change order of commits or any other change.&lt;br /&gt;
&lt;br /&gt;
The example case we use here has a git log looking like so:&lt;br /&gt;
&lt;br /&gt;
 git log --oneline&lt;br /&gt;
 dd34lqe added final feature D&lt;br /&gt;
 cc5369b added third feature C&lt;br /&gt;
 bb1ed97 added second feature B&lt;br /&gt;
 a528f11 added initial feature A&lt;br /&gt;
&lt;br /&gt;
Now you want to fix a bug in your second commit for feature &amp;quot;B&amp;quot;. Make your changes in your local branch, add them and commit. Your structure will now look like:&lt;br /&gt;
&lt;br /&gt;
 git log --oneline&lt;br /&gt;
 98a9832 my bugfix for feature B&lt;br /&gt;
 dd34lqe added final feature D&lt;br /&gt;
 cc5369b added third feature C&lt;br /&gt;
 bb1ed97 added second feature B&lt;br /&gt;
 a528f11 added initial feature A&lt;br /&gt;
&lt;br /&gt;
The bug fix commit is redundant to see in the git log once in master, so we want to merge the bug fix commit with &amp;quot;bb1ed97 my second feature B&amp;quot; commit, so that ''no one will ever know there was a bug in the first place''! You do this by &amp;quot;rebasing&amp;quot; your branch.&lt;br /&gt;
&lt;br /&gt;
 git rebase -i a528f11&lt;br /&gt;
&lt;br /&gt;
This opens the rebase dialogue in your default editor for git (usually vim, emacs, or nano). It will show you the git history for all commits after (i.e. excluding) the commit a528f11 (&amp;quot;added initial feature A&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
You will see in the editor something like this (don't be confused by the reverse order compared to git log command):&lt;br /&gt;
&lt;br /&gt;
 pick bb1ed97 added second feature B &lt;br /&gt;
 pick cc5369b added third feature C  &lt;br /&gt;
 pick dd34lqe added final feature D  &lt;br /&gt;
 pick 98a9832 my bugfix for feature B&lt;br /&gt;
 &lt;br /&gt;
 # Commands:&lt;br /&gt;
 #  p, pick = use commit&lt;br /&gt;
 #  r, reword = use commit, but edit the commit message&lt;br /&gt;
 #  e, edit = use commit, but stop for amending&lt;br /&gt;
 #  s, squash = use commit, but meld into previous commit&lt;br /&gt;
 #  f, fixup = like &amp;quot;squash&amp;quot;, but discard this commit's log message&lt;br /&gt;
 #  x, exec = run command (the rest of the line) using shell&lt;br /&gt;
 #&lt;br /&gt;
 # These lines can be re-ordered; they are executed from top to bottom.&lt;br /&gt;
 #&lt;br /&gt;
 # If you remove a line here THAT COMMIT WILL BE LOST.&lt;br /&gt;
 #&lt;br /&gt;
 # However, if you remove everything, the rebase will be aborted.&lt;br /&gt;
 #&lt;br /&gt;
 # Note that empty commits are commented out&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Now just move the last line to be just below the commit we want it to fix, and mark it as a &amp;quot;fixup&amp;quot;, which will merge it into the commit above it, and use its commit message:&lt;br /&gt;
&lt;br /&gt;
 pick bb1ed97 added second feature B &lt;br /&gt;
 fixup 98a9832 my bugfix for feature B&lt;br /&gt;
 pick cc5369b added third feature C  &lt;br /&gt;
 pick dd34lqe added final feature D  &lt;br /&gt;
&lt;br /&gt;
Save, and quit, and hopefully git will report that the rebase was successful, and your git history will now be clean, but the commit hash (and code) for the &amp;quot;B feature&amp;quot; has changed, thus we need to force push the change to Github.&lt;br /&gt;
&lt;br /&gt;
 git log --oneline&lt;br /&gt;
 dd34lqe added final feature D&lt;br /&gt;
 cc5369b added third feature C&lt;br /&gt;
 qq9860d added second feature B&lt;br /&gt;
 a528f11 added initial feature A&lt;br /&gt;
&lt;br /&gt;
 git push -f&lt;br /&gt;
&lt;br /&gt;
(again assuming your local branch is tracking the Github repo)&lt;br /&gt;
&lt;br /&gt;
=== Resolving Merge Conflicts ===&lt;br /&gt;
&lt;br /&gt;
Sometimes while you're working on a Pull Request other code will be merged into master that touches a file you've been working on. 90% of the time there's nothing you need to do, but occasionally git can't simply resolve the two changes and you'll need to manually update your code.&lt;br /&gt;
&lt;br /&gt;
The easiest way to update your branch with the changes from master is called a &amp;quot;merge commit&amp;quot;, where you merge in the changes from master to your local branch. '''DON'T DO THIS'''. It creates a messy history and makes it extremely difficult to review your pull request, as there's now two copies of those changes to the master branch.&lt;br /&gt;
&lt;br /&gt;
Instead, please run a git rebase on your local branch to keep the pull request changes small and ensure it can be easily merged:&lt;br /&gt;
&lt;br /&gt;
 git fetch upstream master&lt;br /&gt;
 git rebase -i master&lt;br /&gt;
&lt;br /&gt;
== Getting other developer's branches ==&lt;br /&gt;
&lt;br /&gt;
If you want to get a copy of a branch from another developer, be that to test it, or to &amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt; (covered elsewhere) commits into your own branch.&lt;br /&gt;
&lt;br /&gt;
First make a branch from your master, and jump into it. It can be named whatever.&lt;br /&gt;
&lt;br /&gt;
 git checkout -b &amp;lt;branch-name&amp;gt; master&lt;br /&gt;
&lt;br /&gt;
Now pull the code in from the developer's branch named &amp;lt;code&amp;gt;&amp;amp;lt;dev-branch&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 git pull https://github.com/&amp;lt;developer-user-name&amp;gt;/pioneer.git &amp;lt;dev-branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it's a developer you will often want to pull code from you can add him/her to your remote, just like you did with your own github &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; and Pioneer's &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 git remote -v&lt;br /&gt;
&lt;br /&gt;
add a new one, named &amp;lt;code&amp;gt;&amp;amp;lt;remote&amp;amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 git remote add &amp;lt;remote&amp;gt; &amp;lt;url&amp;gt;&lt;br /&gt;
 git remote update&lt;br /&gt;
 git checkout -b &amp;lt;branch-name&amp;gt; --track &amp;lt;remote&amp;gt;/&amp;lt;remote-branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Keeping things tidy ==&lt;br /&gt;
&lt;br /&gt;
If branch is merged into master then it can safely be deleted&lt;br /&gt;
&lt;br /&gt;
 git branch -d &amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If branch is not in master, then a force remove can be made&lt;br /&gt;
&lt;br /&gt;
 git branch -D &amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 git push origin&amp;amp;nbsp;:&amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 git clean -n&lt;br /&gt;
&lt;br /&gt;
 git clean -f&lt;br /&gt;
&lt;br /&gt;
== Cherry picking ==&lt;br /&gt;
&lt;br /&gt;
If wanting a commit from someone else, e.g. to add to your own branch, you can pull down their branch to your machine, then from the branch you want it to, just do:&lt;br /&gt;
&lt;br /&gt;
 git cherry-pick &amp;lt;commit-hash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To actually do the &amp;quot;pulling down&amp;quot; of their branch to your machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;git remote add dev-username git://path/to/dev-username/repo.git&lt;br /&gt;
git fetch dev-username&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might also be inetersted in following future changes in dev-username's branch:&lt;br /&gt;
&amp;lt;pre&amp;gt;git checkout --track dev-username/foo&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, another useful tool, for those graphically inclined is:&lt;br /&gt;
&lt;br /&gt;
 gitk&lt;br /&gt;
&lt;br /&gt;
'''Warning''': cherry picking, although sometimes useful, can cause problems for other developers if you use them on commits that have already been published to github. Be careful and give sufficient warnings if you find you needing to use them in that situation.&lt;br /&gt;
&lt;br /&gt;
== Pushing to upstream Pioneer master ==&lt;br /&gt;
&lt;br /&gt;
So you have working knowledge of git, and have been deemed not (too) crazy to be given commit access to the pioneer source? Welcome! As this means you can merge your own -- and others -- code into pioneer master, there are a few things you might want to know.&lt;br /&gt;
&lt;br /&gt;
=== Guidelines for merge etiquette ===&lt;br /&gt;
&lt;br /&gt;
The power to merge code on to a common code base requires mutual respect among the developers, and [https://en.wikipedia.org/wiki/Fingerspitzengefühl fingerspitzengefühl] based on the knowledge they have of each other, such as what their typical response time is, and where their area of expertise, and (code) interest/disinterests lies. If these principles were put into writing they might look something like the following:&lt;br /&gt;
&lt;br /&gt;
*You still need to open pull requests (PR), and hold them open long enough for other developers to have a fair chance to have time to voice their opinion, and possibly/occasionally review it. Don't count on the latter though, you're responsible for what you break, and you are now expected to review your own code.&lt;br /&gt;
&lt;br /&gt;
*An instant merge of a PR can be done from time to time when the change is trivial, and obviously &amp;quot;good&amp;quot;, and/or working on code that is &amp;quot;your private realm&amp;quot; of the pioneer source, and/or when you or other person needs a feature in master as soon as possible, for the next build.&lt;br /&gt;
&lt;br /&gt;
*Also, you may push a commit directly to master, with no PR, if the change is ''very'' trivial one-liner, for instance fixing a very silly error in just merged code.&lt;br /&gt;
&lt;br /&gt;
*You may ''not'' ever do a forced push to pioneer master.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to merge a PR the proper/pedantic way ===&lt;br /&gt;
&lt;br /&gt;
For those with push access to https://github.com/pioneerspacesim/pioneer this is one way to push code to master. First make sure you have a resonable setup:&lt;br /&gt;
&lt;br /&gt;
 git remote -v&lt;br /&gt;
  origin	https://github.com/myusername/pioneer.git (fetch)&lt;br /&gt;
  origin	https://github.com/myusername/pioneer.git (push)&lt;br /&gt;
  upstream	https://github.com/pioneerspacesim/pioneer.git (fetch)&lt;br /&gt;
  upstream	https://github.com/pioneerspacesim/pioneer.git (push)&lt;br /&gt;
&lt;br /&gt;
Also, it might be a god idea to clean your master branch, so you know it is identical to pioneer upstream, but do be warned, this will wipe your master branch, thus if you have commits that are not in their own branches, they will be lost (but retrievable through git reflog):&lt;br /&gt;
&lt;br /&gt;
  git checkout master&lt;br /&gt;
  git reset --hard upstream/master&lt;br /&gt;
&lt;br /&gt;
(For future merges, a simple git pull will suffice, if you've kept your master branch clean)&lt;br /&gt;
&lt;br /&gt;
Now get the branch from the contributor to your computer, by creating an aptly named branch, and then pulling the code from the contributor to this branch.&lt;br /&gt;
&lt;br /&gt;
 git checkout -b name_of_branch_to_create&lt;br /&gt;
 git pull https://github.com/contributor_username/pioneer.git name_of_branch_user_has&lt;br /&gt;
&lt;br /&gt;
Now switch to your master, and merge it in, here we asume the branch you created was called &amp;quot;feature_branch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git merge --no-commit --no-ff feature_branch&lt;br /&gt;
&lt;br /&gt;
Document changes to Changelog.txt, then add it, so from the pioneer root folder, the path to Changelog wold just be:&lt;br /&gt;
&lt;br /&gt;
 git add Changelog.txt&lt;br /&gt;
 git commit &lt;br /&gt;
&lt;br /&gt;
This has now included the Changelog edit into the merge commit. Now do a dry run:&lt;br /&gt;
&lt;br /&gt;
 git push upstream master --dry-run&lt;br /&gt;
&lt;br /&gt;
Check that the right commits will be pushed with&lt;br /&gt;
&lt;br /&gt;
 git log&lt;br /&gt;
&lt;br /&gt;
And let us do it for real this time:&lt;br /&gt;
&lt;br /&gt;
 git push upstream master&lt;br /&gt;
&lt;br /&gt;
Please note: NEVER do a force push to pioneer master!&lt;br /&gt;
&lt;br /&gt;
== Advanced ==&lt;br /&gt;
&lt;br /&gt;
Collecting some advanced tricks for developers&lt;br /&gt;
&lt;br /&gt;
=== Push commit to someones PR ===&lt;br /&gt;
&lt;br /&gt;
If you have push access to pioneer repo, then you also have push access to other contributor's pull requests.&lt;br /&gt;
&lt;br /&gt;
Get the user's PR into a branch as usual:&lt;br /&gt;
&lt;br /&gt;
  git checkout -b some_user-feature_branch master&lt;br /&gt;
  git pull https://github.com/some_user/pioneer.git feature_branch&lt;br /&gt;
&lt;br /&gt;
make your changes, now push:&lt;br /&gt;
&lt;br /&gt;
  git push https://github.com/some_user/pioneer.git some_user-feature_branch:feature_branch&lt;br /&gt;
&lt;br /&gt;
=== PR trick ===&lt;br /&gt;
&lt;br /&gt;
For developers, or anyone interested, this trick will pull down all the pull requests from github, so you can easily switch to pull request, say, #1234 by doing&lt;br /&gt;
&lt;br /&gt;
  git checkout refs/pull/upstream/1234&lt;br /&gt;
&lt;br /&gt;
=== Be a git pedantic? ===&lt;br /&gt;
Writing good [https://github.com/RomuloOliveira/commit-messages-guide commit messages], and being pedantic has its values.&lt;br /&gt;
&lt;br /&gt;
== Links and resources ==&lt;br /&gt;
* [https://github.com/k88hudson/git-flight-rules git-flight-rules] Lots of examples, and links to further resources&lt;br /&gt;
* [https://ohshitgit.com/ Oh shit, git!] Fixing common mistakes in git&lt;br /&gt;
* [https://git-rebase.io/ git rebase in depth] Good guide on how to clean up/fix your git commit history&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Code_style&amp;diff=3911</id>
		<title>Code style</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Code_style&amp;diff=3911"/>
		<updated>2020-05-11T02:46:11Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Remove obsolete Code Style page (merged with Coding Conventions)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Coding Conventions]]&lt;br /&gt;
&lt;br /&gt;
This page has been merged with [[Coding Conventions]].&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Commit_access&amp;diff=3910</id>
		<title>Commit access</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Commit_access&amp;diff=3910"/>
		<updated>2020-05-11T02:43:19Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is commit access? ==&lt;br /&gt;
&lt;br /&gt;
Having commit access means you have the ability to push code directly to the main Pioneer repository.&lt;br /&gt;
&lt;br /&gt;
== How do I get commit access? ==&lt;br /&gt;
&lt;br /&gt;
Usually, just by asking. If you're known to the other committers to be someone who can be trusted to be a good steward of the project (usually shown by the quality of previous contributions) then you'll be given access to push to the repository. This is deliberately a subjective measure, but rest assured, the bar is set pretty low. Its mostly just a check to make sure you aren't going to do something stupid.&lt;br /&gt;
&lt;br /&gt;
In some circumstances you might be offered commit access. The same bar is set there. It usually happens when the other committers finds themselves thinking &amp;quot;this person would be a good committer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== What do I need to know when pushing? ==&lt;br /&gt;
&lt;br /&gt;
There's a few things that are special to the way we work that you need to know about.&lt;br /&gt;
&lt;br /&gt;
=== Code style ===&lt;br /&gt;
&lt;br /&gt;
We have a [[Coding Conventions]] style guide. Learn it, love it. There's almost certainly something in there you'll hate, because we all have different opions on code style. Don't argue, just use it - its what we've got!&lt;br /&gt;
&lt;br /&gt;
=== Code review ===&lt;br /&gt;
&lt;br /&gt;
Read the page about the [[Code_review|code review process]]. You're expected to be reviewing your own code according to the guildlines set out there, and you're encouraged to find another person to review your code if its particularly large or complex. Read that page for more info about that.&lt;br /&gt;
&lt;br /&gt;
There is no obligation for commiters to review other people's work, but it would be very helpful if you could. If everyone is involved, then the total workload on any individual remains small, giving everyone time to work on their code.&lt;br /&gt;
&lt;br /&gt;
=== Update the changelog ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/pioneerspacesim/pioneer/blob/master/Changelog.txt Changelog.txt] is where we track the history of the project. Each time you make a change, add a brief description of it to the Changelog. Include the Github issue or pull request number if it has one. The description should be something that is understandable by players. Choose an appropriate category, start a new month header at the start of the month, and preserve the existing formatting. Have a look through the history to get a feel for how it works.&lt;br /&gt;
&lt;br /&gt;
=== Don't break the build ===&lt;br /&gt;
&lt;br /&gt;
Pioneer is regularly built by an autobuild script, sometimes as often as once per day. This is done using the Makefile/autotools system (all platforms). You must take care to ensure that everything that lands on the master branch builds correctly with the autotools/GCC build. This could be a problem for Windows-based developers using MSVC; please do the best you can and ask for help if you need it.&lt;br /&gt;
&lt;br /&gt;
=== Don't change existing git history ===&lt;br /&gt;
&lt;br /&gt;
Once a commit is in the master repository, it must stay there: You must never force-push. That means, never use the -f or --force switch to the 'git push' command when you're pushing to the pioneerspacesim repository. If you're getting an error when you push, ask for help, because forcing things is a guaranteed way to break the repository for everyone.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Code_review&amp;diff=3909</id>
		<title>Code review</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Code_review&amp;diff=3909"/>
		<updated>2020-05-11T02:42:57Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Why do code review? ==&lt;br /&gt;
&lt;br /&gt;
Code review is simply getting someone to check your code before you it gets included in the Pioneer code proper to make sure that the code is of a good quality, is consistent with the rest of the codebase and takes Pioneer in the direction that the community wants it to go.&lt;br /&gt;
&lt;br /&gt;
== When does it happen? ==&lt;br /&gt;
&lt;br /&gt;
Code review can happen at any time, whenever you like. For small items of work it will get at least one review when it is submitted for inclusion (via a pull request). For a large development you may wish to find to someone to review your code periodically, to make sure you're on the right track. If you're starting to feel a bit unsure about what you're doing, that's probably a good time to ask someone!&lt;br /&gt;
&lt;br /&gt;
You don't have to do this of course, but be aware that the reviewers don't particularly being asked to review hundreds or thousands of lines of code changes that appear out of nowhere. You face a good chance of having your code rejected outright or ignored completely, and that sucks. So if you're going to do something massive, at least check in at the start to make sure someone knows about it.&lt;br /&gt;
&lt;br /&gt;
== Who can review code? ==&lt;br /&gt;
&lt;br /&gt;
Anyone that wants to! Anyone can use the review tools on Github to read and comment on code while its under development or test pull requests.&lt;br /&gt;
&lt;br /&gt;
In the case of a pull request, someone with commit access needs to do the final sign-off (typically, but not necessarily, at the same time as merging).  If you don't have commit access you can still help make life easier for that person by leaving comments and working with the original submitter.&lt;br /&gt;
&lt;br /&gt;
== I have commit access, does my code need to be reviewed? ==&lt;br /&gt;
&lt;br /&gt;
No, you have commit access for a reason - you've proven that you can be trusted to be a good steward for the project. You should feel free to change whatever you want or need to, but as you do you should be considering all the points normally covered by a review. Self-review, if you like.&lt;br /&gt;
&lt;br /&gt;
That said, no person is an island. Be sure to ask for help if you need it, even if its just a feeling that something isn't right.&lt;br /&gt;
&lt;br /&gt;
== What gets reviewed? ==&lt;br /&gt;
&lt;br /&gt;
Every single change is a candidate for review, no matter how small. Most review will happen in a pull request, but you can be reviewing code by reading the commit history or even by reading code as you're working on it.&lt;br /&gt;
&lt;br /&gt;
Here are some good things to look out for:&lt;br /&gt;
&lt;br /&gt;
* Bugs, logical errors, mathematical errors, typos (any simple, isolated code error). These are easy. If you find a bug during testing or by looking at the code, either fix it or tell the submitter to fix it. It's easy because everyone agrees that bugs need to be fixed.&lt;br /&gt;
&lt;br /&gt;
* Uncertainty about some code logic or behaviour (&amp;quot;Is this maths right?&amp;quot; &amp;quot;Did the submitter intend this weird behaviour?&amp;quot;). These are easy: Ask the submitter (obviously). Explanatory comments are usually the &amp;quot;fix&amp;quot; here.&lt;br /&gt;
&lt;br /&gt;
* Code style errors (braces, whitespace, naming conventions, etc). Same as bugs: fix it, or tell the submitter fix it. Not everyone agrees about the importance of code style, or perhaps even what style we should be using (particularly since the existing codebase is not totally consistent), but we have a [[Coding Conventions]] guide and we want everything to conform to it. If there is some aspect of style not covered by the code style guide on the wiki, amend the guide and tell the submitter to fix their style. Yes, style is subjective, and it's not the submitter's fault that they didn't use the &amp;quot;correct&amp;quot; style, since it may not have been clear what was the &amp;quot;correct&amp;quot; style when they made the PR, but its not worth arguing about - the time and energy to discuss it costs more than just fixing the code.&lt;br /&gt;
&lt;br /&gt;
* Messy git history. Fix it or ignore it. The trouble with telling the submitter to fix it is that many of our contributors don't have enough confidence wth git to do it right and the ones that do tend not to submit messy histories in the first place. So its not worth arguing about.  Just do the best you can to keep your own history tidy, but if its not working out don't stress too much about. If you really need help, talk to someone that can drive Git well; they can help you out.&lt;br /&gt;
&lt;br /&gt;
* Game design uncertainty (&amp;quot;Do we want this feature?&amp;quot;, &amp;quot;Do we want it to behave this way?&amp;quot;). For the most part you should choose what you think is best. You should be paying attention to what the other developers and the players are asking for and be aware of what other developments are happening, and from there be able to make a reasonable decision. If you don't know, ask someone who does. But remember that you should not reject an idea simply because you prefer it a different way. Of course your opinion matters, but try to balance everyone's needs as much as possible. (This is hard. Please ask for help).&lt;br /&gt;
&lt;br /&gt;
* Code structure problems (&amp;quot;We want the feature, but not implemented like this&amp;quot;). Structural problems can take a significant effort to fix and they make future code maintenance harder. They're the ones that often end up needing to be ripped out or rewritten later. The difficulty is that its often a ridiculous amount of effort to do something the &amp;quot;right&amp;quot; way, especially if it relates to a very old piece of code. The rule of thumb then is to permit mess if its necessary, but do the best you can to keep it contained. Remember that you're now adding to the cleanup work that someone else will have to do in the future.&lt;br /&gt;
&lt;br /&gt;
== Merging looks hard, do I have to? ==&lt;br /&gt;
&lt;br /&gt;
No. You can still review code without having to do the merge yourself. If you're not confident enough with git to do the merge properly, please ask someone who can. Mention that your code review is done and you're happy with it and they will merge it without any fuss.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Using_git_and_GitHub&amp;diff=3908</id>
		<title>Using git and GitHub</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Using_git_and_GitHub&amp;diff=3908"/>
		<updated>2020-05-11T02:42:29Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Update links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Developing on pioneer means using the version control tool 'git' and the [https://github.com/ github] website. git especially has a reputation for having a steep learning curve, so here we'll try to give you enough knowledge to be dangerous!&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
A working installation of git, a GitHub account, and comfort with using the command line of your chosen operating system.&lt;br /&gt;
&lt;br /&gt;
The GitHub sign-up page is [https://github.com/signup/free here]. Make a note of your user name as you'll need it to make your local pioneer repository.&lt;br /&gt;
&lt;br /&gt;
On Linux, git is available in all distributions using the standard tools such as APT, yum or emerge. Since there is a wide range of file browsers and graphical environments, this tutorial limits itself to the command line interface.&lt;br /&gt;
&lt;br /&gt;
On Windows you have two options, [http://msysgit.github.com/ Git for Windows] aka msysgit, or [http://windows.github.com/ Github for Windows] which is essentially msysgit but with some extra stuff bundled. Some of which is good ([https://github.com/dahlbyk/posh-git posh git]) and some of which is well, not (github's 'friendly' gui). Since both include the same command line tools and cross platform gui tools, either is fine for our purposes here. The github one may be more convenient to install.&lt;br /&gt;
&lt;br /&gt;
On Mac OS X, git will have been installed with XCode as git is built into the XCode IDE. However, usage of git from from within an IDE isn't something I'm familiar with so isn't covered here. If you want to follow along with this document then if you elected to install the XCode command line tools, then the git commands below should work unaltered from a terminal window. If you didn't then you'll need to use &amp;lt;code&amp;gt;xcrun&amp;lt;/code&amp;gt; to run the commands in terminal, either by adding &amp;lt;code&amp;gt;xcrun&amp;lt;/code&amp;gt; in front of each of the commands or aliasing &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;xcrun git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;xcrun gitk&amp;lt;/code&amp;gt; in your &amp;lt;code&amp;gt;~/.profile&amp;lt;/code&amp;gt;. Have a look at [http://www.cocoanetics.com/2012/07/you-dont-need-the-xcode-command-line-tools/ this guide] for details.&lt;br /&gt;
&lt;br /&gt;
A clear and concrete introduction to git can be seen at this [https://rogerdudler.github.io/git-guide/ Git Guide]&lt;br /&gt;
&lt;br /&gt;
=== Configure git to sane global settings ===&lt;br /&gt;
&lt;br /&gt;
First we need to [http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration configure] git some. You probably want to run these commands:&lt;br /&gt;
&lt;br /&gt;
   git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
   git config --global user.email &amp;quot;you@example.com&amp;quot;&lt;br /&gt;
   git config --global color.ui true&lt;br /&gt;
   git config --global push.default simple&lt;br /&gt;
&lt;br /&gt;
Note, that each commit you do will be stamped by your name and email entered here.&lt;br /&gt;
&lt;br /&gt;
Also, in our [[Coding Conventions]] we use 4 width tab indentation, but the &amp;quot;git diff&amp;quot; and &amp;quot;git show&amp;quot; tools assume 8 character wide tabs. This is fixed by:&lt;br /&gt;
&lt;br /&gt;
   git config --global core.pager 'less -x1,5'&lt;br /&gt;
&lt;br /&gt;
(the cryptic numbers are due to git using the first column for &amp;quot;+&amp;quot;/&amp;quot;-&amp;quot; to show inserted or removed lines)&lt;br /&gt;
&lt;br /&gt;
== Creating your pioneer repositories ==&lt;br /&gt;
&lt;br /&gt;
Git, as a version control system, stores all source files for Pioneer (or any other project you've chosen to manage with git) along with their histories in '''repositories''' (usually shortened to just 'repos'). These are areas of a computer's file system where has git has been told to track and manage changes to the files placed in them.&lt;br /&gt;
&lt;br /&gt;
There are three different repositories that you mainly deal with when developing pioneer.&lt;br /&gt;
&lt;br /&gt;
*The &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt; repo. This is the main Pioneer repository stored on GitHub. This is read-only except to the core team (and even they don't do their development there).&lt;br /&gt;
*The &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; repo. This is a public Pioneer repository personal to you, but stored on GitHub under your username, so other people can see the changes put into it. This is read-only to everyone except you.&lt;br /&gt;
*The &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; repo. This is your personal Pioneer repository on your computer, not accessible by anyone else.&lt;br /&gt;
&lt;br /&gt;
Before you can start developing you need to setup both your Pioneer &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; repositories.&lt;br /&gt;
&lt;br /&gt;
=== Your origin repository ===&lt;br /&gt;
&lt;br /&gt;
Your &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; repository you make on GitHub. To do that, make sure that you're logged in there and go to the main [https://github.com/pioneerspacesim/pioneer GitHub Pioneer page] in your web browser, and click the 'Fork' button at the top of that page: [[File:ForkPioneer.png|RTENOTITLE]]&lt;br /&gt;
&lt;br /&gt;
GitHub will clank and whirr as it makes a copy of the main Pioneer repo under your username. Eventually it will finish, and you'll end up on page almost exactly like the main GitHub Pioneer page, but instead of being named &amp;lt;code&amp;gt;pioneerspacesim/pioneer&amp;lt;/code&amp;gt; your copy is named &amp;lt;code&amp;gt;&amp;amp;lt;your github user name&amp;amp;gt;/pioneer&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Having made your &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; repo, you're now ready to make your local one.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Your local repository ===&lt;br /&gt;
&lt;br /&gt;
You make your &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; repository by cloning a copy of your new &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; repository to your local machine.&lt;br /&gt;
&lt;br /&gt;
At the command line, navigate to where on your filesystem you want to put your local git repos. For instance on Linux I put mine in &amp;lt;code&amp;gt;~/repos&amp;lt;/code&amp;gt; whilst on Windows I put them in &amp;lt;code&amp;gt;c:\develop\github-repos&amp;lt;/code&amp;gt;. You can move the folder at a later time without breaking anything. Once you're there execute the following command replacing &amp;lt;code&amp;gt;your github username&amp;lt;/code&amp;gt; with, well, your github username.&lt;br /&gt;
&lt;br /&gt;
 git clone [git://github.com/your https://github.com/your][https://github.com/your%20gituhub%20username/pioneer.git gituhub username/pioneer.git]&lt;br /&gt;
&lt;br /&gt;
Just like clicking Fork on the main Pioneer GitHub repo made a clone of it under your GitHub account, this makes a clone of that clone to your local machine. Expect this to take some time, just like before, as it copies all the files and the complete history of the project to your filesystem, only now it's sucking the data from GitHub to your machine, rather than copying things around within GitHub's data centre (so it will probably take even longer; however, a modern coputer does it on the order of minutes).&lt;br /&gt;
&lt;br /&gt;
Eventually this operation will complete, and you'll have a shiny new directory named &amp;lt;code&amp;gt;pioneer&amp;lt;/code&amp;gt; which git -- with a little encouragement -- will manage for you, your &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; repo.&lt;br /&gt;
&lt;br /&gt;
We're almost done with repository setup, but there is one more thing we need to attend to. When you did &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt;, it automatically set &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; to point to your Pioneer repository on GitHub. However it didn't set &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt; to point the main Pioneer Repository. We'll need to do that manually.&lt;br /&gt;
&lt;br /&gt;
We must to be inside the repository to do this, in fact all the git commands from now on, you need to be inside a repository to execute any of the git commands shown. So enter the pioneer repository directory, before doing:&lt;br /&gt;
&lt;br /&gt;
 git remote add upstream [git://github.com/pioneerspacesim/pioneer.git git://github.com/pioneerspacesim/pioneer.git]&lt;br /&gt;
&lt;br /&gt;
...to define &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt; as the main Pioneer repository. You'll notice you defined &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt; as a &amp;lt;code&amp;gt;remote&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; is also defined as a &amp;lt;code&amp;gt;remote&amp;lt;/code&amp;gt;. We'll explain more about remotes later on.&lt;br /&gt;
&lt;br /&gt;
You can now view the result of our commands, i.e. see how we link the &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; to your git repo, and upstream to the central pioneer repository.&lt;br /&gt;
&lt;br /&gt;
 git remote -v&lt;br /&gt;
&lt;br /&gt;
or for more details&lt;br /&gt;
&lt;br /&gt;
 git remote show origin&lt;br /&gt;
&lt;br /&gt;
== Basic operations ==&lt;br /&gt;
&lt;br /&gt;
At this point you might want to consider searching for tutorials. There are many good ones on git out there. If you're familiar with svn look [http://git.or.cz/course/svn.html here], and [http://marklodato.github.io/visual-git-guide/index-en.html this] is a nice visual representation of different commands, which might be helpful. Basic git tutorials on youtube: [https://www.youtube.com/watch?v=vaNGbk6HN9Y part 0], [https://www.youtube.com/watch?v=DQUcmNO4diQ part 1]. Below follows a few commands you will be using a lot, and be familiar with, but first make sure to delve into some tutorials. Git is a vast subject.&lt;br /&gt;
&lt;br /&gt;
Show documentation of command&lt;br /&gt;
&lt;br /&gt;
 git help &amp;lt;command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create branch...&lt;br /&gt;
&lt;br /&gt;
 git branch &amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...and move into it:&lt;br /&gt;
&lt;br /&gt;
 git checkout &amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or do both in one go&lt;br /&gt;
&lt;br /&gt;
 git checkout -b &amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check what files have been changed (red), and which have been staged for commit (green)&lt;br /&gt;
&lt;br /&gt;
 git status&lt;br /&gt;
&lt;br /&gt;
Add new or changed/modified file to be &amp;quot;staged&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 git add &amp;lt;file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and commit it (sometimes it's good to check &amp;quot;git status&amp;quot; first, to see what is staged)&lt;br /&gt;
&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
Or do it all in one go (this will not add new files, just changed, already tracked files)&lt;br /&gt;
&lt;br /&gt;
 git commit -a&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
 git commit -am &amp;quot;This is my commit message&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The two above commands (i.e. &amp;quot;git commit -a&amp;quot;) will commit all changes seen when running the highly useful&lt;br /&gt;
&lt;br /&gt;
 git diff&lt;br /&gt;
&lt;br /&gt;
=== Show information ===&lt;br /&gt;
&lt;br /&gt;
Investigating what you've done is always very useful, and instructive when learning git. To show your un-staged changes (changes not staged for commit)&lt;br /&gt;
&lt;br /&gt;
 git diff&lt;br /&gt;
&lt;br /&gt;
One of the most used commands might be to list the commit history&lt;br /&gt;
&lt;br /&gt;
 git log&lt;br /&gt;
 git log -p &amp;lt;file&amp;gt;&lt;br /&gt;
 git log --oneline --graph&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
 git show HEAD&lt;br /&gt;
 git show &amp;lt;commit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or N commits back in history&lt;br /&gt;
&lt;br /&gt;
 git show HEAD~&amp;lt;N&amp;gt;&lt;br /&gt;
&lt;br /&gt;
List local branches&lt;br /&gt;
&lt;br /&gt;
 git branch&lt;br /&gt;
&lt;br /&gt;
List local branches, and show last commit on each&lt;br /&gt;
&lt;br /&gt;
 git branch -v&lt;br /&gt;
&lt;br /&gt;
List local and remote (origin) branches, and show last commit on each&lt;br /&gt;
&lt;br /&gt;
 git branch -va&lt;br /&gt;
&lt;br /&gt;
This is a nice graphical interface to git, that you might prefer&lt;br /&gt;
&lt;br /&gt;
 gitk&lt;br /&gt;
&lt;br /&gt;
=== Common fixes for mistakes ===&lt;br /&gt;
&lt;br /&gt;
Here we outline highly useful knowledge for fixing very common mistakes or situations you will find often yourself in.&lt;br /&gt;
&lt;br /&gt;
It's common to want to add/change or reword the last commit, simply &amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt; if any changes and&lt;br /&gt;
&lt;br /&gt;
 git commit --amend&lt;br /&gt;
&lt;br /&gt;
If you realize you did &amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt; on a file that should not be included in the commit you are about to do, then un-stage it by:&lt;br /&gt;
&lt;br /&gt;
 git reset HEAD&lt;br /&gt;
&lt;br /&gt;
If you need to undo a commit you have already made simply reset the branch to one step back&lt;br /&gt;
&lt;br /&gt;
 git reset HEAD~&lt;br /&gt;
&lt;br /&gt;
or equivalently&lt;br /&gt;
&lt;br /&gt;
 git reset HEAD~1&lt;br /&gt;
&lt;br /&gt;
These reset commands only operates on the git record, not removing any changed files from your hard drive.&lt;br /&gt;
&lt;br /&gt;
If you already pushed the old commit to &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; (your github), then you need to do a forced push&lt;br /&gt;
&lt;br /&gt;
 git push -f origin &lt;br /&gt;
&lt;br /&gt;
== Updating your branches ==&lt;br /&gt;
&lt;br /&gt;
Makes no changes on your local copy, but reads in what changes there are upstream. A safe command.&lt;br /&gt;
&lt;br /&gt;
 git fetch upstream&lt;br /&gt;
&lt;br /&gt;
Or read in changes in all branches, and &amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; to purge, i.e. remove the lingering memory of branches that have been removed in origin&lt;br /&gt;
&lt;br /&gt;
 git fetch --all -p&lt;br /&gt;
&lt;br /&gt;
Now we know what changes have been made to &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt;, i.e. Pioneer space sims's master branch. Now to apply them to your master&lt;br /&gt;
&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git merge upstream/master&lt;br /&gt;
&lt;br /&gt;
Which is the same as&lt;br /&gt;
&lt;br /&gt;
 git pull upstream master&lt;br /&gt;
&lt;br /&gt;
Now, your local master (on your HDD) is synced with upstream (Pioneer's), but you probably want to update your github, &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt;, master branch as well:&lt;br /&gt;
&lt;br /&gt;
 git push origin master&lt;br /&gt;
&lt;br /&gt;
=== Doing a hard reset ===&lt;br /&gt;
&lt;br /&gt;
If you feel you've messed up your master branch, and just want to &amp;quot;start over&amp;quot;, or get a clean copy from upstream Pioneer, you can do a hard reset. However, be ware that this is a dangerous command, as it will remove any changes on the branch it is run from and make it identical to whatever you reset it to.&lt;br /&gt;
&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git fetch --all&lt;br /&gt;
 git reset --hard upstream/hard&lt;br /&gt;
&lt;br /&gt;
or if you want to reset your branch &amp;lt;code&amp;gt;my-branch&amp;lt;/code&amp;gt; to how it looks in your github&lt;br /&gt;
&lt;br /&gt;
 git reset --hard origin/my-branch&lt;br /&gt;
&lt;br /&gt;
Next, since a hard reset completely rewrites the commit history, when you push your updated master (or whatever branch), to origin, it might say that the two branches have conflicting history, thus you need to force push your fresh copy&lt;br /&gt;
&lt;br /&gt;
 git push -f origin master&lt;br /&gt;
&lt;br /&gt;
== Pushing branch (smart way) ==&lt;br /&gt;
&lt;br /&gt;
Normally to push your commit to your github, you might do:&lt;br /&gt;
&lt;br /&gt;
 git push origin &amp;lt;branch name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, it would be nice if your branch on your local git (on your HDD) and your origin (your github) know about each other, that they are the same. Luckily git allows this, by &amp;quot;tracking&amp;quot; the branch thus, typically the first time you push commits in your local branch to github you tell github to track it&lt;br /&gt;
&lt;br /&gt;
 git push --set-upstream origin &amp;lt;branch name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or shorter&lt;br /&gt;
&lt;br /&gt;
 git push origin &amp;lt;branch name&amp;gt; -u&lt;br /&gt;
&lt;br /&gt;
Now, whenever you do the following commands from a tracked branch&lt;br /&gt;
&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
 git pull&lt;br /&gt;
&lt;br /&gt;
it will be from your local &amp;amp;lt;branch-foo&amp;amp;gt; to its remote copy on origin (github). Also, git will show which branch is ahead of which&lt;br /&gt;
&lt;br /&gt;
 git branch -vva&lt;br /&gt;
&lt;br /&gt;
== Resolving Conflicts ==&lt;br /&gt;
&lt;br /&gt;
Conflicts happen when git tries to apply a commit and that commit changes code on the same or neighboring lines of code as some other commit that it's trying to merge with. Typically this can happen when issuing commands such as &amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rebase&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt;. Once you get the hang of it, they're easy to resolve. Just read the error message git spits out, and run&lt;br /&gt;
&lt;br /&gt;
 git status&lt;br /&gt;
&lt;br /&gt;
It will show some files that need to be manually edited. In the file it will show both versions of the lines conflicting. Edit the file to the way it should be then &amp;lt;code&amp;gt;git add &amp;amp;lt;file&amp;amp;gt;&amp;lt;/code&amp;gt; and then &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Making a pull request ==&lt;br /&gt;
&lt;br /&gt;
Make a branch, push it to your Github repository, and you will get a &amp;quot;Compare / Open Pull Request&amp;quot; button when viewing your branch on your Github account if logged in. Press it, and write a description of the changes you've made. Mention what improves by the changes made in the pull request.&lt;br /&gt;
&lt;br /&gt;
== Fixing/Updating your pull request ==&lt;br /&gt;
&lt;br /&gt;
This addresses the case where you have opened a pull request on Github, only to realize (by yourself, or through a reviewer giving feedback) that you need to change something. Conveniently, Github tracks your branch so any change to it will also update the commits in your pull request.&lt;br /&gt;
&lt;br /&gt;
For example, you make some new change to your branch, add and commit them:&lt;br /&gt;
&lt;br /&gt;
 git commit -am &amp;quot;this is an additional commit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Then just push it to your branch:&lt;br /&gt;
&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
(Note: this assumes your local branch is set up to track your Github branch)&lt;br /&gt;
&lt;br /&gt;
However, doing it like this is only recommended if the new commit actually adds something new to the branch, where it is logical to have it as a separate commit. If it is a bug fix for a previous commit in the same pull request, there is no need for us to see it in the master branch of pioneer once it is merged. Thus the following two subsections describe how to fix the commit log / history.&lt;br /&gt;
&lt;br /&gt;
=== Update / change last commit ===&lt;br /&gt;
&lt;br /&gt;
The first case is the simplest: if you just want to change the last commit in your branch, because you realized some file was missing, or needed an edit.&lt;br /&gt;
&lt;br /&gt;
Make your change, then run &amp;quot;git add&amp;quot; on the changed files. Now update the last commit by:&lt;br /&gt;
&lt;br /&gt;
 git add &amp;lt;changed_file&amp;gt;&lt;br /&gt;
 git commit --amend&lt;br /&gt;
&lt;br /&gt;
And push to your Github, but since the hash id of the last commit has changed, you need to force it&lt;br /&gt;
&lt;br /&gt;
 git push -f&lt;br /&gt;
&lt;br /&gt;
Done. &lt;br /&gt;
&lt;br /&gt;
Note this also lets you reword the commit message.&lt;br /&gt;
&lt;br /&gt;
=== Update / change commit in middle of the branch of the pull request ===&lt;br /&gt;
&lt;br /&gt;
The second case covers if you need to edit commits further back in the commit history, or change order of commits or any other change.&lt;br /&gt;
&lt;br /&gt;
The example case we use here has a git log looking like so:&lt;br /&gt;
&lt;br /&gt;
 git log --oneline&lt;br /&gt;
 dd34lqe added final feature D&lt;br /&gt;
 cc5369b added third feature C&lt;br /&gt;
 bb1ed97 added second feature B&lt;br /&gt;
 a528f11 added initial feature A&lt;br /&gt;
&lt;br /&gt;
Now you want to fix a bug in your second commit for feature &amp;quot;B&amp;quot;. Make your changes in your local branch, add them and commit. Your structure will now look like:&lt;br /&gt;
&lt;br /&gt;
 git log --oneline&lt;br /&gt;
 98a9832 my bugfix for feature B&lt;br /&gt;
 dd34lqe added final feature D&lt;br /&gt;
 cc5369b added third feature C&lt;br /&gt;
 bb1ed97 added second feature B&lt;br /&gt;
 a528f11 added initial feature A&lt;br /&gt;
&lt;br /&gt;
The bug fix commit is redundant to see in the git log once in master, so we want to merge the bug fix commit with &amp;quot;bb1ed97 my second feature B&amp;quot; commit, so that ''no one will ever know there was a bug in the first place''! You do this by &amp;quot;rebasing&amp;quot; your branch.&lt;br /&gt;
&lt;br /&gt;
 git rebase -i a528f11&lt;br /&gt;
&lt;br /&gt;
This opens the rebase dialogue in your default editor for git (usually vim, emacs, or nano). It will show you the git history for all commits after (i.e. excluding) the commit a528f11 (&amp;quot;added initial feature A&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
You will see in the editor something like this (don't be confused by the reverse order compared to git log command):&lt;br /&gt;
&lt;br /&gt;
 pick bb1ed97 added second feature B &lt;br /&gt;
 pick cc5369b added third feature C  &lt;br /&gt;
 pick dd34lqe added final feature D  &lt;br /&gt;
 pick 98a9832 my bugfix for feature B&lt;br /&gt;
 &lt;br /&gt;
 # Commands:&lt;br /&gt;
 #  p, pick = use commit&lt;br /&gt;
 #  r, reword = use commit, but edit the commit message&lt;br /&gt;
 #  e, edit = use commit, but stop for amending&lt;br /&gt;
 #  s, squash = use commit, but meld into previous commit&lt;br /&gt;
 #  f, fixup = like &amp;quot;squash&amp;quot;, but discard this commit's log message&lt;br /&gt;
 #  x, exec = run command (the rest of the line) using shell&lt;br /&gt;
 #&lt;br /&gt;
 # These lines can be re-ordered; they are executed from top to bottom.&lt;br /&gt;
 #&lt;br /&gt;
 # If you remove a line here THAT COMMIT WILL BE LOST.&lt;br /&gt;
 #&lt;br /&gt;
 # However, if you remove everything, the rebase will be aborted.&lt;br /&gt;
 #&lt;br /&gt;
 # Note that empty commits are commented out&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Now just move the last line to be just below the commit we want it to fix, and mark it as a &amp;quot;fixup&amp;quot;, which will merge it into the commit above it, and use its commit message:&lt;br /&gt;
&lt;br /&gt;
 pick bb1ed97 added second feature B &lt;br /&gt;
 fixup 98a9832 my bugfix for feature B&lt;br /&gt;
 pick cc5369b added third feature C  &lt;br /&gt;
 pick dd34lqe added final feature D  &lt;br /&gt;
&lt;br /&gt;
Save, and quit, and hopefully git will report that the rebase was successful, and your git history will now be clean, but the commit hash (and code) for the &amp;quot;B feature&amp;quot; has changed, thus we need to force push the change to Github.&lt;br /&gt;
&lt;br /&gt;
 git log --oneline&lt;br /&gt;
 dd34lqe added final feature D&lt;br /&gt;
 cc5369b added third feature C&lt;br /&gt;
 qq9860d added second feature B&lt;br /&gt;
 a528f11 added initial feature A&lt;br /&gt;
&lt;br /&gt;
 git push -f&lt;br /&gt;
&lt;br /&gt;
(again assuming your local branch is tracking the Github repo)&lt;br /&gt;
&lt;br /&gt;
== Getting other developer's branches ==&lt;br /&gt;
&lt;br /&gt;
If you want to get a copy of a branch from another developer, be that to test it, or to &amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt; (covered elsewhere) commits into your own branch.&lt;br /&gt;
&lt;br /&gt;
First make a branch from your master, and jump into it. It can be named whatever.&lt;br /&gt;
&lt;br /&gt;
 git checkout -b &amp;lt;branch-name&amp;gt; master&lt;br /&gt;
&lt;br /&gt;
Now pull the code in from the developer's branch named &amp;lt;code&amp;gt;&amp;amp;lt;dev-branch&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 git pull https://github.com/&amp;lt;developer-user-name&amp;gt;/pioneer.git &amp;lt;dev-branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it's a developer you will often want to pull code from you can add him/her to your remote, just like you did with your own github &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; and Pioneer's &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 git remote -v&lt;br /&gt;
&lt;br /&gt;
add a new one, named &amp;lt;code&amp;gt;&amp;amp;lt;remote&amp;amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 git remote add &amp;lt;remote&amp;gt; &amp;lt;url&amp;gt;&lt;br /&gt;
 git remote update&lt;br /&gt;
 git checkout -b &amp;lt;branch-name&amp;gt; --track &amp;lt;remote&amp;gt;/&amp;lt;remote-branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Keeping things tidy ==&lt;br /&gt;
&lt;br /&gt;
If branch is merged into master then it can safely be deleted&lt;br /&gt;
&lt;br /&gt;
 git branch -d &amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If branch is not in master, then a force remove can be made&lt;br /&gt;
&lt;br /&gt;
 git branch -D &amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 git push origin&amp;amp;nbsp;:&amp;lt;branch-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 git clean -n&lt;br /&gt;
&lt;br /&gt;
 git clean -f&lt;br /&gt;
&lt;br /&gt;
== Cherry picking ==&lt;br /&gt;
&lt;br /&gt;
If wanting a commit from someone else, e.g. to add to your own branch, you can pull down their branch to your machine, then from the branch you want it to, just do:&lt;br /&gt;
&lt;br /&gt;
 git cherry-pick &amp;lt;commit-hash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To actually do the &amp;quot;pulling down&amp;quot; of their branch to your machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;git remote add dev-username git://path/to/dev-username/repo.git&lt;br /&gt;
git fetch dev-username&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might also be inetersted in following future changes in dev-username's branch:&lt;br /&gt;
&amp;lt;pre&amp;gt;git checkout --track dev-username/foo&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, another useful tool, for those graphically inclined is:&lt;br /&gt;
&lt;br /&gt;
 gitk&lt;br /&gt;
&lt;br /&gt;
'''Warning''': cherry picking, although sometimes useful, can cause problems for other developers if you use them on commits that have already been published to github. Be careful and give sufficient warnings if you find you needing to use them in that situation.&lt;br /&gt;
&lt;br /&gt;
== Pushing to upstream Pioneer master ==&lt;br /&gt;
&lt;br /&gt;
So you have working knowledge of git, and have been deemed not (too) crazy to be given commit access to the pioneer source? Welcome! As this means you can merge your own -- and others -- code into pioneer master, there are a few things you might want to know.&lt;br /&gt;
&lt;br /&gt;
=== Guidelines for merge etiquette ===&lt;br /&gt;
&lt;br /&gt;
The power to merge code on to a common code base requires mutual respect among the developers, and [https://en.wikipedia.org/wiki/Fingerspitzengefühl fingerspitzengefühl] based on the knowledge they have of each other, such as what their typical response time is, and where their area of expertise, and (code) interest/disinterests lies. If these principles were put into writing they might look something like the following:&lt;br /&gt;
&lt;br /&gt;
*You still need to open pull requests (PR), and hold them open long enough for other developers to have a fair chance to have time to voice their opinion, and possibly/occasionally review it. Don't count on the latter though, you're responsible for what you break, and you are now expected to review your own code.&lt;br /&gt;
&lt;br /&gt;
*An instant merge of a PR can be done from time to time when the change is trivial, and obviously &amp;quot;good&amp;quot;, and/or working on code that is &amp;quot;your private realm&amp;quot; of the pioneer source, and/or when you or other person needs a feature in master as soon as possible, for the next build.&lt;br /&gt;
&lt;br /&gt;
*Also, you may push a commit directly to master, with no PR, if the change is ''very'' trivial one-liner, for instance fixing a very silly error in just merged code.&lt;br /&gt;
&lt;br /&gt;
*You may ''not'' ever do a forced push to pioneer master.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to merge a PR the proper/pedantic way ===&lt;br /&gt;
&lt;br /&gt;
For those with push access to https://github.com/pioneerspacesim/pioneer this is one way to push code to master. First make sure you have a resonable setup:&lt;br /&gt;
&lt;br /&gt;
 git remote -v&lt;br /&gt;
  origin	https://github.com/myusername/pioneer.git (fetch)&lt;br /&gt;
  origin	https://github.com/myusername/pioneer.git (push)&lt;br /&gt;
  upstream	https://github.com/pioneerspacesim/pioneer.git (fetch)&lt;br /&gt;
  upstream	https://github.com/pioneerspacesim/pioneer.git (push)&lt;br /&gt;
&lt;br /&gt;
Also, it might be a god idea to clean your master branch, so you know it is identical to pioneer upstream, but do be warned, this will wipe your master branch, thus if you have commits that are not in their own branches, they will be lost (but retrievable through git reflog):&lt;br /&gt;
&lt;br /&gt;
  git checkout master&lt;br /&gt;
  git reset --hard upstream/master&lt;br /&gt;
&lt;br /&gt;
(For future merges, a simple git pull will suffice, if you've kept your master branch clean)&lt;br /&gt;
&lt;br /&gt;
Now get the branch from the contributor to your computer, by creating an aptly named branch, and then pulling the code from the contributor to this branch.&lt;br /&gt;
&lt;br /&gt;
 git checkout -b name_of_branch_to_create&lt;br /&gt;
 git pull https://github.com/contributor_username/pioneer.git name_of_branch_user_has&lt;br /&gt;
&lt;br /&gt;
Now switch to your master, and merge it in, here we asume the branch you created was called &amp;quot;feature_branch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git merge --no-commit --no-ff feature_branch&lt;br /&gt;
&lt;br /&gt;
Document changes to Changelog.txt, then add it, so from the pioneer root folder, the path to Changelog wold just be:&lt;br /&gt;
&lt;br /&gt;
 git add Changelog.txt&lt;br /&gt;
 git commit &lt;br /&gt;
&lt;br /&gt;
This has now included the Changelog edit into the merge commit. Now do a dry run:&lt;br /&gt;
&lt;br /&gt;
 git push upstream master --dry-run&lt;br /&gt;
&lt;br /&gt;
Check that the right commits will be pushed with&lt;br /&gt;
&lt;br /&gt;
 git log&lt;br /&gt;
&lt;br /&gt;
And let us do it for real this time:&lt;br /&gt;
&lt;br /&gt;
 git push upstream master&lt;br /&gt;
&lt;br /&gt;
Please note: NEVER do a force push to pioneer master!&lt;br /&gt;
&lt;br /&gt;
== Advanced ==&lt;br /&gt;
&lt;br /&gt;
Collecting some advanced tricks for developers&lt;br /&gt;
&lt;br /&gt;
=== Push commit to someones PR ===&lt;br /&gt;
&lt;br /&gt;
If you have push access to pioneer repo, then you also have push access to other contributor's pull requests.&lt;br /&gt;
&lt;br /&gt;
Get the user's PR into a branch as usual:&lt;br /&gt;
&lt;br /&gt;
  git checkout -b some_user-feature_branch master&lt;br /&gt;
  git pull https://github.com/some_user/pioneer.git feature_branch&lt;br /&gt;
&lt;br /&gt;
make your changes, now push:&lt;br /&gt;
&lt;br /&gt;
  git push https://github.com/some_user/pioneer.git some_user-feature_branch:feature_branch&lt;br /&gt;
&lt;br /&gt;
=== PR trick ===&lt;br /&gt;
&lt;br /&gt;
For developers, or anyone interested, this trick will pull down all the pull requests from github, so you can easily switch to pull request, say, #1234 by doing&lt;br /&gt;
&lt;br /&gt;
  git checkout refs/pull/upstream/1234&lt;br /&gt;
&lt;br /&gt;
=== Be a git pedantic? ===&lt;br /&gt;
Writing good [https://github.com/RomuloOliveira/commit-messages-guide commit messages], and being pedantic has its values.&lt;br /&gt;
&lt;br /&gt;
== Links and resources ==&lt;br /&gt;
* [https://github.com/k88hudson/git-flight-rules git-flight-rules] Lots of examples, and links to further resources&lt;br /&gt;
* [https://ohshitgit.com/ Oh shit, git!] Fixing common mistakes in git&lt;br /&gt;
* [https://git-rebase.io/ git rebase in depth] Good guide on how to clean up/fix your git commit history&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=3907</id>
		<title>Pioneer Wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=3907"/>
		<updated>2020-05-11T02:08:54Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: /* Development */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Pioneer is a space adventure game set in the Milkyway galaxy at the turn of the 33rd century. The game is open-ended, and you are free to explore the millions of star systems in the game. You can land on planets, slingshot past gas giants, and burn yourself to a crisp flying between binary star systems.&lt;br /&gt;
&lt;br /&gt;
If you are new to pioneer you may want to know [[How_to_start|how to start]].&lt;br /&gt;
&lt;br /&gt;
*[http://pioneerspacesim.net/download Download Pioneer] for Windows, Linux and Mac OSX &lt;br /&gt;
&lt;br /&gt;
Please make this wiki nice. Add stuff about mods, dev, whatever. Be awesome! [[Getting_started|How to get started]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#bbffbb; border:2px solid #99ee99; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Community ===&lt;br /&gt;
&lt;br /&gt;
*[http://pioneerspacesim.net/ Pioneer Space Sim Homepage]&lt;br /&gt;
*[https://github.com/pioneerspacesim/pioneer/ Main Github repository]&lt;br /&gt;
*[http://spacesimcentral.com/community/pioneer/ Community forum] &lt;br /&gt;
*[http://pioneerspacesim.net/forum Developer forum] &lt;br /&gt;
*[https://reddit.com/r/pioneerspacesim Pioneer Space Sim on Reddit]&lt;br /&gt;
*[https://pioneerspacesim.itch.io/pioneer Pioneer Space Sim on itch]&lt;br /&gt;
*[http://webchat.freenode.net/?channels=#pioneer Pioneer Space Sim on IRC] (where devs hang out)&lt;br /&gt;
*[http://twitter.com/pioneerspacesim @pioneerspacesim] on Twitter &lt;br /&gt;
*[https://discord.gg/RQQe3A7 discord]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
*[[Manual|Basic Manual]] &lt;br /&gt;
*[[Flight_UI|Flight UI]] &lt;br /&gt;
*[[Keyboard_and_mouse_controls|Keyboard and mouse controls]] &lt;br /&gt;
*[[Tutorials|Tutorials]] (Outdated and WIP) &lt;br /&gt;
*[[Mission_Types_and_BBS|Mission Types and BBS]] &lt;br /&gt;
*[[Settings_Menu|Settings Menu]] &lt;br /&gt;
*[[FAQ|FAQ]] &lt;br /&gt;
*[[Media_Coverage|Media Coverage]] &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#fff9b1; border:2px solid #f0fe66; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
=== The Pioneer Universe ===&lt;br /&gt;
&lt;br /&gt;
*[[Pioneer_Universe|Pioneer Universe]] &lt;br /&gt;
*[[:Category:Ships| Ships]] (work in progress) &lt;br /&gt;
*[[:Category:Manufacturers| Manufacturers]] (work in progress) &lt;br /&gt;
*[[Places_of_interest|Places of interest]] &lt;br /&gt;
*[[Ship_Equipment|Ship Equipment]] (work in progress) &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#f0f0ff; border:2px solid #c6c9ff; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
=== Content Creation ===&lt;br /&gt;
&lt;br /&gt;
*[[Mods|Mods]]&lt;br /&gt;
*[[Scripting_and_Mission_Creation|Scripting and Mission Creation]] &lt;br /&gt;
*[[Custom_Systems|Custom Systems]] &lt;br /&gt;
*[[Design_and_Concept_art|Design and Concept art]] &lt;br /&gt;
*[[Modeling,_Texturing,_Graphics_Design|Modeling, Texturing, Graphics Design]] &lt;br /&gt;
*[[Music_and_Sound|Music and Sound]] &lt;br /&gt;
*[[Translations|Translations]] &lt;br /&gt;
*[[Licensing|Licensing]] &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#fff3e3; border:2px solid #ffc9c9; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Development ===&lt;br /&gt;
&lt;br /&gt;
*[[Design_Scope|Game Scope]] &lt;br /&gt;
*[[How_you_can_contribute|How you can contribute]] &lt;br /&gt;
*[[Getting_Started_with_Development|Getting Started with Development]] &lt;br /&gt;
**[[How_to_communicate|How to communicate]] &lt;br /&gt;
**[[Using_git_and_GitHub|Using git and GitHub]] &lt;br /&gt;
**[[Coding Conventions]]&lt;br /&gt;
**[[Development_team|Development team]]  &lt;br /&gt;
**[[Engine_Overview|Engine internals overview]] &lt;br /&gt;
*[[Development_Model|Development Model]] &lt;br /&gt;
*[[Design_Workflow|Design and Project Management Workflow]] &lt;br /&gt;
*[https://github.com/pioneerspacesim/pioneer/issues Issue tracker] &lt;br /&gt;
*[[Roadmap|Roadmap]] &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pioneer is brought to you by a flock of [https://github.com/pioneerspacesim/pioneer/blob/master/AUTHORS.txt opensource beardy-weirdies], and is [http://www.gnu.org/licenses/gpl.html Free Software]&lt;br /&gt;
&lt;br /&gt;
'''__NOTOC__'''&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3906</id>
		<title>Coding Conventions</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3906"/>
		<updated>2020-05-11T02:08:05Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes some of the code style used in Pioneer. As of 2019, we rely on clang to do our code-formatting checks for us. This means a Pull Request (PR) with incorrectly formatted code will fail the automated test. Please read [[Coding Conventions|Code Formatting]] for how to avoid this, and how to have our clang-format.sh script check your code before committing.&lt;br /&gt;
&lt;br /&gt;
= General Concerns =&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
&lt;br /&gt;
Engine and Lua code is licensed under [http://www.gnu.org/licenses/gpl.html GPL v3].&lt;br /&gt;
&lt;br /&gt;
Assets (including Lua-based data files like custom systems) are licensed under [http://creativecommons.org/licenses/by-sa/3.0/ CC-BY-SA 3.0].&lt;br /&gt;
&lt;br /&gt;
When submitting a file to the Pioneer repository, be sure to include these two lines at the top of each file (suitably commented):&lt;br /&gt;
&lt;br /&gt;
    Copyright © 2008-2020 Pioneer Developers. See AUTHORS.txt for details&lt;br /&gt;
    Licensed under the terms of the GPL v3. See licenses/GPL-3.txt&lt;br /&gt;
&lt;br /&gt;
    Copyright © 2008-2020 Pioneer Developers. See AUTHORS.txt for details&lt;br /&gt;
    Licensed under the terms of CC-BY-SA 3.0. See licenses/CC-BY-SA-3.0.txt&lt;br /&gt;
&lt;br /&gt;
== Tabs &amp;amp; spacing ==&lt;br /&gt;
&lt;br /&gt;
These standards are agreed upon for both C++ and Lua code - please make very sure to follow them!&lt;br /&gt;
&lt;br /&gt;
* Hard tabs, 4-space aligned.&lt;br /&gt;
* Indent function arguments broken across multiple lines by one tab '''only'''. Do not add extra spaces to &amp;quot;line up&amp;quot; arguments with the opening parethesis.&lt;br /&gt;
* No trailing spaces, and don't indent blank lines&lt;br /&gt;
* Attention MS Windows users: lines end with Line Feed (LF), not Carriage Return (CR) or both (CRLF). If you can not fix it in your editor, git can do it for you [http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#Formatting-and-Whitespace using the configuration option].&lt;br /&gt;
&lt;br /&gt;
Some of our code doesn't follow this standard; if you're fixing up older indentation styles, please make sure to '''do that in its own commit''' so that other developers can review your changes more easily.&lt;br /&gt;
&lt;br /&gt;
== Code Formatting ==&lt;br /&gt;
&lt;br /&gt;
The Pioneer C++ codebase has an enforced common coding style, managed by running the &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; tool. This is run by the Travis CI provider for all pull requests, and may also be run locally as a [https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks git hook]. If your Pull Request is displaying a red X or a message saying &amp;quot;All checks have failed&amp;quot;, it is likely that your code has inadvertently broken the C++ code style that Pioneer uses.&lt;br /&gt;
&lt;br /&gt;
=== Diagnosing Formatting Issues ===&lt;br /&gt;
&lt;br /&gt;
If your Pull Request is in violation of Pioneer's code formatting rules, you can look at the Travis log to find out what parts of your code are specifically to blame. Click &amp;quot;Details&amp;quot; next to &amp;quot;The Travis CI build has failed&amp;quot; at the bottom of the Pull Request page, and select the &amp;quot;Static Checks&amp;quot; job from the resulting page. In the log below, the differences between your code and the correctly formatted code will be listed in [https://linux.die.net/man/1/diff diff(1)] format.&lt;br /&gt;
&lt;br /&gt;
=== Installing a Git Hook ===&lt;br /&gt;
&lt;br /&gt;
Looking at the Travis log to find out what changed is fine and well, but what you really should be doing is using a git hook to validate your code ''before'' you commit your changes. This process is very simple if you are developing on a Mac or Linux system - simply copy the pre-provided git hook into your local repository's &amp;lt;code&amp;gt;hooks/&amp;lt;/code&amp;gt; directory. A pre-commit hook is not currently available for Windows systems. If you know how to reliably set one up, you are more than welcome to author it and submit it as a Pull Request.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp scripts/clang-format.sh .git/hooks/pre-commit-hook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have installed the hook, simply run &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; as normal. If your code doesn't comply with the C++ style rules, it will abort the commit and print the difference between your code and the properly formatted code to the console. If it succeeds, it will open an editor as normal.&lt;br /&gt;
&lt;br /&gt;
If, for some reason, you wish to bypass the validation hook, simply run &amp;lt;code&amp;gt;git commit --no-verify&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Applying The Format Changes ===&lt;br /&gt;
&lt;br /&gt;
Once you know which files are improperly formatted, and what changes need to be made to fix them, you have two options. The first option is to manually apply the required changes to your code, and submit them as a new commit. Alternatively, you can use the automatic formatting tool. The interface is simple, presenting you with the list of changes made by clang-format and asking whether you would like to apply them. The invocation is simple as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./autoformat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will overwrite your code with the properly formatted version. It is recommended that you do not do this blindly, as clang-format has some issues with detecting file types and may occasionally eat your work. Please read the diff and determine which changes will be made. If your version of clang-format is bugged and suggesting destructive changes, manually apply the correct changes and run `git-commit --no-verify` to bypass clang-format entirely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= C++ Code Formatting Guide =&lt;br /&gt;
&lt;br /&gt;
This section documents syntax and style guidelines that should be followed across the codebase.&lt;br /&gt;
&lt;br /&gt;
Names should be concise and clear. They should easily communicate the purpose of object they represent. Names should not have type or qualifier information embedded in the name (the so-called [http://en.wikipedia.org/wiki/Hungarian_notation Systems Hungarian] notation). If a name isn't clear, it will cause confusion further down the line when someone else is editing your code.&lt;br /&gt;
&lt;br /&gt;
If a function or variable refers to a quantity (e.g. atmospheric pressure, distance, etc.), please make sure it is well documented, including any assumptions it makes about the value and unit of the quantity. Unknowingly multiplying a value in Parsecs by a value in millimeters can take a while to track down, and it's very frustrating to everyone who has to debug it.&lt;br /&gt;
&lt;br /&gt;
There are a few abbreviated names that are commonly used throughout the codebase, eg &amp;lt;code&amp;gt;Renderer *r&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lua_State *l&amp;lt;/code&amp;gt;, etc. Try to prefer them where appropriate.&lt;br /&gt;
&lt;br /&gt;
== Classes ==&lt;br /&gt;
&lt;br /&gt;
Class names should be written in PascalCase like so:&lt;br /&gt;
&lt;br /&gt;
 class MyClass {};&lt;br /&gt;
&lt;br /&gt;
Structures intended to be used as an &amp;quot;integral type&amp;quot; like &amp;lt;code&amp;gt;vector3&amp;lt;/code&amp;gt; should be written in lower case:&lt;br /&gt;
&lt;br /&gt;
 struct vector3 {};&lt;br /&gt;
&lt;br /&gt;
Class-private or protected member variables should be prefixed with &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt;, using camelCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
protected:&lt;br /&gt;
    int m_someValue;&lt;br /&gt;
    std::string m_anotherValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that public member variables, especially in structures like &amp;lt;code&amp;gt;vector3&amp;lt;/code&amp;gt;, do not follow the above conventions and are written without prefix.&lt;br /&gt;
&lt;br /&gt;
Static member variables should be prefixed with &amp;lt;tt&amp;gt;s_&amp;lt;/tt&amp;gt;, using camelCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
protected:&lt;br /&gt;
    static int s_classScopeVariable;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All class functions (except those intentionally meant to follow the C++ STL's naming convention) should be written in PascalCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
public:&lt;br /&gt;
    void MyFunction() {}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This includes static functions; they use the same naming convention as member functions, but their intended use should be well documented.&lt;br /&gt;
&lt;br /&gt;
== Global variables ==&lt;br /&gt;
&lt;br /&gt;
Global variables must be prefixed with &amp;lt;tt&amp;gt;g_&amp;lt;/tt&amp;gt;, and use camelCase:&lt;br /&gt;
&lt;br /&gt;
 int g_screenWidth;&lt;br /&gt;
&lt;br /&gt;
Please remember that raw global variables in C++ are considered bad practice; if you're writing code that uses them, you may want to rethink how you're accomplishing your goal.&lt;br /&gt;
&lt;br /&gt;
Variables with static file scope should be prefixed with &amp;lt;tt&amp;gt;s_&amp;lt;/tt&amp;gt;, and similarly use camelCase:&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 static int s_fileScopeVariable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
Generally, use the style of the file you're working on. But the below is the general principle for commenting code.&lt;br /&gt;
&lt;br /&gt;
* Use C++ comments rather than C comment blocks, unless you're writing multiple-paragraph comments.&lt;br /&gt;
* Many people work on the code, so please describe whenever function- and variable names are not enough.&lt;br /&gt;
* Especially comment when you think you're writing clever code&lt;br /&gt;
* That goes double for anything using the Lua stack manipulation functions - trailing comments showing the stack state are ''not'' overkill!&lt;br /&gt;
&lt;br /&gt;
For documenting C++ functions one can use three slashes (&amp;lt;code&amp;gt;///&amp;lt;/code&amp;gt;) or the Javadoc style (&amp;lt;code&amp;gt;/** ... */&amp;lt;/code&amp;gt;) and it will be picked up by [http://doxygen.nl/manual/docblocks.html Doxygen]:&lt;br /&gt;
&lt;br /&gt;
 /// &lt;br /&gt;
 /// Function to be used only if user is willing to accept the return type&lt;br /&gt;
 /// Do not use if prone to depression.&lt;br /&gt;
 /// &lt;br /&gt;
 void meaningOfLife()&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * \brief Function documented by a Javadoc-style comment&lt;br /&gt;
  *&lt;br /&gt;
  * This is a fun function!&lt;br /&gt;
  */&lt;br /&gt;
 void Explode()&lt;br /&gt;
&lt;br /&gt;
Leading asterisks in Javadoc-style comments are not required - if the comment starts with exactly two asterisks, Doxygen will pick it up.&lt;br /&gt;
&lt;br /&gt;
When not writing Doxygen documentation comments, please use regular C++ style (&amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;) comments.&lt;br /&gt;
&lt;br /&gt;
 // Regular comment in code for other programmers mucking about (example code from Quake3):&lt;br /&gt;
&lt;br /&gt;
 float InvSqrt (float x){&lt;br /&gt;
     float xhalf = 0.5f*x;&lt;br /&gt;
     int i = *(int*)&amp;amp;x;&lt;br /&gt;
     &lt;br /&gt;
     // I really should have documented this&lt;br /&gt;
     i = 0x5f3759df - (i&amp;gt;&amp;gt;1);  &lt;br /&gt;
     &lt;br /&gt;
     x = *(float*)&amp;amp;i;&lt;br /&gt;
     x = x*(1.5f - xhalf*x*x);&lt;br /&gt;
     return x;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Please make sure your comments are informative - they should provide information to future programmers that might not be obvious from reading the variable names:&lt;br /&gt;
&lt;br /&gt;
 // entered if we are flying&lt;br /&gt;
 // (BAD!)&lt;br /&gt;
 if(isFlying)&lt;br /&gt;
 {&lt;br /&gt;
     // If the atmospheric pressure exceeds the crush point of the hull (as expressed in arbitrary units)&lt;br /&gt;
     // we, naturally, explode.&lt;br /&gt;
     // (GOOD!)&lt;br /&gt;
     if (GetAtmoPressure() &amp;gt; 5103.0 / m_maxBar) {&lt;br /&gt;
         Explode();&lt;br /&gt;
&lt;br /&gt;
If something is broken, or temporarily disabled, or needs re-thinking, make use of TODO markers at the beginning of your code. Most modern IDEs have plugins to display these comments neatly so future programmers can easily see work that needs to be done:&lt;br /&gt;
&lt;br /&gt;
 // FIXME(sturnclaw): add a better interface for retrieving a global time source&lt;br /&gt;
 // TODO: re-initialise the turntable style view position from the current mouselook view&lt;br /&gt;
 // HACK: attempt to recognise `foo_3.png' style names&lt;br /&gt;
&lt;br /&gt;
Signing your comments (e.g. &amp;lt;code&amp;gt;FIXME(sturnclaw):&amp;lt;/code&amp;gt;) isn't required, but is good practice if the TODO is about something you intend to work on further.&lt;br /&gt;
&lt;br /&gt;
=== Lua API Documentation ===&lt;br /&gt;
&lt;br /&gt;
For [https://pioneerspacesim.net/codedoc/ LuaAPI] documentation we use NaturalDocs v2; this documentation is pulled from C++ and lua source files. This documentation follows the NaturalDocs [https://www.naturaldocs.org/getting_started/documenting_your_code/ conventions].&lt;br /&gt;
&lt;br /&gt;
The syntax is very simple and easy to work with. Leading asterisks on each line of documentation are optional; NaturalDocs will read regular block comments as well.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * Method: Fly&lt;br /&gt;
  *&lt;br /&gt;
  * Fly high in the sky&lt;br /&gt;
  *&lt;br /&gt;
  * &amp;gt; ship:fly()&lt;br /&gt;
  *&lt;br /&gt;
  * Availability:&lt;br /&gt;
  *&lt;br /&gt;
  *  2015&lt;br /&gt;
  *&lt;br /&gt;
  * Status:&lt;br /&gt;
  *&lt;br /&gt;
  *  experimental&lt;br /&gt;
  */&lt;br /&gt;
 static int l_fly_high_in_the_sky(lua_State *l)&lt;br /&gt;
 {&lt;br /&gt;
         // code goes here&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Constants and Macros ==&lt;br /&gt;
&lt;br /&gt;
When defining file or class-scope constants, never use &amp;lt;code&amp;gt;#define&amp;lt;/code&amp;gt; - prefer C++ static constants or better yet &amp;lt;code&amp;gt;constexpr&amp;lt;/code&amp;gt; where possible.&lt;br /&gt;
&lt;br /&gt;
 static const double M_PI = 3.14159;&lt;br /&gt;
 static constexpr double M_PI = 3.14159;&lt;br /&gt;
&lt;br /&gt;
The use of macros should be kept to a minimum - using a macro in a local scope to reduce boilerplate is acceptable, but macros in headers should only be used when there is no other alternative. Remember to always &amp;lt;code&amp;gt;#undef&amp;lt;/code&amp;gt; local macros as soon as they are done being used to prevent accidental name pollution and other issues.&lt;br /&gt;
&lt;br /&gt;
=== Include guards ===&lt;br /&gt;
&lt;br /&gt;
Pioneer is (slowly and unofficially) moving away from include guards and using &amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt; as it's easier, less accident-prone (name collisions anyone?), and well supported by all modern compilers. However, we're not rejecting code using include guards instead.&lt;br /&gt;
&lt;br /&gt;
Header include guards should be named for the filename of the header, capitalised, with slashes converted to underscores:&lt;br /&gt;
&lt;br /&gt;
 // Ship.h&lt;br /&gt;
 #ifndef SHIP_H&lt;br /&gt;
&lt;br /&gt;
 // WorldView.h&lt;br /&gt;
 #ifndef WORLDVIEW_H&lt;br /&gt;
&lt;br /&gt;
 // graphics/Renderer.h&lt;br /&gt;
 #ifndef GRAPHICS_RENDERER_H&lt;br /&gt;
&lt;br /&gt;
== Enum types ==&lt;br /&gt;
&lt;br /&gt;
Prefer using C++ style &amp;lt;tt&amp;gt;enum class&amp;lt;/tt&amp;gt; declarations when writing new code. They're slightly more difficult to serialize (although only to the extent of requiring a &amp;lt;code&amp;gt;static_cast&amp;lt;/code&amp;gt;), but they encourage much more correct code.&lt;br /&gt;
&lt;br /&gt;
No matter which style of enum you're using, try to follow these guidelines:&lt;br /&gt;
* Avoid assigning explicit integer values.&lt;br /&gt;
* Also avoid values that aren't actually valid for whatever the enum is (though *_MAX to mark the last valid value is usually acceptable).&lt;br /&gt;
* If these don't work, chances are what you're trying to do would be better served by multiple enums or even a whole class.&lt;br /&gt;
&lt;br /&gt;
=== C-style Enums ===&lt;br /&gt;
&lt;br /&gt;
Enums are effectively global constants, so should be in full caps. They're prefixed with the name of the enum.&lt;br /&gt;
&lt;br /&gt;
    enum Thing {&lt;br /&gt;
        THING_FOO,&lt;br /&gt;
        THING_BAR,&lt;br /&gt;
        THING_BAZ,&lt;br /&gt;
        &lt;br /&gt;
        THING_MAX&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
If you're writing new code and can't use C++-style enum classes, consider using C-style enums scoped in a struct to avoid polluting the global namespace.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Thing {&lt;br /&gt;
    enum Thing {&lt;br /&gt;
        Foo,&lt;br /&gt;
        Bar,&lt;br /&gt;
        Baz,&lt;br /&gt;
&lt;br /&gt;
        THING_MAX&lt;br /&gt;
    };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C++-style Enum Class ===&lt;br /&gt;
&lt;br /&gt;
C++ style enums are closer to classes, and thus they (and their members) should use PascalCase.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum class Thing : uint8_t {&lt;br /&gt;
    Foo,&lt;br /&gt;
    Bar,&lt;br /&gt;
    Baz&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Lua Code Formatting Guide =&lt;br /&gt;
&lt;br /&gt;
This section is TODO...&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3905</id>
		<title>Coding Conventions</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3905"/>
		<updated>2020-05-11T02:02:35Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes some of the code style used in Pioneer. As of 2019, we rely on clang to do our code-formatting checks for us. This means a Pull Request (PR) with incorrectly formatted code will fail the automated test. Please read [[Coding Conventions|Code Formatting]] for how to avoid this, and how to have our clang-format.sh script check your code before committing.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
&lt;br /&gt;
Engine and Lua code is licensed under [http://www.gnu.org/licenses/gpl.html GPL v3].&lt;br /&gt;
&lt;br /&gt;
Assets (including Lua-based data files like custom systems) are licensed under [http://creativecommons.org/licenses/by-sa/3.0/ CC-BY-SA 3.0].&lt;br /&gt;
&lt;br /&gt;
When submitting a file to the Pioneer repository, be sure to include these two lines at the top of each file (suitably commented):&lt;br /&gt;
&lt;br /&gt;
    Copyright © 2008-2020 Pioneer Developers. See AUTHORS.txt for details&lt;br /&gt;
    Licensed under the terms of the GPL v3. See licenses/GPL-3.txt&lt;br /&gt;
&lt;br /&gt;
    Copyright © 2008-2020 Pioneer Developers. See AUTHORS.txt for details&lt;br /&gt;
    Licensed under the terms of CC-BY-SA 3.0. See licenses/CC-BY-SA-3.0.txt&lt;br /&gt;
&lt;br /&gt;
== Tabs &amp;amp; spacing ==&lt;br /&gt;
&lt;br /&gt;
These standards are agreed upon for both C++ and Lua code - please make very sure to follow them!&lt;br /&gt;
&lt;br /&gt;
* Hard tabs, 4-space aligned.&lt;br /&gt;
* Indent function arguments broken across multiple lines by one tab '''only'''. Do not add extra spaces to &amp;quot;line up&amp;quot; arguments with the opening parethesis.&lt;br /&gt;
* No trailing spaces, and don't indent blank lines&lt;br /&gt;
* Attention MS Windows users: lines end with Line Feed (LF), not Carriage Return (CR) or both (CRLF). If you can not fix it in your editor, git can do it for you [http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#Formatting-and-Whitespace using the configuration option].&lt;br /&gt;
&lt;br /&gt;
Some of our code doesn't follow this standard; if you're fixing up older indentation styles, please make sure to '''do that in its own commit''' so that other developers can review your changes more easily.&lt;br /&gt;
&lt;br /&gt;
== Code Formatting ==&lt;br /&gt;
&lt;br /&gt;
The Pioneer C++ codebase has an enforced common coding style, managed by running the &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; tool. This is run by the Travis CI provider for all pull requests, and may also be run locally as a [https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks git hook]. If your Pull Request is displaying a red X or a message saying &amp;quot;All checks have failed&amp;quot;, it is likely that your code has inadvertently broken the C++ code style that Pioneer uses.&lt;br /&gt;
&lt;br /&gt;
=== Diagnosing Formatting Issues ===&lt;br /&gt;
&lt;br /&gt;
If your Pull Request is in violation of Pioneer's code formatting rules, you can look at the Travis log to find out what parts of your code are specifically to blame. Click &amp;quot;Details&amp;quot; next to &amp;quot;The Travis CI build has failed&amp;quot; at the bottom of the Pull Request page, and select the &amp;quot;Static Checks&amp;quot; job from the resulting page. In the log below, the differences between your code and the correctly formatted code will be listed in [https://linux.die.net/man/1/diff diff(1)] format.&lt;br /&gt;
&lt;br /&gt;
=== Installing a Git Hook ===&lt;br /&gt;
&lt;br /&gt;
Looking at the Travis log to find out what changed is fine and well, but what you really should be doing is using a git hook to validate your code ''before'' you commit your changes. This process is very simple if you are developing on a Mac or Linux system - simply copy the pre-provided git hook into your local repository's &amp;lt;code&amp;gt;hooks/&amp;lt;/code&amp;gt; directory. A pre-commit hook is not currently available for Windows systems. If you know how to reliably set one up, you are more than welcome to author it and submit it as a Pull Request.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp scripts/clang-format.sh .git/hooks/pre-commit-hook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have installed the hook, simply run &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; as normal. If your code doesn't comply with the C++ style rules, it will abort the commit and print the difference between your code and the properly formatted code to the console. If it succeeds, it will open an editor as normal.&lt;br /&gt;
&lt;br /&gt;
If, for some reason, you wish to bypass the validation hook, simply run &amp;lt;code&amp;gt;git commit --no-verify&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Applying The Format Changes ===&lt;br /&gt;
&lt;br /&gt;
Once you know which files are improperly formatted, and what changes need to be made to fix them, you have two options. The first option is to manually apply the required changes to your code, and submit them as a new commit. Alternatively, you can use the automatic formatting tool. The interface is simple, presenting you with the list of changes made by clang-format and asking whether you would like to apply them. The invocation is simple as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./autoformat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will overwrite your code with the properly formatted version. It is recommended that you do not do this blindly, as clang-format has some issues with detecting file types and may occasionally eat your work. Please read the diff and determine which changes will be made. If your version of clang-format is bugged and suggesting destructive changes, manually apply the correct changes and run `git-commit --no-verify` to bypass clang-format entirely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== C++ Code Formatting Guide ==&lt;br /&gt;
&lt;br /&gt;
This section documents syntax and style guidelines that should be followed across the codebase.&lt;br /&gt;
&lt;br /&gt;
Names should be concise and clear. They should easily communicate the purpose of object they represent. Names should not have type or qualifier information embedded in the name (the so-called [http://en.wikipedia.org/wiki/Hungarian_notation Systems Hungarian] notation). If a name isn't clear, it will cause confusion further down the line when someone else is editing your code.&lt;br /&gt;
&lt;br /&gt;
If a function or variable refers to a quantity (e.g. atmospheric pressure, distance, etc.), please make sure it is well documented, including any assumptions it makes about the value and unit of the quantity. Unknowingly multiplying a value in Parsecs by a value in millimeters can take a while to track down, and it's very frustrating to everyone who has to debug it.&lt;br /&gt;
&lt;br /&gt;
There are a few abbreviated names that are commonly used throughout the codebase, eg &amp;lt;code&amp;gt;Renderer *r&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lua_State *l&amp;lt;/code&amp;gt;, etc. Try to prefer them where appropriate.&lt;br /&gt;
&lt;br /&gt;
=== Classes ===&lt;br /&gt;
&lt;br /&gt;
Class names should be written in PascalCase like so:&lt;br /&gt;
&lt;br /&gt;
 class MyClass {};&lt;br /&gt;
&lt;br /&gt;
Structures intended to be used as an &amp;quot;integral type&amp;quot; like &amp;lt;code&amp;gt;vector3&amp;lt;/code&amp;gt; should be written in lower case:&lt;br /&gt;
&lt;br /&gt;
 struct vector3 {};&lt;br /&gt;
&lt;br /&gt;
Class-private or protected member variables should be prefixed with &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt;, using camelCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
protected:&lt;br /&gt;
    int m_someValue;&lt;br /&gt;
    std::string m_anotherValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that public member variables, especially in structures like &amp;lt;code&amp;gt;vector3&amp;lt;/code&amp;gt;, do not follow the above conventions and are written without prefix.&lt;br /&gt;
&lt;br /&gt;
Static member variables should be prefixed with &amp;lt;tt&amp;gt;s_&amp;lt;/tt&amp;gt;, using camelCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
protected:&lt;br /&gt;
    static int s_classScopeVariable;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All class functions (except those intentionally meant to follow the C++ STL's naming convention) should be written in PascalCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
public:&lt;br /&gt;
    void MyFunction() {}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This includes static functions; they use the same naming convention as member functions, but their intended use should be well documented.&lt;br /&gt;
&lt;br /&gt;
=== Global variables ===&lt;br /&gt;
&lt;br /&gt;
Global variables must be prefixed with &amp;lt;tt&amp;gt;g_&amp;lt;/tt&amp;gt;, and use camelCase:&lt;br /&gt;
&lt;br /&gt;
 int g_screenWidth;&lt;br /&gt;
&lt;br /&gt;
Please remember that raw global variables in C++ are considered bad practice; if you're writing code that uses them, you may want to rethink how you're accomplishing your goal.&lt;br /&gt;
&lt;br /&gt;
Variables with static file scope should be prefixed with &amp;lt;tt&amp;gt;s_&amp;lt;/tt&amp;gt;, and similarly use camelCase:&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 static int s_fileScopeVariable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comments == &lt;br /&gt;
&lt;br /&gt;
Generally, use the style of the file you're working on. But the below is the general principle for commenting code.&lt;br /&gt;
&lt;br /&gt;
* Use C++ comments rather than C comment blocks, unless you're writing multiple-paragraph comments.&lt;br /&gt;
* Many people work on the code, so please describe whenever function- and variable names are not enough.&lt;br /&gt;
* Especially comment when you think you're writing clever code&lt;br /&gt;
* That goes double for anything using the Lua stack manipulation functions - trailing comments showing the stack state are ''not'' overkill!&lt;br /&gt;
&lt;br /&gt;
For documenting C++ functions one can use three slashes (&amp;lt;code&amp;gt;///&amp;lt;/code&amp;gt;) or the Javadoc style (&amp;lt;code&amp;gt;/** ... */&amp;lt;/code&amp;gt;) and it will be picked up by [http://doxygen.nl/manual/docblocks.html Doxygen]:&lt;br /&gt;
&lt;br /&gt;
 /// &lt;br /&gt;
 /// Function to be used only if user is willing to accept the return type&lt;br /&gt;
 /// Do not use if prone to depression.&lt;br /&gt;
 /// &lt;br /&gt;
 void meaningOfLife()&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * \brief Function documented by a Javadoc-style comment&lt;br /&gt;
  *&lt;br /&gt;
  * This is a fun function!&lt;br /&gt;
  */&lt;br /&gt;
 void Explode()&lt;br /&gt;
&lt;br /&gt;
Leading asterisks in Javadoc-style comments are not required - if the comment starts with exactly two asterisks, Doxygen will pick it up.&lt;br /&gt;
&lt;br /&gt;
When not writing Doxygen documentation comments, please use regular C++ style (&amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;) comments.&lt;br /&gt;
&lt;br /&gt;
 // Regular comment in code for other programmers mucking about (example code from Quake3):&lt;br /&gt;
&lt;br /&gt;
 float InvSqrt (float x){&lt;br /&gt;
     float xhalf = 0.5f*x;&lt;br /&gt;
     int i = *(int*)&amp;amp;x;&lt;br /&gt;
     &lt;br /&gt;
     // I really should have documented this&lt;br /&gt;
     i = 0x5f3759df - (i&amp;gt;&amp;gt;1);  &lt;br /&gt;
     &lt;br /&gt;
     x = *(float*)&amp;amp;i;&lt;br /&gt;
     x = x*(1.5f - xhalf*x*x);&lt;br /&gt;
     return x;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Please make sure your comments are informative - they should provide information to future programmers that might not be obvious from reading the variable names:&lt;br /&gt;
&lt;br /&gt;
 // entered if we are flying&lt;br /&gt;
 // (BAD!)&lt;br /&gt;
 if(isFlying)&lt;br /&gt;
 {&lt;br /&gt;
     // If the atmospheric pressure exceeds the crush point of the hull (as expressed in arbitrary units)&lt;br /&gt;
     // we, naturally, explode.&lt;br /&gt;
     // (GOOD!)&lt;br /&gt;
     if (GetAtmoPressure() &amp;gt; 5103.0 / m_maxBar) {&lt;br /&gt;
         Explode();&lt;br /&gt;
&lt;br /&gt;
If something is broken, or temporarily disabled, or needs re-thinking, make use of TODO markers at the beginning of your code. Most modern IDEs have plugins to display these comments neatly so future programmers can easily see work that needs to be done:&lt;br /&gt;
&lt;br /&gt;
 // FIXME(sturnclaw): add a better interface for retrieving a global time source&lt;br /&gt;
 // TODO: re-initialise the turntable style view position from the current mouselook view&lt;br /&gt;
 // HACK: attempt to recognise `foo_3.png' style names&lt;br /&gt;
&lt;br /&gt;
Signing your comments (e.g. &amp;lt;code&amp;gt;FIXME(sturnclaw):&amp;lt;/code&amp;gt;) isn't required, but is good practice if the TODO is about something you intend to work on further.&lt;br /&gt;
&lt;br /&gt;
=== Lua API Documentation ===&lt;br /&gt;
&lt;br /&gt;
For [https://pioneerspacesim.net/codedoc/ LuaAPI] documentation we use NaturalDocs v2; this documentation is pulled from C++ and lua source files. This documentation follows the NaturalDocs [https://www.naturaldocs.org/getting_started/documenting_your_code/ conventions].&lt;br /&gt;
&lt;br /&gt;
The syntax is very simple and easy to work with. Leading asterisks on each line of documentation are optional; NaturalDocs will read regular block comments as well.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * Method: Fly&lt;br /&gt;
  *&lt;br /&gt;
  * Fly high in the sky&lt;br /&gt;
  *&lt;br /&gt;
  * &amp;gt; ship:fly()&lt;br /&gt;
  *&lt;br /&gt;
  * Availability:&lt;br /&gt;
  *&lt;br /&gt;
  *  2015&lt;br /&gt;
  *&lt;br /&gt;
  * Status:&lt;br /&gt;
  *&lt;br /&gt;
  *  experimental&lt;br /&gt;
  */&lt;br /&gt;
 static int l_fly_high_in_the_sky(lua_State *l)&lt;br /&gt;
 {&lt;br /&gt;
         // code goes here&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Constants and Macros ==&lt;br /&gt;
&lt;br /&gt;
When defining file or class-scope constants, never use &amp;lt;code&amp;gt;#define&amp;lt;/code&amp;gt; - prefer C++ static constants or better yet &amp;lt;code&amp;gt;constexpr&amp;lt;/code&amp;gt; where possible.&lt;br /&gt;
&lt;br /&gt;
 static const double M_PI = 3.14159;&lt;br /&gt;
 static constexpr double M_PI = 3.14159;&lt;br /&gt;
&lt;br /&gt;
The use of macros should be kept to a minimum - using a macro in a local scope to reduce boilerplate is acceptable, but macros in headers should only be used when there is no other alternative. Remember to always &amp;lt;code&amp;gt;#undef&amp;lt;/code&amp;gt; local macros as soon as they are done being used to prevent accidental name pollution and other issues.&lt;br /&gt;
&lt;br /&gt;
== Include guards ==&lt;br /&gt;
&lt;br /&gt;
Pioneer is (slowly and unofficially) moving away from include guards and using &amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt; as it's easier, less accident-prone (name collisions anyone?), and well supported by all modern compilers. However, we're not rejecting code using include guards instead.&lt;br /&gt;
&lt;br /&gt;
Header include guards should be named for the filename of the header, capitalised, with slashes converted to underscores:&lt;br /&gt;
&lt;br /&gt;
 // Ship.h&lt;br /&gt;
 #ifndef SHIP_H&lt;br /&gt;
&lt;br /&gt;
 // WorldView.h&lt;br /&gt;
 #ifndef WORLDVIEW_H&lt;br /&gt;
&lt;br /&gt;
 // graphics/Renderer.h&lt;br /&gt;
 #ifndef GRAPHICS_RENDERER_H&lt;br /&gt;
&lt;br /&gt;
== Enum types ==&lt;br /&gt;
&lt;br /&gt;
Prefer using C++ style &amp;lt;tt&amp;gt;enum class&amp;lt;/tt&amp;gt; declarations when writing new code. They're slightly more difficult to serialize (although only to the extent of requiring a &amp;lt;code&amp;gt;static_cast&amp;lt;/code&amp;gt;), but they encourage much more correct code.&lt;br /&gt;
&lt;br /&gt;
No matter which style of enum you're using, try to follow these guidelines:&lt;br /&gt;
* Avoid assigning explicit integer values.&lt;br /&gt;
* Also avoid values that aren't actually valid for whatever the enum is (though *_MAX to mark the last valid value is usually acceptable).&lt;br /&gt;
* If these don't work, chances are what you're trying to do would be better served by multiple enums or even a whole class.&lt;br /&gt;
&lt;br /&gt;
=== C-style Enums ===&lt;br /&gt;
&lt;br /&gt;
Enums are effectively global constants, so should be in full caps. They're prefixed with the name of the enum.&lt;br /&gt;
&lt;br /&gt;
    enum Thing {&lt;br /&gt;
        THING_FOO,&lt;br /&gt;
        THING_BAR,&lt;br /&gt;
        THING_BAZ,&lt;br /&gt;
        &lt;br /&gt;
        THING_MAX&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
If you're writing new code and can't use C++-style enum classes, consider using C-style enums scoped in a struct to avoid polluting the global namespace.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Thing {&lt;br /&gt;
    enum Thing {&lt;br /&gt;
        Foo,&lt;br /&gt;
        Bar,&lt;br /&gt;
        Baz,&lt;br /&gt;
&lt;br /&gt;
        THING_MAX&lt;br /&gt;
    };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C++-style Enum Class ===&lt;br /&gt;
&lt;br /&gt;
C++ style enums are closer to classes, and thus they (and their members) should use PascalCase.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum class Thing : uint8_t {&lt;br /&gt;
    Foo,&lt;br /&gt;
    Bar,&lt;br /&gt;
    Baz&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3904</id>
		<title>Coding Conventions</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3904"/>
		<updated>2020-05-11T02:00:25Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes some of the code style used in Pioneer. As of 2019, we rely on clang to do our code-formatting checks for us. This means a Pull Request (PR) with incorrectly formatted code will fail the automated test. Please read [[Coding Conventions|Code Formatting]] for how to avoid this, and how to have our clang-format.sh script check your code before committing.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
&lt;br /&gt;
Engine and Lua code is licensed under [http://www.gnu.org/licenses/gpl.html GPL v3].&lt;br /&gt;
&lt;br /&gt;
Assets (including Lua-based data files like custom systems) are licensed under [http://creativecommons.org/licenses/by-sa/3.0/ CC-BY-SA 3.0].&lt;br /&gt;
&lt;br /&gt;
When submitting a file to the Pioneer repository, be sure to include these two lines at the top of each file (suitably commented):&lt;br /&gt;
&lt;br /&gt;
    Copyright © 2008-2020 Pioneer Developers. See AUTHORS.txt for details&lt;br /&gt;
    Licensed under the terms of the GPL v3. See licenses/GPL-3.txt&lt;br /&gt;
&lt;br /&gt;
    Copyright © 2008-2020 Pioneer Developers. See AUTHORS.txt for details&lt;br /&gt;
    Licensed under the terms of CC-BY-SA 3.0. See licenses/CC-BY-SA-3.0.txt&lt;br /&gt;
&lt;br /&gt;
== Tabs &amp;amp; spacing ==&lt;br /&gt;
&lt;br /&gt;
These standards are agreed upon for both C++ and Lua code - please make very sure to follow them!&lt;br /&gt;
&lt;br /&gt;
* Hard tabs, 4-space aligned.&lt;br /&gt;
* Indent function arguments broken across multiple lines by one tab '''only'''. Do not add extra spaces to &amp;quot;line up&amp;quot; arguments with the opening parethesis.&lt;br /&gt;
* No trailing spaces, and don't indent blank lines&lt;br /&gt;
* Attention MS Windows users: lines end with Line Feed (LF), not Carriage Return (CR) or both (CRLF). If you can not fix it in your editor, git can do it for you [http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#Formatting-and-Whitespace using the configuration option].&lt;br /&gt;
&lt;br /&gt;
Some of our code doesn't follow this standard; if you're fixing up older indentation styles, please make sure to '''do that in its own commit''' so that other developers can review your changes more easily.&lt;br /&gt;
&lt;br /&gt;
== Code Formatting ==&lt;br /&gt;
&lt;br /&gt;
The Pioneer C++ codebase has an enforced common coding style, managed by running the &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; tool. This is run by the Travis CI provider for all pull requests, and may also be run locally as a [https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks git hook]. If your Pull Request is displaying a red X or a message saying &amp;quot;All checks have failed&amp;quot;, it is likely that your code has inadvertently broken the C++ code style that Pioneer uses.&lt;br /&gt;
&lt;br /&gt;
=== Diagnosing Formatting Issues ===&lt;br /&gt;
&lt;br /&gt;
If your Pull Request is in violation of Pioneer's code formatting rules, you can look at the Travis log to find out what parts of your code are specifically to blame. Click &amp;quot;Details&amp;quot; next to &amp;quot;The Travis CI build has failed&amp;quot; at the bottom of the Pull Request page, and select the &amp;quot;Static Checks&amp;quot; job from the resulting page. In the log below, the differences between your code and the correctly formatted code will be listed in [https://linux.die.net/man/1/diff diff(1)] format.&lt;br /&gt;
&lt;br /&gt;
=== Installing a Git Hook ===&lt;br /&gt;
&lt;br /&gt;
Looking at the Travis log to find out what changed is fine and well, but what you really should be doing is using a git hook to validate your code ''before'' you commit your changes. This process is very simple if you are developing on a Mac or Linux system - simply copy the pre-provided git hook into your local repository's &amp;lt;code&amp;gt;hooks/&amp;lt;/code&amp;gt; directory. A pre-commit hook is not currently available for Windows systems. If you know how to reliably set one up, you are more than welcome to author it and submit it as a Pull Request.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp scripts/clang-format.sh .git/hooks/pre-commit-hook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have installed the hook, simply run &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; as normal. If your code doesn't comply with the C++ style rules, it will abort the commit and print the difference between your code and the properly formatted code to the console. If it succeeds, it will open an editor as normal.&lt;br /&gt;
&lt;br /&gt;
If, for some reason, you wish to bypass the validation hook, simply run &amp;lt;code&amp;gt;git commit --no-verify&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Applying The Format Changes ===&lt;br /&gt;
&lt;br /&gt;
Once you know which files are improperly formatted, and what changes need to be made to fix them, you have two options. The first option is to manually apply the required changes to your code, and submit them as a new commit. Alternatively, you can use the automatic formatting tool. The interface is simple, presenting you with the list of changes made by clang-format and asking whether you would like to apply them. The invocation is simple as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./autoformat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will overwrite your code with the properly formatted version. It is recommended that you do not do this blindly, as clang-format has some issues with detecting file types and may occasionally eat your work. Please read the diff and determine which changes will be made. If your version of clang-format is bugged and suggesting destructive changes, manually apply the correct changes and run `git-commit --no-verify` to bypass clang-format entirely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== C++ Code Formatting Guide ==&lt;br /&gt;
&lt;br /&gt;
This section documents syntax and style guidelines that should be followed across the codebase.&lt;br /&gt;
&lt;br /&gt;
Names should be concise and clear. They should easily communicate the purpose of object they represent. Names should not have type or qualifier information embedded in the name (the so-called [http://en.wikipedia.org/wiki/Hungarian_notation Systems Hungarian] notation). If a name isn't clear, it will cause confusion further down the line when someone else is editing your code.&lt;br /&gt;
&lt;br /&gt;
If a function or variable refers to a quantity (e.g. atmospheric pressure, distance, etc.), please make sure it is well documented, including any assumptions it makes about the value and unit of the quantity. Unknowingly multiplying a value in Parsecs by a value in millimeters can take a while to track down, and it's very frustrating to everyone who has to debug it.&lt;br /&gt;
&lt;br /&gt;
There are a few abbreviated names that are commonly used throughout the codebase, eg &amp;lt;code&amp;gt;Renderer *r&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lua_State *l&amp;lt;/code&amp;gt;, etc. Try to prefer them where appropriate.&lt;br /&gt;
&lt;br /&gt;
=== Classes ===&lt;br /&gt;
&lt;br /&gt;
Class names should be written in PascalCase like so:&lt;br /&gt;
&lt;br /&gt;
 class MyClass {};&lt;br /&gt;
&lt;br /&gt;
Structures intended to be used as an &amp;quot;integral type&amp;quot; like &amp;lt;code&amp;gt;vector3&amp;lt;/code&amp;gt; should be written in lower case:&lt;br /&gt;
&lt;br /&gt;
 struct vector3 {};&lt;br /&gt;
&lt;br /&gt;
Class-private or protected member variables should be prefixed with &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt;, using camelCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
protected:&lt;br /&gt;
    int m_someValue;&lt;br /&gt;
    std::string m_anotherValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that public member variables, especially in structures like &amp;lt;code&amp;gt;vector3&amp;lt;/code&amp;gt;, do not follow the above conventions and are written without prefix.&lt;br /&gt;
&lt;br /&gt;
Static member variables should be prefixed with &amp;lt;tt&amp;gt;s_&amp;lt;/tt&amp;gt;, using camelCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
protected:&lt;br /&gt;
    static int s_classScopeVariable;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All class functions (except those intentionally meant to follow the C++ STL's naming convention) should be written in PascalCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
public:&lt;br /&gt;
    void MyFunction() {}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This includes static functions; they use the same naming convention as member functions, but their intended use should be well documented.&lt;br /&gt;
&lt;br /&gt;
=== Global variables ===&lt;br /&gt;
&lt;br /&gt;
Global variables must be prefixed with &amp;lt;tt&amp;gt;g_&amp;lt;/tt&amp;gt;, and use camelCase:&lt;br /&gt;
&lt;br /&gt;
 int g_screenWidth;&lt;br /&gt;
&lt;br /&gt;
Please remember that raw global variables in C++ are considered bad practice; if you're writing code that uses them, you may want to rethink how you're accomplishing your goal.&lt;br /&gt;
&lt;br /&gt;
Variables with static file scope should be prefixed with &amp;lt;tt&amp;gt;s_&amp;lt;/tt&amp;gt;, and similarly use camelCase:&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 static int s_fileScopeVariable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comments == &lt;br /&gt;
&lt;br /&gt;
Generally, use the style of the file you're working on. But the below is the general principle for commenting code.&lt;br /&gt;
&lt;br /&gt;
* Use C++ comments rather than C comment blocks, unless you're writing multiple-paragraph comments.&lt;br /&gt;
* Many people work on the code, so please describe whenever function- and variable names are not enough.&lt;br /&gt;
* Especially comment when you think you're writing clever code&lt;br /&gt;
* That goes double for anything using the Lua stack manipulation functions - trailing comments showing the stack state are ''not'' overkill!&lt;br /&gt;
&lt;br /&gt;
For documenting C++ functions one can use three slashes (&amp;lt;code&amp;gt;///&amp;lt;/code&amp;gt;) or the Javadoc style (&amp;lt;code&amp;gt;/** ... */&amp;lt;/code&amp;gt;) and it will be picked up by [http://doxygen.nl/manual/docblocks.html Doxygen]:&lt;br /&gt;
&lt;br /&gt;
 /// &lt;br /&gt;
 /// Function to be used only if user is willing to accept the return type&lt;br /&gt;
 /// Do not use if prone to depression.&lt;br /&gt;
 /// &lt;br /&gt;
 void meaningOfLife()&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * \brief Function documented by a Javadoc-style comment&lt;br /&gt;
  *&lt;br /&gt;
  * This is a fun function!&lt;br /&gt;
  */&lt;br /&gt;
 void Explode()&lt;br /&gt;
&lt;br /&gt;
Leading asterisks in Javadoc-style comments are not required - if the comment starts with exactly two asterisks, Doxygen will pick it up.&lt;br /&gt;
&lt;br /&gt;
When not writing Doxygen documentation comments, please use regular C++ style (&amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;) comments.&lt;br /&gt;
&lt;br /&gt;
 // Regular comment in code for other programmers mucking about (example code from Quake3):&lt;br /&gt;
&lt;br /&gt;
 float InvSqrt (float x){&lt;br /&gt;
     float xhalf = 0.5f*x;&lt;br /&gt;
     int i = *(int*)&amp;amp;x;&lt;br /&gt;
     &lt;br /&gt;
     // I really should have documented this&lt;br /&gt;
     i = 0x5f3759df - (i&amp;gt;&amp;gt;1);  &lt;br /&gt;
     &lt;br /&gt;
     x = *(float*)&amp;amp;i;&lt;br /&gt;
     x = x*(1.5f - xhalf*x*x);&lt;br /&gt;
     return x;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Please make sure your comments are informative - they should provide information to future programmers that might not be obvious from reading the variable names:&lt;br /&gt;
&lt;br /&gt;
 // entered if we are flying&lt;br /&gt;
 // (BAD!)&lt;br /&gt;
 if(isFlying)&lt;br /&gt;
 {&lt;br /&gt;
     // If the atmospheric pressure exceeds the crush point of the hull (as expressed in arbitrary units)&lt;br /&gt;
     // we, naturally, explode.&lt;br /&gt;
     // (GOOD!)&lt;br /&gt;
     if (GetAtmoPressure() &amp;gt; 5103.0 / m_maxBar) {&lt;br /&gt;
         Explode();&lt;br /&gt;
&lt;br /&gt;
If something is broken, or temporarily disabled, or needs re-thinking, make use of TODO markers at the beginning of your code. Most modern IDEs have plugins to display these comments neatly so future programmers can easily see work that needs to be done:&lt;br /&gt;
&lt;br /&gt;
 // FIXME(sturnclaw): add a better interface for retrieving a global time source&lt;br /&gt;
 // TODO: re-initialise the turntable style view position from the current mouselook view&lt;br /&gt;
 // HACK: attempt to recognise `foo_3.png' style names&lt;br /&gt;
&lt;br /&gt;
Signing your comments (e.g. &amp;lt;code&amp;gt;FIXME(sturnclaw):&amp;lt;/code&amp;gt;) isn't required, but is good practice if the TODO is about something you intend to work on further.&lt;br /&gt;
&lt;br /&gt;
=== Lua API Documentation ===&lt;br /&gt;
&lt;br /&gt;
For [https://pioneerspacesim.net/codedoc/ LuaAPI] documentation we use NaturalDocs v2; this documentation is pulled from C++ and lua source files. This documentation follows the NaturalDocs [https://www.naturaldocs.org/getting_started/documenting_your_code/ conventions].&lt;br /&gt;
&lt;br /&gt;
The syntax is very simple and easy to work with. Leading asterisks on each line of documentation are optional; NaturalDocs will read regular block comments as well.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * Method: Fly&lt;br /&gt;
  *&lt;br /&gt;
  * Fly high in the sky&lt;br /&gt;
  *&lt;br /&gt;
  * &amp;gt; ship:fly()&lt;br /&gt;
  *&lt;br /&gt;
  * Availability:&lt;br /&gt;
  *&lt;br /&gt;
  *  2015&lt;br /&gt;
  *&lt;br /&gt;
  * Status:&lt;br /&gt;
  *&lt;br /&gt;
  *  experimental&lt;br /&gt;
  */&lt;br /&gt;
 static int l_fly_high_in_the_sky(lua_State *l)&lt;br /&gt;
 {&lt;br /&gt;
         // code goes here&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Constants and Macros ==&lt;br /&gt;
&lt;br /&gt;
When defining file or class-scope constants, never use &amp;lt;code&amp;gt;#define&amp;lt;/code&amp;gt; - prefer C++ static constants or better yet &amp;lt;code&amp;gt;constexpr&amp;lt;/code&amp;gt; where possible.&lt;br /&gt;
&lt;br /&gt;
 static const double M_PI = 3.14159;&lt;br /&gt;
 static constexpr double M_PI = 3.14159;&lt;br /&gt;
&lt;br /&gt;
The use of macros should be kept to a minimum - using a macro in a local scope to reduce boilerplate is acceptable, but macros in headers should only be used when there is no other alternative. Remember to always &amp;lt;code&amp;gt;#undef&amp;lt;/code&amp;gt; local macros as soon as they are done being used to prevent accidental name pollution and other issues.&lt;br /&gt;
&lt;br /&gt;
== Include guards ==&lt;br /&gt;
&lt;br /&gt;
Pioneer is (slowly and unofficially) moving away from include guards and using &amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt; as it's easier, less accident-prone (name collisions anyone?), and well supported by all modern compilers. However, we're not rejecting code using include guards instead.&lt;br /&gt;
&lt;br /&gt;
Header include guards should be named for the filename of the header, capitalised, with slashes converted to underscores:&lt;br /&gt;
&lt;br /&gt;
 // Ship.h&lt;br /&gt;
 #ifndef SHIP_H&lt;br /&gt;
&lt;br /&gt;
 // WorldView.h&lt;br /&gt;
 #ifndef WORLDVIEW_H&lt;br /&gt;
&lt;br /&gt;
 // graphics/Renderer.h&lt;br /&gt;
 #ifndef GRAPHICS_RENDERER_H&lt;br /&gt;
&lt;br /&gt;
== Enum types ==&lt;br /&gt;
&lt;br /&gt;
Prefer using C++ style &amp;lt;tt&amp;gt;enum class&amp;lt;/tt&amp;gt; declarations when writing new code. They're slightly more difficult to serialize (although only to the extent of requiring a &amp;lt;code&amp;gt;static_cast&amp;lt;/code&amp;gt;), but they encourage much more correct code.&lt;br /&gt;
&lt;br /&gt;
No matter which style of enum you're using, try to follow these guidelines:&lt;br /&gt;
* Avoid assigning explicit integer values.&lt;br /&gt;
* Also avoid values that aren't actually valid for whatever the enum is (though *_MAX to mark the last valid value is usually acceptable).&lt;br /&gt;
* If these don't work, chances are what you're trying to do would be better served by multiple enums or even a whole class.&lt;br /&gt;
&lt;br /&gt;
=== C-style Enums ===&lt;br /&gt;
&lt;br /&gt;
Enums are effectively global constants, so should be in full caps. They're prefixed with the name of the enum.&lt;br /&gt;
&lt;br /&gt;
    enum Thing {&lt;br /&gt;
        THING_FOO,&lt;br /&gt;
        THING_BAR,&lt;br /&gt;
        THING_BAZ,&lt;br /&gt;
        &lt;br /&gt;
        THING_MAX&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
=== C++-style Enum Class ===&lt;br /&gt;
&lt;br /&gt;
C++ style enums are closer to classes, and thus they (and their members) should use PascalCase.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum class Thing : uint8_t {&lt;br /&gt;
    Foo,&lt;br /&gt;
    Bar,&lt;br /&gt;
    Baz&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your enumeration only contains valid values - if you need a &amp;lt;tt&amp;gt;_Max&amp;lt;/tt&amp;gt; element, consider using C-style enums scoped in a struct to avoid polluting the global namespace.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Thing {&lt;br /&gt;
    enum Thing {&lt;br /&gt;
        Foo,&lt;br /&gt;
        Bar,&lt;br /&gt;
        Baz,&lt;br /&gt;
&lt;br /&gt;
        THING_MAX&lt;br /&gt;
    };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3903</id>
		<title>Coding Conventions</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3903"/>
		<updated>2020-05-11T01:58:53Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Unify coding style convention documentation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes some of the code style used in Pioneer. As of 2019, we rely on clang to do our code-formatting checks for us. This means a Pull Request (PR) with incorrectly formatted code will fail the automated test. Please read [[Coding Conventions|Code Formatting]] for how to avoid this, and how to have our clang-format.sh script check your code before committing.&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
&lt;br /&gt;
Engine and Lua code is licensed under [http://www.gnu.org/licenses/gpl.html GPL v3].&lt;br /&gt;
&lt;br /&gt;
Assets (including Lua-based data files like custom systems) are licensed under [http://creativecommons.org/licenses/by-sa/3.0/ CC-BY-SA 3.0].&lt;br /&gt;
&lt;br /&gt;
When submitting a file to the Pioneer repository, be sure to include these two lines at the top of each file (suitably commented):&lt;br /&gt;
&lt;br /&gt;
    Copyright © 2008-2020 Pioneer Developers. See AUTHORS.txt for details&lt;br /&gt;
    Licensed under the terms of the GPL v3. See licenses/GPL-3.txt&lt;br /&gt;
&lt;br /&gt;
    Copyright © 2008-2020 Pioneer Developers. See AUTHORS.txt for details&lt;br /&gt;
    Licensed under the terms of CC-BY-SA 3.0. See licenses/CC-BY-SA-3.0.txt&lt;br /&gt;
&lt;br /&gt;
== Tabs &amp;amp; spacing ==&lt;br /&gt;
&lt;br /&gt;
These standards are agreed upon for both C++ and Lua code - please make very sure to follow them!&lt;br /&gt;
&lt;br /&gt;
* Hard tabs, 4-space aligned.&lt;br /&gt;
* Indent function arguments broken across multiple lines by one tab '''only'''. Do not add extra spaces to &amp;quot;line up&amp;quot; arguments with the opening parethesis.&lt;br /&gt;
* No trailing spaces, and don't indent blank lines&lt;br /&gt;
* Attention MS Windows users: lines end with Line Feed (LF), not Carriage Return (CR) or both (CRLF). If you can not fix it in your editor, git can do it for you [http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#Formatting-and-Whitespace using the configuration option].&lt;br /&gt;
&lt;br /&gt;
Some of our code doesn't follow this standard; if you're fixing up older indentation styles, please make sure to '''do that in its own commit''' so that other developers can review your changes more easily.&lt;br /&gt;
&lt;br /&gt;
== Code Formatting ==&lt;br /&gt;
&lt;br /&gt;
The Pioneer C++ codebase has an enforced common coding style, managed by running the &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; tool. This is run by the Travis CI provider for all pull requests, and may also be run locally as a [https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks git hook]. If your Pull Request is displaying a red X or a message saying &amp;quot;All checks have failed&amp;quot;, it is likely that your code has inadvertently broken the C++ code style that Pioneer uses.&lt;br /&gt;
&lt;br /&gt;
=== Diagnosing Formatting Issues ===&lt;br /&gt;
&lt;br /&gt;
If your Pull Request is in violation of Pioneer's code formatting rules, you can look at the Travis log to find out what parts of your code are specifically to blame. Click &amp;quot;Details&amp;quot; next to &amp;quot;The Travis CI build has failed&amp;quot; at the bottom of the Pull Request page, and select the &amp;quot;Static Checks&amp;quot; job from the resulting page. In the log below, the differences between your code and the correctly formatted code will be listed in [https://linux.die.net/man/1/diff diff(1)] format.&lt;br /&gt;
&lt;br /&gt;
=== Installing a Git Hook ===&lt;br /&gt;
&lt;br /&gt;
Looking at the Travis log to find out what changed is fine and well, but what you really should be doing is using a git hook to validate your code ''before'' you commit your changes. This process is very simple if you are developing on a Mac or Linux system - simply copy the pre-provided git hook into your local repository's &amp;lt;code&amp;gt;hooks/&amp;lt;/code&amp;gt; directory. A pre-commit hook is not currently available for Windows systems. If you know how to reliably set one up, you are more than welcome to author it and submit it as a Pull Request.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp scripts/clang-format.sh .git/hooks/pre-commit-hook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have installed the hook, simply run &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; as normal. If your code doesn't comply with the C++ style rules, it will abort the commit and print the difference between your code and the properly formatted code to the console. If it succeeds, it will open an editor as normal.&lt;br /&gt;
&lt;br /&gt;
If, for some reason, you wish to bypass the validation hook, simply run &amp;lt;code&amp;gt;git commit --no-verify&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Applying The Format Changes ===&lt;br /&gt;
&lt;br /&gt;
Once you know which files are improperly formatted, and what changes need to be made to fix them, you have two options. The first option is to manually apply the required changes to your code, and submit them as a new commit. Alternatively, you can use the automatic formatting tool. The interface is simple, presenting you with the list of changes made by clang-format and asking whether you would like to apply them. The invocation is simple as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./autoformat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will overwrite your code with the properly formatted version. It is recommended that you do not do this blindly, as clang-format has some issues with detecting file types and may occasionally eat your work. Please read the diff and determine which changes will be made. If your version of clang-format is bugged and suggesting destructive changes, manually apply the correct changes and run `git-commit --no-verify` to bypass clang-format entirely.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== C++ Code Formatting Guide ==&lt;br /&gt;
&lt;br /&gt;
This section documents syntax and style guidelines that should be followed across the codebase.&lt;br /&gt;
&lt;br /&gt;
Names should be concise and clear. They should easily communicate the purpose of object they represent. Names should not have type or qualifier information embedded in the name (the so-called [http://en.wikipedia.org/wiki/Hungarian_notation Systems Hungarian] notation). If a name isn't clear, it will cause confusion further down the line when someone else is editing your code.&lt;br /&gt;
&lt;br /&gt;
If a function or variable refers to a quantity (e.g. atmospheric pressure, distance, etc.), please make sure it is well documented, including any assumptions it makes about the value and unit of the quantity. Unknowingly multiplying a value in Parsecs by a value in millimeters can take a while to track down, and it's very frustrating to everyone who has to debug it.&lt;br /&gt;
&lt;br /&gt;
There are a few abbreviated names that are commonly used throughout the codebase, eg &amp;lt;code&amp;gt;Renderer *r&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lua_State *l&amp;lt;/code&amp;gt;, etc. Try to prefer them where appropriate.&lt;br /&gt;
&lt;br /&gt;
=== Classes ===&lt;br /&gt;
&lt;br /&gt;
Class names should be written in PascalCase like so:&lt;br /&gt;
&lt;br /&gt;
 class MyClass {};&lt;br /&gt;
&lt;br /&gt;
Structures intended to be used as an &amp;quot;integral type&amp;quot; like &amp;lt;code&amp;gt;vector3&amp;lt;/code&amp;gt; should be written in lower case:&lt;br /&gt;
&lt;br /&gt;
 struct vector3 {};&lt;br /&gt;
&lt;br /&gt;
Class-private or protected member variables should be prefixed with &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt;, using camelCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
protected:&lt;br /&gt;
    int m_someValue;&lt;br /&gt;
    std::string m_anotherValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that public member variables, especially in structures like &amp;lt;code&amp;gt;vector3&amp;lt;/code&amp;gt;, do not follow the above conventions and are written without prefix.&lt;br /&gt;
&lt;br /&gt;
Static member variables should be prefixed with &amp;lt;tt&amp;gt;s_&amp;lt;/tt&amp;gt;, using camelCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
protected:&lt;br /&gt;
    static int s_classScopeVariable;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All class functions (except those intentionally meant to follow the C++ STL's naming convention) should be written in PascalCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
public:&lt;br /&gt;
    void MyFunction() {}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This includes static functions; they use the same naming convention as member functions, but their intended use should be well documented.&lt;br /&gt;
&lt;br /&gt;
=== Global variables ===&lt;br /&gt;
&lt;br /&gt;
Global variables must be prefixed with &amp;lt;tt&amp;gt;g_&amp;lt;/tt&amp;gt;, and use camelCase:&lt;br /&gt;
&lt;br /&gt;
 int g_screenWidth;&lt;br /&gt;
&lt;br /&gt;
Please remember that raw global variables in C++ are considered bad practice; if you're writing code that uses them, you may want to rethink how you're accomplishing your goal.&lt;br /&gt;
&lt;br /&gt;
Variables with static file scope should be prefixed with &amp;lt;tt&amp;gt;s_&amp;lt;/tt&amp;gt;, and similarly use camelCase:&lt;br /&gt;
&lt;br /&gt;
 // ...&lt;br /&gt;
 static int s_fileScopeVariable;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comments == &lt;br /&gt;
&lt;br /&gt;
Generally, use the style of the file you're working on. But the below is the general principle for commenting code.&lt;br /&gt;
&lt;br /&gt;
* Use C++ comments rather than C comment blocks, unless you're writing multiple-paragraph comments.&lt;br /&gt;
* Many people work on the code, so please describe whenever function- and variable names are not enough.&lt;br /&gt;
* Especially comment when you think you're writing clever code&lt;br /&gt;
* That goes double for anything using the Lua stack manipulation functions - trailing comments showing the stack state are ''not'' overkill!&lt;br /&gt;
&lt;br /&gt;
For documenting C++ functions one can use three slashes (&amp;lt;code&amp;gt;///&amp;lt;/code&amp;gt;) or the Javadoc style (&amp;lt;code&amp;gt;/** ... */&amp;lt;/code&amp;gt;) and it will be picked up by [http://doxygen.nl/manual/docblocks.html Doxygen]:&lt;br /&gt;
&lt;br /&gt;
 /// &lt;br /&gt;
 /// Function to be used only if user is willing to accept the return type&lt;br /&gt;
 /// Do not use if prone to depression.&lt;br /&gt;
 /// &lt;br /&gt;
 void meaningOfLife()&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * \brief Function documented by a Javadoc-style comment&lt;br /&gt;
  *&lt;br /&gt;
  * This is a fun function!&lt;br /&gt;
  */&lt;br /&gt;
 void Explode()&lt;br /&gt;
&lt;br /&gt;
Leading asterisks in Javadoc-style comments are not required - if the comment starts with exactly two asterisks, Doxygen will pick it up.&lt;br /&gt;
&lt;br /&gt;
When not writing Doxygen documentation comments, please use regular C++ style (&amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;) comments.&lt;br /&gt;
&lt;br /&gt;
 // Regular comment in code for other programmers mucking about (example code from Quake3):&lt;br /&gt;
&lt;br /&gt;
 float InvSqrt (float x){&lt;br /&gt;
     float xhalf = 0.5f*x;&lt;br /&gt;
     int i = *(int*)&amp;amp;x;&lt;br /&gt;
     &lt;br /&gt;
     // I really should have documented this&lt;br /&gt;
     i = 0x5f3759df - (i&amp;gt;&amp;gt;1);  &lt;br /&gt;
     &lt;br /&gt;
     x = *(float*)&amp;amp;i;&lt;br /&gt;
     x = x*(1.5f - xhalf*x*x);&lt;br /&gt;
     return x;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Please make sure your comments are informative - they should provide information to future programmers that might not be obvious from reading the variable names:&lt;br /&gt;
&lt;br /&gt;
 // entered if we are flying&lt;br /&gt;
 // (BAD!)&lt;br /&gt;
 if(isFlying)&lt;br /&gt;
 {&lt;br /&gt;
     // If the atmospheric pressure exceeds the crush point of the hull (as expressed in arbitrary units)&lt;br /&gt;
     // we, naturally, explode.&lt;br /&gt;
     // (GOOD!)&lt;br /&gt;
     if (GetAtmoPressure() &amp;gt; 5103.0 / m_maxBar) {&lt;br /&gt;
         Explode();&lt;br /&gt;
&lt;br /&gt;
If something is broken, or temporarily disabled, or needs re-thinking, make use of TODO markers at the beginning of your code. Most modern IDEs have plugins to display these comments neatly so future programmers can easily see work that needs to be done:&lt;br /&gt;
&lt;br /&gt;
 // FIXME(sturnclaw): add a better interface for retrieving a global time source&lt;br /&gt;
 // TODO: re-initialise the turntable style view position from the current mouselook view&lt;br /&gt;
 // HACK: attempt to recognise `foo_3.png' style names&lt;br /&gt;
&lt;br /&gt;
Signing your comments (e.g. &amp;lt;code&amp;gt;FIXME(sturnclaw):&amp;lt;/code&amp;gt;) isn't required, but is good practice if the TODO is about something you intend to work on further.&lt;br /&gt;
&lt;br /&gt;
=== Lua API Documentation ===&lt;br /&gt;
&lt;br /&gt;
For [https://pioneerspacesim.net/codedoc/ LuaAPI] documentation we use NaturalDocs v2; this documentation is pulled from C++ and lua source files. This documentation follows the NaturalDocs [https://www.naturaldocs.org/getting_started/documenting_your_code/ conventions].&lt;br /&gt;
&lt;br /&gt;
The syntax is very simple and easy to work with. Leading asterisks on each line of documentation are optional; NaturalDocs will read regular block comments as well.&lt;br /&gt;
&lt;br /&gt;
 /*&lt;br /&gt;
  * Method: Fly&lt;br /&gt;
  *&lt;br /&gt;
  * Fly high in the sky&lt;br /&gt;
  *&lt;br /&gt;
  * &amp;gt; ship:fly()&lt;br /&gt;
  *&lt;br /&gt;
  * Availability:&lt;br /&gt;
  *&lt;br /&gt;
  *  2015&lt;br /&gt;
  *&lt;br /&gt;
  * Status:&lt;br /&gt;
  *&lt;br /&gt;
  *  experimental&lt;br /&gt;
  */&lt;br /&gt;
 static int l_fly_high_in_the_sky(lua_State *l)&lt;br /&gt;
 {&lt;br /&gt;
         // code goes here&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Constants and Macros ==&lt;br /&gt;
&lt;br /&gt;
When defining file or class-scope constants, never use &amp;lt;code&amp;gt;#define&amp;lt;/code&amp;gt; - prefer C++ static constants or better yet &amp;lt;code&amp;gt;constexpr&amp;lt;/code&amp;gt; where possible.&lt;br /&gt;
&lt;br /&gt;
 static const double M_PI = 3.14159;&lt;br /&gt;
 static constexpr double M_PI = 3.14159;&lt;br /&gt;
&lt;br /&gt;
The use of macros should be kept to a minimum - using a macro in a local scope to reduce boilerplate is acceptable, but macros in headers should only be used when there is no other alternative. Remember to always &amp;lt;code&amp;gt;#undef&amp;lt;code&amp;gt; local macros as soon as they are done being used to prevent accidental name pollution and other issues.&lt;br /&gt;
&lt;br /&gt;
== Include guards ==&lt;br /&gt;
&lt;br /&gt;
Pioneer is (slowly and unofficially) moving away from include guards and using &amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt; as it's easier, less accident-prone (name collisions anyone?), and well supported by all modern compilers. However, we're not rejecting code using include guards instead.&lt;br /&gt;
&lt;br /&gt;
Header include guards should be named for the filename of the header, capitalised, with slashes converted to underscores:&lt;br /&gt;
&lt;br /&gt;
 // Ship.h&lt;br /&gt;
 #ifndef SHIP_H&lt;br /&gt;
&lt;br /&gt;
 // WorldView.h&lt;br /&gt;
 #ifndef WORLDVIEW_H&lt;br /&gt;
&lt;br /&gt;
 // graphics/Renderer.h&lt;br /&gt;
 #ifndef GRAPHICS_RENDERER_H&lt;br /&gt;
&lt;br /&gt;
== Enum types ==&lt;br /&gt;
&lt;br /&gt;
Prefer using C++ style &amp;lt;tt&amp;gt;enum class&amp;lt;/tt&amp;gt; declarations when writing new code. They're slightly more difficult to serialize (although only to the extent of requiring a &amp;lt;code&amp;gt;static_cast&amp;lt;/code&amp;gt;), but they encourage much more correct code.&lt;br /&gt;
&lt;br /&gt;
No matter which style of enum you're using, try to follow these guidelines:&lt;br /&gt;
* Avoid assigning explicit integer values.&lt;br /&gt;
* Also avoid values that aren't actually valid for whatever the enum is (though *_MAX to mark the last valid value is usually acceptable).&lt;br /&gt;
* If these don't work, chances are what you're trying to do would be better served by multiple enums or even a whole class.&lt;br /&gt;
&lt;br /&gt;
=== C-style Enums ===&lt;br /&gt;
&lt;br /&gt;
Enums are effectively global constants, so should be in full caps. They're prefixed with the name of the enum.&lt;br /&gt;
&lt;br /&gt;
    enum Thing {&lt;br /&gt;
        THING_FOO,&lt;br /&gt;
        THING_BAR,&lt;br /&gt;
        THING_BAZ,&lt;br /&gt;
        &lt;br /&gt;
        THING_MAX&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
=== C++-style Enum Class ===&lt;br /&gt;
&lt;br /&gt;
C++ style enums are closer to classes, and thus they (and their members) should use PascalCase.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum class Thing : uint8_t {&lt;br /&gt;
    Foo,&lt;br /&gt;
    Bar,&lt;br /&gt;
    Baz&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure your enumeration only contains valid values - if you need a &amp;lt;tt&amp;gt;_Max&amp;lt;/tt&amp;gt; element, consider using C-style enums scoped in a struct to avoid polluting the global namespace.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Thing {&lt;br /&gt;
    enum Thing {&lt;br /&gt;
        Foo,&lt;br /&gt;
        Bar,&lt;br /&gt;
        Baz,&lt;br /&gt;
&lt;br /&gt;
        THING_MAX&lt;br /&gt;
    };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3902</id>
		<title>Coding Conventions</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3902"/>
		<updated>2020-05-11T00:24:00Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Update text and markup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Classes ===&lt;br /&gt;
&lt;br /&gt;
Class names should be written in PascalCase like so:&lt;br /&gt;
&lt;br /&gt;
 class MyClass {};&lt;br /&gt;
&lt;br /&gt;
Class-private or protected member variables should be prefixed with &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt;, using camelCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
protected:&lt;br /&gt;
    int m_someValue;&lt;br /&gt;
    std::string m_anotherValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that to avoid verbosity the above is not followed for structures with public data members, like &amp;lt;tt&amp;gt;vector3&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
All class functions (except those intentionally meant to follow the C++ STL's naming convention) should be written in PascalCase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
public:&lt;br /&gt;
    void MyFunction() {}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Global variables ===&lt;br /&gt;
&lt;br /&gt;
Global variables must be prefixed with &amp;lt;tt&amp;gt;g_&amp;lt;/tt&amp;gt;, and use camelCase:&lt;br /&gt;
&lt;br /&gt;
 int g_screenWidth;&lt;br /&gt;
&lt;br /&gt;
Please remember that raw global variables in C++ are considered bad practice; if you're writing code that uses them, you may want to rethink how you're accomplishing your goal.&lt;br /&gt;
&lt;br /&gt;
Variables with static scope should be prefixed with &amp;lt;tt&amp;gt;s_&amp;lt;/tt&amp;gt;, and similarly use camelCase:&lt;br /&gt;
&lt;br /&gt;
 static int s_classScopeVariable;&lt;br /&gt;
 // ...&lt;br /&gt;
 static int s_fileScopeVariable;&lt;br /&gt;
&lt;br /&gt;
== Code Formatting ==&lt;br /&gt;
&lt;br /&gt;
The Pioneer C++ codebase has an enforced common coding style, managed by running the &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; tool. This is run by the Travis CI provider for all pull requests, and may also be run locally as a [https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks git hook]. If your Pull Request is displaying a red X or a message saying &amp;quot;All checks have failed&amp;quot;, it is likely that your code has inadvertently broken the C++ code style that Pioneer uses.&lt;br /&gt;
&lt;br /&gt;
=== Diagnosing Formatting Issues ===&lt;br /&gt;
&lt;br /&gt;
If your Pull Request is in violation of Pioneer's code formatting rules, you can look at the Travis log to find out what parts of your code are specifically to blame. Click &amp;quot;Details&amp;quot; next to &amp;quot;The Travis CI build has failed&amp;quot; at the bottom of the Pull Request page, and select the &amp;quot;Static Checks&amp;quot; job from the resulting page. In the log below, the differences between your code and the correctly formatted code will be listed in [https://linux.die.net/man/1/diff diff(1)] format.&lt;br /&gt;
&lt;br /&gt;
=== Installing a Git Hook ===&lt;br /&gt;
&lt;br /&gt;
Looking at the Travis log to find out what changed is fine and well, but what you really should be doing is using a git hook to validate your code ''before'' you commit your changes. This process is very simple if you are developing on a Mac or Linux system - simply copy the pre-provided git hook into your local repository's &amp;lt;code&amp;gt;hooks/&amp;lt;/code&amp;gt; directory. A pre-commit hook is not currently available for Windows systems. If you know how to reliably set one up, you are more than welcome to author it and submit it as a Pull Request.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp scripts/clang-format.sh .git/hooks/pre-commit-hook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have installed the hook, simply run &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; as normal. If your code doesn't comply with the C++ style rules, it will abort the commit and print the difference between your code and the properly formatted code to the console. If it succeeds, it will open an editor as normal.&lt;br /&gt;
&lt;br /&gt;
If, for some reason, you wish to bypass the validation hook, simply run &amp;lt;code&amp;gt;git commit --no-verify&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Applying The Format Changes ===&lt;br /&gt;
&lt;br /&gt;
Once you know which files are improperly formatted, and what changes need to be made to fix them, you have two options. The first option is to manually apply the required changes to your code, and submit them as a new commit. Alternatively, you can use the automatic formatting tool. The interface is simple, presenting you with the list of changes made by clang-format and asking whether you would like to apply them. The invocation is simple as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./autoformat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will overwrite your code with the properly formatted version. It is recommended that you do not do this blindly, as clang-format has some issues with detecting file types and may occasionally eat your work. Please read the diff and determine which changes will be made. If your version of clang-format is bugged and suggesting destructive changes, manually apply the correct changes and run `git-commit --no-verify` to bypass clang-format entirely.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=3896</id>
		<title>Pioneer Wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=3896"/>
		<updated>2020-02-18T03:14:02Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: /* The Pioneer Universe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Pioneer is a space adventure game set in the Milkyway galaxy at the turn of the 31st century. The game is open-ended, and you are free to explore the millions of star systems in the game. You can land on planets, slingshot past gas giants, and burn yourself to a crisp flying between binary star systems.&lt;br /&gt;
&lt;br /&gt;
If you are new to pioneer you may want to know [[How_to_start|how to start]].&lt;br /&gt;
&lt;br /&gt;
*[http://pioneerspacesim.net/download Download Pioneer] for Windows, Linux and Mac OSX &lt;br /&gt;
&lt;br /&gt;
Please make this wiki nice. Add stuff about mods, dev, whatever. Be awesome! [[Getting_started|How to get started]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#bbffbb; border:2px solid #99ee99; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Community ===&lt;br /&gt;
&lt;br /&gt;
*[http://pioneerspacesim.net/ Pioneer Space Sim Homepage]&lt;br /&gt;
*[https://github.com/pioneerspacesim/pioneer/ Main Github repository]&lt;br /&gt;
*[http://spacesimcentral.com/community/pioneer/ Community forum] &lt;br /&gt;
*[http://pioneerspacesim.net/forum Developer forum] &lt;br /&gt;
*[https://reddit.com/r/pioneerspacesim Pioneer Space Sim on Reddit]&lt;br /&gt;
*[https://pioneerspacesim.itch.io/pioneer Pioneer Space Sim on itch]&lt;br /&gt;
*[http://webchat.freenode.net/?channels=#pioneer Pioneer Space Sim on IRC]&lt;br /&gt;
*[http://twitter.com/pioneerspacesim @pioneerspacesim] on Twitter &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
*[[Manual|Basic Manual]] &lt;br /&gt;
*[[Flight_UI|Flight UI]] &lt;br /&gt;
*[[Keyboard_and_mouse_controls|Keyboard and mouse controls]] &lt;br /&gt;
*[[Tutorials|Tutorials]] (Outdated and WIP) &lt;br /&gt;
*[[Mission_Types_and_BBS|Mission Types and BBS]] &lt;br /&gt;
*[[Settings_Menu|Settings Menu]] &lt;br /&gt;
*[[FAQ|FAQ]] &lt;br /&gt;
*[[Media_Coverage|Media Coverage]] &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#fff9b1; border:2px solid #f0fe66; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
=== The Pioneer Universe ===&lt;br /&gt;
&lt;br /&gt;
*[[Pioneer_Universe|Pioneer Universe]] &lt;br /&gt;
*[[:Category:Ships| Ships]] (work in progress) &lt;br /&gt;
*[[:Category:Manufacturers| Manufacturers]] (work in progress) &lt;br /&gt;
*[[Places_of_interest|Places of interest]] &lt;br /&gt;
*[[Ship_Equipment|Ship Equipment]] (work in progress) &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#f0f0ff; border:2px solid #c6c9ff; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
=== Content Creation ===&lt;br /&gt;
&lt;br /&gt;
*[[Mods|Mods]]&lt;br /&gt;
*[[Scripting_and_Mission_Creation|Scripting and Mission Creation]] &lt;br /&gt;
*[[Custom_Systems|Custom Systems]] &lt;br /&gt;
*[[Design_and_Concept_art|Design and Concept art]] &lt;br /&gt;
*[[Modeling,_Texturing,_Graphics_Design|Modeling, Texturing, Graphics Design]] &lt;br /&gt;
*[[Music_and_Sound|Music and Sound]] &lt;br /&gt;
*[[Translations|Translations]] &lt;br /&gt;
*[[Licensing|Licensing]] &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#fff3e3; border:2px solid #ffc9c9; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Development ===&lt;br /&gt;
&lt;br /&gt;
*[[Design_Scope|Game Scope]] &lt;br /&gt;
*[[How_you_can_contribute|How you can contribute]] &lt;br /&gt;
*[[Getting_Started_with_Development|Getting Started with Development]] &lt;br /&gt;
**[[How_to_communicate|How to communicate]] &lt;br /&gt;
**[[Using_git_and_GitHub|Using git and GitHub]] &lt;br /&gt;
**[[Code_style|Code style]]&lt;br /&gt;
**[[Development_team|Development team]]  &lt;br /&gt;
**[[Engine_Overview|Engine internals overview]] &lt;br /&gt;
*[[Development_Model|Development Model]] &lt;br /&gt;
*[[Design_Workflow|Design and Project Management Workflow]] &lt;br /&gt;
*[https://github.com/pioneerspacesim/pioneer/issues Issue tracker] &lt;br /&gt;
*[[Roadmap|Roadmap]] &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pioneer is brought to you by a flock of [https://github.com/pioneerspacesim/pioneer/blob/master/AUTHORS.txt opensource beardy-weirdies], and is [http://www.gnu.org/licenses/gpl.html Free Software]&lt;br /&gt;
&lt;br /&gt;
'''__NOTOC__'''&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Translations&amp;diff=3873</id>
		<title>Translations</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Translations&amp;diff=3873"/>
		<updated>2019-03-22T19:28:06Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: /* For mod developers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All text in Pioneer is translatable, and the game ships with several translations. Here's everything you need to know.&lt;br /&gt;
&lt;br /&gt;
== For translators ==&lt;br /&gt;
&lt;br /&gt;
All our translations are managed through [http://transifex.com Transifex], a free web-based translation service. To start writing translations, sign up there, and then take a look at the [https://www.transifex.com/projects/p/pioneer/ Pioneer project].&lt;br /&gt;
&lt;br /&gt;
Changes to translations are automatically pulled into the master git repo twice per day, and from there to the builds when they're next run.&lt;br /&gt;
&lt;br /&gt;
In Transifex you can subscribe to notifications for the languages or resources you're interested in. When new strings are added or modified, you'll be told about it.&lt;br /&gt;
&lt;br /&gt;
If you want to translate Pioneer to an entirely new language, please [https://pioneerspacesim.net/issues open an issue] on the tracker and someone will create the translation for you.&lt;br /&gt;
&lt;br /&gt;
English is the canonical language for Pioneer. As such, you can't directly modify the english strings through Transifex. If you want to change those, you'll need to make the change in git and submit a pull request like normal.&lt;br /&gt;
&lt;br /&gt;
Untranslated strings will use the value from the English version.&lt;br /&gt;
&lt;br /&gt;
You can leave comments in Transifex to help out other translators. You'll also see any notes left by the developers to help you translate a particular string.&lt;br /&gt;
&lt;br /&gt;
If you're a new translator and you'd like your name included in AUTHORS.txt, please let us know!&lt;br /&gt;
&lt;br /&gt;
== For mod developers ==&lt;br /&gt;
&lt;br /&gt;
Each module gets its own translation resource, called &amp;lt;tt&amp;gt;module-foo&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To get at the strings for your module, do something like:&lt;br /&gt;
&lt;br /&gt;
    local Lang = import(&amp;quot;Lang&amp;quot;)&lt;br /&gt;
    local l = Lang.GetResource(&amp;quot;module-foo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Then you can get at the string by its token:&lt;br /&gt;
&lt;br /&gt;
    print(l.SOME_TRANSLATED_STRING)&lt;br /&gt;
&lt;br /&gt;
While its possible to load multiple translation resources to share strings, its highly recommended that you don't do that. Stick to your own strings so that you don't have to track changes in other modules. Duplicates across resources are fine. Note that code that uses multiple resources won't be accepted into the main Pioneer repository unless you've checked it with a core developer first and it has a good reason.&lt;br /&gt;
&lt;br /&gt;
Translations are [https://developer.chrome.com/extensions/i18n.html &amp;lt;tt&amp;gt;chrome.i18n&amp;lt;/tt&amp;gt; JSON] files. The format is fairly simple - a JSON object with tokens as keys and values of an object with two keys, &amp;lt;tt&amp;gt;message&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;description&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;message&amp;lt;/tt&amp;gt; is the text that will appear in the game, while &amp;lt;tt&amp;gt;description&amp;lt;/tt&amp;gt; provides instructions for the translator that will be displayed in Transifex. [http://json.org/string.gif Here] is a useful chart showing how characters are interpreted.&lt;br /&gt;
&lt;br /&gt;
If you're submitting code that requires a new language you should only include &amp;lt;tt&amp;gt;en.json&amp;lt;/tt&amp;gt;. Please tag '''@impaktor''' in your pull request so they can create a new resource in Transifex and make sure a language update is done at merge. If you don't do this then you'll break the game for non-English users.&lt;br /&gt;
&lt;br /&gt;
== For core developers ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;core&amp;lt;/tt&amp;gt; resource is magical. If you add a string to it, you also need to add it to &amp;lt;tt&amp;gt;LangStrings.inc.h&amp;lt;/tt&amp;gt; and recompile. It will then be available as &amp;lt;tt&amp;gt;Lang::SOME_TRANSLATED_STRING&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Translations&amp;diff=3872</id>
		<title>Translations</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Translations&amp;diff=3872"/>
		<updated>2019-03-22T19:27:45Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Update instructions for tagging Transifex maintainers.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All text in Pioneer is translatable, and the game ships with several translations. Here's everything you need to know.&lt;br /&gt;
&lt;br /&gt;
== For translators ==&lt;br /&gt;
&lt;br /&gt;
All our translations are managed through [http://transifex.com Transifex], a free web-based translation service. To start writing translations, sign up there, and then take a look at the [https://www.transifex.com/projects/p/pioneer/ Pioneer project].&lt;br /&gt;
&lt;br /&gt;
Changes to translations are automatically pulled into the master git repo twice per day, and from there to the builds when they're next run.&lt;br /&gt;
&lt;br /&gt;
In Transifex you can subscribe to notifications for the languages or resources you're interested in. When new strings are added or modified, you'll be told about it.&lt;br /&gt;
&lt;br /&gt;
If you want to translate Pioneer to an entirely new language, please [https://pioneerspacesim.net/issues open an issue] on the tracker and someone will create the translation for you.&lt;br /&gt;
&lt;br /&gt;
English is the canonical language for Pioneer. As such, you can't directly modify the english strings through Transifex. If you want to change those, you'll need to make the change in git and submit a pull request like normal.&lt;br /&gt;
&lt;br /&gt;
Untranslated strings will use the value from the English version.&lt;br /&gt;
&lt;br /&gt;
You can leave comments in Transifex to help out other translators. You'll also see any notes left by the developers to help you translate a particular string.&lt;br /&gt;
&lt;br /&gt;
If you're a new translator and you'd like your name included in AUTHORS.txt, please let us know!&lt;br /&gt;
&lt;br /&gt;
== For mod developers ==&lt;br /&gt;
&lt;br /&gt;
Each module gets its own translation resource, called &amp;lt;tt&amp;gt;module-foo&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To get at the strings for your module, do something like:&lt;br /&gt;
&lt;br /&gt;
    local Lang = import(&amp;quot;Lang&amp;quot;)&lt;br /&gt;
    local l = Lang.GetResource(&amp;quot;module-foo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Then you can get at the string by its token:&lt;br /&gt;
&lt;br /&gt;
    print(l.SOME_TRANSLATED_STRING)&lt;br /&gt;
&lt;br /&gt;
While its possible to load multiple translation resources to share strings, its highly recommended that you don't do that. Stick to your own strings so that you don't have to track changes in other modules. Duplicates across resources are fine. Note that code that uses multiple resources won't be accepted into the main Pioneer repository unless you've checked it with a core developer first and it has a good reason.&lt;br /&gt;
&lt;br /&gt;
Translations are [https://developer.chrome.com/extensions/i18n.html &amp;lt;tt&amp;gt;chrome.i18n&amp;lt;/tt&amp;gt; JSON] files. The format is fairly simple - a JSON object with tokens as keys and values of an object with two keys, &amp;lt;tt&amp;gt;message&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;description&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;message&amp;lt;/tt&amp;gt; is the text that will appear in the game, while &amp;lt;tt&amp;gt;description&amp;lt;/tt&amp;gt; provides instructions for the translator that will be displayed in Transifex. [http://json.org/string.gif Here] is a useful chart showing how characters are interpreted.&lt;br /&gt;
&lt;br /&gt;
If you're submitting code that requires a new language you should only include &amp;lt;tt&amp;gt;en.json&amp;lt;/tt&amp;gt;. Please tag @impaktor in your pull request so they can create a new resource in Transifex and make sure a language update is done at merge. If you don't do this then you'll break the game for non-English users.&lt;br /&gt;
&lt;br /&gt;
== For core developers ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;core&amp;lt;/tt&amp;gt; resource is magical. If you add a string to it, you also need to add it to &amp;lt;tt&amp;gt;LangStrings.inc.h&amp;lt;/tt&amp;gt; and recompile. It will then be available as &amp;lt;tt&amp;gt;Lang::SOME_TRANSLATED_STRING&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=3871</id>
		<title>Pioneer Wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=3871"/>
		<updated>2019-03-22T17:22:24Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Add reddit link.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Pioneer is a space adventure game set in the Milkyway galaxy at the turn of the 31st century. The game is open-ended, and you are free to explore the millions of star systems in the game. You can land on planets, slingshot past gas giants, and burn yourself to a crisp flying between binary star systems.&lt;br /&gt;
&lt;br /&gt;
If you are new to pioneer you may want to know [[How_to_start|how to start]].&lt;br /&gt;
&lt;br /&gt;
*[http://pioneerspacesim.net/download Download Pioneer] for Windows, Linux and Mac OSX &lt;br /&gt;
&lt;br /&gt;
Please make this wiki nice. Add stuff about mods, dev, whatever. Be awesome! [[Getting_started|How to get started]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#bbffbb; border:2px solid #99ee99; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Community ===&lt;br /&gt;
&lt;br /&gt;
*[http://pioneerspacesim.net/ Pioneer Space Sim Homepage]&lt;br /&gt;
*[https://github.com/pioneerspacesim/pioneer/ Main Github repository]&lt;br /&gt;
*[http://spacesimcentral.com/ssc/forum/23-pioneer/ Community forum] &lt;br /&gt;
*[http://pioneerspacesim.net/forum Developer forum] &lt;br /&gt;
*[https://reddit.com/r/pioneerspacesim Pioneer Space Sim on Reddit]&lt;br /&gt;
*[http://webchat.freenode.net/?channels=#pioneer Pioneer Space Sim on IRC] &lt;br /&gt;
*[http://twitter.com/pioneerspacesim @pioneerspacesim] on Twitter &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
*[[Manual|Basic Manual]] &lt;br /&gt;
*[[Flight_UI|Flight UI]] &lt;br /&gt;
*[[Keyboard_and_mouse_controls|Keyboard and mouse controls]] &lt;br /&gt;
*[[Tutorials|Tutorials]] (Outdated and WIP) &lt;br /&gt;
*[[Mission_Types_and_BBS|Mission Types and BBS]] &lt;br /&gt;
*[[Settings_Menu|Settings Menu]] &lt;br /&gt;
*[[FAQ|FAQ]] &lt;br /&gt;
*[[Media_Coverage|Media Coverage]] &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#fff9b1; border:2px solid #f0fe66; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== The Pioneer Universe ===&lt;br /&gt;
&lt;br /&gt;
*[[Pioneer_Universe|Pioneer Universe]] &lt;br /&gt;
*[http://pioneerwiki.com/wiki/Category:Ships Ships] (work in progress) &lt;br /&gt;
*[http://pioneerwiki.com/wiki/Category:Manufacturers Manufacturers] (work in progress) &lt;br /&gt;
*[[Places_of_interest|Places of interest]] &lt;br /&gt;
*[[Ship_Equipment|Ship Equipment]] (work in progress) &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#f0f0ff; border:2px solid #c6c9ff; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Content Creation ===&lt;br /&gt;
&lt;br /&gt;
*[[Mods|Mods]]&lt;br /&gt;
*[[Scripting_and_Mission_Creation|Scripting and Mission Creation]] &lt;br /&gt;
*[[Custom_Systems|Custom Systems]] &lt;br /&gt;
*[[Design_and_Concept_art|Design and Concept art]] &lt;br /&gt;
*[[Modeling,_Texturing,_Graphics_Design|Modeling, Texturing, Graphics Design]] &lt;br /&gt;
*[[Music_and_Sound|Music and Sound]] &lt;br /&gt;
*[[Translations|Translations]] &lt;br /&gt;
*[[Licensing|Licensing]] &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#fff3e3; border:2px solid #ffc9c9; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Development ===&lt;br /&gt;
&lt;br /&gt;
*[[Design_Scope|Game Scope]] &lt;br /&gt;
*[[How_you_can_contribute|How you can contribute]] &lt;br /&gt;
*[[Getting_Started_with_Development|Getting Started with Development]] &lt;br /&gt;
**[[How_to_communicate|How to communicate]] &lt;br /&gt;
**[[Using_git_and_GitHub|Using git and GitHub]] &lt;br /&gt;
**[[Code_style|Code style]]&lt;br /&gt;
**[[Development_team|Development team]]  &lt;br /&gt;
**[[Engine_Overview|Engine internals overview]] &lt;br /&gt;
*[[Development_Model|Development Model]] &lt;br /&gt;
*[[Design_Workflow|Design and Project Management Workflow]] &lt;br /&gt;
*[https://github.com/pioneerspacesim/pioneer/issues Issue tracker] &lt;br /&gt;
*[[Roadmap|Roadmap]] &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pioneer is brought to you by a flock of [https://github.com/pioneerspacesim/pioneer/blob/master/AUTHORS.txt opensource beardy-weirdies], and is [http://www.gnu.org/licenses/gpl.html Free Software]&lt;br /&gt;
&lt;br /&gt;
'''__NOTOC__'''&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=3870</id>
		<title>Pioneer Wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=3870"/>
		<updated>2019-03-22T03:21:48Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Google+ will 404 in a week, and nobody's used the Pioneer page in four years. Removing now before I forget.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Pioneer is a space adventure game set in the Milkyway galaxy at the turn of the 31st century. The game is open-ended, and you are free to explore the millions of star systems in the game. You can land on planets, slingshot past gas giants, and burn yourself to a crisp flying between binary star systems.&lt;br /&gt;
&lt;br /&gt;
If you are new to pioneer you may want to know [[How_to_start|how to start]].&lt;br /&gt;
&lt;br /&gt;
*[http://pioneerspacesim.net/download Download Pioneer] for Windows, Linux and Mac OSX &lt;br /&gt;
&lt;br /&gt;
Please make this wiki nice. Add stuff about mods, dev, whatever. Be awesome! [[Getting_started|How to get started]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#bbffbb; border:2px solid #99ee99; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Community ===&lt;br /&gt;
&lt;br /&gt;
*[http://pioneerspacesim.net/ Pioneer Space Sim Homepage]&lt;br /&gt;
*[https://github.com/pioneerspacesim/pioneer/ Main Github repository]&lt;br /&gt;
*[http://spacesimcentral.com/ssc/forum/23-pioneer/ Community forum] &lt;br /&gt;
*[http://pioneerspacesim.net/forum Developer forum] &lt;br /&gt;
*[http://webchat.freenode.net/?channels=#pioneer Pioneer Space Sim on IRC] &lt;br /&gt;
*[http://twitter.com/pioneerspacesim @pioneerspacesim] on Twitter &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
*[[Manual|Basic Manual]] &lt;br /&gt;
*[[Flight_UI|Flight UI]] &lt;br /&gt;
*[[Keyboard_and_mouse_controls|Keyboard and mouse controls]] &lt;br /&gt;
*[[Tutorials|Tutorials]] (Outdated and WIP) &lt;br /&gt;
*[[Mission_Types_and_BBS|Mission Types and BBS]] &lt;br /&gt;
*[[Settings_Menu|Settings Menu]] &lt;br /&gt;
*[[FAQ|FAQ]] &lt;br /&gt;
*[[Media_Coverage|Media Coverage]] &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#fff9b1; border:2px solid #f0fe66; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== The Pioneer Universe ===&lt;br /&gt;
&lt;br /&gt;
*[[Pioneer_Universe|Pioneer Universe]] &lt;br /&gt;
*[http://pioneerwiki.com/wiki/Category:Ships Ships] (work in progress) &lt;br /&gt;
*[http://pioneerwiki.com/wiki/Category:Manufacturers Manufacturers] (work in progress) &lt;br /&gt;
*[[Places_of_interest|Places of interest]] &lt;br /&gt;
*[[Ship_Equipment|Ship Equipment]] (work in progress) &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#f0f0ff; border:2px solid #c6c9ff; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Content Creation ===&lt;br /&gt;
&lt;br /&gt;
*[[Mods|Mods]]&lt;br /&gt;
*[[Scripting_and_Mission_Creation|Scripting and Mission Creation]] &lt;br /&gt;
*[[Custom_Systems|Custom Systems]] &lt;br /&gt;
*[[Design_and_Concept_art|Design and Concept art]] &lt;br /&gt;
*[[Modeling,_Texturing,_Graphics_Design|Modeling, Texturing, Graphics Design]] &lt;br /&gt;
*[[Music_and_Sound|Music and Sound]] &lt;br /&gt;
*[[Translations|Translations]] &lt;br /&gt;
*[[Licensing|Licensing]] &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#fff3e3; border:2px solid #ffc9c9; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Development ===&lt;br /&gt;
&lt;br /&gt;
*[[Design_Scope|Game Scope]] &lt;br /&gt;
*[[How_you_can_contribute|How you can contribute]] &lt;br /&gt;
*[[Getting_Started_with_Development|Getting Started with Development]] &lt;br /&gt;
**[[How_to_communicate|How to communicate]] &lt;br /&gt;
**[[Using_git_and_GitHub|Using git and GitHub]] &lt;br /&gt;
**[[Code_style|Code style]]&lt;br /&gt;
**[[Development_team|Development team]]  &lt;br /&gt;
**[[Engine_Overview|Engine internals overview]] &lt;br /&gt;
*[[Development_Model|Development Model]] &lt;br /&gt;
*[[Design_Workflow|Design and Project Management Workflow]] &lt;br /&gt;
*[https://github.com/pioneerspacesim/pioneer/issues Issue tracker] &lt;br /&gt;
*[[Roadmap|Roadmap]] &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pioneer is brought to you by a flock of [https://github.com/pioneerspacesim/pioneer/blob/master/AUTHORS.txt opensource beardy-weirdies], and is [http://www.gnu.org/licenses/gpl.html Free Software]&lt;br /&gt;
&lt;br /&gt;
'''__NOTOC__'''&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3869</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3869"/>
		<updated>2019-03-15T21:07:13Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: /* Gameplay: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This will be a multi-step process:&lt;br /&gt;
** Implement some minor features using the ECS paradigm to get started and evaluate requirements. '''Working'''&lt;br /&gt;
** Drive the new ECS-based features from existing code as a temporary measure. '''Working'''&lt;br /&gt;
** Convert a major feature (Ship, BodyOnPlanet, etc) to use the ECS.&lt;br /&gt;
** Continue converting major features until all applicable areas of the code are converted.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are mostly finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
Planned Features:&lt;br /&gt;
* Modular, Lua-exposed input system '''WORKING'''&lt;br /&gt;
* Key-chord inputs, allowing arbitrary modifier keys / buttons. A software &amp;quot;pinkie switch&amp;quot; if you will.&lt;br /&gt;
* Touchscreen input for camera and flight controls. (Investigate: virtual joysticks or whole-screen mouse emulation?)&lt;br /&gt;
&lt;br /&gt;
=== Lua Engine ===&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax '''(DONE)''' and implicit &amp;quot;init.lua&amp;quot; support.&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
Tangentially to the ECS changes, we need a better method of binding C++ code and data to Lua. Currently the hand-written method is serviceable, but it is akin to &amp;quot;implementing the same thing twice&amp;quot;, doubling the workload for anyone wanting to add something new.&lt;br /&gt;
* Add an automatic solution for binding C++ code to Lua, capable of auto-generating bindings for properties, methods, and POD-structs and full LuaObject classes.&lt;br /&gt;
** Use a Lua script to scan C++ files for annotations, generating bindings based upon annotated properties and methods.&lt;br /&gt;
** To avoid re-inventing the wheel, generate C++ files that make heavy use of templates to pass data back and forth from Lua. This will allow programmers to do sanity-checking in template specializations, and create a common convention for binding data to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
There are a ''huge'' number of new features and wild gameplay ideas that I and others would really like to see added to the game, but this is a more reasonable list of features that can actually be implemented with a few weeks of work.&lt;br /&gt;
&lt;br /&gt;
* Refactor the camera / view system to better support inputs, allow arbitrary spectator / debug cameras for editor mode, enable first-person and turret cameras.&lt;br /&gt;
** Add a &amp;quot;camera offset&amp;quot; axis for internal / cockpit view that can be hooked up to headtracking. '''In Testing'''&lt;br /&gt;
** Make the existing camera system use the new InputFrames for input. '''In Testing'''&lt;br /&gt;
** Decouple camera systems from the concept of a ship to make them suitable for debug/flying cameras. '''Evaluating'''&lt;br /&gt;
** Add cameras for turrets. '''Stalled on Dependency'''&lt;br /&gt;
* Completely rewrite the weapons systems to support arbitrary guns and turrets, as well as a better loadout system.&lt;br /&gt;
* Rework drag and atmospheric heating to be actually accurate, implement atmospheric lift so aerodynamic ships can fly. '''WORKING, w/ WKFO'''&lt;br /&gt;
* Add airframe damage due to excessive G-force and/or dynamic pressure when flying in atmosphere.&lt;br /&gt;
** Possibly damage specific components (landing gear, control surfaces, etc) reducing their effectiveness and/or destroying them.&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom, chromatic aberration, motion blur, and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
'''Clouds'''&lt;br /&gt;
&lt;br /&gt;
Possibly using a low-resolution voxelized implementation, atmospheric clouds are a planned feature. They'd need to support transparency, layer over each other without killing performance, and look at least moderately good. Flat clouds are also required when looking at a planet from orbit, which could be static textures or generated from a basic weather simulation for believable construction.&lt;br /&gt;
&lt;br /&gt;
''' Mesh Decals '''&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;br /&gt;
&lt;br /&gt;
* Finish modelling and texturing the Sador Heavy Fighter, including setting it up to use turrets and the new gun / missile system.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3868</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3868"/>
		<updated>2019-03-14T18:13:22Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: /* Rendering: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This will be a multi-step process:&lt;br /&gt;
** Implement some minor features using the ECS paradigm to get started and evaluate requirements. '''Working'''&lt;br /&gt;
** Drive the new ECS-based features from existing code as a temporary measure. '''Working'''&lt;br /&gt;
** Convert a major feature (Ship, BodyOnPlanet, etc) to use the ECS.&lt;br /&gt;
** Continue converting major features until all applicable areas of the code are converted.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are mostly finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
Planned Features:&lt;br /&gt;
* Modular, Lua-exposed input system '''WORKING'''&lt;br /&gt;
* Key-chord inputs, allowing arbitrary modifier keys / buttons. A software &amp;quot;pinkie switch&amp;quot; if you will.&lt;br /&gt;
* Touchscreen input for camera and flight controls. (Investigate: virtual joysticks or whole-screen mouse emulation?)&lt;br /&gt;
&lt;br /&gt;
=== Lua Engine ===&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax '''(DONE)''' and implicit &amp;quot;init.lua&amp;quot; support.&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
Tangentially to the ECS changes, we need a better method of binding C++ code and data to Lua. Currently the hand-written method is serviceable, but it is akin to &amp;quot;implementing the same thing twice&amp;quot;, doubling the workload for anyone wanting to add something new.&lt;br /&gt;
* Add an automatic solution for binding C++ code to Lua, capable of auto-generating bindings for properties, methods, and POD-structs and full LuaObject classes.&lt;br /&gt;
** Use a Lua script to scan C++ files for annotations, generating bindings based upon annotated properties and methods.&lt;br /&gt;
** To avoid re-inventing the wheel, generate C++ files that make heavy use of templates to pass data back and forth from Lua. This will allow programmers to do sanity-checking in template specializations, and create a common convention for binding data to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
* Refactor the camera / view system to better support inputs, allow arbitrary spectator / debug cameras for editor mode, enable first-person and turret cameras.&lt;br /&gt;
** Add a &amp;quot;camera offset&amp;quot; axis for internal / cockpit view that can be hooked up to headtracking. '''In Testing'''&lt;br /&gt;
** Make the existing camera system use the new InputFrames for input. '''In Testing'''&lt;br /&gt;
** Decouple camera systems from the concept of a ship to make them suitable for debug/flying cameras. '''Evaluating'''&lt;br /&gt;
** Add cameras for turrets. '''Stalled on Dependency'''&lt;br /&gt;
* Completely rewrite the weapons systems to support arbitrary guns and turrets, as well as a better loadout system.&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom, chromatic aberration, motion blur, and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
'''Clouds'''&lt;br /&gt;
&lt;br /&gt;
Possibly using a low-resolution voxelized implementation, atmospheric clouds are a planned feature. They'd need to support transparency, layer over each other without killing performance, and look at least moderately good. Flat clouds are also required when looking at a planet from orbit, which could be static textures or generated from a basic weather simulation for believable construction.&lt;br /&gt;
&lt;br /&gt;
''' Mesh Decals '''&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;br /&gt;
&lt;br /&gt;
* Finish modelling and texturing the Sador Heavy Fighter, including setting it up to use turrets and the new gun / missile system.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3867</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3867"/>
		<updated>2019-03-14T18:12:55Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: /* Rendering: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This will be a multi-step process:&lt;br /&gt;
** Implement some minor features using the ECS paradigm to get started and evaluate requirements. '''Working'''&lt;br /&gt;
** Drive the new ECS-based features from existing code as a temporary measure. '''Working'''&lt;br /&gt;
** Convert a major feature (Ship, BodyOnPlanet, etc) to use the ECS.&lt;br /&gt;
** Continue converting major features until all applicable areas of the code are converted.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are mostly finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
Planned Features:&lt;br /&gt;
* Modular, Lua-exposed input system '''WORKING'''&lt;br /&gt;
* Key-chord inputs, allowing arbitrary modifier keys / buttons. A software &amp;quot;pinkie switch&amp;quot; if you will.&lt;br /&gt;
* Touchscreen input for camera and flight controls. (Investigate: virtual joysticks or whole-screen mouse emulation?)&lt;br /&gt;
&lt;br /&gt;
=== Lua Engine ===&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax '''(DONE)''' and implicit &amp;quot;init.lua&amp;quot; support.&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
Tangentially to the ECS changes, we need a better method of binding C++ code and data to Lua. Currently the hand-written method is serviceable, but it is akin to &amp;quot;implementing the same thing twice&amp;quot;, doubling the workload for anyone wanting to add something new.&lt;br /&gt;
* Add an automatic solution for binding C++ code to Lua, capable of auto-generating bindings for properties, methods, and POD-structs and full LuaObject classes.&lt;br /&gt;
** Use a Lua script to scan C++ files for annotations, generating bindings based upon annotated properties and methods.&lt;br /&gt;
** To avoid re-inventing the wheel, generate C++ files that make heavy use of templates to pass data back and forth from Lua. This will allow programmers to do sanity-checking in template specializations, and create a common convention for binding data to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
* Refactor the camera / view system to better support inputs, allow arbitrary spectator / debug cameras for editor mode, enable first-person and turret cameras.&lt;br /&gt;
** Add a &amp;quot;camera offset&amp;quot; axis for internal / cockpit view that can be hooked up to headtracking. '''In Testing'''&lt;br /&gt;
** Make the existing camera system use the new InputFrames for input. '''In Testing'''&lt;br /&gt;
** Decouple camera systems from the concept of a ship to make them suitable for debug/flying cameras. '''Evaluating'''&lt;br /&gt;
** Add cameras for turrets. '''Stalled on Dependency'''&lt;br /&gt;
* Completely rewrite the weapons systems to support arbitrary guns and turrets, as well as a better loadout system.&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom, chromatic aberration, motion blur, and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
'''Clouds'''&lt;br /&gt;
&lt;br /&gt;
Possibly using a low-resolution voxelized implementation, atmospheric clouds are a planned feature. They'd need to support transparency, layer over each other without killing performance, and look at least moderately good. Flat clouds are also required when looking at a planet from orbit, which could be static textures or generated from a basic weather simulation for believable construction.&lt;br /&gt;
&lt;br /&gt;
==== Mesh Decals ====&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;br /&gt;
&lt;br /&gt;
* Finish modelling and texturing the Sador Heavy Fighter, including setting it up to use turrets and the new gun / missile system.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3866</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3866"/>
		<updated>2019-03-14T18:03:04Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: /* Input System */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This will be a multi-step process:&lt;br /&gt;
** Implement some minor features using the ECS paradigm to get started and evaluate requirements. '''Working'''&lt;br /&gt;
** Drive the new ECS-based features from existing code as a temporary measure. '''Working'''&lt;br /&gt;
** Convert a major feature (Ship, BodyOnPlanet, etc) to use the ECS.&lt;br /&gt;
** Continue converting major features until all applicable areas of the code are converted.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are mostly finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
Planned Features:&lt;br /&gt;
* Modular, Lua-exposed input system '''WORKING'''&lt;br /&gt;
* Key-chord inputs, allowing arbitrary modifier keys / buttons. A software &amp;quot;pinkie switch&amp;quot; if you will.&lt;br /&gt;
* Touchscreen input for camera and flight controls. (Investigate: virtual joysticks or whole-screen mouse emulation?)&lt;br /&gt;
&lt;br /&gt;
=== Lua Engine ===&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax '''(DONE)''' and implicit &amp;quot;init.lua&amp;quot; support.&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
Tangentially to the ECS changes, we need a better method of binding C++ code and data to Lua. Currently the hand-written method is serviceable, but it is akin to &amp;quot;implementing the same thing twice&amp;quot;, doubling the workload for anyone wanting to add something new.&lt;br /&gt;
* Add an automatic solution for binding C++ code to Lua, capable of auto-generating bindings for properties, methods, and POD-structs and full LuaObject classes.&lt;br /&gt;
** Use a Lua script to scan C++ files for annotations, generating bindings based upon annotated properties and methods.&lt;br /&gt;
** To avoid re-inventing the wheel, generate C++ files that make heavy use of templates to pass data back and forth from Lua. This will allow programmers to do sanity-checking in template specializations, and create a common convention for binding data to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
* Refactor the camera / view system to better support inputs, allow arbitrary spectator / debug cameras for editor mode, enable first-person and turret cameras.&lt;br /&gt;
** Add a &amp;quot;camera offset&amp;quot; axis for internal / cockpit view that can be hooked up to headtracking. '''In Testing'''&lt;br /&gt;
** Make the existing camera system use the new InputFrames for input. '''In Testing'''&lt;br /&gt;
** Decouple camera systems from the concept of a ship to make them suitable for debug/flying cameras. '''Evaluating'''&lt;br /&gt;
** Add cameras for turrets. '''Stalled on Dependency'''&lt;br /&gt;
* Completely rewrite the weapons systems to support arbitrary guns and turrets, as well as a better loadout system.&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom, chromatic aberration, motion blur, and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
==== Mesh Decals ====&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;br /&gt;
&lt;br /&gt;
* Finish modelling and texturing the Sador Heavy Fighter, including setting it up to use turrets and the new gun / missile system.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3865</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3865"/>
		<updated>2019-03-10T00:39:27Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: /* Lua Engine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This will be a multi-step process:&lt;br /&gt;
** Implement some minor features using the ECS paradigm to get started and evaluate requirements. '''Working'''&lt;br /&gt;
** Drive the new ECS-based features from existing code as a temporary measure. '''Working'''&lt;br /&gt;
** Convert a major feature (Ship, BodyOnPlanet, etc) to use the ECS.&lt;br /&gt;
** Continue converting major features until all applicable areas of the code are converted.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are mostly finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Lua Engine ===&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax '''(DONE)''' and implicit &amp;quot;init.lua&amp;quot; support.&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
Tangentially to the ECS changes, we need a better method of binding C++ code and data to Lua. Currently the hand-written method is serviceable, but it is akin to &amp;quot;implementing the same thing twice&amp;quot;, doubling the workload for anyone wanting to add something new.&lt;br /&gt;
* Add an automatic solution for binding C++ code to Lua, capable of auto-generating bindings for properties, methods, and POD-structs and full LuaObject classes.&lt;br /&gt;
** Use a Lua script to scan C++ files for annotations, generating bindings based upon annotated properties and methods.&lt;br /&gt;
** To avoid re-inventing the wheel, generate C++ files that make heavy use of templates to pass data back and forth from Lua. This will allow programmers to do sanity-checking in template specializations, and create a common convention for binding data to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
* Refactor the camera / view system to better support inputs, allow arbitrary spectator / debug cameras for editor mode, enable first-person and turret cameras.&lt;br /&gt;
** Add a &amp;quot;camera offset&amp;quot; axis for internal / cockpit view that can be hooked up to headtracking. '''In Testing'''&lt;br /&gt;
** Make the existing camera system use the new InputFrames for input. '''In Testing'''&lt;br /&gt;
** Decouple camera systems from the concept of a ship to make them suitable for debug/flying cameras. '''Evaluating'''&lt;br /&gt;
** Add cameras for turrets. '''Stalled on Dependency'''&lt;br /&gt;
* Completely rewrite the weapons systems to support arbitrary guns and turrets, as well as a better loadout system.&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom, chromatic aberration, motion blur, and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
==== Mesh Decals ====&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;br /&gt;
&lt;br /&gt;
* Finish modelling and texturing the Sador Heavy Fighter, including setting it up to use turrets and the new gun / missile system.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3864</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3864"/>
		<updated>2019-03-10T00:35:12Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This will be a multi-step process:&lt;br /&gt;
** Implement some minor features using the ECS paradigm to get started and evaluate requirements. '''Working'''&lt;br /&gt;
** Drive the new ECS-based features from existing code as a temporary measure. '''Working'''&lt;br /&gt;
** Convert a major feature (Ship, BodyOnPlanet, etc) to use the ECS.&lt;br /&gt;
** Continue converting major features until all applicable areas of the code are converted.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are mostly finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Lua Engine ===&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax '''(DONE)''' and implicit &amp;quot;init.lua&amp;quot; support.&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
* Refactor the camera / view system to better support inputs, allow arbitrary spectator / debug cameras for editor mode, enable first-person and turret cameras.&lt;br /&gt;
** Add a &amp;quot;camera offset&amp;quot; axis for internal / cockpit view that can be hooked up to headtracking. '''In Testing'''&lt;br /&gt;
** Make the existing camera system use the new InputFrames for input. '''In Testing'''&lt;br /&gt;
** Decouple camera systems from the concept of a ship to make them suitable for debug/flying cameras. '''Evaluating'''&lt;br /&gt;
** Add cameras for turrets. '''Stalled on Dependency'''&lt;br /&gt;
* Completely rewrite the weapons systems to support arbitrary guns and turrets, as well as a better loadout system.&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom, chromatic aberration, motion blur, and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
==== Mesh Decals ====&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;br /&gt;
&lt;br /&gt;
* Finish modelling and texturing the Sador Heavy Fighter, including setting it up to use turrets and the new gun / missile system.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3863</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3863"/>
		<updated>2019-03-10T00:29:28Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This change is already in-flight; I am working on a lightweight ECS in C++ tailored to pioneer's needs, and the team has been working on splitting the monolithic core classes up into more manageable chunks - see Propulsion and ShipController.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are mostly finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Lua Engine ===&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax '''(DONE)''' and implicit &amp;quot;init.lua&amp;quot; support.&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
* Refactor the camera / view system to better support inputs, allow arbitrary spectator / debug cameras for editor mode, enable first-person and turret cameras.&lt;br /&gt;
** Add a &amp;quot;camera offset&amp;quot; axis for internal / cockpit view that can be hooked up to headtracking. '''In Testing'''&lt;br /&gt;
** Make the existing camera system use the new InputFrames for input. '''In Testing'''&lt;br /&gt;
** Decouple camera systems from the concept of a ship to make them suitable for debug/flying cameras. '''Evaluating'''&lt;br /&gt;
** Add cameras for turrets. '''Stalled on Dependency'''&lt;br /&gt;
* Completely rewrite the weapons systems to support arbitrary guns and turrets, as well as a better loadout system.&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom, chromatic aberration, motion blur, and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
==== Mesh Decals ====&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;br /&gt;
&lt;br /&gt;
* Finish modelling and texturing the Sador Heavy Fighter, including setting it up to use turrets and the new gun / missile system.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3856</id>
		<title>Coding Conventions</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3856"/>
		<updated>2019-02-16T03:00:24Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Updated clang-format instructions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Classes ===&lt;br /&gt;
&lt;br /&gt;
Class names in camel case starting with upper case like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;class MyClass {};&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Class member variables prefixed with &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt;, camel case starting with lower case:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
public:&lt;br /&gt;
    int m_someValue;&lt;br /&gt;
    std::string m_anotherValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that to avoid verbosity the above is not followed for classes that are used more like structs, like vector3.&lt;br /&gt;
&lt;br /&gt;
Class functions should be camel case starting with upper case:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
public:&lt;br /&gt;
    void MyFunction() {}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Global variables ===&lt;br /&gt;
&lt;br /&gt;
Global variables must be prefixed with &amp;lt;tt&amp;gt;g_&amp;lt;/tt&amp;gt;, and use camel case starting with lower case:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;int g_screenWidth;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variables with static scope should be prefixed with &amp;lt;tt&amp;gt;s_&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;static int s_someGlobalForJustThisFile;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code Formatting ==&lt;br /&gt;
&lt;br /&gt;
The Pioneer C++ codebase has an enforced common coding style, managed by running the &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; tool. This is run by the Travis CI provider for all pull requests, and may also be run locally as a [https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks git hook]. If your Pull Request is displaying a red X or a message saying &amp;quot;All checks have failed&amp;quot;, it is likely that your code has inadvertently broken the C++ code style that Pioneer uses.&lt;br /&gt;
&lt;br /&gt;
=== Diagnosing Formatting Issues ===&lt;br /&gt;
&lt;br /&gt;
If your Pull Request is in violation of Pioneer's code formatting rules, you can look at the Travis log to find out what parts of your code are specifically to blame. Click &amp;quot;Details&amp;quot; next to &amp;quot;The Travis CI build has failed&amp;quot; at the bottom of the Pull Request page, and select the &amp;quot;Static Checks&amp;quot; job from the resulting page. In the log below, the differences between your code and the correctly formatted code will be listed in [https://linux.die.net/man/1/diff diff(1)] format.&lt;br /&gt;
&lt;br /&gt;
=== Installing a Git Hook ===&lt;br /&gt;
&lt;br /&gt;
Looking at the Travis log to find out what changed is fine and well, but what you really should be doing is using a git hook to validate your code ''before'' you commit your changes. This process is very simple if you are developing on a Mac or Linux system - simply copy the pre-provided git hook into your local repository's &amp;lt;code&amp;gt;hooks/&amp;lt;/code&amp;gt; directory. A pre-commit hook is not currently available for Windows systems. If you know how to reliably set one up, you are more than welcome to author it and submit it as a Pull Request.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp scripts/clang-format.sh .git/hooks/pre-commit-hook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have installed the hook, simply run &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; as normal. If your code doesn't comply with the C++ style rules, it will abort the commit and print the difference between your code and the properly formatted code to the console. If it succeeds, it will open an editor as normal.&lt;br /&gt;
&lt;br /&gt;
If, for some reason, you wish to bypass the validation hook, simply run &amp;lt;code&amp;gt;git commit --no-verify&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Applying The Format Changes ===&lt;br /&gt;
&lt;br /&gt;
Once you know which files are improperly formatted, and what changes need to be made to fix them, you have two options. The first option is to manually apply the required changes to your code, and submit them as a new commit. Alternatively, you can use the automatic formatting tool. The interface is simple, presenting you with the list of changes made by clang-format and asking whether you would like to apply them. The invocation is simple as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./autoformat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will overwrite your code with the properly formatted version. It is recommended that you do not do this blindly, as clang-format has some issues with detecting file types and may occasionally eat your work. Please read the diff and determine which changes will be made. If your version of clang-format is bugged and suggesting destructive changes, manually apply the correct changes and run `git-commit --no-verify` to bypass clang-format entirely.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3855</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3855"/>
		<updated>2019-02-16T00:41:12Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This change is already in-flight; I am working on a lightweight ECS in C++ tailored to pioneer's needs, and the team has been working on splitting the monolithic core classes up into more manageable chunks - see Propulsion and ShipController.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are mostly finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Lua Engine ===&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax '''(DONE)''' and implicit &amp;quot;init.lua&amp;quot; support.&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
* Refactor the camera / view system to better support inputs, allow arbitrary spectator / debug cameras for editor mode, enable first-person and turret cameras.&lt;br /&gt;
** Add a &amp;quot;camera offset&amp;quot; axis for internal / cockpit view that can be hooked up to headtracking.&lt;br /&gt;
* Completely rewrite the weapons systems to support arbitrary guns and turrets, as well as a better loadout system.&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom, chromatic aberration, motion blur, and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
==== Mesh Decals ====&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;br /&gt;
&lt;br /&gt;
* Finish modelling and texturing the Sador Heavy Fighter, including setting it up to use turrets and the new gun / missile system.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3851</id>
		<title>Coding Conventions</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Coding_Conventions&amp;diff=3851"/>
		<updated>2019-01-07T02:09:05Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Add details on clang-format and the pre-commit hook.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Classes ===&lt;br /&gt;
&lt;br /&gt;
Class names in camel case starting with upper case like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;class MyClass {};&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Class member variables prefixed with &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt;, camel case starting with lower case:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
public:&lt;br /&gt;
    int m_someValue;&lt;br /&gt;
    std::string m_anotherValue;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that to avoid verbosity the above is not followed for classes that are used more like structs, like vector3.&lt;br /&gt;
&lt;br /&gt;
Class functions should be camel case starting with upper case:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
public:&lt;br /&gt;
    void MyFunction() {}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Global variables ===&lt;br /&gt;
&lt;br /&gt;
Global variables must be prefixed with &amp;lt;tt&amp;gt;g_&amp;lt;/tt&amp;gt;, and use camel case starting with lower case:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;int g_screenWidth;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variables with static scope should be prefixed with &amp;lt;tt&amp;gt;s_&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;static int s_someGlobalForJustThisFile;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code Formatting ==&lt;br /&gt;
&lt;br /&gt;
The Pioneer C++ codebase has an enforced common coding style, managed by running the &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; tool. This is run by the Travis CI provider for all pull requests, and may also be run locally as a [https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks git hook]. If your Pull Request is displaying a red X or a message saying &amp;quot;All checks have failed&amp;quot;, it is likely that your code has inadvertently broken the C++ code style that Pioneer uses.&lt;br /&gt;
&lt;br /&gt;
=== Diagnosing Formatting Issues ===&lt;br /&gt;
&lt;br /&gt;
If your Pull Request is in violation of Pioneer's code formatting rules, you can look at the Travis log to find out what parts of your code are specifically to blame. Click &amp;quot;Details&amp;quot; next to &amp;quot;The Travis CI build has failed&amp;quot; at the bottom of the Pull Request page, and select the &amp;quot;Static Checks&amp;quot; job from the resulting page. In the log below, the differences between your code and the correctly formatted code will be listed in [https://linux.die.net/man/1/diff diff(1)] format.&lt;br /&gt;
&lt;br /&gt;
=== Installing a Git Hook ===&lt;br /&gt;
&lt;br /&gt;
Looking at the Travis log to find out what changed is fine and well, but what you really should be doing is using a git hook to validate your code ''before'' you commit your changes. This process is very simple if you are developing on a Mac or Linux system - simply copy the pre-provided git hook into your local repository's &amp;lt;code&amp;gt;hooks/&amp;lt;/code&amp;gt; directory. A pre-commit hook is not currently available for Windows systems. If you know how to reliably set one up, you are more than welcome to author it and submit it as a Pull Request.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cp scripts/pre-commit-hook.sh .git/hooks/pre-commit-hook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have installed the hook, simply run &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; as normal. If your code doesn't comply with the C++ style rules, it will abort the commit and print the difference between your code and the properly formatted code to the console. If it succeeds, it will open an editor as normal.&lt;br /&gt;
&lt;br /&gt;
If, for some reason, you wish to bypass the validation hook, simply run &amp;lt;code&amp;gt;git commit --no-verify&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Applying The Format Changes ===&lt;br /&gt;
&lt;br /&gt;
Once you know which files are improperly formatted, and what changes need to be made to fix them, you have two options. The first option is to manually apply the required changes to your code, and submit them as a new commit. Alternatively, you can run the below command, replacing &amp;lt;code&amp;gt;FILE...&amp;lt;/code&amp;gt; with the paths to the files that need to be fixed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.../pioneer $ clang-format -style=file -i FILE...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will direct clang-format to overwrite your code with the properly formatted version. It is recommended that you do not do this blindly, but rather determine which changes will be made first (by running &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;scripts/pre-commit-hook.sh&amp;lt;/code&amp;gt; to trigger the validation hook).&lt;br /&gt;
&lt;br /&gt;
A script to automatically apply the results of the clang-format validation pass is planned, but not currently written. Once it is created, applying the code format changes will be as simple as running a single script from the main pioneer directory, and confirming the changes you want to apply.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3820</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3820"/>
		<updated>2018-10-20T18:21:29Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Add reference links for the rendering engine.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident rookie software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This change is already in-flight; I am working on a lightweight ECS in C++ tailored to pioneer's needs, and the team has been working on splitting the monolithic core classes up into more manageable chunks - see Propulsion and ShipController.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are pretty much finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Lua Engine ===&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax and implicit &amp;quot;init.lua&amp;quot; support.&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
* [https://turanszkij.wordpress.com/2017/10/12/forward-decal-rendering/ Forward+ Decal Rendering]&lt;br /&gt;
* [https://google.github.io/filament/Filament.md.html Filament Renderer], an open-source mobile-capable Clustered Forward PBR renderer, with accompanying whitepaper.&lt;br /&gt;
* [http://www.cse.chalmers.se/~uffe/clustered_shading_preprint.pdf A paper on clustered rendering]&lt;br /&gt;
* [http://www.thetenthplanet.de/archives/4519 Atmospheric Scattering] with link to implementation.&lt;br /&gt;
&lt;br /&gt;
==== Mesh Decals ====&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3819</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3819"/>
		<updated>2018-10-20T17:17:32Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Add some info to the rendering section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident rookie software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This change is already in-flight; I am working on a lightweight ECS in C++ tailored to pioneer's needs, and the team has been working on splitting the monolithic core classes up into more manageable chunks - see Propulsion and ShipController.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are pretty much finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Lua Engine ===&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax and implicit &amp;quot;init.lua&amp;quot; support.&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
==== PBR Rendering Engine ====&lt;br /&gt;
&lt;br /&gt;
Convert Pioneer to a Clustered Forward or Clustered Deferred rendering model. This change needs to implement support for numerous lights, mesh decals ala Star Citizen, accurate terrain rendering with high-res texturing support via material layering and distance-dependent detail texturing, a full postprocessing chain including bloom and an AO implementation (perhaps an HBAO or SSAO variant), support for atmospheric shading, etc.&lt;br /&gt;
&lt;br /&gt;
==== Mesh Decals ====&lt;br /&gt;
&lt;br /&gt;
TODO: link in nozmajner's ship decal work, pontificate about supporting that engine-side.&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Roadmap&amp;diff=3818</id>
		<title>Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Roadmap&amp;diff=3818"/>
		<updated>2018-10-20T16:53:43Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Link The List into the roadmap.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Please note: this page is old, not updated, and should be more thought of as a general outline of the direction we want to take the game in.&lt;br /&gt;
&lt;br /&gt;
An annotated and updated (but incomplete) fork of the roadmap may be found at [[User:Sturnclaw|Sturnclaw's List]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== First milestone ==&lt;br /&gt;
&lt;br /&gt;
Basically we want external interfaces to be stable.&lt;br /&gt;
&lt;br /&gt;
*New save file format (Done?) &lt;br /&gt;
*Separate Player from Ship (breaks Lua) &lt;br /&gt;
*Turn Missiles into guided Projectiles &lt;br /&gt;
*Module manifest &lt;br /&gt;
*[https://github.com/pioneerspacesim/pioneer/issues/4078 Convert to dear-imgui]&amp;amp;nbsp;(In progress) &lt;br /&gt;
*Starsystem generation rewrite (plus custom systems) &lt;br /&gt;
*3D cockpits (only visual, not functional) (In progress)&lt;br /&gt;
&lt;br /&gt;
== Second milestone ==&lt;br /&gt;
&lt;br /&gt;
*Gameplay stuff, redesigned UI. Dunno yet. &lt;br /&gt;
*Functional 3D cockpits &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Older stuff ==&lt;br /&gt;
&lt;br /&gt;
Pioneer has changed versioning system and will no longer release a 1.0 version. Development will continue continuously with new features and fixes added, making every new version slightly better than the one before. Below is a compiled list of features.&lt;br /&gt;
&lt;br /&gt;
'''''Warning:''' This list is incomplete - and under active discussion so subject to change''&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
=== UI features ===&lt;br /&gt;
&lt;br /&gt;
*Star views and navigation &lt;br /&gt;
**Combine system (orbit) view into star map &lt;br /&gt;
**Bookmarks, travel log &lt;br /&gt;
**Maybe other streamlining as well? such as? &lt;br /&gt;
**is galaxy view useful at all?   &lt;br /&gt;
&lt;br /&gt;
*Missions and station interface &lt;br /&gt;
**Redesign the bulletin board to allow filtering and searching (e.g., adverts have tags, as shown in [http://i.imgur.com/HJH9L.png this old mock-up]). &lt;br /&gt;
**Better access to missions or BB. maybe alerts? &lt;br /&gt;
**Centralise bulletin board within the station interface (ie, everything else hangs off the bulletin board; the BB is basically the station-wide-web) &lt;br /&gt;
***Replace the &amp;quot;standard&amp;quot; commodity market with multiple traders/shops advertising on the BB &lt;br /&gt;
***Replace the &amp;quot;standard&amp;quot; ship equipment and servicing screens with mechanics advertising on the BB &lt;br /&gt;
***Replace the &amp;quot;standard&amp;quot; ship purchase screen with specialist shops advertising on the BB, plus also individual pilots posting ship-for-sale and ship-wanted adverts     &lt;br /&gt;
&lt;br /&gt;
*Rewrite? the [https://pioneerspacesim.net/forum/viewtopic.php?f=3&amp;amp;t=24 HUD] &lt;br /&gt;
*[https://github.com/pioneerspacesim/pioneer/issues/58 Add chase camera], padlock &lt;br /&gt;
&lt;br /&gt;
=== Technical features ===&lt;br /&gt;
&lt;br /&gt;
*[[Commodity_Prices|Commodity Prices]] (see link for more) / Economy will be more advanced (Dynamic?) &lt;br /&gt;
*Weapons &lt;br /&gt;
**goals: allow more than just laser bolts (beams, missiles), auto-tracking guns and [https://github.com/pioneerspacesim/pioneer/pull/2844 turrets] &lt;br /&gt;
**rewrite, basically &lt;br /&gt;
**conflicts with lua trade goods/equipment?   &lt;br /&gt;
&lt;br /&gt;
*Factions &lt;br /&gt;
**Remove random generation of factions &lt;br /&gt;
**Factions into translation system&lt;br /&gt;
**Custom systems into translation system   &lt;br /&gt;
*Separate Player from Ships &lt;br /&gt;
**to enable shuttlecraft and remote drones   &lt;br /&gt;
*Hitpoints: use generic HP value instead of mass. system specific damage? &lt;br /&gt;
*Cargo: use kg instead of tons &lt;br /&gt;
*AI &lt;br /&gt;
**needs more higher level stuff like basic self preservation, modules must not have to implement their own (like tradeships...) &lt;br /&gt;
**formations, anyone? &lt;br /&gt;
**AI vs AI?&lt;br /&gt;
&lt;br /&gt;
=== Gameplay features ===&lt;br /&gt;
&lt;br /&gt;
*Military progression / treason. &lt;br /&gt;
*Something like the Scout missions the walterar has done, exploration jobs. &lt;br /&gt;
*No hypersace from in atmosphere / or too close to a planet surface. &lt;br /&gt;
*In-system hyperspace jumps to make assassination missions and piracy actually possible. &lt;br /&gt;
*Alternatively a Fast-As-Light drive, Shadmar has taken a hacked one I (fluffyfreak) wrote and updated it for Paragon. &lt;br /&gt;
*A reason to actually have [[Crew|Crew]] on the ship. &lt;br /&gt;
** better hyperjump planning, for multiple jumps, &lt;br /&gt;
** Better autopilot (i.e. make actual auto equipment perform worse)&lt;br /&gt;
*Cargo has volume, and this is what limits a cargo hold. [http://pioneerspacesim.net/forum/viewtopic.php?f=3&amp;amp;t=245 forum] &lt;br /&gt;
*Allow player to buy some types of ship equipment as cargo and have it fitted elsewhere &lt;br /&gt;
*Ship visual customization &lt;br /&gt;
*Space stations &lt;br /&gt;
**external docking &lt;br /&gt;
**traffic rules (don't allow modules to let ships idle forever)   &lt;br /&gt;
*Ship to ship [https://github.com/pioneerspacesim/pioneer/issues/3071 docking] / [https://github.com/pioneerspacesim/pioneer/issues/3070 comunication] &lt;br /&gt;
*Networking / &amp;quot;Fake multiplayer&amp;quot; [[Network_features|Network features]]&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3816</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3816"/>
		<updated>2018-10-18T21:11:24Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Add section on Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident rookie software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This change is already in-flight; I am working on a lightweight ECS in C++ tailored to pioneer's needs, and the team has been working on splitting the monolithic core classes up into more manageable chunks - see Propulsion and ShipController.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are pretty much finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Lua Engine ===&lt;br /&gt;
Coming on the heels of the input changes are improvements to Pioneer's Lua engine. At current, Pioneer is using its own feature-incomplete version of &amp;lt;nowiki&amp;gt;require()&amp;lt;/nowiki&amp;gt; (used as &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt;), which supports a very limited method of calling other code files. Additionally, the C++ side of the Lua interface has issues with handling Lua errors - if C++ calls a lua function that errors, the whole engine terminates with an error.&lt;br /&gt;
&lt;br /&gt;
There are several goals to accomplish here, but the major two are:&lt;br /&gt;
* Update &amp;lt;nowiki&amp;gt;import()&amp;lt;/nowiki&amp;gt; to support Lua 5.2+ style &amp;quot;module.submodule&amp;quot; syntax and implicit &amp;quot;init.lua&amp;quot; support.&lt;br /&gt;
* Make throwing a Lua error safe with regards to C++ code, and support arbitrarily disabling a Lua module if it is throwing an error.&lt;br /&gt;
** E.g. if a specific part of the UI throws an error, silently catch it and log it. If it keeps throwing errors, disable the module and inform the user. This is going to require some significant work, but it will make the modding and content-creation ecosystem much more user-friendly.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Engine_Overview&amp;diff=3815</id>
		<title>Engine Overview</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Engine_Overview&amp;diff=3815"/>
		<updated>2018-10-18T19:13:55Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Add section on Lua.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page details the inner workings of the game's engine, and various high-level looks at the gameplay systems.&lt;br /&gt;
&lt;br /&gt;
== Rendering ==&lt;br /&gt;
&lt;br /&gt;
For information about the game's rendering system, see [https://pioneerspacesim.net/forum/viewtopic.php?f=3&amp;amp;t=489 Fluffyfreak's post].&lt;br /&gt;
&lt;br /&gt;
== Input ==&lt;br /&gt;
&lt;br /&gt;
[[File:Input_system.svg|thumb|The engine's input system, as seen from application code.]]&lt;br /&gt;
&lt;br /&gt;
TODO: details on input, including binding axes / actions, reading input, and how to add a new input method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lua Engine ==&lt;br /&gt;
&lt;br /&gt;
TODO: describe the state of the lua runtime, including sandboxing, core imports, and binding ''your'' code to Lua.&lt;br /&gt;
&lt;br /&gt;
== Models and Textures ==&lt;br /&gt;
&lt;br /&gt;
TODO: merge the engine-specific parts of the wiki here, provide a technical overview of the scenegraph system.&lt;br /&gt;
&lt;br /&gt;
== Ships ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ship_systems.svg|thumb|A ship, as represented in code.]]&lt;br /&gt;
&lt;br /&gt;
TODO: information about how a ship (should) work, describe the damage model, the equipment model, the hardpoint system, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Engine_Overview&amp;diff=3814</id>
		<title>Engine Overview</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Engine_Overview&amp;diff=3814"/>
		<updated>2018-10-18T19:12:13Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: First stab at engine internals documentation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page details the inner workings of the game's engine, and various high-level looks at the gameplay systems.&lt;br /&gt;
&lt;br /&gt;
== Rendering ==&lt;br /&gt;
&lt;br /&gt;
For information about the game's rendering system, see [https://pioneerspacesim.net/forum/viewtopic.php?f=3&amp;amp;t=489 Fluffyfreak's post].&lt;br /&gt;
&lt;br /&gt;
== Input ==&lt;br /&gt;
&lt;br /&gt;
[[File:Input_system.svg|thumb|The engine's input system, as seen from application code.]]&lt;br /&gt;
&lt;br /&gt;
TODO: details on input, including binding axes / actions, reading input, and how to add a new input method&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Models and Textures ==&lt;br /&gt;
&lt;br /&gt;
TODO: merge the engine-specific parts of the wiki here, provide a technical overview of the scenegraph system.&lt;br /&gt;
&lt;br /&gt;
== Ships ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ship_systems.svg|thumb|A ship, as represented in code.]]&lt;br /&gt;
&lt;br /&gt;
TODO: information about how a ship (should) work, describe the damage model, the equipment model, the hardpoint system, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:Ship_systems.svg&amp;diff=3813</id>
		<title>File:Ship systems.svg</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:Ship_systems.svg&amp;diff=3813"/>
		<updated>2018-10-18T19:08:37Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: A high-level overview of the ship code in pioneer.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
A high-level overview of the ship code in pioneer.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=File:Input_system.svg&amp;diff=3812</id>
		<title>File:Input system.svg</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=File:Input_system.svg&amp;diff=3812"/>
		<updated>2018-10-18T18:59:39Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: A graph of the input subsystem.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
A graph of the input subsystem.&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=3811</id>
		<title>Pioneer Wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=Pioneer_Wiki&amp;diff=3811"/>
		<updated>2018-10-18T18:55:59Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Add a new link to the documentation page for the engine's internals&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Pioneer is a space adventure game set in the Milkyway galaxy at the turn of the 31st century. The game is open-ended, and you are free to explore the millions of star systems in the game. You can land on planets, slingshot past gas giants, and burn yourself to a crisp flying between binary star systems.&lt;br /&gt;
&lt;br /&gt;
If you are new to pioneer you may want to know [[How_to_start|how to start]].&lt;br /&gt;
&lt;br /&gt;
*[http://pioneerspacesim.net/download Download Pioneer] for Windows, Linux and Mac OSX &lt;br /&gt;
&lt;br /&gt;
Please make this wiki nice. Add stuff about mods, dev, whatever. Be awesome! [[Getting_started|How to get started]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#bbffbb; border:2px solid #99ee99; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Community ===&lt;br /&gt;
&lt;br /&gt;
*[http://pioneerspacesim.net/ Pioneer Space Sim Homepage] &lt;br /&gt;
*[http://spacesimcentral.com/ssc/forum/23-pioneer/ Community forum] &lt;br /&gt;
*[http://pioneerspacesim.net/forum Developer forum] &lt;br /&gt;
*[http://webchat.freenode.net/?channels=#pioneer Pioneer Space Sim on IRC] &lt;br /&gt;
*[http://pioneerspacesim.net/+ Pioneer Space Sim] on Google+ &lt;br /&gt;
*[http://twitter.com/pioneerspacesim @pioneerspacesim] on Twitter &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
*[[Manual|Basic Manual]] &lt;br /&gt;
*[[Flight_UI|Flight UI]] &lt;br /&gt;
*[[Keyboard_and_mouse_controls|Keyboard and mouse controls]] &lt;br /&gt;
*[[Tutorials|Tutorials]] (Outdated and WIP) &lt;br /&gt;
*[[Mission_Types_and_BBS|Mission Types and BBS]] &lt;br /&gt;
*[[Settings_Menu|Settings Menu]] &lt;br /&gt;
*[[FAQ|FAQ]] &lt;br /&gt;
*[[Media_Coverage|Media Coverage]] &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#fff9b1; border:2px solid #f0fe66; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== The Pioneer Universe ===&lt;br /&gt;
&lt;br /&gt;
*[[Pioneer_Universe|Pioneer Universe]] &lt;br /&gt;
*[http://pioneerwiki.com/wiki/Category:Ships Ships] (work in progress) &lt;br /&gt;
*[http://pioneerwiki.com/wiki/Category:Manufacturers Manufacturers] (work in progress) &lt;br /&gt;
*[[Places_of_interest|Places of interest]] &lt;br /&gt;
*[[Ship_Equipment|Ship Equipment]] (work in progress) &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#f0f0ff; border:2px solid #c6c9ff; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Content Creation ===&lt;br /&gt;
&lt;br /&gt;
*[[Mods|Mods]]&lt;br /&gt;
*[[Scripting_and_Mission_Creation|Scripting and Mission Creation]] &lt;br /&gt;
*[[Custom_Systems|Custom Systems]] &lt;br /&gt;
*[[Design_and_Concept_art|Design and Concept art]] &lt;br /&gt;
*[[Modeling,_Texturing,_Graphics_Design|Modeling, Texturing, Graphics Design]] &lt;br /&gt;
*[[Music_and_Sound|Music and Sound]] &lt;br /&gt;
*[[Translations|Translations]] &lt;br /&gt;
*[[Licensing|Licensing]] &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#fff3e3; border:2px solid #ffc9c9; padding:2px 2px 4px 4px; vertical-align: top&amp;quot; width=&amp;quot;33%&amp;quot; | &lt;br /&gt;
=== Development ===&lt;br /&gt;
&lt;br /&gt;
*[[Design_Scope|Game Scope]] &lt;br /&gt;
*[[How_you_can_contribute|How you can contribute]] &lt;br /&gt;
*[[Getting_Started_with_Development|Getting Started with Development]] &lt;br /&gt;
**[[How_to_communicate|How to communicate]] &lt;br /&gt;
**[[Using_git_and_GitHub|Using git and GitHub]] &lt;br /&gt;
**[[Code_style|Code style]]&lt;br /&gt;
**[[Development_team|Development team]]  &lt;br /&gt;
**[[Engine_Overview|Engine internals overview]] &lt;br /&gt;
*[[Development_Model|Development Model]] &lt;br /&gt;
*[[Design_Workflow|Design and Project Management Workflow]] &lt;br /&gt;
*[https://github.com/pioneerspacesim/pioneer/issues Issue tracker] &lt;br /&gt;
*[[Roadmap|Roadmap]] &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pioneer is brought to you by a flock of [https://github.com/pioneerspacesim/pioneer/blob/master/AUTHORS.txt opensource beardy-weirdies], and is [http://www.gnu.org/licenses/gpl.html Free Software]&lt;br /&gt;
&lt;br /&gt;
'''__NOTOC__'''&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3810</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3810"/>
		<updated>2018-10-16T20:41:18Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Add the ECS and Input tasks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident rookie software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
==== Entity Component System (ECS) Model ====&lt;br /&gt;
Convert the Pioneer codebase to use a composition-based model instead of an inheritance-based model.&lt;br /&gt;
* The rationale behind this decision is that an inheritance-based architecture for gameplay objects is generally unsustainable without some form of composition, especially so when mods are involved - what if your mod wants to add a different implementation of a hyperdrive?&lt;br /&gt;
* This change is already in-flight; I am working on a lightweight ECS in C++ tailored to pioneer's needs, and the team has been working on splitting the monolithic core classes up into more manageable chunks - see Propulsion and ShipController.&lt;br /&gt;
&lt;br /&gt;
==== Input System ====&lt;br /&gt;
Before I started working on Pioneer, the input system was particularly archaic; inputs were defined with macros in a single file that got &amp;lt;nowiki&amp;gt;#include&amp;lt;/nowiki&amp;gt;d into about 4 different files and compiled into the binary - needless to say, if you wanted a new input axis or action, you had to recompile the entire game.&lt;br /&gt;
&lt;br /&gt;
The input system is currently being refactored into a modular, moddable system which supports sharing axes between systems and modules and defining entirely new axes and actions in mods.&lt;br /&gt;
&lt;br /&gt;
This change is about half done - the technical underpinnings of the system are pretty much finished, and all that's left is to expose it to Lua.&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3809</id>
		<title>User:Sturnclaw</title>
		<link rel="alternate" type="text/html" href="https://wiki.pioneerspacesim.net/index.php?title=User:Sturnclaw&amp;diff=3809"/>
		<updated>2018-10-16T18:01:29Z</updated>

		<summary type="html">&lt;p&gt;Sturnclaw: Start scaffolding The List.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello! My name is Sturnclaw. Your code offends me. Prepare to die.&lt;br /&gt;
&lt;br /&gt;
In more serious news, I'm known as Sturnclaw around here. In demeanor, I'm pretty much your typical overconfident rookie software engineer who thinks he can do anything given enough time and sauerkraut – I'll leave the verification of that claim up to the reader.&lt;br /&gt;
&lt;br /&gt;
A cursory search will reveal that I'm the owner and head of Web eWorks, LTD, and when I'm not busy with that or one of a number of side projects, I work on Pioneer to brush up my C++ skills.&lt;br /&gt;
&lt;br /&gt;
You can find me on Github as [https://github.com/web-eworks Web eWorks], or on IRC as sturnclaw.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
Upon the recommendation of several members of the team, I have begun to curate The List, stored right here on this page.&lt;br /&gt;
&lt;br /&gt;
What is &amp;quot;The List&amp;quot;, you ask? The List is basically a copy of Pioneer's roadmap, kept fairly current to the latest IRC &amp;lt;s&amp;gt;fantasizing&amp;lt;/s&amp;gt; plans, and annotated with my thoughts and recommendations for implementation. It is estimated that completing all of the items on The List will take between 5 and 15 person-years of development work, so if you want to implement something here, go right ahead.&lt;br /&gt;
&lt;br /&gt;
Without further ado, I present The List:&lt;br /&gt;
&lt;br /&gt;
=== Core Tech: ===&lt;br /&gt;
&lt;br /&gt;
=== Gameplay: ===&lt;br /&gt;
&lt;br /&gt;
=== Rendering: ===&lt;br /&gt;
&lt;br /&gt;
=== Content: ===&lt;/div&gt;</summary>
		<author><name>Sturnclaw</name></author>
		
	</entry>
</feed>