diff --git a/.travis.yml b/.travis.yml
index 8bd7d2795ba..425f9a95fa2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -45,3 +45,4 @@ script:
- DreamDaemon baystation12.dmb -invisible -trusted -core 2>&1 | tee log.txt
- grep "All Unit Tests Passed" log.txt
- (! grep "runtime error:" log.txt)
+ - (! grep 'Process scheduler caught exception processing' log.txt)
diff --git a/code/_helpers/datum_pool.dm b/code/_helpers/datum_pool.dm
index 007a9976104..2706fcef83d 100644
--- a/code/_helpers/datum_pool.dm
+++ b/code/_helpers/datum_pool.dm
@@ -94,17 +94,32 @@ var/global/list/GlobalPool = list()
loc = args
..()
-/datum/proc/ResetVars(var/list/exclude = list())
- var/list/excluded = list("animate_movement", "loc", "locs", "parent_type", "vars", "verbs", "type") + exclude
+var/list/excluded_vars = list("animate_movement", "contents", "loc", "locs", "parent_type", "vars", "verbs", "type")
+var/list/pooledvariables = list()
+//thanks to clusterfack @ /vg/station for these two procs
+/datum/proc/createVariables(var/list/excluded)
+ pooledvariables[type] = new/list()
+ var/list/all_excluded = excluded_vars + excluded
- for(var/V in vars)
- if(V in excluded)
+ for(var/key in vars)
+ if(key in all_excluded)
continue
+ pooledvariables[type][key] = initial(vars[key])
- vars[V] = initial(vars[V])
+/datum/proc/ResetVars(var/list/excluded = list())
+ if(!pooledvariables[type])
+ createVariables(excluded)
+
+ for(var/key in pooledvariables[type])
+ vars[key] = pooledvariables[type][key]
/atom/movable/ResetVars()
..()
- vars["loc"] = null
+ loc = null
+ contents = initial(contents) //something is really wrong if this object still has stuff in it by this point
+
+/image/ResetVars()
+ ..()
+ loc = null
#undef ATOM_POOL_COUNT
diff --git a/code/datums/wires/nuclearbomb.dm b/code/datums/wires/nuclearbomb.dm
index a83532ef143..b67ffc3a604 100644
--- a/code/datums/wires/nuclearbomb.dm
+++ b/code/datums/wires/nuclearbomb.dm
@@ -30,7 +30,7 @@ var/const/NUCLEARBOMB_WIRE_SAFETY = 4
if(NUCLEARBOMB_WIRE_TIMING)
if(N.timing)
spawn
- log_and_message_admins_with_location("pulsed a nuclear bomb's detonation wire, causing it to explode.", holder.x, holder.y, holder.z)
+ log_and_message_admins("pulsed a nuclear bomb's detonation wire, causing it to explode.")
N.explode()
if(NUCLEARBOMB_WIRE_SAFETY)
N.safety = !N.safety
@@ -49,7 +49,7 @@ var/const/NUCLEARBOMB_WIRE_SAFETY = 4
N.safety = mended
if(N.timing)
spawn
- log_and_message_admins_with_location("cut a nuclear bomb's timing wire, causing it to explode.", holder.x, holder.y, holder.z)
+ log_and_message_admins("cut a nuclear bomb's timing wire, causing it to explode.")
N.explode()
if(NUCLEARBOMB_WIRE_TIMING)
N.secure_device()
diff --git a/code/game/antagonist/antagonist_panel.dm b/code/game/antagonist/antagonist_panel.dm
index ed8f1d95632..821f3a8e807 100644
--- a/code/game/antagonist/antagonist_panel.dm
+++ b/code/game/antagonist/antagonist_panel.dm
@@ -27,7 +27,7 @@
var/mob/M = player.current
dat += "
"
if(M)
- dat += "| [M.real_name]"
+ dat += " | [M.real_name]"
if(!M.client) dat += " (logged out)"
if(M.stat == DEAD) dat += " (DEAD)"
dat += " | "
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index f8d2f3493f8..e45be4bb6a6 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -13,6 +13,7 @@
var/throw_range = 7
var/moved_recently = 0
var/mob/pulledby = null
+ var/item_state = null // Used to specify the item state for the on-mob overlays.
var/auto_init = 1
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 75472e9c96c..2607db9f21b 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -10,6 +10,10 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
required_players = 15
required_enemies = 4
round_description = "An unidentified bluespace signature has slipped past the Icarus and is approaching the station!"
+ extended_round_description = "The Company's majority control of phoron in Nyx has marked the \
+ station to be a highly valuable target for many competing organizations and individuals. Being a \
+ colony of sizable population and considerable wealth causes it to often be the target of various \
+ attempts of robbery, fraud and other malicious actions."
end_on_antag_death = 1
antag_tags = list(MODE_RAIDER)
diff --git a/code/game/gamemodes/mixed/bughunt.dm b/code/game/gamemodes/mixed/bughunt.dm
index 5ca6ed82a29..45365db328d 100644
--- a/code/game/gamemodes/mixed/bughunt.dm
+++ b/code/game/gamemodes/mixed/bughunt.dm
@@ -1,6 +1,7 @@
/datum/game_mode/bughunt
name = "Bughunt"
round_description = "A mercenary strike force is approaching the station to eradicate a xenomorph infestation!"
+ extended_round_description = "Mercenaries and xenomorphs spawn in this game mode."
config_tag = "bughunt"
required_players = 15
required_enemies = 1
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index f6c9bccd7c5..8bf8057f01e 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -7,6 +7,10 @@ var/list/nuke_disks = list()
/datum/game_mode/nuclear
name = "Mercenary"
round_description = "A mercenary strike force is approaching the station!"
+ extended_round_description = "The Company's majority control of phoron in Nyx has marked the \
+ station to be a highly valuable target for many competing organizations and individuals. Being a \
+ 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_enemies = 1
diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm
index 0bd3e922000..a16a47560a9 100644
--- a/code/game/machinery/nuclear_bomb.dm
+++ b/code/game/machinery/nuclear_bomb.dm
@@ -285,7 +285,7 @@ var/bomb_set
if (!timing && !safety)
timing = 1
- log_and_message_admins_with_location("engaged a nuclear bomb", x, y, ,z)
+ log_and_message_admins("engaged a nuclear bomb")
bomb_set++ //There can still be issues with this resetting when there are multiple bombs. Not a big deal though for Nuke/N
update_icon()
else
@@ -413,7 +413,7 @@ if(!N.lighthack)
var/turf/T = pick_area_turf(/area/maintenance, list(/proc/is_station_turf, /proc/not_turf_contains_dense_objects))
if(T)
var/obj/D = new /obj/item/weapon/disk/nuclear(T)
- log_and_message_admins_with_location("[src], the last authentication disk, has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).", T.x, T.y, T.z)
+ log_and_message_admins("[src], the last authentication disk, has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).", location = T)
else
log_and_message_admins("[src], the last authentication disk, has been destroyed. Failed to respawn disc!")
return ..()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 35ad6db8677..e3d3bf80b5a 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -47,7 +47,6 @@
var/zoom = 0 //1 if item is actively being used to zoom. For scoped guns and binoculars.
var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc.
- var/item_state = null // Used to specify the item state for the on-mob overlays.
//** These specify item/icon overrides for _slots_
@@ -615,6 +614,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
usr.visible_message("[zoomdevicename ? "[usr] looks up from the [src.name]" : "[usr] lowers the [src.name]"].")
return
-
+
/obj/item/proc/pwr_drain()
- return 0 // Process Kill
+ return 0 // Process Kill
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index b9a605c6cb2..2a85fbdfc9e 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -14,9 +14,9 @@
matter = list(DEFAULT_WALL_MATERIAL = 90)
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
- var/spray_particles = 6
- var/spray_amount = 8 //units of liquid per particle
- var/max_water = 240
+ var/spray_particles = 3
+ var/spray_amount = 10 //units of liquid per particle
+ var/max_water = 300
var/last_use = 1.0
var/safety = 1
var/sprite_name = "fire_extinguisher"
@@ -30,8 +30,8 @@
throwforce = 2
w_class = 2.0
force = 3.0
- max_water = 120
- spray_particles = 5
+ max_water = 150
+ spray_particles = 3
sprite_name = "miniFE"
/obj/item/weapon/extinguisher/New()
@@ -63,7 +63,7 @@
if(C) C.propelled = (6-i)
O.Move(get_step(user,movementdirection), movementdirection)
sleep(move_speed[i])
-
+
//additional movement
for(var/i in 1 to 3)
O.Move(get_step(user,movementdirection), movementdirection)
@@ -106,7 +106,7 @@
for(var/a = 1 to spray_particles)
spawn(0)
if(!src || !reagents.total_volume) return
-
+
var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(src))
var/turf/my_target
if(a <= the_targets.len)
diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm
index 918739ec8ff..dd49331a7e0 100644
--- a/code/modules/admin/admin_attack_log.dm
+++ b/code/modules/admin/admin_attack_log.dm
@@ -2,10 +2,11 @@
/mob/var/lastattacked = null
/mob/var/attack_log = list()
-proc/log_and_message_admins_with_location(var/message, var/x, var/y, var/z, var/mob/user = usr)
- log_and_message_admins("[message] (JMP)", user)
+proc/log_and_message_admins(var/message as text, var/mob/user = usr, var/turf/location)
+ var/turf/T = location ? location : (user ? get_turf(user) : null)
+ if(T)
+ message = message + " (JMP)"
-proc/log_and_message_admins(var/message as text, var/mob/user = usr)
log_admin(user ? "[key_name(user)] [message]" : "EVENT [message]")
message_admins(user ? "[key_name_admin(user)] [message]" : "EVENT [message]")
diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm
index 7ca66a8260a..78eb7eeeae6 100644
--- a/code/modules/events/blob.dm
+++ b/code/modules/events/blob.dm
@@ -13,7 +13,7 @@
kill()
return
- log_and_message_admins_with_location("Event: Blob spawned at \the [get_area(T)] ([T.x],[T.y],[T.z])", T.x, T.y, T.z)
+ log_and_message_admins("Blob spawned at \the [get_area(T)]", location = T)
Blob = new /obj/effect/blob/core(T)
for(var/i = 1; i < rand(3, 4), i++)
Blob.process()
diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm
index 0faf957787f..14e4741565e 100644
--- a/code/modules/hydroponics/spreading/spreading.dm
+++ b/code/modules/hydroponics/spreading/spreading.dm
@@ -16,7 +16,7 @@
vine.mature_time = 0
vine.process()
- log_and_message_admins_with_location("Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])", T.x, T.y, T.z)
+ log_and_message_admins("Spacevines spawned at \the [get_area(T)]", location = T)
return
log_and_message_admins("Event: Spacevines failed to find a viable turf.")
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index c921ac51645..997a434124a 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -353,6 +353,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
if(!query.Execute())
usr << query.ErrorMsg()
else
+ log_and_message_admins("has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs")
log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs")
alert("Upload Complete.")
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index c878425be49..59974bda063 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -60,6 +60,7 @@ var/list/holder_mob_icon_cache = list()
overlays.Cut()
icon = M.icon
icon_state = M.icon_state
+ item_state = M.item_state
color = M.color
name = M.name
desc = M.desc
diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm
index bd2d5dc78e1..eeebde6d269 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona.dm
@@ -4,6 +4,7 @@
adult_form = /mob/living/carbon/human
speak_emote = list("chirrups")
icon_state = "nymph"
+ item_state = "nymph"
language = "Rootspeak"
death_msg = "expires with a pitiful chirrup..."
universal_understand = 1
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 376feec24e3..cff28f14957 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -235,8 +235,8 @@
M.visible_message("[M] tries to pat out [src]'s flames!",
"You try to pat out [src]'s flames! Hot!")
if(do_mob(M, src, 15))
+ src.fire_stacks -= 0.5
if (prob(10) && (M.fire_stacks <= 0))
- src.fire_stacks -= 0.5
M.fire_stacks += 1
M.IgniteMob()
if (M.on_fire)
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index e781ef607a7..f912b40ee99 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -101,7 +101,7 @@
)
var/list/cold_discomfort_strings = list(
"You feel chilly.",
- "You shiver suddely.",
+ "You shiver suddenly.",
"Your chilly flesh stands out in goosebumps."
)
diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm
index 73410552fb9..d8606524e21 100644
--- a/code/modules/mob/living/simple_animal/borer/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer.dm
@@ -8,6 +8,7 @@
response_disarm = "prods"
response_harm = "stomps on"
icon_state = "brainslug"
+ item_state = "brainslug"
icon_living = "brainslug"
icon_dead = "brainslug_dead"
speed = 5
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index d429140d10e..1cc8894f4fb 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -3,6 +3,7 @@
name = "cat"
desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers."
icon_state = "cat2"
+ item_state = "cat2"
icon_living = "cat2"
icon_dead = "cat2_dead"
speak = list("Meow!","Esp!","Purr!","HSSSSS")
@@ -217,6 +218,7 @@
desc = "Her fur has the look and feel of velvet, and her tail quivers occasionally."
gender = FEMALE
icon_state = "cat"
+ item_state = "cat"
icon_living = "cat"
icon_dead = "cat_dead"
befriend_job = "Chief Medical Officer"
@@ -225,6 +227,7 @@
name = "kitten"
desc = "D'aaawwww"
icon_state = "kitten"
+ item_state = "kitten"
icon_living = "kitten"
icon_dead = "kitten_dead"
gender = NEUTER
@@ -241,6 +244,7 @@
desc = "That's Bones the cat. He's a laid back, black cat. Meow."
gender = MALE
icon_state = "cat3"
+ item_state = "cat3"
icon_living = "cat3"
icon_dead = "cat3_dead"
holder_type = /obj/item/weapon/holder/cat/fluff/bones
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index ceacccfdb72..1dfb5ed6f04 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -3,6 +3,7 @@
real_name = "mouse"
desc = "It's a small rodent."
icon_state = "mouse_gray"
+ item_state = "mouse_gray"
icon_living = "mouse_gray"
icon_dead = "mouse_gray_dead"
speak = list("Squeek!","SQUEEK!","Squeek?")
@@ -67,6 +68,7 @@
if(!body_color)
body_color = pick( list("brown","gray","white") )
icon_state = "mouse_[body_color]"
+ item_state = "mouse_[body_color]"
icon_living = "mouse_[body_color]"
icon_dead = "mouse_[body_color]_dead"
desc = "It's a small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 054afb2ade1..9addd7b54aa 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -995,7 +995,13 @@ mob/proc/yank_out_object()
if (ishuman(U))
var/mob/living/carbon/human/human_user = U
human_user.bloody_hands(H)
-
+
+ else if(issilicon(src))
+ var/mob/living/silicon/robot/R = src
+ R.embedded -= selection
+ R.adjustBruteLoss(5)
+ R.adjustFireLoss(10)
+
selection.forceMove(get_turf(src))
if(!(U.l_hand && U.r_hand))
U.put_in_hands(selection)
diff --git a/html/changelog.html b/html/changelog.html
index 026768c24c6..a0dea4fdb91 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,16 @@
-->
+
08 January 2016
+
Chinsky updated:
+
+ - Can pick up monkeys / undress resomi now properly. HELP intent for scooping, NON-HELP for undressing.
+
+
RavingManiac updated:
+
+ - Storage in backpacks, boxes and other containers is now capacity-based. Some containers like belts remain slot-based.
+
+
01 January 2016
Atlantis updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 3168fddbcf3..a3ae90bb81f 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2471,3 +2471,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
size.
TheWelp:
- rscadd: Microwaves can now be unanchored with a crowbar.
+2016-01-08:
+ Chinsky:
+ - bugfix: Can pick up monkeys / undress resomi now properly. HELP intent for scooping,
+ NON-HELP for undressing.
+ RavingManiac:
+ - rscadd: Storage in backpacks, boxes and other containers is now capacity-based.
+ Some containers like belts remain slot-based.
diff --git a/html/changelogs/Datraen-YankFix.yml b/html/changelogs/Datraen-YankFix.yml
new file mode 100644
index 00000000000..8118e6832b8
--- /dev/null
+++ b/html/changelogs/Datraen-YankFix.yml
@@ -0,0 +1,4 @@
+author: Datraen
+delete-after: True
+changes:
+ - bugfix: "Objects can now be yanked out of synthetics."
diff --git a/html/changelogs/RavingManiac-PR-10095.yml b/html/changelogs/RavingManiac-PR-10095.yml
deleted file mode 100644
index 05c9267af93..00000000000
--- a/html/changelogs/RavingManiac-PR-10095.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: RavingManiac
-
-delete-after: True
-
-changes:
- - rscadd: "Storage in backpacks, boxes and other containers is now capacity-based. Some containers like belts remain slot-based."
diff --git a/html/changelogs/chinsky - stuff.yml b/html/changelogs/chinsky - stuff.yml
deleted file mode 100644
index c9fa37ab16f..00000000000
--- a/html/changelogs/chinsky - stuff.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Chinsky
-
-delete-after: True
-changes:
- - bugfix: "Can pick up monkeys / undress resomi now properly. HELP intent for scooping, NON-HELP for undressing."
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 0d3e68db036..c652e6ea7fe 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ