Merge resolution, master into dev.

This commit is contained in:
Zuhayr
2014-08-21 12:01:38 +09:30
680 changed files with 3896 additions and 3904 deletions

View File

@@ -548,6 +548,7 @@
#include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RCD.dm"
#include "code\game\objects\items\weapons\RSF.dm" #include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scrolls.dm" #include "code\game\objects\items\weapons\scrolls.dm"
#include "code\game\objects\items\weapons\shards.dm"
#include "code\game\objects\items\weapons\shields.dm" #include "code\game\objects\items\weapons\shields.dm"
#include "code\game\objects\items\weapons\stunbaton.dm" #include "code\game\objects\items\weapons\stunbaton.dm"
#include "code\game\objects\items\weapons\surgery_tools.dm" #include "code\game\objects\items\weapons\surgery_tools.dm"

View File

@@ -34,13 +34,15 @@
user << "\blue The tank scoffs at your insolence. It only provides services to welders." user << "\blue The tank scoffs at your insolence. It only provides services to welders."
return return
/obj/item/weapon/weldpack/afterattack(obj/O as obj, mob/user as mob) /obj/item/weapon/weldpack/afterattack(obj/O as obj, mob/user as mob, proximity)
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.reagents.total_volume < max_fuel) if(!proximity) // this replaces and improves the get_dist(src,O) <= 1 checks used previously
return
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && src.reagents.total_volume < max_fuel)
O.reagents.trans_to(src, max_fuel) O.reagents.trans_to(src, max_fuel)
user << "\blue You crack the cap off the top of the pack and fill it back up again from the tank." user << "\blue You crack the cap off the top of the pack and fill it back up again from the tank."
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
return return
else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.reagents.total_volume == max_fuel) else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && src.reagents.total_volume == max_fuel)
user << "\blue The pack is already full!" user << "\blue The pack is already full!"
return return

View File

@@ -47,7 +47,7 @@
log += "<td width='20%'>[life_status] [damage_report]</td><td width='40%'>Not Available</td></tr>" log += "<td width='20%'>[life_status] [damage_report]</td><td width='40%'>Not Available</td></tr>"
if(3) if(3)
var/area/player_area = get_area(H) var/area/player_area = get_area(H)
log += "<td width='20%'>[life_status] [damage_report]</td><td width='40%'>[player_area.name] ([pos.x], [pos.y])</td></tr>" log += "<td width='20%'>[life_status] [damage_report]</td><td width='40%'>[sanitize(player_area.name)] ([pos.x], [pos.y])</td></tr>"
logs += log logs += log
logs = sortList(logs) logs = sortList(logs)
for(var/log in logs) for(var/log in logs)

View File

@@ -55,15 +55,20 @@
del src del src
return return
if(!stored_computer.manipulating)
stored_computer.manipulating = 1
stored_computer.loc = loc
stored_computer.stat &= ~MAINT
stored_computer.update_icon()
loc = null
usr << "You open \the [src]."
stored_computer.loc = loc spawn(5)
stored_computer.stat &= ~MAINT stored_computer.manipulating = 0
stored_computer.update_icon() del src
loc = null else
usr << "You open \the [src]." usr << "\red You are already opening the computer!"
spawn(5)
del src
AltClick() AltClick()
if(Adjacent(usr)) if(Adjacent(usr))
@@ -112,6 +117,7 @@
pixel_y = -3 pixel_y = -3
show_keyboard = 0 show_keyboard = 0
var/manipulating = 0 // To prevent disappearing bug
var/obj/item/device/laptop/portable = null var/obj/item/device/laptop/portable = null
New(var/L, var/built = 0) New(var/L, var/built = 0)
@@ -147,10 +153,11 @@
portable=new portable=new
portable.stored_computer = src portable.stored_computer = src
portable.loc = loc if(!manipulating)
loc = portable portable.loc = loc
stat |= MAINT loc = portable
usr << "You close \the [src]." stat |= MAINT
usr << "You close \the [src]."
auto_use_power() auto_use_power()
if(stat&MAINT) if(stat&MAINT)

View File

@@ -15,9 +15,8 @@
// Run all strings to be used in an SQL query through this proc first to properly escape out injection attempts. // Run all strings to be used in an SQL query through this proc first to properly escape out injection attempts.
/proc/sanitizeSQL(var/t as text) /proc/sanitizeSQL(var/t as text)
var/sanitized_text = replacetext(t, "'", "\\'") var/sqltext = dbcon.Quote(t);
sanitized_text = replacetext(sanitized_text, "\"", "\\\"") return copytext(sqltext, 2, lentext(sqltext)-1);//Quote() adds quotes around input, we already do that
return sanitized_text
/* /*
* Text sanitization * Text sanitization

View File

@@ -214,29 +214,6 @@
flags = FPRINT | TABLEPASS| CONDUCT flags = FPRINT | TABLEPASS| CONDUCT
matter = list("metal" = 3750) matter = list("metal" = 3750)
/obj/item/weapon/shard
name = "shard"
icon = 'icons/obj/shards.dmi'
icon_state = "large"
sharp = 1
edge = 1
desc = "Could probably be used as ... a throwing weapon?"
w_class = 2.0
force = 5.0
throwforce = 8.0
item_state = "shard-glass"
matter = list("glass" = 3750)
attack_verb = list("stabbed", "slashed", "sliced", "cut")
suicide_act(mob/user)
viewers(user) << pick("\red <b>[user] is slitting \his wrists with the shard of glass! It looks like \he's trying to commit suicide.</b>", \
"\red <b>[user] is slitting \his throat with the shard of glass! It looks like \he's trying to commit suicide.</b>")
return (BRUTELOSS)
/obj/item/weapon/shard/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
/*/obj/item/weapon/syndicate_uplink /*/obj/item/weapon/syndicate_uplink
name = "station bounced radio" name = "station bounced radio"
desc = "Remain silent about this..." desc = "Remain silent about this..."
@@ -256,28 +233,6 @@
matter = list("metal" = 100 matter = list("metal" = 100
origin_tech = "magnets=2;syndicate=3"*/ origin_tech = "magnets=2;syndicate=3"*/
/obj/item/weapon/shard/shrapnel
name = "shrapnel"
icon = 'icons/obj/shards.dmi'
icon_state = "shrapnellarge"
desc = "A bunch of tiny bits of shattered metal."
/obj/item/weapon/shard/shrapnel/New()
src.icon_state = pick("shrapnellarge", "shrapnelmedium", "shrapnelsmall")
switch(src.icon_state)
if("shrapnelsmall")
src.pixel_x = rand(-12, 12)
src.pixel_y = rand(-12, 12)
if("shrapnelmedium")
src.pixel_x = rand(-8, 8)
src.pixel_y = rand(-8, 8)
if("shrapnellarge")
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
else
return
/obj/item/weapon/SWF_uplink /obj/item/weapon/SWF_uplink
name = "station-bounced radio" name = "station-bounced radio"
desc = "used to comunicate it appears." desc = "used to comunicate it appears."

View File

@@ -20,7 +20,7 @@
/datum/game_mode/cult /datum/game_mode/cult
name = "cult" name = "cult"
config_tag = "cult" config_tag = "cult"
restricted_jobs = list("Chaplain","AI", "Cyborg", "Lawyer", "Head of Security", "Captain") restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Head of Security", "Captain")
protected_jobs = list("Security Officer", "Warden", "Detective") protected_jobs = list("Security Officer", "Warden", "Detective")
required_players = 5 required_players = 5
required_players_secret = 15 required_players_secret = 15

View File

@@ -14,7 +14,7 @@
/datum/game_mode/revolution /datum/game_mode/revolution
name = "revolution" name = "revolution"
config_tag = "revolution" config_tag = "revolution"
restricted_jobs = list("Lawyer", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") restricted_jobs = list("Internal Affairs Agent", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
protected_jobs = list("Security Officer", "Warden", "Detective") protected_jobs = list("Security Officer", "Warden", "Detective")
required_players = 4 required_players = 4
required_players_secret = 15 required_players_secret = 15

View File

@@ -6,7 +6,7 @@
name = "traitor" name = "traitor"
config_tag = "traitor" config_tag = "traitor"
restricted_jobs = list("Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances restricted_jobs = list("Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain")//AI", Currently out of the list as malf does not work for shit protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Captain")//AI", Currently out of the list as malf does not work for shit
required_players = 0 required_players = 0
required_enemies = 1 required_enemies = 1
recommended_enemies = 4 recommended_enemies = 4

View File

@@ -17,7 +17,7 @@
access_tox_storage, access_teleporter, access_sec_doors, access_tox_storage, access_teleporter, access_sec_doors,
access_research, access_robotics, access_xenobiology, access_ai_upload, access_research, access_robotics, access_xenobiology, access_ai_upload,
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch) access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch)
minimal_player_age = 7 minimal_player_age = 14
equip(var/mob/living/carbon/human/H) equip(var/mob/living/carbon/human/H)
if(!H) return 0 if(!H) return 0
@@ -50,6 +50,8 @@
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch) minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Xenobotanist") alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Xenobotanist")
minimal_player_age = 14
equip(var/mob/living/carbon/human/H) equip(var/mob/living/carbon/human/H)
if(!H) return 0 if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
@@ -79,6 +81,8 @@
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology) access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology)
minimal_access = list(access_research, access_xenobiology) minimal_access = list(access_research, access_xenobiology)
minimal_player_age = 14
equip(var/mob/living/carbon/human/H) equip(var/mob/living/carbon/human/H)
if(!H) return 0 if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
@@ -108,6 +112,8 @@
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access. minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
alt_titles = list("Biomechanical Engineer","Mechatronic Engineer") alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")
minimal_player_age = 7
equip(var/mob/living/carbon/human/H) equip(var/mob/living/carbon/human/H)
if(!H) return 0 if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)

View File

@@ -325,7 +325,8 @@ var/global/list/frozen_items = list()
time_entered = world.time time_entered = world.time
// Book keeping! // Book keeping!
log_admin("[key_name_admin(M)] has entered a stasis pod.") var/turf/location = get_turf(src)
log_admin("[key_name_admin(M)] has entered a stasis pod. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
message_admins("\blue [key_name_admin(M)] has entered a stasis pod.") message_admins("\blue [key_name_admin(M)] has entered a stasis pod.")
//Despawning occurs when process() is called with an occupant without a client. //Despawning occurs when process() is called with an occupant without a client.

View File

@@ -532,23 +532,26 @@ About the new airlock wires panel:
return ((src.wires & wireFlag) == 0) return ((src.wires & wireFlag) == 0)
/obj/machinery/door/airlock/proc/canAIControl() /obj/machinery/door/airlock/proc/canAIControl()
return ((src.aiControlDisabled!=1) && (!src.isAllPowerCut())); return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss()));
/obj/machinery/door/airlock/proc/canAIHack(var/user as mob) /obj/machinery/door/airlock/proc/canAIHack()
return (isAI(user) && src.aiControlDisabled==1 && !hackProof && !src.isAllPowerCut()); return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerLoss()));
/obj/machinery/door/airlock/proc/arePowerSystemsOn() /obj/machinery/door/airlock/proc/arePowerSystemsOn()
if (stat & NOPOWER)
return 0
return (src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0) return (src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0)
/obj/machinery/door/airlock/requiresID() /obj/machinery/door/airlock/requiresID()
return !(src.isWireCut(AIRLOCK_WIRE_IDSCAN) || aiDisabledIdScanner) return !(src.isWireCut(AIRLOCK_WIRE_IDSCAN) || aiDisabledIdScanner)
/obj/machinery/door/airlock/proc/isAllPowerCut() /obj/machinery/door/airlock/proc/isAllPowerLoss()
var/retval=0 if(stat & NOPOWER)
return 1
if(src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1) || src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2)) if(src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1) || src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2))
if(src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER1) || src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER2)) if(src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER1) || src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER2))
retval=1 return 1
return retval return 0
/obj/machinery/door/airlock/proc/regainMainPower() /obj/machinery/door/airlock/proc/regainMainPower()
if(src.secondsMainPowerLost > 0) if(src.secondsMainPowerLost > 0)
@@ -639,9 +642,11 @@ About the new airlock wires panel:
else else
flick("door_closing", src) flick("door_closing", src)
if("spark") if("spark")
flick("door_spark", src) if(density)
flick("door_spark", src)
if("deny") if("deny")
flick("door_deny", src) if(density)
flick("door_deny", src)
return return
/obj/machinery/door/airlock/attack_ai(mob/user as mob) /obj/machinery/door/airlock/attack_ai(mob/user as mob)
@@ -868,7 +873,7 @@ About the new airlock wires panel:
t1 += "<a href='?src=\ref[src];signaler=[wires[wiredesc]]'>Attach signaler</a>" t1 += "<a href='?src=\ref[src];signaler=[wires[wiredesc]]'>Attach signaler</a>"
t1 += "<br>" t1 += "<br>"
t1 += text("<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]", (src.locked ? "The door bolts have fallen!" : "The door bolts look up."), (src.lights ? "The door bolt lights are on." : "The door bolt lights are off!"), ((src.arePowerSystemsOn() && !(stat & NOPOWER)) ? "The test light is on." : "The test light is off!"), (src.aiControlDisabled==0 ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."), (src.safe==0 ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."), (src.normalspeed==0 ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off.")) t1 += text("<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]", (src.locked ? "The door bolts have fallen!" : "The door bolts look up."), (src.lights ? "The door bolt lights are on." : "The door bolt lights are off!"), ((src.arePowerSystemsOn()) ? "The test light is on." : "The test light is off!"), (src.aiControlDisabled==0 ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."), (src.safe==0 ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."), (src.normalspeed==0 ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."))
t1 += text("<p><a href='?src=\ref[];close=1'>Close</a></p>\n", src) t1 += text("<p><a href='?src=\ref[];close=1'>Close</a></p>\n", src)
@@ -1171,7 +1176,7 @@ About the new airlock wires panel:
beingcrowbarred = 1 //derp, Agouri beingcrowbarred = 1 //derp, Agouri
else else
beingcrowbarred = 0 beingcrowbarred = 0
if( beingcrowbarred && (operating == -1 || density && welded && operating != 1 && src.p_open && (!src.arePowerSystemsOn() || stat & NOPOWER) && !src.locked) ) if( beingcrowbarred && src.p_open && (operating == -1 || (density && welded && operating != 1 && !src.arePowerSystemsOn() && !src.locked)) )
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
if(do_after(user,40)) if(do_after(user,40))
@@ -1211,7 +1216,7 @@ About the new airlock wires panel:
del(src) del(src)
return return
else if(arePowerSystemsOn() && !(stat & NOPOWER)) else if(arePowerSystemsOn())
user << "\blue The airlock's motors resist your efforts to force it." user << "\blue The airlock's motors resist your efforts to force it."
else if(locked) else if(locked)
user << "\blue The airlock's bolts prevent it from being forced." user << "\blue The airlock's bolts prevent it from being forced."
@@ -1248,7 +1253,7 @@ About the new airlock wires panel:
if( operating || welded || locked ) if( operating || welded || locked )
return 0 return 0
if(!forced) if(!forced)
if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) ) if( !arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) )
return 0 return 0
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
if(istype(src, /obj/machinery/door/airlock/glass)) if(istype(src, /obj/machinery/door/airlock/glass))
@@ -1263,7 +1268,7 @@ About the new airlock wires panel:
if(operating || welded || locked) if(operating || welded || locked)
return return
if(!forced) if(!forced)
if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS) ) if( !arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS) )
return return
if(safe) if(safe)
for(var/turf/turf in locs) for(var/turf/turf in locs)
@@ -1305,7 +1310,7 @@ About the new airlock wires panel:
return return
/obj/machinery/door/airlock/proc/lock(var/forced=0) /obj/machinery/door/airlock/proc/lock(var/forced=0)
if (src.locked) return if (operating || src.locked) return
src.locked = 1 src.locked = 1
for(var/mob/M in range(1,src)) for(var/mob/M in range(1,src))
@@ -1313,9 +1318,9 @@ About the new airlock wires panel:
update_icon() update_icon()
/obj/machinery/door/airlock/proc/unlock(var/forced=0) /obj/machinery/door/airlock/proc/unlock(var/forced=0)
if (!src.locked) return 0 if (operating || !src.locked) return
if(forced || src.arePowerSystemsOn()) //only can raise bolts if power's on if (forced || (src.arePowerSystemsOn())) //only can raise bolts if power's on
src.locked = 0 src.locked = 0
for(var/mob/M in range(1,src)) for(var/mob/M in range(1,src))
M.show_message("You hear a click from the bottom of the door.", 2) M.show_message("You hear a click from the bottom of the door.", 2)

View File

@@ -9,16 +9,19 @@ obj/machinery/door/airlock
var/cur_command = null //the command the door is currently attempting to complete var/cur_command = null //the command the door is currently attempting to complete
obj/machinery/door/airlock/proc/can_radio() obj/machinery/door/airlock/proc/can_radio()
if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_AI_CONTROL) ) if(!arePowerSystemsOn())
return 0 return 0
return 1 return 1
obj/machinery/door/airlock/process() obj/machinery/door/airlock/process()
..() ..()
execute_current_command() if (arePowerSystemsOn())
execute_current_command()
obj/machinery/door/airlock/receive_signal(datum/signal/signal) obj/machinery/door/airlock/receive_signal(datum/signal/signal)
if (!can_radio()) return if (!arePowerSystemsOn()) return //no power
if (!can_radio()) return //no radio
if(!signal || signal.encryption) return if(!signal || signal.encryption) return
@@ -28,6 +31,9 @@ obj/machinery/door/airlock/receive_signal(datum/signal/signal)
execute_current_command() execute_current_command()
obj/machinery/door/airlock/proc/execute_current_command() obj/machinery/door/airlock/proc/execute_current_command()
if(operating)
return //emagged or busy doing something else
if (!cur_command) if (!cur_command)
return return

View File

@@ -199,7 +199,9 @@
//checks if we are ready for undocking //checks if we are ready for undocking
/datum/computer/file/embedded_program/airlock/multi_docking/proc/ready_for_undocking() /datum/computer/file/embedded_program/airlock/multi_docking/proc/ready_for_undocking()
return check_doors_secured() var/ext_closed = check_exterior_door_secured()
var/int_closed = check_interior_door_secured()
return (ext_closed || int_closed)
/datum/computer/file/embedded_program/airlock/multi_docking/proc/open_doors() /datum/computer/file/embedded_program/airlock/multi_docking/proc/open_doors()
toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "open") toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "open")

View File

@@ -328,7 +328,8 @@
if (src.product_records.len == 0) if (src.product_records.len == 0)
dat += "<font color = 'red'>No product loaded!</font>" dat += "<font color = 'red'>No product loaded!</font>"
else else
var/list/display_records = src.product_records var/list/display_records = list()
display_records += src.product_records
if(src.extended_inventory) if(src.extended_inventory)
display_records += src.hidden_records display_records += src.hidden_records

View File

@@ -6,43 +6,52 @@
var/obj/machinery/computer/mech_bay_power_console/recharge_console var/obj/machinery/computer/mech_bay_power_console/recharge_console
var/obj/mecha/recharging_mecha = null var/obj/mecha/recharging_mecha = null
Entered(var/obj/mecha/mecha) /turf/simulated/floor/mech_bay_recharge_floor/Entered(var/obj/mecha/mecha)
. = ..() . = ..()
if(istype(mecha)) if(istype(mecha))
mecha.occupant_message("<b>Initializing power control devices.</b>") mecha.occupant_message("<b>Initializing power control devices.</b>")
init_devices() init_devices()
if(recharge_console && recharge_port) if(recharge_console && recharge_port)
recharging_mecha = mecha recharging_mecha = mecha
recharge_console.mecha_in(mecha) recharge_console.mecha_in(mecha)
return return
else if(!recharge_console) else if(!recharge_console)
mecha.occupant_message("<font color='red'>Control console not found. Terminating.</font>") mecha.occupant_message("<font color='red'>Control console not found. Terminating.</font>")
else if(!recharge_port) else if(!recharge_port)
mecha.occupant_message("<font color='red'>Power port not found. Terminating.</font>") mecha.occupant_message("<font color='red'>Power port not found. Terminating.</font>")
return return
Exited(atom) /turf/simulated/floor/mech_bay_recharge_floor/Exited(atom)
. = ..() . = ..()
if(atom == recharging_mecha) if(atom == recharging_mecha)
recharging_mecha = null recharging_mecha = null
if(recharge_console)
recharge_console.mecha_out()
return
proc/init_devices()
recharge_console = locate() in range(1,src)
recharge_port = locate(/obj/machinery/mech_bay_recharge_port, get_step(src, WEST))
if(recharge_console) if(recharge_console)
recharge_console.recharge_floor = src recharge_console.mecha_out()
if(recharge_port) return
recharge_console.recharge_port = recharge_port
/turf/simulated/floor/mech_bay_recharge_floor/proc/init_devices()
if(!recharge_console)
recharge_console = locate() in range(1,src)
if(!recharge_port)
recharge_port = locate() in get_step(src, WEST)
if(recharge_console)
recharge_console.recharge_floor = src
if(recharge_port) if(recharge_port)
recharge_port.recharge_floor = src recharge_console.recharge_port = recharge_port
if(recharge_console) if(recharge_port)
recharge_port.recharge_console = recharge_console recharge_port.recharge_floor = src
return if(recharge_console)
recharge_port.recharge_console = recharge_console
return
// temporary fix for broken icon until somebody gets around to make these player-buildable
/turf/simulated/floor/mech_bay_recharge_floor/attackby(obj/item/C as obj, mob/user as mob)
..()
if(floor_tile)
icon_state = "recharge_floor"
else
icon_state = "support_lattice"
/obj/machinery/mech_bay_recharge_port /obj/machinery/mech_bay_recharge_port
@@ -55,50 +64,50 @@
var/obj/machinery/computer/mech_bay_power_console/recharge_console var/obj/machinery/computer/mech_bay_power_console/recharge_console
var/datum/global_iterator/mech_bay_recharger/pr_recharger var/datum/global_iterator/mech_bay_recharger/pr_recharger
New() /obj/machinery/mech_bay_recharge_port/New()
..() ..()
pr_recharger = new /datum/global_iterator/mech_bay_recharger(null,0) pr_recharger = new /datum/global_iterator/mech_bay_recharger(null,0)
return return
proc/start_charge(var/obj/mecha/recharging_mecha) /obj/machinery/mech_bay_recharge_port/proc/start_charge(var/obj/mecha/recharging_mecha)
if(stat&(NOPOWER|BROKEN)) if(stat&(NOPOWER|BROKEN))
recharging_mecha.occupant_message("<font color='red'>Power port not responding. Terminating.</font>") recharging_mecha.occupant_message("<font color='red'>Power port not responding. Terminating.</font>")
return 0 return 0
else else
if(recharging_mecha.cell) if(recharging_mecha.cell)
recharging_mecha.occupant_message("Now charging...") recharging_mecha.occupant_message("Now charging...")
pr_recharger.start(list(src,recharging_mecha)) pr_recharger.start(list(src,recharging_mecha))
return 1
else
return 0
proc/stop_charge()
if(recharge_console && !recharge_console.stat)
recharge_console.icon_state = initial(recharge_console.icon_state)
pr_recharger.stop()
return
proc/active()
if(pr_recharger.active())
return 1 return 1
else else
return 0 return 0
power_change() /obj/machinery/mech_bay_recharge_port/proc/stop_charge()
if(powered()) if(recharge_console && !recharge_console.stat)
stat &= ~NOPOWER recharge_console.icon_state = initial(recharge_console.icon_state)
else pr_recharger.stop()
spawn(rand(0, 15)) return
stat |= NOPOWER
pr_recharger.stop()
return
proc/set_voltage(new_voltage) /obj/machinery/mech_bay_recharge_port/proc/active()
if(new_voltage && isnum(new_voltage)) if(pr_recharger.active())
pr_recharger.max_charge = new_voltage return 1
return 1 else
else return 0
return 0
/obj/machinery/mech_bay_recharge_port/power_change()
if(powered())
stat &= ~NOPOWER
else
spawn(rand(0, 15))
stat |= NOPOWER
pr_recharger.stop()
return
/obj/machinery/mech_bay_recharge_port/proc/set_voltage(new_voltage)
if(new_voltage && isnum(new_voltage))
pr_recharger.max_charge = new_voltage
return 1
else
return 0
/datum/global_iterator/mech_bay_recharger /datum/global_iterator/mech_bay_recharger
@@ -106,23 +115,22 @@
var/max_charge = 45 var/max_charge = 45
check_for_null = 0 //since port.stop_charge() must be called. The checks are made in process() check_for_null = 0 //since port.stop_charge() must be called. The checks are made in process()
process(var/obj/machinery/mech_bay_recharge_port/port, var/obj/mecha/mecha) /datum/global_iterator/mech_bay_recharger/process(var/obj/machinery/mech_bay_recharge_port/port, var/obj/mecha/mecha)
if(!port) if(!port)
return 0 return 0
if(mecha && mecha in port.recharge_floor) if(mecha && mecha in port.recharge_floor)
if(!mecha.cell) return if(!mecha.cell)
var/delta = min(max_charge, mecha.cell.maxcharge - mecha.cell.charge) return
if(delta>0) var/delta = min(max_charge, mecha.cell.maxcharge - mecha.cell.charge)
mecha.give_power(delta) if(delta>0)
port.use_power(delta*150) mecha.give_power(delta)
else port.use_power(delta*150)
mecha.occupant_message("<font color='blue'><b>Fully charged.</b></font>")
port.stop_charge()
else else
mecha.occupant_message("<font color='blue'><b>Fully charged.</b></font>")
port.stop_charge() port.stop_charge()
return else
port.stop_charge()
return
/obj/machinery/computer/mech_bay_power_console /obj/machinery/computer/mech_bay_power_console
@@ -137,82 +145,90 @@
var/turf/simulated/floor/mech_bay_recharge_floor/recharge_floor var/turf/simulated/floor/mech_bay_recharge_floor/recharge_floor
var/obj/machinery/mech_bay_recharge_port/recharge_port var/obj/machinery/mech_bay_recharge_port/recharge_port
proc/mecha_in(var/obj/mecha/mecha) /obj/machinery/computer/mech_bay_power_console/proc/mecha_in(var/obj/mecha/mecha)
if(stat&(NOPOWER|BROKEN)) if(stat&(NOPOWER|BROKEN))
mecha.occupant_message("<font color='red'>Control console not responding. Terminating...</font>") mecha.occupant_message("<font color='red'>Control console not responding. Terminating...</font>")
return
if(recharge_port && autostart)
var/answer = recharge_port.start_charge(mecha)
if(answer)
recharge_port.set_voltage(voltage)
src.icon_state = initial(src.icon_state)+"_on"
return return
if(recharge_port && autostart)
var/answer = recharge_port.start_charge(mecha)
if(answer)
recharge_port.set_voltage(voltage)
src.icon_state = initial(src.icon_state)+"_on"
return
proc/mecha_out() /obj/machinery/computer/mech_bay_power_console/proc/mecha_out()
if(recharge_port)
recharge_port.stop_charge()
return
/obj/machinery/computer/mech_bay_power_console/power_change()
if(stat & BROKEN)
icon_state = initial(icon_state)+"_broken"
if(recharge_port) if(recharge_port)
recharge_port.stop_charge() recharge_port.stop_charge()
return else if(powered())
icon_state = initial(icon_state)
stat &= ~NOPOWER
power_change() else
if(stat & BROKEN) spawn(rand(0, 15))
icon_state = initial(icon_state)+"_broken" icon_state = initial(icon_state)+"_nopower"
stat |= NOPOWER
if(recharge_port) if(recharge_port)
recharge_port.stop_charge() recharge_port.stop_charge()
else if(powered())
icon_state = initial(icon_state)
stat &= ~NOPOWER
else
spawn(rand(0, 15))
icon_state = initial(icon_state)+"_nopower"
stat |= NOPOWER
if(recharge_port)
recharge_port.stop_charge()
set_broken() /obj/machinery/computer/mech_bay_power_console/set_broken()
icon_state = initial(icon_state)+"_broken" icon_state = initial(icon_state)+"_broken"
stat |= BROKEN stat |= BROKEN
if(recharge_port)
recharge_port.stop_charge()
/obj/machinery/computer/mech_bay_power_console/attack_hand(mob/user as mob)
if(..())
return
if(!recharge_floor || !recharge_port)
var/turf/simulated/floor/mech_bay_recharge_floor/F = locate() in range(1,src)
if(F)
F.init_devices()
var/output = "<html><head><title>[src.name]</title></head><body>"
if(!recharge_floor)
output += "<font color='red'>Mech Bay Recharge Station not initialized.</font><br>"
else
output += {"<b>Mech Bay Recharge Station Data:</b><div style='margin-left: 15px;'>
<b>Mecha: </b>[recharge_floor.recharging_mecha||"None"]<br>"}
if(recharge_floor.recharging_mecha)
var/cell_charge = recharge_floor.recharging_mecha.get_charge()
output += "<b>Cell charge: </b>[isnull(cell_charge)?"No powercell found":"[recharge_floor.recharging_mecha.cell.charge]/[recharge_floor.recharging_mecha.cell.maxcharge]"]<br>"
output += "</div>"
if(!recharge_port)
output += "<font color='red'>Mech Bay Power Port not initialized.</font><br>"
else
output += "<b>Mech Bay Power Port Status: </b>[recharge_port.active()?"Now charging":"On hold"]<br>"
/*
output += {"<hr>
<b>Settings:</b>
<div style='margin-left: 15px;'>
<b>Start sequence on succesful init: </b><a href='?src=\ref[src];autostart=1'>[autostart?"On":"Off"]</a><br>
<b>Recharge Port Voltage: </b><a href='?src=\ref[src];voltage=30'>Low</a> - <a href='?src=\ref[src];voltage=45'>Medium</a> - <a href='?src=\ref[src];voltage=60'>High</a><br>
</div>"}
*/
output += "</ body></html>"
user << browse(output, "window=mech_bay_console")
onclose(user, "mech_bay_console")
return
// unused at the moment, also lacks any kind of exploit prevention
/*
/obj/machinery/computer/mech_bay_power_console/Topic(href, href_list)
if(href_list["autostart"])
autostart = !autostart
if(href_list["voltage"])
voltage = text2num(href_list["voltage"])
if(recharge_port) if(recharge_port)
recharge_port.stop_charge() recharge_port.set_voltage(voltage)
updateUsrDialog()
attack_hand(mob/user as mob) return
if(..()) return */
var/output = "<html><head><title>[src.name]</title></head><body>"
if(!recharge_floor)
output += "<font color='red'>Mech Bay Recharge Station not initialized.</font><br>"
else
output += {"<b>Mech Bay Recharge Station Data:</b><div style='margin-left: 15px;'>
<b>Mecha: </b>[recharge_floor.recharging_mecha||"None"]<br>"}
if(recharge_floor.recharging_mecha)
var/cell_charge = recharge_floor.recharging_mecha.get_charge()
output += "<b>Cell charge: </b>[isnull(cell_charge)?"No powercell found":"[recharge_floor.recharging_mecha.cell.charge]/[recharge_floor.recharging_mecha.cell.maxcharge]"]<br>"
output += "</div>"
if(!recharge_port)
output += "<font color='red'>Mech Bay Power Port not initialized.</font><br>"
else
output += "<b>Mech Bay Power Port Status: </b>[recharge_port.active()?"Now charging":"On hold"]<br>"
/*
output += {"<hr>
<b>Settings:</b>
<div style='margin-left: 15px;'>
<b>Start sequence on succesful init: </b><a href='?src=\ref[src];autostart=1'>[autostart?"On":"Off"]</a><br>
<b>Recharge Port Voltage: </b><a href='?src=\ref[src];voltage=30'>Low</a> - <a href='?src=\ref[src];voltage=45'>Medium</a> - <a href='?src=\ref[src];voltage=60'>High</a><br>
</div>"}
*/
output += "</ body></html>"
user << browse(output, "window=mech_bay_console")
onclose(user, "mech_bay_console")
return
Topic(href, href_list)
if(href_list["autostart"])
autostart = !autostart
if(href_list["voltage"])
voltage = text2num(href_list["voltage"])
if(recharge_port)
recharge_port.set_voltage(voltage)
updateUsrDialog()
return

View File

@@ -6,7 +6,10 @@ obj/effect/decal/cleanable/liquid_fuel
anchored = 1 anchored = 1
var/amount = 1 //Basically moles. var/amount = 1 //Basically moles.
New(newLoc,amt=1) New(turf/newLoc,amt=1,nologs=0)
if(!nologs)
message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[newLoc.x];Y=[newLoc.y];Z=[newLoc.z]'>JMP</a>)")
log_game("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z])")
src.amount = amt src.amount = amt
//Be absorbed by any other liquid fuel in the tile. //Be absorbed by any other liquid fuel in the tile.
@@ -30,7 +33,7 @@ obj/effect/decal/cleanable/liquid_fuel
var/turf/simulated/origin = get_turf(src) var/turf/simulated/origin = get_turf(src)
if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0)) if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in target) if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in target)
new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25) new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25,1)
amount *= 0.75 amount *= 0.75
flamethrower_fuel flamethrower_fuel

View File

@@ -14,7 +14,10 @@
/obj/item/clothing/suit/space/rig /obj/item/clothing/suit/space/rig
) )
/obj/item/device/modkit/afterattack(obj/O, mob/user as mob) /obj/item/device/modkit/afterattack(obj/O, mob/user as mob, proximity)
if(!proximity)
return
if (!target_species) if (!target_species)
return //it shouldn't be null, okay? return //it shouldn't be null, okay?
@@ -38,6 +41,7 @@
var/in_list = (target_species in I.species_restricted) var/in_list = (target_species in I.species_restricted)
if (excluding ^ in_list) if (excluding ^ in_list)
user << "<span class='notice'>[I] is already modified.</span>" user << "<span class='notice'>[I] is already modified.</span>"
return
if(!isturf(O.loc)) if(!isturf(O.loc))
user << "<span class='warning'>[O] must be safely placed on the ground for modification.</span>" user << "<span class='warning'>[O] must be safely placed on the ground for modification.</span>"

View File

@@ -13,7 +13,10 @@
modes += "[C]" modes += "[C]"
mode = pick(modes) mode = pick(modes)
/obj/item/device/pipe_painter/afterattack(atom/A, mob/user as mob) /obj/item/device/pipe_painter/afterattack(atom/A, mob/user as mob, proximity)
if(!proximity)
return
if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/tank) || istype(A,/obj/machinery/atmospherics/pipe/vent) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated) || !in_range(user, A)) if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/tank) || istype(A,/obj/machinery/atmospherics/pipe/vent) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated) || !in_range(user, A))
return return
var/obj/machinery/atmospherics/pipe/P = A var/obj/machinery/atmospherics/pipe/P = A

View File

@@ -364,7 +364,9 @@ REAGENT SCANNER
var/details = 0 var/details = 0
var/recent_fail = 0 var/recent_fail = 0
/obj/item/device/reagent_scanner/afterattack(obj/O, mob/user as mob) /obj/item/device/reagent_scanner/afterattack(obj/O, mob/user as mob, proximity)
if(!proximity)
return
if (user.stat) if (user.stat)
return return
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")

View File

@@ -42,7 +42,7 @@
var/mob/living/carbon/human/H = loc var/mob/living/carbon/human/H = loc
var/efficiency = H.get_pressure_protection() //you need to have a good seal for effective cooling var/efficiency = 1 - H.get_pressure_weakness() //you need to have a good seal for effective cooling
var/env_temp = get_environment_temperature() //wont save you from a fire var/env_temp = get_environment_temperature() //wont save you from a fire
var/temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling) var/temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling)

View File

@@ -16,6 +16,7 @@
return 1 return 1
/obj/item/device/transfer_valve/attackby(obj/item/item, mob/user) /obj/item/device/transfer_valve/attackby(obj/item/item, mob/user)
var/turf/location = get_turf(src) // For admin logs
if(istype(item, /obj/item/weapon/tank)) if(istype(item, /obj/item/weapon/tank))
if(tank_one && tank_two) if(tank_one && tank_two)
user << "<span class='warning'>There are already two tanks attached, remove one first.</span>" user << "<span class='warning'>There are already two tanks attached, remove one first.</span>"
@@ -31,6 +32,8 @@
user.drop_item() user.drop_item()
item.loc = src item.loc = src
user << "<span class='notice'>You attach the tank to the transfer valve.</span>" user << "<span class='notice'>You attach the tank to the transfer valve.</span>"
message_admins("[key_name_admin(user)] attached both tanks to a transfer valve. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
log_game("[key_name_admin(user)] attached both tanks to a transfer valve.")
update_icon() update_icon()
nanomanager.update_uis(src) // update all UIs attached to src nanomanager.update_uis(src) // update all UIs attached to src
@@ -51,7 +54,7 @@
A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb).
bombers += "[key_name(user)] attached a [item] to a transfer valve." bombers += "[key_name(user)] attached a [item] to a transfer valve."
message_admins("[key_name_admin(user)] attached a [item] to a transfer valve.") message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") log_game("[key_name_admin(user)] attached a [item] to a transfer valve.")
attacher = user attacher = user
nanomanager.update_uis(src) // update all UIs attached to src nanomanager.update_uis(src) // update all UIs attached to src

View File

@@ -52,15 +52,19 @@
use(1) use(1)
else else
return 1 return 1
else
else if(!in_use)
if(amount < 2) if(amount < 2)
user << "\blue You need at least two rods to do this." user << "\blue You need at least two rods to do this."
return return
usr << "\blue Assembling grille..." usr << "\blue Assembling grille..."
in_use = 1
if (!do_after(usr, 10)) if (!do_after(usr, 10))
in_use = 0
return return
var/obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc ) var/obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc )
usr << "\blue You assemble a grille" usr << "\blue You assemble a grille"
in_use = 0
F.add_fingerprint(usr) F.add_fingerprint(usr)
use(2) use(2)
return return

View File

@@ -236,76 +236,6 @@
return 0 return 0
/*
* Glass shards - TODO: Move this into code/game/object/item/weapons
*/
/obj/item/weapon/shard/Bump()
spawn( 0 )
if (prob(20))
src.force = 15
else
src.force = 4
..()
return
return
/obj/item/weapon/shard/New()
src.icon_state = pick("large", "medium", "small")
switch(src.icon_state)
if("small")
src.pixel_x = rand(-12, 12)
src.pixel_y = rand(-12, 12)
if("medium")
src.pixel_x = rand(-8, 8)
src.pixel_y = rand(-8, 8)
if("large")
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
else
return
/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if ( istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
var/obj/item/stack/sheet/glass/NG = new (user.loc)
for (var/obj/item/stack/sheet/glass/G in user.loc)
if(G==NG)
continue
if(G.amount>=G.max_amount)
continue
G.attackby(NG, user)
usr << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheets."
//SN src = null
del(src)
return
return ..()
/obj/item/weapon/shard/Crossed(AM as mob|obj)
if(ismob(AM))
var/mob/M = AM
M << "\red <B>You step in the broken glass!</B>"
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
return
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(affecting.status & ORGAN_ROBOT)
return
H.Weaken(3)
if(affecting.take_damage(5, 0))
H.UpdateDamageIcon()
H.updatehealth()
..()
/* /*

View File

@@ -112,7 +112,9 @@
return return
..() ..()
/obj/item/weapon/implanter/compressed/afterattack(atom/A, mob/user as mob) /obj/item/weapon/implanter/compressed/afterattack(atom/A, mob/user as mob, proximity)
if(!proximity)
return
if(istype(A,/obj/item) && imp) if(istype(A,/obj/item) && imp)
var/obj/item/weapon/implant/compressed/c = imp var/obj/item/weapon/implant/compressed/c = imp
if (c.scanned) if (c.scanned)

View File

@@ -0,0 +1,114 @@
// Glass shards
/obj/item/weapon/shard
name = "glass shard"
icon = 'icons/obj/shards.dmi'
icon_state = "large"
sharp = 1
edge = 1
desc = "Could probably be used as ... a throwing weapon?"
w_class = 2.0
force = 5.0
throwforce = 8.0
item_state = "shard-glass"
matter = list("glass" = 3750)
attack_verb = list("stabbed", "slashed", "sliced", "cut")
/obj/item/weapon/shard/suicide_act(mob/user)
viewers(user) << pick("\red <b>[user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.</b>", \
"\red <b>[user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.</b>")
return (BRUTELOSS)
/obj/item/weapon/shard/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
/obj/item/weapon/shard/Bump()
spawn( 0 )
if (prob(20))
src.force = 15
else
src.force = 4
..()
return
return
/obj/item/weapon/shard/New()
src.icon_state = pick("large", "medium", "small")
switch(src.icon_state)
if("small")
src.pixel_x = rand(-12, 12)
src.pixel_y = rand(-12, 12)
if("medium")
src.pixel_x = rand(-8, 8)
src.pixel_y = rand(-8, 8)
if("large")
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
else
return
/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if ( istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
var/obj/item/stack/sheet/glass/NG = new (user.loc)
for (var/obj/item/stack/sheet/glass/G in user.loc)
if(G==NG)
continue
if(G.amount>=G.max_amount)
continue
G.attackby(NG, user)
usr << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheets."
//SN src = null
del(src)
return
return ..()
/obj/item/weapon/shard/HasEntered(AM as mob|obj)
if(ismob(AM))
var/mob/M = AM
M << "\red <B>You step on \the [src]!</B>"
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
return
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(affecting.status & ORGAN_ROBOT)
return
H.Weaken(3)
if(affecting.take_damage(5, 0))
H.UpdateDamageIcon()
H.updatehealth()
..()
// Shrapnel
/obj/item/weapon/shard/shrapnel
name = "shrapnel"
icon = 'icons/obj/shards.dmi'
icon_state = "shrapnellarge"
desc = "A bunch of tiny bits of shattered metal."
/obj/item/weapon/shard/shrapnel/New()
src.icon_state = pick("shrapnellarge", "shrapnelmedium", "shrapnelsmall")
switch(src.icon_state)
if("shrapnelsmall")
src.pixel_x = rand(-12, 12)
src.pixel_y = rand(-12, 12)
if("shrapnelmedium")
src.pixel_x = rand(-8, 8)
src.pixel_y = rand(-8, 8)
if("shrapnellarge")
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
else
return

View File

@@ -68,6 +68,7 @@
icon_type = "egg" icon_type = "egg"
name = "egg box" name = "egg box"
storage_slots = 12 storage_slots = 12
max_combined_w_class = 24
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/egg") can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/egg")
/obj/item/weapon/storage/fancy/egg_box/New() /obj/item/weapon/storage/fancy/egg_box/New()

View File

@@ -65,7 +65,9 @@
O.show_message(text("\red [] waves [] over []'s head.", user, src, M), 1) O.show_message(text("\red [] waves [] over []'s head.", user, src, M), 1)
return return
/obj/item/weapon/nullrod/afterattack(atom/A, mob/user as mob) /obj/item/weapon/nullrod/afterattack(atom/A, mob/user as mob, proximity)
if(!proximity)
return
if (istype(A, /turf/simulated/floor)) if (istype(A, /turf/simulated/floor))
user << "\blue You hit the floor with the [src]." user << "\blue You hit the floor with the [src]."
call(/obj/effect/rune/proc/revealrunes)(src) call(/obj/effect/rune/proc/revealrunes)(src)
@@ -231,7 +233,7 @@
update_icon(user) update_icon(user)
/obj/item/weapon/butterfly/switchblade /obj/item/weapon/butterfly/switchblade
name = "/proper switchblade" name = "switchblade"
desc = "A classic switchblade with gold engraving. Just holding it makes you feel like a gangster." desc = "A classic switchblade with gold engraving. Just holding it makes you feel like a gangster."
icon_state = "switchblade" icon_state = "switchblade"

View File

@@ -47,13 +47,21 @@
buckle_mob(M, user) buckle_mob(M, user)
return return
/obj/structure/stool/bed/proc/afterbuckle(mob/M as mob) // Called after somebody buckled / unbuckled
return
/obj/structure/stool/bed/proc/unbuckle() /obj/structure/stool/bed/proc/unbuckle()
if(buckled_mob) if(buckled_mob)
if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
buckled_mob.buckled = null buckled_mob.buckled = null
buckled_mob.anchored = initial(buckled_mob.anchored) buckled_mob.anchored = initial(buckled_mob.anchored)
buckled_mob.update_canmove() buckled_mob.update_canmove()
var/M = buckled_mob
buckled_mob = null buckled_mob = null
afterbuckle(M)
return return
/obj/structure/stool/bed/proc/manual_unbuckle(mob/user as mob) /obj/structure/stool/bed/proc/manual_unbuckle(mob/user as mob)
@@ -103,6 +111,7 @@
M.update_canmove() M.update_canmove()
src.buckled_mob = M src.buckled_mob = M
src.add_fingerprint(user) src.add_fingerprint(user)
afterbuckle(M)
return return
/* /*

View File

@@ -95,25 +95,40 @@
/obj/structure/stool/bed/chair/comfy /obj/structure/stool/bed/chair/comfy
name = "comfy chair" name = "comfy chair"
desc = "It looks comfy." desc = "It looks comfy."
icon_state = "comfychair"
color = rgb(255,255,255)
var/image/armrest = null
/obj/structure/stool/bed/chair/comfy/New()
armrest = image("icons/obj/objects.dmi", "comfychair_armrest")
armrest.layer = MOB_LAYER + 0.1
return ..()
/obj/structure/stool/bed/chair/comfy/afterbuckle()
if(buckled_mob)
overlays += armrest
else
overlays -= armrest
/obj/structure/stool/bed/chair/comfy/brown /obj/structure/stool/bed/chair/comfy/brown
icon_state = "comfychair_brown" color = rgb(255,113,0)
/obj/structure/stool/bed/chair/comfy/beige /obj/structure/stool/bed/chair/comfy/beige
icon_state = "comfychair_beige" color = rgb(255,253,195)
/obj/structure/stool/bed/chair/comfy/teal /obj/structure/stool/bed/chair/comfy/teal
icon_state = "comfychair_teal" color = rgb(0,255,255)
/obj/structure/stool/bed/chair/office /obj/structure/stool/bed/chair/office
anchored = 0 anchored = 0
movable = 1 movable = 1
/obj/structure/stool/bed/chair/comfy/black /obj/structure/stool/bed/chair/comfy/black
icon_state = "comfychair_black" color = rgb(167,164,153)
/obj/structure/stool/bed/chair/comfy/lime /obj/structure/stool/bed/chair/comfy/lime
icon_state = "comfychair_lime" color = rgb(255,251,0)
/obj/structure/stool/bed/chair/office/Move() /obj/structure/stool/bed/chair/office/Move()
..() ..()

View File

@@ -18,12 +18,17 @@
buckled_mob.dir = dir buckled_mob.dir = dir
/obj/structure/stool/bed/chair/wheelchair/relaymove(mob/user, direction) /obj/structure/stool/bed/chair/wheelchair/relaymove(mob/user, direction)
// Redundant check?
if(user.stat || user.stunned || user.weakened || user.paralysis || user.lying || user.restrained()) if(user.stat || user.stunned || user.weakened || user.paralysis || user.lying || user.restrained())
if(user==pulling) if(user==pulling)
pulling = null pulling = null
user.pulledby = null user.pulledby = null
user << "\red You lost your grip!" user << "\red You lost your grip!"
return return
if(buckled_mob && pulling && user == buckled_mob)
if(pulling.stat || pulling.stunned || pulling.weakened || pulling.paralysis || pulling.lying || pulling.restrained())
pulling.pulledby = null
pulling = null
if(user.pulling && (user == pulling)) if(user.pulling && (user == pulling))
pulling = null pulling = null
user.pulledby = null user.pulledby = null

View File

@@ -254,7 +254,6 @@
//send resources to the client. It's here in its own proc so we can move it around easiliy if need be //send resources to the client. It's here in its own proc so we can move it around easiliy if need be
/client/proc/send_resources() /client/proc/send_resources()
// preload_vox() //Causes long delays with initial start window and subsequent windows when first logged in.
getFiles( getFiles(
'html/search.js', 'html/search.js',

View File

@@ -292,6 +292,8 @@ datum/preferences
if(total_cost < MAX_GEAR_COST) if(total_cost < MAX_GEAR_COST)
dat += " <a href='byond://?src=\ref[user];preference=loadout;task=input'>\[add\]</a>" dat += " <a href='byond://?src=\ref[user];preference=loadout;task=input'>\[add\]</a>"
if(gear && gear.len)
dat += " <a href='byond://?src=\ref[user];preference=loadout;task=remove'>\[remove\]</a>"
dat += "<br><br><b>Occupation Choices</b><br>" dat += "<br><br><b>Occupation Choices</b><br>"
dat += "\t<a href='?_src_=prefs;preference=job;task=menu'><b>Set Preferences</b></a><br>" dat += "\t<a href='?_src_=prefs;preference=job;task=menu'><b>Set Preferences</b></a><br>"
@@ -999,10 +1001,18 @@ datum/preferences
user << "\red That item will exceed the maximum loadout cost of [MAX_GEAR_COST] points." user << "\red That item will exceed the maximum loadout cost of [MAX_GEAR_COST] points."
else if(href_list["task"] == "remove") else if(href_list["task"] == "remove")
var/to_remove = href_list["gear"]
if(!to_remove) return if(isnull(gear) || !islist(gear))
gear = list()
if(!gear.len)
return
var/choice = input(user, "Select gear to remove: ") as null|anything in gear
if(!choice)
return
for(var/gear_name in gear) for(var/gear_name in gear)
if(gear_name == to_remove) if(gear_name == choice)
gear -= gear_name gear -= gear_name
break break

View File

@@ -133,7 +133,7 @@
/obj/item/clothing/shoes/swimmingfins /obj/item/clothing/shoes/swimmingfins
desc = "Help you swim good." desc = "Help you swim good."
name = "swimming fins" name = "swimming fins"
icon_state = "flipperfeet" icon_state = "flippers"
flags = NOSLIP flags = NOSLIP
slowdown = SHOES_SLOWDOWN+1 slowdown = SHOES_SLOWDOWN+1
species_restricted = null species_restricted = null

View File

@@ -170,6 +170,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost, you won't be able to play this round for another 30 minutes! You can't change your mind so choose wisely!)","Are you sure you want to ghost?","Ghost","Stay in body") var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost, you won't be able to play this round for another 30 minutes! You can't change your mind so choose wisely!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost") return //didn't want to ghost after-all if(response != "Ghost") return //didn't want to ghost after-all
resting = 1 resting = 1
var/turf/location = get_turf(src)
message_admins("[key_name_admin(usr)] has ghosted. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
log_game("[key_name_admin(usr)] has ghosted.")
var/mob/dead/observer/ghost = ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 var/mob/dead/observer/ghost = ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
return return

View File

@@ -217,7 +217,7 @@
var/mob/living/carbon/human/H = src var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M) H.w_uniform.add_fingerprint(M)
if(lying) if(lying || src.sleeping)
src.sleeping = max(0,src.sleeping-5) src.sleeping = max(0,src.sleeping-5)
if(src.sleeping == 0) if(src.sleeping == 0)
src.resting = 0 src.resting = 0

View File

@@ -280,6 +280,7 @@
for(var/datum/wound/W in temp.wounds) for(var/datum/wound/W in temp.wounds)
if(W.internal && !temp.open) continue // can't see internal wounds if(W.internal && !temp.open) continue // can't see internal wounds
var/this_wound_desc = W.desc 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]" if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]"
else if(W.bandaged) this_wound_desc = "bandaged [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]" if(W.germ_level > 600) this_wound_desc = "badly infected [this_wound_desc]"

View File

@@ -2,7 +2,7 @@
//NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick! //NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick!
#define HUMAN_MAX_OXYLOSS 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. #define HUMAN_MAX_OXYLOSS 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it.
#define HUMAN_CRIT_MAX_OXYLOSS ( (last_tick_duration) /5) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 100HP to get through, so (1/3)*last_tick_duration per second. Breaths however only happen every 4 ticks. #define HUMAN_CRIT_MAX_OXYLOSS ( (last_tick_duration) /6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks.
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 4 //Amount of damage applied when your body temperature passes the 400K point #define HEAT_DAMAGE_LEVEL_2 4 //Amount of damage applied when your body temperature passes the 400K point
@@ -35,6 +35,8 @@
/mob/living/carbon/human/Life() /mob/living/carbon/human/Life()
set invisibility = 0 set invisibility = 0
set background = 1 set background = 1
@@ -73,7 +75,7 @@
//No need to update all of these procs if the guy is dead. //No need to update all of these procs if the guy is dead.
if(stat != DEAD && !in_stasis) if(stat != DEAD && !in_stasis)
if(air_master.current_cycle%4==2 || failed_last_breath) //First, resolve location and get a breath if(air_master.current_cycle%4==2 || failed_last_breath || (health < config.health_threshold_crit)) //First, resolve location and get a breath
breathe() //Only try to take a breath every 4 ticks, unless suffocating breathe() //Only try to take a breath every 4 ticks, unless suffocating
else //Still give containing object the chance to interact else //Still give containing object the chance to interact
@@ -130,38 +132,52 @@
for(var/obj/item/weapon/grab/G in src) for(var/obj/item/weapon/grab/G in src)
G.process() G.process()
// Calculate how vulnerable the human is to under- and overpressure.
// Returns 0 (equals 0 %) if sealed in an undamaged suit, 1 if unprotected (equals 100%).
// Suitdamage can modifiy this in 10% steps.
/mob/living/carbon/human/proc/get_pressure_weakness()
//Much like get_heat_protection(), this returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. var/pressure_adjustment_coefficient = 1 // Assume no protection at first.
/mob/living/carbon/human/proc/get_pressure_protection()
var/pressure_adjustment_coefficient = 1 //Determins how much the clothing you are wearing protects you in percent.
if(head && (head.flags & STOPSPRESSUREDMAGE)) if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE) && head && (head.flags & STOPSPRESSUREDMAGE)) // Complete set of pressure-proof suit worn, assume fully sealed.
pressure_adjustment_coefficient -= PRESSURE_HEAD_REDUCTION_COEFFICIENT pressure_adjustment_coefficient = 0
if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE)) // Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure protection.
pressure_adjustment_coefficient -= PRESSURE_SUIT_REDUCTION_COEFFICIENT
//Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure reduction.
if(istype(wear_suit,/obj/item/clothing/suit/space)) if(istype(wear_suit,/obj/item/clothing/suit/space))
var/obj/item/clothing/suit/space/S = wear_suit var/obj/item/clothing/suit/space/S = wear_suit
if(S.can_breach && S.damage) if(S.can_breach && S.damage)
var/pressure_loss = S.damage * 0.1 pressure_adjustment_coefficient += S.damage * 0.1
pressure_adjustment_coefficient += pressure_loss
pressure_adjustment_coefficient = min(1,max(pressure_adjustment_coefficient,0)) //So it isn't less than 0 or larger than 1. pressure_adjustment_coefficient = min(1,max(pressure_adjustment_coefficient,0)) // So it isn't less than 0 or larger than 1.
return 1 - pressure_adjustment_coefficient //want 0 to be bad protection, 1 to be good protection return pressure_adjustment_coefficient
// Calculate how much of the enviroment pressure-difference affects the human.
/mob/living/carbon/human/calculate_affecting_pressure(var/pressure) /mob/living/carbon/human/calculate_affecting_pressure(var/pressure)
..() var/pressure_difference
var/pressure_difference = abs( pressure - ONE_ATMOSPHERE )
pressure_difference = pressure_difference * (1 - get_pressure_protection()) // First get the absolute pressure difference.
if(pressure < ONE_ATMOSPHERE) // We are in an underpressure.
pressure_difference = ONE_ATMOSPHERE - pressure
else //We are in an overpressure or standard atmosphere.
pressure_difference = pressure - ONE_ATMOSPHERE
if(pressure_difference < 5) // If the difference is small, don't bother calculating the fraction.
pressure_difference = 0
if(pressure > ONE_ATMOSPHERE)
return ONE_ATMOSPHERE + pressure_difference
else else
// Otherwise calculate how much of that absolute pressure difference affects us, can be 0 to 1 (equals 0% to 100%).
// This is our relative difference.
pressure_difference *= get_pressure_weakness()
// The difference is always positive to avoid extra calculations.
// Apply the relative difference on a standard atmosphere to get the final result.
// The return value will be the adjusted_pressure of the human that is the basis of pressure warnings and damage.
if(pressure < ONE_ATMOSPHERE)
return ONE_ATMOSPHERE - pressure_difference return ONE_ATMOSPHERE - pressure_difference
else
return ONE_ATMOSPHERE + pressure_difference
/mob/living/carbon/human /mob/living/carbon/human
proc/handle_disabilities() proc/handle_disabilities()

View File

@@ -108,7 +108,7 @@
var/list/trays = list() var/list/trays = list()
for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1)) for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1))
if(tray.nutrilevel < 10) if(tray.nutrilevel < 10 && src.Adjacent(tray))
trays += tray trays += tray
var/obj/machinery/portable_atmospherics/hydroponics/target = input("Select a tray:") as null|anything in trays var/obj/machinery/portable_atmospherics/hydroponics/target = input("Select a tray:") as null|anything in trays
@@ -127,7 +127,7 @@
var/list/trays = list() var/list/trays = list()
for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1)) for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1))
if(tray.weedlevel > 0) if(tray.weedlevel > 0 && src.Adjacent(tray))
trays += tray trays += tray
var/obj/machinery/portable_atmospherics/hydroponics/target = input("Select a tray:") as null|anything in trays var/obj/machinery/portable_atmospherics/hydroponics/target = input("Select a tray:") as null|anything in trays
@@ -186,7 +186,8 @@
var/list/choices = list() var/list/choices = list()
for(var/mob/living/carbon/human/H in oview(1,src)) for(var/mob/living/carbon/human/H in oview(1,src))
choices += H if(src.Adjacent(H))
choices += H
var/mob/living/carbon/human/M = input(src,"Who do you wish to take a sample from?") in null|choices var/mob/living/carbon/human/M = input(src,"Who do you wish to take a sample from?") in null|choices

View File

@@ -80,11 +80,6 @@
emote(pick("scratch","jump","roll","tail")) emote(pick("scratch","jump","roll","tail"))
updatehealth() updatehealth()
/mob/living/carbon/monkey/calculate_affecting_pressure(var/pressure)
..()
return pressure
/mob/living/carbon/monkey /mob/living/carbon/monkey
proc/handle_disabilities() proc/handle_disabilities()
@@ -389,9 +384,8 @@
//Moved these vars here for use in the fuck-it-skip-processing check. //Moved these vars here for use in the fuck-it-skip-processing check.
var/pressure = environment.return_pressure() var/pressure = environment.return_pressure()
var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. if(pressure < WARNING_HIGH_PRESSURE && pressure > WARNING_LOW_PRESSURE && abs(environment.temperature - 293.15) < 20 && abs(bodytemperature - 310.14) < 0.5 && environment.phoron < MOLES_PHORON_VISIBLE)
if(adjusted_pressure < WARNING_HIGH_PRESSURE && adjusted_pressure > WARNING_LOW_PRESSURE && abs(environment.temperature - 293.15) < 20 && abs(bodytemperature - 310.14) < 0.5 && environment.gas["phoron"] < gas_data.overlay_limit["phoron"])
//Hopefully should fix the walk-inside-still-pressure-warning issue. //Hopefully should fix the walk-inside-still-pressure-warning issue.
if(pressure_alert) if(pressure_alert)
@@ -413,9 +407,9 @@
bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000)
//Account for massive pressure differences //Account for massive pressure differences
switch(adjusted_pressure) switch(pressure)
if(HAZARD_HIGH_PRESSURE to INFINITY) if(HAZARD_HIGH_PRESSURE to INFINITY)
adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) adjustBruteLoss( min( ( (pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
pressure_alert = 2 pressure_alert = 2
if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
pressure_alert = 1 pressure_alert = 1

View File

@@ -18,7 +18,7 @@
//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually //This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually
//affects them once clothing is factored in. ~Errorage //affects them once clothing is factored in. ~Errorage
/mob/living/proc/calculate_affecting_pressure(var/pressure) /mob/living/proc/calculate_affecting_pressure(var/pressure)
return 0 return
//sort of a legacy burn method for /electrocute, /shock, and the e_chair //sort of a legacy burn method for /electrocute, /shock, and the e_chair
@@ -300,6 +300,7 @@
dead_mob_list -= src dead_mob_list -= src
living_mob_list += src living_mob_list += src
tod = null tod = null
timeofdeath = 0
// restore us to conciousness // restore us to conciousness
stat = CONSCIOUS stat = CONSCIOUS

View File

@@ -446,13 +446,6 @@ var/list/ai_verbs_default = list(
lawchannel = setchannel lawchannel = setchannel
checklaws() checklaws()
//Uncomment this line of code if you are enabling the AI Vocal (VOX) announcements.
/*
if(href_list["say_word"])
play_vox_word(href_list["say_word"], null, src)
return
*/
if (href_list["lawi"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite if (href_list["lawi"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite
var/L = text2num(href_list["lawi"]) var/L = text2num(href_list["lawi"])
switch(ioncheck[L]) switch(ioncheck[L])

View File

@@ -3,126 +3,3 @@
return parent.say(message) return parent.say(message)
//If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead. //If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead.
return ..(message) return ..(message)
// These Verbs are commented out since we've disabled the AI vocal (VOX) announcements.
// If you re-enable them there is 3 lines in ai.dm Topic() that you need to uncomment as well.
// just search for VOX in there.
/*
var/announcing_vox = 0 // Stores the time of the last announcement
var/const/VOX_CHANNEL = 200
var/const/VOX_DELAY = 100 // 10 seconds
var/const/VOX_PATH = "sound/vox/"
/mob/living/silicon/ai/verb/announcement_help()
set name = "Announcement Help"
set desc = "Display a list of vocal words to announce to the crew."
set category = "AI Commands"
var/dat = "Here is a list of words you can type into the 'Announcement' button to create sentences to vocally announce to everyone on the same level at you.<BR> \
<UL><LI>You can also click on the word to preview it.</LI>\
<LI>You can only say 30 words for every announcement.</LI>\
<LI>Do not use punctuation as you would normally, if you want a pause you can use the full stop and comma characters by separating them with spaces, like so: 'Alpha . Test , Bravo'.</LI></UL>\
<font class='bad'>WARNING:</font><BR>Misuse of the announcement system will get you job banned.<HR>"
var/index = 0
var/list/vox_words = flist(VOX_PATH) // flist will return a list of strings with all the files in the path
for(var/word in vox_words)
index++
var/stripped_word = copytext(word, 1, length(word) - 3) // Remove the .wav
dat += "<A href='?src=\ref[src];say_word=[stripped_word]'>[capitalize(stripped_word)]</A>"
if(index != vox_words.len)
dat += " / "
src << browse(dat, "window=announce_help;size=500x400")
/mob/living/silicon/ai/verb/announcement()
set name = "Announcement"
set desc = "Create a vocal announcement by typing in the available words to create a sentence."
set category = "AI Commands"
if(announcing_vox > world.time)
src << "<span class='notice'>Please wait [round((announcing_vox - world.time) / 10)] seconds.</span>"
return
var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", src.last_announcement) as text
last_announcement = message
if(!message || announcing_vox > world.time)
return
var/list/words = text2list(trim(message), " ")
var/list/incorrect_words = list()
if(words.len > 30)
words.len = 30
// Detect incorrect words which aren't .wav files.
for(var/word in words)
word = trim(word)
if(!word)
words -= word
continue
if(!vox_word_exists(word))
incorrect_words += word
if(incorrect_words.len)
src << "<span class='notice'>These words are not available on the announcement system: [english_list(incorrect_words)].</span>"
return
announcing_vox = world.time + VOX_DELAY
log_game("[key_name_admin(src)] made a vocal announcement with the following message: [message].")
for(var/word in words)
play_vox_word(word, src.z, null)
/proc/play_vox_word(var/word, var/z_level, var/mob/only_listener)
word = lowertext(word)
if(vox_word_exists(word))
var/sound_file = get_vox_file(word)
var/sound/voice = sound(sound_file, wait = 1, channel = VOX_CHANNEL)
voice.status = SOUND_STREAM
// If there is no single listener, broadcast to everyone in the same z level
if(!only_listener)
// Play voice for all mobs in the z level
for(var/mob/M in player_list)
if(M.client)
var/turf/T = get_turf(M)
if(T.z == z_level)
M << voice
else
only_listener << voice
return 1
return 0
/proc/vox_word_exists(var/word)
return fexists("[VOX_PATH][word].wav")
/proc/get_vox_file(var/word)
if(vox_word_exists(word))
return file("[VOX_PATH][word].wav")
// Dynamically loading it has bad results with sounds overtaking each other, even with the wait variable.
// We send the file to the user when they login.
/client/proc/preload_vox()
var/list/vox_files = flist(VOX_PATH)
for(var/file in vox_files)
// src << "Downloading [file]"
var/sound/S = sound("[VOX_PATH][file]")
src << browse_rsc(S)
*/

View File

@@ -19,6 +19,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
/datum/paiController /datum/paiController
var/inquirer = null
var/list/pai_candidates = list() var/list/pai_candidates = list()
var/list/asked = list() var/list/asked = list()
@@ -344,6 +345,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
user << browse(dat, "window=findPai") user << browse(dat, "window=findPai")
/datum/paiController/proc/requestRecruits() /datum/paiController/proc/requestRecruits()
for(var/mob/dead/observer/O in player_list) for(var/mob/dead/observer/O in player_list)
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
@@ -368,7 +370,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
if(!C) return if(!C) return
asked.Add(C.key) asked.Add(C.key)
asked[C.key] = world.time asked[C.key] = world.time
var/response = alert(C, "Someone is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round") var/response = alert(C, "[inquirer] is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round")
if(!C) return //handle logouts that happen whilst the alert is waiting for a response. if(!C) return //handle logouts that happen whilst the alert is waiting for a response.
if(response == "Yes") if(response == "Yes")
recruitWindow(C.mob) recruitWindow(C.mob)

View File

@@ -69,9 +69,9 @@
/obj/item/weapon/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) /obj/item/weapon/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
return return
/obj/item/weapon/gripper/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) /obj/item/weapon/gripper/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params)
if(!target || !flag) //Target is invalid or we are not adjacent. if(!target || !proximity) //Target is invalid or we are not adjacent.
return return
//There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z //There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z
@@ -82,23 +82,20 @@
if(wrapped) //Already have an item. if(wrapped) //Already have an item.
//Temporary put wrapped into user so target's attackby() checks pass.
wrapped.loc = user wrapped.loc = user
//Pass the attack on to the target.
//Pass the attack on to the target. This might delete/relocate wrapped.
target.attackby(wrapped,user) target.attackby(wrapped,user)
if(wrapped && src && wrapped.loc == user) //If wrapped did neither get deleted nor put into target, put it back into the gripper.
if(wrapped && user && (wrapped.loc == user))
wrapped.loc = src wrapped.loc = src
else
//Sanity/item use checks.
if(!wrapped || !user)
return
if(wrapped.loc != src.loc)
wrapped = null wrapped = null
return return
if(istype(target,/obj/item)) //Check that we're not pocketing a mob. else if(istype(target,/obj/item)) //Check that we're not pocketing a mob.
//...and that the item is not in a container. //...and that the item is not in a container.
if(!isturf(target.loc)) if(!isturf(target.loc))
@@ -158,9 +155,9 @@
/obj/item/weapon/matter_decompiler/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) /obj/item/weapon/matter_decompiler/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
return return
/obj/item/weapon/matter_decompiler/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) /obj/item/weapon/matter_decompiler/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params)
if(!flag) return //Not adjacent. if(!proximity) return //Not adjacent.
//We only want to deal with using this on turfs. Specific items aren't important. //We only want to deal with using this on turfs. Specific items aren't important.
var/turf/T = get_turf(target) var/turf/T = get_turf(target)

View File

@@ -1,9 +1,9 @@
/mob/living/silicon/robot/updatehealth() /mob/living/silicon/robot/updatehealth()
if(status_flags & GODMODE) if(status_flags & GODMODE)
health = 200 health = maxHealth
stat = CONSCIOUS stat = CONSCIOUS
return return
health = 200 - (getBruteLoss() + getFireLoss()) health = maxHealth - (getBruteLoss() + getFireLoss())
return return
/mob/living/silicon/robot/getBruteLoss() /mob/living/silicon/robot/getBruteLoss()

View File

@@ -6,7 +6,9 @@
name = "RoboTray" name = "RoboTray"
desc = "An autoloading tray specialized for carrying refreshments." desc = "An autoloading tray specialized for carrying refreshments."
/obj/item/weapon/tray/robotray/afterattack(atom/target, mob/user as mob) /obj/item/weapon/tray/robotray/afterattack(atom/target, mob/user as mob, proximity)
if(!proximity)
return
if ( !target ) if ( !target )
return return
// pick up items, mostly copied from base tray pickup proc // pick up items, mostly copied from base tray pickup proc

View File

@@ -434,6 +434,9 @@
// And uncomment this, too. // And uncomment this, too.
//new_character.dna.UpdateSE() //new_character.dna.UpdateSE()
// Do the initial caching of the player's body icons.
new_character.regenerate_icons()
new_character.key = key //Manually transfer the key to log them in new_character.key = key //Manually transfer the key to log them in
return new_character return new_character

View File

@@ -206,6 +206,9 @@ This function completely restores a damaged organ to perfect condition.
perma_injury = 0 perma_injury = 0
brute_dam = 0 brute_dam = 0
burn_dam = 0 burn_dam = 0
germ_level = 0
wounds.Cut()
number_wounds = 0
// handle internal organs // handle internal organs
for(var/datum/organ/internal/current_organ in internal_organs) for(var/datum/organ/internal/current_organ in internal_organs)
@@ -265,25 +268,6 @@ This function completely restores a damaged organ to perfect condition.
if(W) if(W)
wounds += W wounds += W
/datum/organ/external/proc/get_wound_type(var/type = CUT, var/damage)
//if you look a the names in the wound's stages list for each wound type you will see the logic behind these values
switch(type)
if(CUT)
if (damage <= 5) return /datum/wound/cut/small
if (damage <= 15) return /datum/wound/cut/deep
if (damage <= 25) return /datum/wound/cut/flesh
if (damage <= 50) return /datum/wound/cut/gaping
if (damage <= 60) return /datum/wound/cut/gaping_big
return /datum/wound/cut/massive
if(BRUISE)
return /datum/wound/bruise
if(BURN)
if (damage <= 5) return /datum/wound/burn/moderate
if (damage <= 15) return /datum/wound/burn/large
if (damage <= 30) return /datum/wound/burn/severe
if (damage <= 40) return /datum/wound/burn/deep
return /datum/wound/burn/carbonised
/**************************************************** /****************************************************
PROCESSING & UPDATING PROCESSING & UPDATING
****************************************************/ ****************************************************/
@@ -396,10 +380,9 @@ Note that amputating the affected organ does in fact remove the infection from t
if(germ_level >= INFECTION_LEVEL_ONE) if(germ_level >= INFECTION_LEVEL_ONE)
//having an infection raises your body temperature //having an infection raises your body temperature
var/fever_temperature = (owner.species.heat_level_1 - owner.species.body_temperature - 1)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.species.body_temperature var/fever_temperature = (owner.species.heat_level_1 - owner.species.body_temperature - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.species.body_temperature
if (fever_temperature > owner.bodytemperature) //need to make sure we raise temperature fast enough to get around environmental cooling preventing us from reaching fever_temperature
//need to make sure we raise temperature fast enough to get around environmental cooling preventing us from reaching fever_temperature owner.bodytemperature += between(0, (fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1, fever_temperature - owner.bodytemperature)
owner.bodytemperature += (fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1
if(prob(round(germ_level/10))) if(prob(round(germ_level/10)))
if (antibiotics < 5) if (antibiotics < 5)

View File

@@ -7,7 +7,7 @@
var/current_stage = 0 var/current_stage = 0
// description of the wound // description of the wound
var/desc = "" var/desc = "wound" //default in case something borks
// amount of damage this wound causes // amount of damage this wound causes
var/damage = 0 var/damage = 0
@@ -207,6 +207,44 @@
return (damage_type == BRUISE && wound_damage() >= 20 || damage_type == CUT && wound_damage() >= 5) return (damage_type == BRUISE && wound_damage() >= 20 || damage_type == CUT && wound_damage() >= 5)
/** WOUND DEFINITIONS **/
//Note that the MINIMUM damage before a wound can be applied should correspond to
//the damage amount for the stage with the same name as the wound.
//e.g. /datum/wound/cut/deep should only be applied for 15 damage and up,
//because in it's stages list, "deep cut" = 15.
/proc/get_wound_type(var/type = CUT, var/damage)
switch(type)
if(CUT)
switch(damage)
if(70 to INFINITY)
return /datum/wound/cut/massive
if(60 to 70)
return /datum/wound/cut/gaping_big
if(50 to 60)
return /datum/wound/cut/gaping
if(25 to 50)
return /datum/wound/cut/flesh
if(15 to 25)
return /datum/wound/cut/deep
if(0 to 15)
return /datum/wound/cut/small
if(BRUISE)
return /datum/wound/bruise
if(BURN)
switch(damage)
if(50 to INFINITY)
return /datum/wound/burn/carbonised
if(40 to 50)
return /datum/wound/burn/deep
if(30 to 40)
return /datum/wound/burn/severe
if(15 to 30)
return /datum/wound/burn/large
if(0 to 15)
return /datum/wound/burn/moderate
return null //no wound
/** CUTS **/ /** CUTS **/
/datum/wound/cut/small /datum/wound/cut/small
// link wound descriptions to amounts of damage // link wound descriptions to amounts of damage
@@ -220,7 +258,7 @@
damage_type = CUT damage_type = CUT
/datum/wound/cut/flesh /datum/wound/cut/flesh
max_bleeding_stage = 3 max_bleeding_stage = 4
stages = list("ugly ripped flesh wound" = 35, "ugly flesh wound" = 30, "flesh wound" = 25, "blood soaked clot" = 15, "large scab" = 5, "fresh skin" = 0) stages = list("ugly ripped flesh wound" = 35, "ugly flesh wound" = 30, "flesh wound" = 25, "blood soaked clot" = 15, "large scab" = 5, "fresh skin" = 0)
damage_type = CUT damage_type = CUT
@@ -249,25 +287,26 @@ datum/wound/cut/massive
/** BURNS **/ /** BURNS **/
/datum/wound/burn/moderate /datum/wound/burn/moderate
stages = list("ripped burn" = 10, "moderate burn" = 5, "moderate salved burn" = 2, "fresh skin" = 0) stages = list("ripped burn" = 10, "moderate burn" = 5, "healing moderate burn" = 2, "fresh skin" = 0)
damage_type = BURN damage_type = BURN
/datum/wound/burn/large /datum/wound/burn/large
stages = list("ripped large burn" = 20, "large burn" = 15, "large salved burn" = 5, "fresh skin" = 0) stages = list("ripped large burn" = 20, "large burn" = 15, "healing large burn" = 5, "fresh skin" = 0)
damage_type = BURN damage_type = BURN
/datum/wound/burn/severe /datum/wound/burn/severe
stages = list("ripped severe burn" = 35, "severe burn" = 30, "severe salved burn" = 10, "burn scar" = 0) stages = list("ripped severe burn" = 35, "severe burn" = 30, "healing severe burn" = 10, "burn scar" = 0)
damage_type = BURN damage_type = BURN
/datum/wound/burn/deep /datum/wound/burn/deep
stages = list("ripped deep burn" = 45, "deep burn" = 40, "deep salved burn" = 15, "large burn scar" = 0) stages = list("ripped deep burn" = 45, "deep burn" = 40, "healing deep burn" = 15, "large burn scar" = 0)
damage_type = BURN damage_type = BURN
/datum/wound/burn/carbonised /datum/wound/burn/carbonised
stages = list("carbonised area" = 50, "treated carbonised area" = 20, "massive burn scar" = 0) stages = list("carbonised area" = 50, "healing carbonised area" = 20, "massive burn scar" = 0)
damage_type = BURN damage_type = BURN
/** INTERNAL BLEEDING **/
/datum/wound/internal_bleeding /datum/wound/internal_bleeding
internal = 1 internal = 1
stages = list("severed artery" = 30, "cut artery" = 20, "damaged artery" = 10, "bruised artery" = 5) stages = list("severed artery" = 30, "cut artery" = 20, "damaged artery" = 10, "bruised artery" = 5)

View File

@@ -35,6 +35,9 @@
/obj/machinery/power/smes/New() /obj/machinery/power/smes/New()
..() ..()
spawn(5) spawn(5)
if(!powernet)
connect_to_network()
dir_loop: dir_loop:
for(var/d in cardinal) for(var/d in cardinal)
var/turf/T = get_step(src, d) var/turf/T = get_step(src, d)
@@ -46,6 +49,8 @@
stat |= BROKEN stat |= BROKEN
return return
terminal.master = src terminal.master = src
if(!terminal.powernet)
terminal.connect_to_network()
updateicon() updateicon()
return return

View File

@@ -1099,8 +1099,7 @@ datum
else if(!alien || alien != IS_DIONA) else if(!alien || alien != IS_DIONA)
M.adjustOxyLoss(-2*REM) M.adjustOxyLoss(-2*REM)
if(holder.has_reagent("lexorin")) holder.remove_reagent("lexorin", 2*REM)
holder.remove_reagent("lexorin", 2*REM)
..() ..()
return return
@@ -1123,8 +1122,7 @@ datum
else if(!alien || alien != IS_DIONA) else if(!alien || alien != IS_DIONA)
M.adjustOxyLoss(-M.getOxyLoss()) M.adjustOxyLoss(-M.getOxyLoss())
if(holder.has_reagent("lexorin")) holder.remove_reagent("lexorin", 2*REM)
holder.remove_reagent("lexorin", 2*REM)
..() ..()
return return
@@ -1221,8 +1219,7 @@ datum
M.AdjustParalysis(-1) M.AdjustParalysis(-1)
M.AdjustStunned(-1) M.AdjustStunned(-1)
M.AdjustWeakened(-1) M.AdjustWeakened(-1)
if(holder.has_reagent("mindbreaker")) holder.remove_reagent("mindbreaker", 5)
holder.remove_reagent("mindbreaker", 5)
M.hallucination = max(0, M.hallucination - 10) M.hallucination = max(0, M.hallucination - 10)
if(prob(60)) M.adjustToxLoss(1) if(prob(60)) M.adjustToxLoss(1)
..() ..()
@@ -1315,7 +1312,7 @@ datum
var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"] var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
if(istype(E)) if(istype(E))
if(E.damage > 0) if(E.damage > 0)
E.damage -= 1 E.damage = max(E.damage - 1, 0)
..() ..()
return return
@@ -1336,7 +1333,7 @@ datum
//Peridaxon is hard enough to get, it's probably fair to make this all internal organs //Peridaxon is hard enough to get, it's probably fair to make this all internal organs
for(var/datum/organ/internal/I in H.internal_organs) for(var/datum/organ/internal/I in H.internal_organs)
if(I.damage > 0) if(I.damage > 0)
I.damage -= 0.20 I.damage = max(I.damage - 0.20, 0)
..() ..()
return return
@@ -1600,8 +1597,7 @@ datum
on_mob_life(var/mob/living/M as mob) on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom if(!M) M = holder.my_atom
if(holder.has_reagent("inaprovaline")) holder.remove_reagent("inaprovaline", 2*REM)
holder.remove_reagent("inaprovaline", 2*REM)
..() ..()
return return
reaction_obj(var/obj/O, var/volume) reaction_obj(var/obj/O, var/volume)
@@ -2052,7 +2048,7 @@ datum
on_mob_life(var/mob/living/M as mob) on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom if(!M) M = holder.my_atom
M.nutrition -= nutriment_factor M.nutrition = max(M.nutrition - nutriment_factor, 0)
M.overeatduration = 0 M.overeatduration = 0
if(M.nutrition < 0)//Prevent from going into negatives. if(M.nutrition < 0)//Prevent from going into negatives.
M.nutrition = 0 M.nutrition = 0
@@ -2202,25 +2198,14 @@ datum
color = "#B31008" // rgb: 139, 166, 233 color = "#B31008" // rgb: 139, 166, 233
on_mob_life(var/mob/living/M as mob) on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom if(!M)
if(!data) data = 1 M = holder.my_atom
switch(data) M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0)
if(1 to 15) if(prob(1))
M.bodytemperature -= 5 * TEMPERATURE_DAMAGE_COEFFICIENT M.emote("shiver")
if(holder.has_reagent("capsaicin")) if(istype(M, /mob/living/carbon/slime))
holder.remove_reagent("capsaicin", 5) M.bodytemperature = max(M.bodytemperature - rand(10,20), 0)
if(istype(M, /mob/living/carbon/slime)) holder.remove_reagent("capsaicin", 5)
M.bodytemperature -= rand(5,20)
if(15 to 25)
M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature -= rand(10,20)
if(25 to INFINITY)
M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
if(prob(1)) M.emote("shiver")
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature -= rand(15,20)
data++
holder.remove_reagent(src.id, FOOD_METABOLISM) holder.remove_reagent(src.id, FOOD_METABOLISM)
..() ..()
return return
@@ -2629,8 +2614,7 @@ datum
on_mob_life(var/mob/living/M as mob) on_mob_life(var/mob/living/M as mob)
if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0) if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0)
if(holder.has_reagent("capsaicin")) holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM)
holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM)
..() ..()
return return
@@ -2673,7 +2657,7 @@ datum
on_mob_life(var/mob/living/M as mob) on_mob_life(var/mob/living/M as mob)
..() ..()
M.make_jittery(5) M.make_jittery(5)
if(adj_temp > 0 && holder.has_reagent("frostoil")) if(adj_temp > 0)
holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM) holder.remove_reagent("frostoil", 10*REAGENTS_METABOLISM)
holder.remove_reagent(src.id, 0.1) holder.remove_reagent(src.id, 0.1)
@@ -2843,25 +2827,14 @@ datum
adj_temp = -9 adj_temp = -9
on_mob_life(var/mob/living/M as mob) on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom if(!M)
if(!data) data = 1 M = holder.my_atom
switch(data) if(prob(1))
if(1 to 15) M.emote("shiver")
M.bodytemperature -= 5 * TEMPERATURE_DAMAGE_COEFFICIENT M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0)
if(holder.has_reagent("capsaicin")) if(istype(M, /mob/living/carbon/slime))
holder.remove_reagent("capsaicin", 5) M.bodytemperature = max(M.bodytemperature - rand(10,20), 0)
if(istype(M, /mob/living/carbon/slime)) holder.remove_reagent("capsaicin", 5)
M.bodytemperature -= rand(5,20)
if(15 to 25)
M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature -= rand(10,20)
if(25 to INFINITY)
M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
if(prob(1)) M.emote("shiver")
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature -= rand(15,20)
data++
holder.remove_reagent(src.id, FOOD_METABOLISM) holder.remove_reagent(src.id, FOOD_METABOLISM)
..() ..()
return return

View File

@@ -94,6 +94,7 @@
spawn(5) src.reagents.clear_reagents() spawn(5) src.reagents.clear_reagents()
return return
else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
target.add_fingerprint(user)
if(!target.reagents.total_volume && target.reagents) if(!target.reagents.total_volume && target.reagents)
user << "\red [target] is empty." user << "\red [target] is empty."

View File

@@ -114,11 +114,14 @@
overlays = new/list() overlays = new/list()
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob)
src.add_fingerprint(user)
if (istype(W,/obj/item/weapon/wrench)) if (istype(W,/obj/item/weapon/wrench))
user.visible_message("[user] wrenches [src]'s faucet [modded ? "closed" : "open"].", \ user.visible_message("[user] wrenches [src]'s faucet [modded ? "closed" : "open"].", \
"You wrench [src]'s faucet [modded ? "closed" : "open"]") "You wrench [src]'s faucet [modded ? "closed" : "open"]")
modded = modded ? 0 : 1 modded = modded ? 0 : 1
if (modded) if (modded)
message_admins("[key_name_admin(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>)")
log_game("[key_name(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel.")
leak_fuel(amount_per_transfer_from_this) leak_fuel(amount_per_transfer_from_this)
if (istype(W,/obj/item/device/assembly_holder)) if (istype(W,/obj/item/device/assembly_holder))
if (rig) if (rig)
@@ -130,8 +133,8 @@
var/obj/item/device/assembly_holder/H = W var/obj/item/device/assembly_holder/H = W
if (istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter)) if (istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter))
message_admins("[key_name_admin(user)] rigged fueltank at ([loc.x],[loc.y],[loc.z]) for explosion.") message_admins("[key_name_admin(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>)")
log_game("[key_name(user)] rigged fueltank at ([loc.x],[loc.y],[loc.z]) for explosion.") log_game("[key_name(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion.")
rig = W rig = W
user.drop_item() user.drop_item()
@@ -148,8 +151,8 @@
/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) /obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj)
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
if(istype(Proj.firer)) if(istype(Proj.firer))
message_admins("[key_name_admin(Proj.firer)] shot fueltank at ([loc.x],[loc.y],[loc.z]).") message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>).")
log_game("[key_name(Proj.firer)] shot fueltank at ([loc.x],[loc.y],[loc.z]).") log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).")
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
explode() explode()
@@ -185,7 +188,7 @@
amount = min(amount, reagents.total_volume) amount = min(amount, reagents.total_volume)
reagents.remove_reagent("fuel",amount) reagents.remove_reagent("fuel",amount)
new /obj/effect/decal/cleanable/liquid_fuel(src.loc, amount) new /obj/effect/decal/cleanable/liquid_fuel(src.loc, amount,1)
/obj/structure/reagent_dispensers/peppertank /obj/structure/reagent_dispensers/peppertank
name = "Pepper Spray Refiller" name = "Pepper Spray Refiller"

View File

@@ -137,10 +137,3 @@
/datum/computer/file/embedded_program/docking/simple/escape_pod/prepare_for_undocking() /datum/computer/file/embedded_program/docking/simple/escape_pod/prepare_for_undocking()
eject_time = world.time + eject_delay*10 eject_time = world.time + eject_delay*10
/*
/datum/computer/file/embedded_program/docking/simple/escape_pod/ready_for_undocking()
if (world.time < eject_time)
return 0
return ..()
*/

View File

@@ -34,15 +34,14 @@
if (moving_status == SHUTTLE_IDLE) if (moving_status == SHUTTLE_IDLE)
return //someone cancelled the launch return //someone cancelled the launch
moving_status = SHUTTLE_INTRANSIT
move(departing, interim, direction) move(departing, interim, direction)
moving_status = SHUTTLE_INTRANSIT
arrive_time = world.time + travel_time*10 arrive_time = world.time + travel_time*10
while (world.time < arrive_time) while (world.time < arrive_time)
sleep(5) sleep(5)
move(interim, destination, direction) move(interim, destination, direction)
moving_status = SHUTTLE_IDLE moving_status = SHUTTLE_IDLE
/datum/shuttle/proc/dock() /datum/shuttle/proc/dock()
@@ -69,6 +68,8 @@
return 0 return 0
//just moves the shuttle from A to B, if it can be moved //just moves the shuttle from A to B, if it can be moved
//A note to anyone overriding move in a subtype. move() must absolutely not, under any circumstances, fail to move the shuttle.
//If you want to conditionally cancel shuttle launches, that logic must go in short_jump() or long_jump()
/datum/shuttle/proc/move(var/area/origin, var/area/destination, var/direction=null) /datum/shuttle/proc/move(var/area/origin, var/area/destination, var/direction=null)
//world << "move_shuttle() called for [shuttle_tag] leaving [origin] en route to [destination]." //world << "move_shuttle() called for [shuttle_tag] leaving [origin] en route to [destination]."

View File

@@ -244,7 +244,7 @@
if(I && I.damage > 0) if(I && I.damage > 0)
if(I.robotic < 2) if(I.robotic < 2)
user.visible_message("\blue [user] treats damage to [target]'s [I.name] with [tool_name].", \ user.visible_message("\blue [user] treats damage to [target]'s [I.name] with [tool_name].", \
"You treat damage to [target]'s [I.name] with [tool_name]." ) "\blue You treat damage to [target]'s [I.name] with [tool_name]." )
else else
user.visible_message("\blue [user] pokes [target]'s mechanical [I.name] with [tool_name]...", \ user.visible_message("\blue [user] pokes [target]'s mechanical [I.name] with [tool_name]...", \
"\blue You poke [target]'s mechanical [I.name] with [tool_name]... \red For no effect, since it's robotic.") "\blue You poke [target]'s mechanical [I.name] with [tool_name]... \red For no effect, since it's robotic.")

View File

@@ -89,7 +89,7 @@ proc/do_surgery(mob/living/M, mob/living/user, obj/item/tool)
//We had proper tools! (or RNG smiled.) and User did not move or change hands. //We had proper tools! (or RNG smiled.) and User did not move or change hands.
if( prob(S.tool_quality(tool)) && do_mob(user, M, rand(S.min_duration, S.max_duration))) if( prob(S.tool_quality(tool)) && do_mob(user, M, rand(S.min_duration, S.max_duration)))
S.end_step(user, M, user.zone_sel.selecting, tool) //finish successfully S.end_step(user, M, user.zone_sel.selecting, tool) //finish successfully
else //or else if (tool in user.contents && user.Adjacent(M)) //or
S.fail_step(user, M, user.zone_sel.selecting, tool) //malpractice~ S.fail_step(user, M, user.zone_sel.selecting, tool) //malpractice~
return 1 //don't want to do weapony things after surgery return 1 //don't want to do weapony things after surgery
return 0 return 0

View File

@@ -72,9 +72,6 @@
#define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( #define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :(
#define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). #define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value).
#define PRESSURE_SUIT_REDUCTION_COEFFICIENT 0.8 //This is how much (percentual) a suit with the flag STOPSPRESSUREDMAGE reduces pressure.
#define PRESSURE_HEAD_REDUCTION_COEFFICIENT 0.4 //This is how much (percentual) a helmet/hat with the flag STOPSPRESSUREDMAGE reduces pressure.
// Doors! // Doors!
#define DOOR_CRUSH_DAMAGE 10 #define DOOR_CRUSH_DAMAGE 10

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 122 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More