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

Conflicts:
	_maps/map_files/TgStation/tgstation.2.1.3.dmm
This commit is contained in:
Sawu
2015-01-14 18:35:29 +11:00
234 changed files with 11908 additions and 12071 deletions
+3 -1
View File
@@ -490,6 +490,7 @@ var/list/admin_verbs_hideable = list(
message_admins("[src] deadmined themself.")
deadmin()
verbs += /client/proc/readmin
deadmins += ckey
src << "<span class='interface'>You are now a normal player.</span>"
feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -553,10 +554,11 @@ var/list/admin_verbs_hideable = list(
D.associate(C)
message_admins("[src] re-adminned themselves.")
log_admin("[src] re-adminned themselves.")
deadmins -= ckey
feedback_add_details("admin_verb","RAS")
verbs -= /client/proc/readmin
return
else
src << "You are already an admin."
verbs -= /client/proc/readmin
deadmins -= ckey
return
+1
View File
@@ -31,6 +31,7 @@ var/list/admin_datums = list()
owner = C
owner.holder = src
owner.add_admin_verbs() //TODO
owner.verbs -= /client/proc/readmin
admins |= C
/datum/admins/proc/disassociate()
+27
View File
@@ -503,6 +503,27 @@
counter = 0
jobs += "</tr></table>"
//Supply (Brown)
counter = 0
jobs += "<table cellpadding='1' cellspacing='0' width='100%'>"
jobs += "<tr bgcolor='663300'><th colspan='[length(supply_positions)]'><a href='?src=\ref[src];jobban3=supplydept;jobban4=\ref[M]'>Supply Positions</a></th></tr><tr align='center'>"
for(var/jobPos in supply_positions)
if(!jobPos) continue
var/datum/job/job = SSjob.GetJob(jobPos)
if(!job) continue
if(jobban_isbanned(M, job.title))
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=[job.title];jobban4=\ref[M]'><font color=red>[replacetext(job.title, " ", "&nbsp")]</font></a></td>"
counter++
else
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=[job.title];jobban4=\ref[M]'>[replacetext(job.title, " ", "&nbsp")]</a></td>"
counter++
if(counter >= 5) //So things dont get COPYPASTE!
jobs += "</tr><tr align='center'>"
counter = 0
jobs += "</tr></table>"
//Civilian (Grey)
counter = 0
jobs += "<table cellpadding='1' cellspacing='0' width='100%'>"
@@ -672,6 +693,12 @@
var/datum/job/temp = SSjob.GetJob(jobPos)
if(!temp) continue
joblist += temp.title
if("supplydept")
for(var/jobPos in supply_positions)
if(!jobPos) continue
var/datum/job/temp = SSjob.GetJob(jobPos)
if(!temp) continue
joblist += temp.title
if("civiliandept")
for(var/jobPos in civilian_positions)
if(!jobPos) continue
+1 -1
View File
@@ -796,7 +796,7 @@ var/global/list/g_fancy_list_of_types = null
qdel(briefcase_item)
for(var/i=3, i>0, i--)
sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000
sec_briefcase.contents += new /obj/item/weapon/gun/energy/crossbow
sec_briefcase.contents += new /obj/item/weapon/gun/projectile/automatic/crossbow
sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba
sec_briefcase.contents += new /obj/item/ammo_box/a357
sec_briefcase.contents += new /obj/item/weapon/c4
+1 -1
View File
@@ -684,7 +684,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "confliction")
var/choice = input("The shuttle will just return if you call it. Call anyway?") in list("Confirm", "Cancel")
if(choice == "Confirm")
SSshuttle.emergencyFakeRecall = rand(0.5,0.9)
SSshuttle.emergencyFakeRecall = rand(5,9) * 0.1
else
return
+10
View File
@@ -85,6 +85,7 @@ BLIND // can't see anything
put_on_delay = 40
var/mask_adjusted = 0
var/ignore_maskadjust = 1
var/adjusted_flags = null
//Override this to modify speech like luchador masks.
/obj/item/clothing/mask/proc/speechModification(message)
@@ -103,6 +104,7 @@ BLIND // can't see anything
flags_inv |= visor_flags_inv
user << "You push \the [src] back into place."
src.mask_adjusted = 0
slot_flags = initial(slot_flags)
else
src.icon_state += "_up"
user << "You push \the [src] out of the way."
@@ -111,6 +113,8 @@ BLIND // can't see anything
flags &= ~visor_flags
flags_inv &= ~visor_flags_inv
src.mask_adjusted = 1
if(adjusted_flags)
slot_flags = adjusted_flags
usr.update_inv_wear_mask()
@@ -292,6 +296,12 @@ atom/proc/generate_female_clothing(index,t_color,icon)
usr << "Your suit will now only report your exact vital lifesigns."
if(3)
usr << "Your suit will now report your exact vital lifesigns as well as your coordinate position."
if(istype(loc,/mob/living/carbon/human))
var/mob/living/carbon/human/H = loc
if(H.w_uniform == src)
H.update_suit_sensors()
..()
/obj/item/clothing/under/verb/rolldown()
-7
View File
@@ -63,13 +63,6 @@
item_state = "that"
flags_inv = 0
/obj/item/clothing/head/greenbandana
name = "green bandana"
desc = "It's a green bandana with some fine nanotech lining."
icon_state = "greenbandana"
item_state = "greenbandana"
flags_inv = 0
/obj/item/clothing/head/cardborg
name = "cardborg helmet"
desc = "A helmet made out of a box."
@@ -64,3 +64,49 @@
if(voicechange)
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
return message
/obj/item/clothing/mask/bandana
name = "botany bandana"
desc = "A fine bandana with nanotech lining and a hydroponics pattern."
w_class = 1
flags = MASKCOVERSMOUTH
flags_inv = HIDEFACE
visor_flags = MASKCOVERSMOUTH
visor_flags_inv = HIDEFACE
slot_flags = SLOT_MASK
ignore_maskadjust = 0
adjusted_flags = SLOT_HEAD
icon_state = "bandbotany"
/obj/item/clothing/mask/bandana/attack_self(var/mob/user)
adjustmask(user)
/obj/item/clothing/mask/bandana/red
name = "red bandana"
desc = "A fine red bandana with nanotech lining."
icon_state = "bandred"
/obj/item/clothing/mask/bandana/blue
name = "blue bandana"
desc = "A fine blue bandana with nanotech lining."
icon_state = "bandblue"
/obj/item/clothing/mask/bandana/green
name = "green bandana"
desc = "A fine green bandana with nanotech lining."
icon_state = "bandgreen"
/obj/item/clothing/mask/bandana/gold
name = "gold bandana"
desc = "A fine gold bandana with nanotech lining."
icon_state = "bandgold"
/obj/item/clothing/mask/bandana/black
name = "black bandana"
desc = "A fine black bandana with nanotech lining."
icon_state = "bandblack"
/obj/item/clothing/mask/bandana/skull
name = "skull bandana"
desc = "A fine black bandana with nanotech lining and a skull emblem."
icon_state = "bandskull"
-6
View File
@@ -98,12 +98,6 @@
item_state = "g_suit"
item_color = "lightgreen"
/obj/item/clothing/under/color/lightblue
name = "lightblue jumpsuit"
icon_state = "lightblue"
item_state = "b_suit"
item_color = "lightblue"
/obj/item/clothing/under/color/lightbrown
name = "lightbrown jumpsuit"
icon_state = "lightbrown"
+1 -1
View File
@@ -51,7 +51,7 @@
if(!vendingMachines.len) //if every machine is infected
for(var/obj/machinery/vending/upriser in infectedMachines)
if(prob(70))
if(prob(70) && !upriser.gc_destroyed)
var/mob/living/simple_animal/hostile/mimic/copy/M = new(upriser.loc, upriser, null, 1) // it will delete upriser on creation and override any machine checks
M.faction = list("profit")
M.speak = rampant_speeches.Copy()
+12 -12
View File
@@ -8,12 +8,12 @@
var/list/turfs = list() //list of all the empty floor turfs in the hallway areas
for(var/area/hallway/A in world)
for(var/turf/simulated/floor/F in A)
if(!F.contents.len)
for(var/turf/simulated/F in A)
if(!F.density && !F.contents.len)
turfs += F
if(turfs.len) //Pick a turf to spawn at if we can
var/turf/simulated/floor/T = pick(turfs)
var/turf/simulated/T = pick(turfs)
spawn(0) new/obj/effect/spacevine_controller(T) //spawn a controller at turf
@@ -128,7 +128,7 @@
hue = "#ffff88"
/datum/spacevine_mutation/oxy_eater/process_mutation(obj/effect/spacevine/holder)
var/turf/simulated/floor/T = holder.loc
var/turf/simulated/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.oxygen = max(0, GM.oxygen - severity * holder.energy)
@@ -138,7 +138,7 @@
hue = "#8888ff"
/datum/spacevine_mutation/nitro_eater/process_mutation(obj/effect/spacevine/holder)
var/turf/simulated/floor/T = holder.loc
var/turf/simulated/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.nitrogen = max(0, GM.nitrogen - severity * holder.energy)
@@ -148,7 +148,7 @@
hue = "#00ffff"
/datum/spacevine_mutation/carbondioxide_eater/process_mutation(obj/effect/spacevine/holder)
var/turf/simulated/floor/T = holder.loc
var/turf/simulated/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.carbon_dioxide = max(0, GM.carbon_dioxide - severity * holder.energy)
@@ -158,7 +158,7 @@
hue = "#ffbbff"
/datum/spacevine_mutation/plasma_eater/process_mutation(obj/effect/spacevine/holder)
var/turf/simulated/floor/T = holder.loc
var/turf/simulated/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
GM.toxins = max(0, GM.toxins - severity * holder.energy)
@@ -350,10 +350,10 @@
//meaning if you get the spacevines' size to something less than 20 plots, it won't grow anymore.
/obj/effect/spacevine_controller/New(loc, list/muts, mttv)
if(!istype(src.loc,/turf/simulated/floor))
if(!istype(loc, /turf/simulated) || loc:density)
qdel(src)
spawn_spacevine_piece(src.loc, , muts)
spawn_spacevine_piece(loc, , muts)
SSobj.processing.Add(src)
init_subtypes(/datum/spacevine_mutation/, mutations_list)
if(mttv != null)
@@ -464,8 +464,8 @@
var/step = get_step(src,direction)
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_spread(src, step)
if(istype(step,/turf/simulated/floor))
var/turf/simulated/floor/F = step
if(istype(step,/turf/simulated) && !step:density)
var/turf/simulated/F = step
if(!locate(/obj/effect/spacevine,F))
if(F.Enter(src))
if(master)
@@ -478,7 +478,7 @@
if (prob(50)) Vspread = locate(src.x + rand(-1,1),src.y,src.z)
else Vspread = locate(src.x,src.y + rand(-1, 1),src.z)
var/dogrowth = 1
if (!istype(Vspread, /turf/simulated/floor)) dogrowth = 0
if (!istype(Vspread, /turf/simulated)) dogrowth = 0
for(var/obj/O in Vspread)
if (istype(O, /obj/structure/window) || istype(O, /obj/effect/forcefield) || istype(O, /obj/effect/blob) || istype(O, /obj/effect/alien/weeds) || istype(O, /obj/effect/spacevine)) dogrowth = 0
if (istype(O, /obj/machinery/door/))
+1 -1
View File
@@ -342,7 +342,7 @@ mob/living/carbon/proc/handle_hallucinations()
return
var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_box/a357,\
/obj/item/weapon/gun/energy/crossbow, /obj/item/weapon/melee/energy/sword/saber,\
/obj/item/weapon/gun/projectile/automatic/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,\
@@ -128,8 +128,7 @@
/obj/item/weapon/reagent_containers/food/snacks/badrecipe/New()
..()
eatverb = pick("choke down","nibble","gnaw","chomp")
reagents.add_reagent("toxin", 1)
reagents.add_reagent("carbon", 3)
reagents.add_reagent("????", 30)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff
@@ -254,4 +253,4 @@
..()
reagents.add_reagent("nutriment", 4)
reagents.add_reagent("sugar", 2)
reagents.add_reagent("coco", 2)
reagents.add_reagent("coco", 2)
@@ -228,13 +228,13 @@
if(open )
return
var/t = input("Enter what you want to add to the tag:", "Write", null, null) as text
var/t = stripped_input(user, "Enter what you want to add to the tag:", "Write", "", 30)
var/obj/item/pizzabox/boxtotagto = src
if(boxes.len > 0)
boxtotagto = boxes[boxes.len]
boxtotagto.boxtag = copytext("[boxtotagto.boxtag][t]", 1, 30)
boxtotagto.boxtag = "[boxtotagto.boxtag][t]"
update_icon()
return
+1 -12
View File
@@ -471,13 +471,6 @@
force = 10
throwforce = 10
var/cooldown = 0
var/list/can_be_placed_into = list(
/obj/structure/table,
/obj/structure/closet,
/obj/item/weapon/storage,
/obj/structure/safe,
/obj/machinery/disposal
)
/obj/item/weapon/resonator/proc/CreateResonance(var/target, var/creator)
if(cooldown <= 0)
@@ -493,12 +486,8 @@
..()
/obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag)
if(target in user.contents)
return
if(proximity_flag)
for(var/type in can_be_placed_into)
if(istype(target, type))
return
if(!check_allowed_items(target, 1)) return
CreateResonance(target, user)
/obj/effect/resonance
+1 -11
View File
@@ -115,8 +115,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/Stat()
..()
statpanel("Status")
if (client.statpanel == "Status")
if(statpanel("Status"))
stat(null, "Station Time: [worldtime2text()]")
if(ticker)
if(ticker.mode)
@@ -126,15 +125,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
//world << "DEBUG: malf mode ticker test"
if(malf.malf_mode_declared && (malf.apcs > 0))
stat(null, "Time left: [max(malf.AI_win_timeleft/malf.apcs, 0)]")
var/ETA
switch(SSshuttle.emergency.mode)
if(SHUTTLE_CALL)
ETA = "ETA"
if(SHUTTLE_DOCKED)
ETA = "ETD"
if(ETA)
var/timeleft = SSshuttle.emergency.timeLeft()
stat(null, "[ETA]-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
/mob/dead/observer/verb/reenter_corpse()
set category = "Ghost"
+3
View File
@@ -17,5 +17,8 @@
. = src.say_dead(message)
/mob/dead/observer/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
if(radio_freq)
var/atom/movable/virtualspeaker/V = speaker
speaker = V.source
src << "<a href=?src=\ref[src];follow=\ref[speaker]>(F)</a> [message]"
+3 -15
View File
@@ -150,25 +150,13 @@
return 1 // Aliens can eat, and they can be fed food/drink
/mob/living/carbon/alien/Stat()
statpanel("Status")
stat(null, "Intent: [a_intent]")
stat(null, "Move Mode: [m_intent]")
..()
if (client.statpanel == "Status")
if(statpanel("Status"))
stat(null, "Intent: [a_intent]")
stat(null, "Move Mode: [m_intent]")
stat(null, "Plasma Stored: [getPlasma()]/[max_plasma]")
var/ETA
switch(SSshuttle.emergency.mode)
if(SHUTTLE_CALL)
ETA = "ETA"
if(SHUTTLE_DOCKED)
ETA = "ETD"
if(ETA)
var/timeleft = SSshuttle.emergency.timeLeft()
stat(null, "[ETA]-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
/mob/living/carbon/alien/Stun(amount)
if(status_flags & CANSTUN)
stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun
@@ -46,15 +46,13 @@
f_loss += 60
ear_damage += 30
ear_deaf += 120
adjustEarDamage(30, 120)
if(3.0)
b_loss += 30
if (prob(50) && !shielded)
Paralyse(1)
ear_damage += 15
ear_deaf += 60
adjustEarDamage(15 , 60)
adjustBruteLoss(b_loss)
adjustFireLoss(f_loss)
@@ -132,11 +132,11 @@
//Ears
if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
ear_deaf = max(ear_deaf, 1)
else if(ear_deaf) //deafness, heals slowly over time
ear_deaf = max(ear_deaf-1, 0)
else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs
ear_damage = max(ear_damage-0.05, 0)
setEarDamage(-1, max(ear_deaf, 1))
else
adjustEarDamage(-1, (ear_damage < 25 ? -0.05 : 0))
//deafness, heals slowly over time
//ear damage heals slowly under this threshold. otherwise you'll need earmuffs
//Other
if(stunned)
@@ -26,7 +26,8 @@
//This needs to be fixed
/mob/living/carbon/alien/larva/Stat()
..()
stat(null, "Progress: [amount_grown]/[max_grown]")
if(statpanel("Status"))
stat(null, "Progress: [amount_grown]/[max_grown]")
/mob/living/carbon/alien/larva/adjustToxLoss(amount)
if(stat != DEAD)
@@ -50,15 +51,13 @@
f_loss += 60
ear_damage += 30
ear_deaf += 120
adjustEarDamage(30,120)
if(3.0)
b_loss += 30
if (prob(50))
Paralyse(1)
ear_damage += 15
ear_deaf += 60
adjustEarDamage(15,60)
adjustBruteLoss(b_loss)
adjustFireLoss(f_loss)
@@ -109,12 +109,12 @@
eye_blurry = max(eye_blurry-1, 0)
//Ears
if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
ear_deaf = max(ear_deaf, 1)
else if(ear_deaf) //deafness, heals slowly over time
ear_deaf = max(ear_deaf-1, 0)
else if(ear_damage < 25) //ear damage heals slowly under this threshold.
ear_damage = max(ear_damage-0.05, 0)
if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
setEarDamage(-1, max(ear_deaf, 1))
else
adjustEarDamage(-1, (ear_damage < 25 ? -0.05 : 0))
//deafness, heals slowly over time
//ear damage heals slowly under this threshold. otherwise you'll need earmuffs
//Other
if(stunned)
+12 -3
View File
@@ -2,7 +2,7 @@
/obj/item/device/mmi
name = "Man-Machine Interface"
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity."
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity, that nevertheless has become standard-issue on Nanotrasen stations."
icon = 'icons/obj/assemblies.dmi'
icon_state = "mmi_empty"
w_class = 3
@@ -105,7 +105,7 @@
/obj/item/device/mmi/radio_enabled
name = "Radio-enabled Man-Machine Interface"
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity. This one comes with a built-in radio."
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity, that nevertheless has become standard-issue on Nanotrasen stations. This one comes with a built-in radio."
origin_tech = "biotech=4"
var/obj/item/device/radio/radio = null //Let's give it a radio.
@@ -139,4 +139,13 @@
brainmob.emp_damage += rand(10,20)
if(3)
brainmob.emp_damage += rand(0,10)
..()
..()
/obj/item/device/mmi/Destroy()
if(isrobot(loc))
var/mob/living/silicon/robot/borg = loc
borg.mmi = null
if(brainmob)
qdel(brainmob)
brainmob = null
..()
@@ -25,3 +25,6 @@
/mob/living/carbon/brain/toggle_throw_mode()
return
/mob/living/carbon/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up.
return
@@ -98,4 +98,10 @@
name = "alien brain"
desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?"
icon_state = "brain-alien"
origin_tech = "biotech=7"
origin_tech = "biotech=7"
/obj/item/organ/brain/Destroy() //copypasted from MMIs.
if(brainmob)
qdel(brainmob)
brainmob = null
..()
+4 -4
View File
@@ -144,7 +144,7 @@
emp_damage = 30//Let's not overdo it
if(21 to 30)//High level of EMP damage, unable to see, hear, or speak
eye_blind = max(eye_blind, 1)
ear_deaf = 1
setEarDamage(-1,1)
silent = 1
if(!alert)//Sounds an alarm, but only once per 'level'
emote("alarm")
@@ -155,12 +155,12 @@
if(20)
alert = 0
eye_blind = 0
ear_deaf = 0
setEarDamage(-1,0)
silent = 0
emp_damage -= 1
if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage
eye_blurry = 1
ear_damage = 1
setEarDamage(1,-1)
if(!alert)
emote("alert")
src << "<span class='danger'>Primary systems are now online.</span>"
@@ -170,7 +170,7 @@
if(10)
alert = 0
eye_blurry = 0
ear_damage = 0
setEarDamage(0,-1)
emp_damage -= 1
if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere)
if(!alert)
+1 -6
View File
@@ -1,8 +1,3 @@
/mob/living/carbon/UnarmedAttack(var/atom/A, var/proximity_flag)
..()
for(var/datum/mutation/human/HM in dna.mutations)
. += HM.on_attack_hand(A, src)
/mob/living/carbon/prepare_huds()
..()
prepare_data_huds()
@@ -87,7 +82,7 @@
//src.adjustFireLoss(shock_damage) //burn_skin will do this for us
//src.updatehealth()
src.visible_message(
"<span class='danger'>[src] was shocked by the [source]!</span>", \
"<span class='danger'>[src] was shocked by \the [source]!</span>", \
"<span class='userdanger'>You feel a powerful shock coursing through your body!</span>", \
"<span class='danger'>You hear a heavy electrical crack.</span>" \
)
+5 -19
View File
@@ -27,7 +27,6 @@
internal_organs += new /obj/item/organ/brain
// for spawned humans; overwritten by other code
create_dna(src)
ready_dna(src)
randomize_human(src)
@@ -52,8 +51,8 @@
/mob/living/carbon/human/Stat()
..()
statpanel("Status")
if (client.statpanel == "Status")
if(statpanel("Status"))
stat(null, "Intent: [a_intent]")
stat(null, "Move Mode: [m_intent]")
if(ticker && ticker.mode && ticker.mode.name == "AI malfunction")
@@ -61,17 +60,6 @@
if(malf.malf_mode_declared && (malf.apcs > 0))
stat(null, "Time left: [max(malf.AI_win_timeleft/malf.apcs, 0)]")
var/ETA
switch(SSshuttle.emergency.mode)
if(SHUTTLE_CALL)
ETA = "ETA"
if(SHUTTLE_DOCKED)
ETA = "ETD"
if(ETA)
var/timeleft = SSshuttle.emergency.timeLeft()
stat(null, "[ETA]-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
if (internal)
if (!internal.air_contents)
qdel(internal)
@@ -115,8 +103,7 @@
f_loss = f_loss/1.5
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
ear_damage += 30
ear_deaf += 120
adjustEarDamage(30, 120)
if (prob(70) && !shielded)
Paralyse(10)
@@ -125,8 +112,7 @@
if (prob(getarmor(null, "bomb")))
b_loss = b_loss/2
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
ear_damage += 15
ear_deaf += 60
adjustEarDamage(15,60)
if (prob(50) && !shielded)
Paralyse(10)
@@ -154,7 +140,7 @@
show_message("<span class='userdanger'> The blob attacks you!</span>")
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
apply_damage(rand(20,30), BRUTE, affecting, run_armor_check(affecting, "melee"))
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
return
/mob/living/carbon/human/var/co2overloadtime = null
@@ -1,6 +1,8 @@
/mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user)
adjustBruteLoss(5)
Weaken(4)
if(user.a_intent == "harm")
..(user, 1)
adjustBruteLoss(5)
Weaken(4)
/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M)
if(..()) //to allow surgery to return properly.
+15 -29
View File
@@ -7,7 +7,6 @@
#define TINT_BLIND 3 //Threshold of tint level to obscure vision fully
#define HUMAN_MAX_OXYLOSS 3 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it.
#define HUMAN_CRIT_MAX_OXYLOSS ( (last_tick_duration) /3) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 100HP to get through, so (1/3)*last_tick_duration per second. Breaths however only happen every 4 ticks.
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
@@ -57,6 +56,10 @@
handle_regular_hud_updates()
//Status updates, death etc.
//TODO: optimise ~Carn
handle_regular_status_updates()
//No need to update all of these procs if the guy is dead.
if(stat != DEAD)
for(var/datum/mutation/human/HM in dna.mutations)
@@ -93,8 +96,7 @@
//stuff in the stomach
handle_stomach()
//Status updates, death etc.
handle_regular_status_updates() //TODO: optimise ~Carn
update_canmove()
//Update our name based on whether our face is obscured/disfigured
@@ -410,13 +412,11 @@
/mob/living/carbon/human/proc/handle_regular_status_updates()
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
eye_blind = max(eye_blind, 1)
silent = 0
else //ALIVE. LIGHTS ARE ON
updatehealth() //TODO
if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain))
death()
eye_blind = max(eye_blind, 1)
silent = 0
return 1
@@ -425,13 +425,6 @@
if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) )
Paralyse(3)
/* Done by handle_breath()
if( health <= 20 && prob(1) )
spawn(0)
emote("gasp")
if(!reagents.has_reagent("inaprovaline"))
adjustOxyLoss(1)*/
if(hallucination)
spawn handle_hallucinations()
@@ -446,13 +439,11 @@
if(paralysis)
AdjustParalysis(-1)
eye_blind = max(eye_blind, 1)
stat = UNCONSCIOUS
else if(sleeping)
handle_dreams()
adjustStaminaLoss(-10)
sleeping = max(sleeping-1, 0)
eye_blind = max(eye_blind, 1)
stat = UNCONSCIOUS
if( prob(10) && health && !hal_crit )
spawn(0)
@@ -462,7 +453,7 @@
stat = CONSCIOUS
//Eyes
if(disabilities & BLIND) //disabled-blind, doesn't get better on its own
if(disabilities & BLIND || stat) //disabled-blind, doesn't get better on its own
eye_blind = max(eye_blind, 1)
else if(eye_blind) //blindness, heals slowly over time
eye_blind = max(eye_blind-1,0)
@@ -473,18 +464,12 @@
//Ears
if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
ear_deaf = max(ear_deaf, 1)
else
/* might be better to create a variable here, and instead of doing this nested for. */
// deafness heals slowly over time, unless ear_damage is over 100
if (ear_damage < 100)
// Heal the first 1/3 here
ear_deaf = max(ear_deaf - 1, 0)
ear_damage = max(ear_damage-0.05, 0)
if(istype(ears, /obj/item/clothing/ears/earmuffs)) // earmuffs rest your ears, healing 3x faster, but keeping you deaf.
// Heal the 2/3 here
ear_deaf = max(ear_deaf, 1)
ear_damage = max(ear_damage-0.10, 0)
setEarDamage(-1, max(ear_deaf, 1))
else if (ear_damage < 100) // deafness heals slowly over time, unless ear_damage is over 100
if(istype(ears, /obj/item/clothing/ears/earmuffs)) // earmuffs rest your ears, healing 3x faster, but keeping you deaf.
setEarDamage(max(ear_damage-0.15, 0), max(ear_deaf - 1, 1))
else
adjustEarDamage(-0.05, -1)
//Dizziness
if(dizziness)
@@ -549,6 +534,9 @@
CheckStamina()
if(dna)
dna.species.handle_vision(src)
return 1
/mob/living/carbon/human/proc/handle_regular_hud_updates()
@@ -639,7 +627,6 @@
if(!client.adminobs) reset_view(null)
if(dna)
dna.species.handle_vision(src)
dna.species.handle_hud_icons(src)
return 1
@@ -688,4 +675,3 @@
mind.changeling.regenerate()
#undef HUMAN_MAX_OXYLOSS
#undef HUMAN_CRIT_MAX_OXYLOSS
@@ -8,7 +8,7 @@
#define TINT_BLIND 3
#define HUMAN_MAX_OXYLOSS 3
#define HUMAN_CRIT_MAX_OXYLOSS (SSmob.wait/3)
#define HUMAN_CRIT_MAX_OXYLOSS (SSmob.wait/30)
#define HEAT_DAMAGE_LEVEL_1 2
#define HEAT_DAMAGE_LEVEL_2 3
@@ -414,7 +414,7 @@
H.satiety++
if(prob(round(-H.satiety/40)))
H.Jitter(5)
hunger_rate = 5 * HUNGER_FACTOR
hunger_rate = 3 * HUNGER_FACTOR
H.nutrition = max (0, H.nutrition - hunger_rate)
@@ -475,11 +475,12 @@
if(H.seer)
H.see_invisible = SEE_INVISIBLE_OBSERVER
if(H.mind && H.mind.changeling)
H.hud_used.lingchemdisplay.invisibility = 0
H.hud_used.lingchemdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'> <font color='#dd66dd'>[H.mind.changeling.chem_charges]</font></div>"
else
H.hud_used.lingchemdisplay.invisibility = 101
if(H.mind)
if(H.mind.changeling)
H.hud_used.lingchemdisplay.invisibility = 0
H.hud_used.lingchemdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'> <font color='#dd66dd'>[H.mind.changeling.chem_charges]</font></div>"
else
H.hud_used.lingchemdisplay.invisibility = 101
if(H.glasses)
if(istype(H.glasses, /obj/item/clothing/glasses))
+4 -12
View File
@@ -346,12 +346,10 @@
updatehealth()
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
eye_blind = max(eye_blind, 1)
silent = 0
else //ALIVE. LIGHTS ARE ON
if(health < config.health_threshold_dead || !getorgan(/obj/item/organ/brain))
death()
eye_blind = max(eye_blind, 1)
stat = DEAD
silent = 0
return 1
@@ -367,11 +365,9 @@
if(paralysis)
AdjustParalysis(-1)
eye_blind = max(eye_blind, 1)
stat = UNCONSCIOUS
else if(sleeping)
sleeping = max(sleeping-1, 0)
eye_blind = max(eye_blind, 1)
stat = UNCONSCIOUS
if( prob(10) && health )
spawn(0)
@@ -381,24 +377,20 @@
stat = CONSCIOUS
//Eyes
if(disabilities & BLIND) //disabled-blind, doesn't get better on its own
eye_blind = max(eye_blind, 1)
if(disabilities & BLIND || stat) //disabled-blind, doesn't get better on its own
eye_blind = max(eye_blind, 2)
else if(eye_blind) //blindness, heals slowly over time
eye_blind = max(eye_blind-1,0)
eye_blind = max(eye_blind, 1)
else if(eye_blurry) //blurry eyes heal slowly
eye_blurry = max(eye_blurry-1, 0)
//Ears
if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
ear_deaf = max(ear_deaf, 1)
setEarDamage(-1, max(ear_deaf, 1))
else
/* might be better to create a variable here, and instead of doing this nested for. */
// deafness heals slowly over time, unless ear_damage is over 100
if (ear_damage < 100)
// Heal the first 1/3 here
ear_deaf = max(ear_deaf - 1, 0)
ear_damage = max(ear_damage-0.05, 0)
adjustEarDamage(-0.05,-1)
//Other
if(stunned)
@@ -174,11 +174,10 @@
/mob/living/carbon/monkey/Stat()
..()
statpanel("Status")
stat(null, "Intent: [a_intent]")
stat(null, "Move Mode: [m_intent]")
if(client && mind)
if (client.statpanel == "Status")
if(statpanel("Status"))
stat(null, "Intent: [a_intent]")
stat(null, "Move Mode: [m_intent]")
if(client && mind)
if(mind.changeling)
stat("Chemical Storage", "[mind.changeling.chem_charges]/[mind.changeling.chem_storage]")
stat("Absorbed DNA", mind.changeling.absorbedcount)
+30 -1
View File
@@ -10,6 +10,7 @@
act = copytext(act,1,length(act))
var/m_type = 1
var/regenerate_icons
var/message
switch(act) //Alphabetical please
@@ -45,11 +46,36 @@
message = "<B>The [src.name]</B> vibrates!"
m_type = 1
if("noface") //mfw I have no face
mood = null
regenerate_icons = 1
if("smile")
mood = "mischevous"
regenerate_icons = 1
if(":3")
mood = ":33"
regenerate_icons = 1
if("pout")
mood = "pout"
regenerate_icons = 1
if("frown")
mood = "sad"
regenerate_icons = 1
if("scowl")
mood = "angry"
regenerate_icons = 1
if ("help") //This is an exception
src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, jiggle, light, moan, shiver, sway, twitch, vibrate"
src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, jiggle, light, moan, shiver, sway, twitch, vibrate. \n\nYou may also change your face with: \n\nsmile, :3, pout, frown, scowl, noface"
else
src << "<span class='notice'>Unusable emote '[act]'. Say *help for a list.</span>"
if ((message && src.stat == 0))
if(client)
log_emote("[name]/[key] : [message]")
@@ -58,4 +84,7 @@
else
src.loc.audible_message(message)
if (regenerate_icons)
regenerate_icons()
return
+1 -5
View File
@@ -235,16 +235,12 @@
src.eye_blind = 0
src.eye_blind = max(eye_blind, 1)
if (src.ear_deaf > 0) src.ear_deaf = 0
if (src.ear_damage < 25)
src.ear_damage = 0
setEarDamage((ear_damage < 25 ? 0 : ear_damage),(disabilities & DEAF ? 1 :0))
src.density = !( src.lying )
if (src.disabilities & BLIND)
src.eye_blind = max(eye_blind, 1)
if (src.disabilities & DEAF)
src.ear_deaf = 1
if (src.eye_blurry > 0)
src.eye_blurry = 0
@@ -130,13 +130,12 @@
/mob/living/carbon/slime/Stat()
..()
statpanel("Status")
if(is_adult)
stat(null, "Health: [round((health / 200) * 100)]%")
else
stat(null, "Health: [round((health / 150) * 100)]%")
if(statpanel("Status"))
if(is_adult)
stat(null, "Health: [round((health / 200) * 100)]%")
else
stat(null, "Health: [round((health / 150) * 100)]%")
if (client.statpanel == "Status")
stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]")
if(amount_grown >= 10)
if(is_adult)
+12 -3
View File
@@ -277,9 +277,6 @@ Sorry Giacom. Please don't be mad :(
// MOB PROCS //END
/mob/proc/get_contents()
/mob/living/proc/mob_sleep()
set name = "Sleep"
set category = "IC"
@@ -291,6 +288,7 @@ Sorry Giacom. Please don't be mad :(
if(alert(src, "You sure you want to sleep for a while?", "Sleep", "Yes", "No") == "Yes")
usr.sleeping = 20 //Short nap
/mob/proc/get_contents()
/mob/living/proc/lay_down()
set name = "Rest"
@@ -343,6 +341,17 @@ Sorry Giacom. Please don't be mad :(
var/obj/item/organ/limb/def_zone = ran_zone(t)
return def_zone
//damage/heal the mob ears and adjust the deaf amount
/mob/living/adjustEarDamage(var/damage, var/deaf)
ear_damage = max(0, ear_damage + damage)
ear_deaf = max(0, ear_deaf + deaf)
//pass a negative argument to skip one of the variable
/mob/living/setEarDamage(var/damage, var/deaf)
if(damage >= 0)
ear_damage = damage
if(deaf >= 0)
ear_deaf = deaf
// heal ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/proc/heal_organ_damage(var/brute, var/burn)
+42 -13
View File
@@ -146,7 +146,7 @@ var/list/ai_list = list()
return
//if(icon_state == initial(icon_state))
var/icontype = input("Please, select a display!", "AI", null/*, null*/) in list("Clown", "Monochrome", "Blue", "Inverted", "Firewall", "Green", "Red", "Static", "Red October", "House", "Heartline")
var/icontype = input("Please, select a display!", "AI", null/*, null*/) in list("Clown", "Monochrome", "Blue", "Inverted", "Firewall", "Green", "Red", "Static", "Red October", "House", "Heartline", "Hades", "Helios", "President", "Syndicat Meow", "Alien", "Too Deep", "Triumvirate", "Triumvirate-M", "Text", "Matrix", "Dorf", "Bliss", "Not Malf", "Fuzzy", "Goon", "Database", "Glitchman", "Murica", "Nanotrasen", "Gentoo")
if(icontype == "Clown")
icon_state = "ai-clown2"
else if(icontype == "Monochrome")
@@ -169,24 +169,53 @@ var/list/ai_list = list()
icon_state = "ai-house"
else if(icontype == "Heartline")
icon_state = "ai-heartline"
else if(icontype == "Hades")
icon_state = "ai-hades"
else if(icontype == "Helios")
icon_state = "ai-helios"
else if(icontype == "President")
icon_state = "ai-pres"
else if(icontype == "Syndicat Meow")
icon_state = "ai-syndicatmeow"
else if(icontype == "Alien")
icon_state = "ai-alien"
else if(icontype == "Too Deep")
icon_state = "ai-toodeep"
else if(icontype == "Triumvirate")
icon_state = "ai-triumvirate"
else if(icontype == "Triumvirate-M")
icon_state = "ai-triumvirate-malf"
else if(icontype == "Text")
icon_state = "ai-text"
else if(icontype == "Matrix")
icon_state = "ai-matrix"
else if(icontype == "Dorf")
icon_state = "ai-dorf"
else if(icontype == "Bliss")
icon_state = "ai-bliss"
else if(icontype == "Not Malf")
icon_state = "ai-notmalf"
else if(icontype == "Fuzzy")
icon_state = "ai-fuzz"
else if(icontype == "Goon")
icon_state = "ai-goon"
else if(icontype == "Database")
icon_state = "ai-database"
else if(icontype == "Glitchman")
icon_state = "ai-glitchman"
else if(icontype == "Murica")
icon_state = "ai-murica"
else if(icontype == "Nanotrasen")
icon_state = "ai-nanotrasen"
else if(icontype == "Gentoo")
icon_state = "ai-gentoo"
//else
//usr <<"You can only change your display once!"
//return
/mob/living/silicon/ai/Stat()
..()
statpanel("Status")
if (client.statpanel == "Status")
var/ETA
switch(SSshuttle.emergency.mode)
if(SHUTTLE_CALL)
ETA = "ETA"
if(SHUTTLE_DOCKED)
ETA = "ETD"
if(ETA)
var/timeleft = SSshuttle.emergency.timeLeft()
stat(null, "[ETA]-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
if(statpanel("Status"))
if(ticker.mode.name == "AI malfunction")
var/datum/game_mode/malfunction/malf = ticker.mode
for (var/datum/mind/malfai in malf.malf_ai)
+1 -1
View File
@@ -170,7 +170,7 @@ var/const/VOX_DELAY = 600
if(!only_listener)
// Play voice for all mobs in the z level
for(var/mob/M in player_list)
if(M.client)
if(M.client && !M.ear_deaf)
var/turf/T = get_turf(M)
if(T.z == z_level)
M << voice
+1 -11
View File
@@ -78,17 +78,7 @@
/mob/living/silicon/pai/Stat()
..()
statpanel("Status")
if (src.client.statpanel == "Status")
var/ETA
switch(SSshuttle.emergency.mode)
if(SHUTTLE_CALL)
ETA = "ETA"
if(SHUTTLE_DOCKED)
ETA = "ETD"
if(ETA)
var/timeleft = SSshuttle.emergency.timeLeft()
stat(null, "[ETA]-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
if(statpanel("Status"))
if(src.silence_time)
var/timeleft = round((silence_time - world.timeofday)/10 ,1)
stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
@@ -110,17 +110,10 @@
if (src.eye_blind)
src.eye_blind--
if (src.ear_deaf > 0) src.ear_deaf--
if (src.ear_damage < 25)
src.ear_damage -= 0.05
src.ear_damage = max(src.ear_damage, 0)
src.density = !( src.lying )
if (src.disabilities & BLIND)
src.eye_blind = max(1, eye_blind)
if (src.disabilities & DEAF)
src.ear_deaf = 1
if (src.eye_blurry > 0)
src.eye_blurry--
+7 -15
View File
@@ -118,12 +118,16 @@
toner = 40
//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO
//Improved /N
/mob/living/silicon/robot/Destroy()
if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside.
var/turf/T = get_turf(loc)//To hopefully prevent run time errors.
if(T) mmi.loc = T
mind.transfer_to(mmi.brainmob)
if(mmi.brainmob)
mind.transfer_to(mmi.brainmob)
else
src << "<span class='userdanger'>Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug.</span>"
ghostize()
ERROR("A borg has been destroyed, but its MMI lacked a brainmob, so the mind could not be transferred. Player: [ckey].")
mmi = null
..()
@@ -290,19 +294,7 @@
/mob/living/silicon/robot/Stat()
..()
statpanel("Status")
if (client.statpanel == "Status")
var/ETA
switch(SSshuttle.emergency.mode)
if(SHUTTLE_CALL)
ETA = "ETA"
if(SHUTTLE_DOCKED)
ETA = "ETD"
if(ETA)
var/timeleft = SSshuttle.emergency.timeLeft()
stat(null, "[ETA]-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
if(statpanel("Status"))
if(ticker.mode.name == "AI malfunction")
var/datum/game_mode/malfunction/malf = ticker.mode
for (var/datum/mind/malfai in malf.malf_ai)
@@ -248,9 +248,9 @@
..()
modules += new /obj/item/device/flashlight(src)
modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
modules += new /obj/item/weapon/gun/energy/crossbow/cyborg(src)
modules += new /obj/item/weapon/gun/energy/printer(src)
modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/cyborg(src)
modules += new /obj/item/weapon/card/emag(src)
modules += new /obj/item/weapon/gun/energy/laser/cyborg(src)
modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
modules += new /obj/item/weapon/crowbar(src)
emag = null
@@ -408,3 +408,9 @@
visible_message("<span class='danger'>[M] punches [src], but doesn't leave a dent.</span>", \
"<span class='userdanger'>[M] punches [src], but doesn't leave a dent.!</span>")
return 0
/mob/living/silicon/adjustEarDamage()
return
/mob/living/silicon/setEarDamage()
return
@@ -0,0 +1,23 @@
//Foxxy
/mob/living/simple_animal/fox
name = "fox"
desc = "It's a fox. I wonder what it says?"
icon_state = "fox"
icon_living = "fox"
icon_dead = "fox_dead"
speak = list("Ack-Ack","Ack-Ack-Ack-Ackawoooo","Geckers","Awoo","Tchoff")
speak_emote = list("geckers", "barks")
emote_hear = list("howls","barks")
emote_see = list("shakes its head", "shivers")
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
//Captain fox
/mob/living/simple_animal/fox/Renault
name = "Renault"
desc = "Renault, the Captain's trustworthy fox. I wonder what it says?"
@@ -122,8 +122,9 @@
/mob/living/simple_animal/parrot/Stat()
..()
stat("Held Item", held_item)
stat("Mode",a_intent)
if(statpanel("Status"))
stat("Held Item", held_item)
stat("Mode",a_intent)
/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
if(speaker != src && prob(20)) //Dont imitate ourselves
@@ -109,6 +109,8 @@
if(paralysis)
AdjustParalysis(-1)
adjustEarDamage((ear_damage < 25 ? -0.05 : 0), -1)
//Movement
if(!client && !stop_automated_movement && wander)
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
@@ -378,8 +380,8 @@
/mob/living/simple_animal/Stat()
..()
statpanel("Status")
stat(null, "Health: [round((health / maxHealth) * 100)]%")
if(statpanel("Status"))
stat(null, "Health: [round((health / maxHealth) * 100)]%")
/mob/living/simple_animal/proc/Die()
health = 0 // so /mob/living/simple_animal/Life() doesn't magically revive them
+2
View File
@@ -51,6 +51,8 @@
//readd this mob's HUDs (antag, med, etc)
reload_huds()
if(ckey in deadmins)
verbs += /client/proc/readmin
// Calling update_interface() in /mob/Login() causes the Cyborg to immediately be ghosted; because of winget().
// Calling it in the overriden Login, such as /mob/living/Login() doesn't cause this.
+22
View File
@@ -694,6 +694,22 @@ var/list/slot_equipment_priority = list( \
/mob/Stat()
..()
if(statpanel("Status"))
var/ETA
switch(SSshuttle.emergency.mode)
if(SHUTTLE_RECALL)
ETA = "RCL"
if(SHUTTLE_CALL)
ETA = "ETA"
if(SHUTTLE_DOCKED)
ETA = "ETD"
if(SHUTTLE_ESCAPE)
ETA = "ESC"
if(ETA)
var/timeleft = SSshuttle.emergency.timeLeft()
stat(null, "[ETA]-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
if(client && client.holder)
if(statpanel("MC"))
stat("Location:","([x], [y], [z])")
@@ -925,3 +941,9 @@ var/list/slot_equipment_priority = list( \
if(G.can_reenter_corpse || even_if_they_cant_reenter)
return G
break
/mob/proc/adjustEarDamage()
return
/mob/proc/setEarDamage()
return
+4 -8
View File
@@ -47,10 +47,10 @@
var/next_move = null
var/notransform = null //Carbon
var/hand = null
var/eye_blind = null //Carbon
var/eye_blurry = null //Carbon
var/ear_deaf = null //Carbon
var/ear_damage = null //Carbon
var/eye_blind = 0 //Carbon
var/eye_blurry = 0 //Carbon
var/ear_deaf = 0 //Carbon
var/ear_damage = 0 //Carbon
var/stuttering = null //Carbon
var/real_name = null
var/bhunger = 0 //Carbon
@@ -111,10 +111,6 @@
var/job = null//Living
var/const/blindness = 1//Carbon
var/const/deafness = 2//Carbon
var/const/muteness = 4//Carbon
var/radiation = 0//Carbon
var/list/mutations = list() //Carbon -- Doohl
+3 -3
View File
@@ -163,14 +163,14 @@ proc/isorgan(A)
if(prob(probability))
return zone
var/t = rand(1, 17) // randomly pick a different zone, or maybe the same one
var/t = rand(1, 18) // randomly pick a different zone, or maybe the same one
switch(t)
if(1) return "head"
if(2) return "chest"
if(3 to 6) return "l_arm"
if(7 to 10) return "r_arm"
if(10 to 13) return "l_leg"
if(14 to 17) return "r_leg"
if(11 to 14) return "l_leg"
if(15 to 18) return "r_leg"
return zone
+2
View File
@@ -30,6 +30,8 @@
loc = pick(watch_locations)
*/
new_player_panel()
if(ckey in deadmins)
verbs += /client/proc/readmin
spawn(40)
if(client)
handle_privacy_poll()
+17 -14
View File
@@ -40,10 +40,11 @@
O.real_name = newname
//handle DNA and other attributes
O.dna = dna
dna = null
if (!(tr_flags & TR_KEEPSE))
O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(BAD_MUTATION_DIFFICULTY,BAD_MUTATION_DIFFICULTY))
if(dna)
dna.transfer_identity(O)
if(tr_flags & TR_KEEPSE)
O.dna.struc_enzymes = dna.struc_enzymes
if(suiciding)
O.suiciding = suiciding
O.loc = loc
@@ -135,7 +136,13 @@
qdel(animation)
O.gender = (deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 2)-1) ? FEMALE : MALE
O.dna = dna
if(dna)
dna.transfer_identity(O)
O.update_icons()
if(tr_flags & TR_KEEPSE)
O.dna.struc_enzymes = dna.struc_enzymes
domutcheck(O)
if(!dna.species)
O.dna.species = new /datum/species/human()
@@ -143,17 +150,13 @@
O.dna.species = new dna.species.type()
dna = null
if (newname) //if there's a name as an argument, always take that one over the current name
if(newname) //if there's a name as an argument, always take that one over the current name
O.real_name = newname
else
if ( !(cmptext ("monkey",copytext(O.dna.real_name,1,7)) ) )
O.real_name = O.dna.real_name
else
O.real_name = random_name(O.gender)
O.name = O.real_name
if (!(tr_flags & TR_KEEPSE))
O.dna.struc_enzymes = setblock(O.dna.struc_enzymes, RACEBLOCK, construct_block(1,BAD_MUTATION_DIFFICULTY))
if(cmptext("monkey",copytext(O.dna.real_name,1,7)))
O.dna.real_name = random_name(O.gender)
O.real_name = O.dna.real_name
O.name = O.real_name
if(suiciding)
O.suiciding = suiciding
-2
View File
@@ -34,8 +34,6 @@
BB = new projectile_type(src)
return
//Boxes of ammo
/obj/item/ammo_box
name = "ammo box (null_reference_exception)"
@@ -136,9 +136,9 @@
caliber = "a762"
projectile_type = /obj/item/projectile/bullet
/obj/item/ammo_casing/a545
desc = "A 5.45mm bullet casing."
caliber = "a545"
/obj/item/ammo_casing/a556
desc = "A 5.56mm bullet casing."
caliber = "a556"
projectile_type = /obj/item/projectile/bullet/heavybullet
/obj/item/ammo_casing/caseless
@@ -164,3 +164,11 @@
caliber = "40mm"
icon_state = "40mmHE"
projectile_type = /obj/item/projectile/bullet/a40mm
/obj/item/ammo_casing/caseless/bolt //xbow
name = "poison crossbow bolt"
desc = "A reusable crossbow bolt tipped with specialized carpotoxin."
projectile_type = /obj/item/projectile/energy/bolt
caliber = "crossbow"
icon = 'icons/obj/projectiles.dmi'
icon_state = "cbbolt"
+7 -1
View File
@@ -38,4 +38,10 @@
icon_state = "40mm"
ammo_type = /obj/item/ammo_casing/a40mm
max_ammo = 4
multiple_sprites = 1
multiple_sprites = 1
/obj/item/ammo_box/crossbow
name = "ammo box (crossbow bolts)"
icon_state = "xbow"
ammo_type = /obj/item/ammo_casing/caseless/bolt
max_ammo = 4
+4 -12
View File
@@ -18,7 +18,7 @@
select_name = "kill"
/obj/item/ammo_casing/energy/laser/practice
projectile_type = /obj/item/projectile/practice
projectile_type = /obj/item/projectile/beam/practice
select_name = "practice"
/obj/item/ammo_casing/energy/laser/scatter
@@ -46,15 +46,6 @@
projectile_type = /obj/item/projectile/lasertag/redtag
select_name = "redtag"
/obj/item/ammo_casing/energy/bolt
projectile_type = /obj/item/projectile/energy/bolt
select_name = "bolt"
fire_sound = 'sound/weapons/Genhit.ogg'
/obj/item/ammo_casing/energy/bolt/large
projectile_type = /obj/item/projectile/energy/bolt/large
select_name = "heavy bolt"
/obj/item/ammo_casing/energy/xray
projectile_type = /obj/item/projectile/beam/xray
e_cost = 50
@@ -64,9 +55,11 @@
projectile_type = /obj/item/projectile/energy/electrode
select_name = "stun"
fire_sound = 'sound/weapons/taser.ogg'
e_cost = 200
/obj/item/ammo_casing/energy/electrode/gun
fire_sound = 'sound/weapons/gunshot.ogg'
e_cost = 100
/obj/item/ammo_casing/energy/ion
projectile_type = /obj/item/projectile/ion
@@ -131,5 +124,4 @@
/obj/item/ammo_casing/energy/wormhole/orange
projectile_type = /obj/item/projectile/beam/wormhole/orange
select_name = "orange"
select_name = "orange"
@@ -90,6 +90,15 @@
ammo_type = /obj/item/ammo_casing/a40mm
max_ammo = 6
/obj/item/ammo_box/magazine/internal/cylinder/crossbow
name = "autocrossbow internal magazine"
ammo_type = /obj/item/ammo_casing/caseless/bolt
caliber = "crossbow"
max_ammo = 10
/obj/item/ammo_box/magazine/internal/cylinder/crossbow/large
max_ammo = 15
///////////EXTERNAL MAGAZINES////////////////
/obj/item/ammo_box/magazine/m10mm
@@ -159,17 +168,14 @@ obj/item/ammo_box/magazine/tommygunm45
multiple_sprites = 2
max_ammo = 8
/obj/item/ammo_box/magazine/m545
name = "box magazine (5.45mm)"
icon_state = "5.45m"
/obj/item/ammo_box/magazine/m556
name = "toploader magazine (5.56mm)"
icon_state = "5.56m"
origin_tech = "combat=5;syndicate=1"
ammo_type = /obj/item/ammo_casing/a545
caliber = "a545"
ammo_type = /obj/item/ammo_casing/a556
caliber = "a556"
max_ammo = 30
/obj/item/ammo_box/magazine/m545/update_icon()
..()
icon_state = "[initial(icon_state)]-[round(ammo_count(),10)]"
multiple_sprites = 2
/obj/item/ammo_box/magazine/m762
name = "box magazine (7.62mm)"
@@ -34,4 +34,10 @@
/obj/item/ammo_casing/syringegun
name = "syringe gun spring"
desc = "A high-power spring that throws syringes."
projectile_type = null
projectile_type = null
/obj/item/ammo_casing/energy/c3dbullet
projectile_type = /obj/item/projectile/bullet/midbullet3
select_name = "spraydown"
fire_sound = 'sound/weapons/gunshot_smg.ogg'
e_cost = 20
+82 -1
View File
@@ -30,6 +30,8 @@
var/sawn_state = SAWN_INTACT
var/burst_size = 1
var/fire_delay = 0
var/obj/item/device/flashlight/F = null
var/can_flashlight = 0
/obj/item/weapon/gun/proc/process_chamber()
return 0
@@ -145,4 +147,83 @@
if(user.a_intent == "harm") //Flogging
..()
else
return
return
/obj/item/weapon/gun/attackby(var/obj/item/A as obj, mob/user as mob)
if(istype(A, /obj/item/device/flashlight/seclite))
var/obj/item/device/flashlight/seclite/S = A
if(can_flashlight)
if(!F)
if(user.l_hand != src && user.r_hand != src)
user << "<span class='notice'>You'll need [src] in your hands to do that.</span>"
return
user.drop_item()
user << "<span class='notice'>You click [S] into place on [src].</span>"
if(S.on)
SetLuminosity(0)
F = S
A.loc = src
update_icon()
update_gunlight(user)
if(istype(A, /obj/item/weapon/screwdriver))
if(F)
if(user.l_hand != src && user.r_hand != src)
user << "<span class='notice'>You'll need [src] in your hands to do that.</span>"
return
for(var/obj/item/device/flashlight/seclite/S in src)
user << "<span class='notice'>You unscrew the seclite from [src].</span>"
F = null
S.loc = get_turf(user)
update_gunlight(user)
S.update_brightness(user)
update_icon()
..()
return
/obj/item/weapon/gun/verb/toggle_gunlight()
set name = "Toggle Gunlight"
set category = "Object"
set desc = "Click to toggle your weapon's attached flashlight."
var/mob/living/carbon/human/user = usr
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]."
F.on = !F.on
user << "<span class='notice'>You toggle the gunlight [F.on ? "on":"off"].</span>"
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
update_gunlight(user)
return
/obj/item/weapon/gun/proc/update_gunlight(var/mob/user = null)
if(F)
action_button_name = "Toggle Gunlight"
if(F.on)
if(loc == user)
user.AddLuminosity(F.brightness_on)
else if(isturf(loc))
SetLuminosity(F.brightness_on)
else
if(loc == user)
user.AddLuminosity(-F.brightness_on)
else if(isturf(loc))
SetLuminosity(0)
update_icon()
else
action_button_name = null
if(loc == user)
user.AddLuminosity(-5)
else if(isturf(loc))
SetLuminosity(0)
return
/obj/item/weapon/gun/pickup(mob/user)
if(F)
if(F.on)
user.AddLuminosity(F.brightness_on)
SetLuminosity(0)
/obj/item/weapon/gun/dropped(mob/user)
if(F)
if(F.on)
user.AddLuminosity(-F.brightness_on)
SetLuminosity(F.brightness_on)
+10 -1
View File
@@ -79,4 +79,13 @@
icon_state = "[initial(icon_state)][shot.mod_name][ratio]"
if (2)
icon_state = "[initial(icon_state)][shot.select_name][ratio]"
return
overlays.Cut()
if(F)
if(F.on)
overlays += "flight-on"
else
overlays += "flight"
return
/obj/item/weapon/gun/energy/ui_action_click()
toggle_gunlight()
@@ -6,7 +6,7 @@
ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
origin_tech = "combat=3;magnets=2"
modifystate = 2
can_flashlight = 1
/obj/item/weapon/gun/energy/gun/attack_self(mob/living/user as mob)
select_fire(user)
@@ -21,6 +21,7 @@
var/charge_tick = 0
modifystate = 0
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
can_flashlight = 0
/obj/item/weapon/gun/energy/gun/nuclear/New()
..()
@@ -134,7 +134,6 @@
icon_state = "disabler"
item_state = null
ammo_type = list(/obj/item/ammo_casing/energy/disabler)
cell_type = "/obj/item/weapon/stock_parts/cell"
/obj/item/weapon/gun/energy/wormhole_projector
@@ -180,3 +179,42 @@
if(orange && blue)
blue.target = get_turf(orange)
orange.target = get_turf(blue)
/* 3d printer 'pseudo guns' for borgs */
/obj/item/weapon/gun/energy/printer
name = "cyborg lmg"
desc = "A machinegun that fires 3d-printed flachettes slowly regenerated using a cyborg's internal power source."
icon_state = "l6closed0"
cell_type = "/obj/item/weapon/stock_parts/cell/secborg"
ammo_type = list(/obj/item/ammo_casing/energy/c3dbullet)
var/charge_tick = 0
var/recharge_time = 5
/obj/item/weapon/gun/energy/printer/update_icon()
return
/obj/item/weapon/gun/energy/printer/New()
..()
SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/printer/Destroy()
SSobj.processing.Remove(src)
..()
/obj/item/weapon/gun/energy/printer/process()
charge_tick++
if(charge_tick < recharge_time) return 0
charge_tick = 0
if(!power_supply) return 0 //sanity
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
if(R.cell.use(shot.e_cost)) //Take power from the borg...
power_supply.give(shot.e_cost) //...to recharge the shot
return 1
+7 -65
View File
@@ -5,30 +5,28 @@
icon_state = "taser"
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
cell_type = "/obj/item/weapon/stock_parts/cell/crap"
/obj/item/weapon/gun/energy/stunrevolver
name = "stun revolver"
desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder."
desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder. Holds twice as many electrodes as a standard taser."
icon_state = "stunrevolver"
origin_tech = "combat=3;materials=3;powerstorage=2"
ammo_type = list(/obj/item/ammo_casing/energy/electrode/gun)
cell_type = "/obj/item/weapon/stock_parts/cell"
can_flashlight = 0
/obj/item/weapon/gun/energy/gun/advtaser
name = "advanced taser"
desc = "A hybrid taser designed to fire both short-range high-power electrodes and long-range disabler beams."
name = "hybrid taser"
desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams."
icon_state = "advtaser"
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler)
cell_type = "/obj/item/weapon/stock_parts/cell/crap"
origin_tech = null
/obj/item/weapon/gun/energy/gun/advtaser/cyborg
name = "advanced taser"
desc = "An integrated advanced taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating."
cell_type = "/obj/item/weapon/stock_parts/cell/secborg"
name = "cyborg taser"
desc = "An integrated hybrid taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating."
var/charge_tick = 0
var/recharge_time = 10
can_flashlight = 0
/obj/item/weapon/gun/energy/gun/advtaser/cyborg/New()
..()
@@ -54,59 +52,3 @@
update_icon()
return 1
/obj/item/weapon/gun/energy/crossbow
name = "mini energy crossbow"
desc = "A weapon favored by syndicate stealth specialists."
icon_state = "crossbow"
item_state = "crossbow"
w_class = 2.0
m_amt = 2000
origin_tech = "combat=2;magnets=2;syndicate=5"
suppressed = 1
ammo_type = list(/obj/item/ammo_casing/energy/bolt)
cell_type = "/obj/item/weapon/stock_parts/cell/crap"
var/charge_tick = 0
/obj/item/weapon/gun/energy/crossbow/New()
..()
SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/crossbow/Destroy()
SSobj.processing.Remove(src)
..()
/obj/item/weapon/gun/energy/crossbow/process()
charge_tick++
if(charge_tick < 4) return 0
charge_tick = 0
if(!power_supply) return 0
power_supply.give(100)
return 1
/obj/item/weapon/gun/energy/crossbow/update_icon()
return
/obj/item/weapon/gun/energy/crossbow/cyborg/newshot()
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
if(R.cell.use(shot.e_cost))
chambered = shot
chambered.newshot()
return
/obj/item/weapon/gun/energy/crossbow/largecrossbow
name = "energy crossbow"
desc = "A weapon favored by syndicate carp hunters."
icon_state = "crossbowlarge"
w_class = 3.0
force = 10
m_amt = 4000
suppressed = 0
@@ -9,8 +9,8 @@
can_suppress = 1
burst_size = 3
fire_delay = 1
var/select = 0
action_button_name = "Toggle Fire Mode"
var/select = 1
action_button_name = "Toggle Firemode"
/obj/item/weapon/gun/projectile/automatic/update_icon()
..()
@@ -23,28 +23,40 @@
return
/obj/item/weapon/gun/projectile/automatic/attackby(var/obj/item/A as obj, mob/user as mob)
if(..() && chambered)
alarmed = 0
if(istype(A, /obj/item/ammo_box/magazine))
var/obj/item/ammo_box/magazine/AM = A
if(istype(AM, mag_type))
if(magazine)
user << "<span class='notice'>You perform a tactical reload on \the [src], replacing the magazine.</span>"
magazine.loc = get_turf(src.loc)
magazine.update_icon()
magazine = null
else
user << "<span class='notice'>You insert the magazine into \the [src].</span>"
user.remove_from_mob(AM)
magazine = AM
magazine.loc = src
chamber_round()
A.update_icon()
update_icon()
return 1
/obj/item/weapon/gun/projectile/automatic/ui_action_click()
burst_select()
/obj/item/weapon/gun/projectile/automatic/verb/burst_select()
set name = "Toggle Fire Mode"
set category = "Object"
set desc = "Click to switch fire modes."
/obj/item/weapon/gun/projectile/automatic/proc/burst_select()
var/mob/living/carbon/human/user = usr
select = !select
if(select)
select = 0
burst_size = 1
fire_delay = 0
user << "<span class='notice'>You switch to semi-automatic.</span>"
else
select = 1
burst_size = initial(burst_size)
fire_delay = initial(fire_delay)
user << "<span class='notice'>You switch to [burst_size]-rnd burst.</span>"
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
update_icon()
return
@@ -98,12 +110,8 @@
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
var/cover_open = 0
can_suppress = 0
burst_size = 1
fire_delay = 0
/obj/item/weapon/gun/projectile/automatic/l6_saw/burst_select()
return
burst_size = 5
fire_delay = 3
/obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob)
cover_open = !cover_open
@@ -145,71 +153,70 @@
return
..()
/obj/item/weapon/gun/projectile/automatic/c90gl
name = "syndicate assault rifle"
desc = "A bullpup three-round burst 5.45x39 assault rifle with a unique toploading design, designated 'C-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off."
icon_state = "c90gl"
item_state = "c90gl"
/obj/item/weapon/gun/projectile/automatic/m90
name = "syndicate carbine"
desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off."
icon_state = "m90"
item_state = "m90"
origin_tech = "combat=5;materials=2;syndicate=8"
mag_type = /obj/item/ammo_box/magazine/m545
mag_type = /obj/item/ammo_box/magazine/m556
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
action_button_name = "Toggle Grenade Launcher"
can_suppress = 0
var/obj/item/weapon/gun/projectile/revolver/grenadelauncher/underbarrel
burst_size = 3
fire_delay = 2
/obj/item/weapon/gun/projectile/automatic/c90gl/New()
/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/c90gl/afterattack(var/atom/target, var/mob/living/user, flag, params)
/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
..()
empty_alarm()
return
/obj/item/weapon/gun/projectile/automatic/c90gl/attackby(var/obj/item/A, mob/user)
if(select == 2)
underbarrel.attackby(A, user)
else
..()
/obj/item/weapon/gun/projectile/automatic/c90gl/attack_self(var/mob/living/user)
if(select == 2)
underbarrel.attack_self(user)
/obj/item/weapon/gun/projectile/automatic/m90/attackby(var/obj/item/A, mob/user)
if(istype(A, /obj/item/ammo_casing))
if(istype(A, underbarrel.magazine.ammo_type))
underbarrel.attack_self()
underbarrel.attackby(A, user)
else
..()
/obj/item/weapon/gun/projectile/automatic/c90gl/update_icon()
/obj/item/weapon/gun/projectile/automatic/m90/update_icon()
..()
overlays.Cut()
if(!select)
overlays += "[initial(icon_state)]semi"
if(select == 1)
overlays += "[initial(icon_state)]burst"
if(select == 2)
overlays += "[initial(icon_state)]gren"
icon_state = "c90gl[magazine ? "-[Ceiling(get_ammo(0)/6)*6]" : ""][chambered ? "" : "-e"]"
switch(select)
if(0)
overlays += "[initial(icon_state)]semi"
if(1)
overlays += "[initial(icon_state)]burst"
if(2)
overlays += "[initial(icon_state)]gren"
icon_state = "[initial(icon_state)][magazine ? "" : "-e"]"
return
/obj/item/weapon/gun/projectile/automatic/c90gl/burst_select()
/obj/item/weapon/gun/projectile/automatic/m90/burst_select()
var/mob/living/carbon/human/user = usr
if(!select)
select = 1
burst_size = initial(burst_size)
fire_delay = initial(fire_delay)
user << "<span class='notice'>You switch to [burst_size]-rnd burst.</span>"
if(select == 1)
select = 2
user << "<span class='notice'>You switch to grenades.</span>"
if(select == 2)
select = 0
burst_size = 1
fire_delay = 0
user << "<span class='notice'>You switch to semi-auto.</span>"
switch(select)
if(0)
select = 1
burst_size = initial(burst_size)
fire_delay = initial(fire_delay)
user << "<span class='notice'>You switch to [burst_size]-rnd burst.</span>"
if(1)
select = 2
user << "<span class='notice'>You switch to grenades.</span>"
if(2)
select = 0
burst_size = 1
fire_delay = 0
user << "<span class='notice'>You switch to semi-auto.</span>"
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
update_icon()
return
@@ -217,7 +224,7 @@
name = "tommy gun"
desc = "A genuine 'Chicago Typewriter'."
icon_state = "tommygun"
item_state = "tommygun"
item_state = "shotgun"
slot_flags = 0
origin_tech = "combat=5;materials=1;syndicate=2"
mag_type = /obj/item/ammo_box/magazine/tommygunm45
@@ -7,6 +7,7 @@
icon_state = "dshotgun-sawn"
item_state = "gun"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher
fire_sound = 'sound/weapons/grenadelaunch.ogg'
w_class = 3
/obj/item/weapon/gun/projectile/revolver/grenadelauncher/attackby(var/obj/item/A, mob/user)
@@ -14,22 +15,26 @@
if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing))
chamber_round()
/obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi
desc = "A revolving 6-shot grenade launcher."
/obj/item/weapon/gun/projectile/revolver/grenadelauncher/cyborg
desc = "A 6-shot grenade launcher."
name = "multi grenade launcher"
icon_state = "bulldog"
item_state = "bulldog"
icon = 'icons/mecha/mecha_equipment.dmi'
icon_state = "mecha_grenadelnchr"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher/multi
/obj/item/weapon/gun/projectile/revolver/grenadelauncher/cyborg/attack_self()
return
/obj/item/weapon/gun/projectile/automatic/gyropistol
name = "gyrojet pistol"
desc = "A prototype pistol designed to fire self propelled rockets."
icon_state = "gyropistol"
fire_sound = 'sound/effects/Explosion1.ogg'
fire_sound = 'sound/weapons/grenadelaunch.ogg'
origin_tech = "combat=3"
mag_type = /obj/item/ammo_box/magazine/m75
burst_size = 1
fire_delay = 0
action_button_name = null
/obj/item/weapon/gun/projectile/automatic/gyropistol/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
..()
@@ -37,4 +42,46 @@
/obj/item/weapon/gun/projectile/automatic/gyropistol/update_icon()
..()
icon_state = "[initial(icon_state)][magazine ? "loaded" : ""]"
return
return
/obj/item/weapon/gun/projectile/automatic/crossbow
name = "mini auto-crossbow"
desc = "A weapon favored by syndicate stealth specialists. Fires specialized poison bolts."
icon_state = "crossbow"
item_state = "crossbow"
w_class = 2
m_amt = 2000
origin_tech = "combat=2;magnets=2;syndicate=5"
suppressed = 1
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/crossbow
fire_sound = 'sound/weapons/genhit.ogg'
burst_size = 1
fire_delay = 0
select = 0
action_button_name = null
/obj/item/weapon/gun/projectile/automatic/crossbow/update_icon()
return
/obj/item/weapon/gun/projectile/automatic/crossbow/attack_self()
return
/obj/item/weapon/gun/projectile/automatic/crossbow/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
..()
/obj/item/weapon/gun/projectile/automatic/crossbow/attackby(var/obj/item/A, mob/user)
var/num_loaded = magazine.attackby(A, user, 1)
if(num_loaded)
user << "<span class='notice'>You load [num_loaded] bolt\s into \the [src].</span>"
update_icon()
chamber_round()
/obj/item/weapon/gun/projectile/automatic/crossbow/large //holds twice the ammo of mini crossbows but can't be pocketed
name = "auto crossbow"
desc = "A weapon favored by carp hunters. Fires specialized poison bolts."
icon_state = "crossbowlarge"
w_class = 3
force = 10
m_amt = 4000
suppressed = 0
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/crossbow/large
@@ -8,6 +8,7 @@
can_suppress = 1
burst_size = 1
fire_delay = 0
action_button_name = null
/obj/item/weapon/gun/projectile/automatic/pistol/update_icon()
..()
@@ -204,8 +204,9 @@
mag_type = /obj/item/ammo_box/magazine/m12g
fire_sound = 'sound/weapons/Gunshot.ogg'
can_suppress = 0
burst_size = 2
fire_delay = 1
burst_size = 1
fire_delay = 0
/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New()
..()
update_icon()
+5 -8
View File
@@ -8,15 +8,11 @@
flag = "laser"
eyeblur = 2
/obj/item/projectile/practice
name = "laser"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
/obj/item/projectile/beam/practice
name = "practice laser"
damage = 0
hitsound = null
damage_type = BURN
flag = "laser"
eyeblur = 2
nodamage = 1
/obj/item/projectile/beam/scatter
name = "laser pellet"
@@ -41,6 +37,7 @@
icon_state = "omnilaser"
damage = 36
damage_type = STAMINA
flag = "energy"
hitsound = 'sound/weapons/tap.ogg'
eyeblur = 0
@@ -93,4 +90,4 @@ obj/item/projectile/beam/emitter/Destroy()
/obj/item/projectile/lasertag/bluetag
icon_state = "bluelaser"
suit_types = list(/obj/item/clothing/suit/redtag)
suit_types = list(/obj/item/clothing/suit/redtag)
+15 -7
View File
@@ -7,14 +7,15 @@
flag = "bullet"
/obj/item/projectile/bullet/weakbullet
/obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage
damage = 5
stamina = 33
stamina = 80
/obj/item/projectile/bullet/weakbullet2
/obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down
damage = 15
stamina = 75 //the detective can't shoot in bursts and will get yelled at if he sinks 50 rounds into perps to stun 'em
weaken = 3
stamina = 50
/obj/item/projectile/bullet/weakbullet3
damage = 20
@@ -28,7 +29,8 @@
/obj/item/projectile/bullet/midbullet
damage = 20
stamina = 50 //two round bursts from the c20r
stamina = 65 //two round bursts from the c20r knocks people down
/obj/item/projectile/bullet/midbullet2
damage = 25
@@ -40,10 +42,16 @@
damage = 35
/obj/item/projectile/bullet/stunshot
/obj/item/projectile/bullet/stunshot //taser slugs for shotguns, nothing special
name = "stunshot"
damage = 5
stamina = 50 //two round bursts from the bulldog
stun = 5
weaken = 5
stutter = 5
jitter = 20
range = 7
icon_state = "spark"
color = "#FFFF00"
/obj/item/projectile/bullet/incendiary/on_hit(var/atom/target, var/blocked = 0)
..()
+14 -7
View File
@@ -4,18 +4,18 @@
damage = 0
damage_type = BURN
flag = "energy"
color = "#FFFF00"
/obj/item/projectile/energy/electrode
name = "electrode"
icon_state = "spark"
color = "#FFFF00"
nodamage = 1
stun = 5
weaken = 5
stutter = 5
jitter = 20
hitsound = "sparks"
hitsound = 'sound/weapons/taserhit.ogg'
range = 7
/obj/item/projectile/energy/electrode/on_hit(var/atom/target, var/blocked = 0)
@@ -51,7 +51,7 @@
weaken = 5
range = 7
/obj/item/projectile/energy/bolt //ebow bolts
/obj/item/projectile/energy/bolt //xbow bolts
name = "bolt"
icon_state = "cbbolt"
damage = 15
@@ -59,8 +59,15 @@
nodamage = 0
weaken = 5
stutter = 5
range = 10
range = 7
/obj/item/projectile/energy/bolt/large
name = "largebolt"
damage = 20
/obj/item/projectile/energy/bolt/on_hit(var/atom/target, var/blocked = 0) //drop a bolt on hitting basically anything
if(!proj_hit)
proj_hit = 1
new /obj/item/ammo_casing/caseless/bolt(src.loc)
..()
/obj/item/projectile/energy/bolt/on_range() //drop a bolt after 7 tiles
if(!proj_hit)
new /obj/item/ammo_casing/caseless/bolt(src.loc)
..()
+2 -1
View File
@@ -196,7 +196,7 @@ proc/wabbajack(mob/living/M)
if("magicarp") new_mob = new /mob/living/simple_animal/hostile/carp/ranged(M.loc)
if("chaosmagicarp") new_mob = new /mob/living/simple_animal/hostile/carp/ranged/chaos(M.loc)
else
var/animal = pick("parrot","corgi","crab","pug","cat","mouse","chicken","cow","lizard","chick")
var/animal = pick("parrot","corgi","crab","pug","cat","mouse","chicken","cow","lizard","chick","fox")
switch(animal)
if("parrot") new_mob = new /mob/living/simple_animal/parrot(M.loc)
if("corgi") new_mob = new /mob/living/simple_animal/corgi(M.loc)
@@ -207,6 +207,7 @@ proc/wabbajack(mob/living/M)
if("chicken") new_mob = new /mob/living/simple_animal/chicken(M.loc)
if("cow") new_mob = new /mob/living/simple_animal/cow(M.loc)
if("lizard") new_mob = new /mob/living/simple_animal/lizard(M.loc)
if("fox") new_mob = new /mob/living/simple_animal/fox(M.loc)
else new_mob = new /mob/living/simple_animal/chick(M.loc)
new_mob.languages |= HUMAN
if("human")
@@ -28,7 +28,6 @@
icon_state= "bolter"
damage = 60
flag = "bullet"
range = 7
/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0)
explosion(target, -1, 0, 2, 1, 0, flame_range = 3)
@@ -178,4 +177,4 @@ obj/item/projectile/kinetic/New()
/obj/item/projectile/bullet/frag12
name ="explosive slug"
damage = 25
weaken = 5
weaken = 5
@@ -0,0 +1,100 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/nicotine
name = "Nicotine"
id = "nicotine"
description = "Stun reduction per cycle, slight stamina regeneration buff. Overdoses become rapidly deadly."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
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)
if(volume > 35)
M << "You feel like you smoked too much."
M.adjustToxLoss(2*REM)
M.adjustOxyLoss(2*REM)
..()
return
datum/reagent/crank
name = "Crank"
id = "crank"
description = "2x stun reduction per cycle. Warms you up, makes you jittery as hell."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
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)
if(volume > 20)
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, occasional BRAIN and TOX damage."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
var/cycle_count = 0
var/overdosed
/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>"
if(prob(10))
M.adjustBrainLoss(rand(1,5)*REM)
M.adjustToxLoss(rand(1,5)*REM)
if(cycle_count == 10)
M.adjustBrainLoss(rand(1,10)*REM)
M.adjustToxLoss(rand(1,10)*REM)
if(cycle_count == 20)
M << "<span class='danger'>Your skin feels loose...</span>"
if(cycle_count == 50)
M << "<span class='userdanger'>Your skin falls off!</span>"
M.adjustBruteLoss(rand(10,30)*REM)
hardset_dna(M, null, null, null, null, /datum/species/skeleton)
if(volume > 20)
overdosed = 1
if(overdosed)
cycle_count++
..()
return
/datum/chemical_reaction/krokodil
name = "Krokodil"
id = "krokodil"
result = "krokodil"
required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorous" = 1, "fuel" = 1)
result_amount = 6
mix_message = "The mixture dries into a pale blue powder."
required_temp = 380
@@ -0,0 +1,381 @@
#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 = "100% chance per cycle of healing 2 points of BURN damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 2
datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.adjustFireLoss((volume-(volume*2))*REM)
M << "<span class='notice'>You feel your burns healing!</span>"
M.emote("scream")
if(method == INGEST)
M.adjustToxLoss(0.5*volume)
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
if(prob(55))
M.adjustFireLoss(-2*REM)
..()
return
datum/reagent/styptic_powder
name = "Styptic Powder"
id = "styptic_powder"
description = "100% chance per cycle of healing 2 points of BRUTE damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 2
datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.heal_organ_damage(volume*REM,0)
M << "<span class='notice'>You feel your wounds knitting back together!</span>"
M.emote("scream")
if(method == INGEST)
M.adjustToxLoss(0.5*volume)
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(-2*REM)
..()
return
datum/reagent/salglu_solution
name = "Saline-Glucose Solution"
id = "salglu_solution"
description = "100% chance per cycle of healing 1 point each of OXY and TOX damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob)
if(M.stat == DEAD)
return
if(!M) M = holder.my_atom
if(M.getOxyLoss()) M.adjustOxyLoss(-1*REM)
if(M.getToxLoss()) M.adjustToxLoss(-1*REM)
..()
return
datum/reagent/synthflesh
name = "Synthflesh"
id = "synthflesh"
description = "100% chance per cycle of healing 1 point each of BRUTE and BURN damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!M) M = holder.my_atom
if(method == TOUCH)
M.heal_organ_damage(volume*REM,0)
M.adjustFireLoss((volume-(volume*2)*REM))
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 2 TOX damage per cycle."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(-1.5*REM)
for(var/datum/reagent/R in M.reagents)
if(M != src)
M.reagents.remove_reagent(R.id,0.5)
..()
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 one each of OXY, TOX, BRUTE and BURN per cycle."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 0.2
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/calomel
name = "Calomel"
id = "calomel"
description = "Increases all depletion rates by 5. +5 TOX damage while health > 20."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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)
if(M != 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 = "80% chance of removing 1 RAD. Radiation is cumulative and causes tox+burn."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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 7 RAD, heals 4 TOX damage, increases all depletion rates by 4. 33% chance of taking 1 unit brute damage"
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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)
if(M != 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 BRUTE damage is under 50, 50% chance to heal one unit."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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/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 = "Heals 6 OXY damage, reduces LOSEBREATH by 4."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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 25 OXY damage, but you can't talk. 33% chance of healing 1 BRUTE and 1 BURN."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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 = "Stun reduction per cycle, increases run speed slightly, minor stamina regeneration buff, stabilizes crit."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 0.3
datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.status_flags |= GOTTAGOFAST
if(M.losebreath >= 10)
M.losebreath = max(10, M.losebreath-5)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
M.adjustStaminaLoss(-1*REM)
..()
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 = "Causes a little bit of drowsiness, reduces jitteriness. Raises histamine depletion rates by 3"
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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 = "Dramatically counters movement reduction from severe injury. Reduces jitteriness if someone is shaking like crazy from whatever. Will knock you out within 36 cycles if any remains in you."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
var/cycle_count = 0
datum/reagent/morphine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.status_flags |= GOTTAGOFAST
if(cycle_count == 36)
M.sleeping += 1
if(volume > 20)
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
cycle_count++
..()
return
@@ -0,0 +1,104 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/oil
name = "Oil"
id = "oil"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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" // rgb: 200, 165, 220
datum/reagent/iodine
name = "Iodine"
id = "iodine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/fluorine
name = "Fluorine"
id = "fluorine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/carpet
name = "Carpet"
id = "carpet"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/bromine
name = "Bromine"
id = "bromine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/phenol
name = "Phenol"
id = "phenol"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/ash
name = "Ash"
id = "ash"
description = "A burnt solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/acetone
name = "Acetone"
id = "acetone"
description = "A solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
/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
@@ -0,0 +1,119 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
/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 = "#60A584" // rgb: 96, 165, 132
/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
..()
return
/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/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
for(var/turf/simulated/turf in orange(1,T))
new /obj/effect/hotspot(turf)
return
/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume)
if(istype(T, /turf/simulated/floor/))
var/turf/simulated/floor/F = T
if(prob(66))
F.make_plating()
if(prob(11))
F.ChangeTurf(/turf/space)
return
/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == TOUCH)
M.adjust_fire_stacks(20)
return
/datum/reagent/sorium
name = "Sorium"
id = "sorium"
description = "Sends everything flying from the detonation point."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/chemical_reaction/sorium
name = "Sorium"
id = "sorium"
result = "sorium"
required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1)
result_amount = 4
required_temp = 474
/datum/reagent/sorium/reaction_turf(var/turf/simulated/T, var/volume)
if(istype(T, /turf/simulated/floor/))
goonchem_vortex(T, 1, 5, 3)
/datum/reagent/sorium/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == TOUCH)
var/turf/simulated/T = get_turf(M)
goonchem_vortex(T, 1, 5, 3)
/datum/chemical_reaction/sorium/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/reagent/liquid_dark_matter
name = "Liquid Dark Matter"
id = "liquid_dark_matter"
description = "Sucks everything into the detonation point."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/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
required_temp = 474
/datum/reagent/liquid_dark_matter/reaction_turf(var/turf/simulated/T, var/volume)
if(istype(T, /turf/simulated/floor/))
goonchem_vortex(T, 0, 5, 3)
return
/datum/reagent/liquid_dark_matter/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == TOUCH)
var/turf/simulated/T = get_turf(M)
goonchem_vortex(T, 0, 5, 3)
return
/datum/chemical_reaction/liquid_dark_matter/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
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, /atom/movable))
if((X))
if(setting_type)
for(var/i = 0, i < pull_times, i++)
step_towards(X,T)
else
X.throw_at(T)
@@ -0,0 +1,34 @@
/*
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
*/
@@ -0,0 +1,159 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/polonium
name = "Polonium"
id = "polonium"
description = "+8 RAD."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
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 = "Dose-dependent, ranges from annoying to incredibly lethal."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
metabolization_rate = 0.2
datum/reagent/histamine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(volume >= 20)
M.adjustOxyLoss(pick(5,10)*REM)
M.adjustBruteLoss(pick(5,10)*REM)
M.adjustToxLoss(pick(5,10)*REM)
if(volume < 20)
switch(pick(1, 2, 3))
if(1)
M << "<span class='danger'>You are unable to look straight!</span>"
M.Dizzy(10)
if(2)
M.emote("cough")
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
if(3)
M.adjustBruteLoss(5*REM)
..()
return
datum/reagent/formaldehyde
name = "Formaldehyde"
id = "formaldehyde"
description = "+1 TOX, 10% chance to decay into 5-15 units of histamine."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
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 = "Scaling TOX and BRUTE damage with dose. 25% chance to decay into 5-10 histamine."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
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 = "+1 TOX, +1 BRAIN up to 60 before it slows down, confusion, knockout after 17 elapsed cycles."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
var/cycle_count = 0
metabolization_rate = 1
datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob)
cycle_count++
if(!M) M = holder.my_atom
if(!(M.brainloss + M.toxloss) >= 60)
M.adjustBrainLoss(1*REM)
M.adjustToxLoss(1*REM)
if(cycle_count == 17)
M.sleeping += 1
..()
return
/datum/chemical_reaction/neurotoxin2
name = "neurotoxin2"
id = "neurotoxin2"
result = "neurotoxin2"
required_reagents = list("space_drugs" = 1)
result_amount = 1
required_temp = 200
datum/reagent/cyanide
name = "Cyanide"
id = "cyanide"
description = "+1.5 TOX, 10% chance of +1 LOSEBREATH, 8% chance of stun and extra +2 TOX."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
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.adjustOxyLoss(1*REM)
if(prob(8))
M.sleeping += 1
M.adjustToxLoss(4*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" // rgb: 207, 54, 0
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
+6 -3
View File
@@ -10,6 +10,7 @@ datum/reagents
var/total_volume = 0
var/maximum_volume = 100
var/atom/my_atom = null
var/chem_temp = 150
datum/reagents/New(maximum=100)
maximum_volume = maximum
@@ -232,6 +233,7 @@ datum/reagents/proc/handle_reactions()
var/matching_container = 0
var/matching_other = 0
var/list/multipliers = new/list()
var/required_temp = C.required_temp
for(var/B in C.required_reagents)
if(!has_reagent(B, C.required_reagents[B])) break
@@ -259,10 +261,11 @@ datum/reagents/proc/handle_reactions()
if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this
matching_other = 1
if(required_temp == 0)
required_temp = chem_temp
if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other)
if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp >= required_temp)
var/multiplier = min(multipliers)
for(var/B in C.required_reagents)
remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1)
@@ -277,7 +280,7 @@ datum/reagents/proc/handle_reactions()
if(!istype(my_atom, /mob)) // No bubbling mobs
for(var/mob/M in seen)
M << "<span class='notice'>\icon[my_atom] The solution begins to bubble.</span>"
M << "<span class='notice'>\icon[my_atom] [C.mix_message]</span>"
if(istype(my_atom, /obj/item/slime_extract))
var/obj/item/slime_extract/ME2 = my_atom
+85 -5
View File
@@ -11,16 +11,16 @@
icon_state = "dispenser"
use_power = 1
idle_power_usage = 40
var/energy = 50
var/max_energy = 50
var/energy = 100
var/max_energy = 100
var/amount = 30
var/beaker = null
var/recharged = 0
var/recharge_delay = 15 //Time it game ticks between recharges
var/recharge_delay = 5 //Time it game ticks between recharges
var/image/icon_beaker = null //cached overlay
var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine",
"sodium","aluminium","silicon","phosphorus","sulfur","chlorine","potassium","iron",
"copper","mercury","radium","water","ethanol","sugar","sacid")
"copper","mercury","radium","water","ethanol","sugar","sacid","fuel","silver","iodine","bromine","fluorine","stable_plasma")
/obj/machinery/chem_dispenser/proc/recharge()
if(stat & (BROKEN|NOPOWER)) return
@@ -108,7 +108,7 @@
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 390, 610)
ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 490, 710)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
@@ -276,6 +276,7 @@
spawn(rand(0, 15))
stat |= NOPOWER
/obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
if(default_unfasten_wrench(user, B))
@@ -422,6 +423,23 @@
else
var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc)
reagents.trans_to(P,50)
else if(href_list["createpatch"])
if(reagents.total_volume == 0) return
var/amount = 1
var/vol_each = min(reagents.total_volume, 50)
if(text2num(href_list["many"]))
amount = min(max(round(input(usr, "Amount:", "How many patches?") as num), 1), 10)
vol_each = min(reagents.total_volume/amount, 50)
var/name = reject_bad_text(input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)"))
var/obj/item/weapon/reagent_containers/pill/P
for(var/i = 0; i < amount; i++)
P = new/obj/item/weapon/reagent_containers/pill/patch(src.loc)
if(!name) name = reagents.get_master_reagent_name()
P.name = "[name] patch"
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
reagents.trans_to(P,vol_each)
src.updateUsrDialog()
return
@@ -479,6 +497,8 @@
if(!condi)
dat += "<HR><BR><A href='?src=\ref[src];createpill=1;many=0'>Create pill (50 units max)</A><BR>"
dat += "<A href='?src=\ref[src];createpill=1;many=1'>Create pills (10 pills max)</A><BR><BR>"
dat += "<HR><BR><A href='?src=\ref[src];createpatch=1;many=0'>Create patch (50 units max)</A><BR>"
dat += "<A href='?src=\ref[src];createpatch=1;many=1'>Create patches (10 patches max)</A><BR><BR>"
dat += "<A href='?src=\ref[src];createbottle=1'>Create bottle (30 units max)</A>"
else
dat += "<HR><BR><A href='?src=\ref[src];createpill=1'>Create pack (10 units max)</A><BR>"
@@ -1238,3 +1258,63 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
O.reagents.trans_to(beaker, amount)
if(!O.reagents.total_volume)
remove_object(O)
/obj/machinery/chem_heater
name = "chemical heater"
density = 1
anchored = 1
icon = 'icons/obj/chemical.dmi'
icon_state = "mixer0b"
use_power = 1
idle_power_usage = 40
var/energy = 50
var/max_energy = 50
var/amount = 30
var/obj/item/weapon/reagent_containers/beaker = null
var/set_temp
var/temperature
var/on = FALSE
/obj/machinery/chem_heater/process()
..()
if(on)
if(beaker)
if(beaker.reagents.chem_temp > temperature)
beaker.reagents.chem_temp -= 2
if(beaker.reagents.chem_temp < temperature)
beaker.reagents.chem_temp += 2
if(beaker.reagents.chem_temp == temperature)
beaker.loc = get_turf(src)
beaker.reagents.handle_reactions()
beaker = null
icon_state = "mixer0b"
on = FALSE
/obj/machinery/chem_heater/attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
if(isrobot(user))
return
if(!istype(B, /obj/item/weapon/reagent_containers/glass))
return
if(src.beaker)
user << "A beaker is already loaded into the machine."
return
src.beaker = B
user.drop_item()
B.loc = src
user << "You add the beaker to the machine!"
icon_state = "mixer1b"
/obj/machinery/chem_heater/attack_hand(var/mob/user as mob)
if(!beaker)
user << "Please insert a beaker."
return
temperature = input("Please input desired temperature between 1 and 3000.", name, set_temp) as num
if(temperature > 3000 || temperature < 1)
user << "Invalid temperature."
return
user << "Adjusting chemical temperature..."
on = TRUE
@@ -0,0 +1,151 @@
// These can only be applied by blobs. They are what blobs are made out of.
// The 4 damage
datum/reagent/blob/boiling_oil
name = "Boiling Oil"
id = "boiling_oil"
description = ""
color = "#B68D00"
datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.apply_damage(15, BURN)
M.adjust_fire_stacks(2)
M.IgniteMob()
M << "<span class = 'userdanger'>The blob splashes you with burning oil!</span>"
M.emote("scream")
datum/reagent/blob/toxic_goop
name = "Toxic Goop"
id = "toxic_goop"
description = ""
color = "#008000"
datum/reagent/blob/toxic_goop/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.apply_damage(20, TOX)
M << "<span class = 'userdanger'>The blob strikes you, and you feel sick and nauseated!</span>"
datum/reagent/blob/skin_ripper
name = "Skin Ripper"
id = "skin_ripper"
description = ""
color = "#FF4C4C"
datum/reagent/blob/skin_ripper/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.apply_damage(20, BRUTE)
M << "<span class = 'userdanger'>The blob strikes you, and you feel your skin ripping and tearing off!</span>"
M.emote("scream")
// Combo Reagents
datum/reagent/blob/skin_melter
name = "Skin Melter"
id = "skin_melter"
description = ""
color = "#7F0000"
datum/reagent/blob/skin_melter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.apply_damage(10, BRUTE)
M.apply_damage(10, BURN)
M.adjust_fire_stacks(2)
M.IgniteMob()
M << "<span class = 'userdanger'>The blob strikes you, and you feel your skin char and melt!</span>"
M.emote("scream")
datum/reagent/blob/lung_destroying_toxin
name = "Lung Destroying Toxin"
id = "lung_destroying_toxin"
description = ""
color = "#00FFC5"
datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.apply_damage(20, OXY)
M.apply_damage(20, TOX)
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)
if(method == TOUCH)
M.acid_act(20,1,10)
M.apply_damage(10, BRUTE)
M << "<span class = 'userdanger'>The blob's tendrils melt though your equipment!</span>"
datum/reagent/blob/radioactive_liquid
name = "Radioactive Liquid"
id = "radioactive_liquid"
description = ""
color = "#00EE00"
datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
if(istype(M, /mob/living/carbon/human))
M.apply_damage(10, BRUTE)
M.apply_effect(10,IRRADIATE,0)
if(prob(33))
randmuti(M)
if(prob(98))
randmutb(M)
else
randmutg(M)
domutcheck(M, null)
updateappearance(M)
M << "<span class = 'userdanger'>The blob strikes you, and your skin feels papery and everything hurts!</span>"
datum/reagent/blob/dark_matter
name = "Dark Matter"
id = "dark_matter"
description = ""
color = "#61407E"
datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.apply_damage(15, BRUTE)
reagent_vortex(M, 0)
M << "<span class = 'userdanger'>You feel a thrum as the blob strikes you, and everything flies at you!</span>"
datum/reagent/blob/b_sorium
name = "Sorium"
id = "b_sorium"
description = ""
color = "#808000"
datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.apply_damage(15, BRUTE)
M << "<span class = 'userdanger'>The blob slams into you, and sends you flying!</span>"
reagent_vortex(M, 1)
datum/reagent/blob/explosive // I'm gonna burn in hell for this one
name = "Explosive Gelatin"
id = "explosive"
description = ""
color = "#FFA500"
datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
if(prob(75))
M << "<span class = 'userdanger'>The blob strikes you, and its tendrils explode!</span>"
explosion(M.loc, 0, 0, 1, 0, 0)
/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))
if(istype(X, /atom/movable))
if((X))
if(setting_type)
step_away(X,pull)
step_away(X,pull)
step_away(X,pull)
step_away(X,pull)
else
X.throw_at(pull)
@@ -23,6 +23,7 @@ datum/reagent
//var/list/viruses = list()
var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
var/metabolization_rate = REAGENTS_METABOLISM
var/overrides_metab = 0
datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //By default we have a chance to transfer some
if(!istype(M, /mob/living))
@@ -51,7 +51,7 @@ datum/reagent/consumable/sugar
description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste."
reagent_state = SOLID
color = "#FFFFFF" // rgb: 255, 255, 255
nutriment_factor = 10 * REAGENTS_METABOLISM
nutriment_factor = 15 * REAGENTS_METABOLISM
metabolization_rate = 2 * REAGENTS_METABOLISM
datum/reagent/consumable/sugar/on_mob_life(var/mob/living/M as mob)
@@ -304,8 +304,7 @@ datum/reagent/medicine/inacusiate
color = "#6600FF" // rgb: 100, 165, 255
datum/reagent/medicine/inacusiate/on_mob_life(var/mob/living/M as mob)
M.ear_damage = 0
M.ear_deaf = 0
M.setEarDamage(0,0)
..()
return
@@ -121,19 +121,6 @@ datum/reagent/toxin/slimejelly/on_mob_life(var/mob/living/M as mob)
..()
return
datum/reagent/toxin/cyanide
name = "Cyanide"
id = "cyanide"
description = "A highly toxic chemical."
color = "#CF3600" // rgb: 207, 54, 0
toxpwr = 3
datum/reagent/toxin/cyanide/on_mob_life(var/mob/living/M as mob)
M.adjustOxyLoss(3*REM)
M.sleeping += 1
..()
return
datum/reagent/toxin/minttoxin
name = "Mint Toxin"
id = "minttoxin"
@@ -14,6 +14,9 @@
var/secondary = 0 // set to nonzero if secondary reaction
var/mob_react = 0 //Determines if a chemical reaction can occur inside a mob
var/required_temp = 0
var/mix_message = "The solution begins to bubble."
/datum/chemical_reaction/proc/on_reaction(var/datum/reagents/holder, var/created_volume)
return
@@ -4,19 +4,19 @@
////////////////////////////////////////////////////////////////////////////////
/obj/item/weapon/reagent_containers/glass
name = "glass"
icon = 'icons/obj/chemical.dmi'
icon_state = "null"
item_state = "null"
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5, 10, 15, 25, 30, 50)
volume = 50
flags = OPENCONTAINER
var/list/can_be_placed_into = list(
can_be_placed_into = list(
/obj/machinery/chem_master/,
/obj/machinery/chem_dispenser/,
/obj/machinery/chem_heater/,
/obj/machinery/reagentgrinder,
/obj/machinery/biogenerator,
/obj/structure/table,
/obj/structure/rack,
/obj/structure/closet,
/obj/structure/sink,
/obj/item/weapon/storage,
@@ -35,10 +35,7 @@
/obj/item/weapon/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
if(!proximity) return // not adjacent
for(var/type in can_be_placed_into)
if(istype(target, type))
return
if((!proximity) || !check_allowed_items(target)) return
if(ismob(target) && target.reagents && reagents.total_volume)
var/mob/M = target
@@ -4,345 +4,259 @@
/obj/item/weapon/reagent_containers/glass/bottle
name = "bottle"
desc = "A small bottle."
icon = 'icons/obj/chemical.dmi'
icon_state = null
item_state = "atoxinbottle"
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30)
flags = OPENCONTAINER
volume = 30
var/spawned_reagent = null
var/spawned_amount = 30
var/spawned_disease = null
/obj/item/weapon/reagent_containers/glass/bottle/New()
..()
if(!icon_state)
icon_state = "bottle[rand(1,20)]"
if(spawned_disease)
var/datum/disease/F = new spawned_disease(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
if(spawned_reagent && spawned_amount)
reagents.add_reagent("[spawned_reagent]", spawned_amount)
New()
..()
if(!icon_state)
icon_state = "bottle[rand(1,20)]"
/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline
name = "inaprovaline bottle"
desc = "A small bottle. Contains inaprovaline - used to stabilize patients."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
New()
..()
reagents.add_reagent("inaprovaline", 30)
spawned_reagent = "inaprovaline"
/obj/item/weapon/reagent_containers/glass/bottle/toxin
name = "toxin bottle"
desc = "A small bottle of toxins. Do not drink, it is poisonous."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle12"
New()
..()
reagents.add_reagent("toxin", 30)
spawned_reagent = "toxin"
/obj/item/weapon/reagent_containers/glass/bottle/cyanide
name = "cyanide bottle"
desc = "A small bottle of cyanide. Bitter almonds?"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle12"
New()
..()
reagents.add_reagent("cyanide", 30)
spawned_reagent = "cyanide"
/obj/item/weapon/reagent_containers/glass/bottle/stoxin
name = "sleep-toxin bottle"
desc = "A small bottle of sleep toxins. Just the fumes make you sleepy."
icon_state = "bottle20"
spawned_reagent = "stoxin"
/obj/item/weapon/reagent_containers/glass/bottle/morphine
name = "morphine bottle"
desc = "A small bottle of morphine."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle20"
New()
..()
reagents.add_reagent("stoxin", 30)
spawned_reagent = "morphine"
/obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate
name = "Chloral Hydrate Bottle"
desc = "A small bottle of Choral Hydrate. Mickey's Favorite!"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle20"
New()
..()
reagents.add_reagent("chloralhydrate", 15) //Intentionally low since it is so strong. Still enough to knock someone out.
spawned_reagent = "chloralhydrate"
spawned_amount = 15
/obj/item/weapon/reagent_containers/glass/bottle/antitoxin
name = "anti-toxin bottle"
desc = "A small bottle of Anti-toxins. Counters poisons, and repairs damage, a wonder drug."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
New()
..()
reagents.add_reagent("anti_toxin", 30)
spawned_reagent = "anti_toxin"
/obj/item/weapon/reagent_containers/glass/bottle/mutagen
name = "unstable mutagen bottle"
desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle20"
New()
..()
reagents.add_reagent("mutagen", 30)
spawned_reagent = "mutagen"
/obj/item/weapon/reagent_containers/glass/bottle/plasma
name = "liquid plasma bottle"
desc = "A small bottle of liquid plasma. Extremely toxic and reacts with micro-organisms inside blood."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle8"
New()
..()
reagents.add_reagent("plasma", 30)
spawned_reagent = "plasma"
/obj/item/weapon/reagent_containers/glass/bottle/synaptizine
name = "synaptizine bottle"
desc = "A small bottle of synaptizine."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle20"
New()
..()
reagents.add_reagent("synaptizine", 30)
spawned_reagent = "synaptizine"
/obj/item/weapon/reagent_containers/glass/bottle/ammonia
name = "ammonia bottle"
desc = "A small bottle."
icon = 'icons/obj/chemical.dmi'
desc = "A small bottle of ammonia."
icon_state = "bottle20"
New()
..()
reagents.add_reagent("ammonia", 30)
spawned_reagent = "ammonia"
/obj/item/weapon/reagent_containers/glass/bottle/diethylamine
name = "diethylamine bottle"
desc = "A small bottle."
icon = 'icons/obj/chemical.dmi'
desc = "A small bottle of diethylamine."
icon_state = "bottle17"
New()
..()
reagents.add_reagent("diethylamine", 30)
/obj/item/weapon/reagent_containers/glass/bottle/flu_virion
name = "Flu virion culture bottle"
desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/advance/flu(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion
name = "Epiglottis virion culture bottle"
desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/advance/voice_change(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion
name = "Liver enhancement virion culture bottle"
desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/advance/heal(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/hullucigen_virion
name = "Hullucigen virion culture bottle"
desc = "A small bottle. Contains hullucigen virion culture in synthblood medium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/advance/hullucigen(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat
name = "Pierrot's Throat culture bottle"
desc = "A small bottle. Contains H0NI<42 virion culture in synthblood medium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/pierrot_throat(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/cold
name = "Rhinovirus culture bottle"
desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/advance/F = new /datum/disease/advance/cold(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/random
name = "Random culture bottle"
desc = "A small bottle. Contains a random disease."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/advance/F = new(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/retrovirus
name = "Retrovirus culture bottle"
desc = "A small bottle. Contains a retrovirus culture in a synthblood medium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/dna_retrovirus(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/gbs
name = "GBS culture bottle"
desc = "A small bottle. Contains Gravitokinetic Bipotential SADS+ culture in synthblood medium."//Or simply - General BullShit
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
amount_per_transfer_from_this = 5
New()
..()
var/datum/disease/F = new /datum/disease/gbs
var/list/data = list("virus"= F)
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs
name = "GBS culture bottle"
desc = "A small bottle. Contains Gravitokinetic Bipotential SADS- culture in synthblood medium."//Or simply - General BullShit
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/fake_gbs(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/*
/obj/item/weapon/reagent_containers/glass/bottle/rhumba_beat
name = "Rhumba Beat culture bottle"
desc = "A small bottle. Contains The Rhumba Beat culture in synthblood medium."//Or simply - General BullShit
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
amount_per_transfer_from_this = 5
New()
..()
var/datum/disease/F = new /datum/disease/rhumba_beat
var/list/data = list("virus"= F)
R.add_reagent("blood", 20, data)
*/
/obj/item/weapon/reagent_containers/glass/bottle/brainrot
name = "Brainrot culture bottle"
desc = "A small bottle. Contains Cryptococcus Cosmosis culture in synthblood medium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/brainrot(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/magnitis
name = "Magnitis culture bottle"
desc = "A small bottle. Contains a small dosage of Fukkos Miracos."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/magnitis(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/wizarditis
name = "Wizarditis culture bottle"
desc = "A small bottle. Contains a sample of Rincewindus Vulgaris."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/wizarditis(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/anxiety
name = "Severe Anxiety culture bottle"
desc = "A small bottle. Contains a sample of Lepidopticides."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/anxiety(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
/obj/item/weapon/reagent_containers/glass/bottle/beesease
name = "Beesease culture bottle"
desc = "A small bottle. Contains a sample of invasive Apidae."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
var/datum/disease/F = new /datum/disease/beesease(0)
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", 20, data)
spawned_reagent = "diethylamine"
/obj/item/weapon/reagent_containers/glass/bottle/pacid
name = "Polytrinic Acid Bottle"
desc = "A small bottle. Contains a small amount of Polytrinic Acid"
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
New()
..()
reagents.add_reagent("pacid", 30)
spawned_reagent = "pacid"
/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine
name = "Adminordrazine Bottle"
desc = "A small bottle. Contains the liquid essence of the gods."
icon = 'icons/obj/drinks.dmi'
icon_state = "holyflask"
New()
..()
reagents.add_reagent("adminordrazine", 30)
spawned_reagent = "adminordrazine"
/obj/item/weapon/reagent_containers/glass/bottle/capsaicin
name = "Capsaicin Bottle"
desc = "A small bottle. Contains hot sauce."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
New()
..()
reagents.add_reagent("capsaicin", 30)
spawned_reagent = "capsaicin"
/obj/item/weapon/reagent_containers/glass/bottle/frostoil
name = "Frost Oil Bottle"
desc = "A small bottle. Contains cold sauce."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
New()
..()
reagents.add_reagent("frostoil", 30)
spawned_reagent = "frostoil"
/obj/item/weapon/reagent_containers/glass/bottle/flu_virion
name = "Flu virion culture bottle"
desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium."
icon_state = "bottle3"
spawned_disease = /datum/disease/advance/flu
/obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion
name = "Epiglottis virion culture bottle"
desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium."
icon_state = "bottle3"
spawned_disease = /datum/disease/advance/voice_change
/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion
name = "Liver enhancement virion culture bottle"
desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium."
icon_state = "bottle3"
spawned_disease = /datum/disease/advance/heal
/obj/item/weapon/reagent_containers/glass/bottle/hullucigen_virion
name = "Hullucigen virion culture bottle"
desc = "A small bottle. Contains hullucigen virion culture in synthblood medium."
icon_state = "bottle3"
spawned_disease = /datum/disease/advance/hullucigen
/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat
name = "Pierrot's Throat culture bottle"
desc = "A small bottle. Contains H0NI<42 virion culture in synthblood medium."
icon_state = "bottle3"
spawned_disease = /datum/disease/pierrot_throat
/obj/item/weapon/reagent_containers/glass/bottle/cold
name = "Rhinovirus culture bottle"
desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium."
icon_state = "bottle3"
spawned_disease = /datum/disease/advance/cold
/obj/item/weapon/reagent_containers/glass/bottle/retrovirus
name = "Retrovirus culture bottle"
desc = "A small bottle. Contains a retrovirus culture in a synthblood medium."
icon_state = "bottle3"
spawned_disease = /datum/disease/dna_retrovirus
/obj/item/weapon/reagent_containers/glass/bottle/gbs
name = "GBS culture bottle"
desc = "A small bottle. Contains Gravitokinetic Bipotential SADS+ culture in synthblood medium."//Or simply - General BullShit
icon_state = "bottle3"
amount_per_transfer_from_this = 5
spawned_disease = /datum/disease/gbs
/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs
name = "GBS culture bottle"
desc = "A small bottle. Contains Gravitokinetic Bipotential SADS- culture in synthblood medium."//Or simply - General BullShit
icon_state = "bottle3"
spawned_disease = /datum/disease/fake_gbs
/obj/item/weapon/reagent_containers/glass/bottle/brainrot
name = "Brainrot culture bottle"
desc = "A small bottle. Contains Cryptococcus Cosmosis culture in synthblood medium."
icon_state = "bottle3"
spawned_disease = /datum/disease/brainrot
/obj/item/weapon/reagent_containers/glass/bottle/magnitis
name = "Magnitis culture bottle"
desc = "A small bottle. Contains a small dosage of Fukkos Miracos."
icon_state = "bottle3"
spawned_disease = /datum/disease/magnitis
/obj/item/weapon/reagent_containers/glass/bottle/wizarditis
name = "Wizarditis culture bottle"
desc = "A small bottle. Contains a sample of Rincewindus Vulgaris."
icon_state = "bottle3"
spawned_disease = /datum/disease/wizarditis
/obj/item/weapon/reagent_containers/glass/bottle/anxiety
name = "Severe Anxiety culture bottle"
desc = "A small bottle. Contains a sample of Lepidopticides."
icon_state = "bottle3"
spawned_disease = /datum/disease/anxiety
/obj/item/weapon/reagent_containers/glass/bottle/traitor
name = "syndicate bottle"
desc = "A small bottle. Contains a random nasty chemical."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
/obj/item/weapon/reagent_containers/glass/bottle/traitor/New()
..()
var/new_reagent = pick("polonium", "histamine", "formaldehyde", "venom", "neurotoxin2", "cyanide")
reagents.add_reagent(new_reagent, 50)
/obj/item/weapon/reagent_containers/glass/bottle/polonium
name = "polonium bottle"
desc = "A small bottle. Contains Polonium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "polonium"
/obj/item/weapon/reagent_containers/glass/bottle/venom
name = "venom bottle"
desc = "A small bottle. Contains Venom."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "venom"
/obj/item/weapon/reagent_containers/glass/bottle/neurotoxin2
name = "neurotoxin bottle"
desc = "A small bottle. Contains Neurotoxin."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "neurotoxin2"
/obj/item/weapon/reagent_containers/glass/bottle/formaldehyde
name = "formaldehyde bottle"
desc = "A small bottle. Contains Formaldehyde."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "formaldehyde"
/obj/item/weapon/reagent_containers/glass/bottle/cyanide
name = "cyanide bottle"
desc = "A small bottle. Contains Cyanide."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "cyanide"
/obj/item/weapon/reagent_containers/glass/bottle/histamine
name = "histamine bottle"
desc = "A small bottle. Contains Histamine."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "histamine"
/obj/item/weapon/reagent_containers/glass/bottle/beesease
name = "Beesease culture bottle"
desc = "A small bottle. Contains a sample of invasive Apidae."
icon_state = "bottle3"
spawned_disease = /datum/disease/beesease
@@ -1,33 +0,0 @@
/obj/item/weapon/reagent_containers/glass/bottle/robot
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30,50,100)
flags = OPENCONTAINER
volume = 60
var/reagent = ""
/obj/item/weapon/reagent_containers/glass/bottle/robot/inaprovaline
name = "internal inaprovaline bottle"
desc = "A small bottle. Contains inaprovaline - used to stabilize patients."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
reagent = "inaprovaline"
New()
..()
reagents.add_reagent("inaprovaline", 60)
return
/obj/item/weapon/reagent_containers/glass/bottle/robot/antitoxin
name = "internal anti-toxin bottle"
desc = "A small bottle of Anti-toxins. Counters poisons, and repairs damage, a wonder drug."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
reagent = "anti_toxin"
New()
..()
reagents.add_reagent("anti_toxin", 60)
return
@@ -69,10 +69,12 @@
volume = 10
ignore_flags = 1 //so you can medipen through hardsuits
flags = null
var/starting_reagent = "inaprovaline"
var/starting_amount = 10
/obj/item/weapon/reagent_containers/hypospray/medipen/New()
..()
reagents.add_reagent("inaprovaline", 10)
reagents.add_reagent(starting_reagent, starting_amount)
update_icon()
return
@@ -100,11 +102,11 @@
name = "leporazine medipen"
desc = "A rapid way to regulate your body's temperature in the event of a hardsuit malfunction at the cost of some shortness of breath."
icon_state = "lepopen"
starting_reagent = "leporazine"
starting_amount = 9
/obj/item/weapon/reagent_containers/hypospray/medipen/leporazine/New()
..()
reagents.remove_reagent("inaprovaline", 10)
reagents.add_reagent("leporazine", 9)
reagents.add_reagent("lexorin", 1)
update_icon()
return
@@ -113,11 +115,23 @@
name = "stimpack medipen"
desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor at the cost of some shortness of breath."
icon_state = "stimpen"
starting_reagent = "hyperzine"
starting_amount = 9
/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack/New()
..()
reagents.remove_reagent("inaprovaline", 10)
reagents.add_reagent("hyperzine", 9)
reagents.add_reagent("lexorin", 1)
update_icon()
return
return
/obj/item/weapon/reagent_containers/hypospray/medipen/morphine
name = "morphine medipen"
desc = "A rapid way to get you out of a tight situation and fast! You'll feel rather drowsy, though."
icon_state = "medipen"
starting_reagent = "morphine"
/obj/item/weapon/reagent_containers/hypospray/medipen/ephedrine
name = "ephedrine medipen"
desc = "A rapid way to get you up and out of a tight situation and fast!"
icon_state = "medipen"
starting_reagent = "ephedrine"
@@ -0,0 +1,17 @@
/obj/item/weapon/reagent_containers/pill/patch
name = "chemical patch"
desc = "A chemical patch for touch based applications."
icon = 'icons/obj/chemical.dmi'
icon_state = "bandaid"
item_state = "bandaid"
possible_transfer_amounts = null
volume = 50
apply_type = TOUCH
apply_method = "apply"
/obj/item/weapon/reagent_containers/pill/patch/New()
..()
icon_state = "bandaid" // thanks inheritance
/obj/item/weapon/reagent_containers/pill/patch/afterattack(obj/target, mob/user , proximity)
return // thanks inheritance again
@@ -9,6 +9,8 @@
item_state = "pill"
possible_transfer_amounts = null
volume = 50
var/apply_type = INGEST
var/apply_method = "swallow"
/obj/item/weapon/reagent_containers/pill/New()
..()
@@ -25,16 +27,16 @@
return 0
if(M == user)
M << "<span class='notice'>You swallow [src].</span>"
M << "<span class='notice'>You [apply_method] [src].</span>"
else
M.visible_message("<span class='danger'>[user] attempts to force [M] to swallow [src].</span>", \
"<span class='userdanger'>[user] attempts to force [M] to swallow [src].</span>")
M.visible_message("<span class='danger'>[user] attempts to force [M] to [apply_method] [src].</span>", \
"<span class='userdanger'>[user] attempts to force [M] to [apply_method] [src].</span>")
if(!do_mob(user, M)) return
M.visible_message("<span class='danger'>[user] forces [M] to swallow [src].</span>", \
"<span class='userdanger'>[user] forces [M] to swallow [src].</span>")
M.visible_message("<span class='danger'>[user] forces [M] to [apply_method] [src].</span>", \
"<span class='userdanger'>[user] forces [M] to [apply_method] [src].</span>")
user.unEquip(src) //icon update
@@ -42,7 +44,7 @@
loc = M //Put the pill inside the mob. This fixes the issue where the pill appears to drop to the ground after someone eats it.
if(reagents.total_volume)
reagents.reaction(M, INGEST)
reagents.reaction(M, apply_type)
spawn(5)
reagents.trans_to(M, reagents.total_volume)
qdel(src)
@@ -75,7 +75,7 @@
req_tech = list("combat" = 5, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1500, "$uranium" = 1500, "$silver" = 1500)
build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow
build_path = /obj/item/weapon/gun/projectile/automatic/crossbow/large
locked = 1
category = list("Weapons")
+5
View File
@@ -546,7 +546,12 @@
/turf/proc/copyTurf(turf/T)
if(T.type != type)
var/image/I
if(underlays.len) //we have underlays, which implies some sort of transparency, so we want to a snapshot of the previous turf as an underlay
I = image(T.icon, T.icon_state)
T = new type(T)
if(I)
T.underlays.Add(I)
if(T.icon_state != icon_state)
T.icon_state = icon_state
if(T.icon != icon)