diff --git a/.travis.yml b/.travis.yml
index 9d86d85229..81b8487f48 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 c796afa1f9..b84dfaf943 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 c1efac52f9..2ac33f48ba 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 171080fb32..98d56d3d23 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 d698454cab..0152af8b13 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 7db31c6fa6..68bfdab74b 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 97e1f59582..8bc6cc0580 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 7e8c8779cf..a0f1f9c7f1 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 3b0b54942f..0555a140bd 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 99ff26c89a..4d564bbf83 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 07856d9251..6025457758 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 d71ff249d1..dc315ac510 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 08ad7e7253..34a57a0768 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 33dcee54a2..449e5f68ba 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 073e663a4b..c1ca46da14 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 5e8817359f..9ba8c2de49 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 125345c518..3e6f0d8e33 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 ec9c17f241..43e26a7d46 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 d7224f2212..c9228000e2 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 29bcbc4332..b8884608d7 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 85f4ed4b89..c316fc0a33 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 67b5f007a5..b3b9e229a7 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 1066c4e8db..9307fabff7 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 edf09f6ea8..7d0f9e3d4a 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 41cd5308f6..f42047c456 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 2d452d5250..8fa7c9dd2f 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 7af228b49c..e5ae4e1bb9 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 2bfcce82b6..783025a933 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 8233172211..b6538495b4 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 1a0052d316..743351f5ca 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 c9074fb8bd..5c214ed070 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 a50c4bf12f..9b4eb86b98 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 15c4a68308..61013e2276 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 fb9d27f7a5..bf0a5b5ce7 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 ce4ff8306b..feef7d06b1 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 8990d309a0..2d088658ac 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 56d0a1718f..72bd64453d 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 d725557161..dad4e90244 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 8fa19821cc..3eacc54926 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 9bdb873e34..0deb593c84 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 2fb446e1ac..574b5c1457 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 e3b8820b00..84a6fb8290 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 3bc0dd9a15..768e42370f 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 433a46efb7..1dcd98ffdc 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 d3b889198c..4a51684139 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 f5b6056e15..28f63329b1 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 c0a7fbce3c..1f7220f699 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 0e1878c81e..a539f5f421 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 7782219bd7..b3ff7722c9 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 2d742bd01e..eac0f76cd2 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 c17178ae63..0009684c30 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 b8d1c9a87c..6f6d7f88f3 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 7de8474aef..7c1a238083 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 df394fcd43..f660061ccc 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 09e32deebe..980227db8c 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 83d87d57b3..6cc3c3bc31 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 baf01f2753..a0bf108e0e 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 0000000000..be80867380
--- /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 0000000000..cf1aac2891
--- /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 0000000000..d9b7884761
--- /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 66b5fbe7f8..488ca41777 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 36de1b4183..99b21bcfcb 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 5d41e5d42d..9e54641cc1 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)