mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-22 20:48:56 +01:00
Merge branch 'master' of https://github.com/tgstation/-tg-station into megaphoney
Conflicts: code/game/objects/structures/crates_lockers/closets/secure/security.dm
This commit is contained in:
+462
-420
File diff suppressed because it is too large
Load Diff
+710
-708
File diff suppressed because it is too large
Load Diff
@@ -15,7 +15,7 @@ z7 = empty space
|
||||
|
||||
#if !defined(MAP_FILE)
|
||||
|
||||
#include "map_files\MetaStation\MetaStation.v40B.dmm"
|
||||
#include "map_files\MetaStation\MetaStation.v40C.dmm"
|
||||
#include "map_files\MetaStation\z2.dmm"
|
||||
#include "map_files\generic\z3.dmm"
|
||||
#include "map_files\generic\z4.dmm"
|
||||
@@ -23,7 +23,7 @@ z7 = empty space
|
||||
#include "map_files\generic\z6.dmm"
|
||||
#include "map_files\generic\z7.dmm"
|
||||
|
||||
#define MAP_FILE "MetaStation.v40B.dmm"
|
||||
#define MAP_FILE "MetaStation.v40C.dmm"
|
||||
#define MAP_NAME "MetaStation"
|
||||
|
||||
#elif !defined(MAP_OVERRIDE)
|
||||
|
||||
@@ -80,3 +80,9 @@
|
||||
#define THERMAL_PROTECTION_ARM_RIGHT 0.075
|
||||
#define THERMAL_PROTECTION_HAND_LEFT 0.025
|
||||
#define THERMAL_PROTECTION_HAND_RIGHT 0.025
|
||||
|
||||
//flags for female outfits: How much the game can safely "take off" the uniform without it looking weird
|
||||
|
||||
#define NO_FEMALE_UNIFORM 0
|
||||
#define FEMALE_UNIFORM_FULL 1
|
||||
#define FEMALE_UNIFORM_TOP 2
|
||||
@@ -11,7 +11,7 @@ var/const/AALARM_WIRE_AALARM = 16
|
||||
|
||||
/datum/wires/alarm/CanUse(var/mob/living/L)
|
||||
var/obj/machinery/alarm/A = holder
|
||||
if(A.panel_open)
|
||||
if(A.panel_open && A.buildstage == 2)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
/obj/effect/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2)
|
||||
blob_cores += src
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
if(!overmind)
|
||||
create_overmind(new_overmind)
|
||||
if(overmind)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
/obj/effect/blob/node/New(loc, var/h = 100)
|
||||
blob_nodes += src
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
..(loc, h)
|
||||
|
||||
/obj/effect/blob/node/adjustcolors(var/a_color)
|
||||
|
||||
@@ -174,6 +174,5 @@ obj/effect/proc_holder/changeling/sting/cryo
|
||||
add_logs(user, target, "stung", object="cryo sting")
|
||||
if(target.reagents)
|
||||
target.reagents.add_reagent("frostoil", 30)
|
||||
target.reagents.add_reagent("ice", 30)
|
||||
feedback_add_details("changeling_powers","CS")
|
||||
return 1
|
||||
@@ -17,6 +17,15 @@ var/bomb_set
|
||||
use_power = 0
|
||||
var/previous_level = ""
|
||||
var/lastentered = ""
|
||||
var/immobile = 0 //Not all nukes should be moved
|
||||
|
||||
/obj/machinery/nuclearbomb/selfdestruct
|
||||
name = "station self-destruct terminal"
|
||||
desc = "For when it all gets too much to bear. Do not taunt."
|
||||
icon = 'icons/obj/machines/bignuke.dmi'
|
||||
anchored = 1 //stops it being moved
|
||||
immobile = 1 //prevents it from ever being moved
|
||||
layer = 4
|
||||
|
||||
/obj/machinery/nuclearbomb/process()
|
||||
if (src.timing)
|
||||
@@ -140,8 +149,10 @@ var/bomb_set
|
||||
src.timing = 0
|
||||
bomb_set = 0
|
||||
if (href_list["anchor"])
|
||||
if(!isinspace())
|
||||
if(!isinspace()&&(!immobile))
|
||||
src.anchored = !( src.anchored )
|
||||
else if(immobile)
|
||||
usr << "<span class='warning'>This device is immovable!</span>"
|
||||
else
|
||||
usr << "<span class='warning'>There is nothing to anchor to!</span>"
|
||||
src.add_fingerprint(usr)
|
||||
@@ -225,7 +236,7 @@ var/bomb_set
|
||||
|
||||
/obj/item/weapon/disk/nuclear/New()
|
||||
..()
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/item/weapon/disk/nuclear/process()
|
||||
var/turf/disk_loc = get_turf(src)
|
||||
|
||||
@@ -12,69 +12,70 @@
|
||||
force = 15
|
||||
throwforce = 10
|
||||
w_class = 3
|
||||
var/charged = 1
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
var/charged = 1
|
||||
var/spawn_type = /obj/singularity/narsie/wizard
|
||||
var/spawn_amt = 1
|
||||
var/activate_descriptor = "reality"
|
||||
var/rend_desc = "You should run now."
|
||||
|
||||
/obj/item/weapon/veilrender/attack_self(mob/user as mob)
|
||||
if(charged)
|
||||
new /obj/effect/rend(get_turf(usr), spawn_type, spawn_amt, rend_desc)
|
||||
charged = 0
|
||||
user.visible_message("<span class='userdanger'>[src] hums with power as [usr] deals a blow to [activate_descriptor] itself!</span>")
|
||||
else
|
||||
user << "<span class='danger'>The unearthly energies that powered the blade are now dormant.</span>"
|
||||
|
||||
/obj/effect/rend
|
||||
name = "tear in the fabric of reality"
|
||||
desc = "You should run now"
|
||||
desc = "You should run now."
|
||||
icon = 'icons/obj/biomass.dmi'
|
||||
icon_state = "rift"
|
||||
density = 1
|
||||
unacidable = 1
|
||||
anchored = 1.0
|
||||
var/spawn_path = /mob/living/simple_animal/cow //defaulty cows to prevent unintentional narsies
|
||||
var/spawn_amt_left = 20
|
||||
|
||||
/obj/effect/rend/New()
|
||||
spawn(50)
|
||||
new /obj/singularity/narsie/wizard(get_turf(src))
|
||||
qdel(src)
|
||||
/obj/effect/rend/New(loc, var/spawn_type, var/spawn_amt, var/desc)
|
||||
src.spawn_path = spawn_type
|
||||
src.spawn_amt_left = spawn_amt
|
||||
src.desc = desc
|
||||
SSobj.processing |= src
|
||||
return
|
||||
|
||||
/obj/effect/rend/process()
|
||||
if(locate(/mob) in loc)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/weapon/veilrender/attack_self(mob/user as mob)
|
||||
if(charged == 1)
|
||||
new /obj/effect/rend(get_turf(usr))
|
||||
charged = 0
|
||||
visible_message("<span class='userdanger'>[src] hums with power as [usr] deals a blow to reality itself!</span>")
|
||||
else
|
||||
user << "<span class='danger'>The unearthly energies that powered the blade are now dormant.</span>"
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/veilrender/vealrender
|
||||
name = "veal render"
|
||||
desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast farm."
|
||||
|
||||
/obj/item/weapon/veilrender/vealrender/attack_self(mob/user as mob)
|
||||
if(charged)
|
||||
new /obj/effect/rend/cow(get_turf(usr))
|
||||
charged = 0
|
||||
visible_message("<span class='userdanger'>[src] hums with power as [usr] deals a blow to hunger itself!</span>")
|
||||
else
|
||||
user << "<span class='danger'>The unearthly energies that powered the blade are now dormant.</span>"
|
||||
|
||||
/obj/effect/rend/cow
|
||||
desc = "Reverberates with the sound of ten thousand moos."
|
||||
var/cowsleft = 20
|
||||
|
||||
/obj/effect/rend/cow/New()
|
||||
SSobj.processing.Add(src)
|
||||
return
|
||||
|
||||
/obj/effect/rend/cow/process()
|
||||
if(locate(/mob) in loc) return
|
||||
new /mob/living/simple_animal/cow(loc)
|
||||
cowsleft--
|
||||
if(cowsleft <= 0)
|
||||
new spawn_path(loc)
|
||||
spawn_amt_left--
|
||||
if(spawn_amt_left <= 0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/rend/cow/attackby(obj/item/I as obj, mob/user as mob)
|
||||
/obj/effect/rend/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I, /obj/item/weapon/nullrod))
|
||||
visible_message("<span class='danger'>[I] strikes a blow against \the [src], banishing it!</span>")
|
||||
user.visible_message("<span class='danger'>[usr] seals \the [src] with \the [I].</span>")
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/veilrender/vealrender
|
||||
name = "veal render"
|
||||
desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast farm."
|
||||
spawn_type = /mob/living/simple_animal/cow
|
||||
spawn_amt = 20
|
||||
activate_descriptor = "hunger"
|
||||
rend_desc = "Reverberates with the sound of ten thousand moos."
|
||||
|
||||
/obj/item/weapon/veilrender/honkrender
|
||||
name = "honk render"
|
||||
desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus."
|
||||
spawn_type = /mob/living/simple_animal/hostile/retaliate/clown
|
||||
spawn_amt = 10
|
||||
activate_descriptor = "depression"
|
||||
rend_desc = "Gently wafting with the sounds of endless laughter."
|
||||
icon_state = "clownrender"
|
||||
|
||||
/////////////////////////////////////////Scrying///////////////////
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@ Roboticist
|
||||
|
||||
default_pda = /obj/item/device/pda/roboticist
|
||||
default_headset = /obj/item/device/radio/headset/headset_sci
|
||||
default_pda_slot = slot_l_store
|
||||
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research, access_mineral_storeroom, access_xenobiology, access_genetics)
|
||||
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research, access_mineral_storeroom)
|
||||
@@ -89,4 +90,4 @@ Roboticist
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/labcoat(H), slot_wear_suit)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(H), slot_l_hand)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
|
||||
@@ -664,10 +664,7 @@ table tr:first-child th:first-child { border: none;}
|
||||
if(panel_open)
|
||||
switch(buildstage)
|
||||
if(2)
|
||||
if(wires.wires_status == (2 ** wires.wire_count) - 1) // All wires cut
|
||||
icon_state = "alarm_b2"
|
||||
else
|
||||
icon_state = "alarmx"
|
||||
icon_state = "alarmx"
|
||||
if(1)
|
||||
icon_state = "alarm_b2"
|
||||
if(0)
|
||||
@@ -773,7 +770,7 @@ table tr:first-child th:first-child { border: none;}
|
||||
/obj/machinery/alarm/attackby(obj/item/W as obj, mob/user as mob)
|
||||
switch(buildstage)
|
||||
if(2)
|
||||
if(istype(W, /obj/item/weapon/wirecutters) && wires.wires_status == (2 ** wires.wire_count) - 1) //this checks for all wires to be cut, disregard the ammount of wires, binary fuckery with the wires_status
|
||||
if(istype(W, /obj/item/weapon/wirecutters) && panel_open && (wires.wires_status == 27 || wires.wires_status == 31)) //this checks for all wires to be cut, except the syphon wire which is optional.
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
|
||||
user << "You cut the final wires."
|
||||
var/obj/item/stack/cable_coil/cable = new /obj/item/stack/cable_coil( src.loc )
|
||||
@@ -803,12 +800,12 @@ table tr:first-child th:first-child { border: none;}
|
||||
user << "<span class='warning'>Access denied.</span>"
|
||||
return
|
||||
if(1)
|
||||
if(istype(W, /obj/item/weapon/crowbar) && wires.wires_status == (2 ** wires.wire_count) - 1)
|
||||
if(istype(W, /obj/item/weapon/crowbar))
|
||||
user.visible_message("<span class='warning'>[user.name] removes the electronics from [src.name].</span>",\
|
||||
"You start prying out the circuit.")
|
||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
if (do_after(user, 20))
|
||||
if (buildstage ==1)
|
||||
if (buildstage == 1)
|
||||
user <<"<span class='notice'>You remove the air alarm electronics.</span>"
|
||||
new /obj/item/weapon/airalarm_electronics( src.loc )
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
@@ -828,6 +825,11 @@ table tr:first-child th:first-child { border: none;}
|
||||
cable.use(5)
|
||||
user << "<span class='notice'>You wire the air alarm.</span>"
|
||||
wires.wires_status = 0
|
||||
aidisabled = 0
|
||||
locked = 1
|
||||
mode = 1
|
||||
shorted = 0
|
||||
post_alert(0)
|
||||
buildstage = 2
|
||||
update_icon()
|
||||
return
|
||||
@@ -1159,7 +1161,7 @@ FIRE ALARM
|
||||
else if (href_list["time"])
|
||||
src.timing = text2num(href_list["time"])
|
||||
last_process = world.timeofday
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
else if (href_list["tp"])
|
||||
var/tp = text2num(href_list["tp"])
|
||||
src.time += tp
|
||||
|
||||
@@ -19,7 +19,6 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
var/aistate = STATE_DEFAULT
|
||||
var/message_cooldown = 0
|
||||
var/ai_message_cooldown = 0
|
||||
var/centcom_message_cooldown = 0
|
||||
var/tmp_alertlevel = 0
|
||||
var/const/STATE_DEFAULT = 1
|
||||
var/const/STATE_CALLSHUTTLE = 2
|
||||
@@ -113,6 +112,8 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
if("announce")
|
||||
if(src.authenticated==2 && !message_cooldown)
|
||||
make_announcement(usr)
|
||||
else if (src.authenticated==2 && message_cooldown)
|
||||
usr << "Intercomms recharging. Please stand by."
|
||||
|
||||
if("callshuttle")
|
||||
src.state = STATE_DEFAULT
|
||||
@@ -203,7 +204,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
if(CM.cooldownLeft())
|
||||
usr << "Arrays recycling. Please stand by."
|
||||
return
|
||||
var/input = stripped_input(usr, "Please choose a message to transmit to Centcom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "")
|
||||
var/input = stripped_input(usr, "Please choose a message to transmit to Centcom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to Centcomm.", "")
|
||||
if(!input || !(usr in view(1,src)))
|
||||
return
|
||||
Centcomm_announce(input, usr)
|
||||
@@ -218,18 +219,33 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
if(CM.cooldownLeft())
|
||||
usr << "Arrays recycling. Please stand by."
|
||||
return
|
||||
var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING COORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "")
|
||||
var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING COORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to /??????/.", "")
|
||||
if(!input || !(usr in view(1,src)))
|
||||
return
|
||||
Syndicate_announce(input, usr)
|
||||
usr << "Message transmitted."
|
||||
log_say("[key_name(usr)] has made a Syndicate announcement: [input]")
|
||||
CM.lastTimeUsed = world.time
|
||||
|
||||
if("RestoreBackup")
|
||||
usr << "Backup routing data restored!"
|
||||
src.emagged = 0
|
||||
src.updateDialog()
|
||||
|
||||
if("nukerequest") //When there's no other way
|
||||
if(src.authenticated==2)
|
||||
if(CM.cooldownLeft())
|
||||
usr << "Arrays recycling. Please stand by."
|
||||
return
|
||||
var/input = stripped_input(usr, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.","")
|
||||
if(!input || !(usr in view(1,src)))
|
||||
return
|
||||
Nuke_request(input, usr)
|
||||
usr << "Request sent."
|
||||
log_say("[key_name(usr)] has requested the nuclear codes from Centcomm")
|
||||
priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/AI/commandreport.ogg')
|
||||
|
||||
CM.lastTimeUsed = world.time
|
||||
|
||||
|
||||
// AI interface
|
||||
@@ -371,6 +387,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=announce'>Make a Captain's Announcement</A> \]"
|
||||
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=changeseclevel'>Change Alert Level</A> \]"
|
||||
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=emergencyaccess'>Emergency Maintenance Access</A> \]"
|
||||
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=nukerequest'>Request Nuclear Authentication Codes</A> \]"
|
||||
if(src.emagged == 0)
|
||||
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageCentcomm'>Send Message to Centcom</A> \]"
|
||||
else
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/iv_drip/update_icon()
|
||||
if(src.attached)
|
||||
if(attached)
|
||||
if(mode)
|
||||
icon_state = "injecting"
|
||||
else
|
||||
@@ -48,63 +48,67 @@
|
||||
filling.icon += mix_color_from_reagents(beaker.reagents.reagent_list)
|
||||
overlays += filling
|
||||
|
||||
/obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location)
|
||||
..()
|
||||
|
||||
if(!ishuman(over_object))
|
||||
usr << "<span class='warning'>The drip beeps: Warning, human patients only!</span>"
|
||||
|
||||
if(attached)
|
||||
visible_message("[src.attached] is detached from \the [src]")
|
||||
src.attached = null
|
||||
src.update_icon()
|
||||
/obj/machinery/iv_drip/MouseDrop(mob/living/target)
|
||||
if(!ishuman(usr) || !usr.canUseTopic(src,BE_CLOSE))
|
||||
return
|
||||
|
||||
if(in_range(src, usr) && ishuman(over_object) && get_dist(over_object, src) <= 1)
|
||||
if(src.beaker)
|
||||
visible_message("[usr] attaches \the [src] to \the [over_object].")
|
||||
src.attached = over_object
|
||||
src.update_icon()
|
||||
if(attached)
|
||||
visible_message("[attached] is detached from \the [src]")
|
||||
attached = null
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(!ishuman(target))
|
||||
usr << "<span class='warning'>The drip beeps: Warning, human patients only!</span>"
|
||||
return
|
||||
|
||||
if(Adjacent(target) && usr.Adjacent(target))
|
||||
if(beaker)
|
||||
visible_message("[usr] attaches \the [src] to \the [target].")
|
||||
attached = target
|
||||
SSmachine.processing.Add(src)
|
||||
update_icon()
|
||||
else
|
||||
usr << "There's nothing attached to the IV drip!"
|
||||
|
||||
|
||||
/obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/reagent_containers))
|
||||
if(!isnull(src.beaker))
|
||||
if(!isnull(beaker))
|
||||
user << "There is already a reagent container loaded!"
|
||||
return
|
||||
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
src.beaker = W
|
||||
beaker = W
|
||||
user << "You attach \the [W] to \the [src]."
|
||||
src.update_icon()
|
||||
update_icon()
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/iv_drip/process()
|
||||
if(src.attached)
|
||||
if(!attached)
|
||||
return PROCESS_KILL
|
||||
|
||||
if(!(get_dist(src, src.attached) <= 1 && isturf(src.attached.loc)))
|
||||
attached << "<span class='warning'>The IV drip needle is ripped out of you, doesn't that hurt?</span>"
|
||||
src.attached:apply_damage(3, BRUTE, pick("r_arm", "l_arm"))
|
||||
src.attached = null
|
||||
src.update_icon()
|
||||
return
|
||||
if(!(get_dist(src, attached) <= 1 && isturf(attached.loc)))
|
||||
attached << "<span class='warning'>The IV drip needle is ripped out of you, doesn't that hurt?</span>"
|
||||
attached.apply_damage(3, BRUTE, pick("r_arm", "l_arm"))
|
||||
attached = null
|
||||
update_icon()
|
||||
return PROCESS_KILL
|
||||
|
||||
if(src.attached && src.beaker)
|
||||
if(beaker)
|
||||
// Give blood
|
||||
if(mode)
|
||||
if(src.beaker.volume > 0)
|
||||
if(beaker.volume > 0)
|
||||
var/transfer_amount = REAGENTS_METABOLISM
|
||||
if(istype(src.beaker, /obj/item/weapon/reagent_containers/blood))
|
||||
if(istype(beaker, /obj/item/weapon/reagent_containers/blood))
|
||||
// speed up transfer on blood packs
|
||||
transfer_amount = 4
|
||||
src.beaker.reagents.reaction(src.attached, INGEST, 0,0) //make reagents reacts, but don't spam messages
|
||||
src.beaker.reagents.trans_to(src.attached, transfer_amount)
|
||||
beaker.reagents.reaction(attached, INGEST, 0,0) //make reagents reacts, but don't spam messages
|
||||
beaker.reagents.trans_to(attached, transfer_amount)
|
||||
update_icon()
|
||||
|
||||
// Take blood
|
||||
@@ -130,7 +134,7 @@
|
||||
// If the human is losing too much blood, beep.
|
||||
if(T.vessel.get_reagent_amount("blood") < BLOOD_VOLUME_SAFE) if(prob(5))
|
||||
visible_message("\The [src] beeps loudly.")
|
||||
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1)
|
||||
playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
|
||||
var/datum/reagent/B = T.take_blood(beaker,amount)
|
||||
|
||||
if (B)
|
||||
@@ -141,12 +145,12 @@
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/iv_drip/attack_hand(mob/user)
|
||||
if(src.attached)
|
||||
visible_message("[src.attached] is detached from \the [src]")
|
||||
src.attached = null
|
||||
if(attached)
|
||||
visible_message("[attached] is detached from \the [src]")
|
||||
attached = null
|
||||
update_icon()
|
||||
return
|
||||
else if(src.beaker)
|
||||
else if(beaker)
|
||||
eject_beaker(user)
|
||||
else
|
||||
toggle_mode()
|
||||
@@ -163,9 +167,9 @@
|
||||
if(usr.stat)
|
||||
return
|
||||
|
||||
if(src.beaker)
|
||||
src.beaker.loc = get_turf(src)
|
||||
src.beaker = null
|
||||
if(beaker)
|
||||
beaker.loc = get_turf(src)
|
||||
beaker = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/iv_drip/verb/toggle_mode()
|
||||
@@ -187,7 +191,7 @@
|
||||
/obj/machinery/iv_drip/examine()
|
||||
set src in view()
|
||||
..()
|
||||
if (!(usr in view(2)) && usr!=src.loc) return
|
||||
if (!(usr in view(2)) && usr!=loc) return
|
||||
|
||||
usr << "The IV drip is [mode ? "injecting" : "taking blood"]."
|
||||
|
||||
|
||||
@@ -979,7 +979,7 @@
|
||||
/obj/item/clothing/under/plaid_skirt=1,/obj/item/clothing/under/plaid_skirt/blue=1,/obj/item/clothing/under/plaid_skirt/purple=1,
|
||||
/obj/item/clothing/glasses/regular=2,/obj/item/clothing/head/sombrero=1,/obj/item/clothing/suit/poncho=1,
|
||||
/obj/item/clothing/suit/ianshirt=1,/obj/item/clothing/shoes/laceup=2,/obj/item/clothing/shoes/sneakers/black=4,
|
||||
/obj/item/clothing/shoes/sandal=1,
|
||||
/obj/item/clothing/shoes/sandal=1, /obj/item/clothing/gloves/fingerless=2,
|
||||
/obj/item/weapon/storage/belt/fannypack=1, /obj/item/weapon/storage/belt/fannypack/blue=1, /obj/item/weapon/storage/belt/fannypack/red=1)
|
||||
contraband = list(/obj/item/clothing/under/syndicate/tacticool=1,/obj/item/clothing/mask/balaclava=1,/obj/item/clothing/head/ushanka=1,/obj/item/clothing/under/soviet=1,/obj/item/weapon/storage/belt/fannypack/black=1)
|
||||
premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/under/pants/mustangjeans=1)
|
||||
|
||||
@@ -481,7 +481,7 @@
|
||||
return 0
|
||||
occupant_message("Analyzing reagents...")
|
||||
for(var/datum/reagent/R in A.reagents.reagent_list)
|
||||
if(R.reagent_state == 2 && add_known_reagent(R.id,R.name))
|
||||
if(R.can_synth && add_known_reagent(R.id,R.name))
|
||||
occupant_message("Reagent analyzed, identified as [R.name] and added to database.")
|
||||
send_byjax(chassis.occupant,"msyringegun.browser","reagents_form",get_reagents_form())
|
||||
occupant_message("Analyzis complete.")
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,51 @@
|
||||
/* This is an attempt to make some easily reusable "particle" type effect, to stop the code
|
||||
constantly having to be rewritten. An item like the jetpack that uses the ion_trail_follow system, just has one
|
||||
defined, then set up when it is created with New(). Then this same system can just be reused each time
|
||||
it needs to create more trails.A beaker could have a steam_trail_follow system set up, then the steam
|
||||
would spawn and follow the beaker, even if it is carried or thrown.
|
||||
*/
|
||||
|
||||
|
||||
/obj/effect/effect
|
||||
name = "effect"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
mouse_opacity = 0
|
||||
unacidable = 1//So effect are not targeted by alien acid.
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
|
||||
/obj/effect/proc/delete()
|
||||
loc = null
|
||||
if(reagents)
|
||||
reagents.delete()
|
||||
return
|
||||
|
||||
/datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16)
|
||||
if(A.alpha == 0) //Handle already transparent case
|
||||
return
|
||||
if(frames == 0)
|
||||
frames = 1 //We will just assume that by 0 frames, the coder meant "during one frame".
|
||||
var/step = A.alpha / frames
|
||||
for(var/i = 0, i < frames, i++)
|
||||
A.alpha -= step
|
||||
sleep(world.tick_lag)
|
||||
return
|
||||
|
||||
/datum/effect/effect/system
|
||||
var/number = 3
|
||||
var/cardinals = 0
|
||||
var/turf/location
|
||||
var/atom/holder
|
||||
var/setup = 0
|
||||
|
||||
/datum/effect/effect/system/proc/set_up(n = 3, c = 0, turf/loc)
|
||||
if(n > 10)
|
||||
n = 10
|
||||
number = n
|
||||
cardinals = c
|
||||
location = loc
|
||||
setup = 1
|
||||
|
||||
/datum/effect/effect/system/proc/attach(atom/atom)
|
||||
holder = atom
|
||||
|
||||
/datum/effect/effect/system/proc/start()
|
||||
@@ -0,0 +1,250 @@
|
||||
// Foam
|
||||
// Similar to smoke, but spreads out more
|
||||
|
||||
/obj/effect/effect/foam
|
||||
name = "foam"
|
||||
icon_state = "foam"
|
||||
opacity = 0
|
||||
anchored = 1
|
||||
density = 0
|
||||
layer = TURF_LAYER + 0.1
|
||||
mouse_opacity = 0
|
||||
var/amount = 3
|
||||
var/expand = 1
|
||||
animate_movement = 0
|
||||
var/metal = 0
|
||||
var/lifetime = 6
|
||||
|
||||
|
||||
/obj/effect/effect/foam/metal/aluminium
|
||||
name = "aluminium foam"
|
||||
metal = 1
|
||||
icon_state = "mfoam"
|
||||
|
||||
|
||||
/obj/effect/effect/foam/metal/iron
|
||||
name = "iron foam"
|
||||
metal = 2
|
||||
|
||||
|
||||
/obj/effect/effect/foam/New(loc)
|
||||
..(loc)
|
||||
create_reagents(1000) //limited by the size of the reagent holder anyway.
|
||||
SSobj.processing.Add(src)
|
||||
playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3)
|
||||
|
||||
|
||||
/obj/effect/effect/foam/metal/New(loc)
|
||||
..()
|
||||
var/obj/structure/foamedmetal/M = new(src.loc)
|
||||
M.metal = metal
|
||||
M.updateicon()
|
||||
|
||||
|
||||
/obj/effect/effect/foam/proc/kill_foam()
|
||||
SSobj.processing.Remove(src)
|
||||
flick("[icon_state]-disolve", src)
|
||||
spawn(5)
|
||||
delete()
|
||||
|
||||
|
||||
/obj/effect/effect/foam/process()
|
||||
lifetime--
|
||||
if(lifetime < 1)
|
||||
kill_foam()
|
||||
if(--amount < 0)
|
||||
return
|
||||
for(var/atom/M in view(1,src))
|
||||
if(M == src)
|
||||
continue
|
||||
reagents.reaction(M, TOUCH)
|
||||
spread_foam()
|
||||
|
||||
|
||||
/obj/effect/effect/foam/Crossed(var/atom/movable/AM)
|
||||
if(istype(AM, /mob/living/carbon))
|
||||
var/mob/living/carbon/M = AM
|
||||
M.slip(5, 2, src)
|
||||
|
||||
|
||||
/obj/effect/effect/foam/metal/Crossed(var/atom/movable/AM)
|
||||
return
|
||||
|
||||
|
||||
/obj/effect/effect/foam/proc/spread_foam()
|
||||
for(var/direction in cardinal)
|
||||
var/turf/T = get_step(src,direction)
|
||||
if(!T)
|
||||
continue
|
||||
|
||||
if(!T.Enter(src))
|
||||
continue
|
||||
|
||||
var/obj/effect/effect/foam/foundfoam = locate() in T //Don't spread foam where there's already foam!
|
||||
if(foundfoam)
|
||||
continue
|
||||
|
||||
var/obj/effect/effect/foam/F = new type(T)
|
||||
F.amount = amount
|
||||
reagents.copy_to(F, (reagents.total_volume))
|
||||
F.color = color
|
||||
|
||||
|
||||
/obj/effect/effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(prob(max(0, exposed_temperature - 475))) //foam dissolves when heated
|
||||
kill_foam()
|
||||
|
||||
|
||||
/obj/effect/effect/foam/metal/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
return
|
||||
|
||||
|
||||
///////////////////////////////////////////////
|
||||
//FOAM EFFECT DATUM
|
||||
/datum/effect/effect/system/foam_spread
|
||||
var/amount = 5 // the size of the foam spread.
|
||||
var/obj/chemholder
|
||||
var/obj/effect/effect/foam/foamtype = /obj/effect/effect/foam
|
||||
var/metal = 0
|
||||
|
||||
|
||||
/datum/effect/effect/system/foam_spread/metal
|
||||
foamtype = /obj/effect/effect/foam/metal
|
||||
|
||||
|
||||
/datum/effect/effect/system/foam_spread/New()
|
||||
..()
|
||||
chemholder = new/obj()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
chemholder.reagents = R
|
||||
R.my_atom = chemholder
|
||||
|
||||
|
||||
/datum/effect/effect/system/foam_spread/set_up(amt=5, loca, var/datum/reagents/carry = null)
|
||||
if(istype(loca, /turf/))
|
||||
location = loca
|
||||
else
|
||||
location = get_turf(loca)
|
||||
|
||||
amount = round(sqrt(amt / 3), 1)
|
||||
carry.copy_to(chemholder, carry.total_volume)
|
||||
|
||||
|
||||
/datum/effect/effect/system/foam_spread/metal/set_up(amt=5, loca, var/datum/reagents/carry = null, var/metaltype)
|
||||
..()
|
||||
metal = metaltype
|
||||
|
||||
/datum/effect/effect/system/foam_spread/start()
|
||||
var/obj/effect/effect/foam/foundfoam = locate()
|
||||
if(foundfoam)//If there was already foam where we start, we add our foaminess to it.
|
||||
foundfoam.amount += amount
|
||||
else
|
||||
var/obj/effect/effect/foam/F = new foamtype(src.location)
|
||||
var/foamcolor = mix_color_from_reagents(chemholder.reagents.reagent_list)
|
||||
chemholder.reagents.copy_to(F, chemholder.reagents.total_volume)
|
||||
F.color = foamcolor
|
||||
F.amount = amount
|
||||
F.metal = metal
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// FOAM STRUCTURE. Formed by metal foams. Dense and opaque, but easy to break
|
||||
/obj/structure/foamedmetal
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "metalfoam"
|
||||
density = 1
|
||||
opacity = 1 // changed in New()
|
||||
anchored = 1
|
||||
unacidable = 1
|
||||
name = "foamed metal"
|
||||
desc = "A lightweight foamed metal wall."
|
||||
gender = PLURAL
|
||||
var/metal = 1 // 1=aluminium, 2=iron
|
||||
|
||||
/obj/structure/foamedmetal/New()
|
||||
..()
|
||||
air_update_turf(1)
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/Destroy()
|
||||
density = 0
|
||||
air_update_turf(1)
|
||||
..()
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/Move()
|
||||
var/turf/T = loc
|
||||
..()
|
||||
move_update_air(T)
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/proc/updateicon()
|
||||
if(metal == 1)
|
||||
icon_state = "metalfoam"
|
||||
else
|
||||
icon_state = "ironfoam"
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/ex_act(severity, target)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/blob_act()
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/bullet_act()
|
||||
..()
|
||||
if(metal==1 || prob(50))
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/attack_paw(var/mob/user)
|
||||
attack_hand(user)
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/attack_animal(var/mob/living/simple_animal/M)
|
||||
if(M.environment_smash >= 1)
|
||||
M.do_attack_animation(src)
|
||||
M << "<span class='notice'>You smash apart the foam wall.</span>"
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/attack_hulk(mob/living/carbon/human/user)
|
||||
..(user, 1)
|
||||
if(prob(75 - metal*25))
|
||||
user.visible_message("<span class='danger'>[user] smashes through the foamed metal.</span>", \
|
||||
"<span class='danger'>You smash through the metal foam wall.</span>")
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/attack_hand(var/mob/user)
|
||||
user << "<span class='notice'>You hit the metal foam but bounce off it.</span>"
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/attackby(var/obj/item/I, var/mob/user)
|
||||
if (istype(I, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = I
|
||||
G.affecting.loc = src.loc
|
||||
visible_message("<span class='danger'>[G.assailant] smashes [G.affecting] through the foamed metal wall.</span>")
|
||||
qdel(I)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(prob(I.force*20 - metal*25))
|
||||
user.visible_message("<span class='danger'>[user] smashes through the foamed metal.</span>", \
|
||||
"<span class='danger'>You smash through the foamed metal with \the [I].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
user << "<span class='notice'>You hit the metal foam to no effect.</span>"
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5)
|
||||
return !density
|
||||
|
||||
|
||||
/obj/structure/foamedmetal/CanAtmosPass()
|
||||
return !density
|
||||
@@ -0,0 +1,105 @@
|
||||
|
||||
/////////////////////////////////////////////
|
||||
//////// Attach an Ion trail to any object, that spawns when it moves (like for the jetpack)
|
||||
/// just pass in the object to attach it to in set_up
|
||||
/// Then do start() to start it and stop() to stop it, obviously
|
||||
/// and don't call start() in a loop that will be repeated otherwise it'll get spammed!
|
||||
/////////////////////////////////////////////
|
||||
|
||||
/obj/effect/effect/ion_trails
|
||||
name = "ion trails"
|
||||
icon_state = "ion_trails"
|
||||
anchored = 1.0
|
||||
|
||||
/datum/effect/effect/system/ion_trail_follow
|
||||
var/turf/oldposition
|
||||
var/processing = 1
|
||||
var/on = 1
|
||||
|
||||
/datum/effect/effect/system/ion_trail_follow/set_up(atom/atom)
|
||||
attach(atom)
|
||||
|
||||
|
||||
/datum/effect/effect/system/ion_trail_follow/start() //Whoever is responsible for this abomination of code should become an hero
|
||||
if(!src.on)
|
||||
src.on = 1
|
||||
src.processing = 1
|
||||
if(src.processing)
|
||||
src.processing = 0
|
||||
var/turf/T = get_turf(src.holder)
|
||||
if(T != src.oldposition)
|
||||
if(!has_gravity(T))
|
||||
var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition)
|
||||
I.dir = src.holder.dir
|
||||
flick("ion_fade", I)
|
||||
I.icon_state = "blank"
|
||||
spawn( 20 )
|
||||
if(I)
|
||||
I.delete()
|
||||
src.oldposition = T
|
||||
spawn(2)
|
||||
if(src.on)
|
||||
src.processing = 1
|
||||
src.start()
|
||||
|
||||
/datum/effect/effect/system/ion_trail_follow/proc/stop()
|
||||
src.processing = 0
|
||||
src.on = 0
|
||||
oldposition = null
|
||||
|
||||
|
||||
|
||||
//Reagent-based explosion effect
|
||||
/datum/effect/effect/system/reagents_explosion
|
||||
var/amount // TNT equivalent
|
||||
var/flashing = 0 // does explosion creates flash effect?
|
||||
var/flashing_factor = 0 // factor of how powerful the flash effect relatively to the explosion
|
||||
|
||||
/datum/effect/effect/system/reagents_explosion/set_up (amt, loc, flash = 0, flash_fact = 0)
|
||||
amount = amt
|
||||
if(istype(loc, /turf/))
|
||||
location = loc
|
||||
else
|
||||
location = get_turf(loc)
|
||||
|
||||
flashing = flash
|
||||
flashing_factor = flash_fact
|
||||
|
||||
return
|
||||
|
||||
/datum/effect/effect/system/reagents_explosion/start()
|
||||
if (amount <= 2)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(2, 1, location)
|
||||
s.start()
|
||||
|
||||
location.visible_message("<span class='danger'>The solution violently explodes!</span>", \
|
||||
"You hear an explosion!")
|
||||
for(var/mob/M in viewers(1, location))
|
||||
if (prob (50 * amount))
|
||||
M << "<span class='danger'>The explosion knocks you down.</span>"
|
||||
M.Weaken(rand(1,5))
|
||||
return
|
||||
else
|
||||
var/devastation = -1
|
||||
var/heavy = -1
|
||||
var/light = -1
|
||||
var/flash = -1
|
||||
|
||||
// Clamp all values to MAX_EXPLOSION_RANGE
|
||||
if (round(amount/12) > 0)
|
||||
devastation = min (MAX_EX_DEVESTATION_RANGE, devastation + round(amount/12))
|
||||
|
||||
if (round(amount/6) > 0)
|
||||
heavy = min (MAX_EX_HEAVY_RANGE, heavy + round(amount/6))
|
||||
|
||||
if (round(amount/3) > 0)
|
||||
light = min (MAX_EX_LIGHT_RANGE, light + round(amount/3))
|
||||
|
||||
if (flash && flashing_factor)
|
||||
flash += (round(amount/4) * flashing_factor)
|
||||
|
||||
location.visible_message("<span class='danger'>The solution violently explodes!</span>", \
|
||||
"You hear an explosion!")
|
||||
|
||||
explosion(location, devastation, heavy, light, flash)
|
||||
@@ -0,0 +1,414 @@
|
||||
/////////////////////////////////////////////
|
||||
//// SMOKE SYSTEMS
|
||||
// direct can be optionally added when set_up, to make the smoke always travel in one direction
|
||||
// in case you wanted a vent to always smoke north for example
|
||||
/////////////////////////////////////////////
|
||||
|
||||
/obj/effect/effect/smoke
|
||||
name = "smoke"
|
||||
icon = 'icons/effects/water.dmi'
|
||||
icon_state = "smoke"
|
||||
opacity = 1
|
||||
anchored = 0.0
|
||||
mouse_opacity = 0
|
||||
var/amount = 8.0
|
||||
|
||||
/obj/effect/effect/harmless_smoke
|
||||
name = "smoke"
|
||||
icon_state = "smoke"
|
||||
opacity = 1
|
||||
anchored = 0.0
|
||||
mouse_opacity = 0
|
||||
var/amount = 6.0
|
||||
//Remove this bit to use the old smoke
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/effect/harmless_smoke/New()
|
||||
..()
|
||||
spawn (100)
|
||||
delete()
|
||||
return
|
||||
|
||||
/obj/effect/effect/harmless_smoke/Move()
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/effect/effect/system/harmless_smoke_spread
|
||||
var/total_smoke = 0 // To stop it being spammed and lagging!
|
||||
var/direction
|
||||
|
||||
/datum/effect/effect/system/harmless_smoke_spread/set_up(n = 5, c = 0, loca, direct)
|
||||
if(n > 10)
|
||||
n = 10
|
||||
number = n
|
||||
cardinals = c
|
||||
if(istype(loca, /turf/))
|
||||
location = loca
|
||||
else
|
||||
location = get_turf(loca)
|
||||
if(direct)
|
||||
direction = direct
|
||||
|
||||
|
||||
/datum/effect/effect/system/harmless_smoke_spread/start()
|
||||
var/i = 0
|
||||
for(i=0, i<src.number, i++)
|
||||
if(src.total_smoke > 20)
|
||||
return
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/harmless_smoke/smoke = new /obj/effect/effect/harmless_smoke(src.location)
|
||||
src.total_smoke++
|
||||
var/direction = src.direction
|
||||
if(!direction)
|
||||
if(src.cardinals)
|
||||
direction = pick(cardinal)
|
||||
else
|
||||
direction = pick(alldirs)
|
||||
for(i=0, i<pick(0,1,1,1,2,2,2,3), i++)
|
||||
sleep(10)
|
||||
step(smoke,direction)
|
||||
spawn(75+rand(10,30))
|
||||
if(smoke)
|
||||
fadeOut(smoke)
|
||||
smoke.delete()
|
||||
src.total_smoke--
|
||||
|
||||
|
||||
/////////////////////////////////////////////
|
||||
// Bad smoke
|
||||
/////////////////////////////////////////////
|
||||
|
||||
/obj/effect/effect/bad_smoke
|
||||
name = "smoke"
|
||||
icon_state = "smoke"
|
||||
opacity = 1
|
||||
anchored = 0.0
|
||||
mouse_opacity = 0
|
||||
var/amount = 6.0
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/effect/bad_smoke/New()
|
||||
..()
|
||||
spawn (200+rand(10,30))
|
||||
delete()
|
||||
return
|
||||
|
||||
/obj/effect/effect/bad_smoke/Move()
|
||||
..()
|
||||
for(var/mob/living/carbon/M in get_turf(src))
|
||||
if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS))
|
||||
else
|
||||
M.drop_item()
|
||||
M.adjustOxyLoss(1)
|
||||
if (M.coughedtime != 1)
|
||||
M.coughedtime = 1
|
||||
M.emote("cough")
|
||||
spawn(20)
|
||||
if(M && M.loc)
|
||||
M.coughedtime = 0
|
||||
return
|
||||
|
||||
|
||||
/obj/effect/effect/bad_smoke/CanPass(atom/movable/mover, turf/target, height=0)
|
||||
if(height==0) return 1
|
||||
if(istype(mover, /obj/item/projectile/beam))
|
||||
var/obj/item/projectile/beam/B = mover
|
||||
B.damage = (B.damage/2)
|
||||
return 1
|
||||
|
||||
|
||||
/obj/effect/effect/bad_smoke/Crossed(mob/living/carbon/M as mob )
|
||||
..()
|
||||
if(istype(M, /mob/living/carbon))
|
||||
if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS))
|
||||
return
|
||||
else
|
||||
M.drop_item()
|
||||
M.adjustOxyLoss(1)
|
||||
if (M.coughedtime != 1)
|
||||
M.coughedtime = 1
|
||||
M.emote("cough")
|
||||
spawn(20)
|
||||
if(M && M.loc)
|
||||
M.coughedtime = 0
|
||||
return
|
||||
|
||||
/datum/effect/effect/system/bad_smoke_spread
|
||||
var/total_smoke = 0 // To stop it being spammed and lagging!
|
||||
var/direction
|
||||
|
||||
/datum/effect/effect/system/bad_smoke_spread/set_up(n = 5, c = 0, loca, direct)
|
||||
if(n > 20)
|
||||
n = 20
|
||||
number = n
|
||||
cardinals = c
|
||||
if(istype(loca, /turf/))
|
||||
location = loca
|
||||
else
|
||||
location = get_turf(loca)
|
||||
if(direct)
|
||||
direction = direct
|
||||
|
||||
/datum/effect/effect/system/bad_smoke_spread/start()
|
||||
var/i = 0
|
||||
for(i=0, i<src.number, i++)
|
||||
if(src.total_smoke > 20)
|
||||
return
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/bad_smoke/smoke = new /obj/effect/effect/bad_smoke(src.location)
|
||||
src.total_smoke++
|
||||
var/direction = src.direction
|
||||
if(!direction)
|
||||
if(src.cardinals)
|
||||
direction = pick(cardinal)
|
||||
else
|
||||
direction = pick(alldirs)
|
||||
for(i=0, i<pick(0,1,1,1,2,2,2,3), i++)
|
||||
sleep(10)
|
||||
step(smoke,direction)
|
||||
spawn(150+rand(10,30))
|
||||
if(smoke)
|
||||
fadeOut(smoke)
|
||||
smoke.delete()
|
||||
src.total_smoke--
|
||||
|
||||
|
||||
/////////////////////////////////////////////
|
||||
// Chem smoke
|
||||
/////////////////////////////////////////////
|
||||
|
||||
|
||||
/obj/effect/effect/chem_smoke
|
||||
name = "smoke"
|
||||
opacity = 1
|
||||
anchored = 0.0
|
||||
mouse_opacity = 0
|
||||
var/amount = 6.0
|
||||
icon = 'icons/effects/chemsmoke.dmi'
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
|
||||
/obj/effect/effect/chem_smoke/New()
|
||||
..()
|
||||
create_reagents(500)
|
||||
spawn(200+rand(10,30))
|
||||
delete()
|
||||
return
|
||||
|
||||
|
||||
/obj/effect/effect/chem_smoke/Move()
|
||||
..()
|
||||
for(var/atom/A in view(1, src))
|
||||
if(reagents.has_reagent("radium")||reagents.has_reagent("uranium")||reagents.has_reagent("carbon")||reagents.has_reagent("thermite"))//Prevents unholy radium spam by reducing the number of 'greenglows' down to something reasonable -Sieve
|
||||
if(prob(5))
|
||||
reagents.reaction(A)
|
||||
else
|
||||
reagents.reaction(A)
|
||||
return
|
||||
|
||||
|
||||
/obj/effect/effect/chem_smoke/Crossed(mob/living/carbon/M as mob )
|
||||
..()
|
||||
reagents.reaction(M)
|
||||
|
||||
|
||||
/datum/effect/effect/system/chem_smoke_spread
|
||||
var/total_smoke = 0 // To stop it being spammed and lagging!
|
||||
var/direction
|
||||
var/obj/chemholder
|
||||
|
||||
|
||||
/datum/effect/effect/system/chem_smoke_spread/New()
|
||||
..()
|
||||
chemholder = new/obj()
|
||||
var/datum/reagents/R = new/datum/reagents(500)
|
||||
chemholder.reagents = R
|
||||
R.my_atom = chemholder
|
||||
|
||||
|
||||
/datum/effect/effect/system/chem_smoke_spread/set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0)
|
||||
if(n > 20)
|
||||
n = 20
|
||||
number = n
|
||||
cardinals = c
|
||||
carry.copy_to(chemholder, carry.total_volume)
|
||||
|
||||
|
||||
if(istype(loca, /turf/))
|
||||
location = loca
|
||||
else
|
||||
location = get_turf(loca)
|
||||
|
||||
if(direct)
|
||||
direction = direct
|
||||
|
||||
if(!silent)
|
||||
var/contained = ""
|
||||
for(var/reagent in carry.reagent_list)
|
||||
contained += " [reagent] "
|
||||
if(contained)
|
||||
contained = "\[[contained]\]"
|
||||
var/area/A = get_area(location)
|
||||
|
||||
var/where = "[A.name] | [location.x], [location.y]"
|
||||
var/whereLink = "<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>[where]</a>"
|
||||
|
||||
if(carry.my_atom.fingerprintslast)
|
||||
var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast)
|
||||
var/more = ""
|
||||
if(M)
|
||||
more = "(<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</a>)"
|
||||
message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", 0, 1)
|
||||
log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].")
|
||||
else
|
||||
message_admins("A chemical smoke reaction has taken place in ([whereLink]). No associated key.", 0, 1)
|
||||
log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.")
|
||||
|
||||
|
||||
/datum/effect/effect/system/chem_smoke_spread/start()
|
||||
var/i = 0
|
||||
|
||||
var/color = mix_color_from_reagents(chemholder.reagents.reagent_list)
|
||||
|
||||
for(i=0, i<src.number, i++)
|
||||
if(src.total_smoke > 20)
|
||||
return
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/chem_smoke/smoke = new /obj/effect/effect/chem_smoke(src.location)
|
||||
src.total_smoke++
|
||||
var/direction = src.direction
|
||||
if(!direction)
|
||||
if(src.cardinals)
|
||||
direction = pick(cardinal)
|
||||
else
|
||||
direction = pick(alldirs)
|
||||
|
||||
if(chemholder.reagents.total_volume != 1) // can't split 1 very well
|
||||
chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly
|
||||
|
||||
if(color)
|
||||
smoke.color = color // give the smoke color, if it has any to begin with
|
||||
else
|
||||
// if no color, just use the old smoke icon
|
||||
smoke.icon = 'icons/effects/96x96.dmi'
|
||||
smoke.icon_state = "smoke"
|
||||
|
||||
for(i=0, i<pick(0,1,1,1,2,2,2,3), i++)
|
||||
sleep(10)
|
||||
step(smoke,direction)
|
||||
spawn(150+rand(10,30))
|
||||
if(smoke)
|
||||
fadeOut(smoke)
|
||||
smoke.delete()
|
||||
src.total_smoke--
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////////////
|
||||
// Sleep smoke
|
||||
/////////////////////////////////////////////
|
||||
|
||||
/obj/effect/effect/sleep_smoke
|
||||
name = "smoke"
|
||||
icon_state = "smoke"
|
||||
opacity = 1
|
||||
anchored = 0.0
|
||||
mouse_opacity = 0
|
||||
var/amount = 6.0
|
||||
//Remove this bit to use the old smoke
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
color = "#9C3636"
|
||||
|
||||
/obj/effect/effect/sleep_smoke/New()
|
||||
..()
|
||||
spawn (200+rand(10,30))
|
||||
delete()
|
||||
return
|
||||
|
||||
/obj/effect/effect/sleep_smoke/Move()
|
||||
..()
|
||||
for(var/mob/living/carbon/M in get_turf(src))
|
||||
if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS))
|
||||
// if (M.wear_suit, /obj/item/clothing/suit/wizrobe && (M.hat, /obj/item/clothing/head/wizard) && (M.shoes, /obj/item/clothing/shoes/sandal)) // I'll work on it later
|
||||
else
|
||||
M.drop_item()
|
||||
M:sleeping += 5
|
||||
if (M.coughedtime != 1)
|
||||
M.coughedtime = 1
|
||||
M.emote("cough")
|
||||
spawn(20)
|
||||
if(M && M.loc)
|
||||
M.coughedtime = 0
|
||||
return
|
||||
|
||||
/obj/effect/effect/sleep_smoke/Crossed(mob/living/carbon/M as mob )
|
||||
..()
|
||||
if(istype(M, /mob/living/carbon))
|
||||
if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS))
|
||||
// if (M.wear_suit, /obj/item/clothing/suit/wizrobe && (M.hat, /obj/item/clothing/head/wizard) && (M.shoes, /obj/item/clothing/shoes/sandal)) // Work on it later
|
||||
return
|
||||
else
|
||||
M.drop_item()
|
||||
M:sleeping += 5
|
||||
if (M.coughedtime != 1)
|
||||
M.coughedtime = 1
|
||||
M.emote("cough")
|
||||
spawn(20)
|
||||
if(M && M.loc)
|
||||
M.coughedtime = 0
|
||||
return
|
||||
|
||||
/datum/effect/effect/system/sleep_smoke_spread
|
||||
var/total_smoke = 0 // To stop it being spammed and lagging!
|
||||
var/direction
|
||||
|
||||
/datum/effect/effect/system/sleep_smoke_spread/set_up(n = 5, c = 0, loca, direct)
|
||||
if(n > 20)
|
||||
n = 20
|
||||
number = n
|
||||
cardinals = c
|
||||
if(istype(loca, /turf/))
|
||||
location = loca
|
||||
else
|
||||
location = get_turf(loca)
|
||||
if(direct)
|
||||
direction = direct
|
||||
|
||||
|
||||
/datum/effect/effect/system/sleep_smoke_spread/start()
|
||||
var/i = 0
|
||||
for(i=0, i<src.number, i++)
|
||||
if(src.total_smoke > 20)
|
||||
return
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/sleep_smoke/smoke = new /obj/effect/effect/sleep_smoke(src.location)
|
||||
src.total_smoke++
|
||||
var/direction = src.direction
|
||||
if(!direction)
|
||||
if(src.cardinals)
|
||||
direction = pick(cardinal)
|
||||
else
|
||||
direction = pick(alldirs)
|
||||
for(i=0, i<pick(0,1,1,1,2,2,2,3), i++)
|
||||
sleep(10)
|
||||
step(smoke,direction)
|
||||
spawn(150+rand(10,30))
|
||||
if(smoke)
|
||||
fadeOut(smoke)
|
||||
smoke.delete()
|
||||
src.total_smoke--
|
||||
@@ -0,0 +1,117 @@
|
||||
/////////////////////////////////////////////
|
||||
//SPARK SYSTEM (like steam system)
|
||||
// The attach(atom/atom) proc is optional, and can be called to attach the effect
|
||||
// to something, like the RCD, so then you can just call start() and the sparks
|
||||
// will always spawn at the items location.
|
||||
/////////////////////////////////////////////
|
||||
|
||||
/obj/effect/effect/sparks
|
||||
name = "sparks"
|
||||
icon_state = "sparks"
|
||||
var/amount = 6.0
|
||||
anchored = 1.0
|
||||
mouse_opacity = 0
|
||||
|
||||
/obj/effect/effect/sparks/New()
|
||||
..()
|
||||
playsound(src.loc, "sparks", 100, 1)
|
||||
var/turf/T = src.loc
|
||||
if (istype(T, /turf))
|
||||
T.hotspot_expose(1000,100)
|
||||
spawn (100)
|
||||
delete()
|
||||
return
|
||||
|
||||
/obj/effect/effect/sparks/Destroy()
|
||||
var/turf/T = src.loc
|
||||
if (istype(T, /turf))
|
||||
T.hotspot_expose(1000,100)
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/effect/effect/sparks/Move()
|
||||
..()
|
||||
var/turf/T = src.loc
|
||||
if (istype(T, /turf))
|
||||
T.hotspot_expose(1000,100)
|
||||
return
|
||||
|
||||
/datum/effect/effect/system/spark_spread
|
||||
var/total_sparks = 0 // To stop it being spammed and lagging!
|
||||
|
||||
/datum/effect/effect/system/spark_spread/set_up(n = 3, c = 0, loca)
|
||||
if(n > 10)
|
||||
n = 10
|
||||
number = n
|
||||
cardinals = c
|
||||
if(istype(loca, /turf/))
|
||||
location = loca
|
||||
else
|
||||
location = get_turf(loca)
|
||||
|
||||
/datum/effect/effect/system/spark_spread/start()
|
||||
var/i = 0
|
||||
for(i=0, i<src.number, i++)
|
||||
if(src.total_sparks > 20)
|
||||
return
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location)
|
||||
src.total_sparks++
|
||||
var/direction
|
||||
if(src.cardinals)
|
||||
direction = pick(cardinal)
|
||||
else
|
||||
direction = pick(alldirs)
|
||||
for(i=0, i<pick(1,2,3), i++)
|
||||
sleep(5)
|
||||
step(sparks,direction)
|
||||
spawn(20)
|
||||
if(sparks) // Might be deleted already
|
||||
sparks.delete()
|
||||
src.total_sparks--
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/effect/effect/sparks/electricity
|
||||
name = "lightning"
|
||||
icon_state = "electricity"
|
||||
|
||||
/datum/effect/effect/system/lightning_spread
|
||||
var/total_sparks = 0 // To stop it being spammed and lagging!
|
||||
|
||||
/datum/effect/effect/system/lightning_spread/set_up(n = 3, c = 0, loca)
|
||||
if(n > 10)
|
||||
n = 10
|
||||
number = n
|
||||
cardinals = c
|
||||
if(istype(loca, /turf/))
|
||||
location = loca
|
||||
else
|
||||
location = get_turf(loca)
|
||||
|
||||
/datum/effect/effect/system/lightning_spread/start()
|
||||
var/i = 0
|
||||
for(i=0, i<src.number, i++)
|
||||
if(src.total_sparks > 20)
|
||||
return
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/sparks/electricity/sparks = new /obj/effect/effect/sparks/electricity(src.location)
|
||||
src.total_sparks++
|
||||
var/direction
|
||||
if(src.cardinals)
|
||||
direction = pick(cardinal)
|
||||
else
|
||||
direction = pick(alldirs)
|
||||
for(i=0, i<pick(1,2,3), i++)
|
||||
sleep(5)
|
||||
step(sparks,direction)
|
||||
spawn(20)
|
||||
if(sparks) // Might be deleted already
|
||||
sparks.delete()
|
||||
src.total_sparks--
|
||||
@@ -0,0 +1,128 @@
|
||||
//WATER EFFECTS
|
||||
|
||||
/obj/effect/effect/water
|
||||
name = "water"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "extinguish"
|
||||
var/life = 15.0
|
||||
mouse_opacity = 0
|
||||
|
||||
|
||||
/obj/effect/effect/water/New()
|
||||
..()
|
||||
//var/turf/T = src.loc
|
||||
//if (istype(T, /turf))
|
||||
// T.firelevel = 0 //TODO: FIX
|
||||
spawn( 70 )
|
||||
delete()
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/effect/water/Move(turf/newloc)
|
||||
//var/turf/T = src.loc
|
||||
//if (istype(T, /turf))
|
||||
// T.firelevel = 0 //TODO: FIX
|
||||
if (--src.life < 1)
|
||||
//SN src = null
|
||||
delete()
|
||||
if(newloc.density)
|
||||
return 0
|
||||
.=..()
|
||||
|
||||
/obj/effect/effect/water/Bump(atom/A)
|
||||
if(reagents)
|
||||
reagents.reaction(A)
|
||||
return ..()
|
||||
|
||||
|
||||
/////////////////////////////////////////////
|
||||
// GENERIC STEAM SPREAD SYSTEM
|
||||
|
||||
//Usage: set_up(number of bits of steam, use North/South/East/West only, spawn location)
|
||||
// The attach(atom/atom) proc is optional, and can be called to attach the effect
|
||||
// to something, like a smoking beaker, so then you can just call start() and the steam
|
||||
// will always spawn at the items location, even if it's moved.
|
||||
|
||||
/* Example:
|
||||
var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() -- creates new system
|
||||
steam.set_up(5, 0, mob.loc) -- sets up variables
|
||||
OPTIONAL: steam.attach(mob)
|
||||
steam.start() -- spawns the effect
|
||||
*/
|
||||
/////////////////////////////////////////////
|
||||
/obj/effect/effect/steam
|
||||
name = "steam"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "extinguish"
|
||||
density = 0
|
||||
|
||||
/datum/effect/effect/system/steam_spread
|
||||
|
||||
/datum/effect/effect/system/steam_spread/set_up(n = 3, c = 0, turf/loc)
|
||||
if(n > 10)
|
||||
n = 10
|
||||
number = n
|
||||
cardinals = c
|
||||
location = loc
|
||||
|
||||
/datum/effect/effect/system/steam_spread/start()
|
||||
var/i = 0
|
||||
for(i=0, i<src.number, i++)
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/steam/steam = new /obj/effect/effect/steam(src.location)
|
||||
var/direction
|
||||
if(src.cardinals)
|
||||
direction = pick(cardinal)
|
||||
else
|
||||
direction = pick(alldirs)
|
||||
for(i=0, i<pick(1,2,3), i++)
|
||||
sleep(5)
|
||||
step(steam,direction)
|
||||
spawn(20)
|
||||
steam.delete()
|
||||
|
||||
|
||||
/////////////////////////////////////////////
|
||||
//////// Attach a steam trail to an object (eg. a reacting beaker) that will follow it
|
||||
// even if it's carried of thrown.
|
||||
/////////////////////////////////////////////
|
||||
|
||||
/datum/effect/effect/system/steam_trail_follow
|
||||
var/turf/oldposition
|
||||
var/processing = 1
|
||||
var/on = 1
|
||||
|
||||
/datum/effect/effect/system/steam_trail_follow/set_up(atom/atom)
|
||||
attach(atom)
|
||||
oldposition = get_turf(atom)
|
||||
|
||||
/datum/effect/effect/system/steam_trail_follow/start()
|
||||
if(!src.on)
|
||||
src.on = 1
|
||||
src.processing = 1
|
||||
if(src.processing)
|
||||
src.processing = 0
|
||||
spawn(0)
|
||||
if(src.number < 3)
|
||||
var/obj/effect/effect/steam/I = new /obj/effect/effect/steam(src.oldposition)
|
||||
src.number++
|
||||
src.oldposition = get_turf(holder)
|
||||
I.dir = src.holder.dir
|
||||
spawn(10)
|
||||
I.delete()
|
||||
src.number--
|
||||
spawn(2)
|
||||
if(src.on)
|
||||
src.processing = 1
|
||||
src.start()
|
||||
else
|
||||
spawn(2)
|
||||
if(src.on)
|
||||
src.processing = 1
|
||||
src.start()
|
||||
|
||||
/datum/effect/effect/system/steam_trail_follow/proc/stop()
|
||||
src.processing = 0
|
||||
src.on = 0
|
||||
@@ -24,7 +24,7 @@
|
||||
/obj/effect/forcefield/mime/New()
|
||||
..()
|
||||
last_process = world.time
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/effect/forcefield/mime/process()
|
||||
timeleft -= (world.time - last_process)
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
/obj/effect/spider/eggcluster/New()
|
||||
pixel_x = rand(3,-3)
|
||||
pixel_y = rand(3,-3)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/effect/spider/eggcluster/process()
|
||||
amount_grown += rand(0,2)
|
||||
@@ -109,7 +109,7 @@
|
||||
/obj/effect/spider/spiderling/New()
|
||||
pixel_x = rand(6,-6)
|
||||
pixel_y = rand(6,-6)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/effect/spider/spiderling/Bump(atom/user)
|
||||
if(istype(user, /obj/structure/table))
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
for(var/mob/O in viewers(usr, null))
|
||||
O.show_message(flavor_text, 1)
|
||||
SetLuminosity(CANDLE_LUMINOSITY)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
|
||||
/obj/item/candle/process()
|
||||
|
||||
@@ -283,7 +283,7 @@ obj/item/device/flashlight/lamp/bananalamp
|
||||
|
||||
/obj/item/device/flashlight/emp/New()
|
||||
..()
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/item/device/flashlight/emp/Destroy()
|
||||
SSobj.processing.Remove(src)
|
||||
|
||||
@@ -186,7 +186,7 @@
|
||||
if(energy <= max_energy)
|
||||
if(!recharging)
|
||||
recharging = 1
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
if(energy <= 0)
|
||||
user << "<span class='warning'>You've overused the battery of [src], now it needs time to recharge!</span>"
|
||||
recharge_locked = 1
|
||||
|
||||
@@ -20,10 +20,10 @@
|
||||
if(!ishuman(user))
|
||||
user << "<span class='warning'>You don't know how to use this!</span>"
|
||||
return
|
||||
if(ishuman(user) && (user.mind.miming)) //Humans get their muteness checked
|
||||
if(user.can_speak())
|
||||
user << "<span class='warning'>You find yourself unable to speak at all.</span>"
|
||||
return
|
||||
if(spamcheck)
|
||||
if(spamcheck > world.time)
|
||||
user << "<span class='warning'>\The [src] needs to recharge!</span>"
|
||||
return
|
||||
|
||||
@@ -34,19 +34,15 @@
|
||||
if ((src.loc == user && usr.stat == 0))
|
||||
if(emagged)
|
||||
if(insults)
|
||||
for(var/mob/O in (viewers(user)))
|
||||
O.show_message("<B>[user]</B> broadcasts, <FONT size=3>\"[pick(insultmsg)]\"</FONT>",2) // 2 stands for hearable message
|
||||
user.audible_message("<B>[user]</B> broadcasts, <FONT size=3>\"[pick(insultmsg)]\"</FONT>", null, 1) // 2 stands for hearable message
|
||||
insults--
|
||||
else
|
||||
user << "<span class='warning'>*BZZZZzzzzzt*</span>"
|
||||
else
|
||||
for(var/mob/O in (viewers(user)))
|
||||
O.show_message("<B>[user]</B> broadcasts, <FONT size=3>\"[message]\"</FONT>",2) // 2 stands for hearable message
|
||||
user.audible_message("<B>[user]</B> broadcasts, <FONT size=3>\"[message]\"</FONT>", null, 1) // 2 stands for hearable message
|
||||
|
||||
playsound(loc, 'sound/items/megaphone.ogg', 100, 0, 1)
|
||||
spamcheck = 1
|
||||
spawn(20)
|
||||
spamcheck = 0
|
||||
spamcheck = world.time + 50
|
||||
return
|
||||
|
||||
/obj/item/device/megaphone/emag_act(mob/user)
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
if(OPERATING)
|
||||
if(!attached)
|
||||
return
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
anchored = 1
|
||||
|
||||
mode = value
|
||||
|
||||
@@ -25,7 +25,7 @@ MASS SPECTROMETER
|
||||
icon_state = copytext(icon_state, 1, length(icon_state))+"[on]"
|
||||
|
||||
if(on)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
|
||||
/obj/item/device/t_scanner/process()
|
||||
|
||||
@@ -0,0 +1,247 @@
|
||||
#define MAX_TAPE_RANGE 3
|
||||
//The max length of a line of hazard tape by tile range
|
||||
|
||||
//Define all tape types in hazardtape.dm
|
||||
/obj/item/tapeproj
|
||||
icon = 'icons/obj/holotape.dmi'
|
||||
icon_state = "rollstart"
|
||||
w_class = 2.0
|
||||
var/turf/start
|
||||
var/turf/end
|
||||
var/tape_type = /obj/item/holotape
|
||||
var/icon_base
|
||||
var/charging = 0
|
||||
|
||||
/obj/item/holotape
|
||||
icon = 'icons/obj/holotape.dmi'
|
||||
anchored = 1
|
||||
density = 1
|
||||
var/icon_base
|
||||
var/health = 10
|
||||
|
||||
/obj/item/tapeproj/security
|
||||
name = "security holotape projector"
|
||||
desc = "A security hard-light holotape projector used to create holotape. It can be placed in segments along hallways or on airlocks to signify crime scenes."
|
||||
icon_state = "security_start"
|
||||
tape_type = /obj/item/holotape/security
|
||||
icon_base = "security"
|
||||
|
||||
/obj/item/holotape/security
|
||||
name = "security holotape"
|
||||
desc = "A length of security hard-light holotape. It reads: SECURITY LINE | DO NOT CROSS."
|
||||
icon_base = "security"
|
||||
|
||||
/obj/item/tapeproj/engineering
|
||||
name = "engineering holotape projector"
|
||||
desc = "An engineering hard-light holotape projector used to create holotape. It can be placed in segments along hallways or on airlocks to show hazardous areas."
|
||||
icon_state = "engineering_start"
|
||||
tape_type = /obj/item/holotape/engineering
|
||||
icon_base = "engineering"
|
||||
|
||||
/obj/item/holotape/engineering
|
||||
name = "engineering holotape"
|
||||
desc = "A length of engineering hard-light holotape. It reads: HAZARD AHEAD // DO NOT CROSS."
|
||||
icon_base = "engineering"
|
||||
|
||||
/obj/item/tapeproj/dropped()
|
||||
reset()
|
||||
|
||||
/obj/item/tapeproj/equipped()
|
||||
reset()
|
||||
|
||||
/obj/item/tapeproj/proc/reset()
|
||||
if(icon_state == "[icon_base]_stop")
|
||||
icon_state = "[icon_base]_start"
|
||||
start = null
|
||||
return
|
||||
|
||||
/obj/item/tapeproj/attack_self(var/mob/user)
|
||||
if(charging)
|
||||
usr << "<span class='warning'>[src] is recharging!</span>"
|
||||
return
|
||||
if(icon_state == "[icon_base]_start")
|
||||
start = get_turf(src)
|
||||
usr << "<span class='notice'>You project the start of the [icon_base] holotape.</span>"
|
||||
icon_state = "[icon_base]_stop"
|
||||
else
|
||||
icon_state = "[icon_base]_start"
|
||||
end = get_turf(src)
|
||||
if(start.y != end.y && start.x != end.x || start.z != end.z)
|
||||
usr << "<span class='warning'>[src] can only be projected horizontally or vertically.</span>"
|
||||
return
|
||||
if(get_dist(start,end) >= MAX_TAPE_RANGE)
|
||||
usr << "<span class='warning'>Your holotape segment is too long! It must be [MAX_TAPE_RANGE] tiles long or shorter!</span>"
|
||||
return
|
||||
|
||||
var/turf/cur = start
|
||||
var/dir
|
||||
if(start.x == end.x)
|
||||
var/d = end.y-start.y
|
||||
if(d) d = d/abs(d)
|
||||
end = get_turf(locate(end.x,end.y+d,end.z))
|
||||
dir = "v"
|
||||
else
|
||||
var/d = end.x-start.x
|
||||
if(d) d = d/abs(d)
|
||||
end = get_turf(locate(end.x+d,end.y,end.z))
|
||||
dir = "h"
|
||||
|
||||
var/can_place = 1
|
||||
while (cur!=end && can_place)
|
||||
if(cur.density == 1)
|
||||
can_place = 0
|
||||
else if(istype(cur, /turf/space))
|
||||
can_place = 0
|
||||
else
|
||||
for(var/obj/O in cur)
|
||||
if(!istype(O, /obj/item/holotape) && O.density)
|
||||
can_place = 0
|
||||
break
|
||||
cur = get_step_towards(cur,end)
|
||||
if(!can_place)
|
||||
usr << "<span class='warning'>You can't project the [icon_base] holotape through that!</span>"
|
||||
return
|
||||
|
||||
cur = start
|
||||
var/tapetest = 0
|
||||
while (cur!=end)
|
||||
for(var/obj/item/holotape/Ptest in cur)
|
||||
if(Ptest.icon_state == "[Ptest.icon_base]_[dir]")
|
||||
tapetest = 1
|
||||
if(tapetest != 1)
|
||||
var/obj/item/holotape/P = new tape_type(cur)
|
||||
P.icon_state = "[P.icon_base]_[dir]"
|
||||
cur = get_step_towards(cur,end)
|
||||
|
||||
usr << "<span class='notice'>You finish project the legnth of [icon_base] holotape.</span>"
|
||||
user.visible_message("<span class='warning'>[user] finishes projecting the length of [icon_base] holotape.</span>")
|
||||
|
||||
charging = 1
|
||||
spawn(40)
|
||||
charging = 0
|
||||
|
||||
/obj/item/tapeproj/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(charging)
|
||||
return
|
||||
|
||||
if(proximity_flag == 0) // not adjacent
|
||||
return
|
||||
|
||||
if(istype(target, /obj/machinery/door/airlock) || istype(target, /obj/machinery/door/firedoor) || istype(target, /obj/structure/window))
|
||||
var/turf = get_turf(target)
|
||||
|
||||
if(locate(tape_type) in turf) //Don't you dare stack tape
|
||||
return
|
||||
|
||||
if(istype(target, /obj/structure/window))
|
||||
var/obj/structure/window/W = target
|
||||
if(!(W.dir == 5) || !(W.fulltile == 1))
|
||||
return
|
||||
|
||||
user << "<span class='notice'>You start projecting the [icon_base] holotape onto [target].</span>"
|
||||
|
||||
if(!do_mob(user, target, 30))
|
||||
return
|
||||
|
||||
var/atom/tape = new tape_type(turf)
|
||||
tape.icon_state = "[icon_base]_door"
|
||||
tape.layer = 3.2
|
||||
|
||||
user << "<span class='notice'>You project the [icon_base] holotape onto [target].</span>"
|
||||
|
||||
charging = 1
|
||||
spawn(40)
|
||||
charging = 0
|
||||
|
||||
/obj/item/holotape/Bumped(var/mob/living/carbon/C)
|
||||
if(C.m_intent == "walk")
|
||||
var/turf/T = get_turf(src)
|
||||
C.loc = T
|
||||
|
||||
/obj/item/holotape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(!density) return 1
|
||||
if(air_group || (height==0)) return 1
|
||||
|
||||
if((mover.flags & PASSGLASS || istype(mover, /obj/effect/meteor) || mover.throwing == 1) )
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/holotape/attack_hand(mob/living/user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
playsound(loc, 'sound/weapons/Egloves.ogg', 80, 1)
|
||||
user.visible_message("<span class='warning'>[user] hits [src].</span>", \
|
||||
"<span class='warning'>You hit [src].</span>" )
|
||||
|
||||
health -= rand(1,2)
|
||||
healthcheck()
|
||||
|
||||
/obj/item/holotape/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
breaktape()
|
||||
|
||||
/obj/item/holotape/ex_act(severity, target)
|
||||
breaktape()
|
||||
|
||||
/obj/item/holotape/blob_act()
|
||||
breaktape()
|
||||
|
||||
/obj/item/holotape/attack_paw(mob/living/user)
|
||||
attack_hand(user)
|
||||
|
||||
/obj/item/holotape/bullet_act(var/obj/item/projectile/Proj)
|
||||
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
health -= Proj.damage
|
||||
..()
|
||||
if(health <= 0)
|
||||
breaktape()
|
||||
return
|
||||
|
||||
/obj/item/holotape/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
add_fingerprint(user)
|
||||
health -= W.force * 0.3
|
||||
|
||||
healthcheck()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/holotape/hitby(AM as mob|obj)
|
||||
..()
|
||||
visible_message("<span class='danger'>[src] was hit by [AM].</span>")
|
||||
var/tforce = 0
|
||||
if(ismob(AM))
|
||||
tforce = 5
|
||||
else if(isobj(AM))
|
||||
var/obj/item/I = AM
|
||||
tforce = max(0, I.throwforce * 0.5)
|
||||
playsound(loc, 'sound/weapons/Egloves.ogg', 80, 1)
|
||||
health = max(0, health - tforce)
|
||||
healthcheck()
|
||||
|
||||
/obj/item/holotape/proc/breaktape()
|
||||
var/dir[2]
|
||||
var/icon_dir = src.icon_state
|
||||
if(icon_dir == "[src.icon_base]_h")
|
||||
dir[1] = EAST
|
||||
dir[2] = WEST
|
||||
if(icon_dir == "[src.icon_base]_v")
|
||||
dir[1] = NORTH
|
||||
dir[2] = SOUTH
|
||||
|
||||
for(var/i=1;i<3;i++)
|
||||
var/N = 0
|
||||
var/turf/cur = get_step(src,dir[i])
|
||||
while(N != 1)
|
||||
N = 1
|
||||
for (var/obj/item/holotape/P in cur)
|
||||
if(P.icon_state == icon_dir)
|
||||
N = 0
|
||||
del(P)
|
||||
cur = get_step(cur,dir[i])
|
||||
|
||||
del(src)
|
||||
return
|
||||
|
||||
#undef MAX_TAPE_RANGE
|
||||
@@ -101,6 +101,11 @@
|
||||
desc = "A roll of cloth roughly cut from something that can stop bleeding, but does not heal wounds."
|
||||
stop_bleeding = 900
|
||||
|
||||
/obj/item/stack/medical/gauze/cyborg/
|
||||
m_amt = 0
|
||||
is_cyborg = 1
|
||||
cost = 250
|
||||
|
||||
/obj/item/stack/medical/ointment
|
||||
name = "ointment"
|
||||
desc = "Used to treat those nasty burn wounds."
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
update_icon()
|
||||
|
||||
desc = initial(desc) + "<br><span class='info'>It appears to contain [target.name].</span>"
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/effect/chrono_field/Destroy()
|
||||
if(gun && gun.field_check(src))
|
||||
|
||||
@@ -50,7 +50,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
name = "lit match"
|
||||
desc = "A match. This one is lit."
|
||||
attack_verb = list("burnt","singed")
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -185,7 +185,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
if(flavor_text)
|
||||
var/turf/T = get_turf(src)
|
||||
T.visible_message(flavor_text)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
//can't think of any other way to update the overlays :<
|
||||
if(ismob(loc))
|
||||
@@ -475,7 +475,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light [src], they however burn their finger in the process.</span>")
|
||||
|
||||
user.AddLuminosity(1)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
else
|
||||
lit = 0
|
||||
icon_state = icon_off
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
if(!status) return
|
||||
lit = !lit
|
||||
if(lit)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
if(href_list["amount"])
|
||||
throw_amount = throw_amount + text2num(href_list["amount"])
|
||||
throw_amount = max(50, min(5000, throw_amount))
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
desc = "Lets you shoot your guns"
|
||||
icon_state = "auth"
|
||||
|
||||
/obj/item/weapon/implant/tracking/get_data()
|
||||
/obj/item/weapon/implant/weapons_auth/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Firearms Authentication Implant<BR>
|
||||
<b>Life:</b> 4 hours after death of host<BR>
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
var/obj/effect/overlay/holograph/H = locate() in T
|
||||
if(H)
|
||||
user << "<span class='notice'>You use [src] to destroy [H].</span>"
|
||||
signs.Remove(H)
|
||||
qdel(H)
|
||||
else
|
||||
if(signs.len < max_signs)
|
||||
|
||||
@@ -700,7 +700,7 @@
|
||||
- metal rod (kebab)
|
||||
|
||||
<h2>Table Craft:</h2>
|
||||
Put ingredients on table, then click and drag the table onto yourself to prepare recipes.
|
||||
Put ingredients on table, then click and drag the table onto yourself to see what recipes you can prepare.
|
||||
|
||||
<h2>Microwave:</h2>
|
||||
Use it to cook or boil food ingredients (meats, doughs, egg, spaghetti, donkpocket, etc...).
|
||||
@@ -718,14 +718,14 @@
|
||||
|
||||
<h2>Example recipes:</h2>
|
||||
<b>Vanilla Cake</b>: Microwave cake batter.<br>
|
||||
<b>Burger:</b> 1 bun + 1 meat<br>
|
||||
<b>Burger:</b> 1 bun + 1 meat steak<br>
|
||||
<b>Bread:</b> Microwave dough.<br>
|
||||
<b>Waffles:</b> 2 doughslices<br>
|
||||
<b>Waffles:</b> 2 pastry base<br>
|
||||
<b>Popcorn:</b> Microwave corn.<br>
|
||||
<b>Meat Steak:</b> Microwave meat.<br>
|
||||
<b>Meat Pie:</b> 1 plain pie + 1u black pepper + 1u salt + 1 meat<br>
|
||||
<b>Meat Pie:</b> 1 plain pie + 1u black pepper + 1u salt + 2 meat cutlets<br>
|
||||
<b>Boiled Spagetti:</b> Microwave spaghetti.<br>
|
||||
<b>Donuts:</b> 1u sugar + 1 doughslice<br>
|
||||
<b>Donuts:</b> 1u sugar + 1 pastry base<br>
|
||||
<b>Fries:</b> Process potato.
|
||||
|
||||
</body>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
/obj/item/weapon/twohanded/singularityhammer/New()
|
||||
..()
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/singularityhammer/Destroy()
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
var/status = 0
|
||||
var/obj/item/weapon/stock_parts/cell/high/bcell = null
|
||||
var/hitcost = 1000
|
||||
var/losspertick = 5
|
||||
|
||||
/obj/item/weapon/melee/baton/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide.</span>")
|
||||
@@ -44,6 +45,25 @@
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/melee/baton/proc/update_process()
|
||||
if(status)
|
||||
SSobj.processing |= src
|
||||
else
|
||||
SSobj.processing.Remove(src)
|
||||
|
||||
/obj/item/weapon/melee/baton/process()
|
||||
if(bcell)
|
||||
if(bcell.charge < hitcost)
|
||||
status = 0
|
||||
update_icon()
|
||||
if(status)
|
||||
if(isrobot(loc))
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if(R && R.cell)
|
||||
R.cell.use(losspertick)
|
||||
else
|
||||
bcell.use(losspertick)
|
||||
|
||||
/obj/item/weapon/melee/baton/update_icon()
|
||||
if(status)
|
||||
icon_state = "[initial(name)]_active"
|
||||
@@ -51,6 +71,7 @@
|
||||
icon_state = "[initial(name)]_nocell"
|
||||
else
|
||||
icon_state = "[initial(name)]"
|
||||
update_process()
|
||||
|
||||
/obj/item/weapon/melee/baton/examine(mob/user)
|
||||
..()
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
src.air_contents.volume = volume //liters
|
||||
src.air_contents.temperature = T20C
|
||||
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -317,7 +317,7 @@
|
||||
damtype = "fire"
|
||||
hitsound = 'sound/items/welder.ogg'
|
||||
icon_state = "welder1"
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
else
|
||||
user << "<span class='notice'>You need more fuel.</span>"
|
||||
welding = 0
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
return ..()
|
||||
|
||||
if(content_mob != null && already_opened == 0)
|
||||
for(var/i = 0, i <= amount, i++)
|
||||
for(var/i = 1, i <= amount, i++)
|
||||
new content_mob(loc)
|
||||
already_opened = 1
|
||||
..()
|
||||
|
||||
@@ -18,8 +18,6 @@
|
||||
else
|
||||
new /obj/item/weapon/storage/backpack/satchel_eng(src)
|
||||
new /obj/item/weapon/storage/backpack/dufflebag/engineering(src)
|
||||
new /obj/item/areaeditor/blueprints(src)
|
||||
new /obj/item/weapon/storage/box/permits(src)
|
||||
new /obj/item/clothing/under/rank/chief_engineer(src)
|
||||
new /obj/item/clothing/head/hardhat/white(src)
|
||||
new /obj/item/clothing/head/welding(src)
|
||||
@@ -29,7 +27,10 @@
|
||||
new /obj/item/device/radio/headset/heads/ce(src)
|
||||
new /obj/item/weapon/storage/toolbox/mechanical(src)
|
||||
new /obj/item/clothing/suit/hazardvest(src)
|
||||
new /obj/item/weapon/storage/box/permits(src)
|
||||
new /obj/item/areaeditor/blueprints(src)
|
||||
new /obj/item/weapon/airlock_painter(src)
|
||||
new /obj/item/tapeproj/engineering(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/device/flash/handheld(src)
|
||||
@@ -106,10 +107,11 @@
|
||||
new /obj/item/weapon/storage/backpack/dufflebag/engineering(src)
|
||||
new /obj/item/clothing/under/rank/engineer(src)
|
||||
new /obj/item/clothing/shoes/workboots(src)
|
||||
new /obj/item/weapon/storage/toolbox/mechanical(src)
|
||||
// new /obj/item/weapon/cartridge/engineering(src)
|
||||
new /obj/item/device/radio/headset/headset_eng(src)
|
||||
new /obj/item/clothing/suit/hazardvest(src)
|
||||
new /obj/item/weapon/storage/toolbox/mechanical(src)
|
||||
new /obj/item/tapeproj/engineering(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/clothing/glasses/meson(src)
|
||||
return
|
||||
@@ -133,6 +135,7 @@
|
||||
new /obj/item/weapon/storage/backpack/satchel_norm(src)
|
||||
new /obj/item/weapon/storage/backpack/dufflebag/engineering(src)
|
||||
new /obj/item/weapon/tank/internals/emergency_oxygen/engi(src)
|
||||
new /obj/item/tapeproj/engineering(src)
|
||||
new /obj/item/weapon/watertank/atmos(src)
|
||||
new /obj/item/clothing/suit/fire/atmos(src)
|
||||
new /obj/item/clothing/head/hardhat/atmos(src)
|
||||
|
||||
@@ -82,6 +82,7 @@
|
||||
new /obj/item/weapon/storage/lockbox/loyalty(src)
|
||||
new /obj/item/weapon/storage/box/flashbangs(src)
|
||||
new /obj/item/device/megaphone/sec(src)
|
||||
new /obj/item/tapeproj/security(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer/swat(src)
|
||||
new /obj/item/weapon/shield/riot/tele(src)
|
||||
new /obj/item/weapon/melee/baton/loaded(src)
|
||||
@@ -113,6 +114,7 @@
|
||||
new /obj/item/clothing/mask/gas/sechailer(src)
|
||||
new /obj/item/weapon/storage/box/flashbangs(src)
|
||||
new /obj/item/weapon/storage/box/zipties(src)
|
||||
new /obj/item/tapeproj/security(src)
|
||||
new /obj/item/weapon/reagent_containers/spray/pepper(src)
|
||||
new /obj/item/weapon/melee/baton/loaded(src)
|
||||
new /obj/item/weapon/gun/energy/gun/advtaser(src)
|
||||
@@ -207,9 +209,9 @@
|
||||
new /obj/item/clothing/head/fedora(src)
|
||||
new /obj/item/clothing/shoes/laceup(src)
|
||||
new /obj/item/weapon/storage/box/evidence(src)
|
||||
new /obj/item/weapon/clipboard(src)
|
||||
new /obj/item/device/radio/headset/headset_sec/alt(src)
|
||||
new /obj/item/device/detective_scanner(src)
|
||||
new /obj/item/tapeproj/security(src)
|
||||
new /obj/item/clothing/suit/armor/vest/det_suit(src)
|
||||
new /obj/item/ammo_box/c38(src)
|
||||
new /obj/item/ammo_box/c38(src)
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
..()
|
||||
|
||||
/obj/structure/closet/statue/process()
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
var/mob/O = M
|
||||
if(!O.lastarea)
|
||||
O.lastarea = get_area(O.loc)
|
||||
O.update_gravity(O.mob_has_gravity())
|
||||
// O.update_gravity(O.mob_has_gravity())
|
||||
|
||||
var/loopsanity = 100
|
||||
for(var/atom/A in range(1))
|
||||
|
||||
@@ -114,6 +114,7 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/restart_controller,
|
||||
/client/proc/enable_debug_verbs,
|
||||
/client/proc/callproc,
|
||||
/client/proc/callproc_datum,
|
||||
/client/proc/SDQL2_query,
|
||||
/client/proc/test_movable_UI,
|
||||
/client/proc/test_snap_UI
|
||||
@@ -177,6 +178,7 @@ var/list/admin_verbs_hideable = list(
|
||||
/client/proc/restart_controller,
|
||||
/client/proc/cmd_admin_list_open_jobs,
|
||||
/client/proc/callproc,
|
||||
/client/proc/callproc_datum,
|
||||
/client/proc/Debug2,
|
||||
/client/proc/reload_admins,
|
||||
/client/proc/cmd_debug_make_powernets,
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/client/proc/jumptoarea(area/A in sortedAreas)
|
||||
/client/proc/jumptoarea(area/A in sortedAreas)
|
||||
set name = "Jump to Area"
|
||||
set desc = "Area to jump to"
|
||||
set category = "Admin"
|
||||
if(!src.holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
|
||||
if(!A)
|
||||
return
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
var/turf/T = pick_n_take(turfs)
|
||||
if(!T)
|
||||
src << "Nowhere to jump to!"
|
||||
return
|
||||
admin_forcemove(usr, T)
|
||||
return
|
||||
admin_forcemove(usr, T)
|
||||
log_admin("[key_name(usr)] jumped to [A]")
|
||||
message_admins("[key_name_admin(usr)] jumped to [A]")
|
||||
feedback_add_details("admin_verb","JA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -151,17 +151,12 @@
|
||||
/proc/admin_forcemove(var/mob/mover, var/atom/newloc)
|
||||
var/startdensity = mover.density
|
||||
var/startflags = mover.pass_flags
|
||||
var/startincorporeal = 0
|
||||
if(istype(mover, /mob/living))
|
||||
var/mob/living/L = mover
|
||||
startincorporeal = L.incorporeal_move
|
||||
L.incorporeal_move = 1
|
||||
var/startdestinationdensity = newloc.density
|
||||
mover.density = 0
|
||||
mover.pass_flags = ALL
|
||||
newloc.density = 0
|
||||
. = mover.Move(newloc)
|
||||
mover.density = startdensity
|
||||
mover.pass_flags = startflags
|
||||
if(istype(mover, /mob/living))
|
||||
var/mob/living/L = mover
|
||||
L.incorporeal_move = startincorporeal
|
||||
newloc.density = startdestinationdensity
|
||||
|
||||
|
||||
@@ -34,8 +34,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
spawn(0)
|
||||
var/target = null
|
||||
var/targetselected = 0
|
||||
var/lst[] // List reference
|
||||
lst = new/list() // Make the list
|
||||
var/returnval = null
|
||||
var/class = null
|
||||
|
||||
@@ -64,53 +62,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null
|
||||
if(!procname) return
|
||||
|
||||
var/argnum = input("Number of arguments","Number:",0) as num|null
|
||||
if(!argnum && (argnum!=0)) return
|
||||
|
||||
lst.len = argnum // Expand to right length
|
||||
//TODO: make a list to store whether each argument was initialised as null.
|
||||
//Reason: So we can abort the proccall if say, one of our arguments was a mob which no longer exists
|
||||
//this will protect us from a fair few errors ~Carn
|
||||
|
||||
var/i
|
||||
for(i=1, i<argnum+1, i++) // Lists indexed from 1 forwards in byond
|
||||
|
||||
// Make a list with each index containing one variable, to be given to the proc
|
||||
class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","CANCEL")
|
||||
switch(class)
|
||||
if("CANCEL")
|
||||
return
|
||||
|
||||
if("text")
|
||||
lst[i] = input("Enter new text:","Text",null) as text
|
||||
|
||||
if("num")
|
||||
lst[i] = input("Enter new number:","Num",0) as num
|
||||
|
||||
if("type")
|
||||
lst[i] = input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf)
|
||||
|
||||
if("reference")
|
||||
lst[i] = input("Select reference:","Reference",src) as mob|obj|turf|area in world
|
||||
|
||||
if("mob reference")
|
||||
lst[i] = input("Select reference:","Reference",usr) as mob in world
|
||||
|
||||
if("file")
|
||||
lst[i] = input("Pick file:","File") as file
|
||||
|
||||
if("icon")
|
||||
lst[i] = input("Pick icon:","Icon") as icon
|
||||
|
||||
if("client")
|
||||
var/list/keys = list()
|
||||
for(var/mob/M in world)
|
||||
keys += M.client
|
||||
lst[i] = input("Please, select a player!", "Selection", null, null) as null|anything in keys
|
||||
|
||||
if("mob's area")
|
||||
var/mob/temp = input("Select mob", "Selection", usr) as mob in world
|
||||
lst[i] = temp.loc
|
||||
var/list/lst = get_callproc_args()
|
||||
if(!lst)
|
||||
return
|
||||
|
||||
if(targetselected)
|
||||
if(!target)
|
||||
@@ -129,6 +83,87 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
usr << "<font color='blue'>[procname] returned: [returnval ? returnval : "null"]</font>"
|
||||
feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/callproc_datum(var/atom/A as null|area|mob|obj|turf)
|
||||
set category = "Debug"
|
||||
set name = "Atom ProcCall"
|
||||
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
|
||||
if(!istype(A))
|
||||
return
|
||||
|
||||
var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null
|
||||
if(!procname)
|
||||
return
|
||||
|
||||
var/list/lst = get_callproc_args()
|
||||
if(!lst)
|
||||
return
|
||||
|
||||
if(!A || A.gc_destroyed)
|
||||
usr << "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>"
|
||||
return
|
||||
if(!hascall(A,procname))
|
||||
usr << "<span class='warning'>Error: callproc_datum(): target has no such call [procname].</span>"
|
||||
return
|
||||
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
|
||||
|
||||
spawn()
|
||||
var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
|
||||
usr << "<span class='notice'>[procname] returned: [returnval ? returnval : "null"]</span>"
|
||||
|
||||
feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/get_callproc_args()
|
||||
var/argnum = input("Number of arguments","Number:",0) as num|null
|
||||
if(!argnum && (argnum!=0)) return
|
||||
|
||||
var/list/lst = list()
|
||||
//TODO: make a list to store whether each argument was initialised as null.
|
||||
//Reason: So we can abort the proccall if say, one of our arguments was a mob which no longer exists
|
||||
//this will protect us from a fair few errors ~Carn
|
||||
|
||||
while(argnum--)
|
||||
// Make a list with each index containing one variable, to be given to the proc
|
||||
var/class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","CANCEL")
|
||||
switch(class)
|
||||
if("CANCEL")
|
||||
return null
|
||||
|
||||
if("text")
|
||||
lst += input("Enter new text:","Text",null) as text
|
||||
|
||||
if("num")
|
||||
lst += input("Enter new number:","Num",0) as num
|
||||
|
||||
if("type")
|
||||
lst += input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf)
|
||||
|
||||
if("reference")
|
||||
lst += input("Select reference:","Reference",src) as mob|obj|turf|area in world
|
||||
|
||||
if("mob reference")
|
||||
lst += input("Select reference:","Reference",usr) as mob in world
|
||||
|
||||
if("file")
|
||||
lst += input("Pick file:","File") as file
|
||||
|
||||
if("icon")
|
||||
lst += input("Pick icon:","Icon") as icon
|
||||
|
||||
if("client")
|
||||
var/list/keys = list()
|
||||
for(var/mob/M in world)
|
||||
keys += M.client
|
||||
lst += input("Please, select a player!", "Selection", null, null) as null|anything in keys
|
||||
|
||||
if("mob's area")
|
||||
var/mob/temp = input("Select mob", "Selection", usr) as mob in world
|
||||
lst += temp.loc
|
||||
return lst
|
||||
|
||||
|
||||
/client/proc/Cell()
|
||||
set category = "Debug"
|
||||
set name = "Air Status in Location"
|
||||
|
||||
@@ -91,6 +91,9 @@
|
||||
|
||||
if(!src.holder) return
|
||||
|
||||
var/confirm = alert(src, "Are you sure you want to reload all admins?", "Confirm", "Yes", "No")
|
||||
if(confirm !="Yes") return
|
||||
|
||||
message_admins("[key_name_admin(usr)] manually reloaded admins")
|
||||
load_admins()
|
||||
feedback_add_details("admin_verb","RLDA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -116,4 +119,4 @@
|
||||
usr << "<b>Jobbans active in this round.</b>"
|
||||
for(var/t in jobban_keylist)
|
||||
if(findtext(t, filter))
|
||||
usr << "[t]"
|
||||
usr << "[t]"
|
||||
|
||||
@@ -36,3 +36,9 @@
|
||||
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
|
||||
msg = "<span class='adminnotice'><b><font color=crimson>SYNDICATE:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[Sender]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;SyndicateReply=\ref[Sender]'>RPLY</A>):</b> [msg]</span>"
|
||||
admins << msg
|
||||
|
||||
/proc/Nuke_request(var/text , var/mob/Sender)
|
||||
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
|
||||
msg = "<span class='adminnotice'> <b><font color=orange>NUKE CODE REQUEST:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[Sender]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;CentcommReply=\ref[Sender]'>RPLY</A>):</b> [msg]</span>"
|
||||
admins << msg
|
||||
admins << "<span class='adminnotice'><b>At this current time, the nuke must have the code manually set via varedit.</b></span>"
|
||||
@@ -767,6 +767,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if(!holder)
|
||||
usr << "Admin only."
|
||||
return
|
||||
|
||||
var/confirm = alert(src, "You sure you want to blank all NTSL scripts?", "Confirm", "Yes", "No")
|
||||
if(confirm !="Yes") return
|
||||
|
||||
for(var/obj/machinery/telecomms/server/S in telecomms_list)
|
||||
var/datum/TCS_Compiler/C = S.Compiler
|
||||
S.rawcode = ""
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/item/device/assembly/infra/toggle_secure()
|
||||
secured = !secured
|
||||
if(secured)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
else
|
||||
on = 0
|
||||
if(first) qdel(first)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
/obj/item/device/assembly/prox_sensor/toggle_secure()
|
||||
secured = !secured
|
||||
if(secured)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
else
|
||||
scanning = 0
|
||||
timing = 0
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
/obj/item/device/assembly/timer/toggle_secure()
|
||||
secured = !secured
|
||||
if(secured)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
else
|
||||
timing = 0
|
||||
SSobj.processing.Remove(src)
|
||||
|
||||
@@ -248,6 +248,7 @@ var/next_external_rsc = 0
|
||||
'nano/templates/smes.tmpl',
|
||||
'nano/templates/apc.tmpl',
|
||||
'nano/templates/cryo.tmpl',
|
||||
'nano/templates/solar_control.tmpl',
|
||||
'nano/images/uiBackground.png',
|
||||
'nano/images/uiIcons16.png',
|
||||
'nano/images/uiIcons24.png',
|
||||
|
||||
@@ -200,7 +200,7 @@ BLIND // can't see anything
|
||||
permeability_coefficient = 0.90
|
||||
slot_flags = SLOT_ICLOTHING
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
var/fitted = 1// For use in alternate clothing styles for women, if clothes vary from a jumpsuit in shape, set this to 0
|
||||
var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women
|
||||
var/has_sensor = 1//For the crew computer 2 = unable to change mode
|
||||
var/sensor_mode = 0
|
||||
var/can_adjust = 1
|
||||
@@ -259,9 +259,9 @@ BLIND // can't see anything
|
||||
if(hastie)
|
||||
user << "\A [hastie] is attached to it."
|
||||
|
||||
atom/proc/generate_female_clothing(index,t_color,icon)
|
||||
atom/proc/generate_female_clothing(index,t_color,icon,type)
|
||||
var/icon/female_clothing_icon = icon("icon"=icon, "icon_state"="[t_color]_s")
|
||||
var/icon/female_s = icon("icon"='icons/mob/uniform.dmi', "icon_state"="female_s")
|
||||
var/icon/female_s = icon("icon"='icons/mob/uniform.dmi', "icon_state"="[(type == FEMALE_UNIFORM_FULL) ? "female_full" : "female_top"]")
|
||||
female_clothing_icon.Blend(female_s, ICON_MULTIPLY)
|
||||
female_clothing_icon = fcopy_rsc(female_clothing_icon)
|
||||
female_clothing_icons[index] = female_clothing_icon
|
||||
@@ -317,11 +317,13 @@ atom/proc/generate_female_clothing(index,t_color,icon)
|
||||
usr << "You cannot wear this suit any differently."
|
||||
return
|
||||
if(src.adjusted == 1)
|
||||
src.fitted = initial(fitted)
|
||||
src.item_color = initial(item_color)
|
||||
src.item_color = src.suit_color //colored jumpsuits are shit and break without this
|
||||
usr << "You adjust the suit back to normal."
|
||||
src.adjusted = 0
|
||||
else
|
||||
src.fitted = NO_FEMALE_UNIFORM
|
||||
src.item_color += "_d"
|
||||
usr << "You adjust the suit to wear it more casually."
|
||||
src.adjusted = 1
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
src.force = 3
|
||||
src.damtype = "fire"
|
||||
src.icon_state = "cake1"
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
else
|
||||
src.force = null
|
||||
src.damtype = "brute"
|
||||
|
||||
@@ -67,6 +67,11 @@
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "taperecorder_idle"
|
||||
aggressiveness = 1 //Borgs are nicecurity!
|
||||
ignore_maskadjust = 1
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/cyborg/New()
|
||||
..()
|
||||
verbs -= /obj/item/clothing/mask/gas/sechailer/verb/adjust
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
user << "\[ <span style='color: #00ff00;'>ok</span> \] Starting ui display driver"
|
||||
user << "\[ <span style='color: #00ff00;'>ok</span> \] Initializing chronowalk4-view"
|
||||
new_camera(user)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
activated = 1
|
||||
else
|
||||
user << "\[ <span style='color: #ff0000;'>fail</span> \] Mounting /dev/helmet"
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
icon_state = "clown"
|
||||
item_state = "clown"
|
||||
item_color = "clown"
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
icon_state = "lawyer_purp"
|
||||
item_state = "lawyer_purp"
|
||||
item_color = "lawyer_purp"
|
||||
fitted = 0
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
can_adjust = 1
|
||||
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
item_color = "nursesuit"
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
fitted = 0
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/rank/medical
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
icon_state = "sexyclown"
|
||||
item_state = "sexyclown"
|
||||
item_color = "sexyclown"
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/rank/vice
|
||||
@@ -131,7 +131,6 @@
|
||||
desc = "A jumpsuit with owl wings. Photorealistic owl feathers! Twooooo!"
|
||||
icon_state = "owl"
|
||||
item_color = "owl"
|
||||
fitted = 0
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/rainbow
|
||||
@@ -242,7 +241,7 @@
|
||||
icon_state = "blackskirt"
|
||||
item_color = "blackskirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/schoolgirl
|
||||
@@ -252,7 +251,7 @@
|
||||
item_state = "schoolgirl"
|
||||
item_color = "schoolgirl"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/schoolgirl/red
|
||||
@@ -312,7 +311,7 @@
|
||||
item_state = "kilt"
|
||||
item_color = "kilt"
|
||||
body_parts_covered = CHEST|GROIN|FEET
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/sexymime
|
||||
@@ -322,7 +321,7 @@
|
||||
item_state = "sexymime"
|
||||
item_color = "sexymime"
|
||||
body_parts_covered = CHEST|GROIN|LEGS
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/gladiator
|
||||
@@ -332,7 +331,7 @@
|
||||
item_state = "gladiator"
|
||||
item_color = "gladiator"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
fitted = 0
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/sundress
|
||||
@@ -342,7 +341,7 @@
|
||||
item_state = "sundress"
|
||||
item_color = "sundress"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/captainparade
|
||||
@@ -367,7 +366,7 @@
|
||||
icon_state = "hos_parade_fem"
|
||||
item_state = "r_suit"
|
||||
item_color = "hos_parade_fem"
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/assistantformal
|
||||
@@ -384,7 +383,7 @@
|
||||
icon_state = "black_tango"
|
||||
item_state = "wcoat"
|
||||
item_color = "black_tango"
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/stripeddress
|
||||
@@ -393,7 +392,7 @@
|
||||
icon_state = "striped_dress"
|
||||
item_state = "stripeddress"
|
||||
item_color = "striped_dress"
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_FULL
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/sailordress
|
||||
@@ -402,7 +401,7 @@
|
||||
icon_state = "sailor_dress"
|
||||
item_state = "sailordress"
|
||||
item_color = "sailor_dress"
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/redeveninggown
|
||||
@@ -411,7 +410,7 @@
|
||||
icon_state = "red_evening_gown"
|
||||
item_state = "redeveninggown"
|
||||
item_color = "red_evening_gown"
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/maid
|
||||
@@ -421,7 +420,7 @@
|
||||
item_state = "maid"
|
||||
item_color = "maid"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/janimaid
|
||||
@@ -431,7 +430,7 @@
|
||||
item_state = "janimaid"
|
||||
item_color = "janimaid"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/plaid_skirt
|
||||
@@ -440,7 +439,7 @@
|
||||
icon_state = "plaid_red"
|
||||
item_state = "plaid_red"
|
||||
item_color = "plaid_red"
|
||||
fitted = 0
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/plaid_skirt/blue
|
||||
@@ -455,4 +454,4 @@
|
||||
desc = "A preppy purple skirt with a white blouse."
|
||||
icon_state = "plaid_purple"
|
||||
item_state = "plaid_purple"
|
||||
item_color = "plaid_purple"
|
||||
item_color = "plaid_purple"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/clothing/under/pants
|
||||
gender = PLURAL
|
||||
body_parts_covered = GROIN|LEGS
|
||||
fitted = 0
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/pants/classicjeans
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "95% Polyester, 5% Spandex!"
|
||||
gender = PLURAL
|
||||
body_parts_covered = GROIN
|
||||
fitted = 0
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
can_adjust = 0
|
||||
|
||||
/obj/item/clothing/under/shorts/red
|
||||
|
||||
@@ -323,7 +323,7 @@
|
||||
qdel(src)
|
||||
|
||||
spawn_spacevine_piece(loc, , muts)
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
init_subtypes(/datum/spacevine_mutation/, mutations_list)
|
||||
if(mttv != null)
|
||||
mutativness = mttv
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
if(!(user in color_altered_mobs))
|
||||
color_altered_mobs += user
|
||||
user.color = "#00FF00"
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
..()
|
||||
|
||||
/obj/item/weapon/greentext/dropped(mob/living/user as mob)
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/tequila
|
||||
name = "Caccavo Guaranteed Quality Tequila"
|
||||
desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!"
|
||||
icon_state = "tequillabottle"
|
||||
icon_state = "tequilabottle"
|
||||
list_reagents = list("tequila" = 100)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing
|
||||
|
||||
@@ -434,6 +434,14 @@
|
||||
icon_state = "dr_gibb_glass"
|
||||
name = "Glass of welder fuel"
|
||||
desc = "Unless you are an industrial tool, this is probably not safe for consumption."
|
||||
if("b52")
|
||||
icon_state = "b52glass"
|
||||
name = "B-52"
|
||||
desc = "Kahlua, Irish Cream, and cognac. You will get bombed."
|
||||
if("toxinsspecial")
|
||||
icon_state = "toxinsspecialglass"
|
||||
name = "Toxins Special"
|
||||
desc = "Whoah, this thing is on FIRE"
|
||||
else
|
||||
icon_state ="glass_brown"
|
||||
name = "Glass of ..what?"
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
for(var/obj/item/I in ingredients)
|
||||
if(!istype(S, I.type))
|
||||
customname = "custom"
|
||||
break
|
||||
if(ingredients.len == 1) //first ingredient
|
||||
if(istype(S, /obj/item/weapon/reagent_containers/food/snacks/meat/human))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/meat/human/H = S
|
||||
@@ -198,7 +199,7 @@
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich
|
||||
name = "sandwich"
|
||||
name = "toast"
|
||||
desc = "A timeless classic."
|
||||
Ingredientsplacement = INGREDIENTS_STACK
|
||||
icon_state = "breadslice"
|
||||
@@ -215,6 +216,7 @@
|
||||
return
|
||||
user << "<span class='notice'>You finish the [src.name].</span>"
|
||||
finished = 1
|
||||
name = "[customname] sandwich"
|
||||
BS.reagents.trans_to(src, BS.reagents.total_volume)
|
||||
ingMax = ingredients.len //can't add more ingredients after that
|
||||
var/image/TOP = new(icon, "[BS.icon_state]")
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain
|
||||
list_reagents = list("nutriment" = 3)
|
||||
w_class = 3
|
||||
flags = OPENCONTAINER
|
||||
|
||||
|
||||
// Dough + rolling pin = flat dough
|
||||
@@ -55,6 +56,7 @@
|
||||
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/pizzabread
|
||||
list_reagents = list("nutriment" = 3)
|
||||
w_class = 3
|
||||
flags = OPENCONTAINER
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pizzabread
|
||||
name = "pizza bread"
|
||||
@@ -73,6 +75,7 @@
|
||||
icon_state = "doughslice"
|
||||
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/bun
|
||||
filling_color = "#CD853F"
|
||||
flags = OPENCONTAINER
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
bitesize = 2
|
||||
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich
|
||||
filling_color = "#FFA500"
|
||||
slot_flags = SLOT_HEAD // i'm going to kill myself. i'm going to murder my own self.
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain
|
||||
name = "bread"
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
return
|
||||
if (istype(O, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = O
|
||||
if(!user.Adjacent(G.affecting))
|
||||
return
|
||||
var/grabbed = G.affecting
|
||||
if(istype(grabbed, /mob/living/carbon/monkey))
|
||||
var/mob/living/carbon/monkey/target = grabbed
|
||||
|
||||
@@ -119,6 +119,8 @@
|
||||
var/what = O
|
||||
if (istype(O, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = O
|
||||
if(!user.Adjacent(G.affecting))
|
||||
return
|
||||
what = G.affecting
|
||||
|
||||
var/datum/food_processor_process/P = select_recipe(what)
|
||||
|
||||
@@ -368,13 +368,6 @@
|
||||
result_amount = 2
|
||||
|
||||
/datum/chemical_reaction/iced_beer
|
||||
name = "Iced Beer"
|
||||
id = "iced_beer"
|
||||
result = "iced_beer"
|
||||
required_reagents = list("beer" = 10, "frostoil" = 1)
|
||||
result_amount = 10
|
||||
|
||||
/datum/chemical_reaction/iced_beer2
|
||||
name = "Iced Beer"
|
||||
id = "iced_beer"
|
||||
result = "iced_beer"
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
|
||||
|
||||
// see code/module/crafting/table.dm
|
||||
|
||||
////////////////////////////////////////////////DOUGH////////////////////////////////////////////////
|
||||
|
||||
//these recipes can also be done with attackby.
|
||||
|
||||
/datum/table_recipe/cakebatter
|
||||
name = "Cake Batter"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/milk = 5,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cakebatter
|
||||
|
||||
/datum/table_recipe/cakebatter/alt
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/soymilk = 5,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/dough = 1
|
||||
)
|
||||
|
||||
/datum/table_recipe/piedough
|
||||
name = "Pie Dough"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/milk = 5,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/flatdough = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/piedough
|
||||
|
||||
/datum/table_recipe/piedough/alt
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/soymilk = 5,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/flatdough = 1
|
||||
)
|
||||
|
||||
/datum/table_recipe/rawpastrybase
|
||||
name = "Raw Pastry Base"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/milk = 5,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/doughslice = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/rawpastrybase
|
||||
|
||||
/datum/table_recipe/rawpastrybase/alt
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/soymilk = 5,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/doughslice = 1
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
reqs = list(
|
||||
/datum/reagent/toxin/slimejelly = 5,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tofu = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime
|
||||
|
||||
@@ -37,7 +36,6 @@
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/cherryjelly = 5,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tofu = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry
|
||||
|
||||
|
||||
@@ -508,7 +508,9 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is aiming the [src.name] at themself! It looks like \he's trying to commit suicide.</span>")
|
||||
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
|
||||
sleep(15)
|
||||
sleep(25)
|
||||
user.say("BANG!")
|
||||
sleep(25)
|
||||
user.visible_message("<B>[user]</B> laughs so hard they begin to suffocate!")
|
||||
return (OXYLOSS)
|
||||
|
||||
@@ -576,7 +578,7 @@
|
||||
..()
|
||||
if( istype(src.loc, /mob) )
|
||||
held_mob = src.loc
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili/process()
|
||||
if(held_mob && src.loc == held_mob)
|
||||
|
||||
@@ -3,19 +3,12 @@
|
||||
* Contains:
|
||||
* Borrowbook datum
|
||||
* Library Public Computer
|
||||
* Cachedbook datum
|
||||
* Library Computer
|
||||
* Library Scanner
|
||||
* Book Binder
|
||||
*/
|
||||
|
||||
/*
|
||||
* Borrowbook datum
|
||||
*/
|
||||
datum/borrowbook // Datum used to keep track of who has borrowed what when and for how long.
|
||||
var/bookname
|
||||
var/mobname
|
||||
var/getdate
|
||||
var/duedate
|
||||
|
||||
|
||||
/*
|
||||
@@ -116,11 +109,55 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
/*
|
||||
* Borrowbook datum
|
||||
*/
|
||||
datum/borrowbook // Datum used to keep track of who has borrowed what when and for how long.
|
||||
var/bookname
|
||||
var/mobname
|
||||
var/getdate
|
||||
var/duedate
|
||||
|
||||
/*
|
||||
* Cachedbook datum
|
||||
*/
|
||||
datum/cachedbook // Datum used to cache the SQL DB books locally in order to achieve a performance gain.
|
||||
var/id
|
||||
var/title
|
||||
var/author
|
||||
var/category
|
||||
|
||||
var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
|
||||
|
||||
|
||||
/proc/load_library_db_to_cache()
|
||||
if(cachedbooks)
|
||||
return
|
||||
establish_db_connection()
|
||||
if(!dbcon.IsConnected())
|
||||
return
|
||||
cachedbooks = list()
|
||||
var/DBQuery/query = dbcon.NewQuery("SELECT id, author, title, category FROM [format_table_name("library")] WHERE isnull(deleted)")
|
||||
query.Execute()
|
||||
|
||||
while(query.NextRow())
|
||||
var/datum/cachedbook/newbook = new()
|
||||
newbook.id = query.item[1]
|
||||
newbook.author = query.item[2]
|
||||
newbook.title = query.item[3]
|
||||
newbook.category = query.item[4]
|
||||
cachedbooks += newbook
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Library Computer
|
||||
* After 860 days, it's finally a buildable computer.
|
||||
*/
|
||||
// TODO: Make this an actual /obj/machinery/computer that can be crafted from circuit boards and such
|
||||
// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it.
|
||||
// It's December 25th, 2014, and this is STILL here, and it's STILL relevant. Kill me
|
||||
/obj/machinery/computer/libraryconsole/bookmanagement
|
||||
name = "book inventory management console"
|
||||
var/arcanecheckout = 0
|
||||
@@ -132,8 +169,18 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
||||
var/list/inventory = list()
|
||||
var/checkoutperiod = 5 // In minutes
|
||||
var/obj/machinery/libraryscanner/scanner // Book scanner that will be used when uploading books to the Archive
|
||||
var/libcomp_menu
|
||||
var/bibledelay = 0 // LOL NO SPAM (1 minute delay) -- Doohl
|
||||
|
||||
var/bibledelay = 0
|
||||
/obj/machinery/computer/libraryconsole/bookmanagement/proc/build_library_menu()
|
||||
if(libcomp_menu)
|
||||
return
|
||||
load_library_db_to_cache()
|
||||
if(!cachedbooks)
|
||||
return
|
||||
libcomp_menu = ""
|
||||
for(var/datum/cachedbook/C in cachedbooks)
|
||||
libcomp_menu += "<tr><td>[C.author]</td><td>[C.title]</td><td>[C.category]</td><td><A href='?src=\ref[src];targetid=[C.id]'>\[Order\]</A></td></tr>\n"
|
||||
|
||||
/obj/machinery/computer/libraryconsole/bookmanagement/New()
|
||||
..()
|
||||
@@ -198,23 +245,15 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
||||
dat += "<A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"
|
||||
if(4)
|
||||
dat += "<h3>External Archive</h3>"
|
||||
establish_db_connection()
|
||||
if(!dbcon.IsConnected())
|
||||
build_library_menu()
|
||||
|
||||
if(!cachedbooks)
|
||||
dat += "<font color=red><b>ERROR</b>: Unable to contact External Archive. Please contact your system administrator for assistance.</font>"
|
||||
else
|
||||
dat += "<A href='?src=\ref[src];orderbyid=1'>(Order book by SS<sup>13</sup>BN)</A><BR><BR>"
|
||||
dat += "<table>"
|
||||
dat += "<tr><td>AUTHOR</td><td>TITLE</td><td>CATEGORY</td><td></td></tr>"
|
||||
|
||||
var/DBQuery/query = dbcon.NewQuery("SELECT id, author, title, category FROM [format_table_name("library")] WHERE isnull(deleted)")
|
||||
query.Execute()
|
||||
|
||||
while(query.NextRow())
|
||||
var/id = query.item[1]
|
||||
var/author = query.item[2]
|
||||
var/title = query.item[3]
|
||||
var/category = query.item[4]
|
||||
dat += "<tr><td>[author]</td><td>[title]</td><td>[category]</td><td><A href='?src=\ref[src];targetid=[id]'>\[Order\]</A></td></tr>"
|
||||
dat += libcomp_menu
|
||||
dat += "</table>"
|
||||
dat += "<BR><A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"
|
||||
if(5)
|
||||
@@ -343,12 +382,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
||||
if(!dbcon.IsConnected())
|
||||
alert("Connection to Archive has been severed. Aborting.")
|
||||
else
|
||||
/*
|
||||
var/sqltitle = dbcon.Quote(scanner.cache.name)
|
||||
var/sqlauthor = dbcon.Quote(scanner.cache.author)
|
||||
var/sqlcontent = dbcon.Quote(scanner.cache.dat)
|
||||
var/sqlcategory = dbcon.Quote(upload_category)
|
||||
*/
|
||||
|
||||
var/sqltitle = sanitizeSQL(scanner.cache.name)
|
||||
var/sqlauthor = sanitizeSQL(scanner.cache.author)
|
||||
var/sqlcontent = sanitizeSQL(scanner.cache.dat)
|
||||
@@ -358,7 +392,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
|
||||
usr << query.ErrorMsg()
|
||||
else
|
||||
log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs")
|
||||
alert("Upload Complete.")
|
||||
alert("Upload Complete. Uploaded title will be unavailable for printing for a short period")
|
||||
|
||||
if(href_list["targetid"])
|
||||
var/sqlid = sanitizeSQL(href_list["targetid"])
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
/mob/living/carbon/alien/getToxLoss()
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/alien/proc/handle_environment(var/datum/gas_mixture/environment)
|
||||
/mob/living/carbon/alien/handle_environment(var/datum/gas_mixture/environment)
|
||||
|
||||
//If there are alien weeds on the ground then heal if needed or give some toxins
|
||||
if(locate(/obj/structure/alien/weeds) in loc)
|
||||
@@ -111,7 +111,7 @@
|
||||
fire_alert = max(fire_alert, 2)
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/proc/handle_mutations_and_radiation()
|
||||
/mob/living/carbon/alien/handle_mutations_and_radiation()
|
||||
|
||||
// Aliens love radiation nom nom nom
|
||||
if (radiation)
|
||||
|
||||
@@ -8,61 +8,6 @@
|
||||
var/temperature_alert = 0
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (notransform)
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
if (stat != DEAD) //still breathing
|
||||
|
||||
//First, resolve location and get a breath
|
||||
|
||||
if(SSmob.times_fired%4==2)
|
||||
//Only try to take a breath every 4 seconds, unless suffocating
|
||||
spawn(0) breathe()
|
||||
|
||||
else //Still give containing object the chance to interact
|
||||
if(istype(loc, /obj/))
|
||||
var/obj/location_as_object = loc
|
||||
location_as_object.handle_internal_lifeform(src, 0)
|
||||
|
||||
//Mutations and radiation
|
||||
handle_mutations_and_radiation()
|
||||
|
||||
//Chemicals in the body
|
||||
handle_chemicals_in_body()
|
||||
|
||||
//Apparently, the person who wrote this code designed it so that
|
||||
//blinded get reset each cycle and then get activated later in the
|
||||
//code. Very ugly. I dont care. Moving this stuff here so its easy
|
||||
//to find it.
|
||||
|
||||
//Handle temperature/pressure differences between body and environment
|
||||
handle_environment(environment)
|
||||
|
||||
//stuff in the stomach
|
||||
handle_stomach()
|
||||
|
||||
//Handle being on fire
|
||||
handle_fire()
|
||||
|
||||
//Status updates, death etc.
|
||||
handle_regular_status_updates()
|
||||
update_canmove()
|
||||
|
||||
// Grabbing
|
||||
for(var/obj/item/weapon/grab/G in src)
|
||||
G.process()
|
||||
|
||||
if(client)
|
||||
handle_regular_hud_updates()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/proc/adjust_body_temperature(current, loc_temp, boost)
|
||||
var/temperature = current
|
||||
var/difference = abs(current-loc_temp) //get difference
|
||||
@@ -80,7 +25,7 @@
|
||||
temp_change = (temperature - current)
|
||||
return temp_change
|
||||
|
||||
/mob/living/carbon/alien/humanoid/proc/handle_regular_status_updates()
|
||||
/mob/living/carbon/alien/humanoid/handle_regular_status_updates()
|
||||
updatehealth()
|
||||
|
||||
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
|
||||
@@ -160,7 +105,7 @@
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/proc/handle_regular_hud_updates()
|
||||
/mob/living/carbon/alien/humanoid/handle_regular_hud_updates()
|
||||
|
||||
if (stat == 2)
|
||||
sight |= SEE_TURFS
|
||||
|
||||
@@ -3,63 +3,18 @@
|
||||
/mob/living/carbon/alien/larva
|
||||
var/temperature_alert = 0
|
||||
|
||||
|
||||
/mob/living/carbon/alien/larva/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (notransform)
|
||||
return
|
||||
|
||||
..()
|
||||
var/datum/gas_mixture/enviroment = loc.return_air()
|
||||
if (stat != DEAD) //still breathing
|
||||
|
||||
if(..())
|
||||
// GROW!
|
||||
if(amount_grown < max_grown)
|
||||
amount_grown++
|
||||
|
||||
//First, resolve location and get a breath
|
||||
if(SSair.times_fired%4==2)
|
||||
//Only try to take a breath every 4 seconds, unless suffocating
|
||||
spawn(0) breathe()
|
||||
else //Still give containing object the chance to interact
|
||||
if(istype(loc, /obj/))
|
||||
var/obj/location_as_object = loc
|
||||
location_as_object.handle_internal_lifeform(src, 0)
|
||||
//Mutations and radiation
|
||||
handle_mutations_and_radiation()
|
||||
|
||||
//Chemicals in the body
|
||||
handle_chemicals_in_body()
|
||||
|
||||
|
||||
//Apparently, the person who wrote this code designed it so that
|
||||
//blinded get reset each cycle and then get activated later in the
|
||||
//code. Very ugly. I dont care. Moving this stuff here so its easy
|
||||
//to find it.
|
||||
|
||||
//Handle temperature/pressure differences between body and environment
|
||||
handle_environment(enviroment)
|
||||
|
||||
//stuff in the stomach
|
||||
//handle_stomach()
|
||||
|
||||
//Status updates, death etc.
|
||||
handle_regular_status_updates()
|
||||
update_canmove()
|
||||
|
||||
// Grabbing
|
||||
for(var/obj/item/weapon/grab/G in src)
|
||||
G.process()
|
||||
|
||||
//some kind of bug in canmove() isn't properly calling update_icons, so this is here as a placeholder
|
||||
update_icons()
|
||||
|
||||
if(client)
|
||||
handle_regular_hud_updates()
|
||||
|
||||
/mob/living/carbon/alien/larva/proc/handle_regular_status_updates()
|
||||
/mob/living/carbon/alien/larva/handle_regular_status_updates()
|
||||
updatehealth()
|
||||
|
||||
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
|
||||
@@ -69,6 +24,7 @@
|
||||
if(health < -25 || !getorgan(/obj/item/organ/brain))
|
||||
death()
|
||||
eye_blind = max(1, eye_blind)
|
||||
|
||||
silent = 0
|
||||
return 1
|
||||
|
||||
@@ -134,7 +90,7 @@
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/carbon/alien/larva/proc/handle_regular_hud_updates()
|
||||
/mob/living/carbon/alien/larva/handle_regular_hud_updates()
|
||||
|
||||
if (stat == 2)
|
||||
sight |= SEE_TURFS
|
||||
@@ -213,6 +169,4 @@
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/alien/larva/proc/handle_random_events()
|
||||
return
|
||||
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
/mob/living/carbon/alien/proc/handle_chemicals_in_body()
|
||||
|
||||
/mob/living/carbon/alien/Life()
|
||||
|
||||
if(..())
|
||||
//First, resolve location and get a breath
|
||||
if(SSair.times_fired%4==2)
|
||||
//Only try to take a breath every 4 seconds, unless suffocating
|
||||
spawn(0) breathe()
|
||||
else //Still give containing object the chance to interact
|
||||
if(istype(loc, /obj/))
|
||||
var/obj/location_as_object = loc
|
||||
location_as_object.handle_internal_lifeform(src, 0)
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/carbon/alien/handle_chemicals_in_body()
|
||||
if(reagents)
|
||||
reagents.metabolize(src)
|
||||
|
||||
@@ -113,19 +128,4 @@
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/alien/proc/handle_stomach()
|
||||
spawn(0)
|
||||
for(var/mob/living/M in stomach_contents)
|
||||
if(M.loc != src)
|
||||
stomach_contents.Remove(M)
|
||||
continue
|
||||
if(istype(M, /mob/living/carbon) && stat != 2)
|
||||
if(M.stat == 2)
|
||||
M.death(1)
|
||||
stomach_contents.Remove(M)
|
||||
qdel(M)
|
||||
continue
|
||||
if(SSmob.times_fired%3==1)
|
||||
if(!(M.status_flags & GODMODE))
|
||||
M.adjustBruteLoss(5)
|
||||
nutrition += 10
|
||||
|
||||
|
||||
@@ -14,11 +14,10 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
|
||||
if(istype(loc, /mob/living))
|
||||
affected_mob = loc
|
||||
affected_mob.status_flags |= XENO_HOST
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
if(istype(affected_mob,/mob/living/carbon))
|
||||
var/mob/living/carbon/H = affected_mob
|
||||
H.med_hud_set_status()
|
||||
SSobj.processing.Add(src)
|
||||
spawn(0)
|
||||
AddInfectionImages(affected_mob)
|
||||
else
|
||||
@@ -42,7 +41,6 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
|
||||
if(istype(affected_mob,/mob/living/carbon))
|
||||
var/mob/living/carbon/H = affected_mob
|
||||
H.med_hud_set_status()
|
||||
SSobj.processing.Remove(src)
|
||||
spawn(0)
|
||||
RemoveInfectionImages(affected_mob)
|
||||
affected_mob = null
|
||||
|
||||
@@ -1,37 +1,5 @@
|
||||
/mob/living/carbon/brain/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
..()
|
||||
|
||||
if(stat != DEAD)
|
||||
//Mutations and radiation
|
||||
handle_mutations_and_radiation()
|
||||
|
||||
//Chemicals in the body
|
||||
handle_chemicals_in_body()
|
||||
|
||||
var/datum/gas_mixture/environment // Added to prevent null location errors
|
||||
if(loc)
|
||||
environment = loc.return_air()
|
||||
|
||||
//Apparently, the person who wrote this code designed it so that
|
||||
//blinded get reset each cycle and then get activated later in the
|
||||
//code. Very ugly. I dont care. Moving this stuff here so its easy
|
||||
//to find it.
|
||||
|
||||
//Handle temperature/pressure differences between body and environment
|
||||
if(environment) // More error checking
|
||||
handle_environment(environment)
|
||||
|
||||
//Status updates, death etc.
|
||||
handle_regular_status_updates()
|
||||
update_canmove()
|
||||
|
||||
if(client)
|
||||
handle_regular_hud_updates()
|
||||
|
||||
|
||||
/mob/living/carbon/brain/proc/handle_mutations_and_radiation()
|
||||
/mob/living/carbon/brain/handle_mutations_and_radiation()
|
||||
|
||||
if (radiation)
|
||||
if (radiation > 100)
|
||||
@@ -68,7 +36,7 @@
|
||||
updatehealth()
|
||||
|
||||
|
||||
/mob/living/carbon/brain/proc/handle_environment(datum/gas_mixture/environment)
|
||||
/mob/living/carbon/brain/handle_environment(datum/gas_mixture/environment)
|
||||
if(!environment)
|
||||
return
|
||||
var/environment_heat_capacity = environment.heat_capacity()
|
||||
@@ -104,7 +72,7 @@
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/brain/proc/handle_chemicals_in_body()
|
||||
/mob/living/carbon/brain/handle_chemicals_in_body()
|
||||
|
||||
if(reagents) reagents.metabolize(src)
|
||||
|
||||
@@ -120,7 +88,7 @@
|
||||
return //TODO: DEFERRED
|
||||
|
||||
|
||||
/mob/living/carbon/brain/proc/handle_regular_status_updates() //TODO: comment out the unused bits >_>
|
||||
/mob/living/carbon/brain/handle_regular_status_updates() //TODO: comment out the unused bits >_>
|
||||
updatehealth()
|
||||
|
||||
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
|
||||
@@ -204,7 +172,7 @@
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/carbon/brain/proc/handle_regular_hud_updates()
|
||||
/mob/living/carbon/brain/handle_regular_hud_updates()
|
||||
|
||||
if (stat == 2)
|
||||
sight |= SEE_TURFS
|
||||
|
||||
@@ -86,8 +86,9 @@
|
||||
"<span class='userdanger'>You feel a powerful shock coursing through your body!</span>", \
|
||||
"<span class='danger'>You hear a heavy electrical crack.</span>" \
|
||||
)
|
||||
src.jitteriness += 1000 //High numbers for violent convulsions
|
||||
src.stuttering += 2
|
||||
jitteriness += 1000 //High numbers for violent convulsions
|
||||
do_jitter_animation(jitteriness)
|
||||
stuttering += 2
|
||||
Stun(2)
|
||||
spawn(20)
|
||||
src.jitteriness -= 990 //Still jittery, but vastly less
|
||||
|
||||
@@ -43,7 +43,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
src << "<span class='warning'>The blood soaks through your bandage.</span>"
|
||||
|
||||
// Takes care blood loss and regeneration
|
||||
/mob/living/carbon/human/proc/handle_blood()
|
||||
/mob/living/carbon/human/handle_blood()
|
||||
|
||||
if(NOBLOOD in dna.species.specflags)
|
||||
return
|
||||
|
||||
@@ -36,35 +36,14 @@
|
||||
|
||||
|
||||
/mob/living/carbon/human/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (notransform) return
|
||||
if(!loc) return // Fixing a null error that occurs when the mob isn't found in the world -- TLE
|
||||
|
||||
..()
|
||||
|
||||
//Apparently, the person who wrote this code designed it so that
|
||||
//blinded get reset each cycle and then get activated later in the
|
||||
//code. Very ugly. I dont care. Moving this stuff here so its easy
|
||||
//to find it.
|
||||
fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it.
|
||||
tinttotal = tintcheck() //here as both hud updates and status updates call it
|
||||
|
||||
//TODO: seperate this out
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
handle_regular_hud_updates()
|
||||
|
||||
//Status updates, death etc.
|
||||
//TODO: optimise ~Carn
|
||||
handle_regular_status_updates()
|
||||
|
||||
//No need to update all of these procs if the guy is dead.
|
||||
if(stat != DEAD)
|
||||
for(var/datum/mutation/human/HM in dna.mutations)
|
||||
HM.on_life(src)
|
||||
|
||||
if(..())
|
||||
if(dna)
|
||||
for(var/datum/mutation/human/HM in dna.mutations)
|
||||
HM.on_life(src)
|
||||
if(SSmob.times_fired%4==2 || failed_last_breath) //First, resolve location and get a breath
|
||||
breathe() //Only try to take a breath every 4 ticks, unless suffocating
|
||||
else //Still give containing object the chance to interact
|
||||
@@ -72,46 +51,12 @@
|
||||
var/obj/location_as_object = loc
|
||||
location_as_object.handle_internal_lifeform(src, 0)
|
||||
|
||||
//Updates the number of stored chemicals for powers
|
||||
handle_changeling()
|
||||
|
||||
//Mutations and radiation
|
||||
handle_mutations_and_radiation()
|
||||
|
||||
//Chemicals in the body
|
||||
handle_chemicals_in_body()
|
||||
|
||||
//Disabilities
|
||||
handle_disabilities()
|
||||
|
||||
//Blud
|
||||
handle_blood()
|
||||
|
||||
//Random events (vomiting etc)
|
||||
handle_random_events()
|
||||
|
||||
//Handle temperature/pressure differences between body and environment
|
||||
handle_environment(environment)
|
||||
|
||||
//Check if we're on fire
|
||||
handle_fire()
|
||||
|
||||
//stuff in the stomach
|
||||
handle_stomach()
|
||||
|
||||
|
||||
update_canmove()
|
||||
|
||||
//Update our name based on whether our face is obscured/disfigured
|
||||
name = get_visible_name()
|
||||
|
||||
if(dna)
|
||||
dna.species.spec_life(src) // for mutantraces
|
||||
|
||||
// Grabbing
|
||||
for(var/obj/item/weapon/grab/G in src)
|
||||
G.process()
|
||||
|
||||
|
||||
/mob/living/carbon/human/calculate_affecting_pressure(var/pressure)
|
||||
..()
|
||||
@@ -130,7 +75,7 @@
|
||||
return ONE_ATMOSPHERE - pressure_difference
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/handle_disabilities()
|
||||
/mob/living/carbon/human/handle_disabilities()
|
||||
if (getBrainLoss() >= 60 && stat != 2)
|
||||
if (prob(3))
|
||||
switch(pick(1,2,3))
|
||||
@@ -142,7 +87,7 @@
|
||||
emote("drool")
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/handle_mutations_and_radiation()
|
||||
/mob/living/carbon/human/handle_mutations_and_radiation()
|
||||
if(dna)
|
||||
dna.species.handle_mutations_and_radiation(src)
|
||||
|
||||
@@ -152,7 +97,7 @@
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/handle_environment(datum/gas_mixture/environment)
|
||||
/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment)
|
||||
if(dna)
|
||||
dna.species.handle_environment(environment, src)
|
||||
|
||||
@@ -407,13 +352,13 @@
|
||||
apply_damage(0.4*discomfort, BURN, "r_arm")
|
||||
*/
|
||||
|
||||
/mob/living/carbon/human/proc/handle_chemicals_in_body()
|
||||
/mob/living/carbon/human/handle_chemicals_in_body()
|
||||
if(dna)
|
||||
dna.species.handle_chemicals_in_body(src)
|
||||
|
||||
return //TODO: DEFERRED
|
||||
|
||||
/mob/living/carbon/human/proc/handle_regular_status_updates()
|
||||
/mob/living/carbon/human/handle_regular_status_updates()
|
||||
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
|
||||
silent = 0
|
||||
else //ALIVE. LIGHTS ARE ON
|
||||
@@ -510,13 +455,7 @@
|
||||
|
||||
//Jitteryness
|
||||
if(jitteriness)
|
||||
var/amplitude = min(4, (jitteriness/100) + 1)
|
||||
var/pixel_x_diff = rand(-amplitude, amplitude)
|
||||
var/pixel_y_diff = rand(-amplitude/3, amplitude/3)
|
||||
|
||||
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6)
|
||||
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y) , time = 2)
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
|
||||
do_jitter_animation(jitteriness)
|
||||
jitteriness = max(jitteriness-1, 0)
|
||||
|
||||
//Other
|
||||
@@ -545,7 +484,7 @@
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/handle_regular_hud_updates()
|
||||
/mob/living/carbon/human/handle_regular_hud_updates()
|
||||
if(!client) return 0
|
||||
|
||||
client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask)
|
||||
@@ -637,7 +576,7 @@
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/handle_random_events()
|
||||
/mob/living/carbon/human/handle_random_events()
|
||||
// Puke if toxloss is too high
|
||||
if(!stat)
|
||||
if (getToxLoss() >= 45 && nutrition > 20)
|
||||
@@ -659,24 +598,8 @@
|
||||
// make it so you can only puke so fast
|
||||
lastpuke = 0
|
||||
|
||||
/mob/living/carbon/human/proc/handle_stomach()
|
||||
spawn(0)
|
||||
for(var/mob/living/M in stomach_contents)
|
||||
if(M.loc != src)
|
||||
stomach_contents.Remove(M)
|
||||
continue
|
||||
if(istype(M, /mob/living/carbon) && stat != 2)
|
||||
if(M.stat == 2)
|
||||
M.death(1)
|
||||
stomach_contents.Remove(M)
|
||||
qdel(M)
|
||||
continue
|
||||
if(SSmob.times_fired%3==1)
|
||||
if(!(M.status_flags & GODMODE))
|
||||
M.adjustBruteLoss(5)
|
||||
nutrition += 10
|
||||
|
||||
/mob/living/carbon/human/proc/handle_changeling()
|
||||
/mob/living/carbon/human/handle_changeling()
|
||||
if(mind && mind.changeling)
|
||||
mind.changeling.regenerate()
|
||||
|
||||
|
||||
@@ -262,8 +262,8 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
|
||||
if(dna && dna.species.sexes)
|
||||
var/G = (gender == FEMALE) ? "f" : "m"
|
||||
if(G == "f" && U.fitted == 1)
|
||||
standing = wear_female_version(t_color, 'icons/mob/uniform.dmi', UNIFORM_LAYER)
|
||||
if(G == "f" && U.fitted != NO_FEMALE_UNIFORM)
|
||||
standing = wear_female_version(t_color, 'icons/mob/uniform.dmi', UNIFORM_LAYER, U.fitted)
|
||||
overlays_standing[UNIFORM_LAYER] = standing
|
||||
|
||||
if(w_uniform.blood_DNA)
|
||||
@@ -562,11 +562,11 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
|
||||
apply_overlay(L_HAND_LAYER)
|
||||
|
||||
/mob/living/carbon/human/proc/wear_female_version(t_color, icon, layer)
|
||||
/mob/living/carbon/human/proc/wear_female_version(t_color, icon, layer, type)
|
||||
var/index = "[t_color]_s"
|
||||
var/icon/female_clothing_icon = female_clothing_icons[index]
|
||||
if(!female_clothing_icon) //Create standing/laying icons if they don't exist
|
||||
generate_female_clothing(index,t_color,icon)
|
||||
generate_female_clothing(index,t_color,icon,type)
|
||||
var/standing = image("icon"=female_clothing_icons["[t_color]_s"], "layer"=-layer)
|
||||
return(standing)
|
||||
|
||||
|
||||
@@ -11,4 +11,119 @@
|
||||
else
|
||||
if (internals)
|
||||
internals.icon_state = "internal0"
|
||||
return
|
||||
return
|
||||
|
||||
/mob/living/carbon/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (notransform)
|
||||
return
|
||||
if(!loc)
|
||||
return
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
//Handle temperature/pressure differences between body and environment
|
||||
handle_environment(environment)
|
||||
|
||||
handle_regular_status_updates() // Status updates, death etc.
|
||||
|
||||
if(stat != DEAD)
|
||||
|
||||
//Updates the number of stored chemicals for powers
|
||||
handle_changeling()
|
||||
|
||||
//Mutations and radiation
|
||||
handle_mutations_and_radiation()
|
||||
|
||||
//Chemicals in the body
|
||||
handle_chemicals_in_body()
|
||||
|
||||
//Disabilities
|
||||
handle_disabilities()
|
||||
|
||||
//Blud
|
||||
handle_blood()
|
||||
|
||||
//Random events (vomiting etc)
|
||||
handle_random_events()
|
||||
|
||||
. = 1
|
||||
|
||||
handle_fire()
|
||||
|
||||
//stuff in the stomach
|
||||
handle_stomach()
|
||||
|
||||
update_canmove()
|
||||
|
||||
update_gravity(mob_has_gravity())
|
||||
|
||||
for(var/obj/item/weapon/grab/G in src)
|
||||
G.process()
|
||||
|
||||
if(client)
|
||||
handle_regular_hud_updates()
|
||||
|
||||
return .
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//remember to remove the "proc" of the child procs of these.
|
||||
|
||||
/mob/living/carbon/proc/handle_changeling()
|
||||
return
|
||||
|
||||
/mob/living/carbon/proc/handle_mutations_and_radiation()
|
||||
return
|
||||
|
||||
/mob/living/carbon/proc/handle_chemicals_in_body()
|
||||
return
|
||||
|
||||
/mob/living/carbon/proc/handle_disabilities()
|
||||
return
|
||||
|
||||
/mob/living/carbon/proc/handle_blood()
|
||||
return
|
||||
|
||||
/mob/living/carbon/proc/handle_random_events()
|
||||
return
|
||||
|
||||
/mob/living/carbon/proc/handle_environment(var/datum/gas_mixture/environment)
|
||||
return
|
||||
|
||||
/mob/living/carbon/proc/handle_regular_status_updates()
|
||||
return
|
||||
|
||||
/mob/living/carbon/proc/handle_stomach()
|
||||
spawn(0)
|
||||
for(var/mob/living/M in stomach_contents)
|
||||
if(M.loc != src)
|
||||
stomach_contents.Remove(M)
|
||||
continue
|
||||
if(istype(M, /mob/living/carbon) && stat != 2)
|
||||
if(M.stat == 2)
|
||||
M.death(1)
|
||||
stomach_contents.Remove(M)
|
||||
qdel(M)
|
||||
continue
|
||||
if(SSmob.times_fired%3==1)
|
||||
if(!(M.status_flags & GODMODE))
|
||||
M.adjustBruteLoss(5)
|
||||
nutrition += 10
|
||||
|
||||
/mob/living/carbon/proc/handle_regular_hud_updates()
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -10,16 +10,7 @@
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
if (notransform) return
|
||||
..()
|
||||
|
||||
var/datum/gas_mixture/environment // Added to prevent null location errors-- TLE
|
||||
if(loc)
|
||||
environment = loc.return_air()
|
||||
|
||||
if (stat != DEAD) //still breathing
|
||||
if(..())
|
||||
//First, resolve location and get a breath
|
||||
if(SSmob.times_fired%4==2)
|
||||
//Only try to take a breath every 4 seconds, unless suffocating
|
||||
@@ -29,42 +20,6 @@
|
||||
var/obj/location_as_object = loc
|
||||
location_as_object.handle_internal_lifeform(src, 0)
|
||||
|
||||
|
||||
//Updates the number of stored chemicals for powers
|
||||
handle_changeling()
|
||||
|
||||
//Mutations and radiation
|
||||
handle_mutations_and_radiation()
|
||||
|
||||
//Chemicals in the body
|
||||
handle_chemicals_in_body()
|
||||
|
||||
//Disabilities
|
||||
handle_disabilities()
|
||||
|
||||
//Apparently, the person who wrote this code designed it so that
|
||||
//blinded get reset each cycle and then get activated later in the
|
||||
//code. Very ugly. I dont care. Moving this stuff here so its easy
|
||||
//to find it.
|
||||
|
||||
//Handle temperature/pressure differences between body and environment
|
||||
if(environment) // More error checking -- TLE
|
||||
handle_environment(environment)
|
||||
|
||||
//Check if we're on fire
|
||||
handle_fire()
|
||||
|
||||
//Status updates, death etc.
|
||||
handle_regular_status_updates()
|
||||
update_canmove()
|
||||
|
||||
if(client)
|
||||
handle_regular_hud_updates()
|
||||
|
||||
// Grabbing
|
||||
for(var/obj/item/weapon/grab/G in src)
|
||||
G.process()
|
||||
|
||||
if(!client && stat == CONSCIOUS)
|
||||
if(prob(33) && canmove && isturf(loc) && !pulledby && !grabbed_by.len)
|
||||
step(src, pick(cardinal))
|
||||
@@ -75,9 +30,9 @@
|
||||
..()
|
||||
return pressure
|
||||
|
||||
/mob/living/carbon/monkey/proc/handle_disabilities()
|
||||
/mob/living/carbon/monkey/handle_disabilities()
|
||||
|
||||
/mob/living/carbon/monkey/proc/handle_mutations_and_radiation()
|
||||
/mob/living/carbon/monkey/handle_mutations_and_radiation()
|
||||
|
||||
if (radiation)
|
||||
if (radiation > 100)
|
||||
@@ -272,7 +227,7 @@
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/monkey/proc/handle_environment(datum/gas_mixture/environment)
|
||||
/mob/living/carbon/monkey/handle_environment(datum/gas_mixture/environment)
|
||||
if(!environment)
|
||||
return
|
||||
var/environment_heat_capacity = environment.heat_capacity()
|
||||
@@ -320,7 +275,7 @@
|
||||
else
|
||||
adjustFireLoss(5.0*discomfort)
|
||||
|
||||
/mob/living/carbon/monkey/proc/handle_chemicals_in_body()
|
||||
/mob/living/carbon/monkey/handle_chemicals_in_body()
|
||||
|
||||
if(reagents) reagents.metabolize(src)
|
||||
|
||||
@@ -342,7 +297,7 @@
|
||||
|
||||
return //TODO: DEFERRED
|
||||
|
||||
/mob/living/carbon/monkey/proc/handle_regular_status_updates()
|
||||
/mob/living/carbon/monkey/handle_regular_status_updates()
|
||||
updatehealth()
|
||||
|
||||
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
|
||||
@@ -412,7 +367,7 @@
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/proc/handle_regular_hud_updates()
|
||||
/mob/living/carbon/monkey/handle_regular_hud_updates()
|
||||
|
||||
if (stat == 2)
|
||||
sight |= SEE_TURFS
|
||||
@@ -513,14 +468,14 @@
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/monkey/proc/handle_random_events()
|
||||
/mob/living/carbon/monkey/handle_random_events()
|
||||
if (prob(1) && prob(2))
|
||||
spawn(0)
|
||||
emote("scratch")
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/proc/handle_changeling()
|
||||
/mob/living/carbon/monkey/handle_changeling()
|
||||
if(mind && mind.changeling)
|
||||
mind.changeling.regenerate()
|
||||
hud_used.lingchemdisplay.invisibility = 0
|
||||
|
||||
@@ -6,38 +6,12 @@
|
||||
var/SStun = 0 // stun variable
|
||||
|
||||
/mob/living/carbon/slime/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (src.notransform)
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
if(stat != DEAD)
|
||||
//Chemicals in the body
|
||||
handle_chemicals_in_body()
|
||||
|
||||
if(..())
|
||||
handle_nutrition()
|
||||
|
||||
handle_targets()
|
||||
|
||||
if (!ckey)
|
||||
handle_speech_and_mood()
|
||||
|
||||
var/datum/gas_mixture/environment
|
||||
if(src.loc)
|
||||
environment = loc.return_air()
|
||||
|
||||
//Apparently, the person who wrote this code designed it so that
|
||||
//blinded get reset each cycle and then get activated later in the
|
||||
//code. Very ugly. I dont care. Moving this stuff here so its easy
|
||||
//to find it.
|
||||
|
||||
if(environment)
|
||||
handle_environment(environment) // Handle temperature/pressure differences between body and environment
|
||||
|
||||
handle_regular_status_updates() // Status updates, death etc.
|
||||
|
||||
/mob/living/carbon/slime/proc/AIprocess() // the master AI process
|
||||
|
||||
@@ -118,7 +92,7 @@
|
||||
|
||||
AIproc = 0
|
||||
|
||||
/mob/living/carbon/slime/proc/handle_environment(datum/gas_mixture/environment)
|
||||
/mob/living/carbon/slime/handle_environment(datum/gas_mixture/environment)
|
||||
if(!environment)
|
||||
adjustToxLoss(rand(10,20))
|
||||
return
|
||||
@@ -167,7 +141,7 @@
|
||||
temp_change = (temperature - current)
|
||||
return temp_change
|
||||
|
||||
/mob/living/carbon/slime/proc/handle_chemicals_in_body()
|
||||
/mob/living/carbon/slime/handle_chemicals_in_body()
|
||||
|
||||
if(reagents) reagents.metabolize(src)
|
||||
|
||||
@@ -181,7 +155,7 @@
|
||||
|
||||
return //TODO: DEFERRED
|
||||
|
||||
/mob/living/carbon/slime/proc/handle_regular_status_updates()
|
||||
/mob/living/carbon/slime/handle_regular_status_updates()
|
||||
|
||||
if(is_adult)
|
||||
health = 200 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
|
||||
|
||||
@@ -815,7 +815,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
|
||||
|
||||
New()
|
||||
..()
|
||||
SSobj.processing.Add(src)
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/effect/golemrune/process()
|
||||
var/mob/dead/observer/ghost
|
||||
|
||||
@@ -24,4 +24,4 @@
|
||||
|
||||
if(changed)
|
||||
animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT)
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life().
|
||||
@@ -52,6 +52,8 @@
|
||||
Paralyse(effect * blocked)
|
||||
if(IRRADIATE)
|
||||
radiation += max(effect * ((100-run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm."))/100),0)//Rads auto check armor
|
||||
if(SLUR)
|
||||
slurring = max(slurring,(effect * blocked))
|
||||
if(STUTTER)
|
||||
if(status_flags & CANSTUN) // stun is usually associated with stutter
|
||||
stuttering = max(stuttering,(effect * blocked))
|
||||
@@ -60,17 +62,19 @@
|
||||
if(DROWSY)
|
||||
drowsyness = max(drowsyness,(effect * blocked))
|
||||
if(JITTER)
|
||||
jitteriness = max(jitteriness,(effect * blocked))
|
||||
if(status_flags & CANSTUN)
|
||||
jitteriness = max(jitteriness,(effect * blocked))
|
||||
updatehealth()
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/blocked = 0, var/stamina = 0, var/jitter = 0)
|
||||
/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/slur = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/blocked = 0, var/stamina = 0, var/jitter = 0)
|
||||
if(blocked >= 100) return 0
|
||||
if(stun) apply_effect(stun, STUN, blocked)
|
||||
if(weaken) apply_effect(weaken, WEAKEN, blocked)
|
||||
if(paralyze) apply_effect(paralyze, PARALYZE, blocked)
|
||||
if(irradiate) apply_effect(irradiate, IRRADIATE, blocked)
|
||||
if(slur) apply_effect(slur, SLUR, blocked)
|
||||
if(stutter) apply_effect(stutter, STUTTER, blocked)
|
||||
if(eyeblur) apply_effect(eyeblur, EYE_BLUR, blocked)
|
||||
if(drowsy) apply_effect(drowsy, DROWSY, blocked)
|
||||
|
||||
@@ -737,7 +737,7 @@ Sorry Giacom. Please don't be mad :(
|
||||
|
||||
/mob/living/proc/float(on)
|
||||
if(on && !floating)
|
||||
animate(src, pixel_y = 2, time = 10, loop = -1)
|
||||
animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
|
||||
floating = 1
|
||||
else if(!on && floating)
|
||||
animate(src, pixel_y = initial(pixel_y), time = 10)
|
||||
@@ -820,4 +820,13 @@ Sorry Giacom. Please don't be mad :(
|
||||
|
||||
/mob/living/do_attack_animation(atom/A)
|
||||
..()
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life().
|
||||
|
||||
/mob/living/proc/do_jitter_animation(jitteriness)
|
||||
var/amplitude = min(4, (jitteriness/100) + 1)
|
||||
var/pixel_x_diff = rand(-amplitude, amplitude)
|
||||
var/pixel_y_diff = rand(-amplitude/3, amplitude/3)
|
||||
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6)
|
||||
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y) , time = 2)
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life().
|
||||
|
||||
|
||||
@@ -786,6 +786,3 @@ var/list/ai_list = list()
|
||||
/mob/living/silicon/ai/attack_slime(mob/living/carbon/slime/user)
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/grabbedby(mob/living/user)
|
||||
return
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
|
||||
src.updatehealth()
|
||||
|
||||
update_gravity(mob_has_gravity())
|
||||
|
||||
if (src.malfhack)
|
||||
if (src.malfhack.aidisabled)
|
||||
src << "<span class='danger'>ERROR: APC access disabled, hack attempt canceled.</span>"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user