diff --git a/.travis.yml b/.travis.yml
index a0a6ed28ae..b6eb33966b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,7 +5,7 @@ sudo: false
env:
BYOND_MAJOR="511"
BYOND_MINOR="1381"
- MACRO_COUNT=209
+ MACRO_COUNT=4
cache:
directories:
diff --git a/README.md b/README.md
index f7cb9e497a..697c804848 100644
--- a/README.md
+++ b/README.md
@@ -7,16 +7,18 @@ Polaris is a fork of the Baystation12 code branch for the game Spacestation13.
---
### LICENSE
-Polaris is licensed under the GNU Affero General Public License version 3, which can be found in full in LICENSE-AGPL3.txt.
+The code for Polaris is licensed under the [GNU Affero General Public License](http://www.gnu.org/licenses/agpl.html) version 3, which can be found in full in LICENSE-AGPL3.txt.
-Commits with a git authorship date prior to `1420675200 +0000` (2015/01/08 00:00) are licensed under the GNU General Public License version 3, which can be found in full in LICENSE-GPL3.txt.
+Code with a git authorship date prior to `1420675200 +0000` (2015/01/08 00:00) are licensed under the GNU General Public License version 3, which can be found in full in LICENSE-GPL3.txt.
-All commits whose authorship dates are not prior to `1420675200 +0000` are assumed to be licensed under AGPL v3, if you wish to license under GPL v3 please make this clear in the commit message and any added files.
+All code whose authorship dates are not prior to `1420675200 +0000` are assumed to be licensed under AGPL v3, if you wish to license under GPL v3 please make this clear in the commit message and any added files.
-If you wish to develop and host this codebase in a closed source manner you may use all commits prior to `1420675200 +0000`, which are licensed under GPL v3. The major change here is that if you host a server using any code licensed under AGPLv3 you are required to provide full source code for your servers users as well including addons and modifications you have made.
+If you wish to develop and host this codebase in a closed source manner you may use all code prior to `1420675200 +0000`, which are licensed under GPL v3. The major change here is that if you host a server using any code licensed under AGPLv3 you are required to provide full source code for your servers users as well including addons and modifications you have made.
See [here](https://www.gnu.org/licenses/why-affero-gpl.html) for more information.
+All assets including icons and sound are under a [CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/) license unless otherwise indicated.
+
### GETTING THE CODE
The simplest way to obtain the code is using the github .zip feature.
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index 3fccbb50f3..07e3f12524 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -107,6 +107,7 @@
"filter_co2" = ("carbon_dioxide" in scrubbing_gas),
"filter_phoron" = ("phoron" in scrubbing_gas),
"filter_n2o" = ("sleeping_agent" in scrubbing_gas),
+ "filter_fuel" = ("volatile_fuel" in scrubbing_gas),
"sigtype" = "status"
)
if(!initial_loc.air_scrub_names[id_tag])
@@ -233,6 +234,11 @@
else if(signal.data["toggle_n2o_scrub"])
toggle += "sleeping_agent"
+ if(!isnull(signal.data["fuel_scrub"]) && text2num(signal.data["fuel_scrub"]) != ("volatile_fuel" in scrubbing_gas))
+ toggle += "volatile_fuel"
+ else if(signal.data["toggle_fuel_scrub"])
+ toggle += "volatile_fuel"
+
scrubbing_gas ^= toggle
if(signal.data["init"] != null)
diff --git a/code/__defines/atmos.dm b/code/__defines/atmos.dm
index f67c967157..bd9175aab1 100644
--- a/code/__defines/atmos.dm
+++ b/code/__defines/atmos.dm
@@ -74,6 +74,7 @@
#define XGM_GAS_FUEL 1
#define XGM_GAS_OXIDIZER 2
#define XGM_GAS_CONTAMINANT 4
+#define XGM_GAS_FUSION_FUEL 8
#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) // Tank starts leaking.
#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) // Tank spills all contents into atmosphere.
diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 12deebbfc1..f3b448ee49 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -198,3 +198,6 @@
#define TSC_GIL "Gilthari"
#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day
+
+#define WORLD_ICON_SIZE 32 //Needed for the R-UST port
+#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 //Needed for the R-UST port
diff --git a/code/_macros.dm b/code/_macros.dm
index a3e4065544..454a4eaacd 100644
--- a/code/_macros.dm
+++ b/code/_macros.dm
@@ -38,6 +38,8 @@
#define issilicon(A) istype(A, /mob/living/silicon)
+#define isvoice(A) istype(A, /mob/living/voice)
+
#define isslime(A) istype(A, /mob/living/carbon/slime)
#define isxeno(A) istype(A, /mob/living/simple_animal/xeno)
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index ff0d8cdd5b..f3b696ad28 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -243,7 +243,7 @@ var/obj/screen/robot_inventory
//Unfortunately adding the emag module to the list of modules has to be here. This is because a borg can
//be emagged before they actually select a module. - or some situation can cause them to get a new module
// - or some situation might cause them to get de-emagged or something.
- if(r.emagged)
+ if(r.emagged || r.emag_items)
if(!(r.module.emag in r.module.modules))
r.module.modules.Add(r.module.emag)
else
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 0b524befec..cb49518bd8 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -407,7 +407,7 @@
else if (href_list["obj_announce"])
var/obj_count = 1
- current << "\blue Your current objectives:"
+ current << "Your current objectives:"
for(var/datum/objective/objective in objectives)
current << "Objective #[obj_count]: [objective.explanation_text]"
obj_count++
diff --git a/code/datums/supplypacks/engineering.dm b/code/datums/supplypacks/engineering.dm
index 0cf0e1f52a..ad251c5f7e 100644
--- a/code/datums/supplypacks/engineering.dm
+++ b/code/datums/supplypacks/engineering.dm
@@ -200,3 +200,52 @@
/obj/item/weapon/stock_parts/matter_bin,
/obj/item/weapon/circuitboard/pacman/super
)
+
+/datum/supply_packs/eng/fusion_core
+ name = "R-UST Mk. 8 Tokamak fusion core crate"
+ cost = 50
+ containername = "R-UST Mk. 8 Tokamak Fusion Core crate"
+ containertype = /obj/structure/closet/crate/secure/engineering
+ access = access_engine
+ contains = list(
+ /obj/item/weapon/book/manual/rust_engine,
+ /obj/machinery/power/fusion_core,
+ /obj/item/weapon/circuitboard/fusion_core
+ )
+
+/datum/supply_packs/eng/fusion_fuel_injector
+ name = "R-UST Mk. 8 fuel injector crate"
+ cost = 30
+ containername = "R-UST Mk. 8 fuel injector crate"
+ containertype = /obj/structure/closet/crate/secure/engineering
+ access = access_engine
+ contains = list(
+ /obj/machinery/fusion_fuel_injector,
+ /obj/machinery/fusion_fuel_injector,
+ /obj/item/weapon/circuitboard/fusion_injector
+ )
+
+/datum/supply_packs/eng/gyrotron
+ name = "Gyrotron crate"
+ cost = 15
+ containername = "Gyrotron Crate"
+ containertype = /obj/structure/closet/crate/secure/engineering
+ access = access_engine
+ contains = list(
+ /obj/machinery/power/emitter/gyrotron,
+ /obj/item/weapon/circuitboard/gyrotron
+ )
+
+/datum/supply_packs/eng/fusion_fuel_compressor
+ name = "Fusion Fuel Compressor circuitry crate"
+ cost = 10
+ containername = "Fusion Fuel Compressor circuitry crate"
+ containertype = /obj/structure/closet/crate/engineering
+ contains = list(/obj/item/weapon/circuitboard/fusion_fuel_compressor)
+
+/datum/supply_packs/eng/tritium
+ name = "Tritium crate"
+ cost = 75
+ containername = "Tritium crate"
+ containertype = /obj/structure/closet/crate/engineering
+ contains = list(/obj/fiftyspawner/tritium)
\ No newline at end of file
diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm
index 0c616793ca..c28fed46b9 100644
--- a/code/datums/uplink/medical.dm
+++ b/code/datums/uplink/medical.dm
@@ -39,6 +39,26 @@
item_cost = 10
path = /obj/item/weapon/storage/box/freezer
+/datum/uplink_item/item/medical/monkeycubes
+ name = "Box, Monkey Cubes"
+ item_cost = 10
+ path = /obj/item/weapon/storage/box/monkeycubes
+
+/datum/uplink_item/item/medical/farwacubes
+ name = "Box, Farwa Cubes"
+ item_cost = 10
+ path = /obj/item/weapon/storage/box/monkeycubes
+
+/datum/uplink_item/item/medical/neaeracubes
+ name = "Box, Neaera Cubes"
+ item_cost = 10
+ path = /obj/item/weapon/storage/box/monkeycubes/neaeracubes
+
+/datum/uplink_item/item/medical/stokcubes
+ name = "Box, Stok Cubes"
+ item_cost = 10
+ path = /obj/item/weapon/storage/box/monkeycubes/stokcubes
+
/datum/uplink_item/item/medical/surgery
name = "Surgery kit"
item_cost = 45
diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm
index 0cb7ce1d1d..94b1281dd3 100644
--- a/code/datums/uplink/uplink_items.dm
+++ b/code/datums/uplink/uplink_items.dm
@@ -5,7 +5,7 @@ var/datum/uplink/uplink = new()
var/list/datum/uplink_item/items
var/list/datum/uplink_category/categories
-/datum/uplink/New()
+/datum/uplink/New(var/type)
items_assoc = list()
items = init_subtypes(/datum/uplink_item)
categories = init_subtypes(/datum/uplink_category)
@@ -38,7 +38,8 @@ var/datum/uplink/uplink = new()
/datum/uplink_item/New()
..()
- antag_roles = list()
+ if(!antag_roles)
+ antag_roles = list()
@@ -85,8 +86,9 @@ var/datum/uplink/uplink = new()
for(var/antag_role in antag_roles)
var/datum/antagonist/antag = all_antag_types[antag_role]
- if(antag.is_antagonist(U.uplink_owner))
- return 1
+ if(!isnull(antag))
+ if(antag.is_antagonist(U.uplink_owner))
+ return 1
return 0
/datum/uplink_item/proc/cost(var/telecrystals, obj/item/device/uplink/U)
diff --git a/code/datums/uplink/visible_weapons.dm b/code/datums/uplink/visible_weapons.dm
index 636f74be8f..ba9ce3660a 100644
--- a/code/datums/uplink/visible_weapons.dm
+++ b/code/datums/uplink/visible_weapons.dm
@@ -15,10 +15,45 @@
path = /obj/item/weapon/material/hatchet/tacknife/combatknife
/datum/uplink_item/item/visible_weapons/energy_sword
- name = "Energy Sword"
+ name = "Energy Sword, Random"
item_cost = 40
path = /obj/item/weapon/melee/energy/sword
+/datum/uplink_item/item/visible_weapons/energy_sword_blue
+ name = "Energy Sword, Blue"
+ item_cost = 40
+ path = /obj/item/weapon/melee/energy/sword/blue
+
+/datum/uplink_item/item/visible_weapons/energy_sword_green
+ name = "Energy Sword, Green"
+ item_cost = 40
+ path = /obj/item/weapon/melee/energy/sword/green
+
+/datum/uplink_item/item/visible_weapons/energy_sword_red
+ name = "Energy Sword, Red"
+ item_cost = 40
+ path = /obj/item/weapon/melee/energy/sword/red
+
+/datum/uplink_item/item/visible_weapons/energy_sword_purple
+ name = "Energy Sword, Purple"
+ item_cost = 40
+ path = /obj/item/weapon/melee/energy/sword/purple
+
+/datum/uplink_item/item/visible_weapons/energy_sword_pirate
+ name = "Energy Cutlass"
+ item_cost = 40
+ path = /obj/item/weapon/melee/energy/sword/pirate
+
+/datum/uplink_item/item/visible_weapons/claymore
+ name = "Claymore"
+ item_cost = 40
+ path = /obj/item/weapon/material/sword
+
+/datum/uplink_item/item/visible_weapons/katana
+ name = "Katana"
+ item_cost = 40
+ path = /obj/item/weapon/material/sword/katana
+
/datum/uplink_item/item/visible_weapons/dartgun
name = "Dart Gun"
item_cost = 30
@@ -44,15 +79,38 @@
item_cost = 70
path = /obj/item/weapon/gun/projectile/revolver
+/datum/uplink_item/item/visible_weapons/mateba
+ name = "Mateba"
+ item_cost = 70
+ path = /obj/item/weapon/gun/projectile/revolver/mateba
+
+/datum/uplink_item/item/visible_weapons/judge
+ name = "Judge"
+ item_cost = 70
+ path = /obj/item/weapon/gun/projectile/revolver/judge
+
+/datum/uplink_item/item/visible_weapons/lemat
+ name = "LeMat"
+ item_cost = 60
+ path = /obj/item/weapon/gun/projectile/revolver/lemat
+
/datum/uplink_item/item/visible_weapons/Derringer
name = ".357 Derringer Pistol"
item_cost = 40
path = /obj/item/weapon/gun/projectile/derringer
-/datum/uplink_item/item/visible_weapons/heavysniper
+/datum/uplink_item/item/visible_weapons/heavysnipermerc
name = "Anti-Materiel Rifle (14.5mm)"
item_cost = DEFAULT_TELECRYSTAL_AMOUNT
path = /obj/item/weapon/gun/projectile/heavysniper
+ antag_roles = list("mercenary")
+
+/datum/uplink_item/item/visible_weapons/heavysnipertraitor
+ name = "Anti-Materiel Rifle (14.5mm)"
+ desc = "A convenient collapsible rifle for covert assassination. Comes with 4 shots and its own secure carrying case."
+ item_cost = DEFAULT_TELECRYSTAL_AMOUNT
+ path = /obj/item/weapon/storage/secure/briefcase/rifle
+ antag_roles = list("traitor")
/datum/uplink_item/item/visible_weapons/tommygun
name = "Tommygun (.45)" // We're keeping this because it's CLASSY. -Spades
@@ -75,6 +133,11 @@
item_cost = 75
path = /obj/item/weapon/gun/projectile/shotgun/pump/combat
+/datum/uplink_item/item/visible_weapons/leveraction
+ name = "Lever Action Rifle"
+ item_cost = 50
+ path = /obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever
+
/datum/uplink_item/item/visible_weapons/egun
name = "Energy Gun"
item_cost = 60
diff --git a/code/defines/gases.dm b/code/defines/gases.dm
index 65e45c31ef..74cb0d9379 100644
--- a/code/defines/gases.dm
+++ b/code/defines/gases.dm
@@ -33,7 +33,7 @@
tile_overlay = "phoron"
overlay_limit = 0.7
- flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT
+ flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT | XGM_GAS_FUSION_FUEL //R-UST port, adding XGM_GAS_FUSION_FUEL flag.
/decl/xgm_gas/volatile_fuel
id = "volatile_fuel"
diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm
index 4b2afa1df3..b36c27e116 100644
--- a/code/game/antagonist/antagonist.dm
+++ b/code/game/antagonist/antagonist.dm
@@ -111,9 +111,6 @@
else if(config.use_age_restriction_for_antags && player.current.client.player_age < minimum_player_age)
candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: Is only [player.current.client.player_age] day\s old, has to be [minimum_player_age] day\s!")
- else if(istype(player.current, /mob/living/voice))
- candidates -= player
- log_debug("[key_name(player)] is not eligible to become a [role_text]: They are only a communicator voice. They have been removed from the draft.")
else if(player.special_role)
candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: They already have a special role ([player.special_role])! They have been removed from the draft.")
diff --git a/code/game/antagonist/antagonist_helpers.dm b/code/game/antagonist/antagonist_helpers.dm
index 0cc28d5ad2..c8f2928ced 100644
--- a/code/game/antagonist/antagonist_helpers.dm
+++ b/code/game/antagonist/antagonist_helpers.dm
@@ -1,12 +1,16 @@
/datum/antagonist/proc/can_become_antag(var/datum/mind/player, var/ignore_role)
- if(player.current && jobban_isbanned(player.current, bantype))
- return 0
+ if(player.current)
+ if(jobban_isbanned(player.current, bantype))
+ return FALSE
+ if(!isnewplayer(player.current) && !isobserver(player.current))
+ if(!player.current.can_be_antagged) // Stop autotraitoring pAIs!
+ return FALSE
if(!ignore_role)
if(player.assigned_role in restricted_jobs)
- return 0
+ return FALSE
if(config.protect_roles_from_antagonist && (player.assigned_role in protected_jobs))
- return 0
- return 1
+ return FALSE
+ return TRUE
/datum/antagonist/proc/antags_are_dead()
for(var/datum/mind/antag in current_antagonists)
diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm
index fb09e76a55..8e4b8826b4 100644
--- a/code/game/antagonist/outsider/mercenary.dm
+++ b/code/game/antagonist/outsider/mercenary.dm
@@ -17,7 +17,7 @@ var/datum/antagonist/mercenary/mercs
hard_cap = 4
hard_cap_round = 8
initial_spawn_req = 3
- initial_spawn_target = 4
+ initial_spawn_target = 3
/datum/antagonist/mercenary/New()
..()
diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm
index 4124fc9af9..7ac0a4729b 100644
--- a/code/game/antagonist/outsider/raider.dm
+++ b/code/game/antagonist/outsider/raider.dm
@@ -12,10 +12,10 @@ var/datum/antagonist/raider/raiders
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER
antaghud_indicator = "hudmutineer"
- hard_cap = 6
- hard_cap_round = 10
+ hard_cap = 4
+ hard_cap_round = 8
initial_spawn_req = 3
- initial_spawn_target = 4
+ initial_spawn_target = 3
id_type = /obj/item/weapon/card/id/syndicate
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index a28dd27036..af0eccf93c 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -92,6 +92,11 @@
for(var/mob/M in src)//Failsafe so you can get mobs out
M.loc = get_turf(src)
+/obj/machinery/dna_scannernew/MouseDrop_T(var/mob/target, var/mob/user) //Allows borgs to clone people without external assistance
+ if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target))
+ return
+ put_in(target)
+
/obj/machinery/dna_scannernew/verb/move_inside()
set src in oview(1)
set category = "Object"
diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm
index 5ec37a5b70..ca8a3c8780 100644
--- a/code/game/gamemodes/changeling/powers/armor.dm
+++ b/code/game/gamemodes/changeling/powers/armor.dm
@@ -112,9 +112,6 @@
"We harden our flesh, creating a suit of armor!",
"You hear organic matter ripping and tearing!")
-/obj/item/clothing/suit/space/changeling/armored/dropped()
- qdel(src)
-
/obj/item/clothing/head/helmet/space/changeling/armored
name = "chitinous mass"
desc = "A tough, hard covering of black chitin with transparent chitin in front."
@@ -123,19 +120,12 @@
siemens_coefficient = 0.3
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
-/obj/item/clothing/head/helmet/space/changeling/armored/dropped()
- qdel(src)
-
/obj/item/clothing/shoes/magboots/changeling/armored
desc = "A tough, hard mass of chitin, with long talons for digging into terrain."
name = "chitinous talons"
icon_state = "lingarmor"
action_button_name = "Toggle Talons"
-/obj/item/clothing/shoes/magboots/changeling/armored/dropped()
- ..()
- qdel(src)
-
/obj/item/clothing/gloves/combat/changeling //Combined insulated/fireproof gloves
name = "chitinous gauntlets"
desc = "Very resilient gauntlets made out of black chitin. It looks very durable, and can probably resist electrical shock in addition to the elements."
diff --git a/code/game/gamemodes/changeling/powers/fake_death.dm b/code/game/gamemodes/changeling/powers/fake_death.dm
index 765dbb51e6..cae98164a0 100644
--- a/code/game/gamemodes/changeling/powers/fake_death.dm
+++ b/code/game/gamemodes/changeling/powers/fake_death.dm
@@ -33,6 +33,9 @@
if(C.suiciding)
C.suiciding = 0
+ if(C.does_not_breathe)
+ C.does_not_breathe = 0 //This means they don't autoheal the oxy damage from the next step
+
if(C.stat != DEAD)
C.adjustOxyLoss(C.maxHealth * 2)
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index b9418bfea9..48f0f02bfc 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -7,9 +7,9 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
/datum/game_mode/heist
name = "Heist"
config_tag = "heist"
- required_players = 15
- required_players_secret = 15
- required_enemies = 4
+ required_players = 9
+ required_players_secret = 9
+ required_enemies = 3
round_description = "An unidentified bluespace signature is approaching the station!"
extended_round_description = "The Company's majority control of phoron in the system has marked the \
station to be a highly valuable target for many competing organizations and individuals. Being a \
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 098f9fd329..e85af7e82b 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -12,9 +12,9 @@ var/list/nuke_disks = list()
colony of sizable population and considerable wealth causes it to often be the target of various \
attempts of robbery, fraud and other malicious actions."
config_tag = "mercenary"
- required_players = 15
- required_players_secret = 15
- required_enemies = 4
+ required_players = 9
+ required_players_secret = 9
+ required_enemies = 3
end_on_antag_death = 0
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level
diff --git a/code/game/gamemodes/technomancer/spells/blink.dm b/code/game/gamemodes/technomancer/spells/blink.dm
index 74eba8adb9..c0012c991c 100644
--- a/code/game/gamemodes/technomancer/spells/blink.dm
+++ b/code/game/gamemodes/technomancer/spells/blink.dm
@@ -7,6 +7,7 @@
spell_power_desc = "Blink distance is scaled up with more spell power."
cost = 50
obj_path = /obj/item/weapon/spell/blink
+ ability_icon_state = "tech_blink"
category = UTILITY_SPELLS
/obj/item/weapon/spell/blink
diff --git a/code/game/gamemodes/technomancer/spells/control.dm b/code/game/gamemodes/technomancer/spells/control.dm
index 90b134b38f..50549ca004 100644
--- a/code/game/gamemodes/technomancer/spells/control.dm
+++ b/code/game/gamemodes/technomancer/spells/control.dm
@@ -7,6 +7,7 @@
around the entity is merely a hologram used to allow the user to know if the creature is safe or not."
cost = 100
obj_path = /obj/item/weapon/spell/control
+ ability_icon_state = "tech_control"
category = UTILITY_SPELLS
/mob/living/carbon/human/proc/technomancer_control()
diff --git a/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm b/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm
index d91530b0c9..0c39e99d60 100644
--- a/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm
+++ b/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm
@@ -1,12 +1,12 @@
/datum/technomancer/spell/mend_synthetic
name = "Mend Synthetic"
- desc = "Repairs minor damages to robotic entities. \
+ desc = "Repairs minor damage to prosthetics. \
Instability is split between the target and technomancer, if seperate. The function will end prematurely \
if the target is completely healthy, preventing further instability."
spell_power_desc = "Healing amount increased."
cost = 50
obj_path = /obj/item/weapon/spell/modifier/mend_synthetic
- ability_icon_state = "tech_mendwounds"
+ ability_icon_state = "tech_mendsynth"
category = SUPPORT_SPELLS
/obj/item/weapon/spell/modifier/mend_synthetic
@@ -35,8 +35,11 @@
if(!holder.getBruteLoss() && !holder.getFireLoss()) // No point existing if the spell can't heal.
expire()
return
- holder.adjustBruteLoss(-4 * spell_power) // Should heal roughly 20 burn/brute over 10 seconds, as tick() is run every 2 seconds.
- holder.adjustFireLoss(-4 * spell_power) // Ditto.
+ if(ishuman(holder))
+ var/mob/living/carbon/human/H = holder
+ for(var/obj/item/organ/external/E in H.organs)
+ var/obj/item/organ/external/O = E
+ O.heal_damage(4 * spell_power, 4 * spell_power, 0, 1)
holder.adjust_instability(1)
if(origin)
var/mob/living/L = origin.resolve()
diff --git a/code/game/gamemodes/technomancer/spells/oxygenate.dm b/code/game/gamemodes/technomancer/spells/oxygenate.dm
index fcc2cbcecf..61c6367260 100644
--- a/code/game/gamemodes/technomancer/spells/oxygenate.dm
+++ b/code/game/gamemodes/technomancer/spells/oxygenate.dm
@@ -4,7 +4,7 @@
If casted on the envirnment, air (oxygen and nitrogen) is moved from a distant location to your target."
cost = 25
obj_path = /obj/item/weapon/spell/oxygenate
- ability_icon_state = "oxygenate"
+ ability_icon_state = "tech_oxygenate"
category = SUPPORT_SPELLS
/obj/item/weapon/spell/oxygenate
diff --git a/code/game/gamemodes/technomancer/spells/phase_shift.dm b/code/game/gamemodes/technomancer/spells/phase_shift.dm
index a79dfb7c37..5b06a7e704 100644
--- a/code/game/gamemodes/technomancer/spells/phase_shift.dm
+++ b/code/game/gamemodes/technomancer/spells/phase_shift.dm
@@ -4,12 +4,14 @@
rift you create will afflict you with instability."
cost = 50
obj_path = /obj/item/weapon/spell/phase_shift
+ ability_icon_state = "tech_phaseshift"
category = DEFENSIVE_SPELLS
/obj/item/weapon/spell/phase_shift
name = "phase shift"
desc = "Allows you to dodge your untimely fate by shifting your location somewhere else, so long as you can survive inside the \
rift."
+ icon_state = "blink"
cast_methods = CAST_USE
aspect = ASPECT_TELE
diff --git a/code/game/gamemodes/technomancer/spells/projectile/overload.dm b/code/game/gamemodes/technomancer/spells/projectile/overload.dm
index bb1432af4c..50d6d22a95 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/overload.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/overload.dm
@@ -6,6 +6,7 @@
spell_power_desc = "Increases damage dealt, up to a cap of 80 damage per shot."
cost = 100
obj_path = /obj/item/weapon/spell/projectile/overload
+ ability_icon_state = "tech_overload"
category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/projectile/overload
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 1344543b65..5e8620fd10 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -548,6 +548,7 @@
scrubbers[scrubbers.len]["filters"] += list(list("name" = "Carbon Dioxide", "command" = "co2_scrub","val" = info["filter_co2"]))
scrubbers[scrubbers.len]["filters"] += list(list("name" = "Toxin" , "command" = "tox_scrub","val" = info["filter_phoron"]))
scrubbers[scrubbers.len]["filters"] += list(list("name" = "Nitrous Oxide", "command" = "n2o_scrub","val" = info["filter_n2o"]))
+ scrubbers[scrubbers.len]["filters"] += list(list("name" = "Fuel", "command" = "fuel_scrub","val" = info["filter_fuel"]))
data["scrubbers"] = scrubbers
if(AALARM_SCREEN_MODE)
var/modes[0]
@@ -654,6 +655,7 @@
"co2_scrub",
"tox_scrub",
"n2o_scrub",
+ "fuel_scrub",
"panic_siphon",
"scrubbing",
"direction")
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index dcce5fb938..de0d7975c3 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -428,3 +428,23 @@ update_flag
src.update_icon()
return 1
+
+//R-UST port
+// Special types used for engine setup admin verb, they contain double amount of that of normal canister.
+/obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup/New()
+ ..()
+ src.air_contents.adjust_gas("nitrogen", MolesForPressure())
+ src.update_icon()
+ return 1
+
+/obj/machinery/portable_atmospherics/canister/carbon_dioxide/engine_setup/New()
+ ..()
+ src.air_contents.adjust_gas("carbon_dioxide", MolesForPressure())
+ src.update_icon()
+ return 1
+
+/obj/machinery/portable_atmospherics/canister/phoron/engine_setup/New()
+ ..()
+ src.air_contents.adjust_gas("phoron", MolesForPressure())
+ src.update_icon()
+ return 1
\ No newline at end of file
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index 0fffc9dfa2..70a6b3c233 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -17,7 +17,7 @@
var/minrate = 0
var/maxrate = 10 * ONE_ATMOSPHERE
- var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "sleeping_agent")
+ var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "sleeping_agent", "volatile_fuel")
/obj/machinery/portable_atmospherics/powered/scrubber/New()
..()
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index b5eda03a09..6885f92a02 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -13,7 +13,7 @@
var/c_tag_order = 999
var/status = 1
anchored = 1.0
- var/invuln = null
+ var/invuln = 0
var/bugged = 0
var/obj/item/weapon/camera_assembly/assembly = null
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index 9e4cd48650..351c1bd3b3 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -98,6 +98,7 @@ var/global/list/engineering_networks = list(
/obj/machinery/camera/network/thunder
network = list(NETWORK_THUNDER)
+ invuln = 1
// EMP
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 5d0f707ae8..1e27f61866 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -191,6 +191,11 @@
qdel(G)
return
+/obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(var/mob/target, var/mob/user) //Allows borgs to put people into cryo without external assistance
+ if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target))
+ return
+ put_mob(target)
+
/obj/machinery/atmospherics/unary/cryo_cell/update_icon()
overlays.Cut()
icon_state = "pod[on]"
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 72c9ae47af..08a1282e52 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -499,50 +499,10 @@
if(!ismob(grab.affecting))
return
-
- if(!check_occupant_allowed(grab.affecting))
- return
-
- var/willing = null //We don't want to allow people to be forced into despawning.
- var/mob/M = grab.affecting
-
- if(M.client)
- if(alert(M,"Would you like to enter long-term storage?",,"Yes","No") == "Yes")
- if(!M || !grab || !grab.affecting) return
- willing = 1
else
- willing = 1
+ go_in(grab.affecting,user)
- if(willing)
- visible_message("\The [user] starts putting [grab:affecting:name] into \the [src].", 3)
-
- if(do_after(user, 20))
- if(!M || !grab || !grab:affecting) return
-
- M.forceMove(src)
-
- if(M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
-
- icon_state = occupied_icon_state
-
- M << "[on_enter_occupant_message]"
- M << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
- set_occupant(M)
- time_entered = world.time
- if(ishuman(M) && applies_stasis)
- var/mob/living/carbon/human/H = M
- H.Stasis(1000)
-
- // Book keeping!
- var/turf/location = get_turf(src)
- log_admin("[key_name_admin(M)] has entered a stasis pod. (JMP)")
- message_admins("[key_name_admin(M)] has entered a stasis pod.")
-
- //Despawning occurs when process() is called with an occupant without a client.
- add_fingerprint(M)
/obj/machinery/cryopod/verb/eject()
set name = "Eject Pod"
@@ -650,3 +610,61 @@
name = initial(name)
if(occupant)
name = "[name] ([occupant])"
+
+/obj/machinery/cryopod/MouseDrop_T(var/mob/target, var/mob/user)
+ if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user))
+ return
+ go_in(target, user)
+
+/obj/machinery/cryopod/proc/go_in(var/mob/M, var/mob/user)
+ if(!check_occupant_allowed(M))
+ return
+ if(!M)
+ return
+ if(occupant)
+ to_chat(user,"\The [src] is already occupied.")
+ return
+
+ var/willing = null //We don't want to allow people to be forced into despawning.
+
+ if(M.client)
+ if(alert(M,"Would you like to enter long-term storage?",,"Yes","No") == "Yes")
+ if(!M) return
+ willing = 1
+ else
+ willing = 1
+
+ if(willing)
+ if(M == user)
+ visible_message("[usr] [on_enter_visible_message] [src].", 3)
+ else
+ visible_message("\The [user] starts putting [M] into \the [src].", 3)
+
+ if(do_after(user, 20))
+ if(occupant)
+ to_chat(user,"\The [src] is already occupied.")
+ return
+ M.forceMove(src)
+
+ if(M.client)
+ M.client.perspective = EYE_PERSPECTIVE
+ M.client.eye = src
+ else return
+
+ icon_state = occupied_icon_state
+
+ M << "[on_enter_occupant_message]"
+ M << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
+ set_occupant(M)
+ time_entered = world.time
+ if(ishuman(M) && applies_stasis)
+ var/mob/living/carbon/human/H = M
+ H.Stasis(1000)
+
+ // Book keeping!
+ var/turf/location = get_turf(src)
+ log_admin("[key_name_admin(M)] has entered a stasis pod. (JMP)")
+ message_admins("[key_name_admin(M)] has entered a stasis pod.")
+
+ //Despawning occurs when process() is called with an occupant without a client.
+ add_fingerprint(M)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/uplink_random_lists.dm b/code/game/objects/items/devices/uplink_random_lists.dm
index f3533c5a01..38605da018 100644
--- a/code/game/objects/items/devices/uplink_random_lists.dm
+++ b/code/game/objects/items/devices/uplink_random_lists.dm
@@ -57,7 +57,7 @@ var/datum/uplink_random_selection/all_uplink_selection = new/datum/uplink_random
items += new/datum/uplink_random_item(/datum/uplink_item/item/ammo/mc9mm)
items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/revolver)
items += new/datum/uplink_random_item(/datum/uplink_item/item/ammo/a357)
- items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/heavysniper, 15, 0)
+ items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/heavysnipermerc, 15, 0)
items += new/datum/uplink_random_item(/datum/uplink_item/item/ammo/sniperammo, 15, 0)
items += new/datum/uplink_random_item(/datum/uplink_item/item/grenades/emp, 50)
items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/crossbow, 33)
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 28179f7dbd..4a7dc88597 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -156,8 +156,8 @@
/obj/item/borg/upgrade/syndicate/
- name = "illegal equipment module"
- desc = "Unlocks the hidden, deadlier functions of a robot"
+ name = "scrambled equipment module"
+ desc = "Unlocks new and often deadly module specific items of a robot"
icon_state = "cyborg_upgrade3"
item_state = "cyborg_upgrade"
require_module = 1
@@ -165,8 +165,8 @@
/obj/item/borg/upgrade/syndicate/action(var/mob/living/silicon/robot/R)
if(..()) return 0
- if(R.emagged == 1)
+ if(R.emag_items == 1)
return 0
- R.emagged = 1
+ R.emag_items = 1
return 1
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index 6ea812ad3a..533f5b30aa 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -147,6 +147,47 @@