diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index b0f6c5099be..43f79bd5dac 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -12,7 +12,10 @@ var/global/pipe_processing_killed = 0
datum/controller/game_controller
var/list/shuttle_list // For debugging and VV
+
+#ifdef TESTING //This is just lagging start times and is never used on a live server.
var/datum/random_map/ore/asteroid_ore_map // For debugging and VV.
+#endif
datum/controller/game_controller/New()
//There can be only one master_controller. Out with the old and in with the new.
@@ -70,10 +73,13 @@ datum/controller/game_controller/proc/setup_objects()
var/obj/machinery/atmospherics/unary/vent_scrubber/T = U
T.broadcast_status()
+
// Create the mining ore distribution map.
// These values determine the specific area that the map is applied to.
// If you do not use the official Baycode asteroid map, you will need to change them.
+#ifdef TESTING
asteroid_ore_map = new /datum/random_map/ore(null,13,32,5,217,223)
+#endif
// Set up antagonists.
populate_antag_type_list()
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index a734c4746a7..4a2ea39f8d2 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -339,7 +339,10 @@ datum/controller/vote
. += "Restart (Disallowed)"
. += "
"
if(is_staff || config.allow_vote_restart)
- . += "Crew Transfer"
+ if (get_security_level() == "red" || get_security_level() == "delta")
+ . += "Crew Transfer (Disallowed, Code Red or above)"
+ else
+ . += "Crew Transfer"
else
. += "Crew Transfer (Disallowed)"
if(is_staff)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index f0e850bbf5c..0b0a6dea052 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -238,10 +238,11 @@ its easier to just keep the beam vertical.
AM.throwing = 0
return
-/atom/proc/add_hiddenprint(mob/living/M as mob)
+/atom/proc/add_hiddenprint(mob/living/M)
if(isnull(M)) return
+ if(!istype(M, /mob)) return
if(isnull(M.key)) return
- if (ishuman(M))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
if (!istype(H.dna, /datum/dna))
return 0
@@ -261,8 +262,9 @@ its easier to just keep the beam vertical.
src.fingerprintslast = M.key
return
-/atom/proc/add_fingerprint(mob/living/M as mob, ignoregloves = 0)
+/atom/proc/add_fingerprint(mob/living/M, ignoregloves = 0)
if(isnull(M)) return
+ if(!istype(M, /mob)) return
if(isAI(M)) return
if(isnull(M.key)) return
if (ishuman(M))
@@ -387,7 +389,7 @@ its easier to just keep the beam vertical.
//returns 1 if made bloody, returns 0 otherwise
-/atom/proc/add_blood(mob/living/carbon/human/M as mob)
+/atom/proc/add_blood(mob/living/carbon/human/M)
if(flags & NOBLOODY)
return 0
@@ -407,7 +409,7 @@ its easier to just keep the beam vertical.
. = 1
return 1
-/atom/proc/add_vomit_floor(mob/living/carbon/M as mob, var/toxvomit = 0)
+/atom/proc/add_vomit_floor(mob/living/carbon/M, var/toxvomit = 0)
if( istype(src, /turf/simulated) )
var/obj/effect/decal/cleanable/vomit/this = new /obj/effect/decal/cleanable/vomit(src)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 866f521e5ae..fddccf77dbb 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -162,27 +162,25 @@
var/obj/item/device/pda/P = null
var/itemname = ""
- var/info = ""
if(istype(W, /obj/item/weapon/paper))
X = W
itemname = X.name
- info = X.info
else
P = W
itemname = P.name
- info = P.notehtml
U << "You hold \a [itemname] up to the camera ..."
for(var/mob/living/silicon/ai/O in living_mob_list)
if(!O.client) continue
- if(U.name == "Unknown") O << "[U] holds \a [itemname] up to one of your cameras ..."
- else O << "[U] holds \a [itemname] up to one of your cameras ..."
- O << browse(text("[][]", itemname, info), text("window=[]", itemname))
+ if(U.name == "Unknown")
+ O << "[U] holds \a [itemname] up to one of your cameras ...view message"
+ else
+ O << "[U] holds \a [itemname] up to one of your cameras ...view message"
+
for(var/mob/O in player_list)
if (istype(O.machine, /obj/machinery/computer/security))
var/obj/machinery/computer/security/S = O.machine
if (S.current == src)
- O << "[U] holds \a [itemname] up to one of the cameras ..."
- O << browse(text("[][]", itemname, info), text("window=[]", itemname))
+ O << "[U] holds \a [itemname] up to one of the cameras ...view message"
else if (istype(W, /obj/item/weapon/camera_bug))
if (!src.can_use())
@@ -463,3 +461,18 @@
wires.MendAll()
update_icon()
update_coverage()
+
+/obj/machinery/camera/Topic(href, href_list)
+ ..()
+ if (href_list["readcapturedpaper"]) //Yep stolen from admin faxes
+ var/obj/item/fax = locate(href_list["readcapturedpaper"])
+ if(!fax)
+ usr << ""
+ if (istype(fax, /obj/item/weapon/paper))
+ var/obj/item/weapon/paper/P = fax
+ P.show_content(usr,1)
+ else if (istype(fax, /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/H = fax
+ H.show(usr)
+ return
+ return
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
index a1beabbea6b..ee763ce82ad 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
@@ -1,12 +1,27 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/unary_atmos
board_type = "machine"
+ var/machine_dir = SOUTH
+ var/init_dirs = SOUTH
+
+/obj/item/weapon/circuitboard/unary_atmos/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I,/obj/item/weapon/screwdriver))
+ machine_dir = turn(machine_dir, 90)
+ init_dirs = machine_dir
+ user.visible_message("\blue \The [user] adjusts the jumper on the [src]'s port configuration pins.", "\blue You adjust the jumper on the port configuration pins. Now set to [dir2text(machine_dir)].")
+ return
+
+/obj/item/weapon/circuitboard/unary_atmos/examine()
+ ..()
+ usr << "The jumper is connecting the [dir2text(machine_dir)] pins."
/obj/item/weapon/circuitboard/unary_atmos/construct(var/obj/machinery/atmospherics/unary/U)
//TODO: Move this stuff into the relevant constructor when pipe/construction.dm is cleaned up.
+ U.dir = src.machine_dir
+ U.initialize_directions = src.init_dirs
U.initialize()
U.build_network()
if (U.node)
diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm
index 9c160f028d4..9cf88b630a2 100644
--- a/code/game/objects/items/weapons/material/kitchen.dm
+++ b/code/game/objects/items/weapons/material/kitchen.dm
@@ -35,13 +35,22 @@
return ..()
if (reagents.total_volume > 0)
- reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST)
if(M == user)
- M.visible_message("\The [user] eats some [loaded] from \the [src].")
+ if(M.get_species() == "Machine")
+ M.visible_message("\The [user] smudges some [loaded] from \the [src] on their screen.","You smudge some [loaded] from \the [src] on your screen.")
+ else
+ M.visible_message("\The [user] eats some [loaded] from \the [src].","You eat some [loaded] from \the [src].")
+ reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST)
+ playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1)
+ overlays.Cut()
else
- M.visible_message("\The [user] feeds some [loaded] to \the [M] with \the [src].")
- playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1)
- overlays.Cut()
+ if(M.get_species() == "Machine")
+ M.visible_message("\The [user] smudges some [loaded] onto [M].","You smudge some [loaded] from \the [src] onto [M].")
+ else
+ M.visible_message("\The [user] feeds some [loaded] to \the [M] with \the [src].","You feed \the [M] some [loaded] with \the [src].")
+ reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST)
+ playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1)
+ overlays.Cut()
return
else
user << "You don't have anything on \the [src]." //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK GODDAMNIT
@@ -112,4 +121,4 @@
user.take_organ_damage(10)
user.Paralyse(2)
return
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/game/objects/items/weapons/trays.dm b/code/game/objects/items/weapons/trays.dm
index 6a3b720e336..462263a9537 100644
--- a/code/game/objects/items/weapons/trays.dm
+++ b/code/game/objects/items/weapons/trays.dm
@@ -11,7 +11,7 @@
icon_state = "tray"
desc = "A metal tray to lay food on."
throwforce = 12.0
- throwforce = 10.0
+ force = 10.0
throw_speed = 1
throw_range = 5
w_class = 3.0
@@ -315,4 +315,4 @@
if (!safedrop)
spill(user, src.loc)
- safedrop = 0
\ No newline at end of file
+ safedrop = 0
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index 7c7fdf8ce6b..3d65ce02c03 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -18,6 +18,9 @@
user.visible_message("[user] pries \the [src] open.", \
"You pry open \the [src].", \
"You hear splitting wood.")
+ for(var/obj/vehicle/V in T.contents)
+ if(V)
+ V.unload(user)
qdel(src)
else
return attack_hand(user)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index beafc8109fa..91d11812038 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -598,6 +598,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
if (alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes")
+ if (istype(O, /mob/dead/observer))
+ var/mob/dead/observer/M = O
+ if (M.client && alert(src, "They are still connected. Are you sure, they will loose connection.", "Confirmation", "Yes", "No") != "Yes")
+ return
log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])", 1)
feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index ed508c7209e..d2733d1d0da 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -38,6 +38,9 @@
set name = "Adjust welding mask"
set src in usr
+ if(!base_state)
+ base_state = icon_state
+
if(usr.canmove && !usr.stat && !usr.restrained())
if(src.up)
src.up = !src.up
@@ -150,7 +153,7 @@
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner")
ears.Blend(earbit, ICON_OVERLAY)
-
+
item_icons[icon_head] = ears
/obj/item/clothing/head/richard
@@ -158,4 +161,4 @@
desc = "You can hear the distant sounds of rhythmic electronica."
icon_state = "richard"
body_parts_covered = HEAD|FACE
- flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
\ No newline at end of file
+ flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm
index 0d88f749667..e73a0cba7c1 100644
--- a/code/modules/mob/living/carbon/human/stripping.dm
+++ b/code/modules/mob/living/carbon/human/stripping.dm
@@ -1,6 +1,6 @@
/mob/living/carbon/human/proc/handle_strip(var/slot_to_strip,var/mob/living/user)
- if(!slot_to_strip || !istype(user))
+ if(!slot_to_strip || !istype(user) || isanimal(user) || !istype(user, /mob/living/simple_animal/hostile))
return 0
// TODO : Change to incapacitated() on merge.
@@ -72,7 +72,7 @@
else
visible_message("\The [user] is trying to put \a [held] on \the [src]!")
- if(!do_after(user,HUMAN_STRIP_DELAY))
+ if(!do_mob(user,src,HUMAN_STRIP_DELAY))
return 0
if(!stripping && user.get_active_hand() != held)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index bceb3be0920..fdb8df5aab1 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -280,6 +280,21 @@
return
..()
+/mob/living/silicon/robot/drone/Bump(var/atom/movable/AM, yes)
+
+ if(istype(AM,/obj/machinery/door)) // check for doors first as that will be most common
+ return ..(AM,yes)
+
+ if(!(istype(AM,/obj/item/pipe) || istype(AM,/obj/structure/disposalconstruct)))
+ if(istype(AM,/obj/item)) //Would this even be possible? Someone try to activate that message
+ var/obj/item/O = AM
+ if(O.w_class > can_pull_size)
+ src << "You are too small to push that."
+ return 0
+ else if(istype(AM,/obj))
+ return 0
+ ..(AM,yes)
+
/mob/living/silicon/robot/drone/add_robot_verbs()
src.verbs |= silicon_subsystems
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 5df6f1a5ce0..4392bfc391c 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -107,9 +107,11 @@
else
set_dir(SOUTH)
- if(isturf(movement_target.loc) )
-
- UnarmedAttack(movement_target)
+ if(isturf(movement_target.loc))
+ for(var/direction in alldirs)
+ var/turf/T = get_step(src, direction)
+ if(T == movement_target.loc)
+ UnarmedAttack(movement_target)
else if(ishuman(movement_target.loc) && prob(20))
visible_emote("stares at the [movement_target] that [movement_target.loc] has with sad puppy eyes.")
else
diff --git a/code/modules/mob/mob_cleanup.dm b/code/modules/mob/mob_cleanup.dm
index cdc734c49a7..1baebf35706 100644
--- a/code/modules/mob/mob_cleanup.dm
+++ b/code/modules/mob/mob_cleanup.dm
@@ -38,10 +38,10 @@ Put (mob/proc)s here that are in dire need of a code cleanup.
if(force_species_check)
var/fail = 1
for(var/name in virus.affected_species)
- var/mob_type = text2path("/mob/living/carbon/[lowertext(name)]")
- if(mob_type && istype(src, mob_type))
- fail = 0
- break
+ if(istype(src, /mob/living/carbon))
+ if(src:species && src:species.name == name)
+ fail = 0
+ break
if(fail) return
if(skip_this == 1)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index d3629f10945..35e84f9c65b 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -580,7 +580,7 @@ proc/is_blind(A)
name = realname
for(var/mob/M in player_list)
- if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && check_rights(R_MOD|R_ADMIN, 0, M))) && (M.client.prefs.toggles & CHAT_DEAD))
+ if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && check_rights(R_DEV|R_MOD|R_ADMIN, 0, M))) && (M.client.prefs.toggles & CHAT_DEAD))
var/follow
var/lname
if(subject)
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index 75b1328ef59..05ba1fc2bd1 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -310,6 +310,9 @@
return 1
+/obj/vehicle/user_unbuckle_mob(var/mob/user)
+ unload(user)
+ return
/obj/vehicle/proc/unload(var/mob/user, var/direction)
if(!load)
diff --git a/html/changelogs/SoundScopes-bugfixes.yml b/html/changelogs/SoundScopes-bugfixes.yml
new file mode 100644
index 00000000000..32e1866adec
--- /dev/null
+++ b/html/changelogs/SoundScopes-bugfixes.yml
@@ -0,0 +1,19 @@
+author: SoundScopes
+
+delete-after: True
+
+changes:
+ - bugfix: "Stripping mobs now requires both mobs to stay still."
+ - tweak: "Drones can no longer push objects they can't pull."
+ - bugfix: "Vairous runtimes, given a healthy home."
+ - tweak: "Simple Animals can no longer take items of people."
+ - bugfix: "resisting on cargo trains actually unbuckles you properly, no more bluespace teleport"
+ - bugfix: "breaking a crate on a cargo tug no longer leaves a hidden crate on the trolly"
+ - tweak: "Holding items up to cameras no longer forces a window in the AI players face."
+ - bugfix: "Having ' in your name no longer breaks when holding items up to cameras"
+ - bugfix: "Ian now needs to stand next to something to eat. No more eating through doors(single side windows are an issue)"
+ - bugfix: "Welding mask toggle verb when first used now displays the correct icon"
+ - bugfix: "Voting on code red or above notifys when it isn't allowed"
+ - tweak: "Using a screwdriver on heater/cooler circuitboards now changes the direction."
+ - bugfix: "Viruses only affect the correct species."
+ - bugfix: "IPC's can't eat from forks."