Merge branch 'master' of https://github.com/tgstation/-tg-station into ERTcodes

This commit is contained in:
Ikarrus
2015-04-30 08:56:46 -06:00
119 changed files with 1755 additions and 5965 deletions
+4 -9
View File
@@ -305,8 +305,6 @@
usr << browse(dat, "window=players;size=600x480")
/datum/admins/proc/check_antagonists()
var/list/supported_continuous_modes = list("revolution", "gang", "wizard", "malfunction", "blob")
var/list/supported_midround_antag_modes = list("wizard", "malfunction", "blob")
if (ticker && ticker.current_state >= GAME_STATE_PLAYING)
var/dat = "<html><head><title>Round Status</title></head><body><h1><B>Round Status</B></h1>"
dat += "Current Game Mode: <B>[ticker.mode.name]</B><BR>"
@@ -324,11 +322,8 @@
else
dat += "ETA: <a href='?_src_=holder;edit_shuttle_time=1'>[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]</a><BR>"
dat += "<B>Continuous Round Status</B><BR>"
if(!ticker.mode.config_tag in supported_continuous_modes)
dat += "Continue if antagonists die"
else
dat += "<a href='?_src_=holder;toggle_continuous=1'>[config.continuous[ticker.mode.config_tag] ? "Continue if antagonists die" : "End on antagonist death"]</a>"
if(config.continuous[ticker.mode.config_tag] && ticker.mode.config_tag in supported_midround_antag_modes)
dat += "<a href='?_src_=holder;toggle_continuous=1'>[config.continuous[ticker.mode.config_tag] ? "Continue if antagonists die" : "End on antagonist death"]</a>"
if(config.continuous[ticker.mode.config_tag])
dat += ", <a href='?_src_=holder;toggle_midround_antag=1'>[config.midround_antag[ticker.mode.config_tag] ? "creating replacement antagonists" : "not creating new antagonists"]</a><BR>"
else
dat += "<BR>"
@@ -386,7 +381,7 @@
dat += "</table>"
if(ticker.mode.A_bosses.len || ticker.mode.A_gang.len)
dat += "<br><table cellspacing=5><tr><td><B>[gang_name("A")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.A] Influence, " : "")][round((ticker.mode.A_territory.len/start_state.num_territories)*100, 0.1)]% Control</B></td><td></td></tr>"
dat += "<br><table cellspacing=5><tr><td><B>[gang_name("A")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.A] Influence, " : "")][round((ticker.mode.A_territory.len/start_state.num_territories)*100, 1)]% Control</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode.A_bosses)
var/mob/M = N.current
if(!M)
@@ -402,7 +397,7 @@
dat += "</table>"
if(ticker.mode.B_bosses.len || ticker.mode.B_gang.len)
dat += "<br><table cellspacing=5><tr><td><B>[gang_name("B")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.B] Influence, " : "")][round((ticker.mode.B_territory.len/start_state.num_territories)*100, 0.1)]% Control</B></td><td></td></tr>"
dat += "<br><table cellspacing=5><tr><td><B>[gang_name("B")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.B] Influence, " : "")][round((ticker.mode.B_territory.len/start_state.num_territories)*100, 1)]% Control</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode.B_bosses)
var/mob/M = N.current
if(!M)
+6 -6
View File
@@ -690,7 +690,7 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/destroyer(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store)
@@ -712,9 +712,9 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_s_store)
if ("tournament janitor")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform)
@@ -807,7 +807,7 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
@@ -1276,4 +1276,4 @@ var/global/list/g_fancy_list_of_types = null
W.assignment = "Centcom Official"
W.registered_name = M.real_name
W.update_label()
M.equip_to_slot_or_del(W, slot_wear_id)
M.equip_to_slot_or_del(W, slot_wear_id)
+62 -5
View File
@@ -62,6 +62,7 @@ datum/preferences
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
var/mutant_color = "FFF" //Mutant race skin color
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
//Mob preview
var/icon/preview_icon_front = null
@@ -94,6 +95,10 @@ datum/preferences
/datum/preferences/New(client/C)
blood_type = random_blood_type()
ooccolor = normal_ooc_colour
custom_names["ai"] = pick(ai_names)
custom_names["cyborg"] = pick(ai_names)
custom_names["clown"] = pick(clown_names)
custom_names["mime"] = pick(mime_names)
if(istype(C))
if(!IsGuestKey(C.key))
load_path(C.ckey)
@@ -158,10 +163,18 @@ datum/preferences
dat += "<a href='?_src_=prefs;preference=name;task=input'>[real_name]</a><BR>"
dat += "<b>Gender:</b> <a href='?_src_=prefs;preference=gender'>[gender == MALE ? "Male" : "Female"]</a><BR>"
dat += "<b>Age:</b> <a href='?_src_=prefs;preference=age;task=input'>[age]</a>"
dat += "<b>Age:</b> <a href='?_src_=prefs;preference=age;task=input'>[age]</a><BR>"
dat += "<b>Special Names:</b><BR>"
dat += "<a href ='?_src_=prefs;preference=clown_name;task=input'><b>Clown:</b> [custom_names["clown"]]</a> "
dat += "<a href ='?_src_=prefs;preference=mime_name;task=input'><b>Mime:</b>[custom_names["mime"]]</a><BR>"
dat += "<a href ='?_src_=prefs;preference=ai_name;task=input'><b>AI:</b> [custom_names["ai"]]</a> "
dat += "<a href ='?_src_=prefs;preference=cyborg_name;task=input'><b>Cyborg:</b> [custom_names["cyborg"]]</a><BR>"
dat += "<a href ='?_src_=prefs;preference=religion_name;task=input'><b>Chaplain religion:</b> [custom_names["religion"]] </a>"
dat += "<a href ='?_src_=prefs;preference=deity_name;task=input'><b>Chaplain deity:</b> [custom_names["deity"]]</a><BR></td>"
dat += "</td><td valign='center'>"
dat += "<td valign='center'>"
dat += "<div class='statusDisplay'><center><img src=previewicon.png height=64 width=64><img src=previewicon2.png height=64 width=64></center></div>"
@@ -182,11 +195,11 @@ datum/preferences
dat += "<b>Underwear:</b><BR><a href ='?_src_=prefs;preference=underwear;task=input'>[underwear]</a><BR>"
dat += "<b>Undershirt:</b><BR><a href ='?_src_=prefs;preference=undershirt;task=input'>[undershirt]</a><BR>"
dat += "<b>Socks:</b><BR><a href ='?_src_=prefs;preference=socks;task=input'>[socks]</a><BR>"
dat += "<b>Backpack:</b><BR><a href ='?_src_=prefs;preference=bag;task=input'>[backbaglist[backbag]]</a><BR>"
dat += "<b>Backpack:</b><BR><a href ='?_src_=prefs;preference=bag;task=input'>[backbaglist[backbag]]</a><BR></td>"
if(pref_species.use_skintones)
dat += "</td><td valign='top' width='21%'>"
dat += "<td valign='top' width='21%'>"
dat += "<h3>Skin Tone</h3>"
@@ -304,7 +317,7 @@ datum/preferences
dat += "</center>"
//user << browse(dat, "window=preferences;size=560x560")
var/datum/browser/popup = new(user, "preferences", "<div align='center'>Character Setup</div>", 640, 680)
var/datum/browser/popup = new(user, "preferences", "<div align='center'>Character Setup</div>", 640, 750)
popup.set_content(dat)
popup.open(0)
@@ -752,6 +765,50 @@ datum/preferences
var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist
if(new_backbag)
backbag = backbaglist.Find(new_backbag)
if("clown_name")
var/new_clown_name = reject_bad_name( input(user, "Choose your character's clown name:", "Character Preference") as text|null )
if(new_clown_name)
custom_names["clown"] = new_clown_name
else
user << "<font color='red'>Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .</font>"
if("mime_name")
var/new_mime_name = reject_bad_name( input(user, "Choose your character's mime name:", "Character Preference") as text|null )
if(new_mime_name)
custom_names["mime"] = new_mime_name
else
user << "<font color='red'>Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .</font>"
if("ai_name")
var/new_ai_name = reject_bad_name( input(user, "Choose your character's AI name:", "Character Preference") as text|null, 1 )
if(new_ai_name)
custom_names["ai"] = new_ai_name
else
user << "<font color='red'>Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, 0-9, -, ' and .</font>"
if("cyborg_name")
var/new_cyborg_name = reject_bad_name( input(user, "Choose your character's cyborg name:", "Character Preference") as text|null, 1 )
if(new_cyborg_name)
custom_names["cyborg"] = new_cyborg_name
else
user << "<font color='red'>Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, 0-9, -, ' and .</font>"
if("religion_name")
var/new_religion_name = reject_bad_name( input(user, "Choose your character's mime name:", "Character Preference") as text|null )
if(new_religion_name)
custom_names["religion"] = new_religion_name
else
user << "<font color='red'>Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .</font>"
if("deity_name")
var/new_deity_name = reject_bad_name( input(user, "Choose your character's mime name:", "Character Preference") as text|null )
if(new_deity_name)
custom_names["deity"] = new_deity_name
else
user << "<font color='red'>Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .</font>"
else
switch(href_list["preference"])
if("publicity")
@@ -187,6 +187,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["socks"] >> socks
S["backbag"] >> backbag
S["mutant_color"] >> mutant_color
S["clown_name"] >> custom_names["clown"]
S["mime_name"] >> custom_names["mime"]
S["ai_name"] >> custom_names["ai"]
S["cyborg_name"] >> custom_names["cyborg"]
S["religion_name"] >> custom_names["religion"]
S["deity_name"] >> custom_names["deity"]
//Jobs
S["userandomjob"] >> userandomjob
@@ -274,6 +280,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["backbag"] << backbag
S["species"] << pref_species.name
S["mutant_color"] << mutant_color
S["clown_name"] << custom_names["clown"]
S["mime_name"] << custom_names["mime"]
S["ai_name"] << custom_names["ai"]
S["cyborg_name"] << custom_names["cyborg"]
S["religion_name"] << custom_names["religion"]
S["deity_name"] << custom_names["deity"]
//Jobs
S["userandomjob"] << userandomjob
+2 -2
View File
@@ -1,7 +1,7 @@
/obj/item/clothing/shoes/proc/step_action() //this was made to rewrite clown shoes squeaking
/obj/item/clothing/shoes/syndigaloshes
desc = "A pair of brown shoes. They seem to have extra grip."
/obj/item/clothing/shoes/sneakers/syndigaloshes
desc = "A pair of brown shoes."
name = "brown shoes"
icon_state = "brown"
item_state = "brown"
@@ -25,6 +25,7 @@
action_button_name = "Toggle Chronosuit"
slowdown = 2
armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90)
var/list/chronosafe_items = list(/obj/item/weapon/chrono_eraser, /obj/item/weapon/gun/energy/chrono_gun)
var/obj/item/clothing/head/helmet/space/chronos/helmet = null
var/obj/effect/chronos_cam/camera = null
var/activating = 0
@@ -74,6 +75,13 @@
var/turf/to_turf = from_turf
var/atom/movable/overlay/phaseanim = new(from_turf)
var/obj/holder = new(camera)
var/list/nonsafe_slots = list(slot_belt, slot_back, slot_l_hand, slot_r_hand)
for(var/slot in nonsafe_slots)
var/obj/item/slot_item = user.get_item_by_slot(slot)
if(slot_item && !(slot_item.type in chronosafe_items) && user.unEquip(slot_item))
user << "<span class='notice'>Your [slot_item.name] got left behind.</span>"
phaseanim.name = "phasing [user.name]"
phaseanim.icon = 'icons/mob/mob.dmi'
phaseanim.icon_state = "chronostuck"
+2 -2
View File
@@ -60,7 +60,7 @@
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = CHEST|GROIN|ARMS
allowed = list(/obj/item/weapon/kitchenknife)
allowed = list(/obj/item/weapon/kitchen)
togglename = "sleeves"
//Cook
@@ -71,7 +71,7 @@
item_state = "apronchef"
blood_overlay_type = "armor"
body_parts_covered = CHEST|GROIN
allowed = list(/obj/item/weapon/kitchenknife)
allowed = list(/obj/item/weapon/kitchen)
//Detective
/obj/item/clothing/suit/det_suit
+17 -27
View File
@@ -344,7 +344,8 @@
qdel(src)
/obj/effect/spacevine/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if (!W || !user || !W.type) return
if (!W || !user || !W.type)
return
user.changeNext_move(CLICK_CD_MELEE)
var/override = 0
@@ -356,33 +357,22 @@
..()
return
switch(W.type)
if(/obj/item/weapon/circular_saw) qdel(src)
if(/obj/item/weapon/kitchen/utensil/knife) qdel(src)
if(/obj/item/weapon/scalpel) qdel(src)
if(/obj/item/weapon/twohanded/fireaxe) qdel(src)
if(/obj/item/weapon/hatchet) qdel(src)
if(/obj/item/weapon/melee/energy) qdel(src)
if(/obj/item/weapon/scythe)
for(var/obj/effect/spacevine/B in orange(src,1))
if(prob(80))
qdel(B)
if(istype(W, /obj/item/weapon/scythe))
for(var/obj/effect/spacevine/B in orange(src,1))
if(prob(80))
qdel(B)
qdel(src)
else if(is_sharp(W))
qdel(src)
else if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
qdel(src)
//less effective weapons
if(/obj/item/weapon/wirecutters)
if(prob(25)) qdel(src)
if(/obj/item/weapon/shard)
if(prob(25)) qdel(src)
else //weapons with subtypes
if(istype(W, /obj/item/weapon/melee/energy/sword)) qdel(src)
else if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user)) qdel(src)
else
user_unbuckle_mob(user,user)
return
else
user_unbuckle_mob(user,user)
return
//Plant-b-gone damage is handled in its entry in chemistry-reagents.dm
..()
+1 -1
View File
@@ -345,7 +345,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow, /obj/item/weapon/melee/energy/sword/saber,\
/obj/item/weapon/storage/box/syndicate, /obj/item/weapon/storage/box/emps,\
/obj/item/weapon/cartridge/syndicate, /obj/item/clothing/under/chameleon,\
/obj/item/clothing/shoes/syndigaloshes, /obj/item/weapon/card/id/syndicate,\
/obj/item/clothing/shoes/sneakers/syndigaloshes, /obj/item/weapon/card/id/syndicate,\
/obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\
/obj/item/device/chameleon, /obj/item/weapon/card/emag,\
/obj/item/weapon/storage/toolbox/syndicate, /obj/item/weapon/aiModule,\
+13 -11
View File
@@ -98,18 +98,20 @@
w_class = 3
/obj/item/weapon/reagent_containers/food/snacks/omelette/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W,/obj/item/weapon/kitchen/utensil/fork))
if(W.icon_state == "forkloaded")
if(istype(W,/obj/item/weapon/kitchen/fork))
var/obj/item/weapon/kitchen/fork/F = W
if(F.forkload)
user << "<span class='warning'>You already have omelette on your fork!</span>"
return
W.icon_state = "forkloaded"
user.visible_message( \
"[user] takes a piece of omelette with their fork!", \
"<span class='notice'>You take a piece of omelette with your fork.</span>" \
)
reagents.remove_reagent("nutriment", 1)
if(reagents.total_volume <= 0)
qdel(src)
else
F.icon_state = "forkloaded"
user.visible_message("[user] takes a piece of omelette with their fork!", \
"<span class='notice'>You take a piece of omelette with your fork.</span>")
var/datum/reagent/R = pick(reagents.reagent_list)
reagents.remove_reagent(R.id, 1)
F.forkload = R
if(reagents.total_volume <= 0)
qdel(src)
return
..()
@@ -206,7 +206,8 @@
name = "Hooch"
id = "hooch"
result = "hooch"
required_reagents = list ("sugar" = 1, "ethanol" = 2, "fuel" = 1)
required_reagents = list ("ethanol" = 2, "fuel" = 1)
required_catalysts = list("enzyme" = 1)
result_amount = 3
/datum/chemical_reaction/irish_coffee
+1 -1
View File
@@ -824,7 +824,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p
break
else //If the player has ghosted from his corpse before blood was drawn, his ckey is no longer attached to the mob, so we need to match up the cloned player through the mind key
for(var/mob/M in player_list)
if(ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == 2 && !M.suiciding)
if(mind && M.mind && ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == 2 && !M.suiciding)
if(istype(M, /mob/dead/observer))
var/mob/dead/observer/O = M
if(!O.can_reenter_corpse)
+1 -1
View File
@@ -250,7 +250,7 @@
scanner.computer.inventory.Add(src)
user << "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'"
else if(istype(I, /obj/item/weapon/kitchenknife) || istype(I, /obj/item/weapon/wirecutters))
else if(istype(I, /obj/item/weapon/kitchen/knife) || istype(I, /obj/item/weapon/wirecutters))
user << "<span class='notice'>You begin to carve out [title]...</span>"
if(do_after(user, 30))
user << "<span class='notice'>You carve out the pages from [title]! You didn't want to read it anyway.</span>"
+1 -11
View File
@@ -63,17 +63,7 @@ var/list/ai_list = list()
var/apc_override = 0 //hack for letting the AI use its APC even when visionless
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0)
var/list/possibleNames = ai_names
var/pickedName = null
while(!pickedName)
pickedName = pick(ai_names)
for (var/mob/living/silicon/ai/A in mob_list)
if (A.real_name == pickedName && possibleNames.len > 1) //fixing the theoretically possible infinite loop
possibleNames -= pickedName
pickedName = null
real_name = pickedName
rename_self("ai", 1)
name = real_name
anchored = 1
canmove = 0
@@ -25,7 +25,6 @@
name = "giant spider"
desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes."
icon_state = "guard"
var/butcher_state = 8 // Icon state for dead spider icons
icon_living = "guard"
icon_dead = "guard_dead"
speak_emote = list("chitters")
@@ -95,18 +94,11 @@
stop_automated_movement = 0
walk(src,0)
// Chops off each leg with a 50/50 chance of harvesting one, until finally calling
// default harvest action
/mob/living/simple_animal/hostile/poison/giant_spider/harvest(mob/living/user, sharpness = 1)
if(butcher_state > 0)
butcher_state--
icon_state = icon_dead + "[butcher_state]"
if(prob(50))
new /obj/item/weapon/reagent_containers/food/snacks/spiderleg(src.loc)
return
else
return ..()
/mob/living/simple_animal/hostile/poison/giant_spider/harvest(mob/living/user)
var/leg_amount = rand(4,8)
for(var/i=0, i<leg_amount, i++)
new /obj/item/weapon/reagent_containers/food/snacks/spiderleg(src.loc)
..()
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/GiveUp(var/C)
spawn(100)
@@ -20,7 +20,7 @@
attack_sound = 'sound/weapons/punch1.ogg'
a_intent = "harm"
var/corpse = /obj/effect/landmark/mobcorpse/russian
var/weapon1 = /obj/item/weapon/kitchenknife
var/weapon1 = /obj/item/weapon/kitchen/knife
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
faction = list("russian")
@@ -363,7 +363,10 @@
user.changeNext_move(CLICK_CD_MELEE)
var/sharpness = is_sharp(O)
if(sharpness)
harvest(user, sharpness)
user << "<span class='notice'>You begin to butcher [src]...</span>"
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
if(do_mob(user, src, 80/sharpness))
harvest(user)
return
..()
@@ -461,13 +464,9 @@
new childtype(loc)
// Harvest an animal's delicious byproducts
/mob/living/simple_animal/proc/harvest(mob/living/user, sharpness = 1)
user << "<span class='notice'>You begin to butcher [src]...</span>"
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
if(do_mob(user, src, 80/sharpness))
visible_message("<span class='notice'>[user] butchers [src].</span>")
gib()
return
/mob/living/simple_animal/proc/harvest(mob/living/user)
visible_message("<span class='notice'>[user] butchers [src].</span>")
gib()
/mob/living/simple_animal/stripPanelUnequip(obj/item/what, mob/who, where, child_override)
if(!child_override)
+3 -3
View File
@@ -308,9 +308,6 @@
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot( loc )
if (config.rename_cyborg)
O.rename_self("cyborg", 1)
// cyborgs produced by Robotize get an automatic power cell
O.cell = new(O)
O.cell.maxcharge = 7500
@@ -330,6 +327,9 @@
O.update_pipe_vision()
if (config.rename_cyborg)
O.rename_self("cyborg", 1)
O.loc = loc
O.job = "Cyborg"
O.notify_ai(1)
+2 -1
View File
@@ -141,7 +141,8 @@
return 0 // wasn't open
processing_uis.Remove(ui)
ui.user.open_uis.Remove(ui)
if(ui.user) // Sanity check in case a user has been deleted (say a blown up borg watching the alarm interface)
ui.user.open_uis.Remove(ui)
var/list/uis = open_uis[src_object_key][ui.ui_key]
return uis.Remove(ui)
+4 -27
View File
@@ -125,30 +125,7 @@
ex_act(1)
/obj/item/weapon/stock_parts/cell/proc/get_electrocute_damage()
switch (charge)
/* if (9000 to INFINITY)
return min(rand(90,150),rand(90,150))
if (2500 to 9000-1)
return min(rand(70,145),rand(70,145))
if (1750 to 2500-1)
return min(rand(35,110),rand(35,110))
if (1500 to 1750-1)
return min(rand(30,100),rand(30,100))
if (750 to 1500-1)
return min(rand(25,90),rand(25,90))
if (250 to 750-1)
return min(rand(20,80),rand(20,80))
if (100 to 250-1)
return min(rand(20,65),rand(20,65))*/
if (1000000 to INFINITY)
return min(rand(50,160),rand(50,160))
if (200000 to 1000000-1)
return min(rand(25,80),rand(25,80))
if (100000 to 200000-1)//Ave powernet
return min(rand(20,60),rand(20,60))
if (50000 to 100000-1)
return min(rand(15,40),rand(15,40))
if (1000 to 50000-1)
return min(rand(10,20),rand(10,20))
else
return 0
if(charge >= 1000)
return Clamp(round(charge/10000), 10, 90) + rand(-5,5)
else
return 0
+4 -29
View File
@@ -426,35 +426,10 @@
newavail = 0
/datum/powernet/proc/get_electrocute_damage()
switch(avail)/*
if (1300000 to INFINITY)
return min(rand(70,150),rand(70,150))
if (750000 to 1300000)
return min(rand(50,115),rand(50,115))
if (100000 to 750000-1)
return min(rand(35,101),rand(35,101))
if (75000 to 100000-1)
return min(rand(30,95),rand(30,95))
if (50000 to 75000-1)
return min(rand(25,80),rand(25,80))
if (25000 to 50000-1)
return min(rand(20,70),rand(20,70))
if (10000 to 25000-1)
return min(rand(20,65),rand(20,65))
if (1000 to 10000-1)
return min(rand(10,20),rand(10,20))*/
if (1000000 to INFINITY)
return min(rand(50,160),rand(50,160))
if (200000 to 1000000)
return min(rand(25,80),rand(25,80))
if (100000 to 200000)//Ave powernet
return min(rand(20,60),rand(20,60))
if (50000 to 100000)
return min(rand(15,40),rand(15,40))
if (1000 to 50000)
return min(rand(10,20),rand(10,20))
else
return 0
if(avail >= 1000)
return Clamp(round(avail/10000), 10, 90) + rand(-5,5)
else
return 0
////////////////////////////////////////////////
// Misc.
@@ -177,23 +177,19 @@
burst_size = 3
fire_delay = 2
pin = /obj/item/device/firing_pin/implant/pindicate
/obj/item/weapon/gun/projectile/automatic/m90/unrestricted
pin = /obj/item/device/firing_pin
/obj/item/weapon/gun/projectile/automatic/m90/New()
..()
underbarrel = new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(src)
update_icon()
return
/obj/item/weapon/gun/projectile/automatic/m90/afterattack(var/atom/target, var/mob/living/user, flag, params)
if(select == 2)
underbarrel.afterattack(target, user, flag, params)
else
..()
return
/obj/item/weapon/gun/projectile/automatic/m90/attackby(var/obj/item/A, mob/user, params)
if(istype(A, /obj/item/ammo_casing))
if(istype(A, underbarrel.magazine.ammo_type))
@@ -201,7 +197,6 @@
underbarrel.attackby(A, user, params)
else
..()
/obj/item/weapon/gun/projectile/automatic/m90/update_icon()
..()
overlays.Cut()
@@ -214,7 +209,6 @@
overlays += "[initial(icon_state)]gren"
icon_state = "[initial(icon_state)][magazine ? "" : "-e"]"
return
/obj/item/weapon/gun/projectile/automatic/m90/burst_select()
var/mob/living/carbon/human/user = usr
switch(select)
@@ -246,4 +240,17 @@
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
can_suppress = 0
burst_size = 4
fire_delay = 1
/obj/item/weapon/gun/projectile/automatic/ar
name = "ARG"
desc = "A robust assault rile used by Nanotrasen fighting forces."
icon_state = "arg"
item_state = "arg"
slot_flags = 0
origin_tech = "combat=5;materials=1"
mag_type = /obj/item/ammo_box/magazine/m556
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
can_suppress = 0
burst_size = 3
fire_delay = 1
@@ -1,373 +0,0 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/nicotine
name = "Nicotine"
id = "nicotine"
description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
overdose_threshold = 35
addiction_threshold = 30
datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.")
if(prob(5))
M << "<span class='notice'>[smoke_message]</span>"
M.AdjustStunned(-1)
M.adjustStaminaLoss(-1*REM)
..()
return
datum/reagent/nicotine/overdose_process(var/mob/living/M as mob)
if(prob(20))
M << "<span class='notice'>You feel like you've smoked too much.</span>"
M.adjustToxLoss(1*REM)
M.adjustOxyLoss(1*REM)
..()
return
datum/reagent/crank
name = "Crank"
id = "crank"
description = "Reduces stun times by about 200%. If overdosed or addicted it will deal significant Toxin, Brute and Brain damage."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
overdose_threshold = 20
addiction_threshold = 10
datum/reagent/crank/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.")
if(prob(5))
M << "<span class='notice'>[high_message]</span>"
M.AdjustParalysis(-2)
M.AdjustStunned(-2)
M.AdjustWeakened(-2)
..()
return
datum/reagent/crank/overdose_process(var/mob/living/M as mob)
M.adjustBrainLoss(rand(1,10)*REM)
M.adjustToxLoss(rand(1,10)*REM)
M.adjustBruteLoss(rand(1,10)*REM)
..()
return
datum/reagent/crank/addiction_act_stage1(var/mob/living/M as mob)
M.adjustBrainLoss(rand(1,10)*REM)
..()
return
datum/reagent/crank/addiction_act_stage2(var/mob/living/M as mob)
M.adjustToxLoss(rand(1,10)*REM)
..()
return
datum/reagent/crank/addiction_act_stage3(var/mob/living/M as mob)
M.adjustBruteLoss(rand(1,10)*REM)
..()
return
datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob)
M.adjustBrainLoss(rand(1,10)*REM)
M.adjustToxLoss(rand(1,10)*REM)
M.adjustBruteLoss(rand(1,10)*REM)
..()
return
/datum/chemical_reaction/crank
name = "Crank"
id = "crank"
result = "crank"
required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1)
result_amount = 5
mix_message = "The mixture violently reacts, leaving behind a few crystalline shards."
required_temp = 390
/datum/reagent/krokodil
name = "Krokodil"
id = "krokodil"
description = "Cools and calms you down. If overdosed it will deal significant Brain and Toxin damage. If addicted it will begin to deal fatal amounts of Brute damage as the subject's skin falls off."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
overdose_threshold = 20
addiction_threshold = 15
/datum/reagent/krokodil/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.")
if(prob(5))
M << "<span class='notice'>[high_message]</span>"
..()
return
/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob)
if(prob(10))
M.adjustBrainLoss(rand(1,5)*REM)
M.adjustToxLoss(rand(1,5)*REM)
..()
return
/datum/reagent/krokodil/addiction_act_stage1(var/mob/living/M as mob)
M.adjustBrainLoss(rand(1,5)*REM)
M.adjustToxLoss(rand(1,5)*REM)
..()
return
/datum/reagent/krokodil/addiction_act_stage2(var/mob/living/M as mob)
if(prob(25))
M << "<span class='danger'>Your skin feels loose...</span>"
..()
return
/datum/reagent/krokodil/addiction_act_stage3(var/mob/living/M as mob)
if(prob(25))
M << "<span class='danger'>Your skin starts to peel away...</span>"
M.adjustBruteLoss(3*REM)
..()
return
/datum/reagent/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
if(!istype(M.dna.species, /datum/species/cosmetic_zombie))
M << "<span class='userdanger'>Your skin falls off easily!</span>"
M.adjustBruteLoss(rand(50,80)*REM) // holy shit your skin just FELL THE FUCK OFF
hardset_dna(M, null, null, null, null, /datum/species/cosmetic_zombie)
else
M.adjustBruteLoss(5*REM)
..()
return
/datum/chemical_reaction/krokodil
name = "Krokodil"
id = "krokodil"
result = "krokodil"
required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1)
result_amount = 6
mix_message = "The mixture dries into a pale blue powder."
required_temp = 380
/datum/reagent/methamphetamine
name = "Methamphetamine"
id = "methamphetamine"
description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
overdose_threshold = 20
addiction_threshold = 10
metabolization_rate = 0.6
/datum/reagent/methamphetamine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.")
if(prob(5))
M << "<span class='notice'>[high_message]</span>"
M.AdjustParalysis(-3)
M.AdjustStunned(-3)
M.AdjustWeakened(-3)
M.adjustStaminaLoss(-3)
M.status_flags |= GOTTAGOREALLYFAST
M.Jitter(3)
M.adjustBrainLoss(0.5)
if(prob(5))
M.emote(pick("twitch", "shiver"))
..()
return
/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob)
if(M.canmove && !istype(M.loc, /atom/movable))
for(var/i = 0, i < 4, i++)
step(M, pick(cardinal))
if(prob(20))
M.emote("laugh")
if(prob(33))
M.visible_message("<span class = 'danger'>[M]'s hands flip out and flail everywhere!</span>")
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
..()
if(prob(20))
M.adjustToxLoss(5)
M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
return
/datum/reagent/methamphetamine/addiction_act_stage1(var/mob/living/M as mob)
M.Jitter(5)
if(prob(20))
M.emote(pick("twitch","drool","moan"))
..()
return
/datum/reagent/methamphetamine/addiction_act_stage2(var/mob/living/M as mob)
M.Jitter(10)
M.Dizzy(10)
if(prob(30))
M.emote(pick("twitch","drool","moan"))
..()
return
/datum/reagent/methamphetamine/addiction_act_stage3(var/mob/living/M as mob)
if(M.canmove && !istype(M.loc, /atom/movable))
for(var/i = 0, i < 4, i++)
step(M, pick(cardinal))
M.Jitter(15)
M.Dizzy(15)
if(prob(40))
M.emote(pick("twitch","drool","moan"))
..()
return
/datum/reagent/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
if(M.canmove && !istype(M.loc, /atom/movable))
for(var/i = 0, i < 8, i++)
step(M, pick(cardinal))
M.Jitter(20)
M.Dizzy(20)
M.adjustToxLoss(5)
if(prob(50))
M.emote(pick("twitch","drool","moan"))
..()
return
/datum/chemical_reaction/methamphetamine
name = "methamphetamine"
id = "methamphetamine"
result = "methamphetamine"
required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1)
result_amount = 4
required_temp = 374
/datum/chemical_reaction/saltpetre
name = "saltpetre"
id = "saltpetre"
result = "saltpetre"
required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3)
result_amount = 3
/datum/reagent/saltpetre
name = "Saltpetre"
id = "saltpetre"
description = "Volatile."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/reagent/bath_salts
name = "Bath Salts"
id = "bath_salts"
description = "Makes you nearly impervious to stuns and grants a stamina regeneration buff, but you will be a nearly uncontrollable tramp-bearded raving lunatic."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
overdose_threshold = 20
addiction_threshold = 10
/datum/reagent/bath_salts/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.")
if(prob(5))
M << "<span class='notice'>[high_message]</span>"
M.AdjustParalysis(-5)
M.AdjustStunned(-5)
M.AdjustWeakened(-5)
M.adjustStaminaLoss(-10)
M.adjustBrainLoss(1)
M.adjustToxLoss(0.1)
M.hallucination += 10
if(M.canmove && !istype(M.loc, /atom/movable))
step(M, pick(cardinal))
step(M, pick(cardinal))
..()
return
/datum/chemical_reaction/bath_salts
name = "bath_salts"
id = "bath_salts"
result = "bath_salts"
required_reagents = list("????" = 1, "saltpetre" = 1, "nutriment" = 1, "cleaner" = 1, "enzyme" = 1, "tea" = 1, "mercury" = 1)
result_amount = 7
required_temp = 374
/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob)
M.hallucination += 10
if(M.canmove && !istype(M.loc, /atom/movable))
for(var/i = 0, i < 8, i++)
step(M, pick(cardinal))
if(prob(20))
M.emote(pick("twitch","drool","moan"))
if(prob(33))
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
..()
return
/datum/reagent/bath_salts/addiction_act_stage1(var/mob/living/M as mob)
M.hallucination += 10
if(M.canmove && !istype(M.loc, /atom/movable))
for(var/i = 0, i < 8, i++)
step(M, pick(cardinal))
M.Jitter(5)
M.adjustBrainLoss(10)
if(prob(20))
M.emote(pick("twitch","drool","moan"))
..()
return
/datum/reagent/bath_salts/addiction_act_stage2(var/mob/living/M as mob)
M.hallucination += 20
if(M.canmove && !istype(M.loc, /atom/movable))
for(var/i = 0, i < 8, i++)
step(M, pick(cardinal))
M.Jitter(10)
M.Dizzy(10)
M.adjustBrainLoss(10)
if(prob(30))
M.emote(pick("twitch","drool","moan"))
..()
return
/datum/reagent/bath_salts/addiction_act_stage3(var/mob/living/M as mob)
M.hallucination += 30
if(M.canmove && !istype(M.loc, /atom/movable))
for(var/i = 0, i < 12, i++)
step(M, pick(cardinal))
M.Jitter(15)
M.Dizzy(15)
M.adjustBrainLoss(10)
if(prob(40))
M.emote(pick("twitch","drool","moan"))
..()
return
/datum/reagent/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
M.hallucination += 40
if(M.canmove && !istype(M.loc, /atom/movable))
for(var/i = 0, i < 16, i++)
step(M, pick(cardinal))
M.Jitter(50)
M.Dizzy(50)
M.adjustToxLoss(5)
M.adjustBrainLoss(10)
if(prob(50))
M.emote(pick("twitch","drool","moan"))
..()
return
/datum/chemical_reaction/aranesp
name = "aranesp"
id = "aranesp"
result = "aranesp"
required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1)
result_amount = 3
/datum/reagent/aranesp
name = "Aranesp"
id = "aranesp"
description = "Amps you up and gets you going, fixes all stamina damage you might have but can cause toxin and oxygen damage.."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/reagent/aranesp/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.")
if(prob(5))
M << "<span class='notice'>[high_message]</span>"
M.adjustStaminaLoss(-35)
M.adjustToxLoss(1)
if(prob(50))
M.losebreath++
M.adjustOxyLoss(20)
..()
return
@@ -1,831 +0,0 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/silver_sulfadiazine
name = "Silver Sulfadiazine"
id = "silver_sulfadiazine"
description = "On touch, quickly heals burn damage. Basic anti-burn healing drug. On ingestion, deals minor toxin damage."
reagent_state = LIQUID
color = "#C8A5DC"
metabolization_rate = 2
datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
if(iscarbon(M))
if(method == TOUCH)
M.adjustFireLoss(-volume)
if(show_message)
M << "<span class='notice'>You feel your burns healing!</span>"
M.emote("scream")
if(method == INGEST)
M.adjustToxLoss(0.5*volume)
if(show_message)
M << "<span class='notice'>You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?</span>"
..()
return
datum/reagent/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustFireLoss(-2*REM)
..()
return
datum/reagent/styptic_powder
name = "Styptic Powder"
id = "styptic_powder"
description = "On touch, quickly heals brute damage. Basic anti-brute healing drug. On ingestion, deals minor toxin damage."
reagent_state = LIQUID
color = "#C8A5DC"
metabolization_rate = 2
datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
if(iscarbon(M))
if(method == TOUCH)
M.adjustBruteLoss(-volume)
if(show_message)
M << "<span class='notice'>You feel your wounds knitting back together!</span>"
M.emote("scream")
if(method == INGEST)
M.adjustToxLoss(0.5*volume)
if(show_message)
M << "<span class='notice'>You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?</span>"
..()
return
datum/reagent/styptic_powder/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(55))
M.adjustBruteLoss(-8*REM)
..()
return
datum/reagent/salglu_solution
name = "Saline-Glucose Solution"
id = "salglu_solution"
description = "Has a 33% chance per metabolism cycle to heal brute and burn damage."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(33))
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
..()
return
datum/reagent/synthflesh
name = "Synthflesh"
id = "synthflesh"
description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1)
if(!M) M = holder.my_atom
if(iscarbon(M))
if(method == TOUCH)
M.adjustBruteLoss(-1.5*volume)
M.adjustFireLoss(-1.5*volume)
if(show_message)
M << "<span class='notice'>You feel your burns healing and your flesh knitting together!</span>"
..()
return
datum/reagent/charcoal
name = "Charcoal"
id = "charcoal"
description = "Heals toxin damage, and will also slowly remove any other chemicals."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(-3*REM)
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,1)
..()
return
/datum/chemical_reaction/charcoal
name = "Charcoal"
id = "charcoal"
result = "charcoal"
required_reagents = list("ash" = 1, "sodiumchloride" = 1)
result_amount = 2
mix_message = "The mixture yields a fine black powder."
required_temp = 380
/datum/chemical_reaction/silver_sulfadiazine
name = "Silver Sulfadiazine"
id = "silver_sulfadiazine"
result = "silver_sulfadiazine"
required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1)
result_amount = 5
/datum/chemical_reaction/salglu_solution
name = "Saline-Glucose Solution"
id = "salglu_solution"
result = "salglu_solution"
required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1)
result_amount = 3
/datum/chemical_reaction/synthflesh
name = "Synthflesh"
id = "synthflesh"
result = "synthflesh"
required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1)
result_amount = 3
/datum/chemical_reaction/styptic_powder
name = "Styptic Powder"
id = "styptic_powder"
result = "styptic_powder"
required_reagents = list("aluminium" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1)
result_amount = 4
mix_message = "The solution yields an astringent powder."
datum/reagent/omnizine
name = "Omnizine"
id = "omnizine"
description = "Heals 1 of each damage type a cycle. If overdosed it will deal significant amounts of each damage type."
reagent_state = LIQUID
color = "#C8A5DC"
metabolization_rate = 0.2
overdose_threshold = 30
datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(-1*REM)
M.adjustOxyLoss(-1*REM)
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
..()
return
datum/reagent/omnizine/overdose_process(var/mob/living/M as mob)
M.adjustToxLoss(3*REM)
M.adjustOxyLoss(3*REM)
M.adjustBruteLoss(3*REM)
M.adjustFireLoss(3*REM)
..()
return
datum/reagent/calomel
name = "Calomel"
id = "calomel"
description = "Quickly purges the body of all chemicals. If your health is above 20, toxin damage is dealt. When you hit 20 health or lower, the damage will cease."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/calomel/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,5)
if(M.health > 20)
M.adjustToxLoss(5*REM)
..()
return
/datum/chemical_reaction/calomel
name = "Calomel"
id = "calomel"
result = "calomel"
required_reagents = list("mercury" = 1, "chlorine" = 1)
result_amount = 2
required_temp = 374
datum/reagent/potass_iodide
name = "Potassium Iodide"
id = "potass_iodide"
description = "Reduces low radiation damage very effectively."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.radiation > 0)
if(prob(80))
M.radiation--
if(M.radiation < 0)
M.radiation = 0
..()
return
/datum/chemical_reaction/potass_iodide
name = "Potassium Iodide"
id = "potass_iodide"
result = "potass_iodide"
required_reagents = list("potassium" = 1, "iodine" = 1)
result_amount = 2
datum/reagent/pen_acid
name = "Pentetic Acid"
id = "pen_acid"
description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body. Has a chance of dealing brute damage."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.radiation > 0)
M.radiation -= 7
M.adjustToxLoss(-4*REM)
if(prob(33))
M.adjustBruteLoss(1*REM)
if(M.radiation < 0)
M.radiation = 0
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,4)
..()
return
/datum/chemical_reaction/pen_acid
name = "Pentetic Acid"
id = "pen_acid"
result = "pen_acid"
required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1)
result_amount = 6
datum/reagent/sal_acid
name = "Salicyclic Acid"
id = "sal_acid"
description = "If you have less than 50 brute damage, there is a 50% chance to heal one unit. If overdosed it will have a 50% chance to deal 2 brute damage if the patient has less than 50 brute damage already."
reagent_state = LIQUID
color = "#C8A5DC"
overdose_threshold = 25
datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.getBruteLoss() < 50)
if(prob(50))
M.adjustBruteLoss(-1*REM)
..()
return
datum/reagent/sal_acid/overdose_process(var/mob/living/M as mob)
if(M.getBruteLoss() < 50)
if(prob(50))
M.adjustBruteLoss(2*REM)
..()
return
/datum/chemical_reaction/sal_acid
name = "Salicyclic Acid"
id = "sal_acid"
result = "sal_acid"
required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1)
result_amount = 5
datum/reagent/salbutamol
name = "Salbutamol"
id = "salbutamol"
description = "Quickly heals oxygen damage while slowing down suffocation. Great for stabilizing critical patients!"
reagent_state = LIQUID
color = "#C8A5DC"
metabolization_rate = 0.2
datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustOxyLoss(-6*REM)
if(M.losebreath >= 4)
M.losebreath -= 4
..()
return
/datum/chemical_reaction/salbutamol
name = "Salbutamol"
id = "salbutamol"
result = "salbutamol"
required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1)
result_amount = 5
datum/reagent/perfluorodecalin
name = "Perfluorodecalin"
id = "perfluorodecalin"
description = "Heals suffocation damage so quickly that you could have a spacewalk, but it mutes your voice. Has a 33% chance of healing brute and burn damage per cycle as well."
reagent_state = LIQUID
color = "#C8A5DC"
metabolization_rate = 0.2
datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob)
if(!M) M = holder.my_atom
M.adjustOxyLoss(-25*REM)
M.silent = max(M.silent, 5)
if(prob(33))
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
..()
return
/datum/chemical_reaction/perfluorodecalin
name = "Perfluorodecalin"
id = "perfluorodecalin"
result = "perfluorodecalin"
required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1)
result_amount = 3
required_temp = 370
mix_message = "The mixture rapidly turns into a dense pink liquid."
datum/reagent/ephedrine
name = "Ephedrine"
id = "ephedrine"
description = "Reduces stun times, increases run speed. If overdosed it will deal toxin and oxyloss damage."
reagent_state = LIQUID
color = "#C8A5DC"
metabolization_rate = 0.3
overdose_threshold = 45
addiction_threshold = 30
datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.status_flags |= IGNORESLOWDOWN
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
M.adjustStaminaLoss(-1*REM)
..()
return
datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob)
if(prob(33))
M.adjustToxLoss(1*REM)
M.losebreath++
..()
return
datum/reagent/ephedrine/addiction_act_stage1(var/mob/living/M as mob)
if(prob(33))
M.adjustToxLoss(2*REM)
M.losebreath += 2
..()
return
datum/reagent/ephedrine/addiction_act_stage2(var/mob/living/M as mob)
if(prob(33))
M.adjustToxLoss(3*REM)
M.losebreath += 3
..()
return
datum/reagent/ephedrine/addiction_act_stage3(var/mob/living/M as mob)
if(prob(33))
M.adjustToxLoss(4*REM)
M.losebreath += 4
..()
return
datum/reagent/ephedrine/addiction_act_stage4(var/mob/living/M as mob)
if(prob(33))
M.adjustToxLoss(5*REM)
M.losebreath += 5
..()
return
/datum/chemical_reaction/ephedrine
name = "Ephedrine"
id = "ephedrine"
result = "ephedrine"
required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1)
result_amount = 4
mix_message = "The solution fizzes and gives off toxic fumes."
datum/reagent/diphenhydramine
name = "Diphenhydramine"
id = "diphenhydramine"
description = "Purges body of lethal Histamine and reduces jitteriness while causing minor drowsiness."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.drowsyness += 1
M.jitteriness -= 1
M.reagents.remove_reagent("histamine",3)
..()
return
/datum/chemical_reaction/diphenhydramine
name = "Diphenhydramine"
id = "diphenhydramine"
result = "diphenhydramine"
required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1)
result_amount = 4
mix_message = "The mixture dries into a pale blue powder."
datum/reagent/morphine
name = "Morphine"
id = "morphine"
description = "Will allow you to ignore slowdown from equipment and damage. Will eventually knock you out if you take too much. If overdosed it will cause jitteriness, dizziness, force the victim to drop items in their hands and eventually deal toxin damage."
reagent_state = LIQUID
color = "#C8A5DC"
var/cycle_count = 0
overdose_threshold = 30
addiction_threshold = 25
datum/reagent/morphine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.status_flags |= IGNORESLOWDOWN
if(cycle_count >= 36)
M.sleeping += 3
cycle_count++
..()
return
datum/reagent/morphine/overdose_process(var/mob/living/M as mob)
if(prob(33))
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
M.Dizzy(1)
M.Jitter(1)
..()
return
datum/reagent/morphine/addiction_act_stage1(var/mob/living/M as mob)
if(prob(33))
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
M.Dizzy(2)
M.Jitter(2)
..()
return
datum/reagent/morphine/addiction_act_stage2(var/mob/living/M as mob)
if(prob(33))
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
M.adjustToxLoss(1*REM)
M.Dizzy(3)
M.Jitter(3)
..()
return
datum/reagent/morphine/addiction_act_stage3(var/mob/living/M as mob)
if(prob(33))
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
M.adjustToxLoss(2*REM)
M.Dizzy(4)
M.Jitter(4)
..()
return
datum/reagent/morphine/addiction_act_stage4(var/mob/living/M as mob)
if(prob(33))
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
M.adjustToxLoss(3*REM)
M.Dizzy(5)
M.Jitter(5)
..()
return
datum/reagent/oculine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
cycle_amount++
if(M.eye_blind > 0 && cycle_amount > 20)
if(prob(30))
M.eye_blind = 0
else if(prob(80))
M.eye_blind = 0
M.eye_blurry = 1
if(M.eye_blurry > 0)
if(prob(80))
M.eye_blurry = 0
..()
return
/datum/chemical_reaction/oculine
name = "Oculine"
id = "oculine"
result = "oculine"
required_reagents = list("charcoal" = 1, "carbon" = 1, "hydrogen" = 1)
result_amount = 3
mix_message = "The mixture sputters loudly and becomes a pale pink color."
datum/reagent/oculine
name = "Oculine"
id = "oculine"
description = "Cures blindness and heals eye damage over time."
reagent_state = LIQUID
color = "#C8A5DC"
metabolization_rate = 0.4
var/cycle_amount = 0
datum/reagent/atropine
name = "Atropine"
id = "atropine"
description = "If patients health is below -25 it will heal 3 brute and burn damage per cycle, as well as stop any oxyloss. Good for stabilising critical patients."
reagent_state = LIQUID
color = "#C8A5DC"
metabolization_rate = 0.2
overdose_threshold = 35
datum/reagent/atropine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.health > -60)
M.adjustToxLoss(1*REM)
if(M.health < -25)
M.adjustBruteLoss(-3*REM)
M.adjustFireLoss(-3*REM)
if(M.oxyloss > 65)
M.setOxyLoss(65)
if(M.losebreath > 5)
M.losebreath = 5
if(prob(30))
M.Dizzy(5)
M.Jitter(5)
..()
return
datum/reagent/atropine/overdose_process(var/mob/living/M as mob)
if(prob(50))
M.adjustToxLoss(2*REM)
M.Dizzy(1)
M.Jitter(1)
..()
return
/datum/chemical_reaction/atropine
name = "Atropine"
id = "atropine"
result = "atropine"
required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1)
result_amount = 5
datum/reagent/epinephrine
name = "Epinephrine"
id = "epinephrine"
description = "mReduces most of the knockout/stun effects, minor stamina regeneration buff. Attempts to stop you taking too much oxygen damage. If the patient is in low to severe crit, heals toxins, brute, and burn very effectively. Will not heal patients who are almost dead. If overdosed will stun and deal toxin damage"
reagent_state = LIQUID
color = "#C8A5DC"
metabolization_rate = 0.2
overdose_threshold = 30
datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.health < -10 && M.health > -65)
M.adjustToxLoss(-1*REM)
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
if(M.oxyloss > 35)
M.setOxyLoss(35)
if(M.losebreath >= 4)
M.losebreath -= 4
if(M.losebreath < 0)
M.losebreath = 0
M.adjustStaminaLoss(-1*REM)
if(prob(30))
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
..()
return
datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob)
if(prob(33))
M.adjustStaminaLoss(5*REM)
M.adjustToxLoss(2*REM)
M.losebreath++
..()
return
/datum/chemical_reaction/epinephrine
name = "Epinephrine"
id = "epinephrine"
result = "epinephrine"
required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1)
result_amount = 6
datum/reagent/strange_reagent
name = "Strange Reagent"
id = "strange_reagent"
description = "A miracle drug that can bring a dead body back to life! If the corpse has suffered too much damage, however, no change will occur to the body. If used on a living person it will deal Brute and Burn damage."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, var/method=TOUCH, var/volume)
if(M.stat == DEAD)
if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100)
M.visible_message("<span class='warning'>[M]'s body convulses a bit, and then falls still once more.</span>")
return
var/mob/dead/observer/ghost = M.get_ghost()
M.visible_message("<span class='warning'>[M]'s body convulses a bit.</span>")
if(!M.suiciding && !ghost && !(NOCLONE in M.mutations))
M.stat = 1
M.adjustOxyLoss(-20)
M.adjustToxLoss(-20)
dead_mob_list -= M
living_mob_list |= list(M)
M.emote("gasp")
add_logs(M, M, "revived", object="strange reagent")
..()
return
datum/reagent/strange_reagent/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(50))
M.adjustBruteLoss(2*REM)
M.adjustFireLoss(2*REM)
..()
return
/datum/chemical_reaction/strange_reagent
name = "Strange Reagent"
id = "strange_reagent"
result = "strange_reagent"
required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1)
result_amount = 3
datum/reagent/life
name = "Life"
id = "life"
description = "Can create a life form, however it is not guaranteed to be friendly. May want to have Security on hot standby."
reagent_state = LIQUID
color = "#C8A5DC"
metabolization_rate = 0.2
/datum/chemical_reaction/life
name = "Life"
id = "life"
result = "life"
required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1)
result_amount = 3
required_temp = 374
/datum/chemical_reaction/life/on_reaction(var/datum/reagents/holder, var/created_volume)
chemical_mob_spawn(holder, 1, "Life")
proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reaction_name, var/mob_faction = "chemicalsummon")
if(holder && holder.my_atom)
var/blocked = list(/mob/living/simple_animal/hostile,
/mob/living/simple_animal/hostile/pirate,
/mob/living/simple_animal/hostile/pirate/ranged,
/mob/living/simple_animal/hostile/russian,
/mob/living/simple_animal/hostile/russian/ranged,
/mob/living/simple_animal/hostile/syndicate,
/mob/living/simple_animal/hostile/syndicate/melee,
/mob/living/simple_animal/hostile/syndicate/melee/space,
/mob/living/simple_animal/hostile/syndicate/ranged,
/mob/living/simple_animal/hostile/syndicate/ranged/space,
/mob/living/simple_animal/hostile/alien/queen/large,
/mob/living/simple_animal/hostile/retaliate,
/mob/living/simple_animal/hostile/retaliate/clown,
/mob/living/simple_animal/hostile/mushroom,
/mob/living/simple_animal/hostile/asteroid,
/mob/living/simple_animal/hostile/asteroid/basilisk,
/mob/living/simple_animal/hostile/asteroid/goldgrub,
/mob/living/simple_animal/hostile/asteroid/goliath,
/mob/living/simple_animal/hostile/asteroid/hivelord,
/mob/living/simple_animal/hostile/asteroid/hivelordbrood,
/mob/living/simple_animal/hostile/carp/holocarp,
/mob/living/simple_animal/hostile/mining_drone,
/mob/living/simple_animal/hostile/poison,
/mob/living/simple_animal/hostile/blob,
/mob/living/simple_animal/ascendant_shadowling
)//exclusion list for things you don't want the reaction to create.
var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
var/area/my_area = get_area(T)
var/message = "A [reaction_name] reaction has occured in [my_area.name]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</A>)"
message += " (<A HREF='?_src_=vars;Vars=\ref[A]'>VV</A>)"
var/mob/M = get(A, /mob)
if(M)
message += " - Carried By: [M.real_name] ([M.key]) (<A HREF='?_src_=holder;adminplayeropts=\ref[M]'>PP</A>) (<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</A>)"
else
message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
message_admins(message, 0, 1)
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/carbon/human/H in viewers(get_turf(holder.my_atom), null))
H.flash_eyes()
for(var/i = 1, i <= amount_to_spawn, i++)
var/chosen = pick(critters)
var/mob/living/simple_animal/hostile/C = new chosen
C.faction |= mob_faction
C.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
/datum/reagent/mannitol/on_mob_life(mob/living/M as mob)
M.adjustBrainLoss(-3)
..()
return
/datum/chemical_reaction/mannitol
name = "Mannitol"
id = "mannitol"
result = "mannitol"
required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1)
result_amount = 3
mix_message = "The solution slightly bubbles, becoming thicker."
/datum/reagent/mannitol
name = "Mannitol"
id = "mannitol"
description = "Heals brain damage effectively. Use it in cyro tubes alongside Cryoxadone."
color = "#C8A5DC"
/datum/reagent/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob)
M.jitteriness = 0
if(istype(M) && M.dna)
M.dna.remove_all_mutations()
..()
return
/datum/chemical_reaction/mutadone
name = "Mutadone"
id = "mutadone"
result = "mutadone"
required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1)
result_amount = 3
/datum/reagent/mutadone
name = "Mutadone"
id = "mutadone"
description = "Heals your genetic defects."
color = "#C8A5DC"
datum/reagent/antihol
name = "Antihol"
id = "antihol"
description = "Helps remove Alcohol from someone's body, as well as eliminating its side effects."
color = "#C8A5DC"
datum/reagent/antihol/on_mob_life(var/mob/living/M as mob)
M.dizziness = 0
M.drowsyness = 0
M.slurring = 0
M.confused = 0
M.reagents.remove_reagent("ethanol", 8)
M.adjustToxLoss(-0.2*REM)
..()
/datum/chemical_reaction/antihol
name = "antihol"
id = "antihol"
result = "antihol"
required_reagents = list("ethanol" = 1, "charcoal" = 1)
result_amount = 2
/datum/chemical_reaction/cryoxadone
name = "Cryoxadone"
id = "cryoxadone"
result = "cryoxadone"
required_reagents = list("stable_plasma" = 1, "acetone" = 1, "mutagen" = 1)
result_amount = 3
/datum/reagent/stimulants
name = "Stimulants"
id = "stimulants"
description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun."
color = "#C8A5DC"
metabolization_rate = 0.4
overdose_threshold = 60
datum/reagent/stimulants/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.status_flags |= IGNORESLOWDOWN
if(M.health < 50 && M.health > 0)
if(prob(50))
M.adjustOxyLoss(-5*REM)
M.adjustToxLoss(-5*REM)
M.adjustBruteLoss(-5*REM)
M.adjustFireLoss(-5*REM)
M.adjustFireLoss(-3*REM)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
M.adjustStaminaLoss(-3*REM)
..()
datum/reagent/stimulants/overdose_process(var/mob/living/M as mob)
if(prob(33))
M.adjustStaminaLoss(5*REM)
M.adjustToxLoss(2*REM)
M.losebreath++
..()
return
datum/reagent/insulin
name = "Insulin"
id = "insulin"
description = "Increases sugar depletion rates."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/insulin/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.sleeping)
M.sleeping--
M.reagents.remove_reagent("sugar", 5)
..()
return
@@ -1,286 +0,0 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
datum/reagent/oil
name = "Oil"
id = "oil"
description = "Burns in a small smoky fire, mostly used to get Ash."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/stable_plasma
name = "Stable Plasma"
id = "stable_plasma"
description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/iodine
name = "Iodine"
id = "iodine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/fluorine
name = "Fluorine"
id = "fluorine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/carpet
name = "Carpet"
id = "carpet"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/reagent/carpet/reaction_turf(var/turf/simulated/T, var/volume)
if(istype(T, /turf/simulated/floor/plating) || istype(T, /turf/simulated/floor/plasteel))
var/turf/simulated/floor/F = T
F.ChangeTurf(/turf/simulated/floor/fancy/carpet)
..()
return
datum/reagent/bromine
name = "Bromine"
id = "bromine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/phenol
name = "Phenol"
id = "phenol"
description = "Used for certain medical recipes."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/ash
name = "Ash"
id = "ash"
description = "Basic ingredient in a couple of recipes."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/acetone
name = "Acetone"
id = "acetone"
description = "Common ingredient in other recipes."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/chemical_reaction/acetone
name = "acetone"
id = "acetone"
result = "acetone"
required_reagents = list("oil" = 1, "fuel" = 1, "oxygen" = 1)
result_amount = 3
/datum/chemical_reaction/carpet
name = "carpet"
id = "carpet"
result = "carpet"
required_reagents = list("space_drugs" = 1, "blood" = 1)
result_amount = 2
/datum/chemical_reaction/oil
name = "Oil"
id = "oil"
result = "oil"
required_reagents = list("fuel" = 1, "carbon" = 1, "hydrogen" = 1)
result_amount = 3
/datum/chemical_reaction/phenol
name = "phenol"
id = "phenol"
result = "phenol"
required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1)
result_amount = 3
/datum/chemical_reaction/ash
name = "Ash"
id = "ash"
result = "ash"
required_reagents = list("oil" = 1)
result_amount = 1
required_temp = 480
datum/reagent/colorful_reagent
name = "Colorful Reagent"
id = "colorful_reagent"
description = "A solution."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/chemical_reaction/colorful_reagent
name = "colorful_reagent"
id = "colorful_reagent"
result = "colorful_reagent"
required_reagents = list("stable_plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1)
result_amount = 5
datum/reagent/colorful_reagent/on_mob_life(var/mob/living/M as mob)
if(M && isliving(M))
M.color = pick(random_color_list)
..()
return
datum/reagent/colorful_reagent/reaction_mob(var/mob/living/M, var/volume)
if(M && isliving(M))
M.color = pick(random_color_list)
..()
return
datum/reagent/colorful_reagent/reaction_obj(var/obj/O, var/volume)
if(O)
O.color = pick(random_color_list)
..()
return
datum/reagent/colorful_reagent/reaction_turf(var/turf/T, var/volume)
if(T)
T.color = pick(random_color_list)
..()
return
datum/reagent/triple_citrus
name = "Triple Citrus"
id = "triple_citrus"
description = "A solution."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/chemical_reaction/triple_citrus
name = "triple_citrus"
id = "triple_citrus"
result = "triple_citrus"
required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1)
result_amount = 5
datum/reagent/corn_starch
name = "Corn Starch"
id = "corn_starch"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/chemical_reaction/corn_syrup
name = "corn_syrup"
id = "corn_syrup"
result = "corn_syrup"
required_reagents = list("corn_starch" = 1, "sacid" = 1)
result_amount = 5
required_temp = 374
datum/reagent/corn_syrup
name = "Corn Syrup"
id = "corn_syrup"
description = "Decays into sugar."
reagent_state = LIQUID
color = "#C8A5DC"
datum/reagent/corn_syrup/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.reagents.add_reagent("sugar", 3)
M.reagents.remove_reagent("corn_syrup", 1)
..()
return
/datum/chemical_reaction/corgium
name = "corgium"
id = "corgium"
result = "corgium"
required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1)
result_amount = 3
required_temp = 374
datum/reagent/corgium
name = "Corgium"
id = "corgium"
description = "Creates a corgi at the reaction location."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/chemical_reaction/corgium/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
new /mob/living/simple_animal/pet/corgi(location)
..()
return
datum/reagent/hair_dye
name = "Quantum Hair Dye"
id = "hair_dye"
description = "A solution."
reagent_state = LIQUID
color = "#C8A5DC"
var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code
/datum/chemical_reaction/hair_dye
name = "hair_dye"
id = "hair_dye"
result = "hair_dye"
required_reagents = list("colorful_reagent" = 1, "radium" = 1, "space_drugs" = 1)
result_amount = 5
datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume)
if(M && ishuman(M))
var/mob/living/carbon/human/H = M
H.hair_color = pick(potential_colors)
H.facial_hair_color = pick(potential_colors)
H.update_hair()
..()
return
datum/reagent/barbers_aid
name = "Barber's Aid"
id = "barbers_aid"
description = "A solution to hair loss across the world."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/chemical_reaction/barbers_aid
name = "barbers_aid"
id = "barbers_aid"
result = "barbers_aid"
required_reagents = list("carpet" = 1, "radium" = 1, "space_drugs" = 1)
result_amount = 5
datum/reagent/barbers_aid/reaction_mob(var/mob/living/M, var/volume)
if(M && ishuman(M))
var/mob/living/carbon/human/H = M
var/datum/sprite_accessory/hair/picked_hair = pick(hair_styles_list)
var/datum/sprite_accessory/facial_hair/picked_beard = pick(facial_hair_styles_list)
H.hair_style = picked_hair
H.facial_hair_style = picked_beard
H.update_hair()
..()
return
datum/reagent/concentrated_barbers_aid
name = "Concentrated Barber's Aid"
id = "concentrated_barbers_aid"
description = "A concentrated solution to hair loss across the world."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/chemical_reaction/concentrated_barbers_aid
name = "concentrated_barbers_aid"
id = "concentrated_barbers_aid"
result = "concentrated_barbers_aid"
required_reagents = list("barbers_aid" = 1, "mutagen" = 1)
result_amount = 2
datum/reagent/concentrated_barbers_aid/reaction_mob(var/mob/living/M, var/volume)
if(M && ishuman(M))
var/mob/living/carbon/human/H = M
H.hair_style = "Very Long Hair"
H.facial_hair_style = "Very Long Beard"
H.update_hair()
..()
return
@@ -1,486 +0,0 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
/datum/reagent/stabilizing_agent
name = "Stabilizing Agent"
id = "stabilizing_agent"
description = "Keeps unstable chemicals stable. This does not work on everything."
reagent_state = LIQUID
color = "#FFFFFF"
/datum/chemical_reaction/stabilizing_agent
name = "stabilizing_agent"
id = "stabilizing_agent"
result = "stabilizing_agent"
required_reagents = list("iron" = 1, "oxygen" = 1, "hydrogen" = 1)
result_amount = 3
/datum/reagent/clf3
name = "Chlorine Trifluoride"
id = "clf3"
description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space."
reagent_state = LIQUID
color = "#FF0000"
metabolization_rate = 4
/datum/chemical_reaction/clf3
name = "Chlorine Trifluoride"
id = "clf3"
result = "clf3"
required_reagents = list("chlorine" = 1, "fluorine" = 3)
result_amount = 4
required_temp = 424
/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjust_fire_stacks(4)
M.adjustFireLoss(0.35*M.fire_stacks)
..()
return
/datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume)
var/turf/T = get_turf(holder.my_atom)
for(var/turf/turf in range(1,T))
new /obj/effect/hotspot(turf)
holder.chem_temp = 1000 // hot as shit
return
/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume)
if(istype(T, /turf/simulated/floor/plating))
var/turf/simulated/floor/plating/F = T
if(prob(1))
F.ChangeTurf(/turf/space)
if(istype(T, /turf/simulated/floor/))
var/turf/simulated/floor/F = T
if(prob(volume/10))
F.make_plating()
if(istype(F, /turf/simulated/floor/))
new /obj/effect/hotspot(F)
if(istype(T, /turf/simulated/wall/))
var/turf/simulated/wall/W = T
if(prob(volume/10))
W.ChangeTurf(/turf/simulated/floor)
return
/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(method == TOUCH && isliving(M))
M.adjust_fire_stacks(5)
M.IgniteMob()
new /obj/effect/hotspot(M.loc)
return
/datum/reagent/sorium
name = "Sorium"
id = "sorium"
description = "Sends everything flying from the detonation point."
reagent_state = LIQUID
color = "#FFA500"
/datum/chemical_reaction/sorium
name = "Sorium"
id = "sorium"
result = "sorium"
required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1)
result_amount = 4
/datum/chemical_reaction/sorium_vortex
name = "sorium_vortex"
id = "sorium_vortex"
result = null
required_reagents = list("sorium" = 1)
required_temp = 474
/datum/chemical_reaction/sorium_vortex/on_reaction(var/datum/reagents/holder, var/created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
goonchem_vortex(T, 1, 5, 6)
/datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("sorium", created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
goonchem_vortex(T, 1, 5, 6)
/datum/reagent/liquid_dark_matter
name = "Liquid Dark Matter"
id = "liquid_dark_matter"
description = "Sucks everything into the detonation point."
reagent_state = LIQUID
color = "#800080"
/datum/chemical_reaction/liquid_dark_matter
name = "Liquid Dark Matter"
id = "liquid_dark_matter"
result = "liquid_dark_matter"
required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1)
result_amount = 3
/datum/chemical_reaction/ldm_vortex
name = "LDM Vortex"
id = "ldm_vortex"
result = null
required_reagents = list("liquid_dark_matter" = 1)
required_temp = 474
/datum/chemical_reaction/ldm_vortex/on_reaction(var/datum/reagents/holder, var/created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
goonchem_vortex(T, 0, 5, 6)
return
/datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("liquid_dark_matter", created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
goonchem_vortex(T, 0, 5, 6)
return
/proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull_times)
for(var/atom/movable/X in orange(range, T))
if(istype(X, /obj/effect))
continue //stop pulling smoke and hotspots please
if(istype(X, /atom/movable))
if((X) && !X.anchored)
if(setting_type)
for(var/i = 0, i < pull_times, i++)
step_away(X,T)
else
for(var/i = 0, i < pull_times, i++)
step_towards(X,T)
/datum/reagent/blackpowder
name = "Black Powder"
id = "blackpowder"
description = "Explodes. Violently."
reagent_state = LIQUID
color = "#000000"
metabolization_rate = 0.05
/datum/chemical_reaction/blackpowder
name = "Black Powder"
id = "blackpowder"
result = "blackpowder"
required_reagents = list("saltpetre" = 1, "charcoal" = 1, "sulfur" = 1)
result_amount = 3
/datum/chemical_reaction/blackpowder_explosion
name = "Black Powder Kaboom"
id = "blackpowder_explosion"
result = null
required_reagents = list("blackpowder" = 1)
result_amount = 1
required_temp = 474
mix_message = "<span class = 'boldannounce'>Sparks start flying around the black powder!</span>"
/datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume)
sleep(rand(50,100))
blackpowder_detonate(holder, created_volume)
return
/datum/reagent/blackpowder/on_ex_act()
blackpowder_detonate(holder, volume)
return
/proc/blackpowder_detonate(var/datum/reagents/holder, var/created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
var/ex_severe = round(created_volume / 100)
var/ex_heavy = round(created_volume / 42)
var/ex_light = round(created_volume / 21)
var/ex_flash = round(created_volume / 8)
explosion(T,ex_severe,ex_heavy,ex_light,ex_flash, 1)
return
/datum/reagent/flash_powder
name = "Flash Powder"
id = "flash_powder"
description = "Makes a very bright flash."
reagent_state = LIQUID
color = "#FFFF00"
/datum/chemical_reaction/flash_powder
name = "Flash powder"
id = "flash_powder"
result = "flash_powder"
required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 )
result_amount = 3
/datum/chemical_reaction/flash_powder_flash
name = "Flash powder activation"
id = "flash_powder_flash"
result = null
required_reagents = list("flash_powder" = 1)
required_temp = 374
/datum/chemical_reaction/flash_powder_flash/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, location)
s.start()
for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
if(C.check_eye_prot())
continue
flick("e_flash", C.flash)
if(get_dist(C, location) < 4)
C.Weaken(5)
continue
C.Stun(5)
/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
var/location = get_turf(holder.my_atom)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, location)
s.start()
for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
if(C.check_eye_prot())
continue
flick("e_flash", C.flash)
if(get_dist(C, location) < 4)
C.Weaken(5)
continue
C.Stun(5)
holder.remove_reagent("flash_powder", created_volume)
/datum/reagent/smoke_powder
name = "Smoke Powder"
id = "smoke_powder"
description = "Makes a large cloud of smoke that can carry reagents."
reagent_state = LIQUID
color = "#808080"
/datum/chemical_reaction/smoke_powder
name = "smoke_powder"
id = "smoke_powder"
result = "smoke_powder"
required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1)
result_amount = 3
/datum/chemical_reaction/smoke_powder_smoke
name = "smoke_powder_smoke"
id = "smoke_powder_smoke"
result = null
required_reagents = list("smoke_powder" = 1)
required_temp = 374
secondary = 1
mob_react = 1
/datum/chemical_reaction/smoke_powder_smoke/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread
S.attach(location)
playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
spawn(0)
if(S)
S.set_up(holder, 10, 0, location)
S.start()
sleep(10)
S.start()
if(holder && holder.my_atom)
holder.clear_reagents()
return
/datum/chemical_reaction/smoke_powder/on_reaction(var/datum/reagents/holder, var/created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("smoke_powder", created_volume)
var/location = get_turf(holder.my_atom)
var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread
S.attach(location)
playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
spawn(0)
if(S)
S.set_up(holder, 10, 0, location)
S.start()
sleep(10)
S.start()
if(holder && holder.my_atom)
holder.clear_reagents()
return
/datum/reagent/sonic_powder
name = "Sonic Powder"
id = "sonic_powder"
description = "Makes a deafening noise."
reagent_state = LIQUID
color = "#0000FF"
/datum/chemical_reaction/sonic_powder
name = "sonic_powder"
id = "sonic_powder"
result = "sonic_powder"
required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1)
result_amount = 3
/datum/chemical_reaction/sonic_powder_deafen
name = "sonic_powder_deafen"
id = "sonic_powder_deafen"
result = null
required_reagents = list("sonic_powder" = 1)
required_temp = 374
/datum/chemical_reaction/sonic_powder_deafen/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
playsound(location, 'sound/effects/bang.ogg', 25, 1)
for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
if(ishuman(C))
var/mob/living/carbon/human/H = C
if((H.ears && (H.ears.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT)))
continue
C.show_message("<span class='warning'>BANG</span>", 2)
C.Stun(5)
C.Weaken(5)
C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15))
if(C.ear_damage >= 15)
C << "<span class='warning'>Your ears start to ring badly!</span>"
else if(C.ear_damage >= 5)
C << "<span class='warning'>Your ears start to ring!</span>"
/datum/chemical_reaction/sonic_powder/on_reaction(var/datum/reagents/holder, var/created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("sonic_powder", created_volume)
var/location = get_turf(holder.my_atom)
playsound(location, 'sound/effects/bang.ogg', 25, 1)
for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
if(ishuman(C))
var/mob/living/carbon/human/H = C
if((H.ears && (H.ears.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT)))
continue
C.show_message("<span class='warning'>BANG</span>", 2)
C.Stun(5)
C.Weaken(5)
C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15))
if(C.ear_damage >= 15)
C << "<span class='warning'>Your ears start to ring badly!</span>"
else if(C.ear_damage >= 5)
C << "<span class='warning'>Your ears start to ring!</span>"
/datum/reagent/phlogiston
name = "Phlogiston"
id = "phlogiston"
description = "Catches you on fire and makes you ignite."
reagent_state = LIQUID
color = "#FF9999"
/datum/chemical_reaction/phlogiston
name = "phlogiston"
id = "phlogiston"
result = "phlogiston"
required_reagents = list("phosphorus" = 1, "sacid" = 1, "stable_plasma" = 1)
result_amount = 3
/datum/chemical_reaction/phlogiston/on_reaction(var/datum/reagents/holder, var/created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
var/turf/simulated/T = get_turf(holder.my_atom)
if(istype(T))
T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume)
return
/datum/reagent/phlogiston/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjust_fire_stacks(1)
M.IgniteMob()
M.adjustFireLoss(0.2*M.fire_stacks)
..()
return
/datum/reagent/napalm
name = "Napalm"
id = "napalm"
description = "Very flammable."
reagent_state = LIQUID
color = "#FF9999"
/datum/reagent/napalm/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjust_fire_stacks(1)
..()
return
/datum/reagent/napalm/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(method == TOUCH && isliving(M))
M.adjust_fire_stacks(7)
return
/datum/chemical_reaction/napalm
name = "Napalm"
id = "napalm"
result = "napalm"
required_reagents = list("sugar" = 1, "fuel" = 1, "ethanol" = 1 )
result_amount = 3
datum/reagent/cryostylane
name = "Cryostylane"
id = "cryostylane"
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K."
color = "#B2B2FF" // rgb: 139, 166, 233
/datum/chemical_reaction/cryostylane
name = "cryostylane"
id = "cryostylane"
result = "cryostylane"
required_reagents = list("water" = 1, "stable_plasma" = 1, "nitrogen" = 1)
result_amount = 3
/datum/chemical_reaction/cryostylane/on_reaction(var/datum/reagents/holder, var/created_volume)
holder.chem_temp = 20 // cools the fuck down
return
datum/reagent/cryostylane/on_mob_life(var/mob/living/M as mob) //TODO: code freezing into an ice cube
if(M.reagents.has_reagent("oxygen"))
M.reagents.remove_reagent("oxygen", 1)
M.bodytemperature -= 30
..()
return
datum/reagent/cryostylane/on_tick()
if(holder.has_reagent("oxygen"))
holder.remove_reagent("oxygen", 1)
holder.chem_temp -= 10
holder.handle_reactions()
..()
return
datum/reagent/cryostylane/reaction_turf(var/turf/simulated/T, var/volume)
if(volume >= 5)
for(var/mob/living/simple_animal/slime/M in T)
M.adjustToxLoss(rand(15,30))
datum/reagent/pyrosium
name = "Pyrosium"
id = "pyrosium"
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K."
color = "#B20000" // rgb: 139, 166, 233
/datum/chemical_reaction/pyrosium
name = "pyrosium"
id = "pyrosium"
result = "pyrosium"
required_reagents = list("stable_plasma" = 1, "radium" = 1, "phosphorus" = 1)
result_amount = 3
/datum/chemical_reaction/pyrosium/on_reaction(var/datum/reagents/holder, var/created_volume)
holder.chem_temp = 20 // also cools the fuck down
return
datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob)
if(M.reagents.has_reagent("oxygen"))
M.reagents.remove_reagent("oxygen", 1)
M.bodytemperature += 30
..()
return
datum/reagent/pyrosium/on_tick()
if(holder.has_reagent("oxygen"))
holder.remove_reagent("oxygen", 1)
holder.chem_temp += 10
holder.handle_reactions()
..()
return
@@ -1,34 +0,0 @@
/*
Credit goes to Cogwerks, and all the other goonstation coders
for the original idea and implementation of this over at goonstation.
THE REQUESTED DON'T PORT LIST: IF YOU PORT THESE THE GOONS WILL MURDER US IN OUR SLEEP SO PLEASE DON'T KTHX - Iamgoofball
Any of the Secret Chems
Goon in-joke chems (Eg. Cat Drugs, Hairgrownium)
Liquid Electricity
Rajajajah
/datum/reagent/blankgoonchembase
name = "blank goonchem base"
id = "blankgoonchembase"
description = "A blank chem"
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/reagent/blankgoonchembase/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
..()
return
/datum/chemical_reaction/blankgoonchembase
name = "blank goonchem base"
id = "blankgoonchembase"
result = "blankgoonchembase"
required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1)
result_amount = 3
mix_message = "The mixture dries into a pale blue powder."
required_temp = 420
*/
@@ -1,369 +0,0 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/polonium
name = "Polonium"
id = "polonium"
description = "Cause significant Radiation damage over time."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.1
datum/reagent/polonium/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.radiation += 8
..()
return
datum/reagent/histamine
name = "Histamine"
id = "histamine"
description = "A dose-dependent toxin, ranges from annoying to incredibly lethal."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.2
overdose_threshold = 30
datum/reagent/histamine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
switch(pick(1, 2, 3, 4))
if(1)
M << "<span class='danger'>You can barely see!</span>"
M.eye_blurry = 3
if(2)
M.emote("cough")
if(3)
M.emote("sneeze")
if(4)
if(prob(75))
M << "You scratch at an itch."
M.adjustBruteLoss(2*REM)
..()
return
datum/reagent/histamine/overdose_process(var/mob/living/M as mob)
M.adjustOxyLoss(pick(1,3)*REM)
M.adjustBruteLoss(pick(1,3)*REM)
M.adjustToxLoss(pick(1,3)*REM)
..()
return
datum/reagent/formaldehyde
name = "Formaldehyde"
id = "formaldehyde"
description = "Deals a moderate amount of Toxin damage over time. 10% chance to decay into 10-15 histamine."
reagent_state = LIQUID
color = "#CF3600"
datum/reagent/formaldehyde/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(1*REM)
if(prob(10))
M.reagents.add_reagent("histamine",pick(5,15))
M.reagents.remove_reagent("formaldehyde",1)
..()
return
/datum/chemical_reaction/formaldehyde
name = "formaldehyde"
id = "Formaldehyde"
result = "formaldehyde"
required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1)
result_amount = 3
required_temp = 420
datum/reagent/venom
name = "Venom"
id = "venom"
description = "Will deal scaling amounts of Toxin and Brute damage over time. 25% chance to decay into 5-10 histamine."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.2
datum/reagent/venom/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss((0.1*volume)*REM)
M.adjustBruteLoss((0.1*volume)*REM)
if(prob(25))
M.reagents.add_reagent("histamine",pick(5,10))
M.reagents.remove_reagent("venom",1)
..()
return
datum/reagent/neurotoxin2
name = "Neurotoxin"
id = "neurotoxin2"
description = "Deals toxin and brain damage up to 60 before it slows down, causing confusion and a knockout after 17 elapsed cycles."
reagent_state = LIQUID
color = "#CF3600"
var/cycle_count = 0
metabolization_rate = 1
datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob)
cycle_count++
if(M.brainloss + M.toxloss <= 60)
M.adjustBrainLoss(1*REM)
M.adjustToxLoss(1*REM)
if(cycle_count == 17)
M.sleeping += 10 // buffed so it works
..()
return
/datum/chemical_reaction/neurotoxin2
name = "neurotoxin2"
id = "neurotoxin2"
result = "neurotoxin2"
required_reagents = list("space_drugs" = 1)
result_amount = 1
required_temp = 674
datum/reagent/cyanide
name = "Cyanide"
id = "cyanide"
description = "Deals toxin damage, alongside some oxygen loss. 8% chance of stun and some extra toxin damage."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.1
datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(1.5*REM)
if(prob(10))
M.losebreath += 1
if(prob(8))
M << "You feel horrendously weak!"
M.Stun(2)
M.adjustToxLoss(2*REM)
..()
return
/datum/chemical_reaction/cyanide
name = "Cyanide"
id = "cyanide"
result = "cyanide"
required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1)
result_amount = 3
required_temp = 380
/datum/reagent/questionmark // food poisoning
name = "Bad Food"
id = "????"
description = "????"
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.2
datum/reagent/questionmark/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(1*REM)
..()
return
datum/reagent/itching_powder
name = "Itching Powder"
id = "itching_powder"
description = "Lots of annoying random effects, chances to do some brute damage from scratching. 6% chance to decay into 1-3 units of histamine."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.3
/datum/reagent/itching_powder/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.reagents.add_reagent("itching_powder", volume)
return
datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(27))
M << "You scratch at your head."
M.adjustBruteLoss(0.2*REM)
if(prob(27))
M << "You scratch at your leg."
M.adjustBruteLoss(0.2*REM)
if(prob(27))
M << "You scratch at your arm."
M.adjustBruteLoss(0.2*REM)
if(prob(6))
M.reagents.add_reagent("histamine",rand(1,3))
M.reagents.remove_reagent("itching_powder",1)
..()
return
/datum/chemical_reaction/itching_powder
name = "Itching Powder"
id = "itching_powder"
result = "itching_powder"
required_reagents = list("fuel" = 1, "ammonia" = 1, "charcoal" = 1)
result_amount = 3
/datum/chemical_reaction/facid
name = "Fluorosulfuric acid"
id = "facid"
result = "facid"
required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1)
result_amount = 4
required_temp = 380
datum/reagent/initropidril
name = "Initropidril"
id = "initropidril"
description = "33% chance to hit with a random amount of toxin damage, 5-10% chances to cause stunning, suffocation, or immediate heart failure."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.4
datum/reagent/initropidril/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(33))
M.adjustToxLoss(rand(5,25))
if(prob(7))
var/picked_option = rand(1,3)
switch(picked_option)
if(1)
M.Stun(3)
M.Weaken(3)
if(2)
M.losebreath += 10
M.adjustOxyLoss(rand(5,25))
if(3)
var/mob/living/carbon/human/H = M
if(!H.heart_attack)
H.visible_message("<span class = 'danger'>[H] clutches at their chest as if their heart stopped!</span>", "<span class = 'userdanger'>You clutch at your chest as if your heart stopped!</span>")
H.heart_attack = 1 // rip in pepperoni
else
H.losebreath += 10
H.adjustOxyLoss(rand(5,25))
..()
return
datum/reagent/pancuronium
name = "Pancuronium"
id = "pancuronium"
description = "Knocks you out after 30 seconds, 7% chance to cause some oxygen loss."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.2
datum/reagent/pancuronium/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(current_cycle >= 10)
M.SetParalysis(3)
if(prob(7))
M.losebreath += rand(3,5)
..()
return
datum/reagent/sodium_thiopental
name = "Sodium Thiopental"
id = "sodium_thiopental"
description = "Puts you to sleep after 30 seconds, along with some major stamina loss."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.7
datum/reagent/sodium_thiopental/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(current_cycle >= 10)
M.sleeping += 3
M.adjustStaminaLoss(10)
..()
return
datum/reagent/sulfonal
name = "Sulfonal"
id = "sulfonal"
description = "Deals some toxin damage, and puts you to sleep after 66 seconds."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.1
/datum/chemical_reaction/sulfonal
name = "sulfonal"
id = "sulfonal"
result = "sulfonal"
required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1)
result_amount = 3
datum/reagent/sulfonal/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(current_cycle >= 22)
M.sleeping += 3
M.adjustToxLoss(1)
..()
return
datum/reagent/amanitin
name = "Amanitin"
id = "amanitin"
description = "On the last second that it's in you, it hits you with a stack of toxin damage based on how long it's been in you. The more you use, the longer it takes before anything happens, but the harder it hits when it does."
reagent_state = LIQUID
color = "#CF3600"
datum/reagent/amanitin/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
..()
return
datum/reagent/amanitin/on_mob_delete(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(current_cycle*rand(2,4))
..()
datum/reagent/lipolicide
name = "Lipolicide"
id = "lipolicide"
description = "Deals some toxin damage unless they keep eating food. Will reduce nutrition values."
reagent_state = LIQUID
color = "#CF3600"
/datum/chemical_reaction/lipolicide
name = "lipolicide"
id = "lipolicide"
result = "lipolicide"
required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1)
result_amount = 3
datum/reagent/lipolicide/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(!holder.has_reagent("nutriment"))
M.adjustToxLoss(1)
M.nutrition -= 10 * REAGENTS_METABOLISM
M.overeatduration = 0
if(M.nutrition < 0)//Prevent from going into negatives.
M.nutrition = 0
..()
return
datum/reagent/coniine
name = "Coniine"
id = "coniine"
description = "Does moderate toxin damage and oxygen loss."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.05
datum/reagent/coniine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.losebreath += 5
M.adjustToxLoss(2)
..()
return
datum/reagent/curare
name = "Curare"
id = "curare"
description = "Does some oxygen and toxin damage, weakens you after 33 seconds."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.1
datum/reagent/curare/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(current_cycle >= 11)
M.Weaken(3)
M.adjustToxLoss(1)
M.adjustOxyLoss(1)
..()
return
@@ -73,20 +73,6 @@ datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, v
M << "<span class = 'userdanger'>The blob strikes you, and your lungs feel heavy and weak!</span>"
// Special Reagents
datum/reagent/blob/acid
name = "Acidic Liquid"
id = "blob_acid"
description = ""
color = "#BD80F4"
datum/reagent/blob/acid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
if(method == TOUCH)
if(prob(50))
M.acid_act(5,1,5)
if(show_message)
M << "<span class = 'userdanger'>The blob's tendrils melt through your equipment!</span>"
M.apply_damage(10, BRUTE)
datum/reagent/blob/radioactive_liquid
name = "Radioactive Liquid"
id = "radioactive_liquid"
@@ -187,7 +173,7 @@ datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=T
/proc/reagent_vortex(var/mob/living/M as mob, var/setting_type)
var/turf/pull = get_turf(M)
for(var/atom/movable/X in orange(4,pull))
for(var/atom/movable/X in range(4,pull))
if(istype(X, /atom/movable))
if((X) && !X.anchored)
if(setting_type)
@@ -1,956 +0,0 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent)
//so that it can continue working when the reagent is deleted while the proc is still active.
//Various reagents
//Toxin & acid reagents
//Hydroponics stuff
datum/reagent
var/name = "Reagent"
var/id = "reagent"
var/description = ""
var/datum/reagents/holder = null
var/reagent_state = LIQUID
var/list/data
var/current_cycle = 0
var/volume = 0
var/color = "#000000" // rgb: 0, 0, 0
var/can_synth = 1
var/metabolization_rate = REAGENTS_METABOLISM
var/overrides_metab = 0
var/overdose_threshold = 0
var/addiction_threshold = 0
var/addiction_stage = 0
var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick.
datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
..()
holder = null
datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some
if(!istype(M, /mob/living))
return 0
var/datum/reagent/self = src
src = null //of the reagent to the mob on TOUCHING it.
if(!istype(self.holder.my_atom, /obj/effect/effect/chem_smoke))
// If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl
if(method == TOUCH)
var/chance = 1
var/block = 0
for(var/obj/item/clothing/C in M.get_equipped_items())
if(C.permeability_coefficient < chance) chance = C.permeability_coefficient
if(istype(C, /obj/item/clothing/suit/bio_suit))
// bio suits are just about completely fool-proof - Doohl
// kind of a hacky way of making bio suits more resistant to chemicals but w/e
if(prob(75))
block = 1
if(istype(C, /obj/item/clothing/head/bio_hood))
if(prob(75))
block = 1
chance = chance * 100
if(prob(chance) && !block)
if(M.reagents)
M.reagents.add_reagent(self.id,self.volume/2)
return 1
datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object
src = null //if it can hold reagents. nope!
//if(O.reagents)
// O.reagents.add_reagent(id,volume/3)
return
datum/reagent/proc/reaction_turf(var/turf/T, var/volume)
src = null
return
datum/reagent/proc/on_mob_life(var/mob/living/M as mob)
current_cycle++
if(!istype(M, /mob/living))
return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO
holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
return
// Called when this reagent is removed while inside a mob
datum/reagent/proc/on_mob_delete(mob/M)
return
datum/reagent/proc/on_move(var/mob/M)
return
// Called after add_reagents creates a new reagent.
datum/reagent/proc/on_new(var/data)
return
// Called when two reagents of the same are mixing.
datum/reagent/proc/on_merge(var/data)
return
datum/reagent/proc/on_update(var/atom/A)
return
// Called every time reagent containers process.
datum/reagent/proc/on_tick(var/data)
return
// Called when the reagent container is hit by an explosion
datum/reagent/proc/on_ex_act(var/severity)
return
// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects
datum/reagent/proc/overdose_process(var/mob/living/M as mob)
return
datum/reagent/proc/overdose_start(var/mob/living/M as mob)
return
datum/reagent/proc/addiction_act_stage1(var/mob/living/M as mob)
if(prob(30))
M << "<span class = 'notice'>You feel like some [name] right about now.</span>"
return
datum/reagent/proc/addiction_act_stage2(var/mob/living/M as mob)
if(prob(30))
M << "<span class = 'notice'>You feel like you need [name]. You just can't get enough.</span>"
return
datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob)
if(prob(30))
M << "<span class = 'danger'>You have an intense craving for [name].</span>"
return
datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob)
if(prob(30))
M << "<span class = 'boldannounce'>You're not feeling good at all! You really need some [name].</span>"
return
datum/reagent/blood
data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
name = "Blood"
id = "blood"
color = "#C80000" // rgb: 200, 0, 0
datum/reagent/blood/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
var/datum/reagent/blood/self = src
src = null
if(self.data && self.data["viruses"])
for(var/datum/disease/D in self.data["viruses"])
if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS)
continue
if(method == TOUCH)
M.ContractDisease(D)
else //injected
M.ForceContractDisease(D)
datum/reagent/blood/on_new(var/list/data)
if(istype(data))
SetViruses(src, data)
datum/reagent/blood/on_merge(var/list/data)
if(src.data && data)
src.data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning, or else we won't know who's even getting cloned, etc
if(src.data["viruses"] || data["viruses"])
var/list/mix1 = src.data["viruses"]
var/list/mix2 = data["viruses"]
// Stop issues with the list changing during mixing.
var/list/to_mix = list()
for(var/datum/disease/advance/AD in mix1)
to_mix += AD
for(var/datum/disease/advance/AD in mix2)
to_mix += AD
var/datum/disease/advance/AD = Advance_Mix(to_mix)
if(AD)
var/list/preserve = list(AD)
for(var/D in src.data["viruses"])
if(!istype(D, /datum/disease/advance))
preserve += D
src.data["viruses"] = preserve
return 1
datum/reagent/blood/reaction_turf(var/turf/simulated/T, var/volume)//splash the blood all over the place
if(!istype(T)) return
var/datum/reagent/blood/self = src
src = null
if(!(volume >= 3)) return
//var/datum/disease/D = self.data["virus"]
if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human))
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here
if(!blood_prop) //first blood!
blood_prop = new(T)
blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"]
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = D.Copy(1)
blood_prop.viruses += newVirus
newVirus.holder = blood_prop
else if(istype(self.data["donor"], /mob/living/carbon/monkey))
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA["Non-Human DNA"] = "A+"
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = D.Copy(1)
blood_prop.viruses += newVirus
newVirus.holder = blood_prop
else if(istype(self.data["donor"], /mob/living/carbon/alien))
var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T
if(!blood_prop)
blood_prop = new(T)
blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*"
for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = D.Copy(1)
blood_prop.viruses += newVirus
newVirus.holder = blood_prop
return
datum/reagent/vaccine
//data must contain virus type
name = "Vaccine"
id = "vaccine"
color = "#C81040" // rgb: 200, 16, 64
datum/reagent/vaccine/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
var/datum/reagent/vaccine/self = src
src = null
if(islist(self.data) && method == INGEST)
for(var/datum/disease/D in M.viruses)
if(D.GetDiseaseID() in self.data)
D.cure()
M.resistances |= self.data
return
datum/reagent/vaccine/on_merge(var/list/data)
if(istype(data))
src.data |= data.Copy()
datum/reagent/water
name = "Water"
id = "water"
description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen."
color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha)
var/cooling_temperature = 2
/*
* Water reaction to turf
*/
datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume)
if (!istype(T)) return
var/CT = cooling_temperature
src = null
if(volume >= 10)
T.MakeSlippery()
for(var/mob/living/simple_animal/slime/M in T)
M.apply_water()
var/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot && !istype(T, /turf/space))
if(T.air)
var/datum/gas_mixture/G = T.air
G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0)
G.react()
qdel(hotspot)
return
/*
* Water reaction to an object
*/
datum/reagent/water/reaction_obj(var/obj/O, var/volume)
src = null
// Monkey cube
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
if(!cube.wrapped)
cube.Expand()
// Dehydrated carp
if(istype(O,/obj/item/toy/carpplushie/dehy_carp))
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
dehy.Swell() // Makes a carp
return
/*
* Water reaction to a mob
*/
datum/reagent/water/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with water can help put them out!
if(!istype(M, /mob/living))
return
if(method == TOUCH)
M.adjust_fire_stacks(-(volume / 10))
if(M.fire_stacks <= 0)
M.ExtinguishMob()
return
datum/reagent/water/holywater
name = "Holy Water"
id = "holywater"
description = "Water blessed by some deity."
color = "#E0E8EF" // rgb: 224, 232, 239
datum/reagent/water/holywater/on_mob_life(var/mob/living/M as mob)
if(!data) data = 1
data++
M.jitteriness = max(M.jitteriness-5,0)
if(data >= 30) // 12 units, 54 seconds @ metabolism 0.4 units & tick rate 1.8 sec
if (!M.stuttering) M.stuttering = 1
M.stuttering += 4
M.Dizzy(5)
if(iscultist(M) && prob(5))
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu"))
if(data >= 75 && prob(33)) // 30 units, 135 seconds
if (!M.confused) M.confused = 1
M.confused += 3
if(iscultist(M))
ticker.mode.remove_cultist(M.mind)
holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
M.jitteriness = 0
M.stuttering = 0
M.confused = 0
holder.remove_reagent(src.id, 0.4) //fixed consumption to prevent balancing going out of whack
return
datum/reagent/water/holywater/reaction_turf(var/turf/simulated/T, var/volume)
..()
if(!istype(T)) return
if(volume>=10)
for(var/obj/effect/rune/R in T)
qdel(R)
T.Bless()
datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
name = "Unholy Water"
id = "unholywater"
description = "Something that shouldn't exist on this plane of existance."
datum/reagent/fuel/unholywater/on_mob_life(var/mob/living/M as mob)
M.adjustBrainLoss(3)
if(iscultist(M))
M.status_flags |= GOTTAGOFAST
M.drowsyness = max(M.drowsyness-5, 0)
M.AdjustParalysis(-2)
M.AdjustStunned(-2)
M.AdjustWeakened(-2)
else
M.adjustToxLoss(2)
M.adjustFireLoss(2)
M.adjustOxyLoss(2)
M.adjustBruteLoss(2)
holder.remove_reagent(src.id, 1)
datum/reagent/hellwater //if someone has this in their system they've really pissed off an eldrich god
name = "Hell Water"
id = "hell_water"
description = "YOUR FLESH! IT BURNS!"
datum/reagent/hellwater/on_mob_life(var/mob/living/M as mob)
M.fire_stacks = min(5,M.fire_stacks + 3)
M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
M.adjustToxLoss(1)
M.adjustFireLoss(1) //Hence the other damages... ain't I a bastard?
M.adjustBrainLoss(5)
holder.remove_reagent(src.id, 1)
datum/reagent/lube
name = "Space Lube"
id = "lube"
description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity."
color = "#009CA8" // rgb: 0, 156, 168
datum/reagent/lube/reaction_turf(var/turf/simulated/T, var/volume)
if (!istype(T)) return
src = null
if(volume >= 1)
T.MakeSlippery(2)
datum/reagent/slimetoxin
name = "Mutation Toxin"
id = "mutationtoxin"
description = "A corruptive toxin produced by slimes."
color = "#13BC5E" // rgb: 19, 188, 94
datum/reagent/unstableslimetoxin
name = "Unstable Mutation Toxin"
id = "unstablemutationtoxin"
description = "An unstable and unpredictable corruptive toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
metabolization_rate = INFINITY //So it instantly removes all of itself
datum/reagent/unstableslimetoxin/on_mob_life(var/mob/living/carbon/human/H as mob)
..()
H << "<span class='warning'><b>You crumple in agony as your flesh wildly morphs into new forms!</b></span>"
H.visible_message("<b>[H]</b> falls to the ground and screams as their skin bubbles and froths!") //'froths' sounds painful when used with SKIN.
H.Weaken(3)
sleep(30)
var/list/blacklisted_species = list(/datum/species/zombie, /datum/species/skeleton, /datum/species/human, /datum/species/golem, /datum/species/golem/adamantine, /datum/species/shadow)
var/list/possible_morphs = typesof(/datum/species/) - blacklisted_species
var/datum/species/mutation = pick(possible_morphs)
if(prob(90) && mutation && H.dna.species != /datum/species/golem && H.dna.species != /datum/species/golem/adamantine)
H << "<span class='danger'>The pain subsides. You feel... different.</span>"
H.dna.species = new mutation()
H.regenerate_icons()
if(mutation == /datum/species/slime)
H.faction |= "slime"
else
H.faction -= "slime"
else
H << "<span class='danger'>The pain vanishes suddenly. You feel no different.</span>"
return 1
datum/reagent/aslimetoxin
name = "Advanced Mutation Toxin"
id = "amutationtoxin"
description = "An advanced corruptive toxin produced by slimes."
color = "#13BC5E" // rgb: 19, 188, 94
datum/reagent/aslimetoxin/reaction_mob(var/mob/M, var/volume)
src = null
M.ForceContractDisease(new /datum/disease/transformation/slime(0))
datum/reagent/space_drugs
name = "Space drugs"
id = "space_drugs"
description = "An illegal chemical compound used as drug."
color = "#60A584" // rgb: 96, 165, 132
metabolization_rate = 0.5 * REAGENTS_METABOLISM
datum/reagent/space_drugs/on_mob_life(var/mob/living/M as mob)
M.druggy = max(M.druggy, 15)
if(isturf(M.loc) && !istype(M.loc, /turf/space))
if(M.canmove)
if(prob(10)) step(M, pick(cardinal))
if(prob(7)) M.emote(pick("twitch","drool","moan","giggle"))
..()
return
datum/reagent/serotrotium
name = "Serotrotium"
id = "serotrotium"
description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans."
color = "#202040" // rgb: 20, 20, 40
metabolization_rate = 0.25 * REAGENTS_METABOLISM
datum/reagent/serotrotium/on_mob_life(var/mob/living/M as mob)
if(ishuman(M))
if(prob(7)) M.emote(pick("twitch","drool","moan","gasp"))
..()
return
datum/reagent/oxygen
name = "Oxygen"
id = "oxygen"
description = "A colorless, odorless gas."
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
datum/reagent/copper
name = "Copper"
id = "copper"
description = "A highly ductile metal."
reagent_state = SOLID
color = "#6E3B08" // rgb: 110, 59, 8
datum/reagent/nitrogen
name = "Nitrogen"
id = "nitrogen"
description = "A colorless, odorless, tasteless gas."
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
datum/reagent/hydrogen
name = "Hydrogen"
id = "hydrogen"
description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas."
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
datum/reagent/potassium
name = "Potassium"
id = "potassium"
description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water."
reagent_state = SOLID
color = "#A0A0A0" // rgb: 160, 160, 160
datum/reagent/mercury
name = "Mercury"
id = "mercury"
description = "A chemical element."
color = "#484848" // rgb: 72, 72, 72
datum/reagent/mercury/on_mob_life(var/mob/living/M as mob)
if(M.canmove && istype(M.loc, /turf/space))
step(M, pick(cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
M.adjustBrainLoss(2)
..()
return
datum/reagent/sulfur
name = "Sulfur"
id = "sulfur"
description = "A chemical element."
reagent_state = SOLID
color = "#BF8C00" // rgb: 191, 140, 0
datum/reagent/carbon
name = "Carbon"
id = "carbon"
description = "A chemical element."
reagent_state = SOLID
color = "#1C1300" // rgb: 30, 20, 0
datum/reagent/carbon/reaction_turf(var/turf/T, var/volume)
src = null
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/dirt(T)
datum/reagent/chlorine
name = "Chlorine"
id = "chlorine"
description = "A chemical element."
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
datum/reagent/chlorine/on_mob_life(var/mob/living/M as mob)
M.take_organ_damage(1*REM, 0)
..()
return
datum/reagent/fluorine
name = "Fluorine"
id = "fluorine"
description = "A highly-reactive chemical element."
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
datum/reagent/fluorine/on_mob_life(var/mob/living/M as mob)
M.adjustToxLoss(1*REM)
..()
return
datum/reagent/sodium
name = "Sodium"
id = "sodium"
description = "A chemical element."
reagent_state = SOLID
color = "#808080" // rgb: 128, 128, 128
datum/reagent/phosphorus
name = "Phosphorus"
id = "phosphorus"
description = "A chemical element."
reagent_state = SOLID
color = "#832828" // rgb: 131, 40, 40
datum/reagent/lithium
name = "Lithium"
id = "lithium"
description = "A chemical element."
reagent_state = SOLID
color = "#808080" // rgb: 128, 128, 128
datum/reagent/lithium/on_mob_life(var/mob/living/M as mob)
if(M.canmove && istype(M.loc, /turf/space))
step(M, pick(cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
..()
return
datum/reagent/glycerol
name = "Glycerol"
id = "glycerol"
description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity."
color = "#808080" // rgb: 128, 128, 128
datum/reagent/nitroglycerin
name = "Nitroglycerin"
id = "nitroglycerin"
description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol."
color = "#808080" // rgb: 128, 128, 128
datum/reagent/radium
name = "Radium"
id = "radium"
description = "Radium is an alkaline earth metal. It is extremely radioactive."
reagent_state = SOLID
color = "#C7C7C7" // rgb: 199,199,199
datum/reagent/radium/on_mob_life(var/mob/living/M as mob)
M.apply_effect(2*REM/M.metabolism_efficiency,IRRADIATE,0)
..()
return
datum/reagent/radium/reaction_turf(var/turf/T, var/volume)
src = null
if(volume >= 3)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
reagentdecal.reagents.add_reagent("uranium", volume)
datum/reagent/thermite
name = "Thermite"
id = "thermite"
description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls."
reagent_state = SOLID
color = "#673910" // rgb: 103, 57, 16
datum/reagent/thermite/reaction_turf(var/turf/T, var/volume)
src = null
if(volume >= 1 && istype(T, /turf/simulated/wall))
var/turf/simulated/wall/Wall = T
if(istype(Wall, /turf/simulated/wall/r_wall))
Wall.thermite = Wall.thermite+(volume*2.5)
else
Wall.thermite = Wall.thermite+(volume*10)
Wall.overlays = list()
Wall.overlays += image('icons/effects/effects.dmi',"thermite")
return
datum/reagent/thermite/on_mob_life(var/mob/living/M as mob)
M.adjustFireLoss(1)
..()
return
datum/reagent/sterilizine
name = "Sterilizine"
id = "sterilizine"
description = "Sterilizes wounds in preparation for surgery."
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/iron
name = "Iron"
id = "iron"
description = "Pure iron is a metal."
reagent_state = SOLID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/gold
name = "Gold"
id = "gold"
description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known."
reagent_state = SOLID
color = "#F7C430" // rgb: 247, 196, 48
datum/reagent/silver
name = "Silver"
id = "silver"
description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal."
reagent_state = SOLID
color = "#D0D0D0" // rgb: 208, 208, 208
datum/reagent/uranium
name ="Uranium"
id = "uranium"
description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive."
reagent_state = SOLID
color = "#B8B8C0" // rgb: 184, 184, 192
datum/reagent/uranium/on_mob_life(var/mob/living/M as mob)
M.apply_effect(1/M.metabolism_efficiency,IRRADIATE,0)
..()
return
datum/reagent/uranium/reaction_turf(var/turf/T, var/volume)
src = null
if(volume >= 3)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
reagentdecal.reagents.add_reagent("uranium", volume)
datum/reagent/aluminium
name = "Aluminium"
id = "aluminium"
description = "A silvery white and ductile member of the boron group of chemical elements."
reagent_state = SOLID
color = "#A8A8A8" // rgb: 168, 168, 168
datum/reagent/silicon
name = "Silicon"
id = "silicon"
description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon."
reagent_state = SOLID
color = "#A8A8A8" // rgb: 168, 168, 168
datum/reagent/fuel
name = "Welding fuel"
id = "fuel"
description = "Required for welders. Flamable."
color = "#660000" // rgb: 102, 0, 0
datum/reagent/fuel/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite!
if(!istype(M, /mob/living))
return
if(method == TOUCH)
M.adjust_fire_stacks(volume / 10)
return
datum/reagent/fuel/on_mob_life(var/mob/living/M as mob)
M.adjustToxLoss(1)
..()
return
datum/reagent/space_cleaner
name = "Space cleaner"
id = "cleaner"
description = "A compound used to clean things. Now with 50% more sodium hypochlorite!"
color = "#A5F0EE" // rgb: 165, 240, 238
datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume)
if(istype(O,/obj/effect/decal/cleanable))
qdel(O)
else
if(O)
O.clean_blood()
datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume)
if(volume >= 1)
T.clean_blood()
for(var/obj/effect/decal/cleanable/C in T)
qdel(C)
for(var/mob/living/simple_animal/slime/M in T)
M.adjustToxLoss(rand(5,10))
if(istype(T, /turf/simulated/floor))
var/turf/simulated/floor/F = T
if(volume >= 1)
F.dirt = 0
datum/reagent/space_cleaner/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(iscarbon(M))
var/mob/living/carbon/C = M
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.lip_style)
H.lip_style = null
H.update_body()
if(C.r_hand)
C.r_hand.clean_blood()
if(C.l_hand)
C.l_hand.clean_blood()
if(C.wear_mask)
if(C.wear_mask.clean_blood())
C.update_inv_wear_mask(0)
if(ishuman(M))
var/mob/living/carbon/human/H = C
if(H.head)
if(H.head.clean_blood())
H.update_inv_head(0)
if(H.wear_suit)
if(H.wear_suit.clean_blood())
H.update_inv_wear_suit(0)
else if(H.w_uniform)
if(H.w_uniform.clean_blood())
H.update_inv_w_uniform(0)
if(H.shoes)
if(H.shoes.clean_blood())
H.update_inv_shoes(0)
M.clean_blood()
datum/reagent/cryptobiolin
name = "Cryptobiolin"
id = "cryptobiolin"
description = "Cryptobiolin causes confusion and dizzyness."
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 1.5 * REAGENTS_METABOLISM
datum/reagent/cryptobiolin/on_mob_life(var/mob/living/M as mob)
M.Dizzy(1)
if(!M.confused)
M.confused = 1
M.confused = max(M.confused, 20)
..()
return
datum/reagent/impedrezene
name = "Impedrezene"
id = "impedrezene"
description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions."
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/impedrezene/on_mob_life(var/mob/living/M as mob)
M.jitteriness = max(M.jitteriness-5,0)
if(prob(80)) M.adjustBrainLoss(1*REM)
if(prob(50)) M.drowsyness = max(M.drowsyness, 3)
if(prob(10)) M.emote("drool")
..()
return
datum/reagent/nanites
name = "Nanomachines"
id = "nanomachines"
description = "Microscopic construction robots."
color = "#535E66" // rgb: 83, 94, 102
datum/reagent/nanites/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
src = null
if( (prob(10) && method==TOUCH) || method==INGEST)
M.ForceContractDisease(new /datum/disease/transformation/robot(0))
datum/reagent/xenomicrobes
name = "Xenomicrobes"
id = "xenomicrobes"
description = "Microbes with an entirely alien cellular structure."
color = "#535E66" // rgb: 83, 94, 102
datum/reagent/xenomicrobes/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
src = null
if( (prob(10) && method==TOUCH) || method==INGEST)
M.ContractDisease(new /datum/disease/transformation/xeno(0))
datum/reagent/fluorosurfactant//foam precursor
name = "Fluorosurfactant"
id = "fluorosurfactant"
description = "A perfluoronated sulfonic acid that forms a foam when mixed with water."
color = "#9E6B38" // rgb: 158, 107, 56
datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually.
name = "Foaming agent"
id = "foaming_agent"
description = "A agent that yields metallic foam when mixed with light metal and a strong acid."
reagent_state = SOLID
color = "#664B63" // rgb: 102, 75, 99
datum/reagent/ammonia
name = "Ammonia"
id = "ammonia"
description = "A caustic substance commonly used in fertilizer or household cleaners."
reagent_state = GAS
color = "#404030" // rgb: 64, 64, 48
datum/reagent/diethylamine
name = "Diethylamine"
id = "diethylamine"
description = "A secondary amine, mildly corrosive."
color = "#604030" // rgb: 96, 64, 48
/////////////////////////Coloured Crayon Powder////////////////////////////
//For colouring in /proc/mix_color_from_reagents
datum/reagent/crayonpowder
name = "Crayon Powder"
id = "crayon powder"
var/colorname = "none"
description = "A powder made by grinding down crayons, good for colouring chemical reagents."
reagent_state = SOLID
color = "#FFFFFF" // rgb: 207, 54, 0
datum/reagent/crayonpowder/New()
description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents."
datum/reagent/crayonpowder/red
name = "Red Crayon Powder"
id = "redcrayonpowder"
colorname = "red"
datum/reagent/crayonpowder/orange
name = "Orange Crayon Powder"
id = "orangecrayonpowder"
colorname = "orange"
color = "#FF9300" // orange
datum/reagent/crayonpowder/yellow
name = "Yellow Crayon Powder"
id = "yellowcrayonpowder"
colorname = "yellow"
color = "#FFF200" // yellow
datum/reagent/crayonpowder/green
name = "Green Crayon Powder"
id = "greencrayonpowder"
colorname = "green"
color = "#A8E61D" // green
datum/reagent/crayonpowder/blue
name = "Blue Crayon Powder"
id = "bluecrayonpowder"
colorname = "blue"
color = "#00B7EF" // blue
datum/reagent/crayonpowder/purple
name = "Purple Crayon Powder"
id = "purplecrayonpowder"
colorname = "purple"
color = "#DA00FF" // purple
datum/reagent/crayonpowder/invisible
name = "Invisible Crayon Powder"
id = "invisiblecrayonpowder"
colorname = "invisible"
color = "#FFFFFF00" // white + no alpha
//////////////////////////////////Hydroponics stuff///////////////////////////////
datum/reagent/plantnutriment
name = "Generic nutriment"
id = "plantnutriment"
description = "Some kind of nutriment. You can't really tell what it is. You should probably report it, along with how you obtained it."
color = "#000000" // RBG: 0, 0, 0
var/tox_prob = 0
datum/reagent/plantnutriment/on_mob_life(var/mob/living/M as mob)
if(prob(tox_prob))
M.adjustToxLoss(1*REM)
..()
return
datum/reagent/plantnutriment/eznutriment
name = "E-Z-Nutrient"
id = "eznutriment"
description = "Cheap and extremely common type of plant nutriment."
color = "#376400" // RBG: 50, 100, 0
tox_prob = 10
datum/reagent/plantnutriment/left4zednutriment
name = "Left 4 Zed"
id = "left4zednutriment"
description = "Unstable nutriment that makes plants mutate more often than usual."
color = "#1A1E4D" // RBG: 26, 30, 77
tox_prob = 25
datum/reagent/plantnutriment/robustharvestnutriment
name = "Robust Harvest"
id = "robustharvestnutriment"
description = "Very potent nutriment that prevents plants from mutating."
color = "#9D9D00" // RBG: 157, 157, 0
tox_prob = 15
// Undefine the alias for REAGENTS_EFFECT_MULTIPLER
#undef REM
@@ -151,7 +151,7 @@
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/soup,
/obj/item/weapon/reagent_containers/food/snacks/grown,
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
)
blocked |= typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable)
@@ -185,8 +185,9 @@
/datum/chemical_reaction/slimebork2/on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
var/list/blocked = list(/obj/item/weapon/reagent_containers/food/drinks)
var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/drinks) - /obj/item/weapon/reagent_containers/food/drinks
var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/drinks) - blocked
// BORK BORK BORK
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-61
View File
@@ -1,61 +0,0 @@
/obj/item/weapon/gun/grenadelauncher
name = "grenade launcher"
desc = "a terrible, terrible thing. it's really awful!"
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "riotgun"
item_state = "riotgun"
w_class = 4.0
throw_speed = 2
throw_range = 7
force = 5.0
var/list/grenades = new/list()
var/max_grenades = 3
m_amt = 2000
/obj/item/weapon/gun/grenadelauncher/examine(mob/user)
..()
user << "[grenades] / [max_grenades] grenades loaded."
/obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params)
if((istype(I, /obj/item/weapon/grenade)))
if(grenades.len < max_grenades)
user.drop_item()
I.loc = src
grenades += I
user << "<span class='notice'>You put the grenade in the grenade launcher.</span>"
user << "<span class='notice'>[grenades.len] / [max_grenades] Grenades.</span>"
else
usr << "<span class='warning'>The grenade launcher cannot hold more grenades!</span>"
/obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag)
if (istype(target, /obj/item/weapon/storage/backpack ))
return
else if (locate (/obj/structure/table, src.loc))
return
else if(target == user)
return
if(grenades.len)
spawn(0) fire_grenade(target,user)
else
usr << "<span class='warning'>The grenade launcher is empty!</span>"
/obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user)
for(var/mob/O in viewers(world.view, user))
O.show_message(text("<span class='danger'>[] fired a grenade!</span>", user), 1)
user << "<span class='danger'>You fire the grenade launcher!</span>"
var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta!
grenades -= F
F.loc = user.loc
F.throw_at(target, 30, 2)
message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
F.active = 1
F.icon_state = initial(icon_state) + "_active"
playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
spawn(15)
F.prime()
-77
View File
@@ -1,77 +0,0 @@
/obj/item/weapon/gun/syringe
name = "syringe gun"
desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance."
icon_state = "syringegun"
item_state = "syringegun"
w_class = 3
throw_speed = 3
throw_range = 7
force = 4
m_amt = 2000
clumsy_check = 0
fire_sound = 'sound/items/syringeproj.ogg'
var/list/syringes = list()
var/max_syringes = 1
/obj/item/weapon/gun/syringe/New()
..()
chambered = new /obj/item/ammo_casing/syringegun(src)
/obj/item/weapon/gun/syringe/proc/newshot()
if(!syringes.len) return
var/obj/item/weapon/reagent_containers/syringe/S = syringes[1]
if(!S) return
chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src)
S.reagents.trans_to(chambered.BB, S.reagents.total_volume)
chambered.BB.name = S.name
syringes.Remove(S)
qdel(S)
return
/obj/item/weapon/gun/syringe/process_chamber()
return
/obj/item/weapon/gun/syringe/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params)
newshot()
..()
/obj/item/weapon/gun/syringe/examine(mob/user)
..()
user << "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining."
/obj/item/weapon/gun/syringe/attack_self(mob/living/user as mob)
if(!syringes.len)
user << "<span class='notice'>[src] is empty.</span>"
return 0
var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len]
if(!S) return 0
S.loc = user.loc
syringes.Remove(S)
user << "<span class ='notice'>You unload [S] from \the [src].</span>"
return 1
/obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, params, var/show_msg = 1)
if(istype(A, /obj/item/weapon/reagent_containers/syringe))
if(syringes.len < max_syringes)
user.drop_item()
user << "<span class='notice'>You load [A] into \the [src].</span>"
syringes.Add(A)
A.loc = src
return 1
else
usr << "<span class='warning'>[src] cannot hold more syringes!</span>"
return 0
/obj/item/weapon/gun/syringe/rapidsyringe
name = "rapid syringe gun"
desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes."
icon_state = "rapidsyringegun"
max_syringes = 6
@@ -191,7 +191,7 @@
id = "kitchen_knife"
build_type = AUTOLATHE
materials = list("$metal" = 12000)
build_path = /obj/item/weapon/kitchenknife
build_path = /obj/item/weapon/kitchen/knife
category = list("initial","Misc")
/datum/design/scalpel
@@ -608,7 +608,7 @@
/////////////////////////////////////////
/datum/design/borg_upgrade_reset
name = "Cyborg Upgrade (Reset Module)"
name = "Cyborg Upgrade (Module Reset Board)"
id = "borg_upgrade_reset"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/reset
@@ -617,7 +617,7 @@
category = list("Cyborg Upgrade Modules")
/datum/design/borg_upgrade_rename
name = "Cyborg Upgrade (Rename Module)"
name = "Cyborg Upgrade (Rename Board)"
id = "borg_upgrade_rename"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/rename
@@ -626,7 +626,7 @@
category = list("Cyborg Upgrade Modules")
/datum/design/borg_upgrade_restart
name = "Cyborg Upgrade (Restart Module)"
name = "Cyborg Upgrade (Emergency Reboot Board)"
id = "borg_upgrade_restart"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/restart
+2 -2
View File
@@ -1,7 +1,7 @@
//make incision
/datum/surgery_step/incise
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchenknife = 65, /obj/item/weapon/shard = 45)
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 65, /obj/item/weapon/shard = 45)
time = 24
/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -58,7 +58,7 @@
//saw bone
/datum/surgery_step/saw
implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchenknife/butcher = 25)
implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
time = 64
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+1 -1
View File
@@ -9,7 +9,7 @@
//cut fat
/datum/surgery_step/cut_fat
implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchenknife/butcher = 25)
implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
time = 64
/datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+1 -1
View File
@@ -6,7 +6,7 @@
//reshape_face
/datum/surgery_step/reshape_face
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchenknife = 50, /obj/item/weapon/wirecutters = 35)
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 50, /obj/item/weapon/wirecutters = 35)
time = 64
/datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)