<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.beestation13.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Itsmeowdev</id>
	<title>BeeStation Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.beestation13.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Itsmeowdev"/>
	<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/view/Special:Contributions/Itsmeowdev"/>
	<updated>2026-07-20T02:57:57Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_signals&amp;diff=37285</id>
		<title>Guide to signals</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_signals&amp;diff=37285"/>
		<updated>2023-12-28T06:18:34Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Add patterns and clarify send_signal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is a signal? ==&lt;br /&gt;
&lt;br /&gt;
A signal is a standard interface for calling procs on components and other objects. It prevents holding hard references and allows the procs to be called on multiple objects from one &amp;quot;event&amp;quot;. It is an event-subscriber system, where one thing &amp;quot;shouts&amp;quot;, or emits an event, and multiple things &amp;quot;listen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Why signals? ==&lt;br /&gt;
&lt;br /&gt;
In code, signals can improve quality and stability, because you do not have to collect a list of things and then call a proc on them if you want to inform them of a certain event happening. For example, previously, you may have needed to hold a reference to something or maintain a list of things that want to hear about an event occuring. Signals are built into every datum and object, and perform this duty automatically. Signals can also replace the need to check values on a component or other object, as you can simply emit a signal requesting it, and have the other object listen for it and respond.&lt;br /&gt;
&lt;br /&gt;
For example, many things in the game care if a player dies. Because of that, we have a signal called &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt;, that is emitted by mobs when they die. It provides data with it as well (what emitted it, current health, etc.) that may be useful to the &amp;quot;listener&amp;quot;. Signals can also be returned with a value to the emitter, allowing further interactions between objects.&lt;br /&gt;
&lt;br /&gt;
== How do I use signals? ==&lt;br /&gt;
&lt;br /&gt;
Signals are made of several parts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;An emitter&#039;&#039;&#039;, which calls &amp;lt;code&amp;gt;SEND_SIGNAL()&amp;lt;/code&amp;gt;. This emits the signal to anything that is currently listening to the emitter.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A listener&#039;&#039;&#039;, which calls &amp;lt;code&amp;gt;RegisterSignal&amp;lt;/code&amp;gt; with the emitter as an argument, and provides a signal type and a signal callback.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A signal type&#039;&#039;&#039;, which is the type of signal being emitted or listened to. This is what &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; is - it&#039;s a unique string that denotes the type of signal being sent, and when it is sent or how it is to be used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A signal callback&#039;&#039;&#039;, which is a proc that receives data from the emitter&#039;s signal for a specific signal type.&lt;br /&gt;
&lt;br /&gt;
=== Adding or selecting a type ===&lt;br /&gt;
&lt;br /&gt;
All signals have a type, which is the unique string describing what the signal is used for or when it is emitted. All types are stored in &amp;lt;code&amp;gt;code/__DEFINES/dcs/signals/&amp;lt;/code&amp;gt;, and sorted into categories based on the type of the emitter. For example, any signal sent only by &amp;lt;code&amp;gt;/mob/&amp;lt;/code&amp;gt; types should be in &amp;lt;code&amp;gt;signals_mob/signals_mob.dm&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This is what a signal type definition looks like. The string in the signal should be unique to the signal type - and is usually the lowercase of everything after &amp;lt;code&amp;gt;COMSIG_&amp;lt;/code&amp;gt;. It is also standard to document when a signal is sent within the comment, either by stating it or providing a proc path for the case where &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; is used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define COMSIG_MOB_DEATH &amp;quot;mob_death&amp;quot; //! from base of mob/death(): (gibbed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parent path for the signal should be the highest path for which the signal is relevant. For example, there is both &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;COMSIG_LIVING_DEATH&amp;lt;/code&amp;gt;, because some places only care when a living mob dies. When creating a signal, determine which context is most useful or applicable, and apply it to the highest object possible. &amp;lt;code&amp;gt;COMSIG_LIVING_DEATH&amp;lt;/code&amp;gt; provides additional arguments (or context) when the signal is emitted, making it necessary should anything require this information.&lt;br /&gt;
&lt;br /&gt;
=== Listening for a signal ===&lt;br /&gt;
&lt;br /&gt;
This is one of the most common patterns in the entire codebase, so it is absolutely vital to understand. When you want to receive a signal from an atom or datum, you call &amp;lt;code&amp;gt;RegisterSignal&amp;lt;/code&amp;gt; with that atom or datum as the first argument, a signal type, and then a signal listener.&lt;br /&gt;
&lt;br /&gt;
This is often done during &amp;lt;code&amp;gt;Initialize()&amp;lt;/code&amp;gt;, however it can take place at any time so long as the emitter exists. Do note that RegisterSignal is a type on /datum, so it is implicitly calling &amp;lt;code&amp;gt;src.RegisterSignal()&amp;lt;/code&amp;gt;. This means you can technically force another datum to register a signal listener via &amp;lt;code&amp;gt;other_thing.RegisterSignal(emitter)&amp;lt;/code&amp;gt;, however this is not recommended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RegisterSignal(emitter_here, COMSIG_MOB_DEATH, PROC_REF(on_mob_death))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, the signal registration requires a signal listener. These are procs with a special format. In a signal&#039;s comment, or when it is emitted, there is usually a list of arguments, or simply no arguments. These arguments are provided to the signal listener as additional data. When defining a listener, you can choose to include these arguments if you need them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/datum/example/proc/on_mob_death(mob/parent, gibbed)&lt;br /&gt;
    SIGNAL_HANDLER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, the first argument provided to a signal listener is ALWAYS the emitter, so you can assume for &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; that it is of the type &amp;lt;code&amp;gt;/mob&amp;lt;/code&amp;gt;. The remaining arguments are defined by the emitter itself when the signal is sent. You do not need to include any arguments if you do not want them.&lt;br /&gt;
&lt;br /&gt;
You can also see that signal listeners always start with &amp;lt;code&amp;gt;SIGNAL_HANDLER&amp;lt;/code&amp;gt;. This is a special DEFINE that disables sleeping within the proc, as sleeping in a signal listener can break the master controller&#039;s timing. It is important to include this in all signal listeners, since it is not checked automatically otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Stopping listening to a signal ===&lt;br /&gt;
&lt;br /&gt;
Registering a signal on an emitter stores a reference to that emitter. This is problematic if the emitter were to be deleted or dissociated from the listener, as there is not a reference the other way around. It is generally the responsibility of the listener to control its own references to the emitter. For example, if we have an object that was listening for another object&#039;s death, but only once, we could unregister the signal during &amp;lt;code&amp;gt;on_mob_death&amp;lt;/code&amp;gt; so as to prevent holding a reference.&lt;br /&gt;
&lt;br /&gt;
Unregistering a signal is simple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UnregisterSignal(emitter_here, COMSIG_MOB_DEATH)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;&#039;s listener for &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is also important to know that all atoms and datums will automatically unregister all their signals when they are destroyed, so there is no need to do so yourself during &amp;lt;code&amp;gt;Destroy()&amp;lt;/code&amp;gt;, however some things like components or species need to remove signals when they are &#039;dissociated&#039;, such as on_species_loss, or when a component is detached, as they are not always immediately destroyed.&lt;br /&gt;
&lt;br /&gt;
=== Emitting or sending a signal ===&lt;br /&gt;
&lt;br /&gt;
To send a signal, and retrieve results from listeners, you simply use the &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; define.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SEND_SIGNAL(src, COMSIG_MOB_DEATH)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first argument is the emitter, so often it is &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, however this is not a rule. You can also emit signals &#039;&#039;&#039;from&#039;&#039;&#039; other objects! It is a common pattern to emit a signal &#039;&#039;&#039;from&#039;&#039; another object, and have the object listen to signals on itself to respond to it. The second argument is always the type. You may provide additional arguments that will be sent as extra arguments to all listeners, as discussed earlier.&lt;br /&gt;
&lt;br /&gt;
Another key feature of &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; is that it can return a result. If a signal listener has a return value, it will be given as the result of &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt;. This means you can retrieve and act on data from listeners.&lt;br /&gt;
&lt;br /&gt;
For example, this is used by emag signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/atom/proc/use_emag(mob/user, obj/item/card/emag/hacker)&lt;br /&gt;
	if(!SEND_SIGNAL(src, COMSIG_ATOM_SHOULD_EMAG, user))&lt;br /&gt;
		SEND_SIGNAL(src, COMSIG_ATOM_ON_EMAG, user, hacker)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the result of &amp;lt;code&amp;gt;COMSIG_ATOM_SHOULD_EMAG&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;, then &amp;lt;code&amp;gt;COMSIG_ATOM_ON_EMAG&amp;lt;/code&amp;gt; is sent as well. Do note that this is intentionally inverted in case of an error, since procs will return null when they error, so this should be taken into consideration when sending signals to unknown listeners.&lt;br /&gt;
&lt;br /&gt;
=== Signal Patterns ===&lt;br /&gt;
&lt;br /&gt;
There are many ways to utilize signals, here are some common ones:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Event-&amp;gt;Listener:&#039;&#039;&#039; Use a global signal to emit an &#039;event&#039; occurring to anything that is listening.&lt;br /&gt;
* &#039;&#039;&#039;Component&amp;lt;-&amp;gt;Parent:&#039;&#039;&#039; Use a signal to communicate data between a component and its parent. This avoids the bad practice of GetComponent(), and allows components to react to events from the parent. This can use combinations of other patterns, but with components rather than objects.&lt;br /&gt;
* &#039;&#039;&#039;Object-&amp;gt;Object:&#039;&#039;&#039; Use a signal to inform an object of something happening to it. The listening object will register a signal to itself, if it cares about this interaction.&lt;br /&gt;
* &#039;&#039;&#039;QDELETING:&#039;&#039;&#039; &amp;lt;code&amp;gt;COMSIG_PARENT_QDELETING&amp;lt;/code&amp;gt; is one of the most used signals, it fires when the emitter is Destroy()ing. This allows the listener to clean up any references it has to the emitter, so it can delete properly.&lt;br /&gt;
* &#039;&#039;&#039;Object-&amp;gt;Listener:&#039;&#039;&#039; Use a signal to inform listeners of something happening within an object. This is used to avoid hard-coding unnecessary references. An example of this is the MOB_LOGOUT or MOB_DEATH signal.&lt;br /&gt;
* &#039;&#039;&#039;Self-&amp;gt;Listener:&#039;&#039;&#039; Use a signal to react to an event from within an object inside that same object. This is used when the two events are not related, to avoid hard-coding the event response. It can also be used to react to events from within the parent type without performing a method override.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Global Signals ==&lt;br /&gt;
&lt;br /&gt;
Global signals are a special type of signal that can be emitted to listeners at any time, and can be listened to by any object. They do not require specifying where to send a signal to. This is helpful for events that may impact a large variety of objects in varying ways, or when the relationship between two events is weak but unnecessary, making hard-coding it bad practice. A good example of this is the explosion global signal. Many things care if an explosion has happened, such as the Tachyon-Doppler array, but it would not make sense to hard-code that logic into the explode proc. Hence, a global signal.&lt;br /&gt;
&lt;br /&gt;
To emit a global signal, use &amp;lt;code&amp;gt;SEND_GLOBAL_SIGNAL&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CREW_MANIFEST_UPDATE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listening to a global signal requires listening to &amp;lt;code&amp;gt;SSdcs&amp;lt;/code&amp;gt;, which is the subsystem responsible for signal emissions. This is because behind the scenes, &amp;lt;code&amp;gt;SEND_GLOBAL_SIGNAL&amp;lt;/code&amp;gt; actually just sends a signal to &amp;lt;code&amp;gt;SSdcs&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RegisterSignal(SSdcs, COMSIG_GLOB_CREW_MANIFEST_UPDATE, PROC_REF(on_crew_manifest_update))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
[[Category:Guides]] [[Category:Game Resources]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_signals&amp;diff=37284</id>
		<title>Guide to signals</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_signals&amp;diff=37284"/>
		<updated>2023-12-28T05:57:04Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Describe global signals&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is a signal? ==&lt;br /&gt;
&lt;br /&gt;
A signal is a standard interface for calling procs on components and other objects. It prevents holding hard references and allows the procs to be called on multiple objects from one &amp;quot;event&amp;quot;. It is an event-subscriber system, where one thing &amp;quot;shouts&amp;quot;, or emits an event, and multiple things &amp;quot;listen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Why signals? ==&lt;br /&gt;
&lt;br /&gt;
In code, signals can improve quality and stability, because you do not have to collect a list of things and then call a proc on them if you want to inform them of a certain event happening. For example, previously, you may have needed to hold a reference to something or maintain a list of things that want to hear about an event occuring. Signals are built into every datum and object, and perform this duty automatically. Signals can also replace the need to check values on a component or other object, as you can simply emit a signal requesting it, and have the other object listen for it and respond.&lt;br /&gt;
&lt;br /&gt;
For example, many things in the game care if a player dies. Because of that, we have a signal called &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt;, that is emitted by mobs when they die. It provides data with it as well (what emitted it, current health, etc.) that may be useful to the &amp;quot;listener&amp;quot;. Signals can also be returned with a value to the emitter, allowing further interactions between objects.&lt;br /&gt;
&lt;br /&gt;
== How do I use signals? ==&lt;br /&gt;
&lt;br /&gt;
Signals are made of several parts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;An emitter&#039;&#039;&#039;, which calls &amp;lt;code&amp;gt;SEND_SIGNAL()&amp;lt;/code&amp;gt;. This emits the signal to anything that is currently listening to the emitter.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A listener&#039;&#039;&#039;, which calls &amp;lt;code&amp;gt;RegisterSignal&amp;lt;/code&amp;gt; with the emitter as an argument, and provides a signal type and a signal callback.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A signal type&#039;&#039;&#039;, which is the type of signal being emitted or listened to. This is what &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; is - it&#039;s a unique string that denotes the type of signal being sent, and when it is sent or how it is to be used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A signal callback&#039;&#039;&#039;, which is a proc that receives data from the emitter&#039;s signal for a specific signal type.&lt;br /&gt;
&lt;br /&gt;
=== Adding or selecting a type ===&lt;br /&gt;
&lt;br /&gt;
All signals have a type, which is the unique string describing what the signal is used for or when it is emitted. All types are stored in &amp;lt;code&amp;gt;code/__DEFINES/dcs/signals/&amp;lt;/code&amp;gt;, and sorted into categories based on the type of the emitter. For example, any signal sent only by &amp;lt;code&amp;gt;/mob/&amp;lt;/code&amp;gt; types should be in &amp;lt;code&amp;gt;signals_mob/signals_mob.dm&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This is what a signal type definition looks like. The string in the signal should be unique to the signal type - and is usually the lowercase of everything after &amp;lt;code&amp;gt;COMSIG_&amp;lt;/code&amp;gt;. It is also standard to document when a signal is sent within the comment, either by stating it or providing a proc path for the case where &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; is used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define COMSIG_MOB_DEATH &amp;quot;mob_death&amp;quot; //! from base of mob/death(): (gibbed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parent path for the signal should be the highest path for which the signal is relevant. For example, there is both &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;COMSIG_LIVING_DEATH&amp;lt;/code&amp;gt;, because some places only care when a living mob dies. When creating a signal, determine which context is most useful or applicable, and apply it to the highest object possible. &amp;lt;code&amp;gt;COMSIG_LIVING_DEATH&amp;lt;/code&amp;gt; provides additional arguments (or context) when the signal is emitted, making it necessary should anything require this information.&lt;br /&gt;
&lt;br /&gt;
=== Listening for a signal ===&lt;br /&gt;
&lt;br /&gt;
This is one of the most common patterns in the entire codebase, so it is absolutely vital to understand. When you want to receive a signal from an atom or datum, you call &amp;lt;code&amp;gt;RegisterSignal&amp;lt;/code&amp;gt; with that atom or datum as the first argument, a signal type, and then a signal listener.&lt;br /&gt;
&lt;br /&gt;
This is often done during &amp;lt;code&amp;gt;Initialize()&amp;lt;/code&amp;gt;, however it can take place at any time so long as the emitter exists. Do note that RegisterSignal is a type on /datum, so it is implicitly calling &amp;lt;code&amp;gt;src.RegisterSignal()&amp;lt;/code&amp;gt;. This means you can technically force another datum to register a signal listener via &amp;lt;code&amp;gt;other_thing.RegisterSignal(emitter)&amp;lt;/code&amp;gt;, however this is not recommended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RegisterSignal(emitter_here, COMSIG_MOB_DEATH, PROC_REF(on_mob_death))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, the signal registration requires a signal listener. These are procs with a special format. In a signal&#039;s comment, or when it is emitted, there is usually a list of arguments, or simply no arguments. These arguments are provided to the signal listener as additional data. When defining a listener, you can choose to include these arguments if you need them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/datum/example/proc/on_mob_death(mob/parent, gibbed)&lt;br /&gt;
    SIGNAL_HANDLER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, the first argument provided to a signal listener is ALWAYS the emitter, so you can assume for &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; that it is of the type &amp;lt;code&amp;gt;/mob&amp;lt;/code&amp;gt;. The remaining arguments are defined by the emitter itself when the signal is sent. You do not need to include any arguments if you do not want them.&lt;br /&gt;
&lt;br /&gt;
You can also see that signal listeners always start with &amp;lt;code&amp;gt;SIGNAL_HANDLER&amp;lt;/code&amp;gt;. This is a special DEFINE that disables sleeping within the proc, as sleeping in a signal listener can break the master controller&#039;s timing. It is important to include this in all signal listeners, since it is not checked automatically otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Stopping listening to a signal ===&lt;br /&gt;
&lt;br /&gt;
Registering a signal on an emitter stores a reference to that emitter. This is problematic if the emitter were to be deleted or dissociated from the listener, as there is not a reference the other way around. It is generally the responsibility of the listener to control its own references to the emitter. For example, if we have an object that was listening for another object&#039;s death, but only once, we could unregister the signal during &amp;lt;code&amp;gt;on_mob_death&amp;lt;/code&amp;gt; so as to prevent holding a reference.&lt;br /&gt;
&lt;br /&gt;
Unregistering a signal is simple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UnregisterSignal(emitter_here, COMSIG_MOB_DEATH)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;&#039;s listener for &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is also important to know that all atoms and datums will automatically unregister all their signals when they are destroyed, so there is no need to do so yourself during &amp;lt;code&amp;gt;Destroy()&amp;lt;/code&amp;gt;, however some things like components or species need to remove signals when they are &#039;dissociated&#039;, such as on_species_loss, or when a component is detached, as they are not always immediately destroyed.&lt;br /&gt;
&lt;br /&gt;
=== Emitting or sending a signal ===&lt;br /&gt;
&lt;br /&gt;
To send a signal, and retrieve results from listeners, you simply use the &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; define.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SEND_SIGNAL(src, COMSIG_MOB_DEATH)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first argument is the emitter, so often it is &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, however this is not a rule. You can also emit signals to other objects! The second argument is always the type. You may provide additional arguments that will be sent as extra arguments to all listeners, as discussed earlier.&lt;br /&gt;
&lt;br /&gt;
Another key feature of &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; is that it can return a result. If a signal listener has a return value, it will be given as the result of &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt;. This means you can retrieve and act on data from listeners.&lt;br /&gt;
&lt;br /&gt;
For example, this is used by emag signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/atom/proc/use_emag(mob/user, obj/item/card/emag/hacker)&lt;br /&gt;
	if(!SEND_SIGNAL(src, COMSIG_ATOM_SHOULD_EMAG, user))&lt;br /&gt;
		SEND_SIGNAL(src, COMSIG_ATOM_ON_EMAG, user, hacker)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the result of &amp;lt;code&amp;gt;COMSIG_ATOM_SHOULD_EMAG&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;, then &amp;lt;code&amp;gt;COMSIG_ATOM_ON_EMAG&amp;lt;/code&amp;gt; is sent as well. Do note that this is intentionally inverted in case of an error, since procs will return null when they error, so this should be taken into consideration when sending signals to unknown listeners.&lt;br /&gt;
&lt;br /&gt;
== Global Signals ==&lt;br /&gt;
&lt;br /&gt;
Global signals are a special type of signal that can be emitted to listeners at any time, and can be listened to by any object. They do not require specifying where to send a signal to. This is helpful for events that may impact a large variety of objects in varying ways, or when the relationship between two events is weak but unnecessary, making hard-coding it bad practice. A good example of this is the explosion global signal. Many things care if an explosion has happened, such as the Tachyon-Doppler array, but it would not make sense to hard-code that logic into the explode proc. Hence, a global signal.&lt;br /&gt;
&lt;br /&gt;
To emit a global signal, use &amp;lt;code&amp;gt;SEND_GLOBAL_SIGNAL&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CREW_MANIFEST_UPDATE)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listening to a global signal requires listening to &amp;lt;code&amp;gt;SSdcs&amp;lt;/code&amp;gt;, which is the subsystem responsible for signal emissions. This is because behind the scenes, &amp;lt;code&amp;gt;SEND_GLOBAL_SIGNAL&amp;lt;/code&amp;gt; actually just sends a signal to &amp;lt;code&amp;gt;SSdcs&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RegisterSignal(SSdcs, COMSIG_GLOB_CREW_MANIFEST_UPDATE, PROC_REF(on_crew_manifest_update))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
[[Category:Guides]] [[Category:Game Resources]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_signals&amp;diff=37283</id>
		<title>Guide to signals</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_signals&amp;diff=37283"/>
		<updated>2023-12-28T05:49:21Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* Emitting or sending a signal */ Include emits to other objects&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is a signal? ==&lt;br /&gt;
&lt;br /&gt;
A signal is a standard interface for calling procs on components and other objects. It prevents holding hard references and allows the procs to be called on multiple objects from one &amp;quot;event&amp;quot;. It is an event-subscriber system, where one thing &amp;quot;shouts&amp;quot;, or emits an event, and multiple things &amp;quot;listen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Why signals? ==&lt;br /&gt;
&lt;br /&gt;
In code, signals can improve quality and stability, because you do not have to collect a list of things and then call a proc on them if you want to inform them of a certain event happening. For example, previously, you may have needed to hold a reference to something or maintain a list of things that want to hear about an event occuring. Signals are built into every datum and object, and perform this duty automatically. Signals can also replace the need to check values on a component or other object, as you can simply emit a signal requesting it, and have the other object listen for it and respond.&lt;br /&gt;
&lt;br /&gt;
For example, many things in the game care if a player dies. Because of that, we have a signal called &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt;, that is emitted by mobs when they die. It provides data with it as well (what emitted it, current health, etc.) that may be useful to the &amp;quot;listener&amp;quot;. Signals can also be returned with a value to the emitter, allowing further interactions between objects.&lt;br /&gt;
&lt;br /&gt;
== How do I use signals? ==&lt;br /&gt;
&lt;br /&gt;
Signals are made of several parts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;An emitter&#039;&#039;&#039;, which calls &amp;lt;code&amp;gt;SEND_SIGNAL()&amp;lt;/code&amp;gt;. This emits the signal to anything that is currently listening to the emitter.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A listener&#039;&#039;&#039;, which calls &amp;lt;code&amp;gt;RegisterSignal&amp;lt;/code&amp;gt; with the emitter as an argument, and provides a signal type and a signal callback.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A signal type&#039;&#039;&#039;, which is the type of signal being emitted or listened to. This is what &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; is - it&#039;s a unique string that denotes the type of signal being sent, and when it is sent or how it is to be used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A signal callback&#039;&#039;&#039;, which is a proc that receives data from the emitter&#039;s signal for a specific signal type.&lt;br /&gt;
&lt;br /&gt;
=== Adding or selecting a type ===&lt;br /&gt;
&lt;br /&gt;
All signals have a type, which is the unique string describing what the signal is used for or when it is emitted. All types are stored in &amp;lt;code&amp;gt;code/__DEFINES/dcs/signals/&amp;lt;/code&amp;gt;, and sorted into categories based on the type of the emitter. For example, any signal sent only by &amp;lt;code&amp;gt;/mob/&amp;lt;/code&amp;gt; types should be in &amp;lt;code&amp;gt;signals_mob/signals_mob.dm&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This is what a signal type definition looks like. The string in the signal should be unique to the signal type - and is usually the lowercase of everything after &amp;lt;code&amp;gt;COMSIG_&amp;lt;/code&amp;gt;. It is also standard to document when a signal is sent within the comment, either by stating it or providing a proc path for the case where &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; is used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define COMSIG_MOB_DEATH &amp;quot;mob_death&amp;quot; //! from base of mob/death(): (gibbed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parent path for the signal should be the highest path for which the signal is relevant. For example, there is both &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;COMSIG_LIVING_DEATH&amp;lt;/code&amp;gt;, because some places only care when a living mob dies. When creating a signal, determine which context is most useful or applicable, and apply it to the highest object possible. &amp;lt;code&amp;gt;COMSIG_LIVING_DEATH&amp;lt;/code&amp;gt; provides additional arguments (or context) when the signal is emitted, making it necessary should anything require this information.&lt;br /&gt;
&lt;br /&gt;
=== Listening for a signal ===&lt;br /&gt;
&lt;br /&gt;
This is one of the most common patterns in the entire codebase, so it is absolutely vital to understand. When you want to receive a signal from an atom or datum, you call &amp;lt;code&amp;gt;RegisterSignal&amp;lt;/code&amp;gt; with that atom or datum as the first argument, a signal type, and then a signal listener.&lt;br /&gt;
&lt;br /&gt;
This is often done during &amp;lt;code&amp;gt;Initialize()&amp;lt;/code&amp;gt;, however it can take place at any time so long as the emitter exists. Do note that RegisterSignal is a type on /datum, so it is implicitly calling &amp;lt;code&amp;gt;src.RegisterSignal()&amp;lt;/code&amp;gt;. This means you can technically force another datum to register a signal listener via &amp;lt;code&amp;gt;other_thing.RegisterSignal(emitter)&amp;lt;/code&amp;gt;, however this is not recommended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RegisterSignal(emitter_here, COMSIG_MOB_DEATH, PROC_REF(on_mob_death))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, the signal registration requires a signal listener. These are procs with a special format. In a signal&#039;s comment, or when it is emitted, there is usually a list of arguments, or simply no arguments. These arguments are provided to the signal listener as additional data. When defining a listener, you can choose to include these arguments if you need them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/datum/example/proc/on_mob_death(mob/parent, gibbed)&lt;br /&gt;
    SIGNAL_HANDLER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, the first argument provided to a signal listener is ALWAYS the emitter, so you can assume for &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; that it is of the type &amp;lt;code&amp;gt;/mob&amp;lt;/code&amp;gt;. The remaining arguments are defined by the emitter itself when the signal is sent. You do not need to include any arguments if you do not want them.&lt;br /&gt;
&lt;br /&gt;
You can also see that signal listeners always start with &amp;lt;code&amp;gt;SIGNAL_HANDLER&amp;lt;/code&amp;gt;. This is a special DEFINE that disables sleeping within the proc, as sleeping in a signal listener can break the master controller&#039;s timing. It is important to include this in all signal listeners, since it is not checked automatically otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Stopping listening to a signal ===&lt;br /&gt;
&lt;br /&gt;
Registering a signal on an emitter stores a reference to that emitter. This is problematic if the emitter were to be deleted or dissociated from the listener, as there is not a reference the other way around. It is generally the responsibility of the listener to control its own references to the emitter. For example, if we have an object that was listening for another object&#039;s death, but only once, we could unregister the signal during &amp;lt;code&amp;gt;on_mob_death&amp;lt;/code&amp;gt; so as to prevent holding a reference.&lt;br /&gt;
&lt;br /&gt;
Unregistering a signal is simple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UnregisterSignal(emitter_here, COMSIG_MOB_DEATH)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;&#039;s listener for &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is also important to know that all atoms and datums will automatically unregister all their signals when they are destroyed, so there is no need to do so yourself during &amp;lt;code&amp;gt;Destroy()&amp;lt;/code&amp;gt;, however some things like components or species need to remove signals when they are &#039;dissociated&#039;, such as on_species_loss, or when a component is detached, as they are not always immediately destroyed.&lt;br /&gt;
&lt;br /&gt;
=== Emitting or sending a signal ===&lt;br /&gt;
&lt;br /&gt;
To send a signal, and retrieve results from listeners, you simply use the &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; define.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SEND_SIGNAL(src, COMSIG_MOB_DEATH)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first argument is the emitter, so often it is &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, however this is not a rule. You can also emit signals to other objects! The second argument is always the type. You may provide additional arguments that will be sent as extra arguments to all listeners, as discussed earlier.&lt;br /&gt;
&lt;br /&gt;
Another key feature of &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; is that it can return a result. If a signal listener has a return value, it will be given as the result of &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt;. This means you can retrieve and act on data from listeners.&lt;br /&gt;
&lt;br /&gt;
For example, this is used by emag signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/atom/proc/use_emag(mob/user, obj/item/card/emag/hacker)&lt;br /&gt;
	if(!SEND_SIGNAL(src, COMSIG_ATOM_SHOULD_EMAG, user))&lt;br /&gt;
		SEND_SIGNAL(src, COMSIG_ATOM_ON_EMAG, user, hacker)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the result of &amp;lt;code&amp;gt;COMSIG_ATOM_SHOULD_EMAG&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;, then &amp;lt;code&amp;gt;COMSIG_ATOM_ON_EMAG&amp;lt;/code&amp;gt; is sent as well. Do note that this is intentionally inverted in case of an error, since procs will return null when they error, so this should be taken into consideration when sending signals to unknown listeners.&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
[[Category:Guides]] [[Category:Game Resources]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=37269</id>
		<title>Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=37269"/>
		<updated>2023-12-19T06:35:13Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* Coding */ Add guide to signals&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an index-page for finding guides related to aspects of development and contributing to the game. Guides will be linked with a short description of what they are about.&lt;br /&gt;
&lt;br /&gt;
Feel free to add to this page if you have any resources that may help aspiring developers. It is recommended you keep guides within the bounds of this wiki.&lt;br /&gt;
&lt;br /&gt;
For design direction and coding guidelines, see https://github.com/BeeStation/BeeStation-Hornet/wiki&lt;br /&gt;
== Resources ==&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
=== Design ===&lt;br /&gt;
* Design Goals - https://github.com/BeeStation/BeeStation-Hornet/wiki/Design-Goals - The current goals and direction of the game.&lt;br /&gt;
=== Coding ===&lt;br /&gt;
* Code Standards - https://github.com/BeeStation/BeeStation-Hornet/wiki/Code-Standards - The essential guidelines that maintainers look for in a PR.&lt;br /&gt;
&lt;br /&gt;
* Guide to coding - https://hackmd.io/@BdkEQ8tISgW8Pbn2OquQxQ/B1SeqStVq - Making a new item in the game from scratch, from environment setup to the Pull Request.&lt;br /&gt;
&lt;br /&gt;
* Guide to hard-dels - https://hackmd.io/@PowerfulBacon/guide_to_harddels - Explains how to avoid hard deletes, a quirk of the game&#039;s garbage collection.&lt;br /&gt;
* [[Understanding SS13 code]] - An older guide, explaining SS13 and DM to new coders&lt;br /&gt;
* [[SS13 for experienced programmers]] - Another older guide, explaining SS13 and DM to experienced coders.&lt;br /&gt;
* [[Guide to signals]] - A guide explaining what signals are in SS13 code, and how to use them.&lt;br /&gt;
*Visuals - https://github.com/tgstation/tgstation/blob/master/.github/guides/VISUALS.md - Guide describing most things relating to visuals and rendering on /tg/, however most of it also applies on BeeStation.&lt;br /&gt;
=== Development ===&lt;br /&gt;
* [[Working with the database#Database Setup|Working with the database]] - Setting up a local database for testing purposes, very useful for testing persistence and reducing development time.&lt;br /&gt;
&lt;br /&gt;
* [[Guide to git]] - Using git command line, as well as dealing with merge conflicts and using mapmerge/dmimerge&lt;br /&gt;
=== Spriting ===&lt;br /&gt;
* [[Guide to spriting]] - How to create sprites for the game. This is fairly outdated, however.&lt;br /&gt;
=== Mapping ===&lt;br /&gt;
* [[Guide to mapping]] - Many tips, tricks, and guidelines for creating maps.&lt;br /&gt;
* [[Map Merger]] - Use of mapmerge2, a vital tool for resolving map merge conflicts, as well as installing Git hooks.&lt;br /&gt;
* [[Guide to mapping/Exploration ruins]] - Guide explaining how to map exploration ruins.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Template:Contribution_guides&amp;diff=37268</id>
		<title>Template:Contribution guides</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Template:Contribution_guides&amp;diff=37268"/>
		<updated>2023-12-19T06:34:28Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Add guide to signals&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&#039;background-color:#e7e7ff&#039; width=&#039;100%&#039;&lt;br /&gt;
|colspan=&#039;2&#039; style=&#039;background-color:#d8d8ff&#039;|&amp;lt;div align=&#039;center&#039;&amp;gt;&#039;&#039;&#039;Contribution guides&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|width=&#039;150&#039; align=&#039;center&#039; |&#039;&#039;&#039;General&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Development]], [[Downloading the source code|Downloading the source code / hosting a server]], [[Guide to git]], [[:Category:Game Resources|Game resources category]], [[Guide to Changelogs|Guide to changelogs]]&lt;br /&gt;
|-&lt;br /&gt;
|width=&#039;150&#039; align=&#039;center&#039; |&#039;&#039;&#039;Database (MySQL)&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Working_with_the_database#Database_Setup|Setting up the database]], [[MySQL]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&#039;center&#039; |&#039;&#039;&#039;Coding&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Understanding SS13 code]], [[SS13 for experienced programmers]], [[Binary flags‎]], [[Text Formatting]], [[Guide to signals]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&#039;center&#039; |&#039;&#039;&#039;Mapping&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Guide to mapping]], [[Map Merger|Map merger]], [[Guide to mapping/Exploration ruins|Exploration Ruins]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&#039;center&#039; |&#039;&#039;&#039;Spriting&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Guide to spriting]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&#039;center&#039; |&#039;&#039;&#039;Wiki&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Guide to contributing to the wiki]], [[Wikicode]]&lt;br /&gt;
|}&amp;lt;noinclude&amp;gt;[[Category:templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_signals&amp;diff=37267</id>
		<title>Guide to signals</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_signals&amp;diff=37267"/>
		<updated>2023-12-19T06:33:51Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Add categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is a signal? ==&lt;br /&gt;
&lt;br /&gt;
A signal is a standard interface for calling procs on components and other objects. It prevents holding hard references and allows the procs to be called on multiple objects from one &amp;quot;event&amp;quot;. It is an event-subscriber system, where one thing &amp;quot;shouts&amp;quot;, or emits an event, and multiple things &amp;quot;listen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Why signals? ==&lt;br /&gt;
&lt;br /&gt;
In code, signals can improve quality and stability, because you do not have to collect a list of things and then call a proc on them if you want to inform them of a certain event happening. For example, previously, you may have needed to hold a reference to something or maintain a list of things that want to hear about an event occuring. Signals are built into every datum and object, and perform this duty automatically. Signals can also replace the need to check values on a component or other object, as you can simply emit a signal requesting it, and have the other object listen for it and respond.&lt;br /&gt;
&lt;br /&gt;
For example, many things in the game care if a player dies. Because of that, we have a signal called &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt;, that is emitted by mobs when they die. It provides data with it as well (what emitted it, current health, etc.) that may be useful to the &amp;quot;listener&amp;quot;. Signals can also be returned with a value to the emitter, allowing further interactions between objects.&lt;br /&gt;
&lt;br /&gt;
== How do I use signals? ==&lt;br /&gt;
&lt;br /&gt;
Signals are made of several parts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;An emitter&#039;&#039;&#039;, which calls &amp;lt;code&amp;gt;SEND_SIGNAL()&amp;lt;/code&amp;gt;. This emits the signal to anything that is currently listening to the emitter.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A listener&#039;&#039;&#039;, which calls &amp;lt;code&amp;gt;RegisterSignal&amp;lt;/code&amp;gt; with the emitter as an argument, and provides a signal type and a signal callback.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A signal type&#039;&#039;&#039;, which is the type of signal being emitted or listened to. This is what &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; is - it&#039;s a unique string that denotes the type of signal being sent, and when it is sent or how it is to be used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A signal callback&#039;&#039;&#039;, which is a proc that receives data from the emitter&#039;s signal for a specific signal type.&lt;br /&gt;
&lt;br /&gt;
=== Adding or selecting a type ===&lt;br /&gt;
&lt;br /&gt;
All signals have a type, which is the unique string describing what the signal is used for or when it is emitted. All types are stored in &amp;lt;code&amp;gt;code/__DEFINES/dcs/signals/&amp;lt;/code&amp;gt;, and sorted into categories based on the type of the emitter. For example, any signal sent only by &amp;lt;code&amp;gt;/mob/&amp;lt;/code&amp;gt; types should be in &amp;lt;code&amp;gt;signals_mob/signals_mob.dm&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This is what a signal type definition looks like. The string in the signal should be unique to the signal type - and is usually the lowercase of everything after &amp;lt;code&amp;gt;COMSIG_&amp;lt;/code&amp;gt;. It is also standard to document when a signal is sent within the comment, either by stating it or providing a proc path for the case where &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; is used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define COMSIG_MOB_DEATH &amp;quot;mob_death&amp;quot; //! from base of mob/death(): (gibbed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parent path for the signal should be the highest path for which the signal is relevant. For example, there is both &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;COMSIG_LIVING_DEATH&amp;lt;/code&amp;gt;, because some places only care when a living mob dies. When creating a signal, determine which context is most useful or applicable, and apply it to the highest object possible. &amp;lt;code&amp;gt;COMSIG_LIVING_DEATH&amp;lt;/code&amp;gt; provides additional arguments (or context) when the signal is emitted, making it necessary should anything require this information.&lt;br /&gt;
&lt;br /&gt;
=== Listening for a signal ===&lt;br /&gt;
&lt;br /&gt;
This is one of the most common patterns in the entire codebase, so it is absolutely vital to understand. When you want to receive a signal from an atom or datum, you call &amp;lt;code&amp;gt;RegisterSignal&amp;lt;/code&amp;gt; with that atom or datum as the first argument, a signal type, and then a signal listener.&lt;br /&gt;
&lt;br /&gt;
This is often done during &amp;lt;code&amp;gt;Initialize()&amp;lt;/code&amp;gt;, however it can take place at any time so long as the emitter exists. Do note that RegisterSignal is a type on /datum, so it is implicitly calling &amp;lt;code&amp;gt;src.RegisterSignal()&amp;lt;/code&amp;gt;. This means you can technically force another datum to register a signal listener via &amp;lt;code&amp;gt;other_thing.RegisterSignal(emitter)&amp;lt;/code&amp;gt;, however this is not recommended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RegisterSignal(emitter_here, COMSIG_MOB_DEATH, PROC_REF(on_mob_death))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, the signal registration requires a signal listener. These are procs with a special format. In a signal&#039;s comment, or when it is emitted, there is usually a list of arguments, or simply no arguments. These arguments are provided to the signal listener as additional data. When defining a listener, you can choose to include these arguments if you need them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/datum/example/proc/on_mob_death(mob/parent, gibbed)&lt;br /&gt;
    SIGNAL_HANDLER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, the first argument provided to a signal listener is ALWAYS the emitter, so you can assume for &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; that it is of the type &amp;lt;code&amp;gt;/mob&amp;lt;/code&amp;gt;. The remaining arguments are defined by the emitter itself when the signal is sent. You do not need to include any arguments if you do not want them.&lt;br /&gt;
&lt;br /&gt;
You can also see that signal listeners always start with &amp;lt;code&amp;gt;SIGNAL_HANDLER&amp;lt;/code&amp;gt;. This is a special DEFINE that disables sleeping within the proc, as sleeping in a signal listener can break the master controller&#039;s timing. It is important to include this in all signal listeners, since it is not checked automatically otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Stopping listening to a signal ===&lt;br /&gt;
&lt;br /&gt;
Registering a signal on an emitter stores a reference to that emitter. This is problematic if the emitter were to be deleted or dissociated from the listener, as there is not a reference the other way around. It is generally the responsibility of the listener to control its own references to the emitter. For example, if we have an object that was listening for another object&#039;s death, but only once, we could unregister the signal during &amp;lt;code&amp;gt;on_mob_death&amp;lt;/code&amp;gt; so as to prevent holding a reference.&lt;br /&gt;
&lt;br /&gt;
Unregistering a signal is simple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UnregisterSignal(emitter_here, COMSIG_MOB_DEATH)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;&#039;s listener for &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is also important to know that all atoms and datums will automatically unregister all their signals when they are destroyed, so there is no need to do so yourself during &amp;lt;code&amp;gt;Destroy()&amp;lt;/code&amp;gt;, however some things like components or species need to remove signals when they are &#039;dissociated&#039;, such as on_species_loss, or when a component is detached, as they are not always immediately destroyed.&lt;br /&gt;
&lt;br /&gt;
=== Emitting or sending a signal ===&lt;br /&gt;
&lt;br /&gt;
To send a signal, and retrieve results from listeners, you simply use the &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; define.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SEND_SIGNAL(src, COMSIG_MOB_DEATH)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first argument is the emitter, so generally it is &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, however this is not a rule. The second argument is always the type. You may provide additional arguments that will be sent as extra arguments to all listeners, as discussed earlier.&lt;br /&gt;
&lt;br /&gt;
Another key feature of &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; is that it can return a result. If a signal listener has a return value, it will be given as the result of &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt;. This means you can retrieve and act on data from listeners.&lt;br /&gt;
&lt;br /&gt;
For example, this is used by emag signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/atom/proc/use_emag(mob/user, obj/item/card/emag/hacker)&lt;br /&gt;
	if(!SEND_SIGNAL(src, COMSIG_ATOM_SHOULD_EMAG, user))&lt;br /&gt;
		SEND_SIGNAL(src, COMSIG_ATOM_ON_EMAG, user, hacker)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the result of &amp;lt;code&amp;gt;COMSIG_ATOM_SHOULD_EMAG&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;, then &amp;lt;code&amp;gt;COMSIG_ATOM_ON_EMAG&amp;lt;/code&amp;gt; is sent as well. Do note that this is intentionally inverted in case of an error, since procs will return null when they error, so this should be taken into consideration when sending signals to unknown listeners.&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
[[Category:Guides]] [[Category:Game Resources]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_signals&amp;diff=37266</id>
		<title>Guide to signals</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_signals&amp;diff=37266"/>
		<updated>2023-12-19T06:33:05Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Created page with &amp;quot;== What is a signal? ==  A signal is a standard interface for calling procs on components and other objects. It prevents holding hard references and allows the procs to be called on multiple objects from one &amp;quot;event&amp;quot;. It is an event-subscriber system, where one thing &amp;quot;shouts&amp;quot;, or emits an event, and multiple things &amp;quot;listen&amp;quot;.  == Why signals? ==  In code, signals can improve quality and stability, because you do not have to collect a list of things and then call a proc on...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is a signal? ==&lt;br /&gt;
&lt;br /&gt;
A signal is a standard interface for calling procs on components and other objects. It prevents holding hard references and allows the procs to be called on multiple objects from one &amp;quot;event&amp;quot;. It is an event-subscriber system, where one thing &amp;quot;shouts&amp;quot;, or emits an event, and multiple things &amp;quot;listen&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Why signals? ==&lt;br /&gt;
&lt;br /&gt;
In code, signals can improve quality and stability, because you do not have to collect a list of things and then call a proc on them if you want to inform them of a certain event happening. For example, previously, you may have needed to hold a reference to something or maintain a list of things that want to hear about an event occuring. Signals are built into every datum and object, and perform this duty automatically. Signals can also replace the need to check values on a component or other object, as you can simply emit a signal requesting it, and have the other object listen for it and respond.&lt;br /&gt;
&lt;br /&gt;
For example, many things in the game care if a player dies. Because of that, we have a signal called &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt;, that is emitted by mobs when they die. It provides data with it as well (what emitted it, current health, etc.) that may be useful to the &amp;quot;listener&amp;quot;. Signals can also be returned with a value to the emitter, allowing further interactions between objects.&lt;br /&gt;
&lt;br /&gt;
== How do I use signals? ==&lt;br /&gt;
&lt;br /&gt;
Signals are made of several parts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;An emitter&#039;&#039;&#039;, which calls &amp;lt;code&amp;gt;SEND_SIGNAL()&amp;lt;/code&amp;gt;. This emits the signal to anything that is currently listening to the emitter.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A listener&#039;&#039;&#039;, which calls &amp;lt;code&amp;gt;RegisterSignal&amp;lt;/code&amp;gt; with the emitter as an argument, and provides a signal type and a signal callback.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A signal type&#039;&#039;&#039;, which is the type of signal being emitted or listened to. This is what &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; is - it&#039;s a unique string that denotes the type of signal being sent, and when it is sent or how it is to be used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A signal callback&#039;&#039;&#039;, which is a proc that receives data from the emitter&#039;s signal for a specific signal type.&lt;br /&gt;
&lt;br /&gt;
=== Adding or selecting a type ===&lt;br /&gt;
&lt;br /&gt;
All signals have a type, which is the unique string describing what the signal is used for or when it is emitted. All types are stored in &amp;lt;code&amp;gt;code/__DEFINES/dcs/signals/&amp;lt;/code&amp;gt;, and sorted into categories based on the type of the emitter. For example, any signal sent only by &amp;lt;code&amp;gt;/mob/&amp;lt;/code&amp;gt; types should be in &amp;lt;code&amp;gt;signals_mob/signals_mob.dm&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This is what a signal type definition looks like. The string in the signal should be unique to the signal type - and is usually the lowercase of everything after &amp;lt;code&amp;gt;COMSIG_&amp;lt;/code&amp;gt;. It is also standard to document when a signal is sent within the comment, either by stating it or providing a proc path for the case where &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; is used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define COMSIG_MOB_DEATH &amp;quot;mob_death&amp;quot; //! from base of mob/death(): (gibbed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parent path for the signal should be the highest path for which the signal is relevant. For example, there is both &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;COMSIG_LIVING_DEATH&amp;lt;/code&amp;gt;, because some places only care when a living mob dies. When creating a signal, determine which context is most useful or applicable, and apply it to the highest object possible. &amp;lt;code&amp;gt;COMSIG_LIVING_DEATH&amp;lt;/code&amp;gt; provides additional arguments (or context) when the signal is emitted, making it necessary should anything require this information.&lt;br /&gt;
&lt;br /&gt;
=== Listening for a signal ===&lt;br /&gt;
&lt;br /&gt;
This is one of the most common patterns in the entire codebase, so it is absolutely vital to understand. When you want to receive a signal from an atom or datum, you call &amp;lt;code&amp;gt;RegisterSignal&amp;lt;/code&amp;gt; with that atom or datum as the first argument, a signal type, and then a signal listener.&lt;br /&gt;
&lt;br /&gt;
This is often done during &amp;lt;code&amp;gt;Initialize()&amp;lt;/code&amp;gt;, however it can take place at any time so long as the emitter exists. Do note that RegisterSignal is a type on /datum, so it is implicitly calling &amp;lt;code&amp;gt;src.RegisterSignal()&amp;lt;/code&amp;gt;. This means you can technically force another datum to register a signal listener via &amp;lt;code&amp;gt;other_thing.RegisterSignal(emitter)&amp;lt;/code&amp;gt;, however this is not recommended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RegisterSignal(emitter_here, COMSIG_MOB_DEATH, PROC_REF(on_mob_death))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, the signal registration requires a signal listener. These are procs with a special format. In a signal&#039;s comment, or when it is emitted, there is usually a list of arguments, or simply no arguments. These arguments are provided to the signal listener as additional data. When defining a listener, you can choose to include these arguments if you need them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/datum/example/proc/on_mob_death(mob/parent, gibbed)&lt;br /&gt;
    SIGNAL_HANDLER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, the first argument provided to a signal listener is ALWAYS the emitter, so you can assume for &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt; that it is of the type &amp;lt;code&amp;gt;/mob&amp;lt;/code&amp;gt;. The remaining arguments are defined by the emitter itself when the signal is sent. You do not need to include any arguments if you do not want them.&lt;br /&gt;
&lt;br /&gt;
You can also see that signal listeners always start with &amp;lt;code&amp;gt;SIGNAL_HANDLER&amp;lt;/code&amp;gt;. This is a special DEFINE that disables sleeping within the proc, as sleeping in a signal listener can break the master controller&#039;s timing. It is important to include this in all signal listeners, since it is not checked automatically otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Stopping listening to a signal ===&lt;br /&gt;
&lt;br /&gt;
Registering a signal on an emitter stores a reference to that emitter. This is problematic if the emitter were to be deleted or dissociated from the listener, as there is not a reference the other way around. It is generally the responsibility of the listener to control its own references to the emitter. For example, if we have an object that was listening for another object&#039;s death, but only once, we could unregister the signal during &amp;lt;code&amp;gt;on_mob_death&amp;lt;/code&amp;gt; so as to prevent holding a reference.&lt;br /&gt;
&lt;br /&gt;
Unregistering a signal is simple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UnregisterSignal(emitter_here, COMSIG_MOB_DEATH)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;&#039;s listener for &amp;lt;code&amp;gt;COMSIG_MOB_DEATH&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It is also important to know that all atoms and datums will automatically unregister all their signals when they are destroyed, so there is no need to do so yourself during &amp;lt;code&amp;gt;Destroy()&amp;lt;/code&amp;gt;, however some things like components or species need to remove signals when they are &#039;dissociated&#039;, such as on_species_loss, or when a component is detached, as they are not always immediately destroyed.&lt;br /&gt;
&lt;br /&gt;
=== Emitting or sending a signal ===&lt;br /&gt;
&lt;br /&gt;
To send a signal, and retrieve results from listeners, you simply use the &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; define.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SEND_SIGNAL(src, COMSIG_MOB_DEATH)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first argument is the emitter, so generally it is &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, however this is not a rule. The second argument is always the type. You may provide additional arguments that will be sent as extra arguments to all listeners, as discussed earlier.&lt;br /&gt;
&lt;br /&gt;
Another key feature of &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt; is that it can return a result. If a signal listener has a return value, it will be given as the result of &amp;lt;code&amp;gt;SEND_SIGNAL&amp;lt;/code&amp;gt;. This means you can retrieve and act on data from listeners.&lt;br /&gt;
&lt;br /&gt;
For example, this is used by emag signals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/atom/proc/use_emag(mob/user, obj/item/card/emag/hacker)&lt;br /&gt;
	if(!SEND_SIGNAL(src, COMSIG_ATOM_SHOULD_EMAG, user))&lt;br /&gt;
		SEND_SIGNAL(src, COMSIG_ATOM_ON_EMAG, user, hacker)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the result of &amp;lt;code&amp;gt;COMSIG_ATOM_SHOULD_EMAG&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;, then &amp;lt;code&amp;gt;COMSIG_ATOM_ON_EMAG&amp;lt;/code&amp;gt; is sent as well. Do note that this is intentionally inverted in case of an error, since procs will return null when they error, so this should be taken into consideration when sending signals to unknown listeners.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=FullControls&amp;diff=37045</id>
		<title>FullControls</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=FullControls&amp;diff=37045"/>
		<updated>2023-08-11T17:45:35Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* Throwing Mode: How and Why? */ Add hold-to-throw&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= BeeStation Full Controls: Why and How =&lt;br /&gt;
If you are a brand-new player, you might have stumbled in here by accident. You can see the basic controls if you want to get into a round immediately on the [[Starter guide#Controls|new player tutorial page]]. Otherwise, this page is meant to be a breakdown of all (probably) relevant controls. It explains the &#039;&#039;&#039;how&#039;&#039;&#039; and more importantly it explains the &#039;&#039;&#039;WHY&#039;&#039;&#039;. Read this page and use the tasks at the bottom for practice and SS13 controls will become second nature in just a round or two. You can also check out the full [[Keyboard Shortcuts|hotkeys]] page.&lt;br /&gt;
== Full Controls: Breakdown ==&lt;br /&gt;
=== Left Click: The Pickup or “Use On” Key ===&lt;br /&gt;
Left click is used as a “take in hand button” most of the time. If there is something you want to pick up walk up and just click on it (assuming you don’t already have something in that hand). It’s second use is that it can be used to “use on x” items in hand. Use on what?&lt;br /&gt;
* Use some food, drink, or medicine on yourself to eat/drink/take it.&lt;br /&gt;
* Use the above on other people to attempt to force them to eat/drink/take it. Don’t.&lt;br /&gt;
* Use a [[Guide to Combat#Ranged%20Weapons|gun]] on a person or thing to shoot them.&lt;br /&gt;
* Use the computer console to open the interface.&lt;br /&gt;
* Use your empty hand on someone (with help intent) to hug them. :)&lt;br /&gt;
*If someone is buckled to a chair or something, click on the chair (or whatever) to unbuckle them.&lt;br /&gt;
=== Right click: The Stack Popup ===&lt;br /&gt;
For example, you want something from a locker, but there is a big stack of items in it. You can’t see the thing you want and so you can’t click on it. What do you do? You use &#039;&#039;&#039;Right click&#039;&#039;&#039; to open a popup menu listing every “thing” on that turf (tile). Simply find the item you want and from it’s popup menu use the pick-up or drag option.&lt;br /&gt;
=== “Using” Items with the &#039;&#039;&#039;Z&#039;&#039;&#039; key: Why and How? ===&lt;br /&gt;
This is &#039;&#039;different&#039;&#039; from the &#039;&#039;&#039;left click&#039;&#039;&#039; use. You can think of this as “use my hand on this item”. If you are confused a few examples should help:&lt;br /&gt;
* Use it on a can of coke to open it.&lt;br /&gt;
* Use it on a zippo lighter to light it.&lt;br /&gt;
* Use it on an e-gun to swap to lethal mode.&lt;br /&gt;
* Use it on a piece of paper to read it.&lt;br /&gt;
* Use it on a [[Medical items|health scanner]] to toggle into reagent mode.&lt;br /&gt;
For example, how would you drink a can of coke? You must first open the can by “using” it in your hand with the &#039;&#039;&#039;Z&#039;&#039;&#039; key. This will “use your hand on it” to open the coke can. Then you click on yourself with the opened can of coke in your hand to “use“ it on yourself which makes your character drink it.&lt;br /&gt;
=== ALT + Click: How and why? ===&lt;br /&gt;
The less common use case of &#039;&#039;&#039;ALT + click&#039;&#039;&#039; is to perform specific, context sensitive actions. Examples are toggling the lock on a locker, split a stack of items, crawling into vents (as something small like a monkey or alien larva)…&lt;br /&gt;
&lt;br /&gt;
It’s most common use case, however, is opening an “inventory”. The way you can think of this hotkey is like a “show/take from inside”. What you might not expect is that a lot of things are technically “inventories”. If something has something inside it and you want to reach it then &#039;&#039;&#039;ALT + click&#039;&#039;&#039; is the answer.&lt;br /&gt;
* Take out your ID from your PDA.&lt;br /&gt;
* Take out your pen from your PDA (if there is no ID in it).&lt;br /&gt;
* Show a toolbelt, backpack or box inventory.&lt;br /&gt;
* Show your coat pockets inventory.&lt;br /&gt;
* Take out the item you put in your heavy boots.&lt;br /&gt;
This hotkey can also be used to open “inventories”, like a toolbox on the floor, without having to pick them up or equip them (toolbelts, bags). In the case of an “inventory” that has a single item inside it, it just spits that one item out like in the pen from PDA example or like taking out the ID from your PDA.&lt;br /&gt;
&lt;br /&gt;
Something of note however is that you don’t &#039;&#039;&#039;ALT + click&#039;&#039;&#039; “container” like things such as crates or lockers. They are simply opened by left clicking them and then taking the items directly from them or with the &#039;&#039;&#039;right click&#039;&#039;&#039; if there is big stack on them. If you are a little confused by all this, don’t worry, it will be crystal clear after a round or two.&lt;br /&gt;
=== Communication ===&lt;br /&gt;
Press the &#039;&#039;&#039;T&#039;&#039;&#039; key – to talk. Your sentences will be automatically capitalized and end with a period. Unless you use “?” or “!” or even “!!” if you really want to scream something out. The last on is usually used with “;HELP!!” to scream for said help in the global radio chat.&lt;br /&gt;
&lt;br /&gt;
As shown above If you add a semicolon (;) before anything else, you&#039;ll transmit your message to the general chat radio. Use the &#039;&#039;&#039;Y&#039;&#039;&#039; key to speak on the radio without typing the semicolon prefix.&lt;br /&gt;
&lt;br /&gt;
You can also speak on a department specific radio channel. The format is the same for each, just with a different letter. To speak on the medical channel, for example, type .m or #m before your message.&lt;br /&gt;
&lt;br /&gt;
Use the &#039;&#039;&#039;T&#039;&#039;&#039; key to talk BUT place a * (asterisk) followed by one of the &#039;&#039;&#039;preset&#039;&#039;&#039; non-verbal actions (emotes) to use them. Most common ones are: *clap, *laugh and *scream. These will make an in-game sound! You can use *help to see all the options. Not all of them have sounds and sounds can be different depending on the species e.g., moth or lizard (stinky).&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;SHIFT + Middle Mouse Button -&#039;&#039;&#039; to point at something. This creates a message in the chat and temporarily displays an arrow over the thing you point at.&lt;br /&gt;
&lt;br /&gt;
Press the &#039;&#039;&#039;U&#039;&#039;&#039; key – to talk in local out of character chat. This is special yellow text with no rune text (text over the head) only visible in the chat window. As a new player you can use this in the game to ask control related questions to the people around you. If you have such questions also try the &#039;&#039;&#039;mentor&#039;&#039;&#039; tab. Global OOC is the &#039;&#039;&#039;O&#039;&#039;&#039; key and is only usable before or after a round.&lt;br /&gt;
=== Click-dragging: Buckling, Searching and Resisting ===&lt;br /&gt;
The &#039;&#039;&#039;B&#039;&#039;&#039; key is used to “resist” things such as any grab type from another person, resisting your butt off the sofa, breaking hands cuffs (this will take a while), resisting the fire on you by stop, drop and rolling, etc.&lt;br /&gt;
&lt;br /&gt;
The word &#039;&#039;buckle&#039;&#039; might be confusing here. While you are “buckled” to the sofa you can just instantly resist it. If on the other hand you are handcuffed to said sofa (or in general) the “resist” word becomes more apt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Click-dragging&#039;&#039;&#039; yourself or a held person onto something else has a lot of uses:&lt;br /&gt;
* Do it with yourself onto a chair to sit on it. A bed to rest on it.&lt;br /&gt;
* Do it with yourself onto a table to climb up onto the table.&lt;br /&gt;
* Do it with a person who is handcuffed to buckle them to a bed or chair.&lt;br /&gt;
An important one is &#039;&#039;&#039;click-dragging&#039;&#039;&#039; yourself onto another person to open &#039;&#039;their&#039;&#039; character inventory. You can then unequip or equip items from them. Security uses this to take off handcuffs or search convicts.&lt;br /&gt;
=== Throwing Mode: How and Why? ===&lt;br /&gt;
Use the &#039;&#039;&#039;R&#039;&#039;&#039; key to &#039;&#039;&#039;toggle&#039;&#039;&#039; throw mode for &#039;&#039;&#039;one&#039;&#039;&#039; throw. Next time you click somewhere on the screen your character will THROW the item. You can also hold down &#039;&#039;&#039;Space&#039;&#039;&#039; to toggle throw mode on while it is held down.&lt;br /&gt;
&lt;br /&gt;
Why would you want to throw stuff? Because it’s &#039;&#039;convenient&#039;&#039;. Why walk 6 tiles to drop that hat on the table when you can just chuck it at it? Why walk to someone to hand them an item when you can just throw it &#039;&#039;&#039;next&#039;&#039;&#039; to them? Do not throw items at people. Unless you want to, in cases where you might try throwing stuff for self-defense, for example.&lt;br /&gt;
&lt;br /&gt;
Will it break or something? Most items are safe to throw. The exception are items made from glass such as cups. Even if they don’t break themselves, they will spill their contents on the floor or hit thing. A common use case is to throw an open bottle of fuel at someone followed by a lit match or something to set them on fire.&lt;br /&gt;
=== Pulling Things with CTRL + Click: How and Why? ===&lt;br /&gt;
&#039;&#039;&#039;CTRL + click&#039;&#039;&#039; is used to pull a thing or person. Your hand must be empty to pull. &#039;&#039;&#039;H&#039;&#039;&#039;alt as in stop pulling with &#039;&#039;&#039;H&#039;&#039;&#039;. Why would I want to pull a thing? You can gently pull people if you want to lead them somewhere. You can pull items such as crates or anything too big to carry in your hands. Most machines can be unwrenched and pulled somewhere else.&lt;br /&gt;
&lt;br /&gt;
Another tip is that you can pull an item with an empty hand. Then you can use said empty hand to pick up another item even though you are “using” it to pull an item. Usually used to transport three bulky items instead of two.&lt;br /&gt;
=== QoL Hotkeys ===&lt;br /&gt;
Press the &#039;&#039;&#039;E&#039;&#039;&#039; key to quick equip items. If an item can be “equipped”, as in placed in any slot including your inventory or any other inventories such as belts or the suit slot, it will be. For example, if you have gloves and press E you will “quick equip” them into your gloves slot. If you already have gloves they will instead go to your backpack or other valid slots. There are too many cases so just experiment with the &#039;&#039;&#039;E&#039;&#039;&#039; key on items and you will figure out the behavior.&lt;br /&gt;
&lt;br /&gt;
Using &#039;&#039;&#039;SHIFT + B&#039;&#039;&#039; and &#039;&#039;&#039;SHIFT + T&#039;&#039;&#039; you can place an item in/on your backpack or toolbelt respectively. If used with an empty hand, then it will instead take the last item you placed inside the backpack/toolbelt into your hand. An engineer might use this to quickly toggle between a wrench and his empty hand when working with pipes.&lt;br /&gt;
=== What is the drop item (&#039;&#039;&#039;Q&#039;&#039;&#039;) key used for? ===&lt;br /&gt;
There are items that you can pick up with your hands, but that are too big to be stored in your backpack or even the suit slot such as the combat shotgun. If you need two hands for some reason you can just drop and item on the ground as a kind of a temporary inventory extension. Don’t worry it won’t get “dirty” and no one will steal it (probably). If you find this a bit confusing don&#039;t worry it&#039;s not critical that you understand this. Just play the game and you will figure it out what I mean.&lt;br /&gt;
== Tasks to practice the controls ==&lt;br /&gt;
Here are a few suggestions for things you should do on your first round to effectively learn the controls. After all the best way to learn is by doing. In no particular order:&lt;br /&gt;
* Make a paper airplane and throw it.&lt;br /&gt;
* Smoke a cigarette.&lt;br /&gt;
* Drink a can of coke.&lt;br /&gt;
* Pull a chair into a funny spot and then sit on it.&lt;br /&gt;
* Climb up onto a table.&lt;br /&gt;
* Talk to someone and use a preset emote.&lt;br /&gt;
* Get a drink or a meal from the crew area and tip the server.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Starter_guide&amp;diff=37043</id>
		<title>Starter guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Starter_guide&amp;diff=37043"/>
		<updated>2023-08-11T17:37:05Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: TGUI Prefs update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= [[What is SS13|What is SS13?]] =&lt;br /&gt;
&#039;&#039;&#039;Space Station 13&#039;&#039;&#039; is a multiplayer &amp;lt;u&amp;gt;sandbox&amp;lt;/u&amp;gt; that has a heavy focus on player interaction. In the year 2557, the megacorporation [[Nanotrasen]] employed you as a staff [[Jobs|member]] onboard their latest state of the art [[Guide to Research and Development|research]] station. Nanotrasen claims to be researching [[plasma]], a mysterious new substance, but rumors abound that the station is little more than a [[Clown|twisted]] [[Traitor|social]] [[Assistant|experiment]]...{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=Hmph. Fresh off the boat from Nanotrasen&#039;s recruitment office, huh? Let me tell you something, kid. You won&#039;t last five minutes on this floating deathtrap without help. You&#039;re as likely to be left for dead in a dark maintenance tunnel riddled with bullet holes as you are to get out of here alive. Lucky for you, I&#039;m in a helpful mood today.&lt;br /&gt;
|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
At the start of each round, each player is assigned a role onboard the station. There are many jobs, such as the [[Scientist|scientist performing research and development of new technologies]], the [[Medical Doctor|medical doctor]] trying to keep people alive, or the simple [[janitor]]. There are many ways to play. The game also randomly chooses a [[Game Mode|round type]], ranging from an all-out assault on the station by [[Nuclear Operative|nuclear operatives]], a sinister [[Blood Cult|cult sacrificing crewmembers]] to summon their [[Nar-Sie|god]], or more commonly, good ol&#039; fashioned [[Traitor|traitors]]. It is player driven and not some procedurally generated indie game. Every round on &#039;&#039;&#039;Space Station 13&#039;&#039;&#039; is different and a completely unique experience.&lt;br /&gt;
== Before Playing ==&lt;br /&gt;
Your choices matter in SS13. They have [[Ghost|consequences]]. The [[rules]] are here to ensure that when [[How to Roleplay|drama]] and [[Guide to Combat|conflict]] happen, they happen in a way that is [[Byond the impossible|beneficial to all parties involved]]. &amp;lt;u&amp;gt;You should read the [[rules]] before playing&amp;lt;/u&amp;gt;. If you don’t understand them all don’t worry. You can engage in the server more and more as you understand.&lt;br /&gt;
&lt;br /&gt;
At a base level, don’t attack players without any reason. Role playing as an “insane person” is &#039;&#039;&#039;not valid&#039;&#039;&#039;. If you want to be extra safe (there is no reason to be this afraid though) you can avoid any kind of fight. Most rules define who, what, where and how is allowed to fight, main or kill. If you don’t fight you automatically comply with these rules. One last point: Please, remember the human. SS13 can be highly frustrating. You will be unceremoniously killed, griefed, or die to some galactic space-bug shortly before executing your master plan. Everyone is here to play a game they enjoy, so keep that in mind before you bash someone&#039;s brain in with a [[toolbox]] because they took your [[multitool]].&lt;br /&gt;
== Getting Help ==&lt;br /&gt;
If you happen to get confused about something there are several ways to resolve this. The easiest is to contact a [[mentor]]. There is almost always at least one online. Don’t be shy! They love helping new players! In the top right there is a mentor tab. You can use “mentorwho” to check if any are online. Then you can use “mentorhelp” to send your question.&lt;br /&gt;
&lt;br /&gt;
In the case there are none, you can ask the players around you. It might be difficult to communicate your problem in an [[IC]] (in character) way. It might also be difficult to answer in an [[IC]] way. That is why we have the LOOC or “local out of character” button which defaults to the &#039;&#039;&#039;U&#039;&#039;&#039; key. LOOC is a special yellow text visible only in the chat window. Meaning it has no rune text (text over the head). LOOC is used to discuss [[OOC]] things. For advanced users it’s used to [[Byond the impossible|set up more complex RP scenarios]]. For beginners, like yourself, it’s used to explain controls in a literal “click this press that” way that [[IC]] does not allow.&lt;br /&gt;
== Setting Up ==&lt;br /&gt;
Download the [https://www.byond.com/download/ BYOND client]. If you are in the Discord server (you should be; it&#039;s where all the drama happens!), you can use the ?byond command in the bot-spam channel. BeeStation has two servers:&lt;br /&gt;
*&#039;&#039;&#039;The Main BeeStation Sage:&#039;&#039;&#039; byond://sage.beestation13.com:7878&lt;br /&gt;
*&#039;&#039;&#039;The Overflow Low-pop BeeStation Acacia:&#039;&#039;&#039; byond://acacia.beestation13.com:7979&lt;br /&gt;
To join the game, you can use the links on the website. If you are in the Discord server there is a dedicated bot-spam channel. Use the “?cs” command to ask the bot about the current round information on the main BeeStation server Sage. The bot output will include a link that you can just click. These two methods are preferred by most veteran players (mostly the latter) since you avoid interacting with the icky Byond client.&lt;br /&gt;
&lt;br /&gt;
Once you are in you will see a small window with some buttons. This is either “Ready” and “Not Ready” buttons or the “Join Game!” button depending on if the round is about to start or on-going. There is also a “Create Character” button we will be using shortly.&lt;br /&gt;
&lt;br /&gt;
BeeStation operates on a round based system. Every round is a new “shift” not related in any way to the past ones. The typical round length is around 1 hour and 30 minutes. This is because at that time there is a “crew transfer vote” which is basically a “are we done with this round?” vote. This is also plenty of time for things to go horribly wrong in the case of any of the [[Game Mode|major game modes]].&lt;br /&gt;
&lt;br /&gt;
If you jump onto the server, you are very likely to have joined during an active round. Using the “Status” tab, you can see the current round information. Speaking of which...&lt;br /&gt;
=== Client Interface ===&lt;br /&gt;
Look at the top right of the game window. You&#039;ll see some tabs. The most important tabs are the Status and Admin tabs. The admin tab contains the “&#039;&#039;&#039;adminhelp”&#039;&#039;&#039; button, used to contact admins directly if you have a &amp;lt;u&amp;gt;&#039;&#039;&#039;rules question&#039;&#039;&#039;&amp;lt;/u&amp;gt; or believe someone is breaking the rules. For gameplay use the mentor tab. Here is a quick break down of the tabs:&lt;br /&gt;
* Status: Displays important info such as your ping, the current map, pressure remaining in airtanks, etc.&lt;br /&gt;
* [[Admin]]: Contains buttons that allow you if any admins are online, and most importantly, to send a message directly to the admins (the &#039;&#039;&#039;adminhelp&#039;&#039;&#039; button). If no admins are online, the message will be forwarded to the admin IRC channel.&lt;br /&gt;
* [[Mentor]]: Explained in the “getting help” section. Contains buttons that allow you to see if any mentors are online, and allow you to ask a question directly to the mentors (the &amp;quot;mentorhelp&amp;quot; button). Mentorhelps are not forwarded like adminhelps.&lt;br /&gt;
* [[IC]]: Usually, won&#039;t use this. The &#039;&#039;&#039;Pray&#039;&#039;&#039; button allows you to send a message to any admins online in character meaning it&#039;s used for &amp;quot;communicating with the gods&amp;quot;. Or the Notes button which has your bank ID or shows any antag objectives if you have them.&lt;br /&gt;
* OOC: Stands for &amp;quot;Out of Character&amp;quot;. Rarely needs to be used. Various functions that are related to the game, but not something your character does. View Webmap, View tracked playtime, and View Admin Remarks are the most used verbs here.&lt;br /&gt;
* Preferences: Self-explanatory. Contains various options you can toggle on and off. You can also open Character and Game Preferences at any time with the corresponding buttons.&lt;br /&gt;
&lt;br /&gt;
[[File:Status_tab_top.png]]&lt;br /&gt;
&lt;br /&gt;
On the right side will be the chat window. And above the chat window there are some tabs like “Admin” or “Preferences”. Feel free to immediately click the blue gear in the chat window and turn on night mode. Anyway, before you can join we need to create your character.&lt;br /&gt;
===Character Creation===&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=You&#039;re brand new here, so make sure you sign up as an Assistant. Nanotrasen usually has checks to make sure fresh meat doesn&#039;t get to be the Captain, but if you manage to end up in that position, you&#039;ll probably be just another case for me to solve.|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
Recommended species for new players is [[Humans|human]]. Humans don’t have any major ups or downs. Later you can play as one of the [[Races|more exotic species]]. Other than that, it’s all mostly cosmetic. Once you&#039;ve finished editing your appearance, the box in the title bar should hopefully say &amp;quot;Saved!&amp;quot;, verifying that your choices saved properly.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Job Preferences&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Occupations tab lets you select your job preferences when a new round is starting. You, as a new player, want to set assistant to YES. For more information about job distribution on round start [[Job selection and assignment|see here]]. Again, this only applies to round start. In the case of on-going rounds, the “Join Game!” button will just let you pick what job you want assuming there are open slots. In the case of assistants that is always.&lt;br /&gt;
&lt;br /&gt;
Some jobs have different character names when you play them, such as AI, Cyborg, Clown, and Mime. You can access these name options by pressing the hamburger button (three lines) next to your character&#039;s name in the Character tab. Please keep in mind that some of these roles are affected by [[Naming Guidelines]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Game Preferences&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can also access your Game Preferences by pressing the gear at the top of the character setup. In this menu, you can customize various sound, UI, HUD, and other preferences.&lt;br /&gt;
&lt;br /&gt;
Some of the most commonly modified preferences are:&lt;br /&gt;
&lt;br /&gt;
* Sound toggles, typically ambience or lobby music.&lt;br /&gt;
* Pixel Scaling / Scaling Method, which determines how the game scales icons. Using a pixel perfect preset that fits your screen can increase the clarity of icons.&lt;br /&gt;
* FPS (frames per second).&lt;br /&gt;
* HUD Style, which adjusts the look of your ingame HUD.&lt;br /&gt;
* Ghost Chat toggles, these can reduce the clutter in chat while you are dead.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Antagonist Preferences&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Once you are more familiar with the game, you can also customize your antagonist preferences in the Antagonists tab. By default, they start enabled, but are locked behind playtime, so don&#039;t worry, you won&#039;t be thrust into one of these roles before you know how to play. If you&#039;re worried about this, you can also go ahead and press the Global Disable Everything button at the top for now.&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Character settings.PNG|Character Creation Screen&lt;br /&gt;
File:Occupation Screen.png|Job Preferences Screen&lt;br /&gt;
File:Antagonist Preferences.png|Antagonist Preferences Screen&lt;br /&gt;
File:Game prefences Screen.PNG|Game Preferences Window&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
== HUD &amp;amp; Controls ==&lt;br /&gt;
The biggest barrier to entry in Space Station 13 is the controls. Despite the reputation once it clicks, you&#039;ll never have an issue with it again. &#039;&#039;&#039;Don&#039;t let it overwhelm you!&#039;&#039;&#039; After a round or two of practice, you should be fine.&lt;br /&gt;
===HUD===&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=&amp;quot;Interface&amp;quot;? What the hell are you talking about, kid? &amp;quot;Blue buttons?&amp;quot; Geez, you&#039;ve been here for five minutes and you&#039;re already cracking. Hmmm... *recorder crackles* Note to self - check atmospherics. Gas might be poisoned.|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
The top right of the screen contains the action tabs and the bottom right is the text log or chat window. This is where you can see what people are saying, what&#039;s happening around you, and chat such as OOC or adminhelps. The bar along the bottom of the screen is the input bar, but since we&#039;re on [[Keyboard_Shortcuts|Hotkey]] mode we won&#039;t need to use it. There are a few HUD elements on the main screen, so let&#039;s break them down into sections. Don&#039;t worry if you can&#039;t memorize what everything does at once. You can always come back to this guide.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Hands&amp;quot;&amp;gt;[[File:Hud-hands.gif]] One of the most important elements of the HUD. You have the ability to hold an item in each hand (unless an item takes up both hands, obviously). The square around one of the hands is the &#039;&#039;&#039;selected hand&#039;&#039;&#039;. If you have an &#039;&#039;&#039;empty&#039;&#039;&#039; selected hand, and click on an object, you&#039;ll pick it up/open it/use it. If &#039;&#039;&#039;an object is in your selected hand&#039;&#039;&#039; and you click on something, you&#039;ll use it on the item you&#039;re holding. (The way this works means that if you&#039;d like to unequip your backpack, you need to click and drag the bag into your hand - if it was removed by clicking on it, you&#039;d never be able to open the bag.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If this seems confusing, don&#039;t worry - it&#039;ll be explained shortly.&#039;&#039;&#039;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Inventory Buttons&amp;quot;&amp;gt;These icons manage your inventory.&lt;br /&gt;
&lt;br /&gt;
The backpack [[File:Hud-inventory.png]] icon can be toggled to show your worn equipment.&lt;br /&gt;
&lt;br /&gt;
The belt [[File:Hud-Belt.png]], backpack [[File:Hud-Back.png]], and pocket [[File:Hud-Pocket.png]] icons are all storage locations.&lt;br /&gt;
&lt;br /&gt;
The ID [[File:Hud-ID.png]] slot can hold your ID, or your PDA (which can hold your ID).&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Interact Commands&amp;quot;&amp;gt;These buttons directly affect how you interact with objects.&lt;br /&gt;
&lt;br /&gt;
The drop [[File:Hud-drop.png]] and throw [[File:Hud-throw.png]] icons do what the name implies. Dropping is self explanatory, but the throw button is a toggle - if it&#039;s on and you click somewhere, you&#039;ll throw the item in your hand at where you clicked. (You can also press R to enable throwing and Q to drop your held item.)&lt;br /&gt;
&lt;br /&gt;
The pull [[File:Hud-pull.png]] icon only appears when dragging something, and can be pressed to stop dragging an object. [[Keyboard_Shortcuts|Hotkey]]: &amp;quot;H&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The internals [[File:Gmaskinternalsicon.gif]] icon can be clicked to enable/disable your internals (oxygen tank and breath mask). &lt;br /&gt;
&lt;br /&gt;
The resist [[File:Hud-resist.png]] icon can be pressed to break out of grabs, restraints, and if you&#039;re on fire, is the &amp;quot;stop drop and roll&amp;quot; button. [[Keyboard_Shortcuts|Hotkey]]: &amp;quot;B&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The run/walk toggle [[File:Hud-walkrun.gif]] icon can be pressed to switch between running and walking. Running is faster, but walking has benefits, such as being able to walk over water without slipping - useful for when the janitor doesn&#039;t put wet floor signs down. [[Keyboard_Shortcuts|Hotkey]]: Hold &amp;quot;alt&amp;quot; to walk. &lt;br /&gt;
&lt;br /&gt;
The body selector [[File:Hud-target.gif]] icon is used to choose which body part you want to target. This is used for both targeting specific sections to heal, or targeting specific sections when attacking someone. Click a limb to target it. (You can target individual arms, legs, the head, the upper torso, the groin, the eyes, or the mouth.) [[Keyboard_Shortcuts|Hotkeys]]: &amp;quot;numpad keys&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Last but not least is the intent selector [[File:Hud-intent.gif]] - this will be explained in detail later. It has four modes: &#039;&#039;&#039;Help&#039;&#039;&#039;, &#039;&#039;&#039;Disarm&#039;&#039;&#039;, &#039;&#039;&#039;Grab&#039;&#039;&#039;, and &#039;&#039;&#039;Harm&#039;&#039;&#039;, in clockwise order. [[Keyboard_Shortcuts|Hotkeys]]: &amp;quot;1-4&amp;quot;.&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Other&amp;quot;&amp;gt;The health [[File:Hud_100_percent_Health.gif]] icon and [[File:Healthdoll.gif]] doll change depending on how injured you are.  &lt;br /&gt;
&lt;br /&gt;
The crafting menu [[File:Craft.gif]] icon opens the crafting menu.&lt;br /&gt;
&lt;br /&gt;
The speech bubble [[File:Talk_wheel.gif]] icon opens the languages menu. You won&#039;t need to use this for the tutorial.&lt;br /&gt;
&lt;br /&gt;
The create area [[File:Area_edit.gif]] icon is used to create an &amp;quot;area&amp;quot;, which is a more advanced topic. You won&#039;t need to worry about it for this tutorial.&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Alerts&amp;quot;&amp;gt;These will only appear on the HUD if something is wrong.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-oxy.gif]] &#039;&#039;&#039;Oxygen warning&#039;&#039;&#039; - The air you&#039;re breathing doesn&#039;t have enough oxygen.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-pressure.gif]] &#039;&#039;&#039;Pressure warning&#039;&#039;&#039; - Pressure levels are too high (red) or too low (black). Low and high pressures can kill you.&lt;br /&gt;
&lt;br /&gt;
[[File:tox_in_air.gif]] &#039;&#039;&#039;Toxin warning&#039;&#039;&#039; - You are breathing in toxic gases.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-fire.png]] &#039;&#039;&#039;Fire warning&#039;&#039;&#039; - The air is hot enough to burn you.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-freeze.gif]] &#039;&#039;&#039;Freeze warning&#039;&#039;&#039; - The air is cold enough to freeze you.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-temp.gif]] &#039;&#039;&#039;Temperature warning&#039;&#039;&#039; - You&#039;re too cold or too hot.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-hunger.gif]] &#039;&#039;&#039;Hunger warning&#039;&#039;&#039; - You&#039;re starting to get hungry. You cannot die from hunger, but the longer you go without food, the slower you will be able to run. You can also eat too much and become bloated.&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
===Controls===&lt;br /&gt;
[[File:Hotkeys.png|thumb|500px|[[Keyboard_Shortcuts|Keybindings]] for the hotkey mode.]]&lt;br /&gt;
Don’t get scared by the hotkey image. It shows &#039;&#039;all&#039;&#039; the controls and their alternatives. This might seem like a lot, but don&#039;t worry, you&#039;ll only be using a few most of the time. The control are quite elegantly designed. There are exceptions, but for the most part you will be able to anything from surgery to nuclear science with the exact same controls. You won&#039;t need to memorize 20 hotkeys.&lt;br /&gt;
&lt;br /&gt;
The default control scheme is “hotkeys” set in the game preferences menu. In case it’s not working you will see the bottom-right textbox in a red color. Click anywhere in the game window and press &#039;&#039;&#039;Tab&#039;&#039;&#039;. The textbox should go white showing that you are in “hotkey” mode. &lt;br /&gt;
*Use the &#039;&#039;&#039;WASD&#039;&#039;&#039; keys to move around.&lt;br /&gt;
* Press the &#039;&#039;&#039;X&#039;&#039;&#039; key to swap your active hand. The hand system is explained below.&lt;br /&gt;
*Press the &#039;&#039;&#039;Q&#039;&#039;&#039; key to drop what you are currently holding in your hand on the ground.&lt;br /&gt;
*Press the &#039;&#039;&#039;T&#039;&#039;&#039; key to talk. Prefix what you say with a semicolon (;) to say it in the global radio channel. Use the &#039;&#039;&#039;M&#039;&#039;&#039; key for non-verbal actions like “smile” or “wave”.Use the &#039;&#039;&#039;U&#039;&#039;&#039; key for LOOC (described in Getting Help).&lt;br /&gt;
*Use &#039;&#039;&#039;left click&#039;&#039;&#039; on a thing to interact with it. Interact means different things based on the thing you are clicking. Use &#039;&#039;&#039;right click&#039;&#039;&#039; for a context menu (mostly used for stacks of items).&lt;br /&gt;
*Press the &#039;&#039;&#039;Z&#039;&#039;&#039; key with an item in hand to “use” it.&lt;br /&gt;
*Use &#039;&#039;&#039;SHIFT + click&#039;&#039;&#039; on anything to examine it. Your new favorite button combo. It will describe what you are looking at. As a new player you will be using this &#039;&#039;very often&#039;&#039;. Use this on anything and everything.&lt;br /&gt;
If you just want to just jump into a round immediately the above controls should be enough for your first round. Doing a task, like, asking someone where the drink vending machine is, buying and then drinking something is a good way to start getting the hang of the controls. &lt;br /&gt;
&lt;br /&gt;
It is &#039;&#039;&#039;necessary&#039;&#039;&#039; to read the &#039;&#039;&#039;[[FullControls|full controls page]]&#039;&#039;&#039; after your first (or such) round, however. You can also check out all the available [[Keyboard Shortcuts|hotkeys]].&lt;br /&gt;
== Gameplay Concepts ==&lt;br /&gt;
Before getting into anything else, it&#039;s important to note that since SS13 is such an open ended game that has other people in it, when you get in game and try to follow the guide, things may go wrong - the station might have been almost entirely consumed by a singularity, a traitor could attack you with a powerful weapon, or something no one could have predicted will kill you. &#039;&#039;&#039;It&#039;s important to not let death get to you!&#039;&#039;&#039; There are multiple ways you can be brought back into the game, so don&#039;t get frustrated if something happens.&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=You know, as much as I like to rib the fresh meat, it doesn&#039;t really matter if something happens to them - Nanotrasen thinks death is a waste of money, they&#039;ll just get cloned or something. What? Oh, shit, I gotta go. *click* You, uh, didn&#039;t hear that - right, kid?&lt;br /&gt;
|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
===The Hands System===&lt;br /&gt;
If an item requires two hands to use, then the other hand slot will instead be labeled as “off-hand”. Why do I start by telling you this? Because only one hand can be selected at a time. Imagine yourself as a creature with one hand. You only sprout a second hand when you need to use two handed items.&lt;br /&gt;
&lt;br /&gt;
Another time when you sprout an extra hand is to &#039;&#039;&#039;just&#039;&#039;&#039; hold an item. That is because your hands are also just a part of your inventory. However, think of them as an “active” part of your inventory. You place items in these “active” slots when you want to use them.&lt;br /&gt;
&lt;br /&gt;
The bright box around one of your hands is the selected hand. Swap your selected hand with the &#039;&#039;&#039;X&#039;&#039;&#039; key. This is the hand that&#039;s used whenever you click on something. If it’s empty. Otherwise, you will use what you are holding in your hand on what you clicked on.&lt;br /&gt;
&lt;br /&gt;
This can also cause problems with backpacks, boxes, and other containers. If you want to open a container, &#039;&#039;&#039;Alt + Click&#039;&#039;&#039; it. You can also pick it up, then switch hands and click on the container with an empty hand. Clicking on a container with an object will put it in the container. This also means that if you&#039;d like to &#039;&#039;&#039;take your backpack off&#039;&#039;&#039;, you need to click and drag the bag to an empty hand. Normal click just opens the equipped bag.&lt;br /&gt;
&lt;br /&gt;
If you find this confusing, you should go check out the [[FullControls|full controls page]] already! It goes hand in hand (GET IT!?) with this explanation. If you still find it confusing, then maybe you should play your first round already because it really is not that complicated.&lt;br /&gt;
===[[Intent|Intents]]===&lt;br /&gt;
The intent selector has four modes: &#039;&#039;&#039;help&#039;&#039;&#039; [[File:Intent_Help.png]], &#039;&#039;&#039;disarm [[File:Intent_Disarm.png]]&#039;&#039;&#039;, &#039;&#039;&#039;grab&#039;&#039;&#039; [[File:Intent_Grab.png]], and &#039;&#039;&#039;harm [[File:Intent_Harm.png]]&#039;&#039;&#039;. This system mostly controls how you interact with things with your bare hands. You can learn more about these uses on [[Intent|the intents page]]. It&#039;s not, however, critical that you learn this right now. When it comes to using &#039;&#039;&#039;things&#039;&#039;&#039; this system is &#039;&#039;&#039;much simpler then it appears&#039;&#039;&#039;. Using a crowbar on someone will hit them &#039;&#039;&#039;regardless&#039;&#039;&#039; of intent. Most items work like that. Instead when it comes to &#039;&#039;&#039;things&#039;&#039;&#039; there are special use cases, for example:&lt;br /&gt;
*While doing surgery, if you are &#039;&#039;&#039;not&#039;&#039;&#039; on help [[File:Intent_Help.png]] intent, you will intentionally botch it.&lt;br /&gt;
*Clicking on something next to you with a gun will shot them point blank. If, however, you are on harm &#039;&#039;&#039;[[File:Intent_Harm.png]]&#039;&#039;&#039; intent you will hit them with the weapon instead.&lt;br /&gt;
* Using harm &#039;&#039;&#039;[[File:Intent_Harm.png]]&#039;&#039;&#039; intent on an airlock with a welder will weld it shut instead of repair it.&lt;br /&gt;
You don&#039;t need to know these things right now. It&#039;s just so you understand the types of specific thing you will use intents for. The only intent related thing I want you to know for now is that clicking on people with and empty hand with help [[File:Intent_Help.png]] intent will hug them. Very important.&lt;br /&gt;
== Playing the Game ==&lt;br /&gt;
[[File:HUD_no_labels.png|thumb|489x489px|Arriving on the station.]]&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=C-05-MO, the AI&lt;br /&gt;
|text=Hello! The automatic diagnostic and announcement system welcomes you to Space Station 13. Remember: Have a secure day.&lt;br /&gt;
|image=[[File:AI.gif|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
If you join a game in progress, you&#039;ll spawn on the [[Arrivals|arrival shuttle]]. You&#039;ll start buckled onto a chair. Use the &#039;&#039;&#039;B&#039;&#039;&#039; key to resist out of the chair (or click the HUD icon).&lt;br /&gt;
===Finding Your Way Around===&lt;br /&gt;
On of the hardest things for new players is learning what there is on the station and where it is. This is compounded by the fact that we have [[Maps|several different stations]] with different designs. Look out for signs on the walls. Ask the people in the hallway. Look out for lines on the floor in the case of [[webmap:FlandStation|Fland]] or [[webmap:RadStation|Rad]] station. Ask the [[Mentor|mentors]].&lt;br /&gt;
&lt;br /&gt;
We live in the future! And thanks to revolutionary advancements in technology, we have an online map viewer for all [[Maps|BeeStation stations]]! Check the map you are currently on in the status page and then find the webmap link on the [[Maps|maps page]].&lt;br /&gt;
&lt;br /&gt;
It is helpful not just to find your way, but to get a more complete understanding of the stations. You can notice things here that are a common trend across all stations like: [[bar]] is always next to [[kitchen]], [[atmospherics]] are always next to [[engineering]], the [[Dormitory|dorms]] always have a room for cryosleep in case you want to leave the game, and more for you to discover!&lt;br /&gt;
&lt;br /&gt;
Since you&#039;ve chosen [[Assistant]] as your role, you&#039;ll have no responsibilities. This means you can safely attempt to get your bearings without fear of someone telling you that you need to be doing something. Check out the [[FullControls#Tasks to practice the controls|full controls page for suggestions]]. Eventually, once you&#039;re confident in the controls, why not consider doing some [[How to Roleplay|roleplaying]]? This is a roleplay server, after all.&lt;br /&gt;
===Inventory Management [[File:Backpack.png]]===&lt;br /&gt;
Items in the game have 4 different &amp;quot;weight classes,&amp;quot; tiny, small, normal, and bulky. These weight classes determine which storage slots it can fit in, and what they can&#039;t fit in. If you are wearing a jumpsuit, the two item storage slots to the rightmost of your screen are your pockets.&lt;br /&gt;
*These pockets can only store tiny and small items.&lt;br /&gt;
*Your hands are where you can grab items and interact with them.&lt;br /&gt;
*Your back is where you should have your backpack.&lt;br /&gt;
*Your backpack is your main storage space, but it can only fit a limited number of items. You can stuff tiny, small, and normal classed items into your backpack. However, normal classed items will take up more storage space than a tiny classed item.&lt;br /&gt;
*Your belt is where you store your toolbelt, (if you are an [[Station Engineer|engineer]]), your [[Laser Gun|gun]], or a variety of other different items, which range from swords to [[Defibrillator|defibrillators]].&lt;br /&gt;
* The items which you can fit in your suit storage (on the left most of your screen, below your gloves) depend on the uniform you are wearing. For example, a [[hardsuit]] would allow you to fit an oxygen tank in there, whilst an [[Armor Vest|armor vest]] would allow you to fit a [[laser gun]].&lt;br /&gt;
This is one of those things where there are a lot of exceptions. Simply ask around or experiment to find out all the interesting combinations of storage.&lt;br /&gt;
===Using Internals===&lt;br /&gt;
Your character starts with a [[box]]. Inside the box you will find an EpiPen. It’s used to stabilize people in [[Crit|critical]] condition. You will also find an [[emergency oxygen tank]] and a breathing mask. In a situation where there is a lack of oxygen, a viral outbreak, or some toxic gas in the air you can use this. &lt;br /&gt;
#Equip the mask into your mask slot [[File:Hud-Mask.png]] (press the equipment [[File:Hud-inventory.png]] icon to see it) or quickly equip with the &#039;&#039;&#039;E&#039;&#039;&#039; key.&lt;br /&gt;
#Place the oxygen tank into your pockets and press the [[File:Gmaskinternalsicon.gif]] button on the top left. You are now breathing from the oxygen tank.&lt;br /&gt;
Despite being called an emergency oxygen tank these puppies start with ~1000 kPa of pure oxygen. This, in layman’s terms, means you can breathe from one of these for about 30 minutes. You don’t have to fear running out of air in 5 minutes. The situation to use internals are not that common though. Lack of oxygen is usually accompanied by extreme temperature or pressure. The mask will not help with those. The best way to deal with things like breaches, fire or [[plasma]] fires is to run away from the affected area.&lt;br /&gt;
===Using suit sensors===&lt;br /&gt;
Every [[Nanotrasen]] [[jumpsuit]] comes with a mechanism called [[suit sensors]]. Right click on your jumpsuit and use the “adjust suit sensors mode”. It should be, by default, set to the highest level. If not, make sure to set them. I’m sure you can guess what they do by name alone. [[Medical Doctor|Medical]] and [[Security Officer|Security]] crew have access to [[Crew Monitoring Console|crew monitoring consoles]]. They can also use [[Pinpointer|pinpointers]] to locate crew. This only works if your suit sensors are on. In the unfortunate case of your early departure from this moral coil the good folk in medical possibly locate are resurrect or clone your body.&lt;br /&gt;
===What To Do if You Are Hurt or See Someone Hurt on the Ground?===&lt;br /&gt;
Go to the medbay. If you happen to see a dead or near dead person on the ground, you should take the following steps: Remember that EpiPen? Now is the time to use it. What is happening to a person in [[critical]] condition is that they are slowly suffocating. Injecting them with the EpiPen will prevent this suffocation, buying a lot of time. Then since they are hurt, they are probably bleeding. &#039;&#039;&#039;Do not drag them across the floor&#039;&#039;&#039; as this slowly kills them. Instead consult the [[FullControls|full controls]] page on how to lift a body in a fireman’s carry.&lt;br /&gt;
===What To Do if You Are Attacked?===&lt;br /&gt;
In the case that someone attacks you, you are already dead probably. If you are attacked by a [[Blood Cult|blood cultist]] using [[Blood Cult#Blood Spells|eldritch magic]], blood weapons and that has the jump on you; it’s not supposed to be a fair fight. Or a fight at all rather.&lt;br /&gt;
&lt;br /&gt;
In the case where you [[Byond the impossible|are not already dead]]. The first thing you want to do is scream “HELP” in the global radio chat. Because we can’t play the game and talk, an all uppercase “help” is like a special summoning call for [[Security Officer|security]], the [[AI]], or the [[Medical doctor|medical]] crew. If you have your [[Suit sensors|sensors]] turned on you don’t have to say where you are being attacked. Once the [[Terminology#Valid/Validhunting|valid hunters]] have been summoned the next step is to run away (bravely!). Look for the main station corridor as it is a public area and has lots of space. Avoid going into areas you don’t know since you might dead-end yourself.&lt;br /&gt;
&lt;br /&gt;
Once you get better acquainted with the [[rules]] you can read the [[Guide to Combat|combat guide]] (outdated; ask some security players for classes), to learn how to fight back.&lt;br /&gt;
===Radiation Storms===&lt;br /&gt;
When you hear a message stating: &#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;High levels of radiation detected near the station. Maintenance is best shielded from radiation.&#039;&#039;&#039;&amp;quot;;&#039;&#039;&#039;&#039;&#039; that means a [[Random events#Radiation Storm|radiation storm]] is coming. This message is misleading, because maintenance is the only place protected from radiation. Normally, if the heads are competent, a station-wide emergency will then be declared opening up [[maintenance]] even if you don&#039;t have access. All you have to do now is mill in [[maintenance]] until the radiation storm passes over. If you get hit by the radiation or feel sick in general head to the [[medbay]].&lt;br /&gt;
==Properly Leaving The Game (Cryosleep)==&lt;br /&gt;
Too confused? Head hurts? Mom called you to eat dinner? Whatever the reason you wish to leave the game, there is a proper way to do it. Crew and job slots are based on the number of living crew. The proper way to leave the round is to go the [[Dormitory|dorms]] and find the cryosleep pods. They are bright green. If you can’t find the dorms just ask [[Crew|someone]] (like a [[mentor]]). There are usually signs as well such as “DORMS”, “SLEEP” or “REST”. If you lay into a cryosleep pod and then log out or rather exit the game your body will be removed from the round, you will become a ghost and an empty crew an job slot will open for someone else. Speaking of ghosts...&lt;br /&gt;
==Death and Ghosts==&lt;br /&gt;
Tried to be a [[Clown|funny guy]] with the [[Traitor|wrong]] [[Changeling|person]]? Wrong [[Blood Cult|place]], wrong [[Nightmare|time]] in maintenance? Whatever the case, you are now [[dead]]. Don’t despair just yet! If the [[Antagonist|bad man]] has not completely destroyed your body and you &amp;lt;u&amp;gt;turned your suit sensors on max&amp;lt;/u&amp;gt; there is a chance that some good [[paramedic]] will find your charred and bruised corpse and bring it to the [[medbay]] to be revived or [[Clone|cloned]].&lt;br /&gt;
&lt;br /&gt;
In the meantime, move the ghost out of your body. This is spectator mode. You can communicate with other dead players. It’s fine to talk in an [[OOC]] way in Dchat. In the case you are revived you are &#039;&#039;&#039;&amp;lt;u&amp;gt;not allowed&amp;lt;/u&amp;gt;&#039;&#039;&#039; to use any information gained while being a ghost. Anything you saw while you were alive is fair game though. Unless you are cloned that is. If you are cloned, you forget the last 15 minutes of your life.&lt;br /&gt;
&lt;br /&gt;
In while being a ghost there is a chance to be prompted to become things like xenomorphs or swarmer. Sometimes these are random events and sometimes admin interference.&lt;br /&gt;
&lt;br /&gt;
There is also a ghost spawner menu. From here you can spawn as certain things on [[Lavaland]]. If you choose to do this, you will no longer be able to revive or be cloned. When you spawn you are a new entity. You are unaware of your past life. For a new player a recommendation can be spawning as a [[Lavaland]] doctor. You get your own [[Lavaland]] hospital where you can freely practice [[Guide to medicine|medicine]] and [[surgery]] on monkeys as well as [[Guide to hydroponics|botany]] and [[Guide to chemistry|chemistry]].&lt;br /&gt;
==What Jobs to Take After Your First Round==&lt;br /&gt;
The best beginner jobs are ones where no one is going to come to you asking for something you don&#039;t really understand. Assistant is the best because no one expects anything at all from you. You are free to explore and play with the controls. However once you get a grip on the controls is recommended to move to a job where still no one expects anything, but that have a designated objective. The recommended assistant &#039;&#039;plus&#039;&#039; roles are: &lt;br /&gt;
*[[Janitor]]: People will expect nothing from you except maybe that you clean the floor.&lt;br /&gt;
*[[Curator]]: The library is practically abandoned. Play with board games and painting. Organize books. Get fun loot from your curator beacon.&lt;br /&gt;
*[[Cargo Technician|Cargo Tech]]: Move crates until you die. It is said that all SS13 journeys begin and end in cargo. This is because cargo is of vital importance to several game modes. As a CT you will get to see the flow of these rounds first hand. However, your job will still remain to be just moving crates.&lt;br /&gt;
After that it&#039;s time to move on to some real roles. Funnily enough, the best way to learn these roles is to sign up as an assistant again. You are going to use this role as intended and actually assist some departments. Going to the [[Head of Personnel|HoP]] or whatever place you want to learn about and asking nicely for someone to teach you is a very effective way to learn. The [[Head of Personnel|HoP]] can even give you custom job titles like &amp;quot;medical intern&amp;quot; or &amp;quot;brig receptionist&amp;quot;. Job that are good for this are: [[Medical Doctor]], [[Scientist]], [[Station Engineer]]... This is also the best way to dip your toes safely into being a [[Security Officer]]. Be careful, because it&#039;s very easy to play security poorly, and [[Shitcurity|letting the power get to your head is a bad idea]]. &lt;br /&gt;
&lt;br /&gt;
Avoid joke roles such as the [[Clown]] or [[Mime]] at first. Many players find harassing the on board entertainment much more fun than any jokes the clown might otherwise have.&lt;br /&gt;
&lt;br /&gt;
After some time, when you&#039;re confident enough in your combat abilities, you should enable antagonists within your game preferences, so that you can roll for antag when the shift starts. A good half of the game is arguably being an antag and beating everyone up. Don&#039;t be scared that you will be a bad antag. Due to the fact that you can&#039;t predict what or when it will happen everyone was a painfully obvious antag at one point. It&#039;s just how the game works. You should however avoid team antag roles. [[Blood Cult|Blood cult]], blood brothers, [[Revolutionary|revolutions]], [[Clockwork Cult|clock cultists]], [[Nuclear Operative|nuclear operatives]], [[Xenomorph|xenomoprhs]]... The most common and &amp;quot;safe&amp;quot; antag options to dip you toes in are [[Traitor]] and [[Changeling]].&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=File:Antagonist_Preferences.png&amp;diff=37042</id>
		<title>File:Antagonist Preferences.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=File:Antagonist_Preferences.png&amp;diff=37042"/>
		<updated>2023-08-11T17:22:15Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=File:Game_prefences_Screen.PNG&amp;diff=37041</id>
		<title>File:Game prefences Screen.PNG</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=File:Game_prefences_Screen.PNG&amp;diff=37041"/>
		<updated>2023-08-11T17:17:12Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Itsmeowdev uploaded a new version of File:Game prefences Screen.PNG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
New Game preference screen&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=File:Occupation_Screen.png&amp;diff=37040</id>
		<title>File:Occupation Screen.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=File:Occupation_Screen.png&amp;diff=37040"/>
		<updated>2023-08-11T17:14:05Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=File:Character_settings.PNG&amp;diff=37039</id>
		<title>File:Character settings.PNG</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=File:Character_settings.PNG&amp;diff=37039"/>
		<updated>2023-08-11T17:11:35Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Itsmeowdev uploaded a new version of File:Character settings.PNG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
How character settings screen&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Starter_guide&amp;diff=37038</id>
		<title>Starter guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Starter_guide&amp;diff=37038"/>
		<updated>2023-08-11T17:05:20Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* Character Creation */ Text updated for tgui prefs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= [[What is SS13|What is SS13?]] =&lt;br /&gt;
&#039;&#039;&#039;Space Station 13&#039;&#039;&#039; is a multiplayer &amp;lt;u&amp;gt;sandbox&amp;lt;/u&amp;gt; that has a heavy focus on player interaction. In the year 2557, the megacorporation [[Nanotrasen]] employed you as a staff [[Jobs|member]] onboard their latest state of the art [[Guide to Research and Development|research]] station. Nanotrasen claims to be researching [[plasma]], a mysterious new substance, but rumors abound that the station is little more than a [[Clown|twisted]] [[Traitor|social]] [[Assistant|experiment]]...{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=Hmph. Fresh off the boat from Nanotrasen&#039;s recruitment office, huh? Let me tell you something, kid. You won&#039;t last five minutes on this floating deathtrap without help. You&#039;re as likely to be left for dead in a dark maintenance tunnel riddled with bullet holes as you are to get out of here alive. Lucky for you, I&#039;m in a helpful mood today.&lt;br /&gt;
|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
At the start of each round, each player is assigned a role onboard the station. There are many jobs, such as the [[Scientist|scientist performing research and development of new technologies]], the [[Medical Doctor|medical doctor]] trying to keep people alive, or the simple [[janitor]]. There are many ways to play. The game also randomly chooses a [[Game Mode|round type]], ranging from an all-out assault on the station by [[Nuclear Operative|nuclear operatives]], a sinister [[Blood Cult|cult sacrificing crewmembers]] to summon their [[Nar-Sie|god]], or more commonly, good ol&#039; fashioned [[Traitor|traitors]]. It is player driven and not some procedurally generated indie game. Every round on &#039;&#039;&#039;Space Station 13&#039;&#039;&#039; is different and a completely unique experience.&lt;br /&gt;
== Before Playing ==&lt;br /&gt;
Your choices matter in SS13. They have [[Ghost|consequences]]. The [[rules]] are here to ensure that when [[How to Roleplay|drama]] and [[Guide to Combat|conflict]] happen, they happen in a way that is [[Byond the impossible|beneficial to all parties involved]]. &amp;lt;u&amp;gt;You should read the [[rules]] before playing&amp;lt;/u&amp;gt;. If you don’t understand them all don’t worry. You can engage in the server more and more as you understand.&lt;br /&gt;
&lt;br /&gt;
At a base level, don’t attack players without any reason. Role playing as an “insane person” is &#039;&#039;&#039;not valid&#039;&#039;&#039;. If you want to be extra safe (there is no reason to be this afraid though) you can avoid any kind of fight. Most rules define who, what, where and how is allowed to fight, main or kill. If you don’t fight you automatically comply with these rules. One last point: Please, remember the human. SS13 can be highly frustrating. You will be unceremoniously killed, griefed, or die to some galactic space-bug shortly before executing your master plan. Everyone is here to play a game they enjoy, so keep that in mind before you bash someone&#039;s brain in with a [[toolbox]] because they took your [[multitool]].&lt;br /&gt;
== Getting Help ==&lt;br /&gt;
If you happen to get confused about something there are several ways to resolve this. The easiest is to contact a [[mentor]]. There is almost always at least one online. Don’t be shy! They love helping new players! In the top right there is a mentor tab. You can use “mentorwho” to check if any are online. Then you can use “mentorhelp” to send your question.&lt;br /&gt;
&lt;br /&gt;
In the case there are none, you can ask the players around you. It might be difficult to communicate your problem in an [[IC]] (in character) way. It might also be difficult to answer in an [[IC]] way. That is why we have the LOOC or “local out of character” button which defaults to the &#039;&#039;&#039;U&#039;&#039;&#039; key. LOOC is a special yellow text visible only in the chat window. Meaning it has no rune text (text over the head). LOOC is used to discuss [[OOC]] things. For advanced users it’s used to [[Byond the impossible|set up more complex RP scenarios]]. For beginners, like yourself, it’s used to explain controls in a literal “click this press that” way that [[IC]] does not allow.&lt;br /&gt;
== Setting Up ==&lt;br /&gt;
Download the [https://www.byond.com/download/ BYOND client]. If you are in the Discord server (you should be; it&#039;s where all the drama happens!), you can use the ?byond command in the bot-spam channel. BeeStation has two servers:&lt;br /&gt;
*&#039;&#039;&#039;The Main BeeStation Sage:&#039;&#039;&#039; byond://sage.beestation13.com:7878&lt;br /&gt;
*&#039;&#039;&#039;The Overflow Low-pop BeeStation Acacia:&#039;&#039;&#039; byond://acacia.beestation13.com:7979&lt;br /&gt;
To join the game, you can use the links on the website. If you are in the Discord server there is a dedicated bot-spam channel. Use the “?cs” command to ask the bot about the current round information on the main BeeStation server Sage. The bot output will include a link that you can just click. These two methods are preferred by most veteran players (mostly the latter) since you avoid interacting with the icky Byond client.&lt;br /&gt;
&lt;br /&gt;
Once you are in you will see a small window with some buttons. This is either “Ready” and “Not Ready” buttons or the “Join Game!” button depending on if the round is about to start or on-going. There is also a “Create Character” button we will be using shortly.&lt;br /&gt;
&lt;br /&gt;
BeeStation operates on a round based system. Every round is a new “shift” not related in any way to the past ones. The typical round length is around 1 hour and 30 minutes. This is because at that time there is a “crew transfer vote” which is basically a “are we done with this round?” vote. This is also plenty of time for things to go horribly wrong in the case of any of the [[Game Mode|major game modes]].&lt;br /&gt;
&lt;br /&gt;
If you jump onto the server, you are very likely to have joined during an active round. Using the “Status” tab, you can see the current round information. Speaking of which...&lt;br /&gt;
=== Client Interface ===&lt;br /&gt;
Look at the top right of the game window. You&#039;ll see some tabs. The most important tabs are the Status and Admin tabs. The admin tab contains the “&#039;&#039;&#039;adminhelp”&#039;&#039;&#039; button, used to contact admins directly if you have a &amp;lt;u&amp;gt;&#039;&#039;&#039;rules question&#039;&#039;&#039;&amp;lt;/u&amp;gt; or believe someone is breaking the rules. For gameplay use the mentor tab. Here is a quick break down of the tabs:&lt;br /&gt;
* Status: Displays important info such as your ping, the current map, pressure remaining in airtanks, etc.&lt;br /&gt;
* [[Admin]]: Contains buttons that allow you if any admins are online, and most importantly, to send a message directly to the admins (the &#039;&#039;&#039;adminhelp&#039;&#039;&#039; button). If no admins are online, the message will be forwarded to the admin IRC channel.&lt;br /&gt;
* [[Mentor]]: Explained in the “getting help” section. Contains buttons that allow you to see if any mentors are online, and allow you to ask a question directly to the mentors (the &amp;quot;mentorhelp&amp;quot; button). Mentorhelps are not forwarded like adminhelps.&lt;br /&gt;
* [[IC]]: Usually, won&#039;t use this. The &#039;&#039;&#039;Pray&#039;&#039;&#039; button allows you to send a message to any admins online in character meaning it&#039;s used for &amp;quot;communicating with the gods&amp;quot;. Or the notes button which has your bank ID or shows any antag objectives if you have them.&lt;br /&gt;
* OOC: Stands for &amp;quot;Out of Character&amp;quot;. Rarely needs to be used. Various functions that are related to the game, but not something your character does.&lt;br /&gt;
* Object: Never used.&lt;br /&gt;
* Preferences: Self-explanatory. Contains various options you can toggle on and off.&lt;br /&gt;
On the right side will be the chat window. And above the chat window there are some tabs like “Admin” or “Preferences”. Feel free to immediately click the blue gear in the chat window and turn on night mode. Anyway, before you can join we need to create your character.&lt;br /&gt;
===Character Creation===&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=You&#039;re brand new here, so make sure you sign up as an Assistant. Nanotrasen usually has checks to make sure fresh meat doesn&#039;t get to be the Captain, but if you manage to end up in that position, you&#039;ll probably be just another case for me to solve.|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
Recommended species for new players is [[Humans|human]]. Humans don’t have any major ups or downs. Later you can play as one of the [[Races|more exotic species]]. Other than that, it’s all mostly cosmetic. The Occupations tab lets you select your job preferences when a new round is starting. You, as a new player, want to set assistant to YES. For more information about job distribution on round start [[Job selection and assignment|see here]]. Again, this only applies to round start. In the case of on-going rounds, the “Join Game!” button will just let you pick what job you want assuming there are open slots. In the case of assistants that is always. Once you&#039;ve finished editing your appearance, the box in the title bar should hopefully say &amp;quot;Saved!&amp;quot;, verifying that your choices saved properly.&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Character settings.PNG|Character Creation Screen&lt;br /&gt;
File:New Occupation screen.JPG|Job Preferences Screen&lt;br /&gt;
File:Game prefences Screen.PNG|Preferences Window&lt;br /&gt;
File:Status tab top.png|Client Tabs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
== HUD &amp;amp; Controls ==&lt;br /&gt;
The biggest barrier to entry in Space Station 13 is the controls. Despite the reputation once it clicks, you&#039;ll never have an issue with it again. &#039;&#039;&#039;Don&#039;t let it overwhelm you!&#039;&#039;&#039; After a round or two of practice, you should be fine.&lt;br /&gt;
===HUD===&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=&amp;quot;Interface&amp;quot;? What the hell are you talking about, kid? &amp;quot;Blue buttons?&amp;quot; Geez, you&#039;ve been here for five minutes and you&#039;re already cracking. Hmmm... *recorder crackles* Note to self - check atmospherics. Gas might be poisoned.|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
The top right of the screen contains the action tabs and the bottom right is the text log or chat window. This is where you can see what people are saying, what&#039;s happening around you, and chat such as OOC or adminhelps. The bar along the bottom of the screen is the input bar, but since we&#039;re on [[Keyboard_Shortcuts|Hotkey]] mode we won&#039;t need to use it. There are a few HUD elements on the main screen, so let&#039;s break them down into sections. Don&#039;t worry if you can&#039;t memorize what everything does at once. You can always come back to this guide.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Hands&amp;quot;&amp;gt;[[File:Hud-hands.gif]] One of the most important elements of the HUD. You have the ability to hold an item in each hand (unless an item takes up both hands, obviously). The square around one of the hands is the &#039;&#039;&#039;selected hand&#039;&#039;&#039;. If you have an &#039;&#039;&#039;empty&#039;&#039;&#039; selected hand, and click on an object, you&#039;ll pick it up/open it/use it. If &#039;&#039;&#039;an object is in your selected hand&#039;&#039;&#039; and you click on something, you&#039;ll use it on the item you&#039;re holding. (The way this works means that if you&#039;d like to unequip your backpack, you need to click and drag the bag into your hand - if it was removed by clicking on it, you&#039;d never be able to open the bag.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If this seems confusing, don&#039;t worry - it&#039;ll be explained shortly.&#039;&#039;&#039;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Inventory Buttons&amp;quot;&amp;gt;These icons manage your inventory.&lt;br /&gt;
&lt;br /&gt;
The backpack [[File:Hud-inventory.png]] icon can be toggled to show your worn equipment.&lt;br /&gt;
&lt;br /&gt;
The belt [[File:Hud-Belt.png]], backpack [[File:Hud-Back.png]], and pocket [[File:Hud-Pocket.png]] icons are all storage locations.&lt;br /&gt;
&lt;br /&gt;
The ID [[File:Hud-ID.png]] slot can hold your ID, or your PDA (which can hold your ID).&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Interact Commands&amp;quot;&amp;gt;These buttons directly affect how you interact with objects.&lt;br /&gt;
&lt;br /&gt;
The drop [[File:Hud-drop.png]] and throw [[File:Hud-throw.png]] icons do what the name implies. Dropping is self explanatory, but the throw button is a toggle - if it&#039;s on and you click somewhere, you&#039;ll throw the item in your hand at where you clicked. (You can also press R to enable throwing and Q to drop your held item.)&lt;br /&gt;
&lt;br /&gt;
The pull [[File:Hud-pull.png]] icon only appears when dragging something, and can be pressed to stop dragging an object. [[Keyboard_Shortcuts|Hotkey]]: &amp;quot;H&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The internals [[File:Gmaskinternalsicon.gif]] icon can be clicked to enable/disable your internals (oxygen tank and breath mask). &lt;br /&gt;
&lt;br /&gt;
The resist [[File:Hud-resist.png]] icon can be pressed to break out of grabs, restraints, and if you&#039;re on fire, is the &amp;quot;stop drop and roll&amp;quot; button. [[Keyboard_Shortcuts|Hotkey]]: &amp;quot;B&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The run/walk toggle [[File:Hud-walkrun.gif]] icon can be pressed to switch between running and walking. Running is faster, but walking has benefits, such as being able to walk over water without slipping - useful for when the janitor doesn&#039;t put wet floor signs down. [[Keyboard_Shortcuts|Hotkey]]: Hold &amp;quot;alt&amp;quot; to walk. &lt;br /&gt;
&lt;br /&gt;
The body selector [[File:Hud-target.gif]] icon is used to choose which body part you want to target. This is used for both targeting specific sections to heal, or targeting specific sections when attacking someone. Click a limb to target it. (You can target individual arms, legs, the head, the upper torso, the groin, the eyes, or the mouth.) [[Keyboard_Shortcuts|Hotkeys]]: &amp;quot;numpad keys&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Last but not least is the intent selector [[File:Hud-intent.gif]] - this will be explained in detail later. It has four modes: &#039;&#039;&#039;Help&#039;&#039;&#039;, &#039;&#039;&#039;Disarm&#039;&#039;&#039;, &#039;&#039;&#039;Grab&#039;&#039;&#039;, and &#039;&#039;&#039;Harm&#039;&#039;&#039;, in clockwise order. [[Keyboard_Shortcuts|Hotkeys]]: &amp;quot;1-4&amp;quot;.&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Other&amp;quot;&amp;gt;The health [[File:Hud_100_percent_Health.gif]] icon and [[File:Healthdoll.gif]] doll change depending on how injured you are.  &lt;br /&gt;
&lt;br /&gt;
The crafting menu [[File:Craft.gif]] icon opens the crafting menu.&lt;br /&gt;
&lt;br /&gt;
The speech bubble [[File:Talk_wheel.gif]] icon opens the languages menu. You won&#039;t need to use this for the tutorial.&lt;br /&gt;
&lt;br /&gt;
The create area [[File:Area_edit.gif]] icon is used to create an &amp;quot;area&amp;quot;, which is a more advanced topic. You won&#039;t need to worry about it for this tutorial.&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Alerts&amp;quot;&amp;gt;These will only appear on the HUD if something is wrong.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-oxy.gif]] &#039;&#039;&#039;Oxygen warning&#039;&#039;&#039; - The air you&#039;re breathing doesn&#039;t have enough oxygen.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-pressure.gif]] &#039;&#039;&#039;Pressure warning&#039;&#039;&#039; - Pressure levels are too high (red) or too low (black). Low and high pressures can kill you.&lt;br /&gt;
&lt;br /&gt;
[[File:tox_in_air.gif]] &#039;&#039;&#039;Toxin warning&#039;&#039;&#039; - You are breathing in toxic gases.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-fire.png]] &#039;&#039;&#039;Fire warning&#039;&#039;&#039; - The air is hot enough to burn you.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-freeze.gif]] &#039;&#039;&#039;Freeze warning&#039;&#039;&#039; - The air is cold enough to freeze you.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-temp.gif]] &#039;&#039;&#039;Temperature warning&#039;&#039;&#039; - You&#039;re too cold or too hot.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-hunger.gif]] &#039;&#039;&#039;Hunger warning&#039;&#039;&#039; - You&#039;re starting to get hungry. You cannot die from hunger, but the longer you go without food, the slower you will be able to run. You can also eat too much and become bloated.&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
===Controls===&lt;br /&gt;
[[File:Hotkeys.png|thumb|500px|[[Keyboard_Shortcuts|Keybindings]] for the hotkey mode.]]&lt;br /&gt;
Don’t get scared by the hotkey image. It shows &#039;&#039;all&#039;&#039; the controls and their alternatives. This might seem like a lot, but don&#039;t worry, you&#039;ll only be using a few most of the time. The control are quite elegantly designed. There are exceptions, but for the most part you will be able to anything from surgery to nuclear science with the exact same controls. You won&#039;t need to memorize 20 hotkeys.&lt;br /&gt;
&lt;br /&gt;
The default control scheme is “hotkeys” set in the game preferences menu. In case it’s not working you will see the bottom-right textbox in a red color. Click anywhere in the game window and press &#039;&#039;&#039;Tab&#039;&#039;&#039;. The textbox should go white showing that you are in “hotkey” mode. &lt;br /&gt;
*Use the &#039;&#039;&#039;WASD&#039;&#039;&#039; keys to move around.&lt;br /&gt;
* Press the &#039;&#039;&#039;X&#039;&#039;&#039; key to swap your active hand. The hand system is explained below.&lt;br /&gt;
*Press the &#039;&#039;&#039;Q&#039;&#039;&#039; key to drop what you are currently holding in your hand on the ground.&lt;br /&gt;
*Press the &#039;&#039;&#039;T&#039;&#039;&#039; key to talk. Prefix what you say with a semicolon (;) to say it in the global radio channel. Use the &#039;&#039;&#039;M&#039;&#039;&#039; key for non-verbal actions like “smile” or “wave”.Use the &#039;&#039;&#039;U&#039;&#039;&#039; key for LOOC (described in Getting Help).&lt;br /&gt;
*Use &#039;&#039;&#039;left click&#039;&#039;&#039; on a thing to interact with it. Interact means different things based on the thing you are clicking. Use &#039;&#039;&#039;right click&#039;&#039;&#039; for a context menu (mostly used for stacks of items).&lt;br /&gt;
*Press the &#039;&#039;&#039;Z&#039;&#039;&#039; key with an item in hand to “use” it.&lt;br /&gt;
*Use &#039;&#039;&#039;SHIFT + click&#039;&#039;&#039; on anything to examine it. Your new favorite button combo. It will describe what you are looking at. As a new player you will be using this &#039;&#039;very often&#039;&#039;. Use this on anything and everything.&lt;br /&gt;
If you just want to just jump into a round immediately the above controls should be enough for your first round. Doing a task, like, asking someone where the drink vending machine is, buying and then drinking something is a good way to start getting the hang of the controls. &lt;br /&gt;
&lt;br /&gt;
It is &#039;&#039;&#039;necessary&#039;&#039;&#039; to read the &#039;&#039;&#039;[[FullControls|full controls page]]&#039;&#039;&#039; after your first (or such) round, however. You can also check out all the available [[Keyboard Shortcuts|hotkeys]].&lt;br /&gt;
== Gameplay Concepts ==&lt;br /&gt;
Before getting into anything else, it&#039;s important to note that since SS13 is such an open ended game that has other people in it, when you get in game and try to follow the guide, things may go wrong - the station might have been almost entirely consumed by a singularity, a traitor could attack you with a powerful weapon, or something no one could have predicted will kill you. &#039;&#039;&#039;It&#039;s important to not let death get to you!&#039;&#039;&#039; There are multiple ways you can be brought back into the game, so don&#039;t get frustrated if something happens.&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=You know, as much as I like to rib the fresh meat, it doesn&#039;t really matter if something happens to them - Nanotrasen thinks death is a waste of money, they&#039;ll just get cloned or something. What? Oh, shit, I gotta go. *click* You, uh, didn&#039;t hear that - right, kid?&lt;br /&gt;
|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
===The Hands System===&lt;br /&gt;
If an item requires two hands to use, then the other hand slot will instead be labeled as “off-hand”. Why do I start by telling you this? Because only one hand can be selected at a time. Imagine yourself as a creature with one hand. You only sprout a second hand when you need to use two handed items.&lt;br /&gt;
&lt;br /&gt;
Another time when you sprout an extra hand is to &#039;&#039;&#039;just&#039;&#039;&#039; hold an item. That is because your hands are also just a part of your inventory. However, think of them as an “active” part of your inventory. You place items in these “active” slots when you want to use them.&lt;br /&gt;
&lt;br /&gt;
The bright box around one of your hands is the selected hand. Swap your selected hand with the &#039;&#039;&#039;X&#039;&#039;&#039; key. This is the hand that&#039;s used whenever you click on something. If it’s empty. Otherwise, you will use what you are holding in your hand on what you clicked on.&lt;br /&gt;
&lt;br /&gt;
This can also cause problems with backpacks, boxes, and other containers. If you want to open a container, &#039;&#039;&#039;Alt + Click&#039;&#039;&#039; it. You can also pick it up, then switch hands and click on the container with an empty hand. Clicking on a container with an object will put it in the container. This also means that if you&#039;d like to &#039;&#039;&#039;take your backpack off&#039;&#039;&#039;, you need to click and drag the bag to an empty hand. Normal click just opens the equipped bag.&lt;br /&gt;
&lt;br /&gt;
If you find this confusing, you should go check out the [[FullControls|full controls page]] already! It goes hand in hand (GET IT!?) with this explanation. If you still find it confusing, then maybe you should play your first round already because it really is not that complicated.&lt;br /&gt;
===[[Intent|Intents]]===&lt;br /&gt;
The intent selector has four modes: &#039;&#039;&#039;help&#039;&#039;&#039; [[File:Intent_Help.png]], &#039;&#039;&#039;disarm [[File:Intent_Disarm.png]]&#039;&#039;&#039;, &#039;&#039;&#039;grab&#039;&#039;&#039; [[File:Intent_Grab.png]], and &#039;&#039;&#039;harm [[File:Intent_Harm.png]]&#039;&#039;&#039;. This system mostly controls how you interact with things with your bare hands. You can learn more about these uses on [[Intent|the intents page]]. It&#039;s not, however, critical that you learn this right now. When it comes to using &#039;&#039;&#039;things&#039;&#039;&#039; this system is &#039;&#039;&#039;much simpler then it appears&#039;&#039;&#039;. Using a crowbar on someone will hit them &#039;&#039;&#039;regardless&#039;&#039;&#039; of intent. Most items work like that. Instead when it comes to &#039;&#039;&#039;things&#039;&#039;&#039; there are special use cases, for example:&lt;br /&gt;
*While doing surgery, if you are &#039;&#039;&#039;not&#039;&#039;&#039; on help [[File:Intent_Help.png]] intent, you will intentionally botch it.&lt;br /&gt;
*Clicking on something next to you with a gun will shot them point blank. If, however, you are on harm &#039;&#039;&#039;[[File:Intent_Harm.png]]&#039;&#039;&#039; intent you will hit them with the weapon instead.&lt;br /&gt;
* Using harm &#039;&#039;&#039;[[File:Intent_Harm.png]]&#039;&#039;&#039; intent on an airlock with a welder will weld it shut instead of repair it.&lt;br /&gt;
You don&#039;t need to know these things right now. It&#039;s just so you understand the types of specific thing you will use intents for. The only intent related thing I want you to know for now is that clicking on people with and empty hand with help [[File:Intent_Help.png]] intent will hug them. Very important.&lt;br /&gt;
== Playing the Game ==&lt;br /&gt;
[[File:HUD_no_labels.png|thumb|489x489px|Arriving on the station.]]&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=C-05-MO, the AI&lt;br /&gt;
|text=Hello! The automatic diagnostic and announcement system welcomes you to Space Station 13. Remember: Have a secure day.&lt;br /&gt;
|image=[[File:AI.gif|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
If you join a game in progress, you&#039;ll spawn on the [[Arrivals|arrival shuttle]]. You&#039;ll start buckled onto a chair. Use the &#039;&#039;&#039;B&#039;&#039;&#039; key to resist out of the chair (or click the HUD icon).&lt;br /&gt;
===Finding Your Way Around===&lt;br /&gt;
On of the hardest things for new players is learning what there is on the station and where it is. This is compounded by the fact that we have [[Maps|several different stations]] with different designs. Look out for signs on the walls. Ask the people in the hallway. Look out for lines on the floor in the case of [[webmap:FlandStation|Fland]] or [[webmap:RadStation|Rad]] station. Ask the [[Mentor|mentors]].&lt;br /&gt;
&lt;br /&gt;
We live in the future! And thanks to revolutionary advancements in technology, we have an online map viewer for all [[Maps|BeeStation stations]]! Check the map you are currently on in the status page and then find the webmap link on the [[Maps|maps page]].&lt;br /&gt;
&lt;br /&gt;
It is helpful not just to find your way, but to get a more complete understanding of the stations. You can notice things here that are a common trend across all stations like: [[bar]] is always next to [[kitchen]], [[atmospherics]] are always next to [[engineering]], the [[Dormitory|dorms]] always have a room for cryosleep in case you want to leave the game, and more for you to discover!&lt;br /&gt;
&lt;br /&gt;
Since you&#039;ve chosen [[Assistant]] as your role, you&#039;ll have no responsibilities. This means you can safely attempt to get your bearings without fear of someone telling you that you need to be doing something. Check out the [[FullControls#Tasks to practice the controls|full controls page for suggestions]]. Eventually, once you&#039;re confident in the controls, why not consider doing some [[How to Roleplay|roleplaying]]? This is a roleplay server, after all.&lt;br /&gt;
===Inventory Management [[File:Backpack.png]]===&lt;br /&gt;
Items in the game have 4 different &amp;quot;weight classes,&amp;quot; tiny, small, normal, and bulky. These weight classes determine which storage slots it can fit in, and what they can&#039;t fit in. If you are wearing a jumpsuit, the two item storage slots to the rightmost of your screen are your pockets.&lt;br /&gt;
*These pockets can only store tiny and small items.&lt;br /&gt;
*Your hands are where you can grab items and interact with them.&lt;br /&gt;
*Your back is where you should have your backpack.&lt;br /&gt;
*Your backpack is your main storage space, but it can only fit a limited number of items. You can stuff tiny, small, and normal classed items into your backpack. However, normal classed items will take up more storage space than a tiny classed item.&lt;br /&gt;
*Your belt is where you store your toolbelt, (if you are an [[Station Engineer|engineer]]), your [[Laser Gun|gun]], or a variety of other different items, which range from swords to [[Defibrillator|defibrillators]].&lt;br /&gt;
* The items which you can fit in your suit storage (on the left most of your screen, below your gloves) depend on the uniform you are wearing. For example, a [[hardsuit]] would allow you to fit an oxygen tank in there, whilst an [[Armor Vest|armor vest]] would allow you to fit a [[laser gun]].&lt;br /&gt;
This is one of those things where there are a lot of exceptions. Simply ask around or experiment to find out all the interesting combinations of storage.&lt;br /&gt;
===Using Internals===&lt;br /&gt;
Your character starts with a [[box]]. Inside the box you will find an EpiPen. It’s used to stabilize people in [[Crit|critical]] condition. You will also find an [[emergency oxygen tank]] and a breathing mask. In a situation where there is a lack of oxygen, a viral outbreak, or some toxic gas in the air you can use this. &lt;br /&gt;
#Equip the mask into your mask slot [[File:Hud-Mask.png]] (press the equipment [[File:Hud-inventory.png]] icon to see it) or quickly equip with the &#039;&#039;&#039;E&#039;&#039;&#039; key.&lt;br /&gt;
#Place the oxygen tank into your pockets and press the [[File:Gmaskinternalsicon.gif]] button on the top left. You are now breathing from the oxygen tank.&lt;br /&gt;
Despite being called an emergency oxygen tank these puppies start with ~1000 kPa of pure oxygen. This, in layman’s terms, means you can breathe from one of these for about 30 minutes. You don’t have to fear running out of air in 5 minutes. The situation to use internals are not that common though. Lack of oxygen is usually accompanied by extreme temperature or pressure. The mask will not help with those. The best way to deal with things like breaches, fire or [[plasma]] fires is to run away from the affected area.&lt;br /&gt;
===Using suit sensors===&lt;br /&gt;
Every [[Nanotrasen]] [[jumpsuit]] comes with a mechanism called [[suit sensors]]. Right click on your jumpsuit and use the “adjust suit sensors mode”. It should be, by default, set to the highest level. If not, make sure to set them. I’m sure you can guess what they do by name alone. [[Medical Doctor|Medical]] and [[Security Officer|Security]] crew have access to [[Crew Monitoring Console|crew monitoring consoles]]. They can also use [[Pinpointer|pinpointers]] to locate crew. This only works if your suit sensors are on. In the unfortunate case of your early departure from this moral coil the good folk in medical possibly locate are resurrect or clone your body.&lt;br /&gt;
===What To Do if You Are Hurt or See Someone Hurt on the Ground?===&lt;br /&gt;
Go to the medbay. If you happen to see a dead or near dead person on the ground, you should take the following steps: Remember that EpiPen? Now is the time to use it. What is happening to a person in [[critical]] condition is that they are slowly suffocating. Injecting them with the EpiPen will prevent this suffocation, buying a lot of time. Then since they are hurt, they are probably bleeding. &#039;&#039;&#039;Do not drag them across the floor&#039;&#039;&#039; as this slowly kills them. Instead consult the [[FullControls|full controls]] page on how to lift a body in a fireman’s carry.&lt;br /&gt;
===What To Do if You Are Attacked?===&lt;br /&gt;
In the case that someone attacks you, you are already dead probably. If you are attacked by a [[Blood Cult|blood cultist]] using [[Blood Cult#Blood Spells|eldritch magic]], blood weapons and that has the jump on you; it’s not supposed to be a fair fight. Or a fight at all rather.&lt;br /&gt;
&lt;br /&gt;
In the case where you [[Byond the impossible|are not already dead]]. The first thing you want to do is scream “HELP” in the global radio chat. Because we can’t play the game and talk, an all uppercase “help” is like a special summoning call for [[Security Officer|security]], the [[AI]], or the [[Medical doctor|medical]] crew. If you have your [[Suit sensors|sensors]] turned on you don’t have to say where you are being attacked. Once the [[Terminology#Valid/Validhunting|valid hunters]] have been summoned the next step is to run away (bravely!). Look for the main station corridor as it is a public area and has lots of space. Avoid going into areas you don’t know since you might dead-end yourself.&lt;br /&gt;
&lt;br /&gt;
Once you get better acquainted with the [[rules]] you can read the [[Guide to Combat|combat guide]] (outdated; ask some security players for classes), to learn how to fight back.&lt;br /&gt;
===Radiation Storms===&lt;br /&gt;
When you hear a message stating: &#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;High levels of radiation detected near the station. Maintenance is best shielded from radiation.&#039;&#039;&#039;&amp;quot;;&#039;&#039;&#039;&#039;&#039; that means a [[Random events#Radiation Storm|radiation storm]] is coming. This message is misleading, because maintenance is the only place protected from radiation. Normally, if the heads are competent, a station-wide emergency will then be declared opening up [[maintenance]] even if you don&#039;t have access. All you have to do now is mill in [[maintenance]] until the radiation storm passes over. If you get hit by the radiation or feel sick in general head to the [[medbay]].&lt;br /&gt;
==Properly Leaving The Game (Cryosleep)==&lt;br /&gt;
Too confused? Head hurts? Mom called you to eat dinner? Whatever the reason you wish to leave the game, there is a proper way to do it. Crew and job slots are based on the number of living crew. The proper way to leave the round is to go the [[Dormitory|dorms]] and find the cryosleep pods. They are bright green. If you can’t find the dorms just ask [[Crew|someone]] (like a [[mentor]]). There are usually signs as well such as “DORMS”, “SLEEP” or “REST”. If you lay into a cryosleep pod and then log out or rather exit the game your body will be removed from the round, you will become a ghost and an empty crew an job slot will open for someone else. Speaking of ghosts...&lt;br /&gt;
==Death and Ghosts==&lt;br /&gt;
Tried to be a [[Clown|funny guy]] with the [[Traitor|wrong]] [[Changeling|person]]? Wrong [[Blood Cult|place]], wrong [[Nightmare|time]] in maintenance? Whatever the case, you are now [[dead]]. Don’t despair just yet! If the [[Antagonist|bad man]] has not completely destroyed your body and you &amp;lt;u&amp;gt;turned your suit sensors on max&amp;lt;/u&amp;gt; there is a chance that some good [[paramedic]] will find your charred and bruised corpse and bring it to the [[medbay]] to be revived or [[Clone|cloned]].&lt;br /&gt;
&lt;br /&gt;
In the meantime, move the ghost out of your body. This is spectator mode. You can communicate with other dead players. It’s fine to talk in an [[OOC]] way in Dchat. In the case you are revived you are &#039;&#039;&#039;&amp;lt;u&amp;gt;not allowed&amp;lt;/u&amp;gt;&#039;&#039;&#039; to use any information gained while being a ghost. Anything you saw while you were alive is fair game though. Unless you are cloned that is. If you are cloned, you forget the last 15 minutes of your life.&lt;br /&gt;
&lt;br /&gt;
In while being a ghost there is a chance to be prompted to become things like xenomorphs or swarmer. Sometimes these are random events and sometimes admin interference.&lt;br /&gt;
&lt;br /&gt;
There is also a ghost spawner menu. From here you can spawn as certain things on [[Lavaland]]. If you choose to do this, you will no longer be able to revive or be cloned. When you spawn you are a new entity. You are unaware of your past life. For a new player a recommendation can be spawning as a [[Lavaland]] doctor. You get your own [[Lavaland]] hospital where you can freely practice [[Guide to medicine|medicine]] and [[surgery]] on monkeys as well as [[Guide to hydroponics|botany]] and [[Guide to chemistry|chemistry]].&lt;br /&gt;
==What Jobs to Take After Your First Round==&lt;br /&gt;
The best beginner jobs are ones where no one is going to come to you asking for something you don&#039;t really understand. Assistant is the best because no one expects anything at all from you. You are free to explore and play with the controls. However once you get a grip on the controls is recommended to move to a job where still no one expects anything, but that have a designated objective. The recommended assistant &#039;&#039;plus&#039;&#039; roles are: &lt;br /&gt;
*[[Janitor]]: People will expect nothing from you except maybe that you clean the floor.&lt;br /&gt;
*[[Curator]]: The library is practically abandoned. Play with board games and painting. Organize books. Get fun loot from your curator beacon.&lt;br /&gt;
*[[Cargo Technician|Cargo Tech]]: Move crates until you die. It is said that all SS13 journeys begin and end in cargo. This is because cargo is of vital importance to several game modes. As a CT you will get to see the flow of these rounds first hand. However, your job will still remain to be just moving crates.&lt;br /&gt;
After that it&#039;s time to move on to some real roles. Funnily enough, the best way to learn these roles is to sign up as an assistant again. You are going to use this role as intended and actually assist some departments. Going to the [[Head of Personnel|HoP]] or whatever place you want to learn about and asking nicely for someone to teach you is a very effective way to learn. The [[Head of Personnel|HoP]] can even give you custom job titles like &amp;quot;medical intern&amp;quot; or &amp;quot;brig receptionist&amp;quot;. Job that are good for this are: [[Medical Doctor]], [[Scientist]], [[Station Engineer]]... This is also the best way to dip your toes safely into being a [[Security Officer]]. Be careful, because it&#039;s very easy to play security poorly, and [[Shitcurity|letting the power get to your head is a bad idea]]. &lt;br /&gt;
&lt;br /&gt;
Avoid joke roles such as the [[Clown]] or [[Mime]] at first. Many players find harassing the on board entertainment much more fun than any jokes the clown might otherwise have.&lt;br /&gt;
&lt;br /&gt;
After some time, when you&#039;re confident enough in your combat abilities, you should enable antagonists within your game preferences, so that you can roll for antag when the shift starts. A good half of the game is arguably being an antag and beating everyone up. Don&#039;t be scared that you will be a bad antag. Due to the fact that you can&#039;t predict what or when it will happen everyone was a painfully obvious antag at one point. It&#039;s just how the game works. You should however avoid team antag roles. [[Blood Cult|Blood cult]], blood brothers, [[Revolutionary|revolutions]], [[Clockwork Cult|clock cultists]], [[Nuclear Operative|nuclear operatives]], [[Xenomorph|xenomoprhs]]... The most common and &amp;quot;safe&amp;quot; antag options to dip you toes in are [[Traitor]] and [[Changeling]].&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Starter_guide&amp;diff=36805</id>
		<title>Starter guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Starter_guide&amp;diff=36805"/>
		<updated>2023-06-25T06:48:47Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* Controls */ Add TGUI say keys&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= [[What is SS13|What is SS13?]] =&lt;br /&gt;
&#039;&#039;&#039;Space Station 13&#039;&#039;&#039; is a multiplayer &amp;lt;u&amp;gt;sandbox&amp;lt;/u&amp;gt; that has a heavy focus on player interaction. In the year 2557, the megacorporation [[Nanotrasen]] employed you as a staff [[Jobs|member]] onboard their latest state of the art [[Guide to Research and Development|research]] station. Nanotrasen claims to be researching [[plasma]], a mysterious new substance, but rumors abound that the station is little more than a [[Clown|twisted]] [[Traitor|social]] [[Assistant|experiment]]...{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=Hmph. Fresh off the boat from Nanotrasen&#039;s recruitment office, huh? Let me tell you something, kid. You won&#039;t last five minutes on this floating deathtrap without help. You&#039;re as likely to be left for dead in a dark maintenance tunnel riddled with bullet holes as you are to get out of here alive. Lucky for you, I&#039;m in a helpful mood today.&lt;br /&gt;
|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
At the start of each round, each player is assigned a role onboard the station. There are many jobs, such as the [[Scientist|scientist performing research and development of new technologies]], the [[Medical Doctor|medical doctor]] trying to keep people alive, or the simple [[janitor]]. There are many ways to play. The game also randomly chooses a [[Game Mode|round type]], ranging from an all-out assault on the station by [[Nuclear Operative|nuclear operatives]], a sinister [[Blood Cult|cult sacrificing crewmembers]] to summon their [[Nar-Sie|god]], or more commonly, good ol&#039; fashioned [[Traitor|traitors]]. It is player driven and not some procedurally generated indie game. Every round on &#039;&#039;&#039;Space Station 13&#039;&#039;&#039; is different and a completely unique experience.&lt;br /&gt;
== Before Playing ==&lt;br /&gt;
Your choices matter in SS13. They have [[Ghost|consequences]]. The [[rules]] are here to ensure that when [[How to Roleplay|drama]] and [[Guide to Combat|conflict]] happen, they happen in a way that is [[Byond the impossible|beneficial to all parties involved]]. &amp;lt;u&amp;gt;You should read the [[rules]] before playing&amp;lt;/u&amp;gt;. If you don’t understand them all don’t worry. You can engage in the server more and more as you understand.&lt;br /&gt;
&lt;br /&gt;
At a base level don’t attack players without any reason. Role playing as an “insane person” is &#039;&#039;&#039;not valid&#039;&#039;&#039;. If you want to be extra safe (there is no reason to be this afraid though) you can avoid any kind of fight. Most rules define who, what, where and how is allowed to fight, main or kill. If you don’t fight you automatically comply with these rules. One last point: Please, remember the human. SS13 can be highly frustrating, you will be unceremoniously killed, griefed, or die to some galactic space-bug shortly before executing your master plan. Everyone is here to play a game they enjoy, so keep that in mind before you bash someone&#039;s brain in with a [[toolbox]] because they took your [[multitool]].&lt;br /&gt;
== Getting Help ==&lt;br /&gt;
If you happen to get confused about something there are several ways to resolve this. The easiest is to contact a [[mentor]]. There is almost always at least one online. Don’t be shy! They love helping new players! In the top right there is a mentor tab. You can use “mentorwho” to check if any are online. Then you can use “mentorhelp” to send your question.&lt;br /&gt;
&lt;br /&gt;
In the case there are none you can ask the players around you. It might be difficult to communicate your problem in an [[IC]] (in character) way. It might also be difficult to answer in an [[IC]] way. That is why we have the LOOC or “local out of character” button which defaults to the &#039;&#039;&#039;U&#039;&#039;&#039; key. LOOC is a special yellow text visible only in the chat window. Meaning it has no rune text (text over the head). LOOC is used to discuss [[OOC]] things. For advanced users it’s used to [[Byond the impossible|set up more complex RP scenarios]]. For beginners, like yourself, it’s used to explain controls in a literal “click this press that” way that [[IC]] does not allow.&lt;br /&gt;
== Setting Up ==&lt;br /&gt;
Download the [https://www.byond.com/download/ BYOND client]. If you are in the Discord server, you can use the ?byond command in the bot spam window. BeeStation has two servers:&lt;br /&gt;
*&#039;&#039;&#039;The Main BeeStation Sage:&#039;&#039;&#039; byond://sage.beestation13.com:7878&lt;br /&gt;
*&#039;&#039;&#039;The Overflow Low-pop BeeStation Acacia:&#039;&#039;&#039; byond://acacia.beestation13.com:7979&lt;br /&gt;
To join the game, you can use the links on the website. If you are in the Discord server there is a dedicated bot-spam channel. Use the “?cs” command to ask the bot about the current round information on the main BeeStation server Sage. The bot output will include a link that you can just click. These two methods are preferred by most veteran players (mostly the latter) since you avoid interacting with the icky Byond client.&lt;br /&gt;
&lt;br /&gt;
Once you are in you will see a small window with some buttons. This is either “Ready” and “Not Ready” buttons or the “Join Game!” button depending on if the round is about to start or on-going. There is also a “Create Character” button we will be using shortly.&lt;br /&gt;
&lt;br /&gt;
BeeStation operates on a round based system. Every round is a new “shift” not related in any way to the past ones. The typical round length is around 1:30 minutes. This is because at that time there is a “crew transfer vote” which is basically a “are we done with this round?” vote. This is also plenty of time for things to go horribly wrong in the case of any of the [[Game Mode|major game modes]].&lt;br /&gt;
&lt;br /&gt;
If you jump onto the server, you are very likely to have joined during an active round. Using the “Status” tab, you can see the current round information. Speaking of which...&lt;br /&gt;
=== Client Interface ===&lt;br /&gt;
Look at the top right of the game window. You&#039;ll see some tabs. The most important tabs are the Status and Admin tabs. The admin tab contains the “&#039;&#039;&#039;adminhelp”&#039;&#039;&#039; button, used to contact admins directly if you have a &amp;lt;u&amp;gt;&#039;&#039;&#039;rules question&#039;&#039;&#039;&amp;lt;/u&amp;gt; or believe someone is breaking the rules. For gameplay use the mentor tab. Here is a quick break down of the tabs:&lt;br /&gt;
* Status: Displays important info such as your ping, the current map, pressure remaining in airtanks, etc.&lt;br /&gt;
* [[Admin]]: Contains buttons that allow you if any admins are online, and most importantly, to send a message directly to the admins (the &#039;&#039;&#039;Adminhelp&#039;&#039;&#039; button). If no admins are online, the message will be forwarded to the admin IRC channel.&lt;br /&gt;
* [[Mentor]]: Explained in the “getting help” section. Contains buttons that allow you to see if any mentors are online, and allow you to ask a question directly to the mentors (the &amp;quot;mentorhelp&amp;quot; button). Mentorhelps are not forwarded like adminhelps.&lt;br /&gt;
* [[IC]]: Usually, won&#039;t use this. The &#039;&#039;&#039;Pray&#039;&#039;&#039; button allows you to send a message to any admins online in character - often used for &amp;quot;communicating with the gods&amp;quot;. Or the notes button which will you bank ID or show any antag objectives if you have them.&lt;br /&gt;
* OOC: Stands for &amp;quot;Out of Character&amp;quot;. Rarely needs to be used. Various functions that are related to the game, but not something your character does.&lt;br /&gt;
* Object: Never used.&lt;br /&gt;
* Preferences: Self-explanatory. Contains various options you can toggle on and off.&lt;br /&gt;
On the right side will be the chat window. And above the chat window there are some tabs like “Admin” or “Preferences”. Feel free to immediately click the blue gear in the chat window and turn on night mode. Anyway, before you can join we need to create your character.&lt;br /&gt;
===Character Creation===&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=You&#039;re brand new here, so make sure you sign up as an Assistant. Nanotrasen usually has checks to make sure fresh meat doesn&#039;t get to be the Captain, but if you manage to end up in that position, you&#039;ll probably be just another case for me to solve.|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
Recommended species for new players is [[Humans|human]]. Humans don’t have any major ups or downs. Later you can play as one of the [[Races|more exotic species]]. Other than that, it’s all mostly cosmetic. The “occupation preference” button declares occupation preferences when a new round is starting. More info on that here. You, as a new player, want to set assistant to YES. For more information about job distribution on round start [[Job selection and assignment|see here]]. Again, this only applies to round start. In the case of on-going rounds, the “Join Game!” button will just let you pick what job you want assuming there are open slots. In the case of assistants that is always, however. Once you&#039;ve finished editing your appearance, be sure to press the &#039;&#039;&#039;Save Setup&#039;&#039;&#039; button at the bottom of the window.&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Character settings.PNG|Character Creation Screen&lt;br /&gt;
File:New Occupation screen.JPG|Job Preferences Screen&lt;br /&gt;
File:Game prefences Screen.PNG|Preferences Window&lt;br /&gt;
File:Status tab top.png|Client Tabs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
== HUD &amp;amp; Controls ==&lt;br /&gt;
The biggest barrier to entry in Space Station 13 is the controls. Despite the reputation once it clicks, you&#039;ll never have an issue with it again. &#039;&#039;&#039;Don&#039;t let it overwhelm you!&#039;&#039;&#039; After a round or two of practice, you should be fine.&lt;br /&gt;
===HUD===&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=&amp;quot;Interface&amp;quot;? What the hell are you talking about, kid? &amp;quot;Blue buttons?&amp;quot; Geez, you&#039;ve been here for five minutes and you&#039;re already cracking. Hmmm... *recorder crackles* Note to self - check atmospherics. Gas might be poisoned.|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The top right of the screen contains the action tabs and the bottom right is the text log or chat window. This is where you can see what people are saying, what&#039;s happening around you, and chat such as OOC or adminhelps. The bar along the bottom of the screen is the input bar, but since we&#039;re on [[Keyboard_Shortcuts|Hotkey]] mode we won&#039;t need to use it. There are a few HUD elements on the main screen, so let&#039;s break them down into sections. Don&#039;t worry if you can&#039;t memorize what everything does at once. You can always come back to this guide.&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Hands&amp;quot;&amp;gt;[[File:Hud-hands.gif]] One of the most important elements of the HUD. You have the ability to hold an item in each hand (unless an item takes up both hands, obviously). The square around one of the hands is the &#039;&#039;&#039;selected hand&#039;&#039;&#039;. If you have an &#039;&#039;&#039;empty&#039;&#039;&#039; selected hand, and click on an object, you&#039;ll pick it up/open it/use it. If &#039;&#039;&#039;an object is in your selected hand&#039;&#039;&#039; and you click on something, you&#039;ll use it on the item you&#039;re holding. (The way this works means that if you&#039;d like to unequip your backpack, you need to click and drag the bag into your hand - if it was removed by clicking on it, you&#039;d never be able to open the bag.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If this seems confusing, don&#039;t worry - it&#039;ll be explained shortly.&#039;&#039;&#039;&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Inventory Buttons&amp;quot;&amp;gt;These icons manage your inventory.&lt;br /&gt;
&lt;br /&gt;
The backpack [[File:Hud-inventory.png]] icon can be toggled to show your worn equipment.&lt;br /&gt;
&lt;br /&gt;
The belt [[File:Hud-Belt.png]], backpack [[File:Hud-Back.png]], and pocket [[File:Hud-Pocket.png]] icons are all storage locations.&lt;br /&gt;
&lt;br /&gt;
The ID [[File:Hud-ID.png]] slot can hold your ID, or your PDA (which can hold your ID).&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Interact Commands&amp;quot;&amp;gt;These buttons directly affect how you interact with objects.&lt;br /&gt;
&lt;br /&gt;
The drop [[File:Hud-drop.png]] and throw [[File:Hud-throw.png]] icons do what the name implies. Dropping is self explanatory, but the throw button is a toggle - if it&#039;s on and you click somewhere, you&#039;ll throw the item in your hand at where you clicked. (You can also press R to enable throwing and Q to drop your held item.)&lt;br /&gt;
&lt;br /&gt;
The pull [[File:Hud-pull.png]] icon only appears when dragging something, and can be pressed to stop dragging an object. [[Keyboard_Shortcuts|Hotkey]]: &amp;quot;H&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The internals [[File:Gmaskinternalsicon.gif]] icon can be clicked to enable/disable your internals (oxygen tank and breath mask). &lt;br /&gt;
&lt;br /&gt;
The resist [[File:Hud-resist.png]] icon can be pressed to break out of grabs, restraints, and if you&#039;re on fire, is the &amp;quot;stop drop and roll&amp;quot; button. [[Keyboard_Shortcuts|Hotkey]]: &amp;quot;B&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The run/walk toggle [[File:Hud-walkrun.gif]] icon can be pressed to switch between running and walking. Running is faster, but walking has benefits, such as being able to walk over water without slipping - useful for when the janitor doesn&#039;t put wet floor signs down. [[Keyboard_Shortcuts|Hotkey]]: Hold &amp;quot;alt&amp;quot; to walk. &lt;br /&gt;
&lt;br /&gt;
The body selector [[File:Hud-target.gif]] icon is used to choose which body part you want to target. This is used for both targeting specific sections to heal, or targeting specific sections when attacking someone. Click a limb to target it. (You can target individual arms, legs, the head, the upper torso, the groin, the eyes, or the mouth.) [[Keyboard_Shortcuts|Hotkeys]]: &amp;quot;numpad keys&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Last but not least is the intent selector [[File:Hud-intent.gif]] - this will be explained in detail later. It has four modes: &#039;&#039;&#039;Help&#039;&#039;&#039;, &#039;&#039;&#039;Disarm&#039;&#039;&#039;, &#039;&#039;&#039;Grab&#039;&#039;&#039;, and &#039;&#039;&#039;Harm&#039;&#039;&#039;, in clockwise order. [[Keyboard_Shortcuts|Hotkeys]]: &amp;quot;1-4&amp;quot;.&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Other&amp;quot;&amp;gt;The health [[File:Hud_100_percent_Health.gif]] icon and [[File:Healthdoll.gif]] doll change depending on how injured you are.  &lt;br /&gt;
&lt;br /&gt;
The crafting menu [[File:Craft.gif]] icon opens the crafting menu.&lt;br /&gt;
&lt;br /&gt;
The speech bubble [[File:Talk_wheel.gif]] icon opens the languages menu. You won&#039;t need to use this for the tutorial.&lt;br /&gt;
&lt;br /&gt;
The create area [[File:Area_edit.gif]] icon is used to create an &amp;quot;area&amp;quot;, which is a more advanced topic. You won&#039;t need to worry about it for this tutorial.&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Alerts&amp;quot;&amp;gt;These will only appear on the HUD if something is wrong.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-oxy.gif]] &#039;&#039;&#039;Oxygen warning&#039;&#039;&#039; - The air you&#039;re breathing doesn&#039;t have enough oxygen.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-pressure.gif]] &#039;&#039;&#039;Pressure warning&#039;&#039;&#039; - Pressure levels are too high (red) or too low (black). Low and high pressures can kill you.&lt;br /&gt;
&lt;br /&gt;
[[File:tox_in_air.gif]] &#039;&#039;&#039;Toxin warning&#039;&#039;&#039; - You are breathing in toxic gases.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-fire.png]] &#039;&#039;&#039;Fire warning&#039;&#039;&#039; - The air is hot enough to burn you.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-freeze.gif]] &#039;&#039;&#039;Freeze warning&#039;&#039;&#039; - The air is cold enough to freeze you.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-temp.gif]] &#039;&#039;&#039;Temperature warning&#039;&#039;&#039; - You&#039;re too cold or too hot.&lt;br /&gt;
&lt;br /&gt;
[[File:Hud-hunger.gif]] &#039;&#039;&#039;Hunger warning&#039;&#039;&#039; - You&#039;re starting to get hungry. You cannot die from hunger, but the longer you go without food, the slower you will be able to run. You can also eat too much and become bloated.&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
===Controls===&lt;br /&gt;
[[File:Hotkeys.png|thumb|500px|[[Keyboard_Shortcuts|Keybindings]] for the hotkey mode.]]&lt;br /&gt;
Don’t get scared by the hotkey image. It shows &#039;&#039;all&#039;&#039; the controls and their alternatives. This might seem like a lot, but don&#039;t worry, you&#039;ll only be using a few most of the time. The control are quite elegantly designed. There are exceptions, but for the most part you will be able to anything from surgery to nuclear science with the exact same controls.&lt;br /&gt;
&lt;br /&gt;
The default control scheme is “hotkeys” set in the game preferences menu. In case it’s not working you will see the bottom-right textbox in a red color. Click anywhere in the game window and press &#039;&#039;&#039;Tab&#039;&#039;&#039;. The textbox should go white showing that you are in “hotkey” mode. &lt;br /&gt;
*Use the &#039;&#039;&#039;WASD&#039;&#039;&#039; keys to move around.&lt;br /&gt;
* Press the &#039;&#039;&#039;X&#039;&#039;&#039; key to swap your active hand. The hand system is explained below.&lt;br /&gt;
*Press the &#039;&#039;&#039;Q&#039;&#039;&#039; key to drop what you are currently holding in your hand on the ground.&lt;br /&gt;
*Press the &#039;&#039;&#039;T&#039;&#039;&#039; key to talk. Prefix what you say with a semicolon (;) to say it in the global radio channel. Use the &#039;&#039;&#039;M&#039;&#039;&#039; key for non-verbal actions like “smile” or “wave”. Use the &#039;&#039;&#039;O&#039;&#039;&#039; key for OOC chat. Use the &#039;&#039;&#039;U&#039;&#039;&#039; key for LOOC (Local Out-Of-Character, a type of OOC isolated to those within your view that works in-round). Use the &#039;&#039;&#039;Y&#039;&#039;&#039; key to speak on the radio without typing the &#039;&#039;&#039;;&#039;&#039;&#039; prefix.&lt;br /&gt;
*Use &#039;&#039;&#039;left click&#039;&#039;&#039; on a thing to interact with it. Interact means different things based on the thing you are clicking. Use &#039;&#039;&#039;right click&#039;&#039;&#039; for a context menu (mostly used for stacks of items).&lt;br /&gt;
*Press the &#039;&#039;&#039;Z&#039;&#039;&#039; key with an item in hand to “use” it.&lt;br /&gt;
*Use &#039;&#039;&#039;SHIFT + click&#039;&#039;&#039; on anything to examine it. Your new favorite button combo. It will describe what you are looking at. As a new player you will be using this &#039;&#039;very often&#039;&#039;.&lt;br /&gt;
If you just want to just jump into a round immediately the above controls should be enough for your first round. Doing a task like asking someone where the drink vending machine is, buying and then drinking something. &lt;br /&gt;
&lt;br /&gt;
If you are not as impatient skim the &#039;&#039;&#039;[[FullControls|full controls page here]]&#039;&#039;&#039;. You can also check out all the available [[Keyboard Shortcuts|hotkeys]].&lt;br /&gt;
== Gameplay Concepts ==&lt;br /&gt;
Before getting into anything else, it&#039;s important to note that since SS13 is such an open ended game that has other people in it, when you get in game and try to follow the guide, things may go wrong - the station might have been almost entirely consumed by a singularity, a traitor could attack you with a powerful weapon, or something no one could have predicted will kill you. &#039;&#039;&#039;It&#039;s important to not let death get to you!&#039;&#039;&#039; There are multiple ways you can be brought back into the game, so don&#039;t get frustrated if something happens.&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=Tuterr, the Private Eye&lt;br /&gt;
|text=You know, as much as I like to rib the fresh meat, it doesn&#039;t really matter if something happens to them - Nanotrasen thinks death is a waste of money, they&#039;ll just get cloned or something. What? Oh, shit, I gotta go. *click* You, uh, didn&#039;t hear that - right, kid?&lt;br /&gt;
|image=[[File:Generic detective.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
===The Hands System===&lt;br /&gt;
If an item requires two hands to use, then the other hand slot will instead be labeled as “off-hand”. Why do I start by telling you this? Because only one hand can be selected at a time. Imagine yourself as a creature with one hand. You only sprout a second hand when you need to use two handed items.&lt;br /&gt;
&lt;br /&gt;
Another time when you sprout an extra hand is to JUST hold an item. That is because your hands are also just a part of your inventory. However, think of them as an “active” part of your inventory. You place items in these “active” slots when you want to use them.&lt;br /&gt;
&lt;br /&gt;
The bright box around one of your hands is the selected hand. Swap your selected hand with the &#039;&#039;&#039;X&#039;&#039;&#039; key. This is the hand that&#039;s used whenever you click on something. If it’s empty. Otherwise, you will use what you are holding in your hand on what you clicked on.&lt;br /&gt;
&lt;br /&gt;
This can also cause problems with backpacks, boxes, and other containers. If you want to open a container, &#039;&#039;&#039;Alt + Click&#039;&#039;&#039; it. You can also pick it up, then switch hands and click on the container with an empty hand. Clicking on a container with an object will put it in the container. This also means that if you&#039;d like to &#039;&#039;&#039;take your backpack off&#039;&#039;&#039;, you need to click and drag the bag to an empty hand - a normal click just opens the equipped bag.&lt;br /&gt;
&lt;br /&gt;
If you find this confusing, you should go check out the full controls page. It goes hand in hand (GET IT!?) with this explanation. If you still find it confusing, then maybe you should play your first round already because it really is not that complicated.&lt;br /&gt;
===[[Intent|Intents]]===&lt;br /&gt;
The intent selector has four modes: &#039;&#039;&#039;help&#039;&#039;&#039; [[File:Intent_Help.png]], &#039;&#039;&#039;disarm [[File:Intent_Disarm.png]]&#039;&#039;&#039;, &#039;&#039;&#039;grab&#039;&#039;&#039; [[File:Intent_Grab.png]], and &#039;&#039;&#039;harm [[File:Intent_Harm.png]]&#039;&#039;&#039;. This system mostly controls how you interact with this your bare hands. You can learn more about these uses on [[Intent|the intents page]]. It&#039;s not, however, critical that you learn this right now. When it comes to using &#039;&#039;&#039;things&#039;&#039;&#039; this system is much simpler then it appears. Using a crowbar on someone will hit them &#039;&#039;&#039;regardless&#039;&#039;&#039; of intent. Most items work like that. Instead when it comes to &#039;&#039;&#039;things&#039;&#039;&#039; there are special use cases, for example:&lt;br /&gt;
*While doing surgery, if you are &#039;&#039;&#039;not&#039;&#039;&#039; on help [[File:Intent_Help.png]] intent, you will intentionally botch it.&lt;br /&gt;
*Clicking on something next to you with a gun will shot them point blank. If, however, you are on harm &#039;&#039;&#039;[[File:Intent_Harm.png]]&#039;&#039;&#039; intent you will hit them with the weapon instead.&lt;br /&gt;
* Using harm &#039;&#039;&#039;[[File:Intent_Harm.png]]&#039;&#039;&#039; intent on an airlock with a welder will weld it shut instead of repair it.&lt;br /&gt;
You don&#039;t need to know these things know. It&#039;s just so you understand the types of specific thing you will use intents for. These exceptions are not important to memorize. The only intent related thing I want you to know for now is that clicking on people with and empty hand with help [[File:Intent_Help.png]] intent will hug them.&lt;br /&gt;
== Playing the Game ==&lt;br /&gt;
[[File:HUD_no_labels.png|thumb|489x489px|Arriving on the station.]]&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=C-05-MO, the AI&lt;br /&gt;
|text=Hello! The automatic diagnostic and announcement system welcomes you to Space Station 13. Remember: Have a secure day.&lt;br /&gt;
|image=[[File:AI.gif|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
If you join a game in progress, you&#039;ll spawn on the [[Arrivals|arrival shuttle]]. (You&#039;ll start buckled onto a chair. Use the &#039;&#039;&#039;B&#039;&#039;&#039; key to resist out of the chair).&lt;br /&gt;
===Finding Your Way Around===&lt;br /&gt;
On of the hardest things for new players is learning what there is on the station and where it is. This is compounded by the fact that we have [[Maps|several different stations]] with different designs. Look out for signs on the walls. Ask the people in the hallway. Look out for lines on the floor in the case of [[webmap:FlandStation|Fland]] or [[webmap:RadStation|Rad]] station. Ask the [[Mentor|mentors]].&lt;br /&gt;
&lt;br /&gt;
We live in the future! And thanks to revolutionary advancements in technology, we have an online map viewer for all [[Maps|BeeStation stations]]! Check the map you are currently on in the status page and then find the webmap link on the [[Maps|maps page]].&lt;br /&gt;
&lt;br /&gt;
It is helpful not just to find your way, but to get a more complete understanding of the stations. You can notice thigs here that are a common trend across all stations like: [[bar]] is always next to [[kitchen]], [[atmospherics]] are always next to [[engineering]], the [[Dormitory|dorms]] always have a room for cryo sleep in case you want to leave the game, and more for you to discover!&lt;br /&gt;
&lt;br /&gt;
Since you&#039;ve chosen [[Assistant]] as your role, you&#039;ll have no responsibilities. This means you can safely attempt to get your bearings without fear of someone telling you that you need to be doing something. Check out the [[FullControls#Tasks to practice the controls|full controls page for suggestions]]. Eventualy, once you&#039;re confident in the controls, why not consider doing some [[How to Roleplay|roleplaying]]? This is a roleplay server, after all.&lt;br /&gt;
===Inventory Management [[File:Backpack.png]]===&lt;br /&gt;
Items in the game have 4 different &amp;quot;weight classes,&amp;quot; tiny, small, normal, and bulky. These weight classes determine which storage slots it can fit in, and what they can&#039;t fit in. If you are wearing a jumpsuit, the two item storage slots to the rightmost of your screen are your pockets.&lt;br /&gt;
*These pockets can only store tiny and small items.&lt;br /&gt;
*Your hands are where you can grab items and interact with them.&lt;br /&gt;
*Your back is where you should have your backpack.&lt;br /&gt;
*Your backpack is your main storage space, but it can only fit a limited number of items. You can stuff tiny, small, and normal classed items into your backpack. However, normal classed items will take up more storage space than a tiny classed item.&lt;br /&gt;
*Your belt is where you store your toolbelt, (if you are an [[Station Engineer|engineer]]), your [[Laser Gun|gun]], or a variety of other different items, which range from swords to [[Defibrillator|defibrillators]].&lt;br /&gt;
* The items which you can fit in your suit storage (on the left most of your screen, below your gloves) depend on the uniform you are wearing. For example, a [[hardsuit]] would allow you to fit an oxygen tank in there, whilst an [[Armor Vest|armor vest]] would allow you to fit a [[laser gun]].&lt;br /&gt;
This is one of those things where there are a lot of exceptions. Simply ask around or experiment to find out all the interesting combinations of storage.&lt;br /&gt;
===Using Internals===&lt;br /&gt;
Your character starts with a [[box]]. Inside the box you will find an EpiPen. It’s used to stabilize people in [[Crit|critical]] condition. You will also find an [[emergency oxygen tank]] and a breathing mask. In a situation where there is a lack of oxygen, a viral outbreak, or some toxic gas in the air you can use this. &lt;br /&gt;
#Equip the mask into your mask slot [[File:Hud-Mask.png]] (press the equipment [[File:Hud-inventory.png]] icon to see it) or quickly equip with the &#039;&#039;&#039;E&#039;&#039;&#039; key.&lt;br /&gt;
#Place the oxygen tank into your pockets and press the [[File:Gmaskinternalsicon.gif]] button on the top left. You are now breathing from the oxygen tank.&lt;br /&gt;
Despite being called an emergency oxygen tank these puppies start with ~1000 kPa of pure oxygen. This, in layman’s terms, means you can breathe from one of these for about 30 minutes. You don’t have to fear running out of air in 5 minutes. The situation to use internals are not that common though. Lack of oxygen is usually accompanied by extreme temperature or pressure. The mask will not help with those. The best way to deal with things like breaches, fire or [[plasma]] fires is to run away from the affected area.&lt;br /&gt;
===Using suit sensors===&lt;br /&gt;
Every [[Nanotrasen]] [[jumpsuit]] comes with a mechanism called [[suit sensors]]. Right click on your jumpsuit and use the “adjust suit sensors mode”. It should be, by default, set to the highest level. If not, make sure to set them. I’m sure you can guess what they do by name alone. [[Medical Doctor|Medical]] and [[Security Officer|Security]] crew have access to [[Crew Monitoring Console|crew monitoring consoles]]. They can also use [[Pinpointer|pinpointers]] to locate crew. This only works if your suit sensors are on. In the unfortunate case of your early departure from this moral coil the good folk in medical possibly locate are resurrect or clone your body.&lt;br /&gt;
===What To Do if You Are Hurt or See Someone Hurt on the Ground?===&lt;br /&gt;
Go to the medbay. If you happen to see a dead or near dead person on the ground, you should take the following steps: Remember that EpiPen? Now is the time to use it. What is happening to a person in [[critical]] condition is that they are slowly suffocating. Injecting them with the EpiPen will prevent this suffocation, buying a lot of time. Then since they are hurt, they are probably bleeding. &#039;&#039;&#039;Do not drag them across the floor&#039;&#039;&#039; as this slowly kills them. Instead consult the [[FullControls|full controls]] page on how to lift a body in a fireman’s carry.&lt;br /&gt;
===What To Do if You Are Attacked?===&lt;br /&gt;
In the case that someone attacks you, you are already dead probably. If you are attacked by a [[Blood Cult|blood cultist]] using [[Blood Cult#Blood Spells|eldritch magic]], blood weapons and that has the jump on you; it’s not supposed to be a fair fight. Or a fight at all rather.&lt;br /&gt;
&lt;br /&gt;
In the case where you [[Byond the impossible|are not already dead]]. The first thing you want to do is scream “HELP” in the global radio chat. Because we can’t play the game and talk, an all uppercase “help” is like a special summoning call for [[Security Officer|security]], the [[AI]], or the [[Medical doctor|medical]] crew. If you have your [[Suit sensors|sensors]] turned on you don’t have to say where you are being attacked. Once the [[Terminology#Valid/Validhunting|valid hunters]] have been summoned the next step is to run away (bravely!). Look for the main station corridor as it is a public area and has lots of space. Avoid going into areas you don’t know since you might dead-end yourself.&lt;br /&gt;
&lt;br /&gt;
Once you get better acquainted with the [[rules]] you can read the [[Guide to Combat|combat guide]] (outdated; ask some security players for classes), to learn how to fight back.&lt;br /&gt;
===Radiation Storms===&lt;br /&gt;
When you hear a message stating: &#039;&#039;&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;High levels of radiation detected near the station. Maintenance is best shielded from radiation.&#039;&#039;&#039;&amp;quot;;&#039;&#039;&#039;&#039;&#039; that means a [[Random events#Radiation Storm|radiation storm]] is coming. Normally, if the heads are competent, a station-wide emergency will then be declared opening up [[maintenance]] even if you don&#039;t have access. All you have to do now is mill in [[maintenance]] until the radiation storm passes over. If you get hit by the radiation or feel sick in general head to the [[medbay]].&lt;br /&gt;
==Properly Leaving The Game (Cryosleep)==&lt;br /&gt;
Too confused? Head hurts? Mom called you to eat dinner? Whatever the reason you wish to leave the game, there is a proper way to do it. Crew and job slots are based on the number of living crew. The proper way to leave the round is to go the [[Dormitory|dorms]] and find the cryosleep pods. They are bright green. If you can’t find the dorms just ask [[Crew|someone]] (like a [[mentor]]). There are usually signs as well such as “DORMS”, “SLEEP” or “REST”. If you lay into a cryosleep pod and then log out or rather exit the game your body will be removed from the round, you will become a ghost and an empty crew an job slot will open for someone else. Speaking of ghosts...&lt;br /&gt;
==Death and Ghosts==&lt;br /&gt;
Tried to be a [[Clown|funny guy]] with the [[Traitor|wrong]] [[Changeling|person]]? Wrong [[Blood Cult|place]], wrong [[Nightmare|time]] in maintenance? Whatever the case, you are now [[dead]]. Don’t despair just yet! If the [[Antagonist|bad man]] has not completely destroyed your body and you &amp;lt;u&amp;gt;turned your suit sensors on max&amp;lt;/u&amp;gt; there is a chance that some good [[paramedic]] will find your charred and bruised corpse and bring it to the [[medbay]] to be revived or [[Clone|cloned]].&lt;br /&gt;
&lt;br /&gt;
In the meantime, move the ghost out of your body. This is spectator mode. You can communicate with other dead players. It’s fine to talk in an [[OOC]] way in Dchat. In the case you are revived you are &#039;&#039;&#039;&amp;lt;u&amp;gt;not allowed&amp;lt;/u&amp;gt;&#039;&#039;&#039; to use any information gained while being a ghost. Anything you saw while you were alive is fair game though. Unless you are cloned that is. If you are cloned, you forget the last 15 minutes of your life.&lt;br /&gt;
&lt;br /&gt;
In while being a ghost there is a chance to be prompted to become things like xenomorphs or swarmer. Sometimes these are random events and sometimes admin interference.&lt;br /&gt;
&lt;br /&gt;
There is also a ghost spawner menu. From here you can spawn as certain things on [[Lavaland]]. If you choose to do this, you will no longer be able to revive or be cloned. When you spawn you are a new entity. You are unaware of your past life. For a new player a recommendation can be spawning as a [[Lavaland]] doctor. You get your own [[Lavaland]] hospital where you can freely practice [[Guide to medicine|medicine]] and [[surgery]] on monkeys as well as [[Guide to hydroponics|botany]] and [[Guide to chemistry|chemistry]].&lt;br /&gt;
&lt;br /&gt;
SS13 is such an open-ended game that has other people in it, when you get in game and try to follow the guide, things may go wrong. The station might have been almost entirely consumed by a singularity, a traitor could attack you with a powerful weapon, or something no one could have predicted will kill you. &#039;&#039;&#039;It&#039;s important to not let death get to you.&#039;&#039;&#039; There are multiple ways you can be brought back into the game. Don&#039;t get frustrated if something undesirable happens.&lt;br /&gt;
==What Jobs to Take After Your First Round==&lt;br /&gt;
The best beginner jobs are ones where no one is going to come to you asking for something you don&#039;t really understand. assistant is the best because no one expects anything at all from you. You are free to explore and play with the controls. However once you get a grip on the controls is recommended to move to a job where still no one expects anything, but that have a designated objective. The recommended assistant &#039;&#039;plus&#039;&#039; roles are: &lt;br /&gt;
*[[Janitor]]: People will expect nothing from you except maybe that you clean the floor.&lt;br /&gt;
*[[Curator]]: The library is practically abandoned. Play with board games and painting. Organize books. Get fun loot from your curator beacon.&lt;br /&gt;
*[[Cargo Technician|Cargo Tech]]: Move crates until you die. It is said that all SS13 journeys begin and end in cargo. This is because cargo is of vital importance to several game modes. As a CT you will get to see the flow of these rounds first hand. However, your job will still remain to be just moving crates.&lt;br /&gt;
After that it&#039;s time to move on to some real roles. Funnily enough, the best way to learn these roles is to sign up as an assistant again. You are going to use this role as intended and actually assist some departments. Going to the [[Head of Personnel|HoP]] or whatever place you want to learn about and asking nicely for someone to teach you is a very effective way to learn. The [[Head of Personnel|HoP]] can even give you custom job titles like &amp;quot;medical intern&amp;quot; or &amp;quot;brig receptionist&amp;quot;. Job that are good for this are: [[Medical Doctor]], [[Scientist]], [[Station Engineer]]... This is also the best way to dip your toes safely into being a [[Security Officer]]. Be careful, because it&#039;s very easy to play security poorly, and [[Shitcurity|letting the power get to your head is a bad idea]]. &lt;br /&gt;
&lt;br /&gt;
Avoid joke roles such as the [[Clown]] or [[Mime]] at first. Many players find harassing the on board entertainment much more fun than any jokes the clown might otherwise have.&lt;br /&gt;
&lt;br /&gt;
After some time, when you&#039;re confident enough in your combat abilities, you should enable antagonists within your game preferences, so that you can roll for antag when the shift starts. A good half of the game is arguably being an antag and beating everyone up. Don&#039;t be scared that you will be a bad antag. Due to the fact that you can&#039;t predict what or when it will happen everyone was a painfully obvious antag at one point. It&#039;s just how the game works. You should however avoid team antag roles. [[Blood Cult|Blood cult]], blood brothers, [[Revolutionary|revolutions]], [[Clockwork Cult|clock cultists]], [[Nuclear Operative|nuclear operatives]], [[Xenomorph|xenomoprhs]]... The most common and &amp;quot;safe&amp;quot; antag options to dip you toes in are [[Traitor]] and [[Changeling]].&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Slaughter_Demon&amp;diff=36647</id>
		<title>Slaughter Demon</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Slaughter_Demon&amp;diff=36647"/>
		<updated>2023-06-16T06:56:51Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* JAUNT KILLING */ BAD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{JobPageHeader&lt;br /&gt;
|headerbgcolor = black&lt;br /&gt;
|headerfontcolor = white&lt;br /&gt;
|stafftype = INFERNAL&lt;br /&gt;
|imagebgcolor = #901010&lt;br /&gt;
|img_generic = &lt;br /&gt;
|img = Slaughterdemon.png&lt;br /&gt;
|jobtitle = Demon&lt;br /&gt;
|access = WHERE EVER BLOOD IS ON THE FLOOR.&lt;br /&gt;
|additional = WHERE EVER MERE MORTALS MAY COWER!&lt;br /&gt;
|difficulty = EASY!&lt;br /&gt;
|superior = &#039;&#039;&#039;FRAIL, SOULFLINGING DEVILS!!&#039;&#039;&#039;&lt;br /&gt;
|duties = KILL EVERYTHING!&lt;br /&gt;
|guides = THIS &#039;&#039;&#039;IS&#039;&#039;&#039; THE GUIDE, STUPID MEATBAG!&lt;br /&gt;
|quote = The blood begins to bubble...&lt;br /&gt;
}}&lt;br /&gt;
{{Speech&lt;br /&gt;
|name=Slaugh T. Deeman, Infernal Employee of the Month&lt;br /&gt;
|text=&#039;&#039;&#039;YOU WANT TO LEARN ABOUT SLAUGHTER DEMONS? I&#039;LL TELL YOU THINGS THAT WOULD MAKE THE CODEX GIGAS LOOK LIKE THE BIBLE!!&#039;&#039;&#039;&lt;br /&gt;
|image=[[File:Slaughterdemon.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
==DADDY&#039;S HOME==&lt;br /&gt;
I AM HERE! I HAVE TWO OBJECTIVES, SO LISTEN CLOSELY HUMANS!&lt;br /&gt;
* ONE, KILL WHOEVER SUMMONED ME&lt;br /&gt;
* AND TWO, KILL EVERYONE ELSE! RUN, PUNY MORTALS!&lt;br /&gt;
==WAHHH I&#039;M A DEMON AND I&#039;M KILLING ALL THESE HUMANS WITHOUT A SECOND THOUGHT WHAT DO I DO==&lt;br /&gt;
WHAT A TIME TO BE ALIVE! JUST SIT BACK AND ENJOY THE KILLING BECAUSE NOBODY ELSE WILL. HERE&#039;S A COUPLE THINGS TO KEEP IN MIND THOUGH, DEMON TO DEMON.&lt;br /&gt;
===HIERARCHY===&lt;br /&gt;
IT GOES LIKE THIS&lt;br /&gt;
*SATAN&lt;br /&gt;
*DEVILS&lt;br /&gt;
*DEMON KING, [[Megafauna#Bubblegum|BUBBLEGUM]]&lt;br /&gt;
*DEMONS&lt;br /&gt;
*IMPS&lt;br /&gt;
*STUPID GOOBALLS WE CALL HUMANS&lt;br /&gt;
MY FELLOW DEMONS, PLEASE DO NOT KILL DEVILS BECAUSE SATAN WILL SMITE YOU REAL FAST AS SOON AS THE DEVIL SNITCHES ON YOU IN THE UNDERWORLD&lt;br /&gt;
===BLOOD JAUNTING===&lt;br /&gt;
SPREADING BLOOD ALL THROUGH THE HALLWAYS (DRAGGING A CORPSE WHILE SLASHING IT) WILL HELP YOU IN THE LONG RUN, TRUST ME. HAVING THE ABILITY TO TELEPORT ANYWHERE PROVES TO BE PRETTY USEFUL.&lt;br /&gt;
===CORPSE FEEDING===&lt;br /&gt;
NO SHAME ON TAKING A BITE ONCE YOU DRAG THEM TO HELL, MY FRIEND. IT&#039;S YOUR ONLY WAY OF HEALING, SHORT OF A HUMAN PATCHING YOU UP. NOT ONLY IS A HUMAN GIVING YOU MEDICAL HELP A DISGRACE TO ALL DEMONKIND, BUT IF YOU EVEN ADMIT THAT YOU&#039;RE CLOSE TO DYING THEY&#039;LL PROBABLY JUST KILL YOU ANYWAY, YOU STUPID IDIOT DEMON.&lt;br /&gt;
===JAUNT KILLING===&lt;br /&gt;
WE ARE SLOW, OKAY? IT TURNS OUT HAVING A SUIT OF INFERNAL ARMOR GLUED TO US IS PRETTY HEAVY. LUCKILY, YOU CAN GET SOME PRETTY EASY KILLS JUMPING OUT OF BLOOD AS THE BLOOD WILL GIVE YOU A SPEED BOOST. FANTASTIC COMBO, JUMP OUT OF BLOOD, ATTACK, TRY TO GET IN A FEW, AND THEN RETREAT TO THE BLOOD FOR ANOTHER SPEED ATTACK. &#039;&#039;&#039;REALLY THE ONLY WAY YOU&#039;RE REALISTICALLY GOING TO STOP A SHOTGUN, SO PRACTICE MAKES PERFECT&#039;&#039;&#039;&lt;br /&gt;
==WAHHH DEMONS ARE KILLING MY FRIENDS AND I&#039;M ONLY A STUPID HUMAN WHAT DO I DO==&lt;br /&gt;
GEE, I DON&#039;T KNOW HUMAN, MAYBE SPACING YOURSELF WOULD WORK? OR MAYBE PRE-EMPTIVELY SPREADING YOUR BLOOD ALL DOWN THE HALLWAYS SO I DON&#039;T HAVE TO FOR YOU WOULD BE GREAT AT STOPPING DEMONS, YES!&lt;br /&gt;
===DEMONS LOVE BLOOD===&lt;br /&gt;
I NEED BLOOD TO JAUNT AROUND THE STATION AND KEEP MY KILL TO NOT KILLING RATIO EXTREMELY HIGH. DON&#039;T REMOVE MY BLOOD, I MEAN IT. THAT WOULD INCUR MY IRE AND THEN I&#039;D HAVE TO KILL SOMEONE ELSE TO GET MORE BLOOD.&lt;br /&gt;
===DEMONS LOVE EATING CORPSES===&lt;br /&gt;
WHOEVER THAT RIVER STYX GUY IS, HE&#039;S A REAL DAMN CHEAT BECAUSE I CAN TAKE YOU RIGHT TO HELL WITH NO FEE. DRAGGING A DEAD HUMAN (THE LIVE ONES DON&#039;T USUALLY WANT TO GO!) RIGHT TO THE UNDERWORLD IS MY BREAD AND BUTTER! AND I LITERALLY MEAN THAT BECAUSE I THEN FEAST ON THEIR CORPSE AND HEAL RIGHT BACK UP!&lt;br /&gt;
===DEMONS HATE SHOTGUNS===&lt;br /&gt;
IF SILVER BULLETS KILLED WEREWOLVES (THEY DON&#039;T, STOP TRYING) THEN SHOTGUNS WOULD BE THE SILVER BULLET EQUIVALENT OF SLAUGHTER DEMONS. DEMONS, STAY AWAY FROM THEM, YOU WILL GET BLASTED BACK TO TARTARUS.&lt;br /&gt;
===DEMONS HATE LAUGHTER DEMONS===&lt;br /&gt;
I MEAN ATTACKING THEM WOULD BE SOME PRETTY HIGH LEVELS OF DEMONIC HERESY BUT MY GOD PLEASE INSULT THEM FOR THEIR PRIMAL STUPIDITY. EVEN YOU, HUMANS! THEY DON&#039;T EVEN KILL HUMANS, JUST TAKE THEM TO THEIR HUGBOX DIMENSION! I DON&#039;T EVEN KNOW WHAT THAT IS AND IT&#039;S REALLY UNSETTLING AND &#039;&#039;&#039;THIS CONVERSATION IS OVER!!&#039;&#039;&#039;&lt;br /&gt;
==RELEVANT CODE CHANGES==&lt;br /&gt;
I&#039;LL GET BACK TO YOU ON THIS ONE, VERY BUSY WITH KILLING PEOPLE AT THE MOMENT.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Jobs}}&lt;br /&gt;
[[Category: Jobs]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Downloading_the_source_code&amp;diff=36613</id>
		<title>Downloading the source code</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Downloading_the_source_code&amp;diff=36613"/>
		<updated>2023-06-07T23:26:49Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* Tips for Using the Server for Sandboxing */ Add more tips&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Download and License ==&lt;br /&gt;
This page contains the information and steps needed to download the latest version of the code, compile it and host your own server. The BeeStation source code is under [https://www.gnu.org/licenses/agpl-3.0.html GNU AGPL v3 license] and the assets are [https://freedomdefined.org/Licenses/CC-BY-SA CC-BY-SA]. We use GitHub to host our project. A zip download is available here: [https://github.com/BeeStation/BeeStation-Hornet &#039;&#039;&#039;DOWNLOAD&#039;&#039;&#039;] (Press Code -&amp;gt; &#039;&#039;&#039;Download&#039;&#039;&#039; ZIP) If you don&#039;t want to download 30MB of data every time an update is made, you can [[Guide to git|follow this guide]] to set up and use Git.&lt;br /&gt;
== Hosting Your Server ==&lt;br /&gt;
To get a simple server running first&lt;br /&gt;
* Download the source code as explained above.&lt;br /&gt;
* Run &#039;&#039;&#039;BUILD.bat&#039;&#039;&#039; and wait (1-3 minutes) until it&#039;s complies. You should see file with an orange icon called &amp;quot;beestation.dmb.&amp;quot;&lt;br /&gt;
* Open Dream Daemon located in your BYOND install directory.&lt;br /&gt;
* Select the &amp;quot;...&amp;quot; in the lower right corner and select the file &amp;quot;beestation.dmb&amp;quot;.&lt;br /&gt;
*Set the Security to &amp;quot;Trusted&amp;quot;, to avoid excessive prompts from Dream Daemon. Only do this if you can verify that the source you have is official and safe - it is unlikely to be untrustworthy, but keep it in mind when working with any projects.&lt;br /&gt;
* Click the &amp;quot;GO&amp;quot; button and wait until it changes to a red &amp;quot;STOP&amp;quot; button. Starting the server usually takes between 1 and 5 minutes. It is fully started once you can normally interact with Dream Daemon and a byond://xxx.xxx.xxx.xxx:xxxxx link is present at the bottom.&lt;br /&gt;
* Click the yellow arrow button join&lt;br /&gt;
* Left click the (byond://xxx.xxx.xxx.xxx:xxxxx) link to copy it to clipboard and then paste it to your friends so they can join.&lt;br /&gt;
== Setting Up the Database ==&lt;br /&gt;
See [[working with the database]] guide. This is not required if you are just planing locally sandboxing for the purposes of testing.&lt;br /&gt;
== Tips for Using the Server for Sandboxing ==&lt;br /&gt;
* There is a secret menu in the adminbus panel that lets you fully power all areas and the SMES.&lt;br /&gt;
* If your hotkeys don’t work, try going into preferences and resetting to default.&lt;br /&gt;
&lt;br /&gt;
* If you want to spawn something, use the Spawn command in the textbox. Just type the item name or what you think the name is and a menu will pop up with all the things in the game with that word in their name. For example: Spawn “spare” - will show a menu from where you can spawn the spare Capitan’s ID. Another use is Spawn “trit” - which will spawn a full Tritium canister if you want to test maxcaps.&lt;br /&gt;
&lt;br /&gt;
* Right click on a tile and use “Jump to turf” to teleport.&lt;br /&gt;
* If all the extra tabs and options are distracting, you can use the deadmin command to become a normal player. You can readmin at any time.&lt;br /&gt;
*Hit Debug -&amp;gt; Debug-verbs Enable to get more verbs on the player&#039;s right click menu.&lt;br /&gt;
*With debug verbs on, you can use the Select equipment verb on yourself to equip the Debug outfit, which has loads of useful tools and items.&lt;br /&gt;
== FAQ and Troubleshooting ==&lt;br /&gt;
==== &amp;quot;I did not change anything, but the code does not work anymore!&amp;quot; ====&lt;br /&gt;
This is likely due to corrupted files.&lt;br /&gt;
To fix this, you need to:&lt;br /&gt;
*Re-download everything&lt;br /&gt;
*Copy over your config and data folder&lt;br /&gt;
*Clean compile&lt;br /&gt;
If you&#039;re using git reset hard against the BeeStation upstream master branch and then recompile.&lt;br /&gt;
==== Do I need to for a BYOND membership to make my server visible? ====&lt;br /&gt;
You &#039;&#039;&#039;DO NOT NEED&#039;&#039;&#039; to pay for membership to make your server visible on byond.com! To make your server show up [[beerepo:blob/master/config/config.txt#L26|change this hub config option]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
[[Category:Guides]] [[Category:Game Resources]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Downloading_the_source_code&amp;diff=36612</id>
		<title>Downloading the source code</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Downloading_the_source_code&amp;diff=36612"/>
		<updated>2023-06-07T23:24:50Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Add note about Trusted&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Download and License ==&lt;br /&gt;
This page contains the information and steps needed to download the latest version of the code, compile it and host your own server. The BeeStation source code is under [https://www.gnu.org/licenses/agpl-3.0.html GNU AGPL v3 license] and the assets are [https://freedomdefined.org/Licenses/CC-BY-SA CC-BY-SA]. We use GitHub to host our project. A zip download is available here: [https://github.com/BeeStation/BeeStation-Hornet &#039;&#039;&#039;DOWNLOAD&#039;&#039;&#039;] (Press Code -&amp;gt; &#039;&#039;&#039;Download&#039;&#039;&#039; ZIP) If you don&#039;t want to download 30MB of data every time an update is made, you can [[Guide to git|follow this guide]] to set up and use Git.&lt;br /&gt;
== Hosting Your Server ==&lt;br /&gt;
To get a simple server running first&lt;br /&gt;
* Download the source code as explained above.&lt;br /&gt;
* Run &#039;&#039;&#039;BUILD.bat&#039;&#039;&#039; and wait (1-3 minutes) until it&#039;s complies. You should see file with an orange icon called &amp;quot;beestation.dmb.&amp;quot;&lt;br /&gt;
* Open Dream Daemon located in your BYOND install directory.&lt;br /&gt;
* Select the &amp;quot;...&amp;quot; in the lower right corner and select the file &amp;quot;beestation.dmb&amp;quot;.&lt;br /&gt;
*Set the Security to &amp;quot;Trusted&amp;quot;, to avoid excessive prompts from Dream Daemon. Only do this if you can verify that the source you have is official and safe - it is unlikely to be untrustworthy, but keep it in mind when working with any projects.&lt;br /&gt;
* Click the &amp;quot;GO&amp;quot; button and wait until it changes to a red &amp;quot;STOP&amp;quot; button. Starting the server usually takes between 1 and 5 minutes. It is fully started once you can normally interact with Dream Daemon and a byond://xxx.xxx.xxx.xxx:xxxxx link is present at the bottom.&lt;br /&gt;
* Click the yellow arrow button join&lt;br /&gt;
* Left click the (byond://xxx.xxx.xxx.xxx:xxxxx) link to copy it to clipboard and then paste it to your friends so they can join.&lt;br /&gt;
== Setting Up the Database ==&lt;br /&gt;
See [[working with the database]] guide. This is not required if you are just planing locally sandboxing for the purposes of testing.&lt;br /&gt;
== Tips for Using the Server for Sandboxing ==&lt;br /&gt;
* There is a secret menu in the adminbus panel that lets you fully power all areas and the SMES.&lt;br /&gt;
* If your hotkeys don’t work, try going into preferences and resetting to default.&lt;br /&gt;
&lt;br /&gt;
* If you want to spawn something, use the Spawn command in the textbox. Just type the item name or what you think the name is and a menu will pop up with all the things in the game with that word in their name. For example: Spawn “spare” - will show a menu from where you can spawn the spare Capitan’s ID. Another use is Spawn “trit” - which will spawn a full Tritium canister if you want to test maxcaps.&lt;br /&gt;
&lt;br /&gt;
* Right click on a tile and use “Jump to turf” to teleport.&lt;br /&gt;
* If all the extra tabs and options are distracting, you can use the deadmin command to become a normal player. You can readmin at any time.&lt;br /&gt;
== FAQ and Troubleshooting ==&lt;br /&gt;
==== &amp;quot;I did not change anything, but the code does not work anymore!&amp;quot; ====&lt;br /&gt;
This is likely due to corrupted files.&lt;br /&gt;
To fix this, you need to:&lt;br /&gt;
*Re-download everything&lt;br /&gt;
*Copy over your config and data folder&lt;br /&gt;
*Clean compile&lt;br /&gt;
If you&#039;re using git reset hard against the BeeStation upstream master branch and then recompile.&lt;br /&gt;
==== Do I need to for a BYOND membership to make my server visible? ====&lt;br /&gt;
You &#039;&#039;&#039;DO NOT NEED&#039;&#039;&#039; to pay for membership to make your server visible on byond.com! To make your server show up [[beerepo:blob/master/config/config.txt#L26|change this hub config option]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
[[Category:Guides]] [[Category:Game Resources]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36466</id>
		<title>Guide to git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36466"/>
		<updated>2023-04-16T06:23:08Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Fix GitKraken grammar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Git Command Line =&lt;br /&gt;
Many are drawn to GUI versions of Git, such as GitHub Desktop, GitKraken, and VSCode’s Git integration. However, I believe this is more of a hindrance than a help. If you’re just making mapping or sprite PRs, sure, maybe you can get along just fine with GitHub Desktop. However, these tools lack the expansive features of the command line and are harder to get help with. Command line is far more google-able if you have problems and I highly recommend it. Far more people will be able to assist you if you are using command line than an GUI tool.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-setup&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== The Setup ==&lt;br /&gt;
Download and install [[git:|git-scm]]. You should probably set it up to use the shell of your choice (I use command line on Windows Terminal), or if you prefer Git Bash, use that. Do note that installing it to your system PATH is very useful if you want to use VSCode’s builtin terminal.&lt;br /&gt;
&lt;br /&gt;
Also be sure to set your name/email in your git client so your commits show properly and are attributed properly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;amp;quot;Name Here&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;git config --global user.email &amp;quot;email here&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Often times the default can expose personal information. So be &#039;&#039;sure&#039;&#039; to set this.&lt;br /&gt;
&lt;br /&gt;
Name can just be your GitHub username or something else, doesn’t matter.&lt;br /&gt;
&lt;br /&gt;
As long as the email you put is added to your GitHub account it will work fine and show your icon on commits. GitHub will also provide you with a private email, if you don&#039;t have any type of &amp;quot;business&amp;quot; email, it is recommended to use this.&lt;br /&gt;
&lt;br /&gt;
For more details on commit email privacy, read [https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address GitHub&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-terms-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Terms Cheat-Sheet ==&lt;br /&gt;
&#039;&#039;&#039;HEAD:&#039;&#039;&#039; Term for the current location on the “commit tree”, basically your current location in history.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Detached HEAD:&#039;&#039;&#039; A state the client can be in, where the history is at a specific point in time, but not attached to a branch. Committing changes is not possible unless the HEAD is re-attached by checking out a branch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Staging:&#039;&#039;&#039; an in-between state of your local filesystem and a commit. This is so you can have some changes locally but not commit all of them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Commit:&#039;&#039;&#039; a collection of changes, applied as a “patch” onto the previous (parent) commit. Think of it as a chain link that contains a snapshot of the repository at that time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Branch:&#039;&#039;&#039; A collection of commits in one big chain, that can split off at any time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Merge:&#039;&#039;&#039; Joining two branches&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remote:&#039;&#039;&#039; A secondary git repository to sync changes with, usually GitHub but can be any server that supports the protocol&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Upstream:&#039;&#039;&#039; The remote that you are pulling from/pushing to, in that case your fork OR the main beestation repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-commands-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Commands Cheat-Sheet ==&lt;br /&gt;
&amp;lt;code&amp;gt;git clone (github link)&amp;lt;/code&amp;gt; downloads the linked repository into a folder at the current location.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull remotename branchname&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; and then &amp;lt;code&amp;gt;git merge remotename/branchname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; gets all the new commits from remote&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merging-strategies&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Merging Strategies ===&lt;br /&gt;
&amp;lt;code&amp;gt;git merge branchname&amp;lt;/code&amp;gt; Attempts to merge all new commits from branchname into the current HEAD, through a few strategies that vary:&lt;br /&gt;
* Fast-forward - Simple, used when the new changes are directly on top of, as in, have a continous history rooting from the current HEAD. For example, if someone pushed one commit to origin/master, and your local master didn’t have this one commit, it can simply be “fast forwarded” and add the new commit on the end&lt;br /&gt;
* Recursive: the normal strategy, it tries to put both the local changes AND the remote changes into one branch by adding the commits in what is called a “merge commit”&lt;br /&gt;
* Rebase: this is its own command, &amp;lt;code&amp;gt;git rebase branchname&amp;lt;/code&amp;gt; This attempts to take all of your LOCAL changes, and then append them to the end of the REMOTE branch, rather than putting the remote branch into your current one. This is personally my favorite for PRs because it makes a clean commit history, but it also “rewrites” all your commits into new ones, so it’s not suitable for branches used by multiple people because it doesn’t maintain the commit tree&lt;br /&gt;
&amp;lt;code&amp;gt;git reset commitsha (or branchname)&amp;lt;/code&amp;gt; - Sets the current HEAD to the commit listed OR the branchname listed. If you specify –hard, it will update the local filesystem to match this, if you don’t specify or put –soft, it only updates this in git, keeping your file changes intact&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout commitsha (or branchname)&amp;lt;/code&amp;gt; - For commits, this will “rewind” you to that commit and also “detaches HEAD”, which basically means you are no longer on a branch and can’t commit stuff. A temporary rewind, essentially. When you check out a branch, it’s basically just moving you to that branch. Do this for new PRs etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch (branchname)&amp;lt;/code&amp;gt; creates a new branch with the current commit history of the branch you are on&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch -d (branchname)&amp;lt;/code&amp;gt; deletes branch with said name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt; adds the file to “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git restore --staged (filepath)&amp;lt;/code&amp;gt; removes the file from “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; View what is staged, what is not, also view what branch/commit you are on. VERY useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt; Add ALL local filesystem changes to staging&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- .&amp;lt;/code&amp;gt; Undo all local changes, get rid of them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD .&amp;lt;/code&amp;gt; The same as above but stricter, if it doesn’t work&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (or --) filepath&amp;lt;/code&amp;gt; resets that file to the last commit on your filesystem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Commit message&amp;amp;quot;&amp;lt;/code&amp;gt; creates a commit with the current staged changes and adds it to the branch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push remotename branchname&amp;lt;/code&amp;gt; pushes the current local branch to remotename/branchname&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add (remotename) (github link)&amp;lt;/code&amp;gt; creates a remotename with a github repo so you can push/pull from it&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u remotename branchname&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;git pull --set-upstream remotename branchname&amp;lt;/code&amp;gt; sets the route from your CURRENT local branch to a remote branch. This makes it so you can just type &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; without having to specify the remote or branch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git reset HEAD~(number)&amp;lt;/code&amp;gt; resets current HEAD X commits backwards in the commit history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD~(number)&amp;lt;/code&amp;gt; temporarily rewinds and detaches HEAD X commits back in history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; show the commit history (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git diff HEAD&amp;lt;/code&amp;gt; show all the changes you have made locally that are not committed (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merge-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Merge Conflicts ==&lt;br /&gt;
Merge conflicts can look intimidating, but they aren’t in reality (unless you don’t know how to code).&lt;br /&gt;
&lt;br /&gt;
When two commits change the same part of the same file, git tries to merge them, but can’t, since it would probably break the code if it guessed.&lt;br /&gt;
&lt;br /&gt;
Instead, it lets you do it yourself.&lt;br /&gt;
&lt;br /&gt;
It writes into the file what looks like this&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
(version before merge)&lt;br /&gt;
=================&lt;br /&gt;
(new version)&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&amp;lt;/pre&amp;gt;&lt;br /&gt;
It usually does that multiple times per file. Basically compare the two, remove the markers and write the file back how it should be if both were merged into one.&lt;br /&gt;
&lt;br /&gt;
Here is an example.&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
    if(variable?.test())&lt;br /&gt;
=================&lt;br /&gt;
    if(the_variable.test()&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
This would most likely be merged into this:&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
    if(the_variable?.test()&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
The inferred history here is the variable was named &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt;, and the current branch changed it to &amp;lt;code&amp;gt;the_variable&amp;lt;/code&amp;gt;. However, another branch added the &amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; operator to the proccall. When this change was merged in, Git noticed an unexpected change to the variable name and placed a merge conflict. Making sense now? The way to merge it is applying both changes as intended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mapping-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mapping Conflicts ===&lt;br /&gt;
DMM files are impossible to merge via text, so we have tooling in the repository to automatically merge them.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/mapmerge2/Resolve Map Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there are any conflicting tiles, you will be prompted to fix it in your map editor, then you can continue by committing the changes.&lt;br /&gt;
&lt;br /&gt;
For more info, see [[Map Merger]].&lt;br /&gt;
=== Icon Conflicts ===&lt;br /&gt;
DMI files contain multiple images, making merge conflicts &#039;&#039;always&#039;&#039; happen if the file is updated by two branches. This means solving them is relatively trivial but can be time consuming. So there’s a tool for it.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/dmi/Resolve Icon Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;automatic-merge-conflict-resolution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Automatic Merge Conflict Resolution ===&lt;br /&gt;
Also, perk of using command line, if you want git to &#039;&#039;&#039;AUTO MERGE DMI and DMM&#039;&#039;&#039;, as well as auto-cleanup your maps on commit, just run &amp;lt;code&amp;gt;tools/hooks/Install&amp;lt;/code&amp;gt;. No need to run them manually anymore, they will run automatically if you merge or commit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-a-basic-pr-with-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Making a basic PR with command line ==&lt;br /&gt;
First, you’ll need to clone the repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone &amp;lt;nowiki&amp;gt;https://github.com/BeeStation/BeeStation-Hornet/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, change directories into the repository with &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You will now need to create a branch for your changes, using the master branch for PRs is bad practice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the branch is created, but you need to “check it out”, or switch to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make any changes in VSCode. When you’re done, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice what files now have “unstaged changes”. Any files you do NOT want changes in, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (filepath)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will delete unwanted changes on your local filesystem.&lt;br /&gt;
&lt;br /&gt;
Any files you DO want to PR changes to, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt;, or if you want to add all files, use &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; as the filepath.&lt;br /&gt;
&lt;br /&gt;
Now run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;, and confirm all the changes you want are staged.&lt;br /&gt;
&lt;br /&gt;
Now you’re ready to commit. Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Put a summary of your changes here&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a commit and add it to the current branch. Run &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; to see the commit history. You can exit with &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; and navigate with arrows.&lt;br /&gt;
&lt;br /&gt;
That worked, so now you just need to push the changes to your fork of the repository. So go on GitHub and press the fork button on the top right of BeeStation-Hornet, and you’ll be taken to your new fork repository. You need to add this as a remote on your local client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add fork &amp;lt;nowiki&amp;gt;https://github.com/(your&amp;lt;/nowiki&amp;gt; GitHub username)/BeeStation-Hornet/&amp;lt;/code&amp;gt; (change this to your fork’s link)&lt;br /&gt;
&lt;br /&gt;
Then, you can push to a branch on your fork.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u fork my-pr-that-does-something&amp;lt;/code&amp;gt; - The &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; here tells Git to save that this is the path to remote. This means that when you run &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; without passing a remote or branchname, it will know where to push the next time. The same applies to &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Done! Now go to your fork on GitHub and refresh, you’ll see something like “changes have recently been pushed to branch my-pr-that-does-something” with a big “Open pull request” button. Press that and make sure it’s going to the main repository. You can also do this manually from the Pull Requests tab on your fork.&lt;br /&gt;
=GitKraken=&lt;br /&gt;
==How to update your branch from master==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!images&lt;br /&gt;
! width=&amp;quot;400px&amp;quot; | instruction&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Gitkrakenpage1.png|frameless|500x500px|center]]&lt;br /&gt;
|&lt;br /&gt;
* Go to your master branch (on GitHub), and sync it to up-to-date&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Gitkraken-updateyourmaster.png|center|frameless|400x400px]]&lt;br /&gt;
|&lt;br /&gt;
* Pull your master (local) from your master (remote GitHub)&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Gitkraken-dragyourmaster.png|center|frameless|400x400px]]&lt;br /&gt;
|&lt;br /&gt;
* Drag your master onto a branch where you need to update&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Gitkrakenmerge2.png|center|frameless|444x444px]]&lt;br /&gt;
|&lt;br /&gt;
* if it’s not compatible, a merge-conflict will occur. Click the file in the issue. It’s not &amp;lt;code&amp;gt;&amp;quot;Mark resolved&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Gitkrakenconflictslist.png|center|frameless|500x500px]]&lt;br /&gt;
|&lt;br /&gt;
* (1): click these lines, then it will be the bottom window (2). clicking a line will transfer only one line. clicking a check-box will transfer the whole lines. (the example clicked different lines to let you recognise it’s possible to put different lines, but you won’t really do that in this way. There’s no reason to transfer lines like this)&lt;br /&gt;
&amp;lt;blockquote&amp;gt;NOTE:&lt;br /&gt;
My suggestion for handling this is to transfer all lines from both of these, and compare how the new logic is different.&lt;br /&gt;
&lt;br /&gt;
in this image, the conflict is only 3 lines, so just transferring a single line would be enough, but when it’s massive, comparing all lines is important.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
* (2): the result of your merge-confliction resolve.&lt;br /&gt;
* (3): The list of where merge-confliction occurs.&lt;br /&gt;
* (4): click this once it’s done&lt;br /&gt;
click (4) once the merge resolve is done.&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Gitkrakenmerge.png|center|frameless|429x429px]]&lt;br /&gt;
|Now commit your changes.&lt;br /&gt;
|}&lt;br /&gt;
Q. How can I resolve the map conflicts?&lt;br /&gt;
&lt;br /&gt;
A. See [[Map Merger]]&lt;br /&gt;
{{Contribution guides}}&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36454</id>
		<title>Guide to git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36454"/>
		<updated>2023-04-16T03:37:40Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* The Setup */ Remove protected email notice&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;git-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Git Command Line =&lt;br /&gt;
Many are drawn to GUI versions of Git, such as GitHub Desktop, GitKraken, and VSCode’s Git integration. However, I believe this is more of a hindrance than a help. If you’re just making mapping or sprite PRs, sure, maybe you can get along just fine with GitHub Desktop. However, these tools lack the expansive features of the command line and are harder to get help with. Command line is far more google-able if you have problems and I highly recommend it. Far more people will be able to assist you if you are using command line than an GUI tool.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-setup&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== The Setup ==&lt;br /&gt;
Download and install [[git:|git-scm]]. You should probably set it up to use the shell of your choice (I use command line on Windows Terminal), or if you prefer Git Bash, use that. Do note that installing it to your system PATH is very useful if you want to use VSCode’s builtin terminal.&lt;br /&gt;
&lt;br /&gt;
Also be sure to set your name/email in your git client so your commits show properly and are attributed properly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;amp;quot;Name Here&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;git config --global user.email &amp;quot;email here&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Often times the default can expose personal information. So be &#039;&#039;sure&#039;&#039; to set this.&lt;br /&gt;
&lt;br /&gt;
Name can just be your GitHub username or something else, doesn’t matter.&lt;br /&gt;
&lt;br /&gt;
As long as the email you put is added to your GitHub account it will work fine and show your icon on commits. GitHub will also provide you with a private email, if you don&#039;t have any type of &amp;quot;business&amp;quot; email, it is recommended to use this.&lt;br /&gt;
&lt;br /&gt;
For more details on commit email privacy, read [https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address GitHub&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-terms-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Terms Cheat-Sheet ==&lt;br /&gt;
&#039;&#039;&#039;HEAD:&#039;&#039;&#039; Term for the current location on the “commit tree”, basically your current location in history.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Detached HEAD:&#039;&#039;&#039; A state the client can be in, where the history is at a specific point in time, but not attached to a branch. Committing changes is not possible unless the HEAD is re-attached by checking out a branch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Staging:&#039;&#039;&#039; an in-between state of your local filesystem and a commit. This is so you can have some changes locally but not commit all of them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Commit:&#039;&#039;&#039; a collection of changes, applied as a “patch” onto the previous (parent) commit. Think of it as a chain link that contains a snapshot of the repository at that time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Branch:&#039;&#039;&#039; A collection of commits in one big chain, that can split off at any time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Merge:&#039;&#039;&#039; Joining two branches&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remote:&#039;&#039;&#039; A secondary git repository to sync changes with, usually GitHub but can be any server that supports the protocol&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Upstream:&#039;&#039;&#039; The remote that you are pulling from/pushing to, in that case your fork OR the main beestation repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-commands-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Commands Cheat-Sheet ==&lt;br /&gt;
&amp;lt;code&amp;gt;git clone (github link)&amp;lt;/code&amp;gt; downloads the linked repository into a folder at the current location.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull remotename branchname&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; and then &amp;lt;code&amp;gt;git merge remotename/branchname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; gets all the new commits from remote&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merging-strategies&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Merging Strategies ===&lt;br /&gt;
&amp;lt;code&amp;gt;git merge branchname&amp;lt;/code&amp;gt; Attempts to merge all new commits from branchname into the current HEAD, through a few strategies that vary:&lt;br /&gt;
* Fast-forward - Simple, used when the new changes are directly on top of, as in, have a continous history rooting from the current HEAD. For example, if someone pushed one commit to origin/master, and your local master didn’t have this one commit, it can simply be “fast forwarded” and add the new commit on the end&lt;br /&gt;
* Recursive: the normal strategy, it tries to put both the local changes AND the remote changes into one branch by adding the commits in what is called a “merge commit”&lt;br /&gt;
* Rebase: this is its own command, &amp;lt;code&amp;gt;git rebase branchname&amp;lt;/code&amp;gt; This attempts to take all of your LOCAL changes, and then append them to the end of the REMOTE branch, rather than putting the remote branch into your current one. This is personally my favorite for PRs because it makes a clean commit history, but it also “rewrites” all your commits into new ones, so it’s not suitable for branches used by multiple people because it doesn’t maintain the commit tree&lt;br /&gt;
&amp;lt;code&amp;gt;git reset commitsha (or branchname)&amp;lt;/code&amp;gt; - Sets the current HEAD to the commit listed OR the branchname listed. If you specify –hard, it will update the local filesystem to match this, if you don’t specify or put –soft, it only updates this in git, keeping your file changes intact&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout commitsha (or branchname)&amp;lt;/code&amp;gt; - For commits, this will “rewind” you to that commit and also “detaches HEAD”, which basically means you are no longer on a branch and can’t commit stuff. A temporary rewind, essentially. When you check out a branch, it’s basically just moving you to that branch. Do this for new PRs etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch (branchname)&amp;lt;/code&amp;gt; creates a new branch with the current commit history of the branch you are on&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch -d (branchname)&amp;lt;/code&amp;gt; deletes branch with said name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt; adds the file to “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git restore --staged (filepath)&amp;lt;/code&amp;gt; removes the file from “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; View what is staged, what is not, also view what branch/commit you are on. VERY useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt; Add ALL local filesystem changes to staging&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- .&amp;lt;/code&amp;gt; Undo all local changes, get rid of them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD .&amp;lt;/code&amp;gt; The same as above but stricter, if it doesn’t work&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (or --) filepath&amp;lt;/code&amp;gt; resets that file to the last commit on your filesystem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Commit message&amp;amp;quot;&amp;lt;/code&amp;gt; creates a commit with the current staged changes and adds it to the branch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push remotename branchname&amp;lt;/code&amp;gt; pushes the current local branch to remotename/branchname&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add (remotename) (github link)&amp;lt;/code&amp;gt; creates a remotename with a github repo so you can push/pull from it&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u remotename branchname&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;git pull --set-upstream remotename branchname&amp;lt;/code&amp;gt; sets the route from your CURRENT local branch to a remote branch. This makes it so you can just type &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; without having to specify the remote or branch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git reset HEAD~(number)&amp;lt;/code&amp;gt; resets current HEAD X commits backwards in the commit history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD~(number)&amp;lt;/code&amp;gt; temporarily rewinds and detaches HEAD X commits back in history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; show the commit history (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git diff HEAD&amp;lt;/code&amp;gt; show all the changes you have made locally that are not committed (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merge-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Merge Conflicts ==&lt;br /&gt;
Merge conflicts can look intimidating, but they aren’t in reality (unless you don’t know how to code).&lt;br /&gt;
&lt;br /&gt;
When two commits change the same part of the same file, git tries to merge them, but can’t, since it would probably break the code if it guessed.&lt;br /&gt;
&lt;br /&gt;
Instead, it lets you do it yourself.&lt;br /&gt;
&lt;br /&gt;
It writes into the file what looks like this&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
(version before merge)&lt;br /&gt;
=================&lt;br /&gt;
(new version)&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&amp;lt;/pre&amp;gt;&lt;br /&gt;
It usually does that multiple times per file. Basically compare the two, remove the markers and write the file back how it should be if both were merged into one.&lt;br /&gt;
&lt;br /&gt;
Here is an example.&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
    if(variable?.test())&lt;br /&gt;
=================&lt;br /&gt;
    if(the_variable.test()&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
This would most likely be merged into this:&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
    if(the_variable?.test()&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
The inferred history here is the variable was named &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt;, and the current branch changed it to &amp;lt;code&amp;gt;the_variable&amp;lt;/code&amp;gt;. However, another branch added the &amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; operator to the proccall. When this change was merged in, Git noticed an unexpected change to the variable name and placed a merge conflict. Making sense now? The way to merge it is applying both changes as intended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mapping-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mapping Conflicts ===&lt;br /&gt;
DMM files are impossible to merge via text, so we have tooling in the repository to automatically merge them.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/mapmerge2/Resolve Map Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there are any conflicting tiles, you will be prompted to fix it in your map editor, then you can continue by committing the changes.&lt;br /&gt;
&lt;br /&gt;
For more info, see [[Map Merger]].&lt;br /&gt;
=== Icon Conflicts ===&lt;br /&gt;
DMI files contain multiple images, making merge conflicts &#039;&#039;always&#039;&#039; happen if the file is updated by two branches. This means solving them is relatively trivial but can be time consuming. So there’s a tool for it.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/dmi/Resolve Icon Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;automatic-merge-conflict-resolution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Automatic Merge Conflict Resolution ===&lt;br /&gt;
Also, perk of using command line, if you want git to &#039;&#039;&#039;AUTO MERGE DMI and DMM&#039;&#039;&#039;, as well as auto-cleanup your maps on commit, just run &amp;lt;code&amp;gt;tools/hooks/Install&amp;lt;/code&amp;gt;. No need to run them manually anymore, they will run automatically if you merge or commit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-a-basic-pr-with-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Making a basic PR with command line ==&lt;br /&gt;
First, you’ll need to clone the repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone &amp;lt;nowiki&amp;gt;https://github.com/BeeStation/BeeStation-Hornet/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, change directories into the repository with &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You will now need to create a branch for your changes, using the master branch for PRs is bad practice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the branch is created, but you need to “check it out”, or switch to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make any changes in VSCode. When you’re done, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice what files now have “unstaged changes”. Any files you do NOT want changes in, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (filepath)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will delete unwanted changes on your local filesystem.&lt;br /&gt;
&lt;br /&gt;
Any files you DO want to PR changes to, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt;, or if you want to add all files, use &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; as the filepath.&lt;br /&gt;
&lt;br /&gt;
Now run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;, and confirm all the changes you want are staged.&lt;br /&gt;
&lt;br /&gt;
Now you’re ready to commit. Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Put a summary of your changes here&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a commit and add it to the current branch. Run &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; to see the commit history. You can exit with &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; and navigate with arrows.&lt;br /&gt;
&lt;br /&gt;
That worked, so now you just need to push the changes to your fork of the repository. So go on GitHub and press the fork button on the top right of BeeStation-Hornet, and you’ll be taken to your new fork repository. You need to add this as a remote on your local client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add fork &amp;lt;nowiki&amp;gt;https://github.com/(your&amp;lt;/nowiki&amp;gt; GitHub username)/BeeStation-Hornet/&amp;lt;/code&amp;gt; (change this to your fork’s link)&lt;br /&gt;
&lt;br /&gt;
Then, you can push to a branch on your fork.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u fork my-pr-that-does-something&amp;lt;/code&amp;gt; - The &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; here tells Git to save that this is the path to remote. This means that when you run &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; without passing a remote or branchname, it will know where to push the next time. The same applies to &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Done! Now go to your fork on GitHub and refresh, you’ll see something like “changes have recently been pushed to branch my-pr-that-does-something” with a big “Open pull request” button. Press that and make sure it’s going to the main repository. You can also do this manually from the Pull Requests tab on your fork.&lt;br /&gt;
{{Contribution guides}}&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36432</id>
		<title>Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36432"/>
		<updated>2023-03-30T10:21:19Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* Mapping */ Rewrite guide to mapping desc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an index-page for finding guides related to aspects of development and contributing to the game. Guides will be linked with a short description of what they are about.&lt;br /&gt;
&lt;br /&gt;
Feel free to add to this page if you have any resources that may help aspiring developers. It is recommended you keep guides within the bounds of this wiki.&lt;br /&gt;
&lt;br /&gt;
For design direction and coding guidelines, see https://github.com/BeeStation/BeeStation-Hornet/wiki&lt;br /&gt;
== Resources ==&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
=== Design ===&lt;br /&gt;
* Design Goals - https://github.com/BeeStation/BeeStation-Hornet/wiki/Design-Goals - The current goals and direction of the game.&lt;br /&gt;
=== Coding ===&lt;br /&gt;
* Code Standards - https://github.com/BeeStation/BeeStation-Hornet/wiki/Code-Standards - The essential guidelines that maintainers look for in a PR.&lt;br /&gt;
&lt;br /&gt;
* Guide to coding - https://hackmd.io/@BdkEQ8tISgW8Pbn2OquQxQ/B1SeqStVq - Making a new item in the game from scratch, from environment setup to the Pull Request.&lt;br /&gt;
&lt;br /&gt;
* Guide to hard-dels - https://hackmd.io/@PowerfulBacon/guide_to_harddels - Explains how to avoid hard deletes, a quirk of the game&#039;s garbage collection.&lt;br /&gt;
* [[Understanding SS13 code]] - An older guide, explaining SS13 and DM to new coders&lt;br /&gt;
* [[SS13 for experienced programmers]] - Another older guide, explaining SS13 and DM to experienced coders.&lt;br /&gt;
*Visuals - https://github.com/tgstation/tgstation/blob/master/.github/guides/VISUALS.md - Guide describing most things relating to visuals and rendering on /tg/, however most of it also applies on BeeStation.&lt;br /&gt;
=== Development ===&lt;br /&gt;
* [[Working with the database#Database Setup|Working with the database]] - Setting up a local database for testing purposes, very useful for testing persistence and reducing development time.&lt;br /&gt;
&lt;br /&gt;
* [[Guide to git]] - Using git command line, as well as dealing with merge conflicts and using mapmerge/dmimerge&lt;br /&gt;
=== Spriting ===&lt;br /&gt;
* [[Guide to spriting]] - How to create sprites for the game. This is fairly outdated, however.&lt;br /&gt;
=== Mapping ===&lt;br /&gt;
* [[Guide to mapping]] - Many tips, tricks, and guidelines for creating maps.&lt;br /&gt;
* [[Map Merger]] - Use of mapmerge2, a vital tool for resolving map merge conflicts, as well as installing Git hooks.&lt;br /&gt;
* [[Guide to mapping/Exploration ruins]] - Guide explaining how to map exploration ruins.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36431</id>
		<title>Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36431"/>
		<updated>2023-03-29T03:40:33Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* Coding */ Add /tg/ visuals guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an index-page for finding guides related to aspects of development and contributing to the game. Guides will be linked with a short description of what they are about.&lt;br /&gt;
&lt;br /&gt;
Feel free to add to this page if you have any resources that may help aspiring developers. It is recommended you keep guides within the bounds of this wiki.&lt;br /&gt;
&lt;br /&gt;
For design direction and coding guidelines, see https://github.com/BeeStation/BeeStation-Hornet/wiki&lt;br /&gt;
== Resources ==&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
=== Design ===&lt;br /&gt;
* Design Goals - https://github.com/BeeStation/BeeStation-Hornet/wiki/Design-Goals - The current goals and direction of the game.&lt;br /&gt;
=== Coding ===&lt;br /&gt;
* Code Standards - https://github.com/BeeStation/BeeStation-Hornet/wiki/Code-Standards - The essential guidelines that maintainers look for in a PR.&lt;br /&gt;
&lt;br /&gt;
* Guide to coding - https://hackmd.io/@BdkEQ8tISgW8Pbn2OquQxQ/B1SeqStVq - Making a new item in the game from scratch, from environment setup to the Pull Request.&lt;br /&gt;
&lt;br /&gt;
* Guide to hard-dels - https://hackmd.io/@PowerfulBacon/guide_to_harddels - Explains how to avoid hard deletes, a quirk of the game&#039;s garbage collection.&lt;br /&gt;
* [[Understanding SS13 code]] - An older guide, explaining SS13 and DM to new coders&lt;br /&gt;
* [[SS13 for experienced programmers]] - Another older guide, explaining SS13 and DM to experienced coders.&lt;br /&gt;
*Visuals - https://github.com/tgstation/tgstation/blob/master/.github/guides/VISUALS.md - Guide describing most things relating to visuals and rendering on /tg/, however most of it also applies on BeeStation.&lt;br /&gt;
=== Development ===&lt;br /&gt;
* [[Working with the database#Database Setup|Working with the database]] - Setting up a local database for testing purposes, very useful for testing persistence and reducing development time.&lt;br /&gt;
&lt;br /&gt;
* [[Guide to git]] - Using git command line, as well as dealing with merge conflicts and using mapmerge/dmimerge&lt;br /&gt;
=== Spriting ===&lt;br /&gt;
* [[Guide to spriting]] - How to create sprites for the game. This is fairly outdated, however.&lt;br /&gt;
=== Mapping ===&lt;br /&gt;
* [[Guide to mapping]] - Fairly outdated guide on how to make maps, although some of its content may be useful.&lt;br /&gt;
* [[Map Merger]] - Use of mapmerge2, a vital tool for resolving map merge conflicts, as well as installing Git hooks.&lt;br /&gt;
* [[Guide to mapping/Exploration ruins]] - Guide explaining how to map exploration ruins.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36429</id>
		<title>Guide to git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36429"/>
		<updated>2023-03-29T03:30:45Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Add contribution guides index&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;git-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Git Command Line =&lt;br /&gt;
Many are drawn to GUI versions of Git, such as GitHub Desktop, GitKraken, and VSCode’s Git integration. However, I believe this is more of a hindrance than a help. If you’re just making mapping or sprite PRs, sure, maybe you can get along just fine with GitHub Desktop. However, these tools lack the expansive features of the command line and are harder to get help with. Command line is far more google-able if you have problems and I highly recommend it. Far more people will be able to assist you if you are using command line than an GUI tool.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-setup&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== The Setup ==&lt;br /&gt;
Download and install [[git:|git-scm]]. You should probably set it up to use the shell of your choice (I use command line on Windows Terminal), or if you prefer Git Bash, use that. Do note that installing it to your system PATH is very useful if you want to use VSCode’s builtin terminal.&lt;br /&gt;
&lt;br /&gt;
Also be sure to set your name/email in your git client so your commits show properly and are attributed properly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;amp;quot;Name Here&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;git config --global user.email &amp;amp;quot;[/cdn-cgi/l/email-protection &amp;lt;nowiki&amp;gt;[email protected]&amp;lt;/nowiki&amp;gt;]&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Often times the default can expose personal information. So be &#039;&#039;sure&#039;&#039; to set this.&lt;br /&gt;
&lt;br /&gt;
Name can just be your GitHub username or something else, doesn’t matter.&lt;br /&gt;
&lt;br /&gt;
As long as the email you put is added to your GitHub account it will work fine and show your icon on commits. GitHub will also provide you with a private email, if you don&#039;t have any type of &amp;quot;business&amp;quot; email, it is recommended to use this.&lt;br /&gt;
&lt;br /&gt;
For more details on commit email privacy, read [https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address GitHub&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-terms-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Terms Cheat-Sheet ==&lt;br /&gt;
&#039;&#039;&#039;HEAD:&#039;&#039;&#039; Term for the current location on the “commit tree”, basically your current location in history.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Detached HEAD:&#039;&#039;&#039; A state the client can be in, where the history is at a specific point in time, but not attached to a branch. Committing changes is not possible unless the HEAD is re-attached by checking out a branch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Staging:&#039;&#039;&#039; an in-between state of your local filesystem and a commit. This is so you can have some changes locally but not commit all of them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Commit:&#039;&#039;&#039; a collection of changes, applied as a “patch” onto the previous (parent) commit. Think of it as a chain link that contains a snapshot of the repository at that time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Branch:&#039;&#039;&#039; A collection of commits in one big chain, that can split off at any time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Merge:&#039;&#039;&#039; Joining two branches&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remote:&#039;&#039;&#039; A secondary git repository to sync changes with, usually GitHub but can be any server that supports the protocol&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Upstream:&#039;&#039;&#039; The remote that you are pulling from/pushing to, in that case your fork OR the main beestation repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-commands-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Commands Cheat-Sheet ==&lt;br /&gt;
&amp;lt;code&amp;gt;git clone (github link)&amp;lt;/code&amp;gt; downloads the linked repository into a folder at the current location.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull remotename branchname&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; and then &amp;lt;code&amp;gt;git merge remotename/branchname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; gets all the new commits from remote&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merging-strategies&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Merging Strategies ===&lt;br /&gt;
&amp;lt;code&amp;gt;git merge branchname&amp;lt;/code&amp;gt; Attempts to merge all new commits from branchname into the current HEAD, through a few strategies that vary:&lt;br /&gt;
* Fast-forward - Simple, used when the new changes are directly on top of, as in, have a continous history rooting from the current HEAD. For example, if someone pushed one commit to origin/master, and your local master didn’t have this one commit, it can simply be “fast forwarded” and add the new commit on the end&lt;br /&gt;
* Recursive: the normal strategy, it tries to put both the local changes AND the remote changes into one branch by adding the commits in what is called a “merge commit”&lt;br /&gt;
* Rebase: this is its own command, &amp;lt;code&amp;gt;git rebase branchname&amp;lt;/code&amp;gt; This attempts to take all of your LOCAL changes, and then append them to the end of the REMOTE branch, rather than putting the remote branch into your current one. This is personally my favorite for PRs because it makes a clean commit history, but it also “rewrites” all your commits into new ones, so it’s not suitable for branches used by multiple people because it doesn’t maintain the commit tree&lt;br /&gt;
&amp;lt;code&amp;gt;git reset commitsha (or branchname)&amp;lt;/code&amp;gt; - Sets the current HEAD to the commit listed OR the branchname listed. If you specify –hard, it will update the local filesystem to match this, if you don’t specify or put –soft, it only updates this in git, keeping your file changes intact&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout commitsha (or branchname)&amp;lt;/code&amp;gt; - For commits, this will “rewind” you to that commit and also “detaches HEAD”, which basically means you are no longer on a branch and can’t commit stuff. A temporary rewind, essentially. When you check out a branch, it’s basically just moving you to that branch. Do this for new PRs etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch (branchname)&amp;lt;/code&amp;gt; creates a new branch with the current commit history of the branch you are on&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch -d (branchname)&amp;lt;/code&amp;gt; deletes branch with said name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt; adds the file to “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git restore --staged (filepath)&amp;lt;/code&amp;gt; removes the file from “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; View what is staged, what is not, also view what branch/commit you are on. VERY useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt; Add ALL local filesystem changes to staging&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- .&amp;lt;/code&amp;gt; Undo all local changes, get rid of them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD .&amp;lt;/code&amp;gt; The same as above but stricter, if it doesn’t work&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (or --) filepath&amp;lt;/code&amp;gt; resets that file to the last commit on your filesystem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Commit message&amp;amp;quot;&amp;lt;/code&amp;gt; creates a commit with the current staged changes and adds it to the branch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push remotename branchname&amp;lt;/code&amp;gt; pushes the current local branch to remotename/branchname&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add (remotename) (github link)&amp;lt;/code&amp;gt; creates a remotename with a github repo so you can push/pull from it&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u remotename branchname&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;git pull --set-upstream remotename branchname&amp;lt;/code&amp;gt; sets the route from your CURRENT local branch to a remote branch. This makes it so you can just type &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; without having to specify the remote or branch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git reset HEAD~(number)&amp;lt;/code&amp;gt; resets current HEAD X commits backwards in the commit history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD~(number)&amp;lt;/code&amp;gt; temporarily rewinds and detaches HEAD X commits back in history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; show the commit history (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git diff HEAD&amp;lt;/code&amp;gt; show all the changes you have made locally that are not committed (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merge-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Merge Conflicts ==&lt;br /&gt;
Merge conflicts can look intimidating, but they aren’t in reality (unless you don’t know how to code).&lt;br /&gt;
&lt;br /&gt;
When two commits change the same part of the same file, git tries to merge them, but can’t, since it would probably break the code if it guessed.&lt;br /&gt;
&lt;br /&gt;
Instead, it lets you do it yourself.&lt;br /&gt;
&lt;br /&gt;
It writes into the file what looks like this&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
(version before merge)&lt;br /&gt;
=================&lt;br /&gt;
(new version)&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&amp;lt;/pre&amp;gt;&lt;br /&gt;
It usually does that multiple times per file. Basically compare the two, remove the markers and write the file back how it should be if both were merged into one.&lt;br /&gt;
&lt;br /&gt;
Here is an example.&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
    if(variable?.test())&lt;br /&gt;
=================&lt;br /&gt;
    if(the_variable.test()&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
This would most likely be merged into this:&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
    if(the_variable?.test()&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
The inferred history here is the variable was named &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt;, and the current branch changed it to &amp;lt;code&amp;gt;the_variable&amp;lt;/code&amp;gt;. However, another branch added the &amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; operator to the proccall. When this change was merged in, Git noticed an unexpected change to the variable name and placed a merge conflict. Making sense now? The way to merge it is applying both changes as intended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mapping-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mapping Conflicts ===&lt;br /&gt;
DMM files are impossible to merge via text, so we have tooling in the repository to automatically merge them.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/mapmerge2/Resolve Map Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there are any conflicting tiles, you will be prompted to fix it in your map editor, then you can continue by committing the changes.&lt;br /&gt;
&lt;br /&gt;
For more info, see [[Map Merger]].&lt;br /&gt;
=== Icon Conflicts ===&lt;br /&gt;
DMI files contain multiple images, making merge conflicts &#039;&#039;always&#039;&#039; happen if the file is updated by two branches. This means solving them is relatively trivial but can be time consuming. So there’s a tool for it.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/dmi/Resolve Icon Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;automatic-merge-conflict-resolution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Automatic Merge Conflict Resolution ===&lt;br /&gt;
Also, perk of using command line, if you want git to &#039;&#039;&#039;AUTO MERGE DMI and DMM&#039;&#039;&#039;, as well as auto-cleanup your maps on commit, just run &amp;lt;code&amp;gt;tools/hooks/Install&amp;lt;/code&amp;gt;. No need to run them manually anymore, they will run automatically if you merge or commit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-a-basic-pr-with-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Making a basic PR with command line ==&lt;br /&gt;
First, you’ll need to clone the repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone &amp;lt;nowiki&amp;gt;https://github.com/BeeStation/BeeStation-Hornet/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, change directories into the repository with &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You will now need to create a branch for your changes, using the master branch for PRs is bad practice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the branch is created, but you need to “check it out”, or switch to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make any changes in VSCode. When you’re done, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice what files now have “unstaged changes”. Any files you do NOT want changes in, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (filepath)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will delete unwanted changes on your local filesystem.&lt;br /&gt;
&lt;br /&gt;
Any files you DO want to PR changes to, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt;, or if you want to add all files, use &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; as the filepath.&lt;br /&gt;
&lt;br /&gt;
Now run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;, and confirm all the changes you want are staged.&lt;br /&gt;
&lt;br /&gt;
Now you’re ready to commit. Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Put a summary of your changes here&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a commit and add it to the current branch. Run &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; to see the commit history. You can exit with &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; and navigate with arrows.&lt;br /&gt;
&lt;br /&gt;
That worked, so now you just need to push the changes to your fork of the repository. So go on GitHub and press the fork button on the top right of BeeStation-Hornet, and you’ll be taken to your new fork repository. You need to add this as a remote on your local client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add fork &amp;lt;nowiki&amp;gt;https://github.com/(your&amp;lt;/nowiki&amp;gt; GitHub username)/BeeStation-Hornet/&amp;lt;/code&amp;gt; (change this to your fork’s link)&lt;br /&gt;
&lt;br /&gt;
Then, you can push to a branch on your fork.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u fork my-pr-that-does-something&amp;lt;/code&amp;gt; - The &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; here tells Git to save that this is the path to remote. This means that when you run &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; without passing a remote or branchname, it will know where to push the next time. The same applies to &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Done! Now go to your fork on GitHub and refresh, you’ll see something like “changes have recently been pushed to branch my-pr-that-does-something” with a big “Open pull request” button. Press that and make sure it’s going to the main repository. You can also do this manually from the Pull Requests tab on your fork.&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Working_with_the_database&amp;diff=36428</id>
		<title>Working with the database</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Working_with_the_database&amp;diff=36428"/>
		<updated>2023-03-29T03:30:25Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Add contribution guides index&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Database Setup =&lt;br /&gt;
When developing, it is useful to have a local database set up, for a variety of reasons.&lt;br /&gt;
&lt;br /&gt;
This guide is a walk through for local testing database installation, however it will work for a production deployment so long as secure passwords are used and firewall settings protect the database from external connection.&lt;br /&gt;
&lt;br /&gt;
Since savefiles no longer store character info, your character and preferences will reset between each startup. This can be problematic in adding a lot of time to the development and testing cycle. As such, it’s useful to set one up. This is a guide on how to do so.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;setup-mariadb-windows&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Setup MariaDB (Windows) ==&lt;br /&gt;
Download and install [[mariadb:|MariaDB Community Server]] for your operating system. Be sure to install the following components:&lt;br /&gt;
* Database Instance&lt;br /&gt;
* Client Programs&lt;br /&gt;
* HeidiSQL&lt;br /&gt;
[[File:Db_setup-6ce6ffea237bf219c2b91d392f48b2099b7930ae.png|thumb|none|alt=image|452x452px]]&lt;br /&gt;
Set a root password, something you will remember. It doesn’t need to be properly secure if it&#039;s for local testing, since you won’t be storing anything or hosting it publicly. Do &#039;&#039;&#039;not&#039;&#039;&#039; enable remote access for root.&lt;br /&gt;
[[File:Db_setup-559f5ff4e926edda40dd87a6274c774a6b9772e0.png|thumb|none|alt=image|449x449px]]&lt;br /&gt;
Install it as a service, with networking enabled. The default settings are fine. This means it will run 24/7 in the background. You can manage this in the Windows Services viewer.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-A055e14a687b49ba5d723e90d6bbcfcae2958296.png|image]] [[File:Db_setup-d327ef8463bef045b46b8aac0848e9303d50b19d.png|image]]&lt;br /&gt;
&lt;br /&gt;
Open HeidiSQL, Click on new to create a new session, check prompt for credentials and leave the rest as default.&lt;br /&gt;
[[File:Db_setup-5268ec389c6fcf8f2ff1aa84a382090c1e5278ae.png|thumb|none|alt=image|632x632px]]&lt;br /&gt;
Click save, then click open and enter in root for the username and the password you setup during the installation.&lt;br /&gt;
[[File:Db_setup-f8c2d10d5769c57f387e0eadf1c6e67842814ac3.png|thumb|none|alt=image|638x638px]]&lt;br /&gt;
Right click on the server entry in the left side plane (the area with &amp;lt;code&amp;gt;information_schema&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt;, etc) (the server entry will be the first one) and go to &amp;lt;code&amp;gt;Create new -&amp;amp;gt; Database&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Db_setup-245204aa1d0f17218e2eb1f4a0dd4a2432696ae6.png|thumb|none|alt=image|484x484px]]&lt;br /&gt;
You can name it anything at this step. The default config is &amp;lt;code&amp;gt;ss13beedb&amp;lt;/code&amp;gt;, so go ahead and use that. Don’t name it &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt;, or you will have security issues.&lt;br /&gt;
[[File:Db_setup-598a1178e842219e1b0ae9dc12f2ef27aafbf2de.png|thumb|none|alt=image|319x319px]]&lt;br /&gt;
Select the database you just created and then go to &amp;lt;code&amp;gt;File -&amp;amp;gt; Open SQL File&amp;lt;/code&amp;gt; and open the file &amp;lt;code&amp;gt;beestation_schema.sql&amp;lt;/code&amp;gt; file located at &amp;lt;code&amp;gt;SQL/beestation_schema.sql&amp;lt;/code&amp;gt;. You can also find it [[beereporaw:master/SQL/beestation_schema.sql|here]], but it may be newer than the version you are using. If it asks you to auto-detect, hit Yes. Ignore any “access violation” errors, the import works anyway.&lt;br /&gt;
[[File:Db_setup-f0f38f6cd445af32da096c835d2492727b091f3f.png|thumb|none|alt=image|484x484px]] [[File:Db_setup-B8634fc2985464e926572ac826faa7b4379f3653.png|thumb|none|alt=image|486x486px]]&lt;br /&gt;
Press the blue play icon in the topic bar of icon hieroglyphs and pray. If the schema imported correctly you should have no errors in the message box on the bottom.&lt;br /&gt;
[[File:Db_setup-5f7d15719bbacab5f759e2905d421f60c246f95a.png|thumb|none|alt=image|718x718px]]&lt;br /&gt;
Create a new user account for the server by going to &amp;lt;code&amp;gt;Tools -&amp;amp;gt; User Manager&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Username:&#039;&#039;&#039; Anything, but &amp;lt;code&amp;gt;ss13dbuser&amp;lt;/code&amp;gt; is the default&lt;br /&gt;
* &#039;&#039;&#039;Password:&#039;&#039;&#039; Any string of random text, you don’t need to remember it, just paste it into your database config. You can randomly generate one by pressing the arrow on the password field. Be sure to copy it.&lt;br /&gt;
* &#039;&#039;&#039;From host:&#039;&#039;&#039; &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Permissions:&#039;&#039;&#039; Press “Add object”, select the database you created. Under the new object, add:&lt;br /&gt;
** &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;INSERT&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Db_setup-f125cfa6a81217aa0b33ed0431b69c626303a671.png|thumb|none|alt=image|414x414px]]&lt;br /&gt;
&amp;lt;span id=&amp;quot;update-dbconfig&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Update dbconfig ==&lt;br /&gt;
Now, on your local copy of the repository, open [[beerepo:blob/master/config/dbconfig.txt|config/dbconfig.txt]] in a text editor.&lt;br /&gt;
&lt;br /&gt;
Set the following:&lt;br /&gt;
* Uncomment &amp;lt;code&amp;gt;SQL_ENABLED&amp;lt;/code&amp;gt; by removing the &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; in front of it.&lt;br /&gt;
* &amp;lt;code&amp;gt;ADDRESS 127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;PORT 3306&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_DATABASE ss13beedb&amp;lt;/code&amp;gt; (or whatever you set)&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_LOGIN ss13dbuser&amp;lt;/code&amp;gt; (or whatever you set)&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_PASSWORD password&amp;lt;/code&amp;gt; (replace with the password you set for the created user)&lt;br /&gt;
[[File:Db_setup-dc58b4506df7c115cf8edfa191804ceba96802e5.png|thumb|none|alt=image|653x653px]]&lt;br /&gt;
&amp;lt;span id=&amp;quot;skip-worktree&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Skip Worktree ==&lt;br /&gt;
Now, on git, this will create tracked changes that you don’t want to commit to any future PRs. So you need to tell git to not process any changes in the file. If you use git command line, this is trivial.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;git update-index --skip-worktree config/dbconfig.txt&amp;lt;/code&amp;gt;. Git will now ignore changes to this file locally. If you wish to undo this at any point, run &amp;lt;code&amp;gt;git update-index --no-skip-worktree config/dbconfig.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[File:Db_setup-1681618ba8cc443a13696a952af5c720c44a54c3.png|thumb|none|alt=image|743x743px]]&lt;br /&gt;
If you do not use command line, you should still be able to accomplish this somehow, google the equivalent for whatever tool you use.&lt;br /&gt;
= Other database options =&lt;br /&gt;
== Database based banning ==&lt;br /&gt;
Offers temporary jobbans, admin bans, cross-server bans, keeps bans logged even after they&#039;ve expired or were unbanned, and allows for the use of the off-server ban log. &lt;br /&gt;
&lt;br /&gt;
To enable database based banning:&lt;br /&gt;
* Open config/config.txt&lt;br /&gt;
* Add a # in front of BAN_LEGACY_SYSTEM, so the line looks like &amp;quot;#BAN_LEGACY_SYSTEM&amp;quot;&lt;br /&gt;
* Done. Note that any legacy bans are no longer enforced once this is done! So it&#039;s a good idea to do it when you&#039;re starting up.&lt;br /&gt;
== Database based administration ==&lt;br /&gt;
Offers a changelog for changes done to admins, which increases accountability (adding/removing admins, adding/removing permissions, changing ranks); allows admins with +PERMISSIONS to edit other admins&#039; permissions ingame, meaning they don&#039;t need remote desktop access to edit admins; Allows for custom ranks, with permissions not being tied to ranks, offering a better ability for the removal or addition of permissions to certain admins, if they need to be punished, or need extra permissions. Enabling this can be done any time, it&#039;s just a bit tedious the first time you do it, if you don&#039;t have direct access to the database.&lt;br /&gt;
&lt;br /&gt;
To enable database based administration:&lt;br /&gt;
* Open config/config.txt&lt;br /&gt;
* Add a # in front of ADMIN_LEGACY_SYSTEM, so the line looks like &amp;quot;#ADMIN_LEGACY_SYSTEM&amp;quot;&lt;br /&gt;
* Do the steps described in [[Working with the database#Adding your first admin|Adding your first admin]].&lt;br /&gt;
* Done. Note that anyone in admins.txt lost admin status, including you! So do the step above! You can repeat it for everyone, as it&#039;s a lot easier to do that and just correct permissions with the ingame panel called &#039;permissions panel&#039;.&lt;br /&gt;
* If your database ever dies, your server will revert to the old admin system, so it is a good idea to have admins.txt and admin_ranks.txt set up with some admins too, just so the loss of the database doesn&#039;t completely destroy everything.&lt;br /&gt;
If you need more help, ask in Discord.&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36427</id>
		<title>Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36427"/>
		<updated>2023-03-29T03:29:46Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Add contribution guides index&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an index-page for finding guides related to aspects of development and contributing to the game. Guides will be linked with a short description of what they are about.&lt;br /&gt;
&lt;br /&gt;
Feel free to add to this page if you have any resources that may help aspiring developers. It is recommended you keep guides within the bounds of this wiki.&lt;br /&gt;
&lt;br /&gt;
For design direction and coding guidelines, see https://github.com/BeeStation/BeeStation-Hornet/wiki&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* Design Goals - https://github.com/BeeStation/BeeStation-Hornet/wiki/Design-Goals - The current goals and direction of the game.&lt;br /&gt;
&lt;br /&gt;
=== Coding ===&lt;br /&gt;
&lt;br /&gt;
* Code Standards - https://github.com/BeeStation/BeeStation-Hornet/wiki/Code-Standards - The essential guidelines that maintainers look for in a PR.&lt;br /&gt;
&lt;br /&gt;
* Guide to coding - https://hackmd.io/@BdkEQ8tISgW8Pbn2OquQxQ/B1SeqStVq - Making a new item in the game from scratch, from environment setup to the Pull Request.&lt;br /&gt;
&lt;br /&gt;
* Guide to hard-dels - https://hackmd.io/@PowerfulBacon/guide_to_harddels - Explains how to avoid hard deletes, a quirk of the game&#039;s garbage collection.&lt;br /&gt;
* [[Understanding SS13 code]] - An older guide, explaining SS13 and DM to new coders&lt;br /&gt;
* [[SS13 for experienced programmers]] - Another older guide, explaining SS13 and DM to experienced coders.&lt;br /&gt;
&lt;br /&gt;
=== Development ===&lt;br /&gt;
&lt;br /&gt;
* [[Working with the database#Database Setup|Working with the database]] - Setting up a local database for testing purposes, very useful for testing persistence and reducing development time.&lt;br /&gt;
&lt;br /&gt;
* [[Guide to git]] - Using git command line, as well as dealing with merge conflicts and using mapmerge/dmimerge&lt;br /&gt;
&lt;br /&gt;
=== Spriting ===&lt;br /&gt;
&lt;br /&gt;
* [[Guide to spriting]] - How to create sprites for the game. This is fairly outdated, however.&lt;br /&gt;
&lt;br /&gt;
=== Mapping ===&lt;br /&gt;
&lt;br /&gt;
* [[Guide to mapping]] - Fairly outdated guide on how to make maps, although some of its content may be useful.&lt;br /&gt;
* [[Map Merger]] - Use of mapmerge2, a vital tool for resolving map merge conflicts, as well as installing Git hooks.&lt;br /&gt;
* [[Guide to mapping/Exploration ruins]] - Guide explaining how to map exploration ruins.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36426</id>
		<title>Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36426"/>
		<updated>2023-03-29T03:28:07Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Update entirely&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an index-page for finding guides related to aspects of development and contributing to the game. Guides will be linked with a short description of what they are about.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Feel free to add to this page if you have any resources that may help aspiring developers. It is recommended you keep guides within the bounds of this wiki.&lt;br /&gt;
&lt;br /&gt;
For design direction and coding guidelines, see https://github.com/BeeStation/BeeStation-Hornet/wiki&lt;br /&gt;
== Resources ==&lt;br /&gt;
=== Design ===&lt;br /&gt;
&lt;br /&gt;
* Design Goals - https://github.com/BeeStation/BeeStation-Hornet/wiki/Design-Goals - The current goals and direction of the game.&lt;br /&gt;
&lt;br /&gt;
=== Coding ===&lt;br /&gt;
&lt;br /&gt;
* Code Standards - https://github.com/BeeStation/BeeStation-Hornet/wiki/Code-Standards - The essential guidelines that maintainers look for in a PR.&lt;br /&gt;
&lt;br /&gt;
* Guide to coding - https://hackmd.io/@BdkEQ8tISgW8Pbn2OquQxQ/B1SeqStVq - Making a new item in the game from scratch, from environment setup to the Pull Request.&lt;br /&gt;
&lt;br /&gt;
* Guide to hard-dels - https://hackmd.io/@PowerfulBacon/guide_to_harddels - Explains how to avoid hard deletes, a quirk of the game&#039;s garbage collection.&lt;br /&gt;
* [[Understanding SS13 code]] - An older guide, explaining SS13 and DM to new coders&lt;br /&gt;
* [[SS13 for experienced programmers]] - Another older guide, explaining SS13 and DM to experienced coders.&lt;br /&gt;
&lt;br /&gt;
=== Development ===&lt;br /&gt;
&lt;br /&gt;
* [[Working with the database#Database Setup|Working with the database]] - Setting up a local database for testing purposes, very useful for testing persistence and reducing development time.&lt;br /&gt;
&lt;br /&gt;
* [[Guide to git]] - Using git command line, as well as dealing with merge conflicts and using mapmerge/dmimerge&lt;br /&gt;
&lt;br /&gt;
=== Spriting ===&lt;br /&gt;
&lt;br /&gt;
* [[Guide to spriting]] - How to create sprites for the game. This is fairly outdated, however.&lt;br /&gt;
&lt;br /&gt;
=== Mapping ===&lt;br /&gt;
&lt;br /&gt;
* [[Guide to mapping]] - Fairly outdated guide on how to make maps, although some of its content may be useful.&lt;br /&gt;
* [[Map Merger]] - Use of mapmerge2, a vital tool for resolving map merge conflicts, as well as installing Git hooks.&lt;br /&gt;
* [[Guide to mapping/Exploration ruins]] - Guide explaining how to map exploration ruins.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Template:Contribution_guides&amp;diff=36425</id>
		<title>Template:Contribution guides</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Template:Contribution_guides&amp;diff=36425"/>
		<updated>2023-03-29T03:26:53Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Update the index&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&#039;background-color:#e7e7ff&#039; width=&#039;100%&#039;&lt;br /&gt;
|colspan=&#039;2&#039; style=&#039;background-color:#d8d8ff&#039;|&amp;lt;div align=&#039;center&#039;&amp;gt;&#039;&#039;&#039;Contribution guides&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|width=&#039;150&#039; align=&#039;center&#039; |&#039;&#039;&#039;General&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Development]], [[Downloading the source code|Downloading the source code / hosting a server]], [[Guide to git]], [[:Category:Game Resources|Game resources category]], [[Guide to Changelogs|Guide to changelogs]]&lt;br /&gt;
|-&lt;br /&gt;
|width=&#039;150&#039; align=&#039;center&#039; |&#039;&#039;&#039;Database (MySQL)&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Working_with_the_database#Database_Setup|Setting up the database]], [[MySQL]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&#039;center&#039; |&#039;&#039;&#039;Coding&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Understanding SS13 code]], [[SS13 for experienced programmers]], [[Binary flags‎]], [[Text Formatting]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&#039;center&#039; |&#039;&#039;&#039;Mapping&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Guide to mapping]], [[Map Merger|Map merger]], [[Guide to mapping/Exploration ruins|Exploration Ruins]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&#039;center&#039; |&#039;&#039;&#039;Spriting&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Guide to spriting]]&lt;br /&gt;
|-&lt;br /&gt;
|align=&#039;center&#039; |&#039;&#039;&#039;Wiki&#039;&#039;&#039;&lt;br /&gt;
|align=&#039;left&#039; style=&#039;background-color:#f0f0ff;&#039; |[[Guide to contributing to the wiki]], [[Wikicode]]&lt;br /&gt;
|}&amp;lt;noinclude&amp;gt;[[Category:templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Terminology&amp;diff=36424</id>
		<title>Terminology</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Terminology&amp;diff=36424"/>
		<updated>2023-03-29T03:25:08Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Remove game resources category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Speech&lt;br /&gt;
|name=Speaks-His-Mind the Maintenance Dweller&lt;br /&gt;
|text=SSSo, lassst I heard the AI wasss helping the Redssshirts in sssome operation to robussst sssome sssort of cult in Aft Maintenance. I sssuggessst you ssstay clear of there, ssstranger. I wouldn&#039;t want to be on the wrong end of a ssstunbaton, no no...&lt;br /&gt;
|image=[[File:Lizardman.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A big bad list of common terminology and slang commonly used by resident Spacemen (players).&lt;br /&gt;
===[[Administrators|Admin]]===&lt;br /&gt;
The people who run the server. Have a variety of power-abuse buttons to keep the game from being fun.&lt;br /&gt;
===Adminhelp/Ahelp===&lt;br /&gt;
A command which lets you send a message to the [[Administrators|admins]]. Can be accessed by typing Adminhelp in game or by pressing &amp;lt;code&amp;gt;F1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Use this (instead of the OOC-channel) if you think someone is griefing or if you otherwise have something to ask the admins about.&lt;br /&gt;
&lt;br /&gt;
These can include questions about etiquette, the rules, or in-game procedures such as the starting the engine, etc.&lt;br /&gt;
&lt;br /&gt;
It should be noted that even when no admins are online, any messages sent in adminhelp are logged.&lt;br /&gt;
===Additional Access===&lt;br /&gt;
Under certain circumstances, such as a low server population, admin-toggled, or simply set in the server configuration by the host, jobs may be granted additional access when they join the round.&lt;br /&gt;
===Aft===&lt;br /&gt;
Nautical term. It means the back of a ship, or in our case, south.&lt;br /&gt;
===[[AI]]===&lt;br /&gt;
The Artificial Intelligence, the station&#039;s computer which can access machinery on the station.&lt;br /&gt;
===[[Analyzer]]===&lt;br /&gt;
Most often refers to [[Health Analyzer]]s, but can also refer to [[Analyzer|Atmospheric Analyzers]], [[Botanist|Botany]]&#039;s Plant Analyzers, or [[Scientist|Research &amp;amp; Development]]&#039;s Destructive Analyzer.&lt;br /&gt;
===Anomaly===&lt;br /&gt;
A kind of [[random event#Anomalies]] announced over comms that can cause station damage if not dealt with in time.&lt;br /&gt;
===Antag===&lt;br /&gt;
Antagonist. The &amp;quot;opponent&amp;quot;, &amp;quot;enemy&amp;quot;. Every [[Game_modes|Game Mode]] (except extended and secret extended) has at least one.&lt;br /&gt;
===[[APC]]===&lt;br /&gt;
The Area Power Controller, a square box on the wall that provides power to the room and is the purview of [[Station Engineer]]s.&lt;br /&gt;
===[[Asimov]]===&lt;br /&gt;
The default laws that the [[AI]]s and therefore the [[Cyborg]]s are held to. Taken from [https://en.wikipedia.org/wiki/Isaac_Asimov Isaac Asimov]&#039;s short stories and the [https://en.wikipedia.org/wiki/Three_Laws_of_Robotics Three Laws of Robotics].&lt;br /&gt;
&lt;br /&gt;
Basically makes robots follow orders and unable to harm people.&lt;br /&gt;
===[[Atmos]]===&lt;br /&gt;
Either an [[Atmospheric Technician]] (which are also commonly known as Atmos Tech) or the [[Atmospherics]] area itself which deals with the air supply.&lt;br /&gt;
===Ayys/Ayyliens===&lt;br /&gt;
An [[Abductor]], not to be confused with a [[Xenomorph]].&lt;br /&gt;
===Badmin===&lt;br /&gt;
Bad Admin, refers to an admin who abuses their powers.&lt;br /&gt;
===Ban===&lt;br /&gt;
Blocking a person from access to the SS13 server for a period of time. This can happen if a person is not obeying the given [[rules]].&lt;br /&gt;
&lt;br /&gt;
Read the [[guide to evading getting banned]] for further guidelines.&lt;br /&gt;
===[[Beepsky|Beepsky/Officer Beepsky]]===&lt;br /&gt;
A [[Securitron]] that starts in Security. Will chase, stun, and handcuff anyone set to be arrested in the [[security records]].&lt;br /&gt;
===[[Blob]]===&lt;br /&gt;
Can refer to the Blob game mode, or the Blob that spawns in Blob mode and sometimes in random events.&lt;br /&gt;
&lt;br /&gt;
A big green jelly thing that spreads quickly, causes enormous damage, beats the shit out of people and is weak to fire.&lt;br /&gt;
===Bolt/Bolted===&lt;br /&gt;
A feature of [[Airlock]]s. When the bolts are dropped, the door cannot move from its current position, be it open or closed. They can be lifted by the AI or [[hacking]] the airlock.&lt;br /&gt;
===[[Borg]]===&lt;br /&gt;
A [[Cyborg]].&lt;br /&gt;
===[[Borging]]===&lt;br /&gt;
Making a Cyborg out of someone. Done in [[Robotics]] usually.&lt;br /&gt;
===Braindead===&lt;br /&gt;
Refers to a player who has logged off or been disconnected. Examining a braindead character reveals the message; &amp;quot;They have a blank, absent-minded stare and appears completely unresponsive to anything. They may snap out of it soon.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
While these players are not in-game, they should generally be left alone (or preferably dragged somewhere safe) The rules still apply to braindead characters.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE: This person can still come back to the game!&#039;&#039;&#039; Who knows, maybe their computer just crashed for a minute.&lt;br /&gt;
===[[Bridge]]===&lt;br /&gt;
The command center of the ship where the heads start. Found in the center of the station.&lt;br /&gt;
===[[Brig]]===&lt;br /&gt;
An area of the station north of the Bridge and just under Security Office where people are held by [[shitcurity|security]] after being arrested.&lt;br /&gt;
===Bwoink===&lt;br /&gt;
Receiving an Admin PM, named after the sound effect played when an admin PMs you.&lt;br /&gt;
===[[BYOND]]===&lt;br /&gt;
The shitty, [[Lagtime|laggy]] platform SS13 was coded on. You need it to be able to play the game, unfortunately.&lt;br /&gt;
===[[Cargo]]===&lt;br /&gt;
A shortened version of either the cargo bay, or the whole of the supply section, not including mining dock and mining outpost.&lt;br /&gt;
===Catatonic===&lt;br /&gt;
A player who has ghosted while alive, disabling them from returning to play. When such a player is examined, it gives a message stating there is no hope of recovery.&lt;br /&gt;
&lt;br /&gt;
These people are as considered corpses and can be taken to the [[Morgue]] or [[Kitchen]].&lt;br /&gt;
===[[CE]]===&lt;br /&gt;
The Chief Engineer.&lt;br /&gt;
===[[CentCom]]===&lt;br /&gt;
Short for &amp;quot;Central Command&amp;quot;, the administration branch of Nanotrasen which runs SS13. Will periodically send messages to the station which are usually of debatable usefulness.&lt;br /&gt;
&lt;br /&gt;
Also refers to the area the Emergency [[Escape Shuttle]] goes to when it leaves SS13.&lt;br /&gt;
===[[Cloning|Clone/Cloning]]===&lt;br /&gt;
To revive someone back to life through cloning their dead body, usually done in [[Genetics]].&lt;br /&gt;
===[[CMO]]===&lt;br /&gt;
The Chief Medical Officer.&lt;br /&gt;
===[[CO2]]===&lt;br /&gt;
Carbon Dioxide, an invisible gas kept in black canisters. Will knock you out and suffocate you.&lt;br /&gt;
A small trace amount of it makes up breathable air.&lt;br /&gt;
===Comdom===&lt;br /&gt;
A derogatory name for an incompetent and abusive [[Captain]].&lt;br /&gt;
===Corporate===&lt;br /&gt;
A lawset for the [[AI]], which makes it a ruthless profits-maximizing, efficiency-enforcing machine.&lt;br /&gt;
===Crew===&lt;br /&gt;
This is everybody on [[Space Station 13]] that is not a [[Syndicate]], [[Wizard]], [[xenos|Alien]], or whatever.&lt;br /&gt;
&lt;br /&gt;
Typically what they do is get the station into shape, like setting up the [[Station_Engineer|singularity]] and [[Quartermaster|ordering supplies]]. Oh, and beating the shit out of the other groups of players, of course!&lt;br /&gt;
===[[Crit]]===&lt;br /&gt;
To be in a critical state. At this point, your character has lost consciousness and will slowly die from lack of oxygen.&lt;br /&gt;
===[[Cryo]]===&lt;br /&gt;
The big green glass things in Medbay. Putting dying people in here can save them.&lt;br /&gt;
===Cuban Pete===&lt;br /&gt;
&#039;&#039;They call me Cuban Pete, I&#039;m the king of the rhumba beat.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;When I play my maracas I go&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Chick chicky boom, chick chicky boom&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A notorious griefer who applied the bomb-making knowledge of a mysterious first scientist mentor who had invented ludicrous sized bombs. The station was turned into nearly dust every round he was on, antagonist or not. Because of him there was a bombcap hardcoded into the game.&lt;br /&gt;
===[[Cult]]===&lt;br /&gt;
Refers to either the [[Cult]] game mode, or the cultists within.&lt;br /&gt;
===Deadchat===&lt;br /&gt;
A chat channel dead/observing players speak on using the say command. Can only be seen by other dead/observing players. Deadchat is mostly considered to be out-of-character, and here you are allowed to talk about anything happening in the round (unlike in the [[OOC#OOC_channel|OOC channel]]). &lt;br /&gt;
&lt;br /&gt;
Note that what you learn here is forgotten by your character if you&#039;re revived.&lt;br /&gt;
===Deadmin===&lt;br /&gt;
Most commonly read as dead-min (as in dead admin), but actually stands for de-admin, meaning the action of removing administrative powers from an [[Administrators|administrator]].&lt;br /&gt;
===Disk===&lt;br /&gt;
Infrequently a science or genetics research disk, but most often refers to the [[Nuclear Authentication Disk]], used in [[nuke|Nuclear Mode]]. If you are the [[captain]], guard it with your life.&lt;br /&gt;
&lt;br /&gt;
If you are a traitor with it as your objective, GET DAT FUKKEN DISK.&lt;br /&gt;
===Donk/Bangin&#039; Donk===&lt;br /&gt;
[https://www.youtube.com/watch?v=ckMvj1piK58 wait wait hold on, you know what you wanna do with that right? you wanna put a bangin&#039; donk on it]&lt;br /&gt;
===Drone===&lt;br /&gt;
Either a type of [[alien]] or a [[Drone|player-controlled repair bot]].&lt;br /&gt;
===Electrified/Shocked===&lt;br /&gt;
Another feature of [[Airlock]]s. If an electrified airlock is touched by someone without insulated gloves, they will receive an electric shock, taking damage and being stunned for some time.&lt;br /&gt;
&lt;br /&gt;
The AI and airlock hacking can activate or disable electrification. Some grilles are also electrified -- cutting a cable without wearing insulated gloves will also electrify you.&lt;br /&gt;
===[[Emag]]===&lt;br /&gt;
Another name for the [[Syndicate_Items#Cryptographic_Sequencer|Cryptographic Sequencer]] traitor item, which permanently opens doors and has myriad other uses.&lt;br /&gt;
===Emagged/Emaged===&lt;br /&gt;
Used either as a verb to describe the action of using an [[emag]] on something, or as an adjective to describe an object that someone has used an emag on.&lt;br /&gt;
===[[Emoji]]===&lt;br /&gt;
A.K.A. smileys, except smile is not mandatory. [[Emoji cheat sheet|Learn them all!]]&lt;br /&gt;
===[[Engine]]===&lt;br /&gt;
The large area in the south of the station that is used to start and contain a gravitational singularity that provides power to the station.&lt;br /&gt;
===ERP===&lt;br /&gt;
Erotic Role Play (ERP) is the action of when a player or players engages in roleplaying that is erotic in nature.&lt;br /&gt;
&lt;br /&gt;
An inherently controversial subject, people&#039;s reactions to ERP ranges from upset and rage to taking off one&#039;s clothes and joining to [[Rules|ding dong bannu]].&lt;br /&gt;
===[[EVA]]===&lt;br /&gt;
A room just southwest of the Security wing where space suits, magboots, jetpacks and the RCD are kept. Stands for Extra-Vehicular Activity.&lt;br /&gt;
===Fore===&lt;br /&gt;
Nautical term. It means the front of a ship, or in our case, north.&lt;br /&gt;
===[[Ghost]]===&lt;br /&gt;
Refers to a command you can type when you have died to become a ghost, and to the actual ghosts themselves.&lt;br /&gt;
&lt;br /&gt;
Ghosts can speak on deadchat, move around the station freely, see everything, and can&#039;t interact with anything meaningful.&lt;br /&gt;
&lt;br /&gt;
They are used to observe the game after you have died. Cannot be seen directly by living players unless something is very wrong.&lt;br /&gt;
===Gibs===&lt;br /&gt;
The bloody, torn apart remnants of a former living being. Created by people and monkeys exploding. A cyborg that blows up has its own version of gibs: robot debris.&lt;br /&gt;
&lt;br /&gt;
To gib something is to turn it into gibs, usually by a [[guide to toxins|bomb]] or the Chef&#039;s machine that turns people into meat, the [[Gibber]].&lt;br /&gt;
===Gimmick===&lt;br /&gt;
Can refer to a player gimmick or a gimmick round. Basically a round or player which plays with a certain &amp;quot;theme&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Can be amusing once or twice but doing this regularly runs it into the ground very quickly.&lt;br /&gt;
===Goofball===&lt;br /&gt;
Refers to the [[Tesla Engine]] and specifically its energy balls, named for its coder.&lt;br /&gt;
===Grayshirt/Grays===&lt;br /&gt;
[[Assistant]]s, named after their signature gray uniform. Not to be confused with ayyliens. AKA grayshits. AKA,&lt;br /&gt;
===Graytide===&lt;br /&gt;
Originated from a bug in the job selection system, causing the majority of the crew to be roundstart [[Assistant]]s, dressed in gray. This resulted in swarms of Assistants storming the Brig and antagonize [[security]]. Now the word refers to any griefy behavior of that bent.&lt;br /&gt;
===[[Greentext]]===&lt;br /&gt;
An alternate way of describing a victory as an antagonist. Derived from the green text used for &#039;success&#039;.&lt;br /&gt;
===Grief===&lt;br /&gt;
A.K.A. Griefing/Griefer/Griffed/Griff/Griffon/Gruffer/Grover/Shitler/Chucklefuck/(Pulling a) Cuban Pete.&lt;br /&gt;
&lt;br /&gt;
Intentionally ruining the game for others without the metagame pardon of being an antagonist.&lt;br /&gt;
&lt;br /&gt;
Note that this is subjective and up to the admin&#039;s interpretation, not yours. Report this using adminhelp to keep the servers tidy!&lt;br /&gt;
===Gulag===&lt;br /&gt;
The Russian term for the [[Labor Camp]].&lt;br /&gt;
===[[Hacking]]===&lt;br /&gt;
The act of breaking the security measures on equipment such as Airlocks or APCs by illicit means. &lt;br /&gt;
===[[Hand of God|HoG]]===&lt;br /&gt;
Abbreviation for the [[Hand of God]] game mode.&lt;br /&gt;
===Heads===&lt;br /&gt;
The station&#039;s [[Chain_of_Command|Heads of Staff]], each in command of a department. They are also the targets of a [[revolution]].&lt;br /&gt;
===Honk/Hunke===&lt;br /&gt;
[[clown|hh-ho-ooonn-nk-kkk ww-hhh-yy i-iss-s see-ccu-uur-rrttt-yy bb-eeaa-tt-iinn-gg m-mme-ee hh-hoo-oon-nnk-kk]]&lt;br /&gt;
===[[Head of Personnel|HoP]]===&lt;br /&gt;
[[Head of Personnel]]. Should assign jobs and shit, but usually ends up giving himself Captain-level access, ignoring his job, and acting like a supercop in an [[The Owl|owl costume]].&lt;br /&gt;
===[[Head of Security|HoS]]===&lt;br /&gt;
The [[Head of Security]].&lt;br /&gt;
===Hulk===&lt;br /&gt;
Used to refer to the [[genetics|superpower]] or a person in possession of it. People with the Hulk gene turn green and become super strong, being able to punch through walls, windows, and other fixtures. Hurts like hell if one hits you. Hulks are an exception to some killing rules (see the [[Rules]] for details)&lt;br /&gt;
===Husk===&lt;br /&gt;
A corpse which has turned into a gray, ugly... mummified thing.&lt;br /&gt;
&lt;br /&gt;
This has either happened by extreme heat (fire), extreme cold (space) or liquid suckification (changeling sucked their juices/DNA out). Not a nice thing to witness at first, but you get used to it.&lt;br /&gt;
===Hypo===&lt;br /&gt;
[[High-risk_items#Hypospray|Hypospray]].&lt;br /&gt;
===IC===&lt;br /&gt;
In Character. Stuff that is happening in the game.&lt;br /&gt;
===[[IC in OOC]]===&lt;br /&gt;
The act of describing anything happening in the game over the [[OOC]] channel. The rule of thumb is &#039;&#039;&#039;if a person not involved in the incident or not observing the game can still tell what&#039;s going on&#039;&#039;&#039;, it&#039;s [[OOC|IC in OOC]]. Usually comes with a chastising and a thousand mini-mods squawking out &amp;quot;ICKY OCKY!!!&amp;quot; but excessive use results in a ban. (See the [[OOC]] page for details)&lt;br /&gt;
===[[Internals]]===&lt;br /&gt;
Usually an [[oxygen tank]] of some sort and a [[gas mask]]. Basically any worn item that lets you breathe when you otherwise can&#039;t.&lt;br /&gt;
===Internals Box===&lt;br /&gt;
That box which comes in a spawned player&#039;s backpack containing a transparent breath mask, one emergency-sized tank of pure oxygen and an epinehrine medipen.&lt;br /&gt;
&lt;br /&gt;
A great place to keep things you don&#039;t access a lot but want to keep on you.&lt;br /&gt;
===Job Ban===&lt;br /&gt;
Similar to a [[Terminology#Ban|Ban]], except in this case you&#039;ll be prevented from playing a specific role, such as a [[gang|team-based antagonist]] or a [[Head of Security|head of staff]]. You may even get banned from playing an entire [[Science|department]] if you demonstrate an inability to follow the [[rules]]. &lt;br /&gt;
===[[Random_events#Space_Vines|Kudzu]]===&lt;br /&gt;
Space vines. Can start growing randomly or be planted.&lt;br /&gt;
===Lag/Space Lag/Spacetime Distortions===&lt;br /&gt;
Concept common to almost all online gaming. Not worth explaining in depth here - basically it&#039;s the server (server-side lag) or your own computer (client-side lag) being slow and causing gaps between you doing stuff and it actually happening to grow. Sometimes referred as &#039;time warp&#039; or something similar when players are in character.&lt;br /&gt;
===Lathe===&lt;br /&gt;
Short for the [[Autolathe]], located in [[Cargo]]. Could also be [[Protolathe]], located in [[R&amp;amp;D Lab]].&lt;br /&gt;
===[[Asimov|Law/Laws]]===&lt;br /&gt;
Rules which the [[AI]] and [[Cyborg]]s must follow. Are somewhat open to interpretation by the player, but the majority consensus and badmin rulings are what really count. May be modified or changed at an [[AI Upload|AI Upload Terminal]] using various modules, wiped back to the basic three using the Reset Module, or purged entirely with the Purge Module. Note that core modules cannot be removed by the standard reset module.&lt;br /&gt;
===[[Ling]]===&lt;br /&gt;
A [[Changeling]].&lt;br /&gt;
===[[Malf]]===&lt;br /&gt;
Short for malfunction. Can refer to either the [http://nanotrasen.com/wiki/index.php/Game_Mode#AI_Malfunction|AI Malfunction game mode], or to describe the AI in said mode.&lt;br /&gt;
===[[Mass Driver]]===&lt;br /&gt;
Computer or switch operated devices found in Toxins, the Chapel and arrivals Disposals.&lt;br /&gt;
&lt;br /&gt;
Any objects on them when they are activated will be thrown forward at high speed, either into the bomb testing area (Toxins) or space (Chapel).&lt;br /&gt;
===Mini-mod===&lt;br /&gt;
Those players without admin or mod powers or responsibilities who chastise other players and list server rule infractions incessantly. They should be ignored.&lt;br /&gt;
===[[MMI]]===&lt;br /&gt;
A Man-Machine-Interface. Essentially player-cyborg-interface. A [[cyborg]] has one inside it. Enables the brain to speak and see.&lt;br /&gt;
&lt;br /&gt;
Put a brain into an empty MMI, insert the whole thing into an empty [[cyborg]] and you can bring it back to life!&lt;br /&gt;
===Mod===&lt;br /&gt;
Could be used to refer to Moderator, the rank, or any admin.&lt;br /&gt;
===Murderboning===&lt;br /&gt;
Going on a killing spree.&lt;br /&gt;
===[[N2]]===&lt;br /&gt;
Nitrogen, an invisible gas kept in red canisters. Mostly useless but makes up a certain percentage of breathable air. Not to be confused with chemical reagent nitrogen from chemistry.&lt;br /&gt;
===[[N2O]]===&lt;br /&gt;
Nitrous Oxide, also known as laughing gas or anesthetic. White gas kept in red canisters with a white stripe, that will knock you out and suffocate you at high enough concentrations.&lt;br /&gt;
===[[Nanotrasen]]===&lt;br /&gt;
The autonomous super-corporation that built and operates the station, according to the [[backstory]].&lt;br /&gt;
&lt;br /&gt;
Common misspellings include NanoTrasen, Nanotressen, Nanotransen, Nanotracer, and You Know That Fucking Company We Work For. (See CentCom for the difference between Nanotrasen and CentCom)&lt;br /&gt;
===Nar-Sie/Nar-Nar===&lt;br /&gt;
The eldritch deity whom [[cultists]] serve and often wish to summon.&lt;br /&gt;
===Notes===&lt;br /&gt;
A command which displays &amp;quot;&#039;&#039;&#039;Notes&#039;&#039;&#039;&amp;quot; kept in your character&#039;s memory, which you add with the &amp;quot;&#039;&#039;&#039;Add-Note&#039;&#039;&#039;&amp;quot; command. Some notes are automatically added depending on the circumstances, such as [[Revolution|revolutionaries]] having the list of rev members memorized, [[Syndicate]] leaders having the nuclear bomb code memorized, or the time of your death. Also refers to the top secret notes [[admin]]s keep on players, usually if they get banned.&lt;br /&gt;
===[[Nuke]]===&lt;br /&gt;
Can refer to either the [[Game Mode#Nuclear Emergency|Nuclear game mode]] (also known as Syndicate), or the Nuclear Fission Explosive used in said mode.&lt;br /&gt;
===[[O2]]===&lt;br /&gt;
[[Oxygen]]. Invisible gas usually kept in blue and white [[Canister]]s. Vital for reasons that you should already know, but deadly for reasons you [https://en.wikipedia.org/wiki/Oxygen_toxicity may not].&lt;br /&gt;
===One-Human(ed)===&lt;br /&gt;
Referring to a custom AI law that designates only one member of the crew as a human. Usually accompanied with an order to purge &amp;quot;non-humans.&amp;quot;&lt;br /&gt;
===[[OOC]]===&lt;br /&gt;
The blue bolded chat channel which is shown to all players. Don&#039;t use this to talk about anything going on in the game (until right at the end of the game generally).&lt;br /&gt;
&lt;br /&gt;
Might get switched off occasionally if it gets too idiotic. You can toggle the visibility of the ooc channel by using the corresponding command.&lt;br /&gt;
===[[OOC in IC]]===&lt;br /&gt;
The inverse of the much more common [[IC in OOC]]. Whenever a game mechanic, metafeature, or player-to-player conversation is referenced in the say or emote channels.&lt;br /&gt;
&lt;br /&gt;
Heavily frowned upon as it ruins MY IMMERSIONNNN!&lt;br /&gt;
&lt;br /&gt;
Talking ((Like this)) is still OOC in IC.&lt;br /&gt;
===Ops/Operatives===&lt;br /&gt;
Short for [[nuke ops]]. Generally heard over the radio shortly before the station goes boom.&lt;br /&gt;
===ORM===&lt;br /&gt;
Short for the Ore Redemption Machine, which is used to turn the materials miners bring into usable sheets, typically used by science. Often found at Cargo or Science for this very reason.&lt;br /&gt;
===Paladin===&lt;br /&gt;
A lawset for the [[AI]], your stereotypical white-knight good-guy role.&lt;br /&gt;
===Parapen===&lt;br /&gt;
The [[Sleepy Pen]] was previously called Parapen, short for Paralysis Pen.&lt;br /&gt;
===[[PDA]]===&lt;br /&gt;
Short for Personal Digital Assistant, a [[PDA|handheld device]] that acts as a pager, flashlight and other useful functions, depending on what cartridge is inserted.&lt;br /&gt;
===[[Perma|Perma/Permabrig]]===&lt;br /&gt;
The [[Prison Wing]] in the fore section of security, where prisoners are kept permanently.&lt;br /&gt;
===[[Plasma]]===&lt;br /&gt;
A.K.A. [[Plasma|Biotoxin]]. Purple gas kept in orange canisters. Poisonous and flammable.&lt;br /&gt;
&lt;br /&gt;
Research into uses and properties of plasma is the station&#039;s prime reason for existence, according to the [[backstory]].&lt;br /&gt;
===Port===&lt;br /&gt;
Nautical term. It means the side of a ship on the left when one is facing forward, or in our case, west.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re the kind of person who likes mnemonic devices, it&#039;s useful to remember that &#039;&#039;PORT&#039;&#039; has the same number of letters as &#039;&#039;LEFT&#039;&#039;. &lt;br /&gt;
===[[QM]]===&lt;br /&gt;
Usually refers to the [[Quartermaster]], but can also mean the [[Cargo Bay]] or the people who [[Cargo Technician|work there]].&lt;br /&gt;
===[[R&amp;amp;D|RnD/R&amp;amp;D]]===&lt;br /&gt;
Refers to [[Guide_to_Research_and_Development|Research and Development]], or the [[R&amp;amp;D|Laboratory]] that carries it out.&lt;br /&gt;
===[[Radio]]===&lt;br /&gt;
Normally refers to the headset on your head which can be used with the command &#039;&amp;lt;code&amp;gt;say &amp;quot;;help that traitor is griefing me&amp;quot;&amp;lt;/code&amp;gt;&#039;, for example. Can also refer to station bounced radios and intercoms. Shows up as green text with a symbol and frequency appended to it. Additional department-specific radios also exsist. To use the equipped department radio&#039;s default department frequency use &#039;&amp;lt;code&amp;gt;say &amp;quot;.h Hello Department!&amp;quot;&amp;lt;/code&amp;gt;&#039;. (See [[Radio]] for details or how to use the radio when it has multiple department frequencies available)&lt;br /&gt;
===[[RCD]]===&lt;br /&gt;
[[Rapid Construction Device]]. A piece of equipment that can quickly make and break floors, regular walls, and airlocks.&lt;br /&gt;
===[[Research Director|RD]]===&lt;br /&gt;
The [[Research Director]].&lt;br /&gt;
===Records===&lt;br /&gt;
Comes in two flavors, [[Computers|Security and Medical]], both accessible from terminals with red or white screens, respectively.&lt;br /&gt;
&lt;br /&gt;
Medical Records are mostly useless and thus mostly unused, but Security Records contain useful fingerprint information and can be used to have [[Beepsky]] arrest people on sight.&lt;br /&gt;
===Redshirt===&lt;br /&gt;
[[Security Officer]]s, named for their signature red uniforms and tendency to die at the hands of everything.&lt;br /&gt;
===Redtext===&lt;br /&gt;
An alternate way of describing a loss as an antagonist. Derived from the red text used for &#039;fail&#039;.&lt;br /&gt;
===Report/Centcom Report/Traitor Report===&lt;br /&gt;
A document printed out from communications consoles at the start of most [[Game Mode|game modes]]. Lists who might be the traitor and what might be their targets.&lt;br /&gt;
&lt;br /&gt;
Inaccurate to the point where it&#039;s usually false. Do not treat this report as proof of anything.&lt;br /&gt;
===[[Rev]]===&lt;br /&gt;
Could refer to the game mode [[Game_Modes#Revolution|Revolution]], a member of the Revolution in said game mode, or a [[Revenant]].&lt;br /&gt;
===Revhead===&lt;br /&gt;
One of the leaders of the revolution in [[Game_Modes#Revolution|Revolution]] game mode.&lt;br /&gt;
===[[Robusting|Robust/Robusting]]===&lt;br /&gt;
The game&#039;s ROBUST COMBAT SYSTEM. To robust someone is to beat the shit out of them or at least win in a fight.&lt;br /&gt;
&lt;br /&gt;
The definition of what exactly makes a crewmember robust varies from person to person, but it&#039;s almost universally agreed to mean being skilled despite the inherently clunky interface.&lt;br /&gt;
===[[RP]]===&lt;br /&gt;
(MY IMMERSION) &amp;quot;Role Play&amp;quot;. Basically acting within the mental/emotional confines of your in-game character and not yourself. This is encouraged on our MRP server.&lt;br /&gt;
===[[Shitcurity]]===&lt;br /&gt;
A derogatory term for [[Security Officer]]s who are abusive, incompetent or generally shit. Can usually be heard shouted by the guy who just got arrested.&lt;br /&gt;
===[[Shuttle]]===&lt;br /&gt;
Most of the time refers to the Emergency [[Escape Shuttle]] which shows up at the end of the round in the northwest of the station. Can also refer to the Arrival Shuttle (where you start if you join late), the [[syndicate]] or [[wizard]] shuttle (which you&#039;ll rarely see, if ever), the Supply Shuttle (which brings items to the [[Quartermaster|Cargo Bay]]), or the mining and prison shuttles (which move people between the mining and prison stations, respectively).&lt;br /&gt;
===[[Signal]]===&lt;br /&gt;
A beep sent from a Remote Signalling Device. &amp;quot;Default Signal&amp;quot; is used to refer to the default setting of the devices, which is Frequency 147.9, Code 30.&lt;br /&gt;
&lt;br /&gt;
Randomly signaling the default frequency/code is a good idea, and will cause nothing bad to happen ever.&lt;br /&gt;
===Silicon===&lt;br /&gt;
A term for [[AI]] or [[cyborg]] players, contrast with &amp;quot;human.&amp;quot;&lt;br /&gt;
===[[Singulo|Singulo/Singuloth/Sing]]===&lt;br /&gt;
The [[Singularity|gravitational singularity]], what is essentially a black hole that emits radiation, this radiation is converted to power. It &#039;&#039;&#039;should&#039;&#039;&#039; be contained with a shield, if it isn&#039;t, don&#039;t stop to take in the view, get those legs moving.&lt;br /&gt;
===[[Shadowlings|Slings]]===&lt;br /&gt;
[[Shadowling]]s, one of the station&#039;s many antagonist types.&lt;br /&gt;
===Space Wind===&lt;br /&gt;
Shifts in air pressure that can cause players and items they&#039;re dragging to be knocked into space.&lt;br /&gt;
===Spacing===&lt;br /&gt;
The act of forcing or throwing someone out an airlock into space, usually for [[Traitor|malicious purposes]].&lt;br /&gt;
===[[SS13]]===&lt;br /&gt;
[[Space Station 13]]. Generally used to refer to the game rather than the actual station.&lt;br /&gt;
===SSD===&lt;br /&gt;
Stands for Space Sleep Disorder or Sudden Sleep Disorder. An in-character explanation for someone that has disconnected or has gone AFK.&lt;br /&gt;
===Starboard===&lt;br /&gt;
Nautical term. It means the side of a ship on the right when one is facing forward, or in our case, east.&lt;br /&gt;
===[[Supermatter|SM]]===&lt;br /&gt;
The [[Supermatter]].&lt;br /&gt;
===[[Syndie|Syndie/Synd]]===&lt;br /&gt;
Can refer to the organization known as the [[Syndicate]], a coalition of companies that execs their hate of [[Nanotrasen]], according to the [[backstory]], or to raid groups and operatives of said coalition. [[Traitor|Traitors]], traitor [[Cyborg]]s and traitor [[AI|AIs]] are Syndicate affiliates and [[Game Mode#Nuclear Emergency|Nuclear mode&#039;s]] premise revolves around a direct Syndicate attack. Ingame, they have randomized company names that usually look something like &amp;quot;GeoDyne West Operative #2&amp;quot; or &amp;quot;Waffle Co. Czar&amp;quot; and there are usually at least two of them and up to six. They also have access to a lot of special syndicate gear.&lt;br /&gt;
===Tabling===&lt;br /&gt;
The act of grabbing someone then clicking a table to instantly knock them down on it, usually followed by a toolbox in the skull or being stripped. &lt;br /&gt;
===[[Tele]]===&lt;br /&gt;
While usually referring to the [[Hand Teleporter]], it could also be referring to the full-fledged [[Teleporter]] in the [[Teleporter|Teleporter Room]]. Most people have no idea how to use it.&lt;br /&gt;
===Tesla===&lt;br /&gt;
The [[Tesla Engine]]. An alternative engine that [[Engineering]] can build. Also commonly referred to as the &amp;quot;goofball&amp;quot;, so named for the programmer who created it.&lt;br /&gt;
===Testmerge===&lt;br /&gt;
Trying out new features or significant changes usually means temporarily merging that feature into the server in order to gather bug reports and feedback&lt;br /&gt;
===[[Tcomms|Tcomms/Telecomms]]===&lt;br /&gt;
[[Telecommunications]], the room holding servers that allows headsets to work. Does not affect [[Intercom]]s or [[Station Bounced Radio]]s.&lt;br /&gt;
===[[Thermals]]===&lt;br /&gt;
[[Optical Thermal Scanners]]. Green glasses which let you see people through walls and in the dark. The only thing they can&#039;t see through is hiding in closets. Generally not available to the crew.&lt;br /&gt;
===[[Toxins]]===&lt;br /&gt;
That section of the station east of [[Medbay]], better called the [[Research Division]] containing [[Guide to research and development|Research and Development]], [[Xenobiology]], the [[Toxins Lab]] and the [[Research Director]]&#039;s office.&lt;br /&gt;
&lt;br /&gt;
It is very rarely not filled with fire, hot gas, poisonous vapors, blood, acid, foam of all kinds and dangers, or the aftermath of all this destruction.&lt;br /&gt;
===[[Traitor]]===&lt;br /&gt;
Used to refer to the [[Game Mode|mode]] or an actual [[Traitor]] (assigned by the game mode or by admins).&lt;br /&gt;
===TraitorChan===&lt;br /&gt;
Used to refer to the [[Game_Mode#Traitor.2BChangeling|game mode]], a combination of [[Traitor]] and [[Changeling]].&lt;br /&gt;
===Valid/Validhunting===&lt;br /&gt;
Adjective: Someone who can be killed per the [[Rules]], usually on grounds of being a loud traitor. Verb: The act of deliberately seeking out and/or killing a valid individual. An inherently controversial subject.&lt;br /&gt;
===Voice in Your Head===&lt;br /&gt;
A subtle, in-character message from an admin.&lt;br /&gt;
===Vote===&lt;br /&gt;
A command which lets you call a vote to restart the game or change the game mode (which will restart the game anyway), or a request by other players indicating that the command should be typed. Calling votes when an unruined game is in progress for any reason is looked down upon, but it&#039;s not like votes work when the game really is ruined either. All votes are liable to being canceled by admins.&lt;br /&gt;
===VOX===&lt;br /&gt;
The audio announcement system that the [[AI]] will use to &amp;lt;s&amp;gt;curse at&amp;lt;/s&amp;gt; send messages to the crew.&lt;br /&gt;
===WGW===&lt;br /&gt;
The legendary tale of [[Woody&#039;s Got Wood]]. The book obtained from the library. This vile tome is highly forbidden, and someone will eventually print it to spam over the radio any chance they get. Doing so will usually result in a station-wide manhunt, or the admin spawning a Space Carp named &amp;quot;Video Games&amp;quot; outside your hidey hole.&lt;br /&gt;
===[[Wormhole]]===&lt;br /&gt;
A black swirly portal that shows up during the Space-Time Anomaly random event or the verb used when thrown through a wormhole by an aggressor or your own stupidity. Anything coming into contact with a wormhole will be teleported to a random area on or off the station. They can be fairly dangerous or cause temporary blockades. Not to be confused with portals made from the Handheld Teleporter, which are blue or (more rarely) orange.&lt;br /&gt;
===[[Xeno]]===&lt;br /&gt;
Can refer to [[Aliens]], or [[Xenobiology]].&lt;br /&gt;
===[[Wizard]]===&lt;br /&gt;
Usually refers to the [[Wizard]] game mode, or a Wizard player who has access to a number of spells and will probably wreck your shit on sight or die in the first 12 seconds of a Wizard game.&lt;br /&gt;
===Z-Level===&lt;br /&gt;
Another area/map which the game consists of. Gameplay-wise, it&#039;s just a level.&lt;br /&gt;
&lt;br /&gt;
Z-levels are areas you randomly spawn into when you go over the edge of an area. Part of BYOND&#039;s functionality. For example, the station, DJ station, Central Command and the [[Derelict]] are all on different Z-levels.&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Frequently_Asked_Questions&amp;diff=36423</id>
		<title>Frequently Asked Questions</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Frequently_Asked_Questions&amp;diff=36423"/>
		<updated>2023-03-29T03:22:24Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Remove game resources category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[What is SS13]] ==&lt;br /&gt;
Space Station 13 is a 2D multiplayer game, made on the BYOND engine. At a glance it looks like crap, but give it a few rounds and you&#039;ll realize just how frustratingly fun it can be.&lt;br /&gt;
== I&#039;m new, where do I learn how to play? ==&lt;br /&gt;
Check the [[New Players]] and [[Starter guide]] pages.&lt;br /&gt;
== What does this word mean? ==&lt;br /&gt;
Check the [[Terminology]], you might find it there. Otherwise ask [[Talk:Frequently Asked Questions|here]].&lt;br /&gt;
== I read all the tutorials but don&#039;t know how to... ==&lt;br /&gt;
If it&#039;s something job specific you should check the [[Jobs]] page, if it&#039;s something about game modes (Traitor, Wizard, Cult), see the [[Game modes]] page, otherwise do a search on the wiki.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re smart and have already done all of those before coming here, then just [[adminhelp]] (press F1 or just type &#039;adminhelp&#039; and your message) it in-game. Simply click the on adminhelp where the verbs are listed or type it into the text box in the bottom, click it and write the question in there. Try to be polite, it doesn&#039;t hurt anyone. You can also ask on [[Community|IRC]].&lt;br /&gt;
== I grabbed someone, how do I drop them? ==&lt;br /&gt;
Hit the &#039;stop pulling&#039; command button. It appears when you are grabbing something and disappears when you aren&#039;t. See [[Keyboard_Shortcuts|Keyboard Shortcuts]].&lt;br /&gt;
== How do I remove the backpack, utility belt, etc? ==&lt;br /&gt;
You click on it and drag it to your empty hand.&lt;br /&gt;
== I&#039;m being attacked by another player. What do? ==&lt;br /&gt;
You are either the victim of a traitor/some other round related character, you&#039;ve really pissed the person off, or you&#039;re being griefed for no reason. If you&#039;re not sure about why you&#039;re being attacked. [[Adminhelp]] (press F1 or just type &#039;adminhelp&#039; and your message) it. To reply to the administrator that responds, click the underlined portion of the message, and enter your response. Action will be taken on the matter, and the admins will look into the situation.&lt;br /&gt;
== How do I give an item to someone / pickpocket / dress someone up? ==&lt;br /&gt;
Stand next to them, click &amp;amp; drag their character onto yours, a list of their stuff appears, click on one of their items to take it off. Or, if you have an item in your active hand, click on the slot where you wish to put the item.&lt;br /&gt;
== How do I commit suicide? ==&lt;br /&gt;
Press &amp;quot;tab&amp;quot; until the bottom bar is red (means hotkey mode is disabled). Type &#039;suicide&#039; in that red bar and hit enter. You will get a &amp;quot;yes or no&amp;quot; prompt. Clicking &amp;quot;yes&amp;quot; will make you commit suicide with the item in your activate hand. Remember that you cannot be cloned if you suicide! Suicide is considered an action which says that you don&#039;t want to play this round anymore. As such it is an [[Out of Character|OOC]] action.&lt;br /&gt;
== How do I eat something? ==&lt;br /&gt;
As with most items, pick up the food with an empty hand and then click on your character. Make sure you&#039;re on &amp;quot;Help Intent&amp;quot; other wise you might end up smashing yourself with food.&lt;br /&gt;
Also if you are wearing a mask (internals, gas mask etc) you will have to remove it before you can eat.&lt;br /&gt;
== How do I buckle/unbuckle on a chair? ==&lt;br /&gt;
Click and drag your character onto the chair. To unbuckle, click on the chair you are buckled to with an empty hand or &amp;quot;[[Keyboard_Shortcuts|resist]]&amp;quot;. A HUD icon of a chair is also clickable to make you unbuckle. You unbuckle others by clicking the object they are buckled to.&lt;br /&gt;
== Why can&#039;t I play as some jobs? ==&lt;br /&gt;
New players are forbidden from taking jobs with are vital to normal round progression until they&#039;ve been on the server for long enough. This is to avoid an inexperienced player choosing to be the Captain or AI and messing up the round for everyone.&lt;br /&gt;
== I got chosen as a traitor, cultist, wizard, etc. and I know I&#039;m not ready! HELP! ==&lt;br /&gt;
None of these require your immediate attention. Take it slowly, open the wiki, skim through the article about your assignment and proceed to do it as best as you can. If you need additional help, ask an admin for advice through adminhelp (press F1 or just type &#039;adminhelp&#039; and your message).&lt;br /&gt;
== Where can I go to get map files to host a server? ==&lt;br /&gt;
See here [[Downloading the source code]] or click the &#039;Host a server&#039; link on the left.&lt;br /&gt;
== I have another question, where do I ask? ==&lt;br /&gt;
You can adminhelp it (press F1 or just type &#039;adminhelp&#039; and your message) in-game, or use the OOC-command in-game to talk to players about general questions (but don&#039;t talk in OOC about anything going on in current round), or ask in the [https://tgstation13.org/phpBB/viewforum.php?f=60 discord] &amp;quot;help&amp;quot; channel, or on the [https://tgstation13.org/phpBB/ forums].&lt;br /&gt;
== Is BYOND/SS13 Ressources or Network intensive ? I can&#039;t seem to connect to the servers from Europe, with a recent computer. ==&lt;br /&gt;
When you first connect, you need to download the 30MB or so resource file from the server. This is the bulk of network activity and can take a while. Once downloaded, the game does not take much network to run. In terms of PC performance, byond itself is mostly just a front-end to the game with very little work being done on it, so you should be able to run SS13 on essentially any computer made in this millennium. It is however very resource intensive on the server side, generally requiring a full modern CPU core to itself. This is however only important if you wish to run your own server. See this thread for more help on the connecting issue: [https://tgstation13.org/phpBB/viewtopic.php?f=2&amp;amp;t=3678&amp;amp;p=90057#p90040 Unable to Connect]. Make a post if you aren&#039;t able to connect.&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Job_selection_and_assignment&amp;diff=36422</id>
		<title>Job selection and assignment</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Job_selection_and_assignment&amp;diff=36422"/>
		<updated>2023-03-29T03:22:10Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Remove game resources category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Speech&lt;br /&gt;
|name=Maximilian Vanderbilt, the CentCom Official&lt;br /&gt;
|text=NanoTrasen Central Command has selected your job assignment for this shift. I hope you are happy with what you have been so graciously provided with, &#039;cause you&#039;re gonna be here awhile.&lt;br /&gt;
|image=[[File:Centcomofficial.png|64px|right]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Preference Ranks ==&lt;br /&gt;
In the job selection window of your character setup you can select how much you would like to play as a job.&lt;br /&gt;
&lt;br /&gt;
There are six levels of priority:&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;[High]&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;[Medium]&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:yellow&amp;quot;&amp;gt;[Low]&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;[Never]&amp;lt;/span&amp;gt;&lt;br /&gt;
*Banned&lt;br /&gt;
*Young&lt;br /&gt;
You can only select one job as &#039;&#039;&#039;high&#039;&#039;&#039;, the other ranks do not have limits. Banned is shown to players who were banned from playing the job (received a job ban). Players who are job banned cannot spawn as that job, they can however appeal the job ban on the [[Community|forums]]. Jobs a player is banned from will show as [BANNED] no matter if it&#039;s a temporary job ban of a permanent one. Jobs the player is too young to play are jobs, which require a player to have played a certain number of days as other roles, before they are unlocked. Security jobs, head positions and silicon positions are usually the jobs that have this enabled. A [IN x DAYS] message will appear if you are too young to play a certain job, indicating how many more days need to pass before you can spawn as that job. You can still get the job by visiting the [[Head of Personnel]] though, or by being [[Cyborg|borged]] or stuffed into an [[AI]]. Finally, [NON-HUMAN] will appear by some jobs if your character is a [[lizardperson]], as lizards are prohibited from taking [[Head of Staff]] roles.&lt;br /&gt;
== Antagonist Assignment ==&lt;br /&gt;
Before jobs are assigned, the game will decide who the round antagonists are. A player who would normally have spawned as Security will spawn as a different job instead if they are selected as Antagonist. &lt;br /&gt;
&lt;br /&gt;
This means you can have Security jobs on HIGH without having to worry about never getting antagonist roles.&lt;br /&gt;
== How Jobs are Assigned ==&lt;br /&gt;
Once the game is about to start, jobs are assigned to players.&lt;br /&gt;
=== Pre-emptive Assignment ===&lt;br /&gt;
*Assistants are assigned&lt;br /&gt;
*One head is selected&lt;br /&gt;
*The AI is selected&lt;br /&gt;
=== High Selection ===&lt;br /&gt;
Loops through a list of all players (randomized), if the player has a job set to high, and it has open slots, they receive it.&lt;br /&gt;
=== Middle Selection ===&lt;br /&gt;
Loops through a list of the remaining players, if the player has a job set to medium, he receives it.&lt;br /&gt;
=== Low Selection ===&lt;br /&gt;
Loops through a list of the remaining players, if the player has a job set to low, he receives it.&lt;br /&gt;
=== Post Selection ===&lt;br /&gt;
Any player who was not assigned a job spawns as a random job from the (probably small) pool of remaining empty jobs. This depends on what they selected in their character setup&#039;s occupation page (there is a toggle at the bottom).&lt;br /&gt;
== Tips for Job Selection ==&lt;br /&gt;
As you can see, people who have a job set to high are far, far more likely to get the job, since if there is only one slot available for a job - like [[Head of Security|HoS]] - and there is one person who sets that job to high and 20 people who set it to medium, the one person who set it to high will always get the job.&lt;br /&gt;
*Have your favorite job set to high, if you have two favorites or more, set one of them to high, do not have all three set to medium as you will very likely not get them - especially if the jobs have very few slots available.&lt;br /&gt;
== Available Slots ==&lt;br /&gt;
This is a list of the number of slots available on station. This does not count reassignments done by the [[Head of Personnel]]. The [[AI]] and [[Cyborg]] cannot be late-joiners. The default player age restriction is shown in brackets (restrictions don&#039;t apply for all servers).&lt;br /&gt;
* [[Assistant]]: 5 (Unlimited if no other jobs are available, anyone who sets their role to Assistant in preferences is guaranteed the role if the round is just starting)&lt;br /&gt;
* [[Bartender]]: 1&lt;br /&gt;
* [[Chef]]: 1&lt;br /&gt;
* [[Botanist]]: 3&lt;br /&gt;
* [[Quartermaster]]: 1&lt;br /&gt;
* [[Cargo Technician]]: 2&lt;br /&gt;
* [[Shaft Miner]]: 3&lt;br /&gt;
* [[Clown]]: 1&lt;br /&gt;
* [[Mime]]: 1&lt;br /&gt;
* [[Janitor]]: 1&lt;br /&gt;
* [[Curator]]: 1&lt;br /&gt;
* [[Lawyer]]: 2&lt;br /&gt;
* [[Chaplain]]: 1&lt;br /&gt;
* [[Station Engineer]]: 5&lt;br /&gt;
* [[Atmospheric Technician]]: 3&lt;br /&gt;
* [[Roboticist]]: 2&lt;br /&gt;
* [[Medical Doctor]]: 5&lt;br /&gt;
* [[Chemist]]: 2&lt;br /&gt;
* [[Geneticist]]: 2&lt;br /&gt;
* [[Virologist]]: 1&lt;br /&gt;
* [[Scientist]]: 5&lt;br /&gt;
* [[Warden]]: 1 (min 7 day player age)&lt;br /&gt;
* [[Detective]]: 1 (min 7 day player age)&lt;br /&gt;
* [[Security Officer]]: Scales with population; Minimum 5 (min 7 day player age)&lt;br /&gt;
* [[Chief Medical Officer]]: 1 (min 7 day player age)&lt;br /&gt;
* [[Chief Engineer]]: 1 (min 7 day player age)&lt;br /&gt;
* [[Research Director]]: 1 (min 7 day player age)&lt;br /&gt;
* [[Head of Personnel]]: 1 (min 10 day player age)&lt;br /&gt;
* [[Head of Security]]: 1 (min 14 day player age)&lt;br /&gt;
* [[Captain]]: 1 (min 14 day player age)&lt;br /&gt;
* [[Cyborg]]: 1 (available at round start only) (min 21 day player age)&lt;br /&gt;
* [[AI]]: 1 (available at round start only) (min 30 day player age)&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36421</id>
		<title>Guide to git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36421"/>
		<updated>2023-03-29T03:20:37Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Add Map Merger page link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;git-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Git Command Line =&lt;br /&gt;
Many are drawn to GUI versions of Git, such as GitHub Desktop, GitKraken, and VSCode’s Git integration. However, I believe this is more of a hindrance than a help. If you’re just making mapping or sprite PRs, sure, maybe you can get along just fine with GitHub Desktop. However, these tools lack the expansive features of the command line and are harder to get help with. Command line is far more google-able if you have problems and I highly recommend it. Far more people will be able to assist you if you are using command line than an GUI tool.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-setup&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== The Setup ==&lt;br /&gt;
Download and install [[git:|git-scm]]. You should probably set it up to use the shell of your choice (I use command line on Windows Terminal), or if you prefer Git Bash, use that. Do note that installing it to your system PATH is very useful if you want to use VSCode’s builtin terminal.&lt;br /&gt;
&lt;br /&gt;
Also be sure to set your name/email in your git client so your commits show properly and are attributed properly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;amp;quot;Name Here&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;git config --global user.email &amp;amp;quot;[/cdn-cgi/l/email-protection &amp;lt;nowiki&amp;gt;[email protected]&amp;lt;/nowiki&amp;gt;]&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Often times the default can expose personal information. So be &#039;&#039;sure&#039;&#039; to set this.&lt;br /&gt;
&lt;br /&gt;
Name can just be your GitHub username or something else, doesn’t matter.&lt;br /&gt;
&lt;br /&gt;
As long as the email you put is added to your GitHub account it will work fine and show your icon on commits. GitHub will also provide you with a private email, if you don&#039;t have any type of &amp;quot;business&amp;quot; email, it is recommended to use this.&lt;br /&gt;
&lt;br /&gt;
For more details on commit email privacy, read [https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address GitHub&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-terms-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Terms Cheat-Sheet ==&lt;br /&gt;
&#039;&#039;&#039;HEAD:&#039;&#039;&#039; Term for the current location on the “commit tree”, basically your current location in history.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Detached HEAD:&#039;&#039;&#039; A state the client can be in, where the history is at a specific point in time, but not attached to a branch. Committing changes is not possible unless the HEAD is re-attached by checking out a branch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Staging:&#039;&#039;&#039; an in-between state of your local filesystem and a commit. This is so you can have some changes locally but not commit all of them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Commit:&#039;&#039;&#039; a collection of changes, applied as a “patch” onto the previous (parent) commit. Think of it as a chain link that contains a snapshot of the repository at that time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Branch:&#039;&#039;&#039; A collection of commits in one big chain, that can split off at any time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Merge:&#039;&#039;&#039; Joining two branches&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remote:&#039;&#039;&#039; A secondary git repository to sync changes with, usually GitHub but can be any server that supports the protocol&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Upstream:&#039;&#039;&#039; The remote that you are pulling from/pushing to, in that case your fork OR the main beestation repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-commands-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Commands Cheat-Sheet ==&lt;br /&gt;
&amp;lt;code&amp;gt;git clone (github link)&amp;lt;/code&amp;gt; downloads the linked repository into a folder at the current location.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull remotename branchname&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; and then &amp;lt;code&amp;gt;git merge remotename/branchname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; gets all the new commits from remote&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merging-strategies&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Merging Strategies ===&lt;br /&gt;
&amp;lt;code&amp;gt;git merge branchname&amp;lt;/code&amp;gt; Attempts to merge all new commits from branchname into the current HEAD, through a few strategies that vary:&lt;br /&gt;
* Fast-forward - Simple, used when the new changes are directly on top of, as in, have a continous history rooting from the current HEAD. For example, if someone pushed one commit to origin/master, and your local master didn’t have this one commit, it can simply be “fast forwarded” and add the new commit on the end&lt;br /&gt;
* Recursive: the normal strategy, it tries to put both the local changes AND the remote changes into one branch by adding the commits in what is called a “merge commit”&lt;br /&gt;
* Rebase: this is its own command, &amp;lt;code&amp;gt;git rebase branchname&amp;lt;/code&amp;gt; This attempts to take all of your LOCAL changes, and then append them to the end of the REMOTE branch, rather than putting the remote branch into your current one. This is personally my favorite for PRs because it makes a clean commit history, but it also “rewrites” all your commits into new ones, so it’s not suitable for branches used by multiple people because it doesn’t maintain the commit tree&lt;br /&gt;
&amp;lt;code&amp;gt;git reset commitsha (or branchname)&amp;lt;/code&amp;gt; - Sets the current HEAD to the commit listed OR the branchname listed. If you specify –hard, it will update the local filesystem to match this, if you don’t specify or put –soft, it only updates this in git, keeping your file changes intact&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout commitsha (or branchname)&amp;lt;/code&amp;gt; - For commits, this will “rewind” you to that commit and also “detaches HEAD”, which basically means you are no longer on a branch and can’t commit stuff. A temporary rewind, essentially. When you check out a branch, it’s basically just moving you to that branch. Do this for new PRs etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch (branchname)&amp;lt;/code&amp;gt; creates a new branch with the current commit history of the branch you are on&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch -d (branchname)&amp;lt;/code&amp;gt; deletes branch with said name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt; adds the file to “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git restore --staged (filepath)&amp;lt;/code&amp;gt; removes the file from “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; View what is staged, what is not, also view what branch/commit you are on. VERY useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt; Add ALL local filesystem changes to staging&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- .&amp;lt;/code&amp;gt; Undo all local changes, get rid of them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD .&amp;lt;/code&amp;gt; The same as above but stricter, if it doesn’t work&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (or --) filepath&amp;lt;/code&amp;gt; resets that file to the last commit on your filesystem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Commit message&amp;amp;quot;&amp;lt;/code&amp;gt; creates a commit with the current staged changes and adds it to the branch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push remotename branchname&amp;lt;/code&amp;gt; pushes the current local branch to remotename/branchname&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add (remotename) (github link)&amp;lt;/code&amp;gt; creates a remotename with a github repo so you can push/pull from it&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u remotename branchname&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;git pull --set-upstream remotename branchname&amp;lt;/code&amp;gt; sets the route from your CURRENT local branch to a remote branch. This makes it so you can just type &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; without having to specify the remote or branch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git reset HEAD~(number)&amp;lt;/code&amp;gt; resets current HEAD X commits backwards in the commit history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD~(number)&amp;lt;/code&amp;gt; temporarily rewinds and detaches HEAD X commits back in history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; show the commit history (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git diff HEAD&amp;lt;/code&amp;gt; show all the changes you have made locally that are not committed (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merge-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Merge Conflicts ==&lt;br /&gt;
Merge conflicts can look intimidating, but they aren’t in reality (unless you don’t know how to code).&lt;br /&gt;
&lt;br /&gt;
When two commits change the same part of the same file, git tries to merge them, but can’t, since it would probably break the code if it guessed.&lt;br /&gt;
&lt;br /&gt;
Instead, it lets you do it yourself.&lt;br /&gt;
&lt;br /&gt;
It writes into the file what looks like this&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
(version before merge)&lt;br /&gt;
=================&lt;br /&gt;
(new version)&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&amp;lt;/pre&amp;gt;&lt;br /&gt;
It usually does that multiple times per file. Basically compare the two, remove the markers and write the file back how it should be if both were merged into one.&lt;br /&gt;
&lt;br /&gt;
Here is an example.&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
    if(variable?.test())&lt;br /&gt;
=================&lt;br /&gt;
    if(the_variable.test()&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
This would most likely be merged into this:&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
    if(the_variable?.test()&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
The inferred history here is the variable was named &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt;, and the current branch changed it to &amp;lt;code&amp;gt;the_variable&amp;lt;/code&amp;gt;. However, another branch added the &amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; operator to the proccall. When this change was merged in, Git noticed an unexpected change to the variable name and placed a merge conflict. Making sense now? The way to merge it is applying both changes as intended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mapping-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mapping Conflicts ===&lt;br /&gt;
DMM files are impossible to merge via text, so we have tooling in the repository to automatically merge them.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/mapmerge2/Resolve Map Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there are any conflicting tiles, you will be prompted to fix it in your map editor, then you can continue by committing the changes.&lt;br /&gt;
&lt;br /&gt;
For more info, see [[Map Merger]].&lt;br /&gt;
=== Icon Conflicts ===&lt;br /&gt;
DMI files contain multiple images, making merge conflicts &#039;&#039;always&#039;&#039; happen if the file is updated by two branches. This means solving them is relatively trivial but can be time consuming. So there’s a tool for it.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/dmi/Resolve Icon Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;automatic-merge-conflict-resolution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Automatic Merge Conflict Resolution ===&lt;br /&gt;
Also, perk of using command line, if you want git to &#039;&#039;&#039;AUTO MERGE DMI and DMM&#039;&#039;&#039;, as well as auto-cleanup your maps on commit, just run &amp;lt;code&amp;gt;tools/hooks/Install&amp;lt;/code&amp;gt;. No need to run them manually anymore, they will run automatically if you merge or commit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-a-basic-pr-with-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Making a basic PR with command line ==&lt;br /&gt;
First, you’ll need to clone the repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone &amp;lt;nowiki&amp;gt;https://github.com/BeeStation/BeeStation-Hornet/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, change directories into the repository with &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You will now need to create a branch for your changes, using the master branch for PRs is bad practice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the branch is created, but you need to “check it out”, or switch to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make any changes in VSCode. When you’re done, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice what files now have “unstaged changes”. Any files you do NOT want changes in, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (filepath)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will delete unwanted changes on your local filesystem.&lt;br /&gt;
&lt;br /&gt;
Any files you DO want to PR changes to, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt;, or if you want to add all files, use &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; as the filepath.&lt;br /&gt;
&lt;br /&gt;
Now run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;, and confirm all the changes you want are staged.&lt;br /&gt;
&lt;br /&gt;
Now you’re ready to commit. Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Put a summary of your changes here&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a commit and add it to the current branch. Run &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; to see the commit history. You can exit with &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; and navigate with arrows.&lt;br /&gt;
&lt;br /&gt;
That worked, so now you just need to push the changes to your fork of the repository. So go on GitHub and press the fork button on the top right of BeeStation-Hornet, and you’ll be taken to your new fork repository. You need to add this as a remote on your local client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add fork &amp;lt;nowiki&amp;gt;https://github.com/(your&amp;lt;/nowiki&amp;gt; GitHub username)/BeeStation-Hornet/&amp;lt;/code&amp;gt; (change this to your fork’s link)&lt;br /&gt;
&lt;br /&gt;
Then, you can push to a branch on your fork.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u fork my-pr-that-does-something&amp;lt;/code&amp;gt; - The &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; here tells Git to save that this is the path to remote. This means that when you run &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; without passing a remote or branchname, it will know where to push the next time. The same applies to &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Done! Now go to your fork on GitHub and refresh, you’ll see something like “changes have recently been pushed to branch my-pr-that-does-something” with a big “Open pull request” button. Press that and make sure it’s going to the main repository. You can also do this manually from the Pull Requests tab on your fork.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Map_Merger&amp;diff=36420</id>
		<title>Map Merger</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Map_Merger&amp;diff=36420"/>
		<updated>2023-03-29T03:19:29Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Latest from TG (Licensed CC-BY-NC-SA 4.0)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;BeeStation uses a tool called the &#039;&#039;&#039;Map Merger&#039;&#039;&#039; to make map changes easier for maintainers to review and less likely to conflict with map changes made by others.&lt;br /&gt;
&lt;br /&gt;
There are a few ways of running the tool. If you have trouble or need help, ask in the Discord.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary&#039;&#039;&#039;: for best results, open the &amp;lt;code&amp;gt;tools/hooks/&amp;lt;/code&amp;gt; folder and double-click &amp;lt;code&amp;gt;Install.bat&amp;lt;/code&amp;gt; to install the hooks, which will handle things automatically.&lt;br /&gt;
==TGM format conversion ==&lt;br /&gt;
The &amp;quot;map merge&amp;quot; operation describes the process of converting a map file written by the DreamMaker map editor to:&lt;br /&gt;
#Use a format more amenable to Git&#039;s conflict resolution, called &amp;quot;TGM&amp;quot; and originally developed by Remie. The TGM map format is like the standard Dream Maker map format, but arranged differently, meaning Dream Maker is able to open TGM maps.&lt;br /&gt;
#Keep the size of the difference between the old version and the new version of the map as small as possible.&lt;br /&gt;
This is accomplished by referencing the changed version of the map against the old version stored in the Git history.&lt;br /&gt;
=== Use as a Git hook (recommended)===&lt;br /&gt;
#&#039;&#039;&#039;Install the hook&#039;&#039;&#039;: Open the &amp;lt;code&amp;gt;tools/hooks/&amp;lt;/code&amp;gt; folder and double-click &amp;lt;code&amp;gt;Install.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
#*Linux users: run &amp;lt;code&amp;gt;tools/hooks/install.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
Once complete, the map merger will run &#039;&#039;&#039;automatically&#039;&#039;&#039; every time you commit in Git. The console log can be reviewed if there are any errors.&lt;br /&gt;
===Or: Run manually before committing===&lt;br /&gt;
You can also manually run a .bat file just before each time you commit:&lt;br /&gt;
#Ensure you have saved all your changes&lt;br /&gt;
#Open the &amp;lt;code&amp;gt;tools/mapmerge2/&amp;lt;/code&amp;gt; folder and double-click &amp;lt;code&amp;gt;Run Before Committing.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
#Commit&lt;br /&gt;
===If you forgot to map merge===&lt;br /&gt;
For first-time contributors who committed map edits without map merging, a script is available to automatically commit a fix to your PR branch:&lt;br /&gt;
#Ensure you have no unsaved changes&lt;br /&gt;
# Open the &amp;lt;code&amp;gt;tools/mapmerge2/&amp;lt;/code&amp;gt; folder and double-click &amp;lt;code&amp;gt;I Forgot To Map Merge.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
#Push your branch&lt;br /&gt;
==Automatic conflict resolver==&lt;br /&gt;
We also have a rudimentary conflict resolver to cover some cases that the TGM conversion couldn&#039;t prevent.&lt;br /&gt;
&lt;br /&gt;
When run, the console output will indicate whether further manual action is needed, including conflicting coordinates.&lt;br /&gt;
=== Use as a Git hook===&lt;br /&gt;
#&#039;&#039;&#039;Install the hook&#039;&#039;&#039;: Open the &amp;lt;code&amp;gt;tools/hooks/&amp;lt;/code&amp;gt; folder and double-click &amp;lt;code&amp;gt;Install.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
#*Linux users: run &amp;lt;code&amp;gt;tools/hooks/install.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
Once complete, the conflict resolver will run &#039;&#039;&#039;automatically&#039;&#039;&#039; every time you merge in Git.&lt;br /&gt;
===Or: Resolve conflicts on an in-progress merge===&lt;br /&gt;
If you are using a Git GUI which does not run the hook on merge, you can also run the conflict resolver on an in-progress merge by request:&lt;br /&gt;
#Open the &amp;lt;code&amp;gt;tools/mapmerge2/&amp;lt;/code&amp;gt; folder and double-click &amp;lt;code&amp;gt;Resolve Map Conflicts.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
#*Linux users: run &amp;lt;code&amp;gt;tools/hooks/dmm.merge --posthoc&amp;lt;/code&amp;gt;&lt;br /&gt;
Note that to use this, you must merge your updated local master branch into the branch with conflicts so that your Git GUI reports a conflict on the map file.&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36418</id>
		<title>Guide to git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36418"/>
		<updated>2023-03-29T02:50:39Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* The Setup */ Email privacy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;git-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Git Command Line =&lt;br /&gt;
Many are drawn to GUI versions of Git, such as GitHub Desktop, GitKraken, and VSCode’s Git integration. However, I believe this is more of a hindrance than a help. If you’re just making mapping or sprite PRs, sure, maybe you can get along just fine with GitHub Desktop. However, these tools lack the expansive features of the command line and are harder to get help with. Command line is far more google-able if you have problems and I highly recommend it. Far more people will be able to assist you if you are using command line than an GUI tool.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-setup&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== The Setup ==&lt;br /&gt;
Download and install [[git:|git-scm]]. You should probably set it up to use the shell of your choice (I use command line on Windows Terminal), or if you prefer Git Bash, use that. Do note that installing it to your system PATH is very useful if you want to use VSCode’s builtin terminal.&lt;br /&gt;
&lt;br /&gt;
Also be sure to set your name/email in your git client so your commits show properly and are attributed properly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;amp;quot;Name Here&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;git config --global user.email &amp;amp;quot;youremail@example.com&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Often times the default can expose personal information. So be &#039;&#039;sure&#039;&#039; to set this.&lt;br /&gt;
&lt;br /&gt;
Name can just be your GitHub username or something else, doesn’t matter.&lt;br /&gt;
&lt;br /&gt;
As long as the email you put is added to your GitHub account it will work fine and show your icon on commits. GitHub will also provide you with a private email, if you don&#039;t have any type of &amp;quot;business&amp;quot; email, it is recommended to use this.&lt;br /&gt;
&lt;br /&gt;
For more details on commit email privacy, read [https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address GitHub&#039;s guide].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-terms-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Git Terms Cheat-Sheet ==&lt;br /&gt;
&#039;&#039;&#039;HEAD:&#039;&#039;&#039; Term for the current location on the “commit tree”, basically your current location in history.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Detached HEAD:&#039;&#039;&#039; A state the client can be in, where the history is at a specific point in time, but not attached to a branch. Committing changes is not possible unless the HEAD is re-attached by checking out a branch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Staging:&#039;&#039;&#039; an in-between state of your local filesystem and a commit. This is so you can have some changes locally but not commit all of them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Commit:&#039;&#039;&#039; a collection of changes, applied as a “patch” onto the previous (parent) commit. Think of it as a chain link that contains a snapshot of the repository at that time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Branch:&#039;&#039;&#039; A collection of commits in one big chain, that can split off at any time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Merge:&#039;&#039;&#039; Joining two branches&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remote:&#039;&#039;&#039; A secondary git repository to sync changes with, usually GitHub but can be any server that supports the protocol&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Upstream:&#039;&#039;&#039; The remote that you are pulling from/pushing to, in that case your fork OR the main beestation repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-commands-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Commands Cheat-Sheet ==&lt;br /&gt;
&amp;lt;code&amp;gt;git clone (github link)&amp;lt;/code&amp;gt; downloads the linked repository into a folder at the current location.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull remotename branchname&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; and then &amp;lt;code&amp;gt;git merge remotename/branchname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; gets all the new commits from remote&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merging-strategies&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Merging Strategies ===&lt;br /&gt;
&amp;lt;code&amp;gt;git merge branchname&amp;lt;/code&amp;gt; Attempts to merge all new commits from branchname into the current HEAD, through a few strategies that vary:&lt;br /&gt;
* Fast-forward - Simple, used when the new changes are directly on top of, as in, have a continous history rooting from the current HEAD. For example, if someone pushed one commit to origin/master, and your local master didn’t have this one commit, it can simply be “fast forwarded” and add the new commit on the end&lt;br /&gt;
* Recursive: the normal strategy, it tries to put both the local changes AND the remote changes into one branch by adding the commits in what is called a “merge commit”&lt;br /&gt;
* Rebase: this is its own command, &amp;lt;code&amp;gt;git rebase branchname&amp;lt;/code&amp;gt; This attempts to take all of your LOCAL changes, and then append them to the end of the REMOTE branch, rather than putting the remote branch into your current one. This is personally my favorite for PRs because it makes a clean commit history, but it also “rewrites” all your commits into new ones, so it’s not suitable for branches used by multiple people because it doesn’t maintain the commit tree&lt;br /&gt;
&amp;lt;code&amp;gt;git reset commitsha (or branchname)&amp;lt;/code&amp;gt; - Sets the current HEAD to the commit listed OR the branchname listed. If you specify –hard, it will update the local filesystem to match this, if you don’t specify or put –soft, it only updates this in git, keeping your file changes intact&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout commitsha (or branchname)&amp;lt;/code&amp;gt; - For commits, this will “rewind” you to that commit and also “detaches HEAD”, which basically means you are no longer on a branch and can’t commit stuff. A temporary rewind, essentially. When you check out a branch, it’s basically just moving you to that branch. Do this for new PRs etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch (branchname)&amp;lt;/code&amp;gt; creates a new branch with the current commit history of the branch you are on&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch -d (branchname)&amp;lt;/code&amp;gt; deletes branch with said name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt; adds the file to “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git restore --staged (filepath)&amp;lt;/code&amp;gt; removes the file from “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; View what is staged, what is not, also view what branch/commit you are on. VERY useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt; Add ALL local filesystem changes to staging&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- .&amp;lt;/code&amp;gt; Undo all local changes, get rid of them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD .&amp;lt;/code&amp;gt; The same as above but stricter, if it doesn’t work&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (or --) filepath&amp;lt;/code&amp;gt; resets that file to the last commit on your filesystem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Commit message&amp;amp;quot;&amp;lt;/code&amp;gt; creates a commit with the current staged changes and adds it to the branch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push remotename branchname&amp;lt;/code&amp;gt; pushes the current local branch to remotename/branchname&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add (remotename) (github link)&amp;lt;/code&amp;gt; creates a remotename with a github repo so you can push/pull from it&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u remotename branchname&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;git pull --set-upstream remotename branchname&amp;lt;/code&amp;gt; sets the route from your CURRENT local branch to a remote branch. This makes it so you can just type &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; without having to specify the remote or branch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git reset HEAD~(number)&amp;lt;/code&amp;gt; resets current HEAD X commits backwards in the commit history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD~(number)&amp;lt;/code&amp;gt; temporarily rewinds and detaches HEAD X commits back in history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; show the commit history (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git diff HEAD&amp;lt;/code&amp;gt; show all the changes you have made locally that are not committed (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merge-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Merge Conflicts ==&lt;br /&gt;
Merge conflicts can look intimidating, but they aren’t in reality (unless you don’t know how to code).&lt;br /&gt;
&lt;br /&gt;
When two commits change the same part of the same file, git tries to merge them, but can’t, since it would probably break the code if it guessed.&lt;br /&gt;
&lt;br /&gt;
Instead, it lets you do it yourself.&lt;br /&gt;
&lt;br /&gt;
It writes into the file what looks like this&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
(version before merge)&lt;br /&gt;
=================&lt;br /&gt;
(new version)&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&amp;lt;/pre&amp;gt;&lt;br /&gt;
It usually does that multiple times per file. Basically compare the two, remove the markers and write the file back how it should be if both were merged into one.&lt;br /&gt;
&lt;br /&gt;
Here is an example.&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
    if(variable?.test())&lt;br /&gt;
=================&lt;br /&gt;
    if(the_variable.test()&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
This would most likely be merged into this:&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
    if(the_variable?.test()&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
The inferred history here is the variable was named &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt;, and the current branch changed it to &amp;lt;code&amp;gt;the_variable&amp;lt;/code&amp;gt;. However, another branch added the &amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; operator to the proccall. When this change was merged in, Git noticed an unexpected change to the variable name and placed a merge conflict. Making sense now? The way to merge it is applying both changes as intended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mapping-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mapping Conflicts ===&lt;br /&gt;
DMM files are impossible to merge via text, so we have tooling in the repository to automatically merge them.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/mapmerge2/Resolve Map Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there are any conflicting tiles, you will be prompted to fix it in your map editor, then you can continue by committing the changes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;icon-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Icon Conflicts ===&lt;br /&gt;
DMI files contain multiple images, making merge conflicts &#039;&#039;always&#039;&#039; happen if the file is updated by two branches. This means solving them is relatively trivial but can be time consuming. So there’s a tool for it.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/dmi/Resolve Icon Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;automatic-merge-conflict-resolution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Automatic Merge Conflict Resolution ===&lt;br /&gt;
Also, perk of using command line, if you want git to &#039;&#039;&#039;AUTO MERGE DMI and DMM&#039;&#039;&#039;, as well as auto-cleanup your maps on commit, just run &amp;lt;code&amp;gt;tools/hooks/Install&amp;lt;/code&amp;gt;. No need to run them manually anymore, they will run automatically if you merge or commit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-a-basic-pr-with-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Making a basic PR with command line ==&lt;br /&gt;
First, you’ll need to clone the repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone &amp;lt;nowiki&amp;gt;https://github.com/BeeStation/BeeStation-Hornet/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, change directories into the repository with &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You will now need to create a branch for your changes, using the master branch for PRs is bad practice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the branch is created, but you need to “check it out”, or switch to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make any changes in VSCode. When you’re done, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice what files now have “unstaged changes”. Any files you do NOT want changes in, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (filepath)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will delete unwanted changes on your local filesystem.&lt;br /&gt;
&lt;br /&gt;
Any files you DO want to PR changes to, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt;, or if you want to add all files, use &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; as the filepath.&lt;br /&gt;
&lt;br /&gt;
Now run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;, and confirm all the changes you want are staged.&lt;br /&gt;
&lt;br /&gt;
Now you’re ready to commit. Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Put a summary of your changes here&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a commit and add it to the current branch. Run &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; to see the commit history. You can exit with &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; and navigate with arrows.&lt;br /&gt;
&lt;br /&gt;
That worked, so now you just need to push the changes to your fork of the repository. So go on GitHub and press the fork button on the top right of BeeStation-Hornet, and you’ll be taken to your new fork repository. You need to add this as a remote on your local client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add fork &amp;lt;nowiki&amp;gt;https://github.com/(your&amp;lt;/nowiki&amp;gt; GitHub username)/BeeStation-Hornet/&amp;lt;/code&amp;gt; (change this to your fork’s link)&lt;br /&gt;
&lt;br /&gt;
Then, you can push to a branch on your fork.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u fork my-pr-that-does-something&amp;lt;/code&amp;gt; - The &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; here tells Git to save that this is the path to remote. This means that when you run &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; without passing a remote or branchname, it will know where to push the next time. The same applies to &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Done! Now go to your fork on GitHub and refresh, you’ll see something like “changes have recently been pushed to branch my-pr-that-does-something” with a big “Open pull request” button. Press that and make sure it’s going to the main repository. You can also do this manually from the Pull Requests tab on your fork.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36417</id>
		<title>Guide to git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36417"/>
		<updated>2023-03-29T02:48:37Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* The Setup */ Email moment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;git-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Git Command Line =&lt;br /&gt;
Many are drawn to GUI versions of Git, such as GitHub Desktop, GitKraken, and VSCode’s Git integration. However, I believe this is more of a hindrance than a help. If you’re just making mapping or sprite PRs, sure, maybe you can get along just fine with GitHub Desktop. However, these tools lack the expansive features of the command line and are harder to get help with. Command line is far more google-able if you have problems and I highly recommend it. Far more people will be able to assist you if you are using command line than an GUI tool.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-setup&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== The Setup ==&lt;br /&gt;
Download and install [[git:|git-scm]]. You should probably set it up to use the shell of your choice (I use command line on Windows Terminal), or if you prefer Git Bash, use that. Do note that installing it to your system PATH is very useful if you want to use VSCode’s builtin terminal.&lt;br /&gt;
&lt;br /&gt;
Also be sure to set your name/email in your git client so your commits show properly and are attributed properly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;amp;quot;Name Here&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;git config --global user.email &amp;amp;quot;youremail@example.com&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Often times the default can expose personal information. So be &#039;&#039;sure&#039;&#039; to set this.&lt;br /&gt;
&lt;br /&gt;
As long as the email you put is added to your GitHub account it will work fine and show your icon on commits. Name can just be your GitHub username or something else, doesn’t matter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-terms-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Git Terms Cheat-Sheet ==&lt;br /&gt;
&#039;&#039;&#039;HEAD:&#039;&#039;&#039; Term for the current location on the “commit tree”, basically your current location in history.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Detached HEAD:&#039;&#039;&#039; A state the client can be in, where the history is at a specific point in time, but not attached to a branch. Committing changes is not possible unless the HEAD is re-attached by checking out a branch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Staging:&#039;&#039;&#039; an in-between state of your local filesystem and a commit. This is so you can have some changes locally but not commit all of them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Commit:&#039;&#039;&#039; a collection of changes, applied as a “patch” onto the previous (parent) commit. Think of it as a chain link that contains a snapshot of the repository at that time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Branch:&#039;&#039;&#039; A collection of commits in one big chain, that can split off at any time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Merge:&#039;&#039;&#039; Joining two branches&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remote:&#039;&#039;&#039; A secondary git repository to sync changes with, usually GitHub but can be any server that supports the protocol&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Upstream:&#039;&#039;&#039; The remote that you are pulling from/pushing to, in that case your fork OR the main beestation repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-commands-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Commands Cheat-Sheet ==&lt;br /&gt;
&amp;lt;code&amp;gt;git clone (github link)&amp;lt;/code&amp;gt; downloads the linked repository into a folder at the current location.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull remotename branchname&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; and then &amp;lt;code&amp;gt;git merge remotename/branchname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; gets all the new commits from remote&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merging-strategies&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Merging Strategies ===&lt;br /&gt;
&amp;lt;code&amp;gt;git merge branchname&amp;lt;/code&amp;gt; Attempts to merge all new commits from branchname into the current HEAD, through a few strategies that vary:&lt;br /&gt;
* Fast-forward - Simple, used when the new changes are directly on top of, as in, have a continous history rooting from the current HEAD. For example, if someone pushed one commit to origin/master, and your local master didn’t have this one commit, it can simply be “fast forwarded” and add the new commit on the end&lt;br /&gt;
* Recursive: the normal strategy, it tries to put both the local changes AND the remote changes into one branch by adding the commits in what is called a “merge commit”&lt;br /&gt;
* Rebase: this is its own command, &amp;lt;code&amp;gt;git rebase branchname&amp;lt;/code&amp;gt; This attempts to take all of your LOCAL changes, and then append them to the end of the REMOTE branch, rather than putting the remote branch into your current one. This is personally my favorite for PRs because it makes a clean commit history, but it also “rewrites” all your commits into new ones, so it’s not suitable for branches used by multiple people because it doesn’t maintain the commit tree&lt;br /&gt;
&amp;lt;code&amp;gt;git reset commitsha (or branchname)&amp;lt;/code&amp;gt; - Sets the current HEAD to the commit listed OR the branchname listed. If you specify –hard, it will update the local filesystem to match this, if you don’t specify or put –soft, it only updates this in git, keeping your file changes intact&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout commitsha (or branchname)&amp;lt;/code&amp;gt; - For commits, this will “rewind” you to that commit and also “detaches HEAD”, which basically means you are no longer on a branch and can’t commit stuff. A temporary rewind, essentially. When you check out a branch, it’s basically just moving you to that branch. Do this for new PRs etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch (branchname)&amp;lt;/code&amp;gt; creates a new branch with the current commit history of the branch you are on&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch -d (branchname)&amp;lt;/code&amp;gt; deletes branch with said name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt; adds the file to “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git restore --staged (filepath)&amp;lt;/code&amp;gt; removes the file from “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; View what is staged, what is not, also view what branch/commit you are on. VERY useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt; Add ALL local filesystem changes to staging&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- .&amp;lt;/code&amp;gt; Undo all local changes, get rid of them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD .&amp;lt;/code&amp;gt; The same as above but stricter, if it doesn’t work&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (or --) filepath&amp;lt;/code&amp;gt; resets that file to the last commit on your filesystem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Commit message&amp;amp;quot;&amp;lt;/code&amp;gt; creates a commit with the current staged changes and adds it to the branch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push remotename branchname&amp;lt;/code&amp;gt; pushes the current local branch to remotename/branchname&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add (remotename) (github link)&amp;lt;/code&amp;gt; creates a remotename with a github repo so you can push/pull from it&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u remotename branchname&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;git pull --set-upstream remotename branchname&amp;lt;/code&amp;gt; sets the route from your CURRENT local branch to a remote branch. This makes it so you can just type &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; without having to specify the remote or branch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git reset HEAD~(number)&amp;lt;/code&amp;gt; resets current HEAD X commits backwards in the commit history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD~(number)&amp;lt;/code&amp;gt; temporarily rewinds and detaches HEAD X commits back in history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; show the commit history (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git diff HEAD&amp;lt;/code&amp;gt; show all the changes you have made locally that are not committed (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merge-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Merge Conflicts ==&lt;br /&gt;
Merge conflicts can look intimidating, but they aren’t in reality (unless you don’t know how to code).&lt;br /&gt;
&lt;br /&gt;
When two commits change the same part of the same file, git tries to merge them, but can’t, since it would probably break the code if it guessed.&lt;br /&gt;
&lt;br /&gt;
Instead, it lets you do it yourself.&lt;br /&gt;
&lt;br /&gt;
It writes into the file what looks like this&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
(version before merge)&lt;br /&gt;
=================&lt;br /&gt;
(new version)&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&amp;lt;/pre&amp;gt;&lt;br /&gt;
It usually does that multiple times per file. Basically compare the two, remove the markers and write the file back how it should be if both were merged into one.&lt;br /&gt;
&lt;br /&gt;
Here is an example.&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
    if(variable?.test())&lt;br /&gt;
=================&lt;br /&gt;
    if(the_variable.test()&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
This would most likely be merged into this:&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
    if(the_variable?.test()&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
The inferred history here is the variable was named &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt;, and the current branch changed it to &amp;lt;code&amp;gt;the_variable&amp;lt;/code&amp;gt;. However, another branch added the &amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; operator to the proccall. When this change was merged in, Git noticed an unexpected change to the variable name and placed a merge conflict. Making sense now? The way to merge it is applying both changes as intended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mapping-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mapping Conflicts ===&lt;br /&gt;
DMM files are impossible to merge via text, so we have tooling in the repository to automatically merge them.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/mapmerge2/Resolve Map Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there are any conflicting tiles, you will be prompted to fix it in your map editor, then you can continue by committing the changes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;icon-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Icon Conflicts ===&lt;br /&gt;
DMI files contain multiple images, making merge conflicts &#039;&#039;always&#039;&#039; happen if the file is updated by two branches. This means solving them is relatively trivial but can be time consuming. So there’s a tool for it.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/dmi/Resolve Icon Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;automatic-merge-conflict-resolution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Automatic Merge Conflict Resolution ===&lt;br /&gt;
Also, perk of using command line, if you want git to &#039;&#039;&#039;AUTO MERGE DMI and DMM&#039;&#039;&#039;, as well as auto-cleanup your maps on commit, just run &amp;lt;code&amp;gt;tools/hooks/Install&amp;lt;/code&amp;gt;. No need to run them manually anymore, they will run automatically if you merge or commit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-a-basic-pr-with-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Making a basic PR with command line ==&lt;br /&gt;
First, you’ll need to clone the repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone &amp;lt;nowiki&amp;gt;https://github.com/BeeStation/BeeStation-Hornet/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, change directories into the repository with &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You will now need to create a branch for your changes, using the master branch for PRs is bad practice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the branch is created, but you need to “check it out”, or switch to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make any changes in VSCode. When you’re done, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice what files now have “unstaged changes”. Any files you do NOT want changes in, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (filepath)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will delete unwanted changes on your local filesystem.&lt;br /&gt;
&lt;br /&gt;
Any files you DO want to PR changes to, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt;, or if you want to add all files, use &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; as the filepath.&lt;br /&gt;
&lt;br /&gt;
Now run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;, and confirm all the changes you want are staged.&lt;br /&gt;
&lt;br /&gt;
Now you’re ready to commit. Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Put a summary of your changes here&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a commit and add it to the current branch. Run &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; to see the commit history. You can exit with &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; and navigate with arrows.&lt;br /&gt;
&lt;br /&gt;
That worked, so now you just need to push the changes to your fork of the repository. So go on GitHub and press the fork button on the top right of BeeStation-Hornet, and you’ll be taken to your new fork repository. You need to add this as a remote on your local client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add fork &amp;lt;nowiki&amp;gt;https://github.com/(your&amp;lt;/nowiki&amp;gt; GitHub username)/BeeStation-Hornet/&amp;lt;/code&amp;gt; (change this to your fork’s link)&lt;br /&gt;
&lt;br /&gt;
Then, you can push to a branch on your fork.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u fork my-pr-that-does-something&amp;lt;/code&amp;gt; - The &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; here tells Git to save that this is the path to remote. This means that when you run &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; without passing a remote or branchname, it will know where to push the next time. The same applies to &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Done! Now go to your fork on GitHub and refresh, you’ll see something like “changes have recently been pushed to branch my-pr-that-does-something” with a big “Open pull request” button. Press that and make sure it’s going to the main repository. You can also do this manually from the Pull Requests tab on your fork.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36416</id>
		<title>Guide to git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36416"/>
		<updated>2023-03-29T02:47:51Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* The Setup */ Fix git link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;git-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Git Command Line =&lt;br /&gt;
Many are drawn to GUI versions of Git, such as GitHub Desktop, GitKraken, and VSCode’s Git integration. However, I believe this is more of a hindrance than a help. If you’re just making mapping or sprite PRs, sure, maybe you can get along just fine with GitHub Desktop. However, these tools lack the expansive features of the command line and are harder to get help with. Command line is far more google-able if you have problems and I highly recommend it. Far more people will be able to assist you if you are using command line than an GUI tool.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-setup&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== The Setup ==&lt;br /&gt;
Download and install [[git:|git-scm]]. You should probably set it up to use the shell of your choice (I use command line on Windows Terminal), or if you prefer Git Bash, use that. Do note that installing it to your system PATH is very useful if you want to use VSCode’s builtin terminal.&lt;br /&gt;
&lt;br /&gt;
Also be sure to set your name/email in your git client so your commits show properly and are attributed properly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;amp;quot;Name Here&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;git config --global user.email &amp;amp;quot;[/cdn-cgi/l/email-protection &amp;lt;nowiki&amp;gt;[email protected]&amp;lt;/nowiki&amp;gt;]&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Often times the default can expose personal information. So be &#039;&#039;sure&#039;&#039; to set this.&lt;br /&gt;
&lt;br /&gt;
As long as the email you put is added to your GitHub account it will work fine and show your icon on commits. Name can just be your GitHub username or something else, doesn’t matter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-terms-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Git Terms Cheat-Sheet ==&lt;br /&gt;
&#039;&#039;&#039;HEAD:&#039;&#039;&#039; Term for the current location on the “commit tree”, basically your current location in history.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Detached HEAD:&#039;&#039;&#039; A state the client can be in, where the history is at a specific point in time, but not attached to a branch. Committing changes is not possible unless the HEAD is re-attached by checking out a branch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Staging:&#039;&#039;&#039; an in-between state of your local filesystem and a commit. This is so you can have some changes locally but not commit all of them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Commit:&#039;&#039;&#039; a collection of changes, applied as a “patch” onto the previous (parent) commit. Think of it as a chain link that contains a snapshot of the repository at that time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Branch:&#039;&#039;&#039; A collection of commits in one big chain, that can split off at any time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Merge:&#039;&#039;&#039; Joining two branches&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remote:&#039;&#039;&#039; A secondary git repository to sync changes with, usually GitHub but can be any server that supports the protocol&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Upstream:&#039;&#039;&#039; The remote that you are pulling from/pushing to, in that case your fork OR the main beestation repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-commands-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Commands Cheat-Sheet ==&lt;br /&gt;
&amp;lt;code&amp;gt;git clone (github link)&amp;lt;/code&amp;gt; downloads the linked repository into a folder at the current location.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull remotename branchname&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; and then &amp;lt;code&amp;gt;git merge remotename/branchname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; gets all the new commits from remote&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merging-strategies&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Merging Strategies ===&lt;br /&gt;
&amp;lt;code&amp;gt;git merge branchname&amp;lt;/code&amp;gt; Attempts to merge all new commits from branchname into the current HEAD, through a few strategies that vary:&lt;br /&gt;
* Fast-forward - Simple, used when the new changes are directly on top of, as in, have a continous history rooting from the current HEAD. For example, if someone pushed one commit to origin/master, and your local master didn’t have this one commit, it can simply be “fast forwarded” and add the new commit on the end&lt;br /&gt;
* Recursive: the normal strategy, it tries to put both the local changes AND the remote changes into one branch by adding the commits in what is called a “merge commit”&lt;br /&gt;
* Rebase: this is its own command, &amp;lt;code&amp;gt;git rebase branchname&amp;lt;/code&amp;gt; This attempts to take all of your LOCAL changes, and then append them to the end of the REMOTE branch, rather than putting the remote branch into your current one. This is personally my favorite for PRs because it makes a clean commit history, but it also “rewrites” all your commits into new ones, so it’s not suitable for branches used by multiple people because it doesn’t maintain the commit tree&lt;br /&gt;
&amp;lt;code&amp;gt;git reset commitsha (or branchname)&amp;lt;/code&amp;gt; - Sets the current HEAD to the commit listed OR the branchname listed. If you specify –hard, it will update the local filesystem to match this, if you don’t specify or put –soft, it only updates this in git, keeping your file changes intact&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout commitsha (or branchname)&amp;lt;/code&amp;gt; - For commits, this will “rewind” you to that commit and also “detaches HEAD”, which basically means you are no longer on a branch and can’t commit stuff. A temporary rewind, essentially. When you check out a branch, it’s basically just moving you to that branch. Do this for new PRs etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch (branchname)&amp;lt;/code&amp;gt; creates a new branch with the current commit history of the branch you are on&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch -d (branchname)&amp;lt;/code&amp;gt; deletes branch with said name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt; adds the file to “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git restore --staged (filepath)&amp;lt;/code&amp;gt; removes the file from “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; View what is staged, what is not, also view what branch/commit you are on. VERY useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt; Add ALL local filesystem changes to staging&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- .&amp;lt;/code&amp;gt; Undo all local changes, get rid of them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD .&amp;lt;/code&amp;gt; The same as above but stricter, if it doesn’t work&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (or --) filepath&amp;lt;/code&amp;gt; resets that file to the last commit on your filesystem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Commit message&amp;amp;quot;&amp;lt;/code&amp;gt; creates a commit with the current staged changes and adds it to the branch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push remotename branchname&amp;lt;/code&amp;gt; pushes the current local branch to remotename/branchname&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add (remotename) (github link)&amp;lt;/code&amp;gt; creates a remotename with a github repo so you can push/pull from it&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u remotename branchname&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;git pull --set-upstream remotename branchname&amp;lt;/code&amp;gt; sets the route from your CURRENT local branch to a remote branch. This makes it so you can just type &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; without having to specify the remote or branch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git reset HEAD~(number)&amp;lt;/code&amp;gt; resets current HEAD X commits backwards in the commit history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD~(number)&amp;lt;/code&amp;gt; temporarily rewinds and detaches HEAD X commits back in history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; show the commit history (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git diff HEAD&amp;lt;/code&amp;gt; show all the changes you have made locally that are not committed (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merge-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Merge Conflicts ==&lt;br /&gt;
Merge conflicts can look intimidating, but they aren’t in reality (unless you don’t know how to code).&lt;br /&gt;
&lt;br /&gt;
When two commits change the same part of the same file, git tries to merge them, but can’t, since it would probably break the code if it guessed.&lt;br /&gt;
&lt;br /&gt;
Instead, it lets you do it yourself.&lt;br /&gt;
&lt;br /&gt;
It writes into the file what looks like this&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
(version before merge)&lt;br /&gt;
=================&lt;br /&gt;
(new version)&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&amp;lt;/pre&amp;gt;&lt;br /&gt;
It usually does that multiple times per file. Basically compare the two, remove the markers and write the file back how it should be if both were merged into one.&lt;br /&gt;
&lt;br /&gt;
Here is an example.&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
    if(variable?.test())&lt;br /&gt;
=================&lt;br /&gt;
    if(the_variable.test()&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
This would most likely be merged into this:&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
    if(the_variable?.test()&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
The inferred history here is the variable was named &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt;, and the current branch changed it to &amp;lt;code&amp;gt;the_variable&amp;lt;/code&amp;gt;. However, another branch added the &amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; operator to the proccall. When this change was merged in, Git noticed an unexpected change to the variable name and placed a merge conflict. Making sense now? The way to merge it is applying both changes as intended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mapping-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mapping Conflicts ===&lt;br /&gt;
DMM files are impossible to merge via text, so we have tooling in the repository to automatically merge them.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/mapmerge2/Resolve Map Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there are any conflicting tiles, you will be prompted to fix it in your map editor, then you can continue by committing the changes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;icon-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Icon Conflicts ===&lt;br /&gt;
DMI files contain multiple images, making merge conflicts &#039;&#039;always&#039;&#039; happen if the file is updated by two branches. This means solving them is relatively trivial but can be time consuming. So there’s a tool for it.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/dmi/Resolve Icon Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;automatic-merge-conflict-resolution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Automatic Merge Conflict Resolution ===&lt;br /&gt;
Also, perk of using command line, if you want git to &#039;&#039;&#039;AUTO MERGE DMI and DMM&#039;&#039;&#039;, as well as auto-cleanup your maps on commit, just run &amp;lt;code&amp;gt;tools/hooks/Install&amp;lt;/code&amp;gt;. No need to run them manually anymore, they will run automatically if you merge or commit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-a-basic-pr-with-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Making a basic PR with command line ==&lt;br /&gt;
First, you’ll need to clone the repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone &amp;lt;nowiki&amp;gt;https://github.com/BeeStation/BeeStation-Hornet/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, change directories into the repository with &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You will now need to create a branch for your changes, using the master branch for PRs is bad practice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the branch is created, but you need to “check it out”, or switch to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make any changes in VSCode. When you’re done, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice what files now have “unstaged changes”. Any files you do NOT want changes in, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (filepath)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will delete unwanted changes on your local filesystem.&lt;br /&gt;
&lt;br /&gt;
Any files you DO want to PR changes to, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt;, or if you want to add all files, use &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; as the filepath.&lt;br /&gt;
&lt;br /&gt;
Now run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;, and confirm all the changes you want are staged.&lt;br /&gt;
&lt;br /&gt;
Now you’re ready to commit. Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Put a summary of your changes here&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a commit and add it to the current branch. Run &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; to see the commit history. You can exit with &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; and navigate with arrows.&lt;br /&gt;
&lt;br /&gt;
That worked, so now you just need to push the changes to your fork of the repository. So go on GitHub and press the fork button on the top right of BeeStation-Hornet, and you’ll be taken to your new fork repository. You need to add this as a remote on your local client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add fork &amp;lt;nowiki&amp;gt;https://github.com/(your&amp;lt;/nowiki&amp;gt; GitHub username)/BeeStation-Hornet/&amp;lt;/code&amp;gt; (change this to your fork’s link)&lt;br /&gt;
&lt;br /&gt;
Then, you can push to a branch on your fork.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u fork my-pr-that-does-something&amp;lt;/code&amp;gt; - The &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; here tells Git to save that this is the path to remote. This means that when you run &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; without passing a remote or branchname, it will know where to push the next time. The same applies to &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Done! Now go to your fork on GitHub and refresh, you’ll see something like “changes have recently been pushed to branch my-pr-that-does-something” with a big “Open pull request” button. Press that and make sure it’s going to the main repository. You can also do this manually from the Pull Requests tab on your fork.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36414</id>
		<title>Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36414"/>
		<updated>2023-03-27T21:27:37Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Add git guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Feel free to add to this page if you have any resources that may help aspiring developers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For design direction and coding guidelines, see https://github.com/BeeStation/BeeStation-Hornet/wiki&lt;br /&gt;
=== Resources ===&lt;br /&gt;
==== Design ====&lt;br /&gt;
==== Coding ====&lt;br /&gt;
Guide to coding - https://hackmd.io/@BdkEQ8tISgW8Pbn2OquQxQ/B1SeqStVq&lt;br /&gt;
&lt;br /&gt;
Guide to hard-dels - https://hackmd.io/@PowerfulBacon/guide_to_harddels&lt;br /&gt;
&lt;br /&gt;
Local database setup - [[Working with the database#Database Setup|Working with the database]]&lt;br /&gt;
&lt;br /&gt;
Using version control / git - [[Guide to git]]&lt;br /&gt;
==== Spriting ====&lt;br /&gt;
Guide to spriting - [[Guide to spriting]]&lt;br /&gt;
==== Mapping ====&lt;br /&gt;
Guide to mapping - [[Guide to mapping]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36413</id>
		<title>Guide to git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36413"/>
		<updated>2023-03-27T21:25:48Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Remove links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;git-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Git Command Line =&lt;br /&gt;
Many are drawn to GUI versions of Git, such as GitHub Desktop, GitKraken, and VSCode’s Git integration. However, I believe this is more of a hindrance than a help. If you’re just making mapping or sprite PRs, sure, maybe you can get along just fine with GitHub Desktop. However, these tools lack the expansive features of the command line and are harder to get help with. Command line is far more google-able if you have problems and I highly recommend it. Far more people will be able to assist you if you are using command line than an GUI tool.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;the-setup&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== The Setup ==&lt;br /&gt;
Download and install [git:|git-scm]. You should probably set it up to use the shell of your choice (I use command line on Windows Terminal), or if you prefer Git Bash, use that. Do note that installing it to your system PATH is very useful if you want to use VSCode’s builtin terminal.&lt;br /&gt;
&lt;br /&gt;
Also be sure to set your name/email in your git client so your commits show properly and are attributed properly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;amp;quot;Name Here&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;git config --global user.email &amp;amp;quot;[/cdn-cgi/l/email-protection &amp;lt;nowiki&amp;gt;[email protected]&amp;lt;/nowiki&amp;gt;]&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Often times the default can expose personal information. So be &#039;&#039;sure&#039;&#039; to set this.&lt;br /&gt;
&lt;br /&gt;
As long as the email you put is added to your GitHub account it will work fine and show your icon on commits. Name can just be your GitHub username or something else, doesn’t matter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-terms-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Terms Cheat-Sheet ==&lt;br /&gt;
&#039;&#039;&#039;HEAD:&#039;&#039;&#039; Term for the current location on the “commit tree”, basically your current location in history.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Detached HEAD:&#039;&#039;&#039; A state the client can be in, where the history is at a specific point in time, but not attached to a branch. Committing changes is not possible unless the HEAD is re-attached by checking out a branch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Staging:&#039;&#039;&#039; an in-between state of your local filesystem and a commit. This is so you can have some changes locally but not commit all of them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Commit:&#039;&#039;&#039; a collection of changes, applied as a “patch” onto the previous (parent) commit. Think of it as a chain link that contains a snapshot of the repository at that time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Branch:&#039;&#039;&#039; A collection of commits in one big chain, that can split off at any time&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Merge:&#039;&#039;&#039; Joining two branches&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remote:&#039;&#039;&#039; A secondary git repository to sync changes with, usually GitHub but can be any server that supports the protocol&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Upstream:&#039;&#039;&#039; The remote that you are pulling from/pushing to, in that case your fork OR the main beestation repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-commands-cheat-sheet&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Commands Cheat-Sheet ==&lt;br /&gt;
&amp;lt;code&amp;gt;git clone (github link)&amp;lt;/code&amp;gt; downloads the linked repository into a folder at the current location.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull remotename branchname&amp;lt;/code&amp;gt; runs &amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; and then &amp;lt;code&amp;gt;git merge remotename/branchname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git fetch remotename&amp;lt;/code&amp;gt; gets all the new commits from remote&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merging-strategies&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Merging Strategies ===&lt;br /&gt;
&amp;lt;code&amp;gt;git merge branchname&amp;lt;/code&amp;gt; Attempts to merge all new commits from branchname into the current HEAD, through a few strategies that vary:&lt;br /&gt;
* Fast-forward - Simple, used when the new changes are directly on top of, as in, have a continous history rooting from the current HEAD. For example, if someone pushed one commit to origin/master, and your local master didn’t have this one commit, it can simply be “fast forwarded” and add the new commit on the end&lt;br /&gt;
* Recursive: the normal strategy, it tries to put both the local changes AND the remote changes into one branch by adding the commits in what is called a “merge commit”&lt;br /&gt;
* Rebase: this is its own command, &amp;lt;code&amp;gt;git rebase branchname&amp;lt;/code&amp;gt; This attempts to take all of your LOCAL changes, and then append them to the end of the REMOTE branch, rather than putting the remote branch into your current one. This is personally my favorite for PRs because it makes a clean commit history, but it also “rewrites” all your commits into new ones, so it’s not suitable for branches used by multiple people because it doesn’t maintain the commit tree&lt;br /&gt;
&amp;lt;code&amp;gt;git reset commitsha (or branchname)&amp;lt;/code&amp;gt; - Sets the current HEAD to the commit listed OR the branchname listed. If you specify –hard, it will update the local filesystem to match this, if you don’t specify or put –soft, it only updates this in git, keeping your file changes intact&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout commitsha (or branchname)&amp;lt;/code&amp;gt; - For commits, this will “rewind” you to that commit and also “detaches HEAD”, which basically means you are no longer on a branch and can’t commit stuff. A temporary rewind, essentially. When you check out a branch, it’s basically just moving you to that branch. Do this for new PRs etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch (branchname)&amp;lt;/code&amp;gt; creates a new branch with the current commit history of the branch you are on&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch -d (branchname)&amp;lt;/code&amp;gt; deletes branch with said name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt; adds the file to “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git restore --staged (filepath)&amp;lt;/code&amp;gt; removes the file from “staging”&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; View what is staged, what is not, also view what branch/commit you are on. VERY useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt; Add ALL local filesystem changes to staging&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- .&amp;lt;/code&amp;gt; Undo all local changes, get rid of them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD .&amp;lt;/code&amp;gt; The same as above but stricter, if it doesn’t work&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (or --) filepath&amp;lt;/code&amp;gt; resets that file to the last commit on your filesystem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Commit message&amp;amp;quot;&amp;lt;/code&amp;gt; creates a commit with the current staged changes and adds it to the branch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push remotename branchname&amp;lt;/code&amp;gt; pushes the current local branch to remotename/branchname&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add (remotename) (github link)&amp;lt;/code&amp;gt; creates a remotename with a github repo so you can push/pull from it&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u remotename branchname&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;git pull --set-upstream remotename branchname&amp;lt;/code&amp;gt; sets the route from your CURRENT local branch to a remote branch. This makes it so you can just type &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt; without having to specify the remote or branch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git reset HEAD~(number)&amp;lt;/code&amp;gt; resets current HEAD X commits backwards in the commit history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD~(number)&amp;lt;/code&amp;gt; temporarily rewinds and detaches HEAD X commits back in history&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; show the commit history (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git diff HEAD&amp;lt;/code&amp;gt; show all the changes you have made locally that are not committed (q to exit)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merge-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Merge Conflicts ==&lt;br /&gt;
Merge conflicts can look intimidating, but they aren’t in reality (unless you don’t know how to code).&lt;br /&gt;
&lt;br /&gt;
When two commits change the same part of the same file, git tries to merge them, but can’t, since it would probably break the code if it guessed.&lt;br /&gt;
&lt;br /&gt;
Instead, it lets you do it yourself.&lt;br /&gt;
&lt;br /&gt;
It writes into the file what looks like this&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
(version before merge)&lt;br /&gt;
=================&lt;br /&gt;
(new version)&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&amp;lt;/pre&amp;gt;&lt;br /&gt;
It usually does that multiple times per file. Basically compare the two, remove the markers and write the file back how it should be if both were merged into one.&lt;br /&gt;
&lt;br /&gt;
Here is an example.&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; HEAD&lt;br /&gt;
    if(variable?.test())&lt;br /&gt;
=================&lt;br /&gt;
    if(the_variable.test()&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; commitsha&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
This would most likely be merged into this:&lt;br /&gt;
&amp;lt;pre&amp;gt;/proc/main()&lt;br /&gt;
    var/the_variable = GLOB.the_var&lt;br /&gt;
    if(the_variable?.test()&lt;br /&gt;
        do_something()&amp;lt;/pre&amp;gt;&lt;br /&gt;
The inferred history here is the variable was named &amp;lt;code&amp;gt;variable&amp;lt;/code&amp;gt;, and the current branch changed it to &amp;lt;code&amp;gt;the_variable&amp;lt;/code&amp;gt;. However, another branch added the &amp;lt;code&amp;gt;?.&amp;lt;/code&amp;gt; operator to the proccall. When this change was merged in, Git noticed an unexpected change to the variable name and placed a merge conflict. Making sense now? The way to merge it is applying both changes as intended.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mapping-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mapping Conflicts ===&lt;br /&gt;
DMM files are impossible to merge via text, so we have tooling in the repository to automatically merge them.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/mapmerge2/Resolve Map Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there are any conflicting tiles, you will be prompted to fix it in your map editor, then you can continue by committing the changes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;icon-conflicts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Icon Conflicts ===&lt;br /&gt;
DMI files contain multiple images, making merge conflicts &#039;&#039;always&#039;&#039; happen if the file is updated by two branches. This means solving them is relatively trivial but can be time consuming. So there’s a tool for it.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;tools/dmi/Resolve Icon Conflicts&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;automatic-merge-conflict-resolution&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Automatic Merge Conflict Resolution ===&lt;br /&gt;
Also, perk of using command line, if you want git to &#039;&#039;&#039;AUTO MERGE DMI and DMM&#039;&#039;&#039;, as well as auto-cleanup your maps on commit, just run &amp;lt;code&amp;gt;tools/hooks/Install&amp;lt;/code&amp;gt;. No need to run them manually anymore, they will run automatically if you merge or commit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;making-a-basic-pr-with-command-line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Making a basic PR with command line ==&lt;br /&gt;
First, you’ll need to clone the repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone &amp;lt;nowiki&amp;gt;https://github.com/BeeStation/BeeStation-Hornet/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, change directories into the repository with &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You will now need to create a branch for your changes, using the master branch for PRs is bad practice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git branch my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the branch is created, but you need to “check it out”, or switch to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout my-pr-that-does-something&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make any changes in VSCode. When you’re done, run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice what files now have “unstaged changes”. Any files you do NOT want changes in, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout HEAD (filepath)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will delete unwanted changes on your local filesystem.&lt;br /&gt;
&lt;br /&gt;
Any files you DO want to PR changes to, run&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add (filepath)&amp;lt;/code&amp;gt;, or if you want to add all files, use &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; as the filepath.&lt;br /&gt;
&lt;br /&gt;
Now run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;, and confirm all the changes you want are staged.&lt;br /&gt;
&lt;br /&gt;
Now you’re ready to commit. Run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;amp;quot;Put a summary of your changes here&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a commit and add it to the current branch. Run &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; to see the commit history. You can exit with &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; and navigate with arrows.&lt;br /&gt;
&lt;br /&gt;
That worked, so now you just need to push the changes to your fork of the repository. So go on GitHub and press the fork button on the top right of BeeStation-Hornet, and you’ll be taken to your new fork repository. You need to add this as a remote on your local client.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git remote add fork &amp;lt;nowiki&amp;gt;https://github.com/(your&amp;lt;/nowiki&amp;gt; GitHub username)/BeeStation-Hornet/&amp;lt;/code&amp;gt; (change this to your fork’s link)&lt;br /&gt;
&lt;br /&gt;
Then, you can push to a branch on your fork.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push -u fork my-pr-that-does-something&amp;lt;/code&amp;gt; - The &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; here tells Git to save that this is the path to remote. This means that when you run &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt; without passing a remote or branchname, it will know where to push the next time. The same applies to &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Done! Now go to your fork on GitHub and refresh, you’ll see something like “changes have recently been pushed to branch my-pr-that-does-something” with a big “Open pull request” button. Press that and make sure it’s going to the main repository. You can also do this manually from the Pull Requests tab on your fork.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Downloading_the_source_code&amp;diff=36412</id>
		<title>Downloading the source code</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Downloading_the_source_code&amp;diff=36412"/>
		<updated>2023-03-27T21:24:30Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* Downloading */ Add note on how to download zip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains the information and steps needed to download the latest version of the code, compile it and host your own server.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
The BeeStation source code is under [https://www.gnu.org/licenses/agpl-3.0.html GNU AGPL v3 license] and the assets are [https://freedomdefined.org/Licenses/CC-BY-SA CC-BY-SA].&lt;br /&gt;
== Downloading ==&lt;br /&gt;
We use GitHub to host our project.&lt;br /&gt;
&lt;br /&gt;
A zip download is available here: [https://github.com/BeeStation/BeeStation-Hornet] (Press Code -&amp;gt; Download ZIP)&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to download 30MB of data every time an update is made, you can [[Guide to git|follow this guide]] to set up and use Git.&lt;br /&gt;
== &amp;quot;I did not change anything, but the code does not work anymore!&amp;quot; ==&lt;br /&gt;
This is likely due to corrupted files.&lt;br /&gt;
To fix this, you need to:&lt;br /&gt;
*Re-download everything&lt;br /&gt;
*Copy over your config folder and the data folder&lt;br /&gt;
*Clean compile&lt;br /&gt;
If you&#039;re using git reset hard against the BeeStation upstream master branch and then recompile&lt;br /&gt;
== Hosting a server ==&lt;br /&gt;
To get a simple server running first&lt;br /&gt;
* Download the source code as explained [[Downloading_the_source_code#Downloading|above]]&lt;br /&gt;
* Run &#039;&#039;&#039;BUILD.bat&#039;&#039;&#039;&lt;br /&gt;
* Wait until it compiles. Once it does a new file &amp;quot;beestation.dmb&amp;quot; will be created in the same folder where &amp;quot;beestation.dme&amp;quot; is. The dmb file has an orange icon. Compile time usually takes between 1 and 3 minutes, depending on your computer.&lt;br /&gt;
* Open dream daemon (Win7: start menu &amp;gt; all programs &amp;gt; BYOND &amp;gt; Dream Daemon; Win8/10: start &amp;gt; type Dream Daemon &amp;gt; Dream Daemon)&lt;br /&gt;
* Select the &amp;quot;...&amp;quot; in the lower right corner and select the file &amp;quot;beestation.dmb&amp;quot;.&lt;br /&gt;
* Click the &amp;quot;GO&amp;quot; button and wait until it changes to a red &amp;quot;stop&amp;quot; button. Starting the server usually takes between 1 and 5 minutes. It is fully started once you can normally interact with Dream Daemon and a byond://xxx.xxx.xxx.xxx:xxxxx link is present at the bottom.&lt;br /&gt;
* Click the yellow button (former &amp;quot;...&amp;quot;) to auto-join&lt;br /&gt;
* Left click the link (byond://xxx.xxx.xxx.xxx:xxxxx) to copy it to clipboard&lt;br /&gt;
* Paste the link (ctrl+v) to your friends so they can join.&lt;br /&gt;
== Making your server visible on byond.com ==&lt;br /&gt;
You &#039;&#039;&#039;DO NOT NEED&#039;&#039;&#039; to pay for membership to make your server visible on byond.com!&lt;br /&gt;
&lt;br /&gt;
To make your server show up, edit the hub config option https://github.com/BeeStation/BeeStation-Hornet/blob/master/config/config.txt#L26&lt;br /&gt;
== Setting up the database ==&lt;br /&gt;
&#039;&#039;&#039;See [[Working with the database]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
[[Category:Guides]] [[Category:Game Resources]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Downloading_the_source_code&amp;diff=36411</id>
		<title>Downloading the source code</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Downloading_the_source_code&amp;diff=36411"/>
		<updated>2023-03-27T21:23:55Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Update database link and git guide link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains the information and steps needed to download the latest version of the code, compile it and host your own server.&lt;br /&gt;
== Licensing ==&lt;br /&gt;
The BeeStation source code is under [https://www.gnu.org/licenses/agpl-3.0.html GNU AGPL v3 license] and the assets are [https://freedomdefined.org/Licenses/CC-BY-SA CC-BY-SA].&lt;br /&gt;
== Downloading ==&lt;br /&gt;
We use GitHub to host our project.&lt;br /&gt;
&lt;br /&gt;
A zip download is available here: [https://github.com/BeeStation/BeeStation-Hornet]&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to download 30MB of data every time an update is made, you can [[Guide to git|follow this guide]] to set up and use Git.&lt;br /&gt;
== &amp;quot;I did not change anything, but the code does not work anymore!&amp;quot; ==&lt;br /&gt;
This is likely due to corrupted files.&lt;br /&gt;
To fix this, you need to:&lt;br /&gt;
*Re-download everything&lt;br /&gt;
*Copy over your config folder and the data folder&lt;br /&gt;
*Clean compile&lt;br /&gt;
If you&#039;re using git reset hard against the BeeStation upstream master branch and then recompile&lt;br /&gt;
== Hosting a server ==&lt;br /&gt;
To get a simple server running first&lt;br /&gt;
* Download the source code as explained [[Downloading_the_source_code#Downloading|above]]&lt;br /&gt;
* Run &#039;&#039;&#039;BUILD.bat&#039;&#039;&#039;&lt;br /&gt;
* Wait until it compiles. Once it does a new file &amp;quot;beestation.dmb&amp;quot; will be created in the same folder where &amp;quot;beestation.dme&amp;quot; is. The dmb file has an orange icon. Compile time usually takes between 1 and 3 minutes, depending on your computer.&lt;br /&gt;
* Open dream daemon (Win7: start menu &amp;gt; all programs &amp;gt; BYOND &amp;gt; Dream Daemon; Win8/10: start &amp;gt; type Dream Daemon &amp;gt; Dream Daemon)&lt;br /&gt;
* Select the &amp;quot;...&amp;quot; in the lower right corner and select the file &amp;quot;beestation.dmb&amp;quot;.&lt;br /&gt;
* Click the &amp;quot;GO&amp;quot; button and wait until it changes to a red &amp;quot;stop&amp;quot; button. Starting the server usually takes between 1 and 5 minutes. It is fully started once you can normally interact with Dream Daemon and a byond://xxx.xxx.xxx.xxx:xxxxx link is present at the bottom.&lt;br /&gt;
* Click the yellow button (former &amp;quot;...&amp;quot;) to auto-join&lt;br /&gt;
* Left click the link (byond://xxx.xxx.xxx.xxx:xxxxx) to copy it to clipboard&lt;br /&gt;
* Paste the link (ctrl+v) to your friends so they can join.&lt;br /&gt;
== Making your server visible on byond.com ==&lt;br /&gt;
You &#039;&#039;&#039;DO NOT NEED&#039;&#039;&#039; to pay for membership to make your server visible on byond.com!&lt;br /&gt;
&lt;br /&gt;
To make your server show up, edit the hub config option https://github.com/BeeStation/BeeStation-Hornet/blob/master/config/config.txt#L26&lt;br /&gt;
== Setting up the database ==&lt;br /&gt;
&#039;&#039;&#039;See [[Working with the database]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
[[Category:Guides]] [[Category:Game Resources]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Talk:Setting_up_git&amp;diff=36409</id>
		<title>Talk:Setting up git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Talk:Setting_up_git&amp;diff=36409"/>
		<updated>2023-03-27T21:17:57Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Itsmeowdev moved page Talk:Setting up git to Talk:Guide to git: More accurate to new content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Talk:Guide to git]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Talk:Guide_to_git&amp;diff=36408</id>
		<title>Talk:Guide to git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Talk:Guide_to_git&amp;diff=36408"/>
		<updated>2023-03-27T21:17:57Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Itsmeowdev moved page Talk:Setting up git to Talk:Guide to git: More accurate to new content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Step 5 ==&lt;br /&gt;
it needs editing to inform the user of what actually needs to be done. you need to fork the /tg/ repo to create your own, but if you already have an old repo under that name then it doesn&#039;t work very well, and git gets unhappy about it, refusing to let you use Remote in tortoisegit.&lt;br /&gt;
the fix for this is to fork the repo to have your own, but take the /tg/station repo link instead of your own.&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Setting_up_git&amp;diff=36407</id>
		<title>Setting up git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Setting_up_git&amp;diff=36407"/>
		<updated>2023-03-27T21:17:57Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Itsmeowdev moved page Setting up git to Guide to git: More accurate to new content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Guide to git]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36406</id>
		<title>Guide to git</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Guide_to_git&amp;diff=36406"/>
		<updated>2023-03-27T21:17:57Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Itsmeowdev moved page Setting up git to Guide to git: More accurate to new content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;WARNING: This guide is heavily outdated, and if you follow it, it&#039;s likely nobody will be able to help you if things go wrong.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Follow this guide and use GitKraken instead: https://forums.yogstation.net/index.php?threads/release-the-gitkraken-how-to-make-your-first-pull-request.15099/&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
This guide uses TortoiseGIT. While there are other programs out there, this one is the most commonly used. This guide is for Windows only.&lt;br /&gt;
TortoiseGIT is a simple enough program but other clients or the git command line are recommended once you are familiar with the basics.&lt;br /&gt;
&lt;br /&gt;
It&#039;s recommended if you don&#039;t want to read this that you just watch this video:https://www.youtube.com/watch?v=ZDR433b0HJY&lt;br /&gt;
&lt;br /&gt;
Some further videos that are recommended watching for any git user:&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=MYP56QJpDr4 - Git from bits up&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=4XpnKHJAok8 - Linus Torvalds (yes that linus) on git&lt;br /&gt;
&lt;br /&gt;
== If you are having trouble ==&lt;br /&gt;
Watch this video guide if you are having difficulty with any step below. [http://www.youtube.com/watch?v=Z5tTCo6IHLg]&lt;br /&gt;
If you have further problems, contact someone on [[Community|#coderbus]]&lt;br /&gt;
&lt;br /&gt;
== Step 1 - Install Git ==&lt;br /&gt;
&lt;br /&gt;
* Go here: http://git-scm.com/downloads&lt;br /&gt;
* Download the Windows Git program.&lt;br /&gt;
* It should look something like &#039;Git-1.7.11-preview20120620.exe&#039;&lt;br /&gt;
* Install it and leave everything on default (just keep clicking next).&lt;br /&gt;
* Wait till the installer has finished.&lt;br /&gt;
* Step 1 over!&lt;br /&gt;
&lt;br /&gt;
== Step 2 - Register on Github ==&lt;br /&gt;
&lt;br /&gt;
* Head over here: https://github.com/&lt;br /&gt;
* Click &#039;&#039;&#039;Signup and Pricing&#039;&#039;&#039; in the top right-hand corner.&lt;br /&gt;
* Click the &#039;&#039;Create free account button&#039;&#039;&#039;.&lt;br /&gt;
* Create an account with your username and email.&lt;br /&gt;
* Done!&lt;br /&gt;
&lt;br /&gt;
== Step 3 - Configure Git ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OPTIONAL!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Head here: https://help.github.com/articles/set-up-git/#setting-up-git&lt;br /&gt;
* Follow the guide above from steps 2 to 4, you can install Git for Windows if you want however it&#039;s not recommended&lt;br /&gt;
* Now you have Git all setup, but if you&#039;re command line illiterate like me, you&#039;ll wanna have some fancy graphics!&lt;br /&gt;
&lt;br /&gt;
== Step 4 - TortoiseGit ==&lt;br /&gt;
&lt;br /&gt;
* Go here: http://code.google.com/p/tortoisegit/wiki/Download&lt;br /&gt;
* Download the right TortoiseGit for your system.&lt;br /&gt;
* When installing, click &#039;&#039;&#039;OpenSSH&#039;&#039;&#039; rather than TortoisePLink&lt;br /&gt;
* Finish installing.&lt;br /&gt;
&lt;br /&gt;
== Step 5 - Forking Code ==&lt;br /&gt;
&lt;br /&gt;
* Head over to: https://github.com/tgstation/tgstation&lt;br /&gt;
* Click the &#039;&#039;&#039;Fork&#039;&#039;&#039; button in the top right corner.&lt;br /&gt;
* The page you&#039;ll be directed to is now your fork. You&#039;ll be pushing updates here, and making pull requests to have them merged the main (master) repository.&lt;br /&gt;
* Copy the HTTP URL. It&#039;s next to the &#039;&#039;&#039;HTTP&#039;&#039;&#039; &#039;&#039;&#039;GIT&#039;&#039;&#039; and &#039;&#039;&#039;Git Read-Only&#039;&#039;&#039; buttons. It&#039;ll look something like: https://github.com/NAME/tgstation&lt;br /&gt;
&lt;br /&gt;
== Step 6 - Downloading the Code ==&lt;br /&gt;
&lt;br /&gt;
* Find a computer folder where you don&#039;t mind the code sitting.&lt;br /&gt;
* Right click and choose &#039;&#039;&#039;Git Clone...&#039;&#039;&#039;&lt;br /&gt;
* The URL field should be filled with the URL of your Fork. If not, paste it in.&lt;br /&gt;
* Click Next and watch flying tortoises bring you your code.&lt;br /&gt;
&lt;br /&gt;
== Step 7 - Setting up TortoiseGit ==&lt;br /&gt;
&lt;br /&gt;
* Right click &#039;&#039;&#039;on the folder that was created&#039;&#039;&#039; (usually called tgstation13), and go to &#039;&#039;&#039;TortoiseGit&#039;&#039;&#039; and then click on &#039;&#039;&#039;Settings&#039;&#039;&#039;.&lt;br /&gt;
* Click on &#039;&#039;&#039;Remote&#039;&#039;&#039; under &#039;&#039;&#039;Git&#039;&#039;&#039;.&lt;br /&gt;
* There should be one thing on the list of remotes, with the name: &#039;&#039;&#039;origin&#039;&#039;&#039;.&lt;br /&gt;
* You&#039;re now adding the main repository as a source you can pull updates from.&lt;br /&gt;
* In the &#039;&#039;&#039;Remote&#039;&#039;&#039; box type in &#039;&#039;&#039;upstream&#039;&#039;&#039;.&lt;br /&gt;
* In the &#039;&#039;&#039;URL:&#039;&#039;&#039; box put: https://github.com/tgstation/tgstation.git&lt;br /&gt;
* Click &#039;&#039;&#039;Add New/Save&#039;&#039;&#039;.&lt;br /&gt;
* Click &#039;&#039;&#039;Ok&#039;&#039;&#039;.&lt;br /&gt;
* Almost done!&lt;br /&gt;
&lt;br /&gt;
== Step 8 - Updating your Repo ==&lt;br /&gt;
&lt;br /&gt;
* Updating your repo with the master should be done before trying anything.&lt;br /&gt;
* Right-click the folder your repo is in and select &#039;&#039;&#039;TortoiseGit&#039;&#039;&#039; then &#039;&#039;&#039;Pull&#039;&#039;&#039;.&lt;br /&gt;
* Click the radial button next to &#039;&#039;&#039;Remote&#039;&#039;&#039; and make sure &#039;&#039;&#039;upstream&#039;&#039;&#039; (or whatever you called it) is selected next to it.&lt;br /&gt;
* The &#039;&#039;&#039;remote branch&#039;&#039;&#039; should be set to &#039;&#039;&#039;master&#039;&#039;&#039;.&lt;br /&gt;
* Then click &#039;&#039;&#039;Ok&#039;&#039;&#039;. This will pull the latest changes from the master repo.&lt;br /&gt;
&lt;br /&gt;
== Step 9 - Making a Branch ==&lt;br /&gt;
* &#039;&#039;&#039;Branching your repo is very important for organising your commits, you should have a different branch for each unrelated code change (e.g. if you wanted to make some new sprites for one item and change the properties of another these should be in seperate branches), as Pull requests work off branches rather than commits this will allow you to make a seperate Pull Request per change. Doing this streamlines the whole process and will save everyone a bunch of headaches.&#039;&#039;&#039;&lt;br /&gt;
* Right-click in your working folder. Then choose &#039;&#039;&#039;TortoiseGit&#039;&#039;&#039;, and &#039;&#039;&#039;Create Branch...&#039;&#039;&#039;&lt;br /&gt;
* Type in your new branch name&lt;br /&gt;
* (Optional) Tick &#039;&#039;&#039;Switch to new branch&#039;&#039;&#039;&lt;br /&gt;
* Press &#039;&#039;&#039;Okay&#039;&#039;&#039; and your new branch is created&lt;br /&gt;
&lt;br /&gt;
To switch between Branches:&lt;br /&gt;
* Right-click in your working folder. Then choose &#039;&#039;&#039;TortoiseGit&#039;&#039;&#039;, and &#039;&#039;&#039;Switch/Checkout...&#039;&#039;&#039;&lt;br /&gt;
* Choose your Branch then press &#039;&#039;&#039;Okay&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Step 10 - Making a Commit ==&lt;br /&gt;
&lt;br /&gt;
* A commit is confirmed change of the files in your repo, it&#039;s how you make changes permanently to the files in your repo, so try not to commit without making sure it works (though subsequent commits can fix it).&lt;br /&gt;
* As said before, you should use different branches to separate your commits/changes.  Don&#039;t commit to master.  It should be clean, so you can fall back on it if needed.&lt;br /&gt;
* To make your commits, you need to edit the files using BYOND&#039;s inbuilt editing tools. Make sure to [[Coding Standards|follow coding standards]] when making your changes! When you&#039;re finished, right click the folder you&#039;re working with and choose &#039;&#039;&#039;Git Commit -&amp;gt; &amp;quot;[Your Branch Name]&amp;quot;&#039;&#039;&#039; (Example: Git Commit -&amp;gt; &amp;quot;My_First_Branch&amp;quot;)&lt;br /&gt;
* You can then select only the files you want to be committed by ticking or unticking them. You should also write a detailed commit summary, detailing what happened in that commit.&lt;br /&gt;
* Click &#039;&#039;&#039;Ok&#039;&#039;&#039; and the commit will be committed to your local repo!&lt;br /&gt;
&lt;br /&gt;
== Step 11 - Making a Pull Request ==&lt;br /&gt;
&lt;br /&gt;
* Right-click in your working folder. Then choose &#039;&#039;&#039;TortoiseGit&#039;&#039;&#039;, and &#039;&#039;&#039;Push...&#039;&#039;&#039;&lt;br /&gt;
* Set &#039;&#039;&#039;Local&#039;&#039;&#039; and &#039;&#039;&#039;Remote&#039;&#039;&#039; to the name of the branch you committed before. (e.g. My_First_Branch)&lt;br /&gt;
* Under Destination, set Remote: to &#039;&#039;&#039;origin&#039;&#039;&#039;.&lt;br /&gt;
* Click &#039;&#039;&#039;Ok&#039;&#039;&#039;. This&#039;ll upload your changes to your remote repo (the one on GitHub).&lt;br /&gt;
* Head to your GitHub repo e.g https://github.com/NAME/tgstation13.git&lt;br /&gt;
* Click &#039;&#039;&#039;Pull Request&#039;&#039;&#039; at the top right.&lt;br /&gt;
* [[Getting_Your_Pull_Accepted|Give this a quick read.]] &lt;br /&gt;
* Fill out a summary and then create the pull request.&lt;br /&gt;
* You&#039;re done! In many cases there will be issues pointed out by other contributors, unfortunate merge conflicts, and other things that will require you to revisit your pull request.&lt;br /&gt;
* Optionally, view step 13 for a guide on cleaner commit logs, &#039;&#039;&#039;cleaner commits help maintainers review!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Step 12 - Checking Out Github PRs Locally (Optional) ==&lt;br /&gt;
*&#039;&#039;&#039;This is a must for maintainers who need to easily test other people&#039;s code!&#039;&#039;&#039;&lt;br /&gt;
*Locate the section for your Github remote in the .git/config file. Note that it is hidden by default. It looks like this:&lt;br /&gt;
&lt;br /&gt;
:[remote &amp;quot;upstream&amp;quot;]&lt;br /&gt;
::fetch = +refs/heads/*:refs/remotes/upstream/*&lt;br /&gt;
::url = https://github.com/tgstation/tgstation.git&lt;br /&gt;
&lt;br /&gt;
*Now add the following line:&lt;br /&gt;
::fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*&lt;br /&gt;
&lt;br /&gt;
*Fetch from the upstream remote.&lt;br /&gt;
*To check out a particular pull request, use Switch/Checkout and select the branch from the drop-down list.&lt;br /&gt;
&lt;br /&gt;
=== Git command line verison ===&lt;br /&gt;
&lt;br /&gt;
No editing of the git config file needed, just do git fetch &amp;lt;remote&amp;gt; pull/&amp;lt;pr&amp;gt;/head:target_branch usually something like git fetch upstream pull/26271/head:pr-26271.&lt;br /&gt;
&lt;br /&gt;
Then you can checkout the target_branch&lt;br /&gt;
&lt;br /&gt;
== Step 13 - Clean commits (Optional) ==&lt;br /&gt;
*&#039;&#039;&#039;This is a guide specifically for TortoiseGit, our recommended client&#039;&#039;&#039;&lt;br /&gt;
* Your commit logs are filthy, full of one or two line commits that fix an error that makes you look bad, and the commit is called &amp;quot;Whoops&amp;quot; or &amp;quot;oops&amp;quot;&lt;br /&gt;
* Navigate to your &#039;&#039;&#039;local version of the branch&#039;&#039;&#039;&lt;br /&gt;
* Ensure it is up to date with the &#039;&#039;&#039;remote&#039;&#039;&#039;&lt;br /&gt;
* Go to &#039;&#039;&#039;Show log&#039;&#039;&#039;&lt;br /&gt;
* Select all the commits associated with this change or PR&lt;br /&gt;
* Right click and choose &#039;&#039;&#039;Combine to one commit&#039;&#039;&#039;&lt;br /&gt;
* This will open up the standard commit interface for TortoiseGit, with the commit logs of the selected commits merged together&lt;br /&gt;
* Perform the normal routine for a commit&lt;br /&gt;
* Go to &#039;&#039;&#039;push&#039;&#039;&#039; your branch to the &#039;&#039;&#039;remote branch&#039;&#039;&#039;&lt;br /&gt;
* Ensure &#039;&#039;&#039;Force Overwrite Existing Branch (may discard changes)&#039;&#039;&#039; is selected to make sure the PR/Remote updates to contain just this squashed commit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Contribution guides}}&lt;br /&gt;
[[Category:Game Resources]] [[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36405</id>
		<title>Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Development&amp;diff=36405"/>
		<updated>2023-03-27T21:05:42Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* Coding */ Add local DB setup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Feel free to add to this page if you have any resources that may help aspiring developers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For design direction and coding guidelines, see https://github.com/BeeStation/BeeStation-Hornet/wiki&lt;br /&gt;
=== Resources ===&lt;br /&gt;
==== Design ====&lt;br /&gt;
==== Coding ====&lt;br /&gt;
Guide to coding - https://hackmd.io/@BdkEQ8tISgW8Pbn2OquQxQ/B1SeqStVq&lt;br /&gt;
&lt;br /&gt;
Guide to hard-dels - https://hackmd.io/@PowerfulBacon/guide_to_harddels&lt;br /&gt;
&lt;br /&gt;
Local database setup - [[Working with the database#Database Setup|Working with the database]]&lt;br /&gt;
==== Spriting ====&lt;br /&gt;
Guide to spriting - [[Guide to spriting]]&lt;br /&gt;
==== Mapping ====&lt;br /&gt;
Guide to mapping - [[Guide to mapping]]&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Working_with_the_database&amp;diff=36404</id>
		<title>Working with the database</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Working_with_the_database&amp;diff=36404"/>
		<updated>2023-03-27T21:04:17Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: /* Setup MariaDB (Windows) */ Size up images&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Database Setup =&lt;br /&gt;
When developing, it is useful to have a local database set up, for a variety of reasons.&lt;br /&gt;
&lt;br /&gt;
This guide is a walk through for local testing database installation, however it will work for a production deployment so long as secure passwords are used and firewall settings protect the database from external connection.&lt;br /&gt;
&lt;br /&gt;
Since savefiles no longer store character info, your character and preferences will reset between each startup. This can be problematic in adding a lot of time to the development and testing cycle. As such, it’s useful to set one up. This is a guide on how to do so.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;setup-mariadb-windows&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Setup MariaDB (Windows) ==&lt;br /&gt;
Download and install [[mariadb:|MariaDB Community Server]] for your operating system. Be sure to install the following components:&lt;br /&gt;
* Database Instance&lt;br /&gt;
* Client Programs&lt;br /&gt;
* HeidiSQL&lt;br /&gt;
[[File:Db_setup-6ce6ffea237bf219c2b91d392f48b2099b7930ae.png|thumb|none|alt=image|452x452px]]&lt;br /&gt;
Set a root password, something you will remember. It doesn’t need to be properly secure if it&#039;s for local testing, since you won’t be storing anything or hosting it publicly. Do &#039;&#039;&#039;not&#039;&#039;&#039; enable remote access for root.&lt;br /&gt;
[[File:Db_setup-559f5ff4e926edda40dd87a6274c774a6b9772e0.png|thumb|none|alt=image|449x449px]]&lt;br /&gt;
Install it as a service, with networking enabled. The default settings are fine. This means it will run 24/7 in the background. You can manage this in the Windows Services viewer.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-A055e14a687b49ba5d723e90d6bbcfcae2958296.png|image]] [[File:Db_setup-d327ef8463bef045b46b8aac0848e9303d50b19d.png|image]]&lt;br /&gt;
&lt;br /&gt;
Open HeidiSQL, Click on new to create a new session, check prompt for credentials and leave the rest as default.&lt;br /&gt;
[[File:Db_setup-5268ec389c6fcf8f2ff1aa84a382090c1e5278ae.png|thumb|none|alt=image|632x632px]]&lt;br /&gt;
Click save, then click open and enter in root for the username and the password you setup during the installation.&lt;br /&gt;
[[File:Db_setup-f8c2d10d5769c57f387e0eadf1c6e67842814ac3.png|thumb|none|alt=image|638x638px]]&lt;br /&gt;
Right click on the server entry in the left side plane (the area with &amp;lt;code&amp;gt;information_schema&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt;, etc) (the server entry will be the first one) and go to &amp;lt;code&amp;gt;Create new -&amp;amp;gt; Database&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Db_setup-245204aa1d0f17218e2eb1f4a0dd4a2432696ae6.png|thumb|none|alt=image|484x484px]]&lt;br /&gt;
You can name it anything at this step. The default config is &amp;lt;code&amp;gt;ss13beedb&amp;lt;/code&amp;gt;, so go ahead and use that. Don’t name it &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt;, or you will have security issues.&lt;br /&gt;
[[File:Db_setup-598a1178e842219e1b0ae9dc12f2ef27aafbf2de.png|thumb|none|alt=image|319x319px]]&lt;br /&gt;
Select the database you just created and then go to &amp;lt;code&amp;gt;File -&amp;amp;gt; Open SQL File&amp;lt;/code&amp;gt; and open the file &amp;lt;code&amp;gt;beestation_schema.sql&amp;lt;/code&amp;gt; file located at &amp;lt;code&amp;gt;SQL/beestation_schema.sql&amp;lt;/code&amp;gt;. You can also find it [[beereporaw:master/SQL/beestation_schema.sql|here]], but it may be newer than the version you are using. If it asks you to auto-detect, hit Yes. Ignore any “access violation” errors, the import works anyway.&lt;br /&gt;
[[File:Db_setup-f0f38f6cd445af32da096c835d2492727b091f3f.png|thumb|none|alt=image|484x484px]] [[File:Db_setup-B8634fc2985464e926572ac826faa7b4379f3653.png|thumb|none|alt=image|486x486px]]&lt;br /&gt;
Press the blue play icon in the topic bar of icon hieroglyphs and pray. If the schema imported correctly you should have no errors in the message box on the bottom.&lt;br /&gt;
[[File:Db_setup-5f7d15719bbacab5f759e2905d421f60c246f95a.png|thumb|none|alt=image|718x718px]]&lt;br /&gt;
Create a new user account for the server by going to &amp;lt;code&amp;gt;Tools -&amp;amp;gt; User Manager&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Username:&#039;&#039;&#039; Anything, but &amp;lt;code&amp;gt;ss13dbuser&amp;lt;/code&amp;gt; is the default&lt;br /&gt;
* &#039;&#039;&#039;Password:&#039;&#039;&#039; Any string of random text, you don’t need to remember it, just paste it into your database config. You can randomly generate one by pressing the arrow on the password field. Be sure to copy it.&lt;br /&gt;
* &#039;&#039;&#039;From host:&#039;&#039;&#039; &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Permissions:&#039;&#039;&#039; Press “Add object”, select the database you created. Under the new object, add:&lt;br /&gt;
** &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;INSERT&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Db_setup-f125cfa6a81217aa0b33ed0431b69c626303a671.png|thumb|none|alt=image|414x414px]]&lt;br /&gt;
&amp;lt;span id=&amp;quot;update-dbconfig&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Update dbconfig ==&lt;br /&gt;
Now, on your local copy of the repository, open [[beerepo:blob/master/config/dbconfig.txt|config/dbconfig.txt]] in a text editor.&lt;br /&gt;
&lt;br /&gt;
Set the following:&lt;br /&gt;
* Uncomment &amp;lt;code&amp;gt;SQL_ENABLED&amp;lt;/code&amp;gt; by removing the &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; in front of it.&lt;br /&gt;
* &amp;lt;code&amp;gt;ADDRESS 127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;PORT 3306&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_DATABASE ss13beedb&amp;lt;/code&amp;gt; (or whatever you set)&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_LOGIN ss13dbuser&amp;lt;/code&amp;gt; (or whatever you set)&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_PASSWORD password&amp;lt;/code&amp;gt; (replace with the password you set for the created user)&lt;br /&gt;
[[File:Db_setup-dc58b4506df7c115cf8edfa191804ceba96802e5.png|thumb|none|alt=image|653x653px]]&lt;br /&gt;
&amp;lt;span id=&amp;quot;skip-worktree&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Skip Worktree ==&lt;br /&gt;
Now, on git, this will create tracked changes that you don’t want to commit to any future PRs. So you need to tell git to not process any changes in the file. If you use git command line, this is trivial.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;git update-index --skip-worktree config/dbconfig.txt&amp;lt;/code&amp;gt;. Git will now ignore changes to this file locally. If you wish to undo this at any point, run &amp;lt;code&amp;gt;git update-index --no-skip-worktree config/dbconfig.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[File:Db_setup-1681618ba8cc443a13696a952af5c720c44a54c3.png|thumb|none|alt=image|743x743px]]&lt;br /&gt;
If you do not use command line, you should still be able to accomplish this somehow, google the equivalent for whatever tool you use.&lt;br /&gt;
= Other database options =&lt;br /&gt;
== Database based banning ==&lt;br /&gt;
Offers temporary jobbans, admin bans, cross-server bans, keeps bans logged even after they&#039;ve expired or were unbanned, and allows for the use of the off-server ban log. &lt;br /&gt;
&lt;br /&gt;
To enable database based banning:&lt;br /&gt;
* Open config/config.txt&lt;br /&gt;
* Add a # in front of BAN_LEGACY_SYSTEM, so the line looks like &amp;quot;#BAN_LEGACY_SYSTEM&amp;quot;&lt;br /&gt;
* Done. Note that any legacy bans are no longer enforced once this is done! So it&#039;s a good idea to do it when you&#039;re starting up.&lt;br /&gt;
== Database based administration ==&lt;br /&gt;
Offers a changelog for changes done to admins, which increases accountability (adding/removing admins, adding/removing permissions, changing ranks); allows admins with +PERMISSIONS to edit other admins&#039; permissions ingame, meaning they don&#039;t need remote desktop access to edit admins; Allows for custom ranks, with permissions not being tied to ranks, offering a better ability for the removal or addition of permissions to certain admins, if they need to be punished, or need extra permissions. Enabling this can be done any time, it&#039;s just a bit tedious the first time you do it, if you don&#039;t have direct access to the database.&lt;br /&gt;
&lt;br /&gt;
To enable database based administration:&lt;br /&gt;
* Open config/config.txt&lt;br /&gt;
* Add a # in front of ADMIN_LEGACY_SYSTEM, so the line looks like &amp;quot;#ADMIN_LEGACY_SYSTEM&amp;quot;&lt;br /&gt;
* Do the steps described in [[Working with the database#Adding your first admin|Adding your first admin]].&lt;br /&gt;
* Done. Note that anyone in admins.txt lost admin status, including you! So do the step above! You can repeat it for everyone, as it&#039;s a lot easier to do that and just correct permissions with the ingame panel called &#039;permissions panel&#039;.&lt;br /&gt;
* If your database ever dies, your server will revert to the old admin system, so it is a good idea to have admins.txt and admin_ranks.txt set up with some admins too, just so the loss of the database doesn&#039;t completely destroy everything.&lt;br /&gt;
If you need more help contact [[Community|#coderbus]].&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Working_with_the_database&amp;diff=36403</id>
		<title>Working with the database</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Working_with_the_database&amp;diff=36403"/>
		<updated>2023-03-27T20:59:51Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Remove captions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Database Setup =&lt;br /&gt;
&lt;br /&gt;
When developing, it is useful to have a local database set up, for a variety of reasons.&lt;br /&gt;
&lt;br /&gt;
This guide is a walk through for local testing database installation, however it will work for a production deployment so long as secure passwords are used and firewall settings protect the database from external connection.&lt;br /&gt;
&lt;br /&gt;
Since savefiles no longer store character info, your character and preferences will reset between each startup. This can be problematic in adding a lot of time to the development and testing cycle. As such, it’s useful to set one up. This is a guide on how to do so.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;setup-mariadb-windows&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Setup MariaDB (Windows) ==&lt;br /&gt;
&lt;br /&gt;
Download and install [[mariadb:|MariaDB Community Server]] for your operating system. Be sure to install the following components:&lt;br /&gt;
&lt;br /&gt;
* Database Instance&lt;br /&gt;
* Client Programs&lt;br /&gt;
* HeidiSQL&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-6ce6ffea237bf219c2b91d392f48b2099b7930ae.png|thumb|none|alt=image]]&lt;br /&gt;
&lt;br /&gt;
Set a root password, something you will remember. It doesn’t need to be properly secure if it&#039;s for local testing, since you won’t be storing anything or hosting it publicly. Do &#039;&#039;&#039;not&#039;&#039;&#039; enable remote access for root.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-559f5ff4e926edda40dd87a6274c774a6b9772e0.png|thumb|none|alt=image]]&lt;br /&gt;
&lt;br /&gt;
Install it as a service, with networking enabled. The default settings are fine. This means it will run 24/7 in the background. You can manage this in the Windows Services viewer.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-A055e14a687b49ba5d723e90d6bbcfcae2958296.png|image]] [[File:Db_setup-d327ef8463bef045b46b8aac0848e9303d50b19d.png|image]]&lt;br /&gt;
&lt;br /&gt;
Open HeidiSQL, Click on new to create a new session, check prompt for credentials and leave the rest as default.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-5268ec389c6fcf8f2ff1aa84a382090c1e5278ae.png|thumb|none|alt=image]]&lt;br /&gt;
&lt;br /&gt;
Click save, then click open and enter in root for the username and the password you setup during the installation.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-f8c2d10d5769c57f387e0eadf1c6e67842814ac3.png|thumb|none|alt=image]]&lt;br /&gt;
&lt;br /&gt;
Right click on the server entry in the left side plane (the area with &amp;lt;code&amp;gt;information_schema&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt;, etc) (the server entry will be the first one) and go to &amp;lt;code&amp;gt;Create new -&amp;amp;gt; Database&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-245204aa1d0f17218e2eb1f4a0dd4a2432696ae6.png|thumb|none|alt=image]]&lt;br /&gt;
&lt;br /&gt;
You can name it anything at this step. The default config is &amp;lt;code&amp;gt;ss13beedb&amp;lt;/code&amp;gt;, so go ahead and use that. Don’t name it &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt;, or you will have security issues.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-598a1178e842219e1b0ae9dc12f2ef27aafbf2de.png|thumb|none|alt=image]]&lt;br /&gt;
&lt;br /&gt;
Select the database you just created and then go to &amp;lt;code&amp;gt;File -&amp;amp;gt; Open SQL File&amp;lt;/code&amp;gt; and open the file &amp;lt;code&amp;gt;beestation_schema.sql&amp;lt;/code&amp;gt; file located at &amp;lt;code&amp;gt;SQL/beestation_schema.sql&amp;lt;/code&amp;gt;. You can also find it [[beereporaw:master/SQL/beestation_schema.sql|here]], but it may be newer than the version you are using. If it asks you to auto-detect, hit Yes. Ignore any “access violation” errors, the import works anyway.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-f0f38f6cd445af32da096c835d2492727b091f3f.png|thumb|none|alt=image]] [[File:Db_setup-B8634fc2985464e926572ac826faa7b4379f3653.png|thumb|none|alt=image]]&lt;br /&gt;
&lt;br /&gt;
Press the blue play icon in the topic bar of icon hieroglyphs and pray. If the schema imported correctly you should have no errors in the message box on the bottom.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-5f7d15719bbacab5f759e2905d421f60c246f95a.png|thumb|none|alt=image]]&lt;br /&gt;
&lt;br /&gt;
Create a new user account for the server by going to &amp;lt;code&amp;gt;Tools -&amp;amp;gt; User Manager&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Username:&#039;&#039;&#039; Anything, but &amp;lt;code&amp;gt;ss13dbuser&amp;lt;/code&amp;gt; is the default&lt;br /&gt;
* &#039;&#039;&#039;Password:&#039;&#039;&#039; Any string of random text, you don’t need to remember it, just paste it into your database config. You can randomly generate one by pressing the arrow on the password field. Be sure to copy it.&lt;br /&gt;
* &#039;&#039;&#039;From host:&#039;&#039;&#039; &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Permissions:&#039;&#039;&#039; Press “Add object”, select the database you created. Under the new object, add:&lt;br /&gt;
** &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;INSERT&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-f125cfa6a81217aa0b33ed0431b69c626303a671.png|thumb|none|alt=image]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;update-dbconfig&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Update dbconfig ==&lt;br /&gt;
&lt;br /&gt;
Now, on your local copy of the repository, open [[beerepo:blob/master/config/dbconfig.txt|config/dbconfig.txt]] in a text editor.&lt;br /&gt;
&lt;br /&gt;
Set the following:&lt;br /&gt;
&lt;br /&gt;
* Uncomment &amp;lt;code&amp;gt;SQL_ENABLED&amp;lt;/code&amp;gt; by removing the &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; in front of it.&lt;br /&gt;
* &amp;lt;code&amp;gt;ADDRESS 127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;PORT 3306&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_DATABASE ss13beedb&amp;lt;/code&amp;gt; (or whatever you set)&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_LOGIN ss13dbuser&amp;lt;/code&amp;gt; (or whatever you set)&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_PASSWORD password&amp;lt;/code&amp;gt; (replace with the password you set for the created user)&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-dc58b4506df7c115cf8edfa191804ceba96802e5.png|thumb|none|alt=image]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;skip-worktree&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Skip Worktree ==&lt;br /&gt;
&lt;br /&gt;
Now, on git, this will create tracked changes that you don’t want to commit to any future PRs. So you need to tell git to not process any changes in the file. If you use git command line, this is trivial.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;git update-index --skip-worktree config/dbconfig.txt&amp;lt;/code&amp;gt;. Git will now ignore changes to this file locally. If you wish to undo this at any point, run &amp;lt;code&amp;gt;git update-index --no-skip-worktree config/dbconfig.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-1681618ba8cc443a13696a952af5c720c44a54c3.png|thumb|none|alt=image]]&lt;br /&gt;
&lt;br /&gt;
If you do not use command line, you should still be able to accomplish this somehow, google the equivalent for whatever tool you use.&lt;br /&gt;
&lt;br /&gt;
= Other database options =&lt;br /&gt;
&lt;br /&gt;
== Database based banning ==&lt;br /&gt;
Offers temporary jobbans, admin bans, cross-server bans, keeps bans logged even after they&#039;ve expired or were unbanned, and allows for the use of the off-server ban log. &lt;br /&gt;
&lt;br /&gt;
To enable database based banning:&lt;br /&gt;
* Open config/config.txt&lt;br /&gt;
* Add a # in front of BAN_LEGACY_SYSTEM, so the line looks like &amp;quot;#BAN_LEGACY_SYSTEM&amp;quot;&lt;br /&gt;
* Done. Note that any legacy bans are no longer enforced once this is done! So it&#039;s a good idea to do it when you&#039;re starting up.&lt;br /&gt;
&lt;br /&gt;
== Database based administration ==&lt;br /&gt;
Offers a changelog for changes done to admins, which increases accountability (adding/removing admins, adding/removing permissions, changing ranks); allows admins with +PERMISSIONS to edit other admins&#039; permissions ingame, meaning they don&#039;t need remote desktop access to edit admins; Allows for custom ranks, with permissions not being tied to ranks, offering a better ability for the removal or addition of permissions to certain admins, if they need to be punished, or need extra permissions. Enabling this can be done any time, it&#039;s just a bit tedious the first time you do it, if you don&#039;t have direct access to the database.&lt;br /&gt;
&lt;br /&gt;
To enable database based administration:&lt;br /&gt;
* Open config/config.txt&lt;br /&gt;
* Add a # in front of ADMIN_LEGACY_SYSTEM, so the line looks like &amp;quot;#ADMIN_LEGACY_SYSTEM&amp;quot;&lt;br /&gt;
* Do the steps described in [[Working with the database#Adding your first admin|Adding your first admin]].&lt;br /&gt;
* Done. Note that anyone in admins.txt lost admin status, including you! So do the step above! You can repeat it for everyone, as it&#039;s a lot easier to do that and just correct permissions with the ingame panel called &#039;permissions panel&#039;.&lt;br /&gt;
* If your database ever dies, your server will revert to the old admin system, so it is a good idea to have admins.txt and admin_ranks.txt set up with some admins too, just so the loss of the database doesn&#039;t completely destroy everything.&lt;br /&gt;
If you need more help contact [[Community|#coderbus]].&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=Working_with_the_database&amp;diff=36402</id>
		<title>Working with the database</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=Working_with_the_database&amp;diff=36402"/>
		<updated>2023-03-27T20:54:20Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: Created page with &amp;quot;= Database Setup =  When developing, it is useful to have a local database set up, for a variety of reasons.  This guide is a walk through for local testing database installation, however it will work for a production deployment so long as secure passwords are used and firewall settings protect the database from external connection.  Since savefiles no longer store character info, your character and preferences will reset between each startup. This can be problematic in...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Database Setup =&lt;br /&gt;
&lt;br /&gt;
When developing, it is useful to have a local database set up, for a variety of reasons.&lt;br /&gt;
&lt;br /&gt;
This guide is a walk through for local testing database installation, however it will work for a production deployment so long as secure passwords are used and firewall settings protect the database from external connection.&lt;br /&gt;
&lt;br /&gt;
Since savefiles no longer store character info, your character and preferences will reset between each startup. This can be problematic in adding a lot of time to the development and testing cycle. As such, it’s useful to set one up. This is a guide on how to do so.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;setup-mariadb-windows&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Setup MariaDB (Windows) ==&lt;br /&gt;
&lt;br /&gt;
Download and install [[mariadb:|MariaDB Community Server]] for your operating system. Be sure to install the following components:&lt;br /&gt;
&lt;br /&gt;
* Database Instance&lt;br /&gt;
* Client Programs&lt;br /&gt;
* HeidiSQL&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-6ce6ffea237bf219c2b91d392f48b2099b7930ae.png|thumb|none|alt=image|image]]&lt;br /&gt;
&lt;br /&gt;
Set a root password, something you will remember. It doesn’t need to be properly secure if it&#039;s for local testing, since you won’t be storing anything or hosting it publicly. Do &#039;&#039;&#039;not&#039;&#039;&#039; enable remote access for root.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-559f5ff4e926edda40dd87a6274c774a6b9772e0.png|thumb|none|alt=image|image]]&lt;br /&gt;
&lt;br /&gt;
Install it as a service, with networking enabled. The default settings are fine. This means it will run 24/7 in the background. You can manage this in the Windows Services viewer.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-A055e14a687b49ba5d723e90d6bbcfcae2958296.png|image]] [[File:Db_setup-d327ef8463bef045b46b8aac0848e9303d50b19d.png|image]]&lt;br /&gt;
&lt;br /&gt;
Open HeidiSQL, Click on new to create a new session, check prompt for credentials and leave the rest as default.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-5268ec389c6fcf8f2ff1aa84a382090c1e5278ae.png|thumb|none|alt=image|image]]&lt;br /&gt;
&lt;br /&gt;
Click save, then click open and enter in root for the username and the password you setup during the installation.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-f8c2d10d5769c57f387e0eadf1c6e67842814ac3.png|thumb|none|alt=image|image]]&lt;br /&gt;
&lt;br /&gt;
Right click on the server entry in the left side plane (the area with &amp;lt;code&amp;gt;information_schema&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt;, etc) (the server entry will be the first one) and go to &amp;lt;code&amp;gt;Create new -&amp;amp;gt; Database&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-245204aa1d0f17218e2eb1f4a0dd4a2432696ae6.png|thumb|none|alt=image|image]]&lt;br /&gt;
&lt;br /&gt;
You can name it anything at this step. The default config is &amp;lt;code&amp;gt;ss13beedb&amp;lt;/code&amp;gt;, so go ahead and use that. Don’t name it &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt;, or you will have security issues.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-598a1178e842219e1b0ae9dc12f2ef27aafbf2de.png|thumb|none|alt=image|image]]&lt;br /&gt;
&lt;br /&gt;
Select the database you just created and then go to &amp;lt;code&amp;gt;File -&amp;amp;gt; Open SQL File&amp;lt;/code&amp;gt; and open the file &amp;lt;code&amp;gt;beestation_schema.sql&amp;lt;/code&amp;gt; file located at &amp;lt;code&amp;gt;SQL/beestation_schema.sql&amp;lt;/code&amp;gt;. You can also find it [[beereporaw:master/SQL/beestation_schema.sql|here]], but it may be newer than the version you are using. If it asks you to auto-detect, hit Yes. Ignore any “access violation” errors, the import works anyway.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-f0f38f6cd445af32da096c835d2492727b091f3f.png|image]] [[File:Db_setup-B8634fc2985464e926572ac826faa7b4379f3653.png|image]]&lt;br /&gt;
&lt;br /&gt;
Press the blue play icon in the topic bar of icon hieroglyphs and pray. If the schema imported correctly you should have no errors in the message box on the bottom.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-5f7d15719bbacab5f759e2905d421f60c246f95a.png|thumb|none|alt=image|image]]&lt;br /&gt;
&lt;br /&gt;
Create a new user account for the server by going to &amp;lt;code&amp;gt;Tools -&amp;amp;gt; User Manager&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Username:&#039;&#039;&#039; Anything, but &amp;lt;code&amp;gt;ss13dbuser&amp;lt;/code&amp;gt; is the default&lt;br /&gt;
* &#039;&#039;&#039;Password:&#039;&#039;&#039; Any string of random text, you don’t need to remember it, just paste it into your database config. You can randomly generate one by pressing the arrow on the password field. Be sure to copy it.&lt;br /&gt;
* &#039;&#039;&#039;From host:&#039;&#039;&#039; &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Permissions:&#039;&#039;&#039; Press “Add object”, select the database you created. Under the new object, add:&lt;br /&gt;
** &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;INSERT&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-f125cfa6a81217aa0b33ed0431b69c626303a671.png|thumb|none|alt=image|image]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;update-dbconfig&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Update dbconfig ==&lt;br /&gt;
&lt;br /&gt;
Now, on your local copy of the repository, open [[beerepo:blob/master/config/dbconfig.txt|config/dbconfig.txt]] in a text editor.&lt;br /&gt;
&lt;br /&gt;
Set the following:&lt;br /&gt;
&lt;br /&gt;
* Uncomment &amp;lt;code&amp;gt;SQL_ENABLED&amp;lt;/code&amp;gt; by removing the &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; in front of it.&lt;br /&gt;
* &amp;lt;code&amp;gt;ADDRESS 127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;PORT 3306&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_DATABASE ss13beedb&amp;lt;/code&amp;gt; (or whatever you set)&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_LOGIN ss13dbuser&amp;lt;/code&amp;gt; (or whatever you set)&lt;br /&gt;
* &amp;lt;code&amp;gt;FEEDBACK_PASSWORD password&amp;lt;/code&amp;gt; (replace with the password you set for the created user)&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-dc58b4506df7c115cf8edfa191804ceba96802e5.png|thumb|none|alt=image|image]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;skip-worktree&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Skip Worktree ==&lt;br /&gt;
&lt;br /&gt;
Now, on git, this will create tracked changes that you don’t want to commit to any future PRs. So you need to tell git to not process any changes in the file. If you use git command line, this is trivial.&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;git update-index --skip-worktree config/dbconfig.txt&amp;lt;/code&amp;gt;. Git will now ignore changes to this file locally. If you wish to undo this at any point, run &amp;lt;code&amp;gt;git update-index --no-skip-worktree config/dbconfig.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Db_setup-1681618ba8cc443a13696a952af5c720c44a54c3.png|thumb|none|alt=image|image]]&lt;br /&gt;
&lt;br /&gt;
If you do not use command line, you should still be able to accomplish this somehow, google the equivalent for whatever tool you use.&lt;br /&gt;
&lt;br /&gt;
= Other database options =&lt;br /&gt;
&lt;br /&gt;
== Database based banning ==&lt;br /&gt;
Offers temporary jobbans, admin bans, cross-server bans, keeps bans logged even after they&#039;ve expired or were unbanned, and allows for the use of the off-server ban log. &lt;br /&gt;
&lt;br /&gt;
To enable database based banning:&lt;br /&gt;
* Open config/config.txt&lt;br /&gt;
* Add a # in front of BAN_LEGACY_SYSTEM, so the line looks like &amp;quot;#BAN_LEGACY_SYSTEM&amp;quot;&lt;br /&gt;
* Done. Note that any legacy bans are no longer enforced once this is done! So it&#039;s a good idea to do it when you&#039;re starting up.&lt;br /&gt;
&lt;br /&gt;
== Database based administration ==&lt;br /&gt;
Offers a changelog for changes done to admins, which increases accountability (adding/removing admins, adding/removing permissions, changing ranks); allows admins with +PERMISSIONS to edit other admins&#039; permissions ingame, meaning they don&#039;t need remote desktop access to edit admins; Allows for custom ranks, with permissions not being tied to ranks, offering a better ability for the removal or addition of permissions to certain admins, if they need to be punished, or need extra permissions. Enabling this can be done any time, it&#039;s just a bit tedious the first time you do it, if you don&#039;t have direct access to the database.&lt;br /&gt;
&lt;br /&gt;
To enable database based administration:&lt;br /&gt;
* Open config/config.txt&lt;br /&gt;
* Add a # in front of ADMIN_LEGACY_SYSTEM, so the line looks like &amp;quot;#ADMIN_LEGACY_SYSTEM&amp;quot;&lt;br /&gt;
* Do the steps described in [[Working with the database#Adding your first admin|Adding your first admin]].&lt;br /&gt;
* Done. Note that anyone in admins.txt lost admin status, including you! So do the step above! You can repeat it for everyone, as it&#039;s a lot easier to do that and just correct permissions with the ingame panel called &#039;permissions panel&#039;.&lt;br /&gt;
* If your database ever dies, your server will revert to the old admin system, so it is a good idea to have admins.txt and admin_ranks.txt set up with some admins too, just so the loss of the database doesn&#039;t completely destroy everything.&lt;br /&gt;
If you need more help contact [[Community|#coderbus]].&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=File:Db_setup-f125cfa6a81217aa0b33ed0431b69c626303a671.png&amp;diff=36401</id>
		<title>File:Db setup-f125cfa6a81217aa0b33ed0431b69c626303a671.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=File:Db_setup-f125cfa6a81217aa0b33ed0431b69c626303a671.png&amp;diff=36401"/>
		<updated>2023-03-27T20:32:47Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=File:Db_setup-f8c2d10d5769c57f387e0eadf1c6e67842814ac3.png&amp;diff=36400</id>
		<title>File:Db setup-f8c2d10d5769c57f387e0eadf1c6e67842814ac3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=File:Db_setup-f8c2d10d5769c57f387e0eadf1c6e67842814ac3.png&amp;diff=36400"/>
		<updated>2023-03-27T20:32:37Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
	<entry>
		<id>https://wiki.beestation13.com/w/index.php?title=File:Db_setup-f0f38f6cd445af32da096c835d2492727b091f3f.png&amp;diff=36399</id>
		<title>File:Db setup-f0f38f6cd445af32da096c835d2492727b091f3f.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.beestation13.com/w/index.php?title=File:Db_setup-f0f38f6cd445af32da096c835d2492727b091f3f.png&amp;diff=36399"/>
		<updated>2023-03-27T20:32:23Z</updated>

		<summary type="html">&lt;p&gt;Itsmeowdev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Itsmeowdev</name></author>
	</entry>
</feed>