diff --git a/.travis.yml b/.travis.yml
index 9d86d85229f..81b8487f483 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -19,4 +19,6 @@ install:
script:
- shopt -s globstar
- (! grep 'step_[xy]' maps/**/*.dmm)
+ - (! find nano/templates/ -type f -exec md5sum {} + | sort | uniq -D -w 32 | grep nano)
+ - ( md5sum -c - <<< "0af969f671fba6cf9696c78cd175a14a *baystation12.int")
- DreamMaker baystation12.dme
diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm
index c796afa1f98..b84dfaf9435 100644
--- a/code/controllers/Processes/machinery.dm
+++ b/code/controllers/Processes/machinery.dm
@@ -59,4 +59,4 @@
/datum/controller/process/machinery/getStatName()
- return ..()+"([machines.len])"
\ No newline at end of file
+ return ..()+"([machines.len])"
diff --git a/code/controllers/Processes/turf.dm b/code/controllers/Processes/turf.dm
index c1efac52f97..2ac33f48ba7 100644
--- a/code/controllers/Processes/turf.dm
+++ b/code/controllers/Processes/turf.dm
@@ -1,9 +1,14 @@
-var/global/list/processing_turfs = list()
+var/global/list/turf/processing_turfs = list()
/datum/controller/process/turf/setup()
name = "turf"
schedule_interval = 20 // every 2 seconds
/datum/controller/process/turf/doWork()
- for(var/turf/unsimulated/wall/supermatter/SM in processing_turfs)
- SM.process()
+ for(var/turf/T in processing_turfs)
+ if(T.process() == PROCESS_KILL)
+ processing_turfs.Remove(T)
+ scheck()
+
+/datum/controller/process/turf/getStatName()
+ return ..()+"([processing_turfs.len])"
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 171080fb32d..98d56d3d237 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -114,6 +114,10 @@ var/list/gamemode_cache = list()
var/organ_health_multiplier = 1
var/organ_regeneration_multiplier = 1
+
+ //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt,
+ //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun.
+ var/organ_damage_spillover_multiplier = 0.5
var/bones_can_break = 0
var/limbs_can_break = 0
@@ -670,6 +674,8 @@ var/list/gamemode_cache = list()
config.organ_health_multiplier = value / 100
if("organ_regeneration_multiplier")
config.organ_regeneration_multiplier = value / 100
+ if("organ_damage_spillover_multiplier")
+ config.organ_damage_spillover_multiplier = value / 100
if("bones_can_break")
config.bones_can_break = value
if("limbs_can_break")
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index d698454cab9..0152af8b130 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -39,7 +39,6 @@ datum/controller/game_controller/proc/setup()
setup_objects()
setupgenetics()
- setup_economy()
SetupXenoarch()
transfer_controller = new
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index 7db31c6fa63..68bfdab74b8 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -257,7 +257,7 @@ datum/controller/vote
text += "\n[question]"
log_vote(text)
- world << "[text]\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote."
+ world << "[text]\nType vote or click here to place your votes.\nYou have [config.vote_period/10] seconds to vote."
switch(vote_type)
if("crew_transfer")
world << sound('sound/ambience/alarm4.ogg', repeat = 0, wait = 0, volume = 50, channel = 3)
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 97e1f59582d..8bc6cc0580c 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -2,10 +2,8 @@
data_core = new /obj/effect/datacore()
return 1
-/obj/effect/datacore/proc/manifest(var/nosleep = 0)
+/obj/effect/datacore/proc/manifest()
spawn()
- if(!nosleep)
- sleep(40)
for(var/mob/living/carbon/human/H in player_list)
manifest_inject(H)
return
diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm
index 7e8c8779cff..a0f1f9c7f1c 100644
--- a/code/datums/wires/airlock.dm
+++ b/code/datums/wires/airlock.dm
@@ -37,10 +37,11 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
var/haspower = A.arePowerSystemsOn() //If there's no power, then no lights will be on.
. += ..()
- . += text("
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]",
+ . += text("
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]",
(A.locked ? "The door bolts have fallen!" : "The door bolts look up."),
((A.lights && haspower) ? "The door bolt lights are on." : "The door bolt lights are off!"),
((haspower) ? "The test light is on." : "The test light is off!"),
+ ((A.backupPowerCablesCut()) ? "The backup power light is off!" : "The backup power light is on."),
((A.aiControlDisabled==0 && !A.emagged && haspower)? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."),
((A.safe==0 && haspower)? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."),
((A.normalspeed==0 && haspower)? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."),
@@ -124,7 +125,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
//Sending a pulse through flashes the red light on the door (if the door has power).
if(A.arePowerSystemsOn() && A.density)
A.do_animate("deny")
- if(AIRLOCK_WIRE_MAIN_POWER1 || AIRLOCK_WIRE_MAIN_POWER2)
+ if(AIRLOCK_WIRE_MAIN_POWER1, AIRLOCK_WIRE_MAIN_POWER2)
//Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter).
A.loseMainPower()
if(AIRLOCK_WIRE_DOOR_BOLTS)
@@ -135,7 +136,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
else
A.unlock()
- if(AIRLOCK_WIRE_BACKUP_POWER1 || AIRLOCK_WIRE_BACKUP_POWER2)
+ if(AIRLOCK_WIRE_BACKUP_POWER1, AIRLOCK_WIRE_BACKUP_POWER2)
//two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter).
A.loseBackupPower()
if(AIRLOCK_WIRE_AI_CONTROL)
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index 3b0b54942f2..0555a140bd8 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -278,6 +278,11 @@ var/const/POWER = 8
var/r = rand(1, wires.len)
CutWireIndex(r)
+/datum/wires/proc/RandomCutAll(var/probability = 10)
+ for(var/i = 1; i < MAX_FLAG && i < (1 << wire_count); i += i)
+ if(prob(probability))
+ CutWireIndex(i)
+
/datum/wires/proc/CutAll()
for(var/i = 1; i < MAX_FLAG && i < (1 << wire_count); i += i)
CutWireIndex(i)
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 99ff26c89a1..4d564bbf830 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -175,47 +175,91 @@
origin_tech = "materials=1"
var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute
-/obj/item/weapon/legcuffs/beartrap
+/obj/item/weapon/beartrap
name = "bear trap"
throw_speed = 2
throw_range = 1
+ gender = PLURAL
+ icon = 'icons/obj/items.dmi'
icon_state = "beartrap0"
desc = "A trap used to catch bears and other legged creatures."
- var/armed = 0
+ throwforce = 0
+ w_class = 3.0
+ origin_tech = "materials=1"
+ var/deployed = 0
suicide_act(mob/user)
- viewers(user) << "\red [user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide."
+ viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide."
return (BRUTELOSS)
-/obj/item/weapon/legcuffs/beartrap/attack_self(mob/user as mob)
+/obj/item/weapon/beartrap/attack_self(mob/user as mob)
..()
if(ishuman(user) && !user.stat && !user.restrained())
- armed = !armed
- icon_state = "beartrap[armed]"
- user << "[src] is now [armed ? "armed" : "disarmed"]"
+ if(deployed==0)
+ user.visible_message("[user] is deploying \the [src]", "You are deploying \the [src]!")
+ if (do_after(user, 60))
+ user.visible_message("[user] has deployed \the [src]", "You have deployed \the [src]!")
+ deployed = 1
+ user.drop_from_inventory(src, user.loc)
+ update_icon()
+ anchored = 1
-/obj/item/weapon/legcuffs/beartrap/Crossed(AM as mob|obj)
- if(armed)
+/obj/item/weapon/beartrap/attack_hand(mob/user as mob)
+ if(ishuman(user) && !user.stat && !user.restrained())
+ if(deployed==1)
+ user.visible_message("[user] is disarming \the [src]", "You are disarming \the [src]!")
+ if (do_after(user, 60))
+ user.visible_message("[user] has disarmed \the [src]", "You have disarmed \the [src]!")
+ deployed = 0
+ anchored = 0
+ update_icon()
+
+ if(deployed==0)
+ ..()
+
+/obj/item/weapon/beartrap/Crossed(AM as mob|obj)
+ if(deployed)
if(ishuman(AM))
if(isturf(src.loc))
- var/mob/living/carbon/H = AM
+ var/mob/living/carbon/human/H = AM
if(H.m_intent == "run")
- armed = 0
- H.legcuffed = src
- src.loc = H
- H.update_inv_legcuffed()
- H << "\red You step on \the [src]!"
- feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart.
+ deployed = 0
+ update_icon()
+ H << "You step on \the [src]!"
for(var/mob/O in viewers(H, null))
if(O == H)
continue
- O.show_message("\red [H] steps on \the [src].", 1)
+ O.show_message("[H] steps on \the [src].", 1)
+ if(H.lying)
+ var/obj/item/organ/external/affecting = pick(H.organs)
+ if(affecting.take_damage(30, 0))
+ H.UpdateDamageIcon()
+ affecting.embed(src)
+ else
+ var/list/potentialorgans = list()
+ for(var/organ in list("l_leg", "r_leg", "l_foot", "r_foot"))
+ var/obj/item/organ/external/R = H.get_organ(organ)
+ if(R && !(R.status & ORGAN_DESTROYED))
+ potentialorgans += R
+ var/obj/item/organ/external/affecting = pick(potentialorgans)
+ if(affecting.take_damage(30, 0))
+ H.UpdateDamageIcon()
+ affecting.embed(src)
+
+
if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
- armed = 0
+ deployed = 0
var/mob/living/simple_animal/SA = AM
SA.health -= 20
..()
+/obj/item/weapon/beartrap/update_icon()
+ ..()
+
+ if(deployed == 0)
+ icon_state = "beartrap0"
+ else
+ icon_state = "beartrap1"
/obj/item/weapon/caution
diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm
index 07856d92512..60254577583 100644
--- a/code/defines/procs/statistics.dm
+++ b/code/defines/procs/statistics.dm
@@ -98,7 +98,7 @@ proc/statistic_cycle()
return
while(1)
sql_poll_population()
- sleep(600)
+ sleep(6000)
//This proc is used for feedback. It is executed at round end.
proc/sql_commit_feedback()
diff --git a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
index d71ff249d10..dc315ac5100 100644
--- a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
+++ b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
@@ -23,7 +23,7 @@
processing_turfs.Remove(src)
..()
-/turf/unsimulated/wall/supermatter/proc/process()
+/turf/unsimulated/wall/supermatter/process()
// Only check infrequently.
if(next_check>world.time) return
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 08ad7e72534..34a57a0768b 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -110,11 +110,11 @@ var/global/datum/controller/gameticker/ticker
else
src.mode.announce()
+ current_state = GAME_STATE_PLAYING
create_characters() //Create player characters and transfer them
collect_minds()
equip_characters()
data_core.manifest()
- current_state = GAME_STATE_PLAYING
callHook("roundstart")
@@ -155,7 +155,6 @@ var/global/datum/controller/gameticker/ticker
for(var/obj/multiz/ladder/L in world) L.connect() //Lazy hackfix for ladders. TODO: move this to an actual controller. ~ Z
if(config.sql_enabled)
- spawn(3000)
statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE
return 1
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 33dcee54a2f..449e5f68ba9 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -160,7 +160,7 @@
access_hydroponics, access_library, access_lawyer, access_virology, access_psychiatrist, access_cmo, access_qm, access_clown, access_mime, access_surgery,
access_theatre, access_research, access_mining, access_mailsorting,
access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce,
- access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch)
+ access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_medical_equip)
/proc/get_all_centcom_access()
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain)
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 073e663a4bf..c1ca46da146 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -305,15 +305,15 @@
faction = "Station"
total_positions = 2
spawn_positions = 2
- supervisors = "the captain"
+ supervisors = "Nanotrasen officials and Corporate Regulations"
selection_color = "#dddddd"
- access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
- minimal_access = list(access_lawyer, access_court, access_sec_doors)
+ access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_heads)
+ minimal_access = list(access_lawyer, access_court, access_sec_doors, access_heads)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/ia(H), slot_l_ear)
switch(H.backbag)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 5e8817359f4..9ba8c2de49a 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -68,6 +68,7 @@
//Perform the connection
connected_port = new_port
connected_port.connected_device = src
+ connected_port.on = 1 //Activate port updates
anchored = 1 //Prevent movement
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 125345c518a..3e6f0d8e33a 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -305,7 +305,14 @@
if("destination")
refresh=0
- var/new_dest = input("Enter new destination tag", "Mulebot [suffix ? "([suffix])" : ""]", destination) as text|null
+ var/new_dest
+ var/list/beaconlist = new()
+ for(var/obj/machinery/navbeacon/N in navbeacons)
+ beaconlist.Add(N.location)
+ if(beaconlist.len)
+ new_dest = input("Select new destination tag", "Mulebot [suffix ? "([suffix])" : ""]", destination) in beaconlist
+ else
+ alert("No destination beacons available.")
refresh=1
if(new_dest)
set_destination(new_dest)
@@ -741,11 +748,6 @@
if(!on)
return
- /*
- world << "rec signal: [signal.source]"
- for(var/x in signal.data)
- world << "* [x] = [signal.data[x]]"
- */
var/recv = signal.data["command"]
// process all-bot input
if(recv=="bot_status" && wires.RemoteRX())
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index ec9c17f2416..43e26a7d46f 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -226,6 +226,8 @@
//Used when someone breaks a camera
/obj/machinery/camera/proc/destroy()
stat |= BROKEN
+ wires.RandomCutAll()
+
kick_viewers()
triggerCameraAlarm()
update_icon()
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index d7224f2212a..c9228000e25 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -1,6 +1,9 @@
// Navigation beacon for AI robots
// Functions as a transponder: looks for incoming signal matching
+
+var/global/list/navbeacons // no I don't like putting this in, but it will do for now
+
/obj/machinery/navbeacon
icon = 'icons/obj/objects.dmi'
@@ -27,6 +30,13 @@
var/turf/T = loc
hide(T.intact)
+
+ // add beacon to MULE bot beacon list
+ if(freq == 1400)
+ if(!navbeacons)
+ navbeacons = new()
+ navbeacons += src
+
spawn(5) // must wait for map loading to finish
if(radio_controller)
@@ -241,6 +251,7 @@ Transponder Codes:
"}
updateDialog()
/obj/machinery/navbeacon/Destroy()
+ navbeacons.Remove(src)
if(radio_controller)
radio_controller.remove_object(src, freq)
..()
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 29bcbc43328..b8884608d79 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -28,6 +28,7 @@
icon_state = "[initial(icon_state)]-on"
set_light(brightness_on)
else
+ icon_state = "[initial(icon_state)]"
set_light(0)
/obj/item/device/flashlight/attack_self(mob/user)
@@ -36,6 +37,7 @@
return 0
on = !on
update_brightness(user)
+ user.update_action_buttons()
return 1
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 85f4ed4b891..c316fc0a331 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -212,6 +212,13 @@
freerange = 1
ks2type = /obj/item/device/encryptionkey/ert
+/obj/item/device/radio/headset/ia
+ name = "internal affair's headset"
+ desc = "The headset of your worst enemy."
+ icon_state = "com_headset"
+ item_state = "headset"
+ ks2type = /obj/item/device/encryptionkey/heads/hos
+
/obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob)
// ..()
user.set_machine(src)
diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm
index 67b5f007a54..b3b9e229a74 100644
--- a/code/game/objects/items/weapons/tanks/jetpack.dm
+++ b/code/game/objects/items/weapons/tanks/jetpack.dm
@@ -47,6 +47,7 @@
if (ismob(usr))
var/mob/M = usr
M.update_inv_back()
+ M.update_action_buttons()
usr << "You toggle the thrusters [on? "on":"off"]."
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 1066c4e8db0..9307fabff71 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -162,6 +162,10 @@
R.add_reagent("fuel", max_fuel)
return
+/obj/item/weapon/weldingtool/Destroy()
+ if(welding)
+ processing_objects -= src
+ ..()
/obj/item/weapon/weldingtool/examine(mob/user)
if(..(user, 0))
@@ -171,13 +175,13 @@
/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/screwdriver))
if(welding)
- user << "\red Stop welding first!"
+ user << "Stop welding first!"
return
status = !status
if(status)
- user << "\blue You resecure the welder."
+ user << "You secure the welder."
else
- user << "\blue The welder can now be attached and modified."
+ user << "The welder can now be attached and modified."
src.add_fingerprint(user)
return
@@ -207,31 +211,8 @@
/obj/item/weapon/weldingtool/process()
- switch(welding)
- //If off
- if(0)
- if(src.icon_state != "welder") //Check that the sprite is correct, if it isnt, it means toggle() was not called
- src.force = 3
- src.damtype = "brute"
- src.icon_state = "welder"
- src.welding = 0
- processing_objects.Remove(src)
- return
- //Welders left on now use up fuel, but lets not have them run out quite that fast
- if(1)
- if(src.icon_state != "welder1") //Check that the sprite is correct, if it isnt, it means toggle() was not called
- src.force = 15
- src.damtype = "fire"
- src.icon_state = "welder1"
- if(prob(5))
- remove_fuel(1)
-
- //If you're actually actively welding, use fuel faster.
- //Is this actually used or set anywhere? - Nodrak
- if(2)
- if(prob(75))
- remove_fuel(1)
-
+ if(welding && prob(5) && !remove_fuel(1))
+ setWelding(0)
//I'm not sure what this does. I assume it has to do with starting fires...
//...but it doesnt check to see if the welder is on or not.
@@ -248,7 +229,7 @@
if(!proximity) return
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !src.welding)
O.reagents.trans_to_obj(src, max_fuel)
- user << "\blue Welder refueled"
+ user << "Welder refueled"
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
return
else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.welding)
@@ -270,7 +251,7 @@
/obj/item/weapon/weldingtool/attack_self(mob/user as mob)
- toggle()
+ setWelding(!welding, usr)
return
//Returns the amount of fuel in the welder
@@ -280,81 +261,63 @@
//Removes fuel from the welding tool. If a mob is passed, it will perform an eyecheck on the mob. This should probably be renamed to use()
/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/M = null)
- if(!welding || !check_fuel())
- return 0
if(get_fuel() >= amount)
reagents.remove_reagent("fuel", amount)
- check_fuel()
if(M)
eyecheck(M)
return 1
else
if(M)
- M << "\blue You need more welding fuel to complete this task."
+ M << "You need more welding fuel to complete this task."
return 0
//Returns whether or not the welding tool is currently on.
/obj/item/weapon/weldingtool/proc/isOn()
return src.welding
+/obj/item/weapon/weldingtool/update_icon()
+ ..()
+ icon_state = welding ? "welder1" : "welder"
+ var/mob/M = loc
+ if(istype(M))
+ M.update_inv_l_hand()
+ M.update_inv_r_hand()
+
//Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1)
//so that the welding tool updates accordingly
-/obj/item/weapon/weldingtool/proc/setWelding(var/temp_welding)
+/obj/item/weapon/weldingtool/proc/setWelding(var/set_welding, var/mob/M)
+ if(!status) return
+
+ var/turf/T = get_turf(src)
//If we're turning it on
- if(temp_welding > 0)
+ if(set_welding && !welding)
if (remove_fuel(1))
- usr << "\blue The [src] switches on."
+ if(M)
+ M << "You switch the [src] on."
+ else if(T)
+ T.visible_message("\The [src] turns on.")
src.force = 15
src.damtype = "fire"
- src.icon_state = "welder1"
- processing_objects.Add(src)
+ src.w_class = 4
+ welding = 1
+ update_icon()
+ processing_objects |= src
else
- usr << "\blue Need more fuel!"
- src.welding = 0
+ if(M)
+ M << "You need more welding fuel to complete this task."
return
//Otherwise
- else
- usr << "\blue The [src] switches off."
+ else if(!set_welding && welding)
+ processing_objects -= src
+ if(M)
+ M << "You switch \the [src] off."
+ else if(T)
+ T.visible_message("\The [src] turns off.")
src.force = 3
src.damtype = "brute"
- src.icon_state = "welder"
- src.welding = 0
-
-//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
-/obj/item/weapon/weldingtool/proc/check_fuel()
- if((get_fuel() <= 0) && welding)
- toggle(1)
- return 0
- return 1
-
-
-//Toggles the welder off and on
-/obj/item/weapon/weldingtool/proc/toggle(var/message = 0)
- if(!status) return
- src.welding = !( src.welding )
- if (src.welding)
- if (remove_fuel(1))
- usr << "You switch the [src] on."
- src.force = 15
- src.damtype = "fire"
- src.icon_state = "welder1"
- src.w_class = 4
- processing_objects.Add(src)
- else
- usr << "You need more fuel!"
- src.welding = 0
- else
- if(!message)
- usr << "You switch \the [src] off."
- else
- usr << "\The [src] shuts off!"
- src.force = 3
- src.damtype = "brute"
- src.icon_state = "welder"
- src.welding = 0
src.w_class = initial(src.w_class)
- usr.update_inv_l_hand()
- usr.update_inv_r_hand()
+ src.welding = 0
+ update_icon()
//Decides whether or not to damage a player's eyes based on what they're wearing as protection
//Note: This should probably be moved to mob
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index edf09f6ea85..7d0f9e3d4a3 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -139,19 +139,17 @@
/obj/item/weapon/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
if(!proximity) return
..()
- if(A && wielded && (istype(A,/obj/structure/window) || istype(A,/obj/structure/grille))) //destroys windows and grilles in one hit
- if(istype(A,/obj/structure/window)) //should just make a window.Break() proc but couldn't bother with it
+ if(A && wielded)
+ if(istype(A,/obj/structure/window))
var/obj/structure/window/W = A
+ W.shatter()
+ else if(istype(A,/obj/structure/grille))
+ qdel(A)
+ else if(istype(A,/obj/effect/plant))
+ var/obj/effect/plant/P = A
+ P.die_off()
- new /obj/item/weapon/shard( W.loc )
- if(W.reinf) PoolOrNew(/obj/item/stack/rods, W.loc)
-
- if (W.dir == SOUTHWEST)
- new /obj/item/weapon/shard( W.loc )
- if(W.reinf) PoolOrNew(/obj/item/stack/rods, W.loc)
qdel(A)
-
-
/*
* Double-Bladed Energy Swords - Cheridan
*/
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 41cd5308f60..f42047c456c 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -24,9 +24,39 @@
/obj/structure/closet/initialize()
if(!opened) // if closed, any item at the crate's loc is put in the contents
- for(var/obj/item/I in src.loc)
+ var/obj/item/I
+ for(I in src.loc)
if(I.density || I.anchored || I == src) continue
I.loc = src
+ // adjust locker size to hold all items with 5 units of free store room
+ var/content_size = 0
+ for(I in src.contents)
+ content_size += Ceiling(I.w_class/2)
+ if(content_size > storage_capacity-5)
+ storage_capacity = content_size + 5
+
+
+/obj/structure/closet/examine(mob/user)
+ if(get_dist(src, user) > 1)
+ return ..(user)
+
+ if(opened)
+ var/content_size = 0
+ for(var/obj/item/I in src.contents)
+ if(!I.anchored)
+ content_size += Ceiling(I.w_class/2)
+ if(!content_size)
+ user << "It is empty."
+ else if(storage_capacity > content_size*4)
+ user << "It is barely filled."
+ else if(storage_capacity > content_size*2)
+ user << "It is less than half full."
+ else if(storage_capacity > content_size)
+ user << "There is still some free space."
+ else
+ user << "It is full."
+
+
/obj/structure/closet/alter_health()
return get_turf(src)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 2d452d52509..8fa7c9dd2f7 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -15,7 +15,6 @@ var/list/global/wall_cache = list()
var/damage_overlay
var/global/damage_overlays[8]
var/active
- var/last_event
var/can_open = 0
var/material/material
var/material/reinf_material
@@ -32,9 +31,20 @@ var/list/global/wall_cache = list()
reinf_material = name_to_material[rmaterialtype]
update_material()
-/turf/simulated/wall/bullet_act(var/obj/item/projectile/Proj)
+ processing_turfs |= src
- radiate()
+/turf/simulated/wall/Destroy()
+ processing_turfs -= src
+ dismantle_wall(null,null,1)
+ ..()
+
+
+/turf/simulated/wall/process()
+ // Calling parent will kill processing
+ if(!radiate())
+ return PROCESS_KILL
+
+/turf/simulated/wall/bullet_act(var/obj/item/projectile/Proj)
if(istype(Proj,/obj/item/projectile/beam))
ignite(2500)
else if(istype(Proj,/obj/item/projectile/ion))
@@ -234,21 +244,13 @@ var/list/global/wall_cache = list()
return 0
/turf/simulated/wall/proc/radiate()
- var/material/M = name_to_material[material]
- if(!istype(M) || !M.radioactivity)
+ var/total_radiation = material.radioactivity + (reinf_material ? reinf_material.radioactivity / 2 : 0)
+ if(!total_radiation)
return
- if(!active)
- if(world.time > last_event+15)
- active = 1
- for(var/mob/living/L in range(3,src))
- L.apply_effect(M.radioactivity,IRRADIATE,0)
- for(var/turf/simulated/wall/T in range(3,src))
- T.radiate()
- last_event = world.time
- active = null
- return
- return
+ for(var/mob/living/L in range(3,src))
+ L.apply_effect(total_radiation, IRRADIATE,0)
+ return total_radiation
/turf/simulated/wall/proc/burn(temperature)
spawn(2)
@@ -264,19 +266,9 @@ var/list/global/wall_cache = list()
D.ignite(temperature/4)
/turf/simulated/wall/proc/ignite(var/exposed_temperature)
-
- var/material/M = name_to_material[material]
- if(!istype(M) || !isnull(M.ignition_point))
+ if(isnull(material.ignition_point))
return
- if(exposed_temperature > M.ignition_point)//If the temperature of the object is over 300, then ignite
+ if(exposed_temperature > material.ignition_point)//If the temperature of the object is over 300, then ignite
burn(exposed_temperature)
return
..()
-
-/turf/simulated/wall/Bumped(AM as mob|obj)
- radiate()
- ..()
-
-/turf/simulated/wall/Destroy()
- dismantle_wall(null,null,1)
- ..()
\ No newline at end of file
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 7af228b49c5..e5ae4e1bb9a 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -378,3 +378,6 @@
if(!LinkBlocked(src, t) && !TurfBlockedNonWindow(t))
L.Add(t)
return L
+
+/turf/proc/process()
+ return PROCESS_KILL
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 2bfcce82b6d..783025a933c 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -276,6 +276,7 @@ BLIND // can't see anything
set_light(0)
light_applied = 0
update_icon(user)
+ user.update_action_buttons()
/obj/item/clothing/head/update_icon(var/mob/user)
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 82331722111..b6538495b4a 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -30,6 +30,7 @@
if(activation_sound)
usr << activation_sound
usr << "You activate the optical matrix on the [src]."
+ user.update_action_buttons()
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
@@ -173,8 +174,8 @@
body_parts_covered &= ~EYES
icon_state = "[initial(icon_state)]up"
usr << "You push \the [src] up out of your face."
-
update_clothing_icon()
+ usr.update_action_buttons()
/obj/item/clothing/glasses/welding/superior
name = "superior welding goggles"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 1a0052d3168..743351f5ca8 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -48,7 +48,8 @@
flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
icon_state = "[initial(icon_state)]up"
usr << "You push the [src] up out of your face."
- update_clothing_icon() //so our mob-overlays update
+ update_clothing_icon() //so our mob-overlays
+ usr.update_action_buttons()
/*
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index c9074fb8bdc..5c214ed0706 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -33,6 +33,7 @@
if(icon_base) icon_state = "[icon_base]1"
user << "You enable the mag-pulse traction system."
user.update_inv_shoes() //so our mob-overlays update
+ user.update_action_buttons()
/obj/item/clothing/shoes/magboots/mob_can_equip(mob/user)
var/mob/living/carbon/human/H = user
diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm
index a50c4bf12f0..9b4eb86b985 100644
--- a/code/modules/clothing/spacesuits/alien.dm
+++ b/code/modules/clothing/spacesuits/alien.dm
@@ -151,12 +151,12 @@
user << "You will have to put on the [src] before you can do that."
return
-
flags |= NOSLIP
magpulse = 1
canremove = 0 //kinda hard to take off magclaws when you are gripping them tightly.
user << "You dig your claws deeply into the flooring, bracing yourself."
user << "It would be hard to take off the [src] without relaxing your grip first."
+ user.update_action_buttons()
//In case they somehow come off while enabled.
/obj/item/clothing/shoes/magboots/vox/dropped(mob/user as mob)
diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm
index 15c4a683088..61013e22764 100644
--- a/code/modules/clothing/spacesuits/spacesuits.dm
+++ b/code/modules/clothing/spacesuits/spacesuits.dm
@@ -35,6 +35,7 @@
camera.replace_networks(camera_networks)
camera.c_tag = user.name
user << "\blue User scanned as [camera.c_tag]. Camera activated."
+ user.update_action_buttons()
return 1
..()
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index fb9d27f7a57..bf0a5b5ce79 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -259,7 +259,7 @@
siemens_coefficient = 1
/obj/item/clothing/under/stripper/mankini
- name = "the mankini"
+ name = "mankini"
desc = "No honest man would wear this abomination"
icon_state = "mankini"
siemens_coefficient = 1
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index ce4ff8306b4..feef7d06b1a 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -91,24 +91,42 @@
if(MALE) their = "his"
if(FEMALE) their = "her"
- var/sound = "pulse"
- var/sound_strength
-
+ var/sound = "heartbeat"
+ var/sound_strength = "cannot hear"
+ var/heartbeat = 0
+ if(M.species && M.species.has_organ["heart"])
+ var/obj/item/organ/heart/heart = M.internal_organs_by_name["heart"]
+ if(heart && !heart.robotic)
+ heartbeat = 1
if(M.stat == DEAD || (M.status_flags&FAKEDEATH))
sound_strength = "cannot hear"
sound = "anything"
else
- sound_strength = "hear a weak"
switch(body_part)
if("chest")
- if(M.oxyloss < 50)
- sound_strength = "hear a healthy"
- sound = "pulse and respiration"
+ sound_strength = "hear"
+ sound = "no heartbeat"
+ if(heartbeat)
+ var/obj/item/organ/heart/heart = M.internal_organs_by_name["heart"]
+ if(heart.is_bruised() || M.getOxyLoss() > 50)
+ sound = "[pick("odd noises in","weak")] heartbeat"
+ else
+ sound = "healthy heartbeat"
+
+ var/obj/item/organ/heart/L = M.internal_organs_by_name["lungs"]
+ if(!L || M.losebreath)
+ sound += " and no respiration"
+ else if(M.is_lung_ruptured() || M.getOxyLoss() > 50)
+ sound += " and [pick("wheezing","gurgling")] sounds"
+ else
+ sound += " and healthy respiration"
if("eyes","mouth")
sound_strength = "cannot hear"
sound = "anything"
else
- sound_strength = "hear a weak"
+ if(heartbeat)
+ sound_strength = "hear a weak"
+ sound = "pulse"
user.visible_message("[user] places [src] against [M]'s [body_part] and listens attentively.", "You place [src] against [their] [body_part]. You [sound_strength] [sound].")
return
diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm
index 8990d309a08..2d088658acd 100644
--- a/code/modules/hydroponics/spreading/spreading.dm
+++ b/code/modules/hydroponics/spreading/spreading.dm
@@ -16,13 +16,13 @@
seed.set_trait(TRAIT_SPREAD,2) // So it will function properly as vines.
seed.set_trait(TRAIT_POTENCY,rand(potency_min, potency_max)) // 70-100 potency will help guarantee a wide spread and powerful effects.
seed.set_trait(TRAIT_MATURATION,rand(maturation_min, maturation_max))
-
+
//make vine zero start off fully matured
var/obj/effect/plant/vine = new(T,seed)
vine.health = vine.max_health
vine.mature_time = 0
vine.process()
-
+
message_admins("Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])")
/obj/effect/dead_plant
@@ -49,6 +49,7 @@
icon_state = "bush4-1"
layer = 3
pass_flags = PASSTABLE
+ mouse_opacity = 2
var/health = 10
var/max_health = 100
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 56d0a1718fd..72bd64453d5 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -173,7 +173,7 @@
)
for(var/obj/item/organ/external/org in H.organs)
- var/status = ""
+ var/list/status = list()
var/brutedamage = org.brute_dam
var/burndamage = org.burn_dam
if(halloss > 0)
@@ -181,29 +181,39 @@
brutedamage += halloss
if(prob(30))
burndamage += halloss
+ switch(brutedamage)
+ if(1 to 20)
+ status += "bruised"
+ if(20 to 40)
+ status += "wounded"
+ if(40 to INFINITY)
+ status += "mangled"
- if(brutedamage > 0)
- status = "bruised"
- if(brutedamage > 20)
- status = "bleeding"
- if(brutedamage > 40)
- status = "mangled"
- if(brutedamage > 0 && burndamage > 0)
- status += " and "
- if(burndamage > 40)
- status += "peeling away"
+ switch(burndamage)
+ if(1 to 10)
+ status += "numb"
+ if(10 to 40)
+ status += "blistered"
+ if(40 to INFINITY)
+ status += "peeling away"
- else if(burndamage > 10)
- status += "blistered"
- else if(burndamage > 0)
- status += "numb"
if(org.status & ORGAN_DESTROYED)
- status = "MISSING!"
+ status += "MISSING"
if(org.status & ORGAN_MUTATED)
- status = "weirdly shapen."
- if(status == "")
- status = "OK"
- src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.name,status),1)
+ status += "weirdly shapen"
+ if(org.dislocated == 2)
+ status += "dislocated"
+ if(org.status & ORGAN_BROKEN)
+ status += "hurts when touched"
+ if(org.status & ORGAN_DEAD)
+ status += "is bruised and necrotic"
+ if(!org.is_usable())
+ status += "dangling uselessly"
+ if(status.len)
+ src.show_message("My [org.name] is [english_list(status)].",1)
+ else
+ src.show_message("My [org.name] is OK.",1)
+
if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit))
H.play_xylophone()
else if (on_fire)
@@ -452,17 +462,17 @@
Stun(stun_duration)
Weaken(Floor(stun_duration/2))
return 1
-
+
/mob/living/carbon/proc/add_chemical_effect(var/effect, var/magnitude = 1)
if(effect in chem_effects)
chem_effects[effect] += magnitude
else
- chem_effects[effect] = magnitude
-
+ chem_effects[effect] = magnitude
+
/mob/living/carbon/get_default_language()
if(default_language)
return default_language
if(!species)
return null
- return species.default_language ? all_languages[species.default_language] : null
+ return species.default_language ? all_languages[species.default_language] : null
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index d7255571613..dad4e902446 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -274,76 +274,17 @@
wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]!\n"
continue
else
- wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]. It has"
- if(temp.brute_dam) switch(temp.brute_dam)
- if(0 to 20)
- wound_flavor_text["[temp.name]"] += " some dents"
- if(21 to INFINITY)
- wound_flavor_text["[temp.name]"] += pick(" a lot of dents"," severe denting")
- if(temp.brute_dam && temp.burn_dam)
- wound_flavor_text["[temp.name]"] += " and"
- if(temp.burn_dam) switch(temp.burn_dam)
- if(0 to 20)
- wound_flavor_text["[temp.name]"] += " some burns"
- if(21 to INFINITY)
- wound_flavor_text["[temp.name]"] += pick(" a lot of burns"," severe melting")
- if(wound_flavor_text["[temp.name]"])
- wound_flavor_text["[temp.name]"] += "!\n"
- else if(temp.wounds.len > 0)
- var/list/wound_descriptors = list()
- for(var/datum/wound/W in temp.wounds)
- if(W.internal && !temp.open) continue // can't see internal wounds
- var/this_wound_desc = W.desc
- if(W.damage_type == BURN && W.salved) this_wound_desc = "salved [this_wound_desc]"
- if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]"
- else if(W.bandaged) this_wound_desc = "bandaged [this_wound_desc]"
- if(W.germ_level > 600) this_wound_desc = "badly infected [this_wound_desc]"
- else if(W.germ_level > 330) this_wound_desc = "lightly infected [this_wound_desc]"
- if(this_wound_desc in wound_descriptors)
- wound_descriptors[this_wound_desc] += W.amount
- continue
- wound_descriptors[this_wound_desc] = W.amount
- if(wound_descriptors.len)
- var/list/flavor_text = list()
- var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\
- "huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area")
- for(var/wound in wound_descriptors)
- switch(wound_descriptors[wound])
- if(1)
- if(!flavor_text.len)
- flavor_text += "[t_He] has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
- else
- flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
- if(2)
- if(!flavor_text.len)
- flavor_text += "[t_He] has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
- else
- flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
- if(3 to 5)
- if(!flavor_text.len)
- flavor_text += "[t_He] has several [wound]s"
- else
- flavor_text += " several [wound]s"
- if(6 to INFINITY)
- if(!flavor_text.len)
- flavor_text += "[t_He] has a bunch of [wound]s"
- else
- flavor_text += " a ton of [wound]\s"
- var/flavor_text_string = ""
- for(var/text = 1, text <= flavor_text.len, text++)
- if(text == flavor_text.len && flavor_text.len > 1)
- flavor_text_string += ", and"
- else if(flavor_text.len > 1 && text > 1)
- flavor_text_string += ","
- flavor_text_string += flavor_text[text]
- flavor_text_string += " on [t_his] [temp.name].
"
- wound_flavor_text["[temp.name]"] = flavor_text_string
- else
- wound_flavor_text["[temp.name]"] = ""
+ wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]. It has[temp.get_wounds_desc()]!\n"
+ else if(temp.wounds.len > 0 || temp.open)
+ wound_flavor_text["[temp.name]"] = "[t_He] has [temp.get_wounds_desc()] on [t_his] [temp.name].
"
if(temp.status & ORGAN_BLEEDING)
is_bleeding["[temp.name]"] = 1
else
wound_flavor_text["[temp.name]"] = ""
+ if(temp.dislocated == 2)
+ wound_flavor_text["[temp.name]"] += "[capitalize(t_his)] [temp.joint] is dislocated!
"
+ if(((temp.status & ORGAN_BROKEN) && temp.brute_dam > temp.min_broken_damage) || (temp.status & ORGAN_MUTATED))
+ wound_flavor_text["[temp.name]"] += "[capitalize(t_his)] [temp.name] is dented and swollen!
"
//Handles the text strings being added to the actual description.
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
@@ -354,9 +295,9 @@
msg += wound_flavor_text["head"]
else if(is_bleeding["head"])
msg += "[src] has blood running down [t_his] face!\n"
- if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
- msg += wound_flavor_text["chest"]
- else if(is_bleeding["chest"])
+ if(wound_flavor_text["upper body"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
+ msg += wound_flavor_text["upper body"]
+ else if(is_bleeding["upper body"])
display_chest = 1
if(wound_flavor_text["left arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["left arm"]
@@ -374,9 +315,9 @@
msg += wound_flavor_text["right hand"]
else if(is_bleeding["right hand"])
display_gloves = 1
- if(wound_flavor_text["groin"] && (is_destroyed["groin"] || (!w_uniform && !skipjumpsuit)))
- msg += wound_flavor_text["groin"]
- else if(is_bleeding["groin"])
+ if(wound_flavor_text["lower body"] && (is_destroyed["lower body"] || (!w_uniform && !skipjumpsuit)))
+ msg += wound_flavor_text["lower body"]
+ else if(is_bleeding["lower body"])
display_chest = 1
if(wound_flavor_text["left leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["left leg"]
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 8fa19821cc6..3eacc549267 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1321,7 +1321,6 @@
var/mob/S = src
var/mob/U = usr
var/self = null
-
if(S == U)
self = 1 // Removing object from yourself.
@@ -1330,8 +1329,7 @@
var/obj/item/organ/external/current_limb = organs_by_name[limb]
if(current_limb && current_limb.dislocated == 2)
limbs |= limb
-
- var/choice = input(src,"Which joint do you wish to relocate?") as null|anything in limbs
+ var/choice = input(usr,"Which joint do you wish to relocate?") as null|anything in limbs
if(!choice)
return
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 9bdb873e34b..0deb593c846 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -300,7 +300,7 @@
var/dislocation_str
if(prob(W.force))
dislocation_str = "[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!"
- organ.dislocate()
+ organ.dislocate(1)
return dislocation_str
//Used to attack a joint through grabbing
@@ -324,7 +324,7 @@
user.visible_message("[user] begins to dislocate [src]'s [organ.joint]!")
if(do_after(user, 100))
- organ.dislocate()
+ organ.dislocate(1)
src.visible_message("[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!")
return 1
return 0
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 2fb446e1acc..574b5c1457f 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -315,6 +315,9 @@ This saves us from having to call add_fingerprint() any time something is put in
W.layer = 20
+ if(W.icon_action_button)
+ update_action_buttons()
+
return 1
//Checks if a given slot can be accessed at this time, either to equip or unequip I
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index e3b8820b002..84a6fb82902 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1131,8 +1131,6 @@
client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask, global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science)
- update_action_buttons()
-
if(damageoverlay.overlays)
damageoverlay.overlays = list()
diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm
index 3bc0dd9a150..768e42370f2 100644
--- a/code/modules/mob/living/silicon/robot/robot_items.dm
+++ b/code/modules/mob/living/silicon/robot/robot_items.dm
@@ -129,7 +129,10 @@
return
if(istype(target,/obj/machinery/portable_atmospherics/hydroponics))
var/obj/machinery/portable_atmospherics/hydroponics/T = target
- T.harvest(user)
+ if(T.harvest) //Try to harvest, assuming it's alive.
+ T.harvest(user)
+ else if(T.dead) //It's probably dead otherwise.
+ T.remove_dead(user)
else
user << "Harvesting \a [target] is not the purpose of this tool. The [src] is for plants being grown."
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 433a46efb7f..1dcd98ffdc5 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -49,12 +49,16 @@
var/obj/effect/plant/SV = locate() in loc
SV.die_off(1)
+ if(locate(/obj/machinery/portable_atmospherics/hydroponics/soil/invisible) in loc)
+ var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/SP = locate() in loc
+ del(SP)
+
if(!pulledby)
- for(var/direction in shuffle(list(1,2,4,8,5,6,9,10)))
- var/step = get_step(src, direction)
- if(step)
- if(locate(/obj/effect/plant) in step)
- Move(step)
+ var/obj/effect/plant/food
+ food = locate(/obj/effect/plant) in oview(5,loc)
+ if(food)
+ var/step = get_step_to(src, food, 0)
+ Move(step)
/mob/living/simple_animal/hostile/retaliate/goat/Retaliate()
..()
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index d3b889198c5..4a51684139b 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -297,6 +297,43 @@
assailant << "You are no longer pinning [affecting] to the ground."
force_down = 0
return
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/external/E = H.get_organ(hit_zone)
+ if(E && !(E.status & ORGAN_DESTROYED))
+ assailant.visible_message("[assailant] starts inspecting [affecting]'s [E.name] carefully.")
+ if(do_mob(assailant,H, 10))
+ if(E.wounds.len)
+ assailant << "You find [E.get_wounds_desc()]"
+ else
+ assailant << "You find no visible wounds."
+ else
+ assailant << "You must stand still to inspect [E] for wounds."
+ assailant << "Checking bones now..."
+ if(do_mob(assailant, H, 20))
+ if(E.status & ORGAN_BROKEN)
+ assailant << "The [E.encased ? E.encased : "bone in the [E.name]"] moves slightly when you poke it!"
+ H.custom_pain("Your [E.name] hurts where it's poked.")
+ else
+ assailant << "The [E.encased ? E.encased : "bones in the [E.name]"] seem to be fine."
+ else
+ assailant << "You must stand still to feel [E] for fractures."
+ assailant << "Checking skin now..."
+ if(do_mob(assailant, H, 10))
+ var/bad = 0
+ if(H.getToxLoss() >= 40)
+ assailant << "[H] has an unhealthy skin discoloration."
+ bad = 1
+ if(H.getOxyLoss() >= 20)
+ assailant << "[H]'s skin is unusaly pale."
+ bad = 1
+ if(E.status & ORGAN_DEAD)
+ assailant << "[E] is decaying!"
+ if(!bad)
+ assailant << "[H]'s skin is normal."
+ else
+ assailant << "You must stand still to check [H]'s skin for abnormalities."
+ else
+ assailant << "[H] is missing that bodypart."
if(I_GRAB)
if(state < GRAB_AGGRESSIVE)
assailant << "You require a better grab to do this."
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index f5b6056e151..28f63329b1c 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -184,7 +184,10 @@ datum/preferences
dummy.set_species(species)
dummy.flags |= GODMODE
copy_to(dummy)
-
+ for (var/obj/item/I in dummy)
+ dummy.drop_from_inventory(I)
+ if(I.loc != dummy)
+ qdel(I)
var/jobflag
var/dept
if(job_civilian_high)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index c0a7fbce3c5..1f7220f6995 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -106,7 +106,8 @@
O.add_ai_verbs()
O.rename_self("ai",1)
- qdel(src)
+ spawn(0) // Mobs still instantly del themselves, thus we need to spawn or O will never be returned
+ qdel(src)
return O
//human -> robot
@@ -158,7 +159,8 @@
callHook("borgify", list(O))
O.Namepick()
- qdel(src)
+ spawn(0) // Mobs still instantly del themselves, thus we need to spawn or O will never be returned
+ qdel(src)
return O
//human -> alien
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 0e1878c81e1..a539f5f421b 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -173,8 +173,11 @@
add_autopsy_data("[used_weapon]", brute + burn)
var/can_cut = (prob(brute*2) || sharp) && !(status & ORGAN_ROBOT)
+
// If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking
- if((brute_dam + burn_dam + brute + burn) < max_damage || !config.limbs_can_break)
+ // Non-vital organs are limited to max_damage. You can't kill someone by bludeonging their arm all the way to 200 -- you can
+ // push them faster into paincrit though, as the additional damage is converted into shock.
+ if(vital || (brute_dam + burn_dam + brute + burn) < max_damage || !config.limbs_can_break)
if(brute)
if(can_cut)
createwound( CUT, brute )
@@ -206,7 +209,7 @@
burn = max(0, burn - can_inflict)
//If there are still hurties to dispense
if (burn || brute)
- owner.shock_stage += brute+burn
+ owner.shock_stage += (brute+burn) * config.organ_damage_spillover_multiplier
// sync the organ's damage with its wounds
src.update_damages()
@@ -928,6 +931,58 @@ Note that amputating the affected organ does in fact remove the infection from t
"\red You hear a sickening sizzle.")
disfigured = 1
+/obj/item/organ/external/proc/get_wounds_desc()
+ . = ""
+ if(status & ORGAN_ROBOT)
+ if(brute_dam)
+ switch(brute_dam)
+ if(0 to 20)
+ . += " some dents"
+ if(21 to INFINITY)
+ . += pick(" a lot of dents"," severe denting")
+ if(brute_dam && burn_dam)
+ . += " and"
+ if(burn_dam)
+ switch(burn_dam)
+ if(0 to 20)
+ . += " some burns"
+ if(21 to INFINITY)
+ . += pick(" a lot of burns"," severe melting")
+ return
+
+ var/list/wound_descriptors = list()
+ if(open > 1)
+ wound_descriptors["an open incision"] = 1
+ else if (open)
+ wound_descriptors["an incision"] = 1
+ for(var/datum/wound/W in wounds)
+ if(W.internal && !open) continue // can't see internal wounds
+ var/this_wound_desc = W.desc
+ if(W.damage_type == BURN && W.salved) this_wound_desc = "salved [this_wound_desc]"
+ if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]"
+ else if(W.bandaged) this_wound_desc = "bandaged [this_wound_desc]"
+ if(W.germ_level > 600) this_wound_desc = "badly infected [this_wound_desc]"
+ else if(W.germ_level > 330) this_wound_desc = "lightly infected [this_wound_desc]"
+ if(wound_descriptors[this_wound_desc])
+ wound_descriptors[this_wound_desc] += W.amount
+ else
+ wound_descriptors[this_wound_desc] = W.amount
+
+ if(wound_descriptors.len)
+ var/list/flavor_text = list()
+ var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\
+ "huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area")
+ for(var/wound in wound_descriptors)
+ switch(wound_descriptors[wound])
+ if(1)
+ flavor_text += "[prob(10) && !(wound in no_exclude) ? "what might be " : ""]a [wound]"
+ if(2)
+ flavor_text += "[prob(10) && !(wound in no_exclude) ? "what might be " : ""]a pair of [wound]s"
+ if(3 to 5)
+ flavor_text += "several [wound]s"
+ if(6 to INFINITY)
+ flavor_text += "a ton of [wound]\s"
+ return english_list(flavor_text)
/****************************************************
ORGAN DEFINES
****************************************************/
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 7782219bd7b..b3ff7722c9d 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -6,14 +6,14 @@
var/reacting = 0 // Reacting right now
/datum/reagents/New(var/max = 100)
- maximum_volume = max
+ maximum_volume = max
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
if(!chemical_reagents_list)
//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
var/paths = typesof(/datum/reagent) - /datum/reagent
chemical_reagents_list = list()
for(var/path in paths)
- var/datum/reagent/D = new path()
+ var/datum/reagent/D = new path()
if(!D.name)
continue
chemical_reagents_list[D.id] = D
@@ -40,16 +40,16 @@
for(var/id in reaction_ids)
if(!chemical_reactions_list[id])
chemical_reactions_list[id] = list()
- chemical_reactions_list[id] += D
- break // Don't bother adding ourselves to other reagent ids, it is redundant.
-
-/datum/reagents/Destroy()
- ..()
- for(var/datum/reagent/R in reagent_list)
- qdel(R)
- reagent_list.Cut()
- reagent_list = null
- if(my_atom && my_atom.reagents == src)
+ chemical_reactions_list[id] += D
+ break // Don't bother adding ourselves to other reagent ids, it is redundant.
+
+/datum/reagents/Destroy()
+ ..()
+ for(var/datum/reagent/R in reagent_list)
+ qdel(R)
+ reagent_list.Cut()
+ reagent_list = null
+ if(my_atom && my_atom.reagents == src)
my_atom.reagents = null
/* Internal procs */
@@ -116,7 +116,7 @@
for(var/datum/chemical_reaction/C in chemical_reactions_list[R.id])
var/reagents_suitable = 1
for(var/B in C.required_reagents)
- if(!has_reagent(B, C.required_reagents[B]))
+ if(!has_reagent(B))
reagents_suitable = 0
for(var/B in C.catalysts)
if(!has_reagent(B, C.catalysts[B]))
@@ -169,7 +169,7 @@
if(!isnull(data)) // For all we know, it could be zero or empty string and meaningful
current.mix_data(data, amount)
update_total()
- if(!safety)
+ if(!safety)
handle_reactions()
if(my_atom)
my_atom.on_reagent_change()
@@ -183,7 +183,7 @@
R.initialize_data(data)
update_total()
if(!safety)
- handle_reactions()
+ handle_reactions()
if(my_atom)
my_atom.on_reagent_change()
return 1
@@ -218,7 +218,7 @@
/datum/reagents/proc/has_reagent(var/id, var/amount = 0)
for(var/datum/reagent/current in reagent_list)
if(current.id == id)
- if(current.volume >= amount)
+ if(current.volume >= amount)
return 1
else
return 0
@@ -234,12 +234,12 @@
if(current.id == id)
return current.volume
return 0
-
+
/datum/reagents/proc/get_data(var/id)
for(var/datum/reagent/current in reagent_list)
if(current.id == id)
return current.get_data()
- return 0
+ return 0
/datum/reagents/proc/get_reagents()
var/res = ""
@@ -255,14 +255,14 @@
amount = min(amount, total_volume)
if(!amount)
- return
+ return
var/part = amount / total_volume
-
+
for(var/datum/reagent/current in reagent_list)
var/amount_to_remove = current.volume * part
remove_reagent(current.id, amount_to_remove, 1)
-
+
update_total()
handle_reactions()
return amount
@@ -431,6 +431,6 @@
/* Atom reagent creation - use it all the time */
-/atom/proc/create_reagents(var/max_vol)
+/atom/proc/create_reagents(var/max_vol)
reagents = new/datum/reagents(max_vol)
- reagents.my_atom = src
+ reagents.my_atom = src
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
index 2d742bd01ed..eac0f76cd27 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
@@ -11,6 +11,17 @@
description = "A chemical element, the builing block of life."
reagent_state = SOLID
color = "#1C1300"
+ ingest_met = REM * 5
+
+/datum/reagent/carbon/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien == IS_DIONA)
+ return
+ if(M.ingested && M.ingested.reagent_list.len > 1) // Need to have at least 2 reagents - cabon and something to remove
+ var/effect = 1 / (M.ingested.reagent_list.len - 1)
+ for(var/datum/reagent/R in M.ingested.reagent_list)
+ if(R == src)
+ continue
+ M.ingested.remove_reagent(R.id, removed * effect)
/datum/reagent/carbon/touch_turf(var/turf/T)
if(!istype(T, /turf/space))
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
index c17178ae630..0009684c309 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
@@ -329,7 +329,7 @@
M.stuttering = 0
M.confused = 0
if(M.ingested)
- for(var/datum/reagent/R in M.ingested)
+ for(var/datum/reagent/R in M.ingested.reagent_list)
if(istype(R, /datum/reagent/ethanol))
R.dose = max(R.dose - removed * 5, 0)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm
index b8d1c9a87cd..6f6d7f88f35 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm
@@ -34,7 +34,7 @@
sparks.set_up(3, 0, get_turf(M))
sparks.start()
//
- M.loc = pick(orange(get_turf(T), 50))
+ M.Move(pick(trange(50, get_turf(holder))))
sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(M))
sparks.start()
diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/research/xenoarchaeology/finds/finds.dm
index 7de8474aef7..7c1a238083d 100644
--- a/code/modules/research/xenoarchaeology/finds/finds.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds.dm
@@ -191,7 +191,7 @@
if(9)
item_type = "[pick("wicked","evil","byzantine","dangerous")] looking [pick("device","contraption","thing","trap")]"
apply_prefix = 0
- new_item = new /obj/item/weapon/legcuffs/beartrap(src.loc)
+ new_item = new /obj/item/weapon/beartrap(src.loc)
additional_desc = "[pick("It looks like it could take a limb off",\
"Could be some kind of animal trap",\
"There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along part of it")]."
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index df394fcd433..f660061ccc9 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -16,9 +16,9 @@
switch (affected.name)
if ("head")
return 1
- if ("chest")
+ if ("upper body")
return 3
- if ("groin")
+ if ("lower body")
return 2
return 0
@@ -26,9 +26,9 @@
switch (affected.name)
if ("head")
return "cranial"
- if ("chest")
+ if ("upper body")
return "thoracic"
- if ("groin")
+ if ("lower body")
return "abdominal"
return ""
diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm
index 09e32deebea..980227db8cf 100644
--- a/code/modules/tables/interactions.dm
+++ b/code/modules/tables/interactions.dm
@@ -123,7 +123,7 @@
break_to_parts()
return
- if(!material)
+ if(can_plate && !material)
user << "There's nothing to put \the [W] on! Try adding plating to \the [src] first."
return
diff --git a/html/changelog.html b/html/changelog.html
index 83d87d57b3f..6cc3c3bc315 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,39 @@
-->
+
18 May 2015
+
Hubblenaut updated:
+
+ - Adds a light for available backup power on airlocks.
+
+
Kelenius updated:
+
+ - There has been a big update to the reagent system. A full-ish changelog can be found here: http://pastebin.com/imHXTRHz. In particular:
+ - Reagents now differentiate between being ingested (food, pills, smoke), injected (syringes, IV drips), and put on the skin (sprays, beaker splashing).
+ - Injecting food and drinks will cause bad effects.
+ - Healing reagents, generally speaking, have stronger effects when injected.
+ - Toxins now work slower and deal more damage. Seek medical help!
+ - Alcohol robustness has been lowered.
+ - Acid will no longer melt large numbers of items at once.
+ - Synaptizine is no longer hilariously deadly.
+
+
Loganbacca updated:
+
+ - Changed MULE destination selection to be list based.
+
+
PsiOmegaDelta updated:
+
+ - Destroying a camera by brute force now has a chance to break the wiring within.
+ - Turf are now processed. This, for example, causes radioactive walls to regularly irradiate nearby mobs.
+ - Welders should now always update their icon and inhand states properly.
+
+
+
17 May 2015
+
PsiOmegaDelta updated:
+
+ - Teleporter artifacts should no longer teleport mobs inside objects.
+
+
16 May 2015
GinjaNinja32 updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index baf01f27537..a0bf108e0e1 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1791,3 +1791,28 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
HarpyEagle:
- rscadd: Adds tail animations for tajaran and unathi. Animations are controlled
using emotes.
+2015-05-17:
+ PsiOmegaDelta:
+ - bugfix: Teleporter artifacts should no longer teleport mobs inside objects.
+2015-05-18:
+ Hubblenaut:
+ - rscadd: Adds a light for available backup power on airlocks.
+ Kelenius:
+ - tweak: 'There has been a big update to the reagent system. A full-ish changelog
+ can be found here: http://pastebin.com/imHXTRHz. In particular:'
+ - tweak: Reagents now differentiate between being ingested (food, pills, smoke),
+ injected (syringes, IV drips), and put on the skin (sprays, beaker splashing).
+ - tweak: Injecting food and drinks will cause bad effects.
+ - tweak: Healing reagents, generally speaking, have stronger effects when injected.
+ - tweak: Toxins now work slower and deal more damage. Seek medical help!
+ - tweak: Alcohol robustness has been lowered.
+ - tweak: Acid will no longer melt large numbers of items at once.
+ - tweak: Synaptizine is no longer hilariously deadly.
+ Loganbacca:
+ - tweak: Changed MULE destination selection to be list based.
+ PsiOmegaDelta:
+ - tweak: Destroying a camera by brute force now has a chance to break the wiring
+ within.
+ - rscadd: Turf are now processed. This, for example, causes radioactive walls to
+ regularly irradiate nearby mobs.
+ - bugfix: Welders should now always update their icon and inhand states properly.
diff --git a/html/changelogs/Ccomp5950-Goats.yml b/html/changelogs/Ccomp5950-Goats.yml
new file mode 100644
index 00000000000..be80867380f
--- /dev/null
+++ b/html/changelogs/Ccomp5950-Goats.yml
@@ -0,0 +1,7 @@
+author: Ccomp5950
+delete-after: True
+
+changes:
+ - bugfix: "Beepsky no longer kills goats."
+ - tweak: "Goats will move towards vines that are 4 spaces away now instead of 1"
+ - bugfix: "Goats will eat the spawning plants for vines as well as the vines themselves."
diff --git a/html/changelogs/Comma-PR-9337.yml b/html/changelogs/Comma-PR-9337.yml
new file mode 100644
index 00000000000..cf1aac28916
--- /dev/null
+++ b/html/changelogs/Comma-PR-9337.yml
@@ -0,0 +1,8 @@
+author: Chinsky
+
+delete-after: True
+
+changes:
+ - rscadd: "Ghetto diagnosis. Grab patient, aim at bodypart you want to check, click on them with help intent. This will tell you about their wounds, fractures and other oddities (toxins/oxygen) for that bodypart."
+ - rscadd: "Fractures are visible on very damaged limbs. Dislocations are always visible. Surgery incisions now visible too."
+ - rscadd: "Stethoscopes actually make sense now. They care for heart/lungs status when reporting pulse and respiration now."
\ No newline at end of file
diff --git a/html/changelogs/Yoshax - trapping.YML b/html/changelogs/Yoshax - trapping.YML
new file mode 100644
index 00000000000..d9b7884761a
--- /dev/null
+++ b/html/changelogs/Yoshax - trapping.YML
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Yoshax
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Bear traps now do damage when stood on, enough to break bones! Bear traps can now affect any limb of a person who is on the ground, including head! Bear traps are no longer legcuffs and instead embed in the limb they attack."
+ - tweak: "Bear traps now take several seconds to deploy and cannot be picked up when armed, they must be disarmed by clicking on them. They also cannot be moved then they are deployed."
\ No newline at end of file
diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi
index 66b5fbe7f8e..488ca417774 100644
Binary files a/icons/mob/custom-synthetic.dmi and b/icons/mob/custom-synthetic.dmi differ
diff --git a/icons/obj/tables.dmi b/icons/obj/tables.dmi
index 36de1b41836..99b21bcfcbc 100644
Binary files a/icons/obj/tables.dmi and b/icons/obj/tables.dmi differ
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index 5d41e5d42da..9e54641cc1f 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -4927,7 +4927,7 @@
"bQM" = (/obj/structure/table/standard,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/machinery/recharger{pixel_y = 0},/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/hop)
"bQN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light,/turf/simulated/floor,/area/janitor)
"bQO" = (/obj/structure/janitorialcart,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/janitor)
-"bQP" = (/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/janitor)
+"bQP" = (/obj/item/weapon/beartrap,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/beartrap,/turf/simulated/floor,/area/janitor)
"bQQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/janitor)
"bQR" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/janitor)
"bQS" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/maintenance/engineering)