diff --git a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm b/code/ATMOSPHERICS/components/unary/oxygen_generator.dm
index 721365e6be2..27819ddac3e 100644
--- a/code/ATMOSPHERICS/components/unary/oxygen_generator.dm
+++ b/code/ATMOSPHERICS/components/unary/oxygen_generator.dm
@@ -42,6 +42,7 @@ obj/machinery/atmospherics/unary/oxygen_generator
air_contents.temperature = (current_heat_capacity*air_contents.temperature + 20*added_oxygen*T0C)/(current_heat_capacity+20*added_oxygen)
air_contents.oxygen += added_oxygen
+ air_contents.update_values()
if(network)
network.update = 1
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index 5606d8113f8..f2ce4a8621a 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -124,6 +124,7 @@
//Remix the resulting gases
filtered_out.update_values()
+ removed.update_values()
air_contents.merge(filtered_out)
loc.assume_air(removed)
diff --git a/code/ATMOSPHERICS/datum_pipe_network.dm b/code/ATMOSPHERICS/datum_pipe_network.dm
index ce9fb9f8598..bff2d0ee5ee 100644
--- a/code/ATMOSPHERICS/datum_pipe_network.dm
+++ b/code/ATMOSPHERICS/datum_pipe_network.dm
@@ -44,11 +44,9 @@ datum/pipe_network
proc/merge(datum/pipe_network/giver)
if(giver==src) return 0
- normal_members -= giver.normal_members
- normal_members += giver.normal_members
+ normal_members |= giver.normal_members
- line_members -= giver.line_members
- line_members += giver.line_members
+ line_members |= giver.line_members
for(var/obj/machinery/atmospherics/normal_member in giver.normal_members)
normal_member.reassign_network(giver, src)
@@ -139,6 +137,7 @@ datum/pipe_network
gas.trace_gases += corresponding
corresponding.moles = trace_gas.moles*gas.volume/air_transient.volume
+ gas.update_values()
air_transient.update_values()
return 1
diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm
index 56cb9898013..1b63e605481 100644
--- a/code/ATMOSPHERICS/datum_pipeline.dm
+++ b/code/ATMOSPHERICS/datum_pipeline.dm
@@ -50,6 +50,7 @@ datum/pipeline
member.air_temporary.trace_gases += corresponding
corresponding.moles = trace_gas.moles*member.volume/air.volume
+ member.air_temporary.update_values()
proc/build_pipeline(obj/machinery/atmospherics/pipe/base)
air = new
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index 577bf562dce..52aae83099d 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -341,6 +341,7 @@ obj/machinery/atmospherics/pipe
New()
initialize_directions = dir
+ air_temporary.update_values()
..()
process()
diff --git a/code/FEA/FEA_airgroup.dm b/code/FEA/FEA_airgroup.dm
index c92c3838d14..f8a6a8a5857 100644
--- a/code/FEA/FEA_airgroup.dm
+++ b/code/FEA/FEA_airgroup.dm
@@ -19,6 +19,12 @@ datum
var/list/space_borders
var/length_space_border = 0
+ Del()
+ spawn(5)
+ message_admins("WARNING! Airgroup deleted! Stacktrace is in a runtime, give it to Sky.")
+ CRASH("Fuck. Something deleted an airgroup. Here's your stack trace.")
+ ..()
+
proc/suspend_group_processing()
//Purpose: Suspends processing of the group, breaks it into individual tiles.
//Called by: Any check where the airgroup is determined to break.
diff --git a/code/FEA/FEA_gas_mixture.dm b/code/FEA/FEA_gas_mixture.dm
index 0c7538c770d..18191295325 100644
--- a/code/FEA/FEA_gas_mixture.dm
+++ b/code/FEA/FEA_gas_mixture.dm
@@ -891,6 +891,9 @@ datum
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/self_heat_capacity = heat_capacity_archived()
var/sharer_heat_capacity = sharer.heat_capacity_archived()
+ if(!group_multiplier)
+ message_admins("Error! The gas mixture (ref \ref[src]) has no group multiplier!")
+ return
if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY))
var/heat = conduction_coefficient*delta_temperature* \
@@ -903,13 +906,14 @@ datum
var/delta_temperature = (temperature - model.temperature)
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/self_heat_capacity = heat_capacity()//_archived()
+ if(!group_multiplier)
+ message_admins("Error! The gas mixture (ref \ref[src]) has no group multiplier!")
+ return
if((model.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY))
var/heat = conduction_coefficient*delta_temperature* \
(self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.heat_capacity))
- ASSERT(self_heat_capacity != 0) // Trying to solve a runtime error - Abi79
- ASSERT(group_multiplier != 0)
if(border_multiplier)
temperature -= heat*border_multiplier/(self_heat_capacity*group_multiplier)
else
diff --git a/code/FEA/FEA_system.dm b/code/FEA/FEA_system.dm
index 92eaf9b5a17..31c46503d2f 100644
--- a/code/FEA/FEA_system.dm
+++ b/code/FEA/FEA_system.dm
@@ -104,6 +104,7 @@ datum
var/current_cycle = 0
var/update_delay = 5 //How long between check should it try to process atmos again.
+ var/failed_ticks = 0 //How many ticks have runtimed?
/* process()
@@ -211,37 +212,53 @@ datum
set background = 1
while(1)
- if(kill_air)
- return 1
- current_cycle++
- if(groups_to_rebuild.len > 0) //If there are groups to rebuild, do so.
- spawn process_rebuild_select_groups()
-
- if(tiles_to_update.len > 0) //If there are tiles to update, do so.
- for(var/turf/simulated/T in tiles_to_update)
- spawn T.update_air_properties()
- tiles_to_update = list()
-
- for(var/datum/air_group/AG in air_groups) //Processing groups
- if(AG) // Because of runtime errors on syphoning.
- spawn AG.process_group()
- for(var/turf/simulated/T in active_singletons) //Processing Singletons
- spawn T.process_cell()
-
- for(var/turf/simulated/hot_potato in active_super_conductivity) //Process superconduction
- spawn hot_potato.super_conduct()
-
- if(high_pressure_delta.len) //Process high pressure delta (airflow)
- for(var/turf/pressurized in high_pressure_delta)
- spawn pressurized.high_pressure_movements()
- high_pressure_delta = list()
-
- if(current_cycle%10==5) //Check for groups of tiles to resume group processing every 10 cycles
- for(var/datum/air_group/AG in air_groups)
- if(AG) // Because of runtime errors on syphoning.
- spawn AG.check_regroup()
+ if(!kill_air)
+ current_cycle++
+ var/success = tick() //Changed so that a runtime does not crash the ticker.
+ if(!success) //Runtimed.
+ failed_ticks++
+ if(failed_ticks > 20)
+ world << "ERROR IN ATMOS TICKER. Killing air simulation!"
+ kill_air = 1
sleep(max(5,update_delay*tick_multiplier))
+ proc/tick()
+ if(groups_to_rebuild.len > 0) //If there are groups to rebuild, do so.
+ spawn process_rebuild_select_groups()
+
+ if(tiles_to_update.len > 0) //If there are tiles to update, do so.
+ for(var/turf/simulated/T in tiles_to_update)
+ spawn T.update_air_properties()
+ tiles_to_update = list()
+
+ for(var/datum/air_group/AG in air_groups) //Processing groups
+ spawn
+ if(AG) // Because of runtime errors on syphoning.
+ AG.process_group()
+
+ for(var/turf/simulated/T in active_singletons) //Processing Singletons
+ spawn
+ if(istype(T))
+ T.process_cell()
+ else
+ active_singletons.Remove(T)
+
+ for(var/turf/simulated/hot_potato in active_super_conductivity) //Process superconduction
+ spawn hot_potato.super_conduct()
+
+ if(high_pressure_delta.len) //Process high pressure delta (airflow)
+ for(var/turf/pressurized in high_pressure_delta)
+ spawn pressurized.high_pressure_movements()
+ high_pressure_delta = list()
+
+ if(current_cycle%10==5) //Check for groups of tiles to resume group processing every 10 cycles
+ for(var/datum/air_group/AG in air_groups)
+ spawn
+ if(AG) // Because of runtime errors on syphoning.
+ AG.check_regroup()
+ return 1
+
+
proc/process_rebuild_select_groups()
//Purpose: This gets called to recalculate and rebuild group geometry
//Called by: process()
diff --git a/code/WorkInProgress/AI_Visibility.dm b/code/WorkInProgress/AI_Visibility.dm
index 79567037892..a51e04b0cd6 100644
--- a/code/WorkInProgress/AI_Visibility.dm
+++ b/code/WorkInProgress/AI_Visibility.dm
@@ -369,9 +369,10 @@ var/datum/cameranet/cameranet = new()
return 0
/mob/living/silicon/ai/switchCamera(var/obj/machinery/camera/C)
- eyeobj.loc = C.loc
- cameranet.visibility(eyeobj)
- return
+ if(C && isturf(C.loc))
+ eyeobj.loc = C.loc
+ cameranet.visibility(eyeobj)
+ return
/mob/living/silicon/ai/attack_ai(var/mob/user as mob)
if (user != src)
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
index d07228e056b..0c6792aeaec 100644
--- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
@@ -4,7 +4,7 @@
voice_name = "tajaran"
icon = 'tajaran.dmi'
icon_state = "m-none"
- var/list/tajspeak_letters
+ var/list/tajspeak_letters = list("~","*","-")
//
universal_speak = 1 //hacky fix until someone can figure out how to make them only understand humans
taj_talk_understand = 1
@@ -12,8 +12,6 @@
examine_text = "one of the cat-like Tajarans."
/mob/living/carbon/human/tajaran/New()
- tajspeak_letters = new/list("~","*","-")
-
var/g = "m"
if (gender == FEMALE)
g = "f"
diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm
index 8ba5ffc8147..33211757e4d 100644
--- a/code/defines/obj/hydro.dm
+++ b/code/defines/obj/hydro.dm
@@ -620,16 +620,16 @@
/obj/item/seeds/harebell
name = "pack of harebell seeds"
desc = "These seeds grow into pretty little flowers."
- icon_state = "seed"
+ icon_state = "seed-harebell"
mypath = "/obj/item/seeds/harebell"
species = "harebell"
plantname = "Harebells"
- productname = ""
+ productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/harebell"
lifespan = 100
endurance = 20
maturation = 7
production = 1
- yield = -1
+ yield = 2
potency = 1
oneharvest = 1
growthstages = 4
@@ -1058,6 +1058,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/poppy
seed = "/obj/item/seeds/poppyseed"
name = "poppy"
+ desc = "Long-used as a symbol of rest, peace, and death."
icon_state = "poppy"
potency = 30
New()
@@ -1066,6 +1067,16 @@
reagents.add_reagent("bicaridine", 1+round((potency / 10), 1))
bitesize = 1+round(reagents.total_volume / 3, 1)
+/obj/item/weapon/reagent_containers/food/snacks/grown/harebell
+ seed = "obj/item/seeds/harebellseed"
+ name = "harebell"
+ desc = "\"I'll sweeten thy sad grave: thou shalt not lack the flower that's like thy face, pale primrose, nor the azured hare-bell, like thy veins; no, nor the leaf of eglantine, whom not to slander, out-sweeten’d not thy breath.\""
+ icon_state = "harebell"
+ potency = 1
+ New()
+ ..()
+ reagents.add_reagent("nutriment", 1+round((potency / 20), 1))
+ bitesize = 1+round(reagents.total_volume / 3, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/potato
seed = "/obj/item/seeds/potatoseed"
diff --git a/code/defines/obj/supplypacks.dm b/code/defines/obj/supplypacks.dm
index d5398de3498..c4a7f02cd53 100755
--- a/code/defines/obj/supplypacks.dm
+++ b/code/defines/obj/supplypacks.dm
@@ -806,7 +806,9 @@
/datum/supply_packs/contraband/New()
var/list/tempContains = list()
- for(var/i = 0,i<5,i++)
+ for(1 to 5)
+ if(!contains || !contains.len)
+ break //Sanity checking.
tempContains += pick(contains)
- src.contains = tempContains
+ contains = tempContains
..()
\ No newline at end of file
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 11572a0abda..17f6e2ce653 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -741,7 +741,7 @@
/obj/item/weapon/extinguisher
name = "fire extinguisher"
- desc = "Contains water for fighting fires."
+ desc = "A traditional red fire extinguisher."
icon = 'items.dmi'
icon_state = "fire_extinguisher0"
var/last_use = 1.0
@@ -760,6 +760,7 @@
name = "fire extinguisher"
desc = "A light and compact fibreglass-framed model fire extinguisher."
icon_state = "miniFE0"
+ hitsound = null //it is much lighter, after all.
flags = FPRINT | USEDELAY | TABLEPASS
throwforce = 5
w_class = 2.0
@@ -1511,6 +1512,7 @@ eternal248: Found broken and buggy Z-levels 7-12, ended up leading to my discove
desc = "You can drill using this item. You dig?"
icon = 'surgery.dmi'
icon_state = "drill"
+ hitsound = 'circsawhit.ogg'
flags = FPRINT | TABLEPASS | CONDUCT
force = 15.0
w_class = 1.0
@@ -1521,6 +1523,7 @@ eternal248: Found broken and buggy Z-levels 7-12, ended up leading to my discove
desc = "For heavy duty cutting."
icon = 'surgery.dmi'
icon_state = "saw3"
+ hitsound = 'circsawhit.ogg'
flags = FPRINT | TABLEPASS | CONDUCT
force = 15.0
w_class = 1.0
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 61d51839b74..0d0bea60a79 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -403,7 +403,7 @@
del(usr)
return
-/*
+
/client/proc/changeling_greater_form() // Oh shit, it's on now.
set category = "Changeling"
@@ -429,7 +429,7 @@
flick("h2monkey", animation)
sleep(48)
//animation = null
- var/mob/living/carbon/human/tajaran/Emissary/O = new /mob/living/carbon/human/tajaran/Emissary( src )
+ var/mob/living/carbon/human/O = new /mob/living/carbon/human( src )//Removed Emissary shit -Sieve{R}
del(animation)
O.real_name = usr.real_name
@@ -495,7 +495,7 @@
new_objective.owner = O.mind
O.mind.objectives += new_objective
- spawn(0)
+/* spawn(0)
while(emergency_shuttle.online == 0)
sleep(10)
command_alert("Authorization codes recieved, confirming hostile entity terminated. The emergancy shuttle is now departing.")
@@ -512,8 +512,8 @@
sleep(10)
if((locate(/mob/living/carbon/human/tajaran/Emissary) in locate(/area/shuttle/escape/centcom)) || (locate(/mob/living/carbon/human/tajaran/Emissary) in locate(/area/centcom/evac)) || (locate(/mob/living/carbon/human/tajaran/Emissary) in locate(/area/centcom/control) ) )
command_alert("What the fu- Shoot it! SHOOT IT! CENTRAL COMMAND TRANSMITTING DIST- *static* Nevermind previous transmission, Nanotrasen. We're all good here. Subject contained. Standing down alert status.")
+Tarjan shit, not recoding this -Sieve{R}*/
-*/
/client/proc/changeling_fakedeath()
set category = "Changeling"
set name = "Regenerative Stasis (20)"
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index d6d692cc9c6..6b50ce914ab 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -41,14 +41,14 @@ var/list/obj/effect/proc_holder/power/powerinstances = list()
verbpath = /client/proc/changeling_lesser_form
-
+/*
/obj/effect/proc_holder/power/changeling_greater_form
name = "Greater Form"
desc = "We become the pinnicle of evolution. We will show the humans what happens when they leave their isle of ignorance."
genomecost = 250
-// verbpath = /client/proc/changeling_greater_form
-
+ verbpath = /client/proc/changeling_greater_form
+*/
/obj/effect/proc_holder/power/fakedeath
name = "Fake Death"
desc = "We fake our death while we heal."
@@ -92,7 +92,7 @@ var/list/obj/effect/proc_holder/power/powerinstances = list()
/obj/effect/proc_holder/power/silence_sting
name = "Silence Sting"
desc = "We silently sting a human, completely silencing them for a short time."
- helptext = "Does not provide a warning to a victim that they've been stung, until they try to speak and can't." // Man, fuck javascript. ' == '
+ helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and can not."
genomecost = 2
allowduringlesserform = 1
@@ -190,7 +190,7 @@ var/list/obj/effect/proc_holder/power/powerinstances = list()
/obj/effect/proc_holder/power/LSDSting
name = "Hallucination Sting"
desc = "We evolve the ability to sting a target with a powerful hallunicationary chemical."
- helptext = "The target does not notice they've been stung. The effect occurs after 30 to 60 seconds."
+ helptext = "The target does not notice they have been stung. The effect occurs after 30 to 60 seconds."
genomecost = 3
verbpath = /client/proc/changeling_lsdsting
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 90233a01222..5fe12567668 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -7,6 +7,7 @@
var/active = 0
var/list/holographic_items = list()
var/damaged = 0
+ var/last_change = 0
attack_ai(var/mob/user as mob)
@@ -233,6 +234,15 @@
/obj/machinery/computer/HolodeckControl/proc/loadProgram(var/area/A)
+ if(world.time < (last_change + 25))
+ if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve
+ return
+ for(var/mob/M in range(3,src))
+ M.show_message("\b ERROR. Recalibrating projetion apparatus.")
+ last_change = world.time
+ return
+
+ last_change = world.time
active = 1
for(var/item in holographic_items)
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 75d80376b85..213ff565467 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -42,20 +42,34 @@
dat += "Close
" //| Update"
if(src.table && (src.table.check_victim()))
src.victim = src.table.victim
- dat += {"
-Patient Information:
-
-Name: [src.victim.real_name]
-Age: [src.victim.age]
-Blood Type: [src.victim.dna.b_type]
-
-Health: [src.victim.health]
-Brute Damage: [src.victim.getBruteLoss()]
-Toxins Damage: [src.victim.getToxLoss()]
-Fire Damage: [src.victim.getFireLoss()]
-Suffocation Damage: [src.victim.getOxyLoss()]
-Patient Status: [src.victim.stat ? "Non-Responsive" : "Stable"]
-"}
+ if(istype(victim))
+ dat += {"
+ Patient Information:
+
+ Name: [src.victim.real_name]
+ Age: [src.victim.age]
+ Blood Type: [(victim.dna? victim.dna.b_type : "ERROR")]
+
+ Health: [src.victim.health]
+ Brute Damage: [src.victim.getBruteLoss()]
+ Toxins Damage: [src.victim.getToxLoss()]
+ Fire Damage: [src.victim.getFireLoss()]
+ Suffocation Damage: [src.victim.getOxyLoss()]
+ Patient Status: [src.victim.stat ? "Non-Responsive" : "Stable"]
+ "}
+ else if(istype(victim, /mob/living))
+ dat += {"
+ Patient Information:
+
+ Name: [src.victim.real_name]
+ Age: [src.victim.age]
+ Health: [src.victim.health]
+ Brute Damage: [src.victim.getBruteLoss()]
+ Toxins Damage: [src.victim.getToxLoss()]
+ Fire Damage: [src.victim.getFireLoss()]
+ Suffocation Damage: [src.victim.getOxyLoss()]
+ Patient Status: [src.victim.stat ? "Non-Responsive" : "Stable"]
+ "}
else
src.victim = null
dat += {"
diff --git a/code/game/objects/closets/extinguisher.dm b/code/game/objects/closets/extinguisher.dm
index 490ae2c8d37..1d503333d7f 100644
--- a/code/game/objects/closets/extinguisher.dm
+++ b/code/game/objects/closets/extinguisher.dm
@@ -1,87 +1,57 @@
-
/obj/structure/closet/extinguisher
- name = "extinguisher closet"
+ name = "extinguisher cabinet"
desc = "A small wall mounted cabinet designed to hold a fire extinguisher."
- icon_state = "extinguisher10"
- icon_opened = "extinguisher11"
- icon_closed = "extinguisher10"
- opened = 1
+ icon = 'closet.dmi'
+ icon_state = "extinguisher_closed"
anchored = 1
density = 0
- var/obj/item/weapon/extinguisher/EXTINGUISHER = new/obj/item/weapon/extinguisher
- var/localopened = 1
+ var/obj/item/weapon/extinguisher/has_extinguisher = new/obj/item/weapon/extinguisher
- open()
+
+
+/obj/structure/closet/extinguisher/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if (isrobot(usr))
return
-
- close()
- return
-
- attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (isrobot(usr))
- return
- if (istype(O, /obj/item/weapon/extinguisher))
- if(!EXTINGUISHER)
- user.drop_item(O)
- src.contents += O
- EXTINGUISHER = O
- user << "\blue You place the extinguisher in the [src.name]."
- else
- localopened = !localopened
+ if (istype(O, /obj/item/weapon/extinguisher))
+ if(!has_extinguisher && opened)
+ user.drop_item(O)
+ src.contents += O
+ has_extinguisher = O
+ user << "\blue You place the extinguisher in the [src.name]."
else
- localopened = !localopened
- update_icon()
-
- attack_hand(mob/user as mob)
- if(localopened)
- if(EXTINGUISHER)
- user.put_in_hand(EXTINGUISHER)
- EXTINGUISHER = null
- user << "\blue You take the extinguisher from the [name]."
- else
- localopened = !localopened
-
- else
- localopened = !localopened
- update_icon()
-
- verb/toggle_openness() //nice name, huh? HUH?!
- set name = "Open/Close"
- set category = "Object"
-
- if (isrobot(usr))
- return
-
- localopened = !localopened
- update_icon()
-
- verb/remove_extinguisher()
- set name = "Remove Extinguisher"
- set category = "Object"
-
- if (isrobot(usr))
- return
-
- if (localopened)
- if(EXTINGUISHER)
- usr.put_in_hand(EXTINGUISHER)
- EXTINGUISHER = null
- usr << "\blue You take the extinguisher from the [name]."
- else
- usr << "\blue The [name] is empty."
- else
- usr << "\blue The [name] is closed."
- update_icon()
-
- attack_paw(mob/user as mob)
- attack_hand(user)
- return
-
- attack_ai(mob/user as mob)
- return
-
+ opened = !opened
+ else
+ opened = !opened
update_icon()
- var/hasextinguisher = 0
- if(EXTINGUISHER)
- hasextinguisher = 1
- icon_state = text("extinguisher[][]",hasextinguisher,src.localopened)
+
+
+
+/obj/structure/closet/extinguisher/attack_hand(mob/user as mob)
+ if(has_extinguisher)
+ user.put_in_hand(has_extinguisher)
+ has_extinguisher = null
+ user << "\blue You take the extinguisher from the [name]."
+ opened = 1
+ else
+ opened = !opened
+ update_icon()
+
+
+
+/obj/structure/closet/extinguisher/attack_paw(mob/user as mob)
+ attack_hand(user)
+ return
+
+
+
+/obj/structure/closet/extinguisher/update_icon()
+ if(!opened)
+ icon_state = "extinguisher_closed"
+ return
+ if(has_extinguisher)
+ if(istype(has_extinguisher, /obj/item/weapon/extinguisher/mini))
+ icon_state = "extinguisher_mini"
+ else
+ icon_state = "extinguisher_full"
+ else
+ icon_state = "extinguisher_empty"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/medical.dm b/code/game/objects/items/weapons/medical.dm
index 8755deddf0f..ef8a6b52f08 100644
--- a/code/game/objects/items/weapons/medical.dm
+++ b/code/game/objects/items/weapons/medical.dm
@@ -27,18 +27,17 @@ MEDICAL
return 1
var/stoppedblood = 0
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/datum/organ/external/affecting = H.get_organ("chest")
+ if(hasorgans(M))
+ var/datum/organ/external/affecting = M:get_organ("chest")
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/user2 = user
- affecting = H.get_organ(check_zone(user2.zone_sel.selecting))
+ affecting = M:get_organ(check_zone(user2.zone_sel.selecting))
else
if(!istype(affecting, /datum/organ/external) || affecting:burn_dam <= 0)
- affecting = H.get_organ("head")
+ affecting = M:get_organ("head")
if(affecting.destroyed && !affecting.gauzed)
- user.visible_message("\red You do your best to stop the bleeding from [H]'s stump.", "\red [user] does [user.gender == MALE? "his" : "her"] best to stem [H]'s bleeding from [H.gender == MALE? "his" : "her"] stump.", "\red You hear something like gauze being ripped.")
+ user.visible_message("\red You do your best to stop the bleeding from [M]'s stump.", "\red [user] does [user.gender == MALE? "his" : "her"] best to stem [M]'s bleeding from [M.gender == MALE? "his" : "her"] stump.", "\red You hear something like gauze being ripped.")
affecting.gauzed = 1
use(1)
return
@@ -69,7 +68,7 @@ MEDICAL
if (user && stoppedblood)
if (M != user)
- user.visible_message("\red [user] [heal_burn? "salves" : "bandages"] [stoppedblood - 1 ? "some of" : "the last of"] [H]'s cuts with [src].", "\red You [heal_burn? "salve" : "bandage up"] [stoppedblood - 1 ? "some of" : "the last of"] [H]'s [heal_burn? "burns" : "wounds"].", "\red You hear something like gauze being ripped.")
+ user.visible_message("\red [user] [heal_burn? "salves" : "bandages"] [stoppedblood - 1 ? "some of" : "the last of"] [M]'s cuts with [src].", "\red You [heal_burn? "salve" : "bandage up"] [stoppedblood - 1 ? "some of" : "the last of"] [M]'s [heal_burn? "burns" : "wounds"].", "\red You hear something like gauze being ripped.")
else
user.visible_message("\red [user] [heal_burn? "salves" : "bandages"] [stoppedblood - 1 ? "some of" : "the last of"] [user.gender == MALE? "his" : "her"] own cuts with [src].", "\red You [heal_burn? "salve" : "bandage up"] [stoppedblood - 1 ? "some of" : "the last of"] your [heal_burn? "burns" : "wounds"].", "\red You hear something like gauze being ripped.")
else if(user)
@@ -146,18 +145,17 @@ MEDICAL
return 1
var/stoppedblood = 0
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- var/datum/organ/external/affecting = H.get_organ("chest")
+ if(hasorgans(M))
+ var/datum/organ/external/affecting = M:get_organ("chest")
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/user2 = user
- affecting = H.get_organ(check_zone(user2.zone_sel.selecting))
+ affecting = M:get_organ(check_zone(user2.zone_sel.selecting))
else
if(!istype(affecting, /datum/organ/external) || affecting:burn_dam <= 0)
- affecting = H.get_organ("head")
+ affecting = M:get_organ("head")
if(affecting.destroyed && !affecting.gauzed)
- H.visible_message("\red You do your best to stop the bleeding from [H]'s stump.", "\red [user] does their best to stem [H]'s bleeding from [H.gender == MALE? "his" : "her"] stump.", "\red You hear something like gauze being ripped.")
+ M.visible_message("\red You do your best to stop the bleeding from [M]'s stump.", "\red [user] does their best to stem [M]'s bleeding from [M.gender == MALE? "his" : "her"] stump.", "\red You hear something like gauze being ripped.")
affecting.gauzed = 1
use(1)
return
@@ -179,7 +177,7 @@ MEDICAL
if (user && stoppedblood)
if (M != user)
- user.visible_message("\red [user] [heal_burn? "salves" : "bandages"] [stoppedblood - 1 ? "some of" : "the last of"] [H]'s cuts with [src].", "\red You [heal_burn? "salve" : "bandage up"] [stoppedblood - 1 ? "some of" : "the last of"] [H]'s [heal_burn? "burns" : "wounds"].", "\red You hear something like gauze being ripped.")
+ user.visible_message("\red [user] [heal_burn? "salves" : "bandages"] [stoppedblood - 1 ? "some of" : "the last of"] [M]'s cuts with [src].", "\red You [heal_burn? "salve" : "bandage up"] [stoppedblood - 1 ? "some of" : "the last of"] [M]'s [heal_burn? "burns" : "wounds"].", "\red You hear something like gauze being ripped.")
else
user.visible_message("\red [user] [heal_burn? "salves" : "bandages"] [stoppedblood - 1 ? "some of" : "the last of"] [user.gender == MALE? "his" : "her"] own cuts with [src].", "\red You [heal_burn? "salve" : "bandage up"] [stoppedblood - 1 ? "some of" : "the last of"] your [heal_burn? "burns" : "wounds"].", "\red You hear something like gauze being ripped.")
else if(user)
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index ba6fd257718..3e6b14ee0c5 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -263,6 +263,9 @@ WELDINGTOOOL
attack(mob/M as mob, mob/user as mob)
if(hasorgans(M))
var/datum/organ/external/S = M:organs[user.zone_sel.selecting]
+ if(S)
+ message_admins("It appears [M] has \"null\" where there should be a [user.zone_sel.selecting]. Check into this, and tell SkyMarshal: \"[M.type]\"")
+ return ..()
if(!S.robot || user.a_intent != "help")
return ..()
if(S.brute_dam)
diff --git a/code/game/objects/object_procs.dm b/code/game/objects/object_procs.dm
index 7e230546fcf..f57f6ce93a7 100644
--- a/code/game/objects/object_procs.dm
+++ b/code/game/objects/object_procs.dm
@@ -9,7 +9,7 @@
src.attack_ai(usr)
// check for TK users
- AutoUpdateTK(src)
+ //AutoUpdateTK(src)
if (istype(usr, /mob/living/carbon/human))
if(istype(usr.l_hand, /obj/item/tk_grab) || istype(usr.r_hand, /obj/item/tk_grab/))
if(!(usr in nearby))
diff --git a/code/game/objects/stacks/glass.dm b/code/game/objects/stacks/glass.dm
index 90733aec8aa..f70c1e50b57 100644
--- a/code/game/objects/stacks/glass.dm
+++ b/code/game/objects/stacks/glass.dm
@@ -83,6 +83,9 @@ SHARDS
if("full (2 sheets)")
if(!src) return 1
if(src.loc != user) return 1
+ if(src.amount < 2)
+ user << "\red You need more glass to do that."
+ return 1
if(locate(/obj/structure/window) in user.loc)
user << "\red There is a window in the way."
return 1
@@ -142,6 +145,9 @@ SHARDS
if("full (2 sheets)")
if(!src) return 1
if(src.loc != user) return 1
+ if(src.amount < 2)
+ user << "\red You need more glass to do that."
+ return 1
if(locate(/obj/structure/window) in user.loc)
user << "\red There is a window in the way."
return 1
diff --git a/code/game/topic.dm b/code/game/topic.dm
index c1827cdffd3..ba0a70af30f 100644
--- a/code/game/topic.dm
+++ b/code/game/topic.dm
@@ -11,8 +11,6 @@
s["ai"] = config.allow_ai
s["host"] = host ? host : null
s["players"] = list()
- s["admins"] = 0
- var/admins = 0
var/n = 0
for(var/client/C)
@@ -30,6 +28,5 @@
s["end"] = "#end"
// 7 + s["players"] + 1 = index of s["revinfo"]
- s["admins"] = admins
return list2params(s)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 7574cfc2270..0a76b274e8f 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -210,6 +210,7 @@
verbs += /obj/admins/proc/adspawn //toggle admin item spawning
verbs += /client/proc/debug_variables
verbs += /client/proc/cmd_modify_ticker_variables
+ verbs += /client/proc/cmd_modify_ref_variables
verbs += /client/proc/Debug2 //debug toggle switch
verbs += /client/proc/toggle_view_range
verbs += /client/proc/Getmob
@@ -432,6 +433,7 @@
verbs -= /client/proc/radioalert
verbs -= /client/proc/rnd_check_designs
verbs -= /client/proc/CarbonCopy
+ verbs -= /client/proc/cmd_modify_ref_variables
verbs -= /proc/possess
verbs -= /proc/release
//verbs -= /client/proc/give_spell --Merged with view variables
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index 51242323fa4..be02856640a 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -11,6 +11,17 @@ var/list/forbidden_varedit_object_types = list(
src.modify_variables(O)
//feedback_add_details("admin_verb","EDITV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/proc/cmd_modify_ref_variables(var/target as text)
+ set category = "Debug"
+ set name = "Edit Variables (Reference)"
+ set desc="(target) Edit a target item's variables"
+ var/obj/I = locate(target)
+ if(!I)
+ usr << "ERROR: Object could not be located!"
+ return
+ src.modify_variables(I)
+ //feedback_add_details("admin_verb","EDITV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
/client/proc/cmd_modify_ticker_variables()
set category = "Debug"
set name = "Edit Ticker Variables"
diff --git a/code/modules/clothing/head/hats.dm b/code/modules/clothing/head/hats.dm
index a48187d97bd..ca94d809f95 100644
--- a/code/modules/clothing/head/hats.dm
+++ b/code/modules/clothing/head/hats.dm
@@ -116,6 +116,7 @@
item_state = "syndicate"
see_face = 0.0
flags = FPRINT | TABLEPASS | BLOCKHAIR
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
/obj/item/clothing/head/chaplain_hood
name = "chaplain's hood"
@@ -142,4 +143,5 @@
item_state = "cardborg_h"
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH
see_face = 0.0
+ armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
diff --git a/code/modules/clothing/head/helmets.dm b/code/modules/clothing/head/helmets.dm
index 4be85149b23..12621b0addc 100644
--- a/code/modules/clothing/head/helmets.dm
+++ b/code/modules/clothing/head/helmets.dm
@@ -32,8 +32,6 @@
item_state = "thunderdome"
armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0)
-
-
/obj/item/clothing/head/helmet/welding
name = "welding helmet"
desc = "A head-mounted face cover designed to protect the wearer completely from space-arc eye."
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index a2f976ea90e..b732e4269bc 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -15,14 +15,14 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
-
-
/obj/item/clothing/suit/bluetag
name = "blue laser tag armour"
desc = "Blue Pride, Station Wide"
icon_state = "bluetag"
item_state = "bluetag"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ allowed = list (/obj/item/weapon/gun/energy/laser/bluetag)
+
/obj/item/clothing/suit/redtag
name = "red laser tag armour"
@@ -30,6 +30,7 @@
icon_state = "redtag"
item_state = "redtag"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ allowed = list (/obj/item/weapon/gun/energy/laser/redtag)
/obj/item/clothing/suit/storage/apron
diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm
index bc0d6ac5c77..5d992667129 100644
--- a/code/modules/mob/organ/organ.dm
+++ b/code/modules/mob/organ/organ.dm
@@ -477,28 +477,21 @@
proc/start_close()
if(parent.robot)
return
- sleep(rand(1800,3000)) //3-5 minutes
- if(prob(50) && wound_size == 1)
- parent.wounds.Remove(src)
- update_health(1)
- del(src)
- else if(prob(33) && wound_size < 3)
- stopbleeding()
- return
- sleep(rand(1800,3000))
- if(wound_size == 1) //Small cuts heal in 6-10 minutes.
- parent.wounds.Remove(src)
- update_health(1)
- del(src)
- else if(prob(50) && wound_size < 5 && bleeding)
- stopbleeding()
- return
- if(wound_size < 5 && bleeding) //Give it a chance to stop bleeding on it's own.
- spawn while(1)
- sleep(1200)
- if(prob(50))
- stopbleeding()
- return
+ spawn(rand(1800,3000)) //3-5 minutes
+ if(prob(50) && wound_size == 1)
+ parent.wounds.Remove(src)
+ update_health(1)
+ del(src)
+ else if(prob(33) && wound_size < 3)
+ stopbleeding()
+ else
+ spawn(rand(1800,3000))
+ if(wound_size == 1) //Small cuts heal in 6-10 minutes.
+ parent.wounds.Remove(src)
+ update_health(1)
+ del(src)
+ else if(prob(50) && wound_size < 3 && bleeding)
+ stopbleeding()
return
proc/stopbleeding(var/bleed = 0)
@@ -518,60 +511,60 @@
return 1
proc/become_scar()
- if(parent.robot)
+ if(parent.robot || healing_state)
return
healing_state = 1 //Patched
spawn(200*slowheal) //~20-60 seconds
update_health(5) //Heals some.
- sleep(rand(1800,3000)*slowheal) //3-5 minutes
-
- if(!parent || !parent.owner || parent.owner.stat == 2)
- if(!parent || !parent.owner)
- del(parent)
+ spawn(rand(180,300)*slowheal) //18-30 second
+ if(!parent || !parent.owner || parent.owner.stat == 2)
+ if(!parent || !parent.owner)
+ del(parent)
+ del(src)
+ return
+ if(prob(80) && wound_size < 2) //Small cuts heal.
+ update_health(1)
+ parent.wounds.Remove(src)
del(src)
- return
- if(prob(80) && wound_size < 2) //Small cuts heal.
- update_health(1)
- parent.wounds.Remove(src)
- del(src)
- healing_state = 2 //Noticibly healing.
- update_health(2) //Heals more.
+ healing_state = 2 //Noticibly healing.
+ update_health(2) //Heals more.
- sleep(rand(1800,3000)*slowheal) //3-5 minutes
- if(!parent || !parent.owner || parent.owner.stat == 2)
- if(!parent || !parent.owner)
- del(parent)
- del(src)
- return
- if(prob(60) && wound_size < 3) //Cuts heal up
- parent.wounds.Remove(src)
- del(src)
- healing_state = 3 //Angry red scar
- update_health(1) //Heals the rest of the way.
+ spawn(rand(1200,1800)*slowheal) //2-3 minutes
+ if(!parent || !parent.owner || parent.owner.stat == 2)
+ if(!parent || !parent.owner)
+ del(parent)
+ del(src)
+ return
+ if(prob(60) && wound_size < 3) //Cuts heal up
+ parent.wounds.Remove(src)
+ del(src)
+ healing_state = 3 //Angry red scar
+ update_health(1) //Heals the rest of the way.
- sleep(rand(6000,9000)*slowheal) //10-15 minutes
- if(!parent || !parent.owner || parent.owner.stat == 2)
- if(!parent || !parent.owner)
- del(parent)
- del(src)
- return
- if(prob(80) && wound_size < 4) //Minor wounds heal up fully.
- parent.wounds.Remove(src)
- del(src)
- healing_state = 4 //Scar
- sleep(rand(6000,9000)*slowheal) //10-15 minutes
- if(!parent || !parent.owner || parent.owner.stat == 2)
- if(!parent || !parent.owner)
- del(parent)
- del(src)
- return
- if(prob(30) || wound_size < 4 || wound_type == 1) //Small chance for the scar to disappear, any small remaining wounds deleted.
- parent.wounds.Remove(src)
- del(src)
- healing_state = 5 //Faded scar
+ spawn(rand(6000,9000)*slowheal) //10-15 minutes
+ if(!parent || !parent.owner || parent.owner.stat == 2)
+ if(!parent || !parent.owner)
+ del(parent)
+ del(src)
+ return
+ if(prob(80) && wound_size < 4) //Minor wounds heal up fully.
+ parent.wounds.Remove(src)
+ del(src)
+ healing_state = 4 //Scar.
+
+ spawn(rand(6000,9000)*slowheal) //10-15 minutes
+ if(!parent || !parent.owner || parent.owner.stat == 2)
+ if(!parent || !parent.owner)
+ del(parent)
+ del(src)
+ return
+ if(prob(30) || wound_size < 4 || wound_type == 1) //Small chance for the scar to disappear, any small remaining wounds deleted.
+ parent.wounds.Remove(src)
+ del(src)
+ healing_state = 5 //Faded scar
return
proc/update_health(var/percent = 1)
@@ -584,6 +577,9 @@
parent.brute_dam = max(parent.brute_dam - (initial_dmg - damage),0)
initial_dmg = damage //reset it for further updates.
parent.owner.updatehealth()
+ if(percent == 1 && wound_type == 1)
+ parent.wounds.Remove(src)
+ del(src)
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 2233b41d551..0d0e31ab8f1 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -86,6 +86,8 @@ obj/item/weapon/gun/energy/laser/retro
icon_state = "bluetag"
desc = "Standard issue weapon of the Imperial Guard"
projectile_type = "/obj/item/projectile/bluetag"
+ origin_tech = "combat=1;magnets=2"
+ var/charge_tick = 0
special_check(var/mob/living/carbon/human/M)
if(ishuman(M))
@@ -93,8 +95,6 @@ obj/item/weapon/gun/energy/laser/retro
return 1
M << "\red You need to be wearing your laser tag vest!"
return 0
- var/charge_tick = 0
-
New()
..()
@@ -122,6 +122,7 @@ obj/item/weapon/gun/energy/laser/retro
icon_state = "redtag"
desc = "Standard issue weapon of the Imperial Guard"
projectile_type = "/obj/item/projectile/redtag"
+ origin_tech = "combat=1;magnets=2"
var/charge_tick = 0
special_check(var/mob/living/carbon/human/M)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 3738a409210..9e223da1b16 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -173,6 +173,8 @@
fired()
var/turf/curloc = get_turf(src)
var/turf/targloc = get_turf(target)
+ if(!curloc || !targloc)
+ return 0
yo = targloc.y - curloc.y
xo = targloc.x - curloc.x
target = targloc
diff --git a/config/README feedback.txt b/config/README feedback.txt
new file mode 100644
index 00000000000..00c504e2e45
--- /dev/null
+++ b/config/README feedback.txt
@@ -0,0 +1,30 @@
+Create a databse at the same location where the server MySQL databse is. (as defined in config/dbconfig.txt under ADDRESS and PORT) It can be a separate database or the same one, as you wish. Create the following table in it: (name needs to remain as 'erro_feedback')
+
+
+CREATE TABLE IF NOT EXISTS `erro_feedback` (
+
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+
+ `time` datetime NOT NULL,
+
+ `round_id` int(8) NOT NULL,
+
+ `var_name` varchar(32) NOT NULL,
+
+ `var_value` int(16) DEFAULT NULL,
+
+ `details` text,
+
+ PRIMARY KEY (`id`)
+
+);
+
+
+
+Open the file config/dbconfig.txt and edit the following lines:
+
+FEEDBACK_DATABASE test
+
+FEEDBACK_LOGIN mylogin
+
+FEEDBACK_PASSWORD mypassword
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index 751894234fa..1448218d8a1 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -47,6 +47,17 @@ Stuff which is in development and not yet visible to players or just code relate
should be listed in the changelog upon commit though. Thanks. -->
+