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:
paprka
2015-02-18 23:15:15 -08:00
171 changed files with 3755 additions and 3396 deletions
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -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)
+6
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+13 -2
View File
@@ -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)
+46 -45
View File
@@ -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///////////////////
+2 -1
View File
@@ -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)
+10 -8
View File
@@ -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
+20 -3
View File
@@ -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
+44 -40
View File
@@ -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"]."
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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))
+1 -1
View File
@@ -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
+5 -9
View File
@@ -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)
+1 -1
View File
@@ -47,7 +47,7 @@
if(OPERATING)
if(!attached)
return
SSobj.processing.Add(src)
SSobj.processing |= src
anchored = 1
mode = value
+1 -1
View File
@@ -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()
+247
View File
@@ -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)
+5 -5
View File
@@ -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
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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))
+2
View File
@@ -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,
+7 -12
View File
@@ -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
+84 -49
View File
@@ -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"
+4 -1
View File
@@ -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]"
+6
View File
@@ -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>"
+4
View File
@@ -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 = ""
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1
View File
@@ -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',
+5 -3
View File
@@ -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
+1 -1
View File
@@ -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"
+5
View File
@@ -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"
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
+16 -17
View File
@@ -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 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+4 -2
View File
@@ -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)
+62 -28
View File
@@ -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
+17 -17
View File
@@ -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
+5 -37
View File
@@ -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
+3 -2
View File
@@ -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
+13 -90
View File
@@ -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)
+116 -1
View File
@@ -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
+9 -54
View File
@@ -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
+4 -30
View File
@@ -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().
+6 -2
View File
@@ -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)
+11 -2
View File
@@ -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().
-3
View File
@@ -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