Merge remote-tracking branch 'upstream/master' into tgcam

Conflicts:
	code/modules/mob/living/carbon/human/human.dm
This commit is contained in:
Tigercat2000
2016-03-14 14:45:21 -07:00
131 changed files with 3136 additions and 2087 deletions
@@ -157,7 +157,7 @@
layer = 3
icon = 'icons/mob/blob.dmi'
icon_state = "blobpod"
var/triggerproc = "explode" //name of the proc thats called when the mine is triggered
var/triggerproc = "triggerrad1" //name of the proc thats called when the mine is triggered
var/triggered = 0
/obj/effect/meatgrinder/New()
@@ -184,11 +184,6 @@
explosion(mob, 1, 0, 0, 0)
qdel(src)
/*/obj/effect/meatgrinder
name = "Meat Grinder"
icon_state = "blob"
triggerproc = "triggerrad1"*/
/////For the Wishgranter///////////
+3
View File
@@ -47,6 +47,9 @@ proc/createRandomZlevel()
for(var/turf/T in turfs)
if(T.dynamic_lighting)
T.lighting_build_overlays()
for(var/obj/structure/cable/PC in T)
makepowernet_for(PC)
smooth_zlevel(world.maxz)
log_to_dd("Away mission loaded: [map]")
for(var/obj/effect/landmark/L in landmarks_list)
+8 -15
View File
@@ -4,20 +4,20 @@
#define PLANTS_PER_TICK 500 // Cap on number of plant segments processed.
#define PLANT_TICK_TIME 75 // Number of ticks between the plant processor cycling.
// Debug for testing seed genes.
// Debug for testing seed genes (less useful now that the obfuscation is gone, but still might be useful for the future.
/client/proc/show_plant_genes()
set category = "Debug"
set name = "Show Plant Genes"
set desc = "Prints the round's plant gene masks."
set desc = "Prints the round's plant gene tags."
if(!holder) return
if(!plant_controller || !plant_controller.gene_tag_masks)
usr << "Gene masks not set."
if(!plant_controller || !plant_controller.gene_tag_list)
usr << "Gene tags not set."
return
for(var/mask in plant_controller.gene_tag_masks)
usr << "[mask]: [plant_controller.gene_tag_masks[mask]]"
for(var/gene_tag in plant_controller.gene_tag_list)
usr << "[gene_tag]"
var/global/datum/controller/plants/plant_controller // Set in New().
@@ -28,7 +28,7 @@ var/global/datum/controller/plants/plant_controller // Set in New().
var/list/product_descs = list() // Stores generated fruit descs.
var/list/plant_queue = list() // All queued plants.
var/list/seeds = list() // All seed data stored here.
var/list/gene_tag_masks = list() // Gene obfuscation for delicious trial and error goodness.
var/list/gene_tag_list = list() // List of gene tags for xenobotany fun
var/list/plant_icon_cache = list() // Stores images of growth, fruits and seeds.
var/list/plant_sprites = list() // List of all harvested product sprites.
var/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages.
@@ -83,18 +83,11 @@ var/global/datum/controller/plants/plant_controller // Set in New().
S.update_seed()
//Might as well mask the gene types while we're at it.
var/list/used_masks = list()
var/list/plant_traits = ALL_GENES
while(plant_traits && plant_traits.len)
var/gene_tag = pick(plant_traits)
var/gene_mask = "[uppertext(num2hex(rand(0,255)))]"
while(gene_mask in used_masks)
gene_mask = "[uppertext(num2hex(rand(0,255)))]"
used_masks += gene_mask
plant_traits -= gene_tag
gene_tag_masks[gene_tag] = gene_mask
gene_tag_list.Add(gene_tag)
// Proc for creating a random seed type.
/datum/controller/plants/proc/create_random_seed(var/survive_on_station)
+47 -7
View File
@@ -136,6 +136,26 @@
var/datum/seed/genetics // Currently scanned seed genetic structure.
var/degradation = 0 // Increments with each scan, stops allowing gene mods after a certain point.
var/degrade_lower = 20
var/degrade_upper = 60
/obj/machinery/botany/extractor/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/botany_extractor(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
RefreshParts()
/obj/machinery/botany/extractor/RefreshParts()
var/tier = 1
for (var/obj/item/weapon/stock_parts/scanning_module/S in component_parts)
tier = S.rating
degrade_lower = 25 - (tier * 5) //Tier 1: 20, Tier 4: 5
degrade_upper = 70 - (tier * 10) //Tier 1: 60, Tier 4: 30
/obj/machinery/botany/extractor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
@@ -144,8 +164,8 @@
var/list/data = list()
var/list/geneMasks[0]
for(var/gene_tag in plant_controller.gene_tag_masks)
geneMasks.Add(list(list("tag" = gene_tag, "mask" = plant_controller.gene_tag_masks[gene_tag])))
for(var/gene_tag in plant_controller.gene_tag_list)
geneMasks.Add(gene_tag)
data["geneMasks"] = geneMasks
data["activity"] = active
@@ -242,11 +262,11 @@
if(!genetics.roundstart)
loaded_disk.genesource += " (variety #[genetics.uid])"
loaded_disk.name += " ([plant_controller.gene_tag_masks[href_list["get_gene"]]], #[genetics.uid])"
loaded_disk.desc += " The label reads \'gene [plant_controller.gene_tag_masks[href_list["get_gene"]]], sampled from [genetics.display_name]\'."
loaded_disk.name += " ([href_list["get_gene"]], #[genetics.uid])"
loaded_disk.desc += " The label reads \'[href_list["get_gene"]] gene, sampled from [genetics.display_name]\'."
eject_disk = 1
degradation += rand(20,60)
degradation += rand(degrade_lower, degrade_upper)
if(degradation >= 100)
failed_task = 1
genetics = null
@@ -267,6 +287,26 @@
icon_state = "traitgun"
disk_needs_genes = 1
var/degrade_lower = 5
var/degrade_upper = 10
/obj/machinery/botany/editor/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/botany_editor(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
RefreshParts()
/obj/machinery/botany/editor/RefreshParts()
var/tier = 1
for (var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
tier = M.rating
degrade_lower = 6 - tier //Tier 1: 5, Tier 4: 1
degrade_upper = 11 - tier //Tier 1: 10, Tier 4: 6
/obj/machinery/botany/editor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
@@ -288,7 +328,7 @@
for(var/datum/plantgene/P in loaded_disk.genes)
if(data["locus"] != "") data["locus"] += ", "
data["locus"] += "[plant_controller.gene_tag_masks[P.genetype]]"
data["locus"] += "[plant_controller.gene_tag_list[P.genetype]]"
else
data["disk"] = 0
@@ -329,7 +369,7 @@
for(var/datum/plantgene/gene in loaded_disk.genes)
seed.seed.apply_gene(gene)
seed.modified += rand(5,10)
seed.modified += rand(degrade_lower, degrade_upper)
usr.set_machine(src)
src.add_fingerprint(usr)
+2 -1
View File
@@ -653,13 +653,14 @@
/**********************Facehugger toy**********************/
/obj/item/clothing/mask/facehugger/toy
item_state = "facehugger_inactive"
desc = "A toy often used to play pranks on other miners by putting it in their beds. It takes a bit to recharge after latching onto something."
throwforce = 0
real = 0
sterile = 1
tint = 3 //Makes it feel more authentic when it latches on
/obj/item/clothing/mask/facehugger/toy/death()
/obj/item/clothing/mask/facehugger/toy/Die()
return
+4 -1
View File
@@ -64,4 +64,7 @@
name = "North Mining Outpost"
/area/mine/west_outpost
name = "West Mining Outpost"
name = "West Mining Outpost"
/area/mine/podbay
name = "Mining Podbay"
+2 -2
View File
@@ -1,12 +1,12 @@
#define EMOTE_COOLDOWN 20 //Time in deciseconds that the cooldown lasts
//Emote Cooldown System (it's so simple!)
/mob/proc/handle_emote_CD()
/mob/proc/handle_emote_CD(cooldown = EMOTE_COOLDOWN)
if(emote_cd == 2) return 1 // Cooldown emotes were disabled by an admin, prevent use
if(src.emote_cd == 1) return 1 // Already on CD, prevent use
src.emote_cd = 1 // Starting cooldown
spawn(EMOTE_COOLDOWN)
spawn(cooldown)
if(emote_cd == 2) return 1 // Don't reset if cooldown emotes were disabled by an admin during the cooldown
src.emote_cd = 0 // Cooldown complete, ready for more!
+1 -1
View File
@@ -67,7 +67,7 @@
if(speaker == src)
src << "<span class='warning'>You cannot hear yourself speak!</span>"
else
src << "<span class='name'>[speaker_name]</span>[alt_name] talks but you cannot hear \him."
src << "<span class='name'>[speaker_name]</span>[alt_name] talks but you cannot hear them."
else
if(language)
src << "<span class='game say'><span class='name'>[speaker_name]</span>[alt_name] [track][language.format_message(message, verb)]</span>"
+6 -2
View File
@@ -62,6 +62,7 @@
var/obj/item/weapon/holder/H = new holder_type(loc)
src.forceMove(H)
H.name = name
if(istype(H, /obj/item/weapon/holder/mouse)) H.icon_state = icon_state
if(desc) H.desc = desc
H.attack_hand(grabber)
@@ -73,13 +74,11 @@
//Mob specific holders.
/obj/item/weapon/holder/diona
name = "diona nymph"
desc = "It's a tiny plant critter."
icon_state = "nymph"
/obj/item/weapon/holder/drone
name = "maintenance drone"
desc = "It's a small maintenance robot."
icon_state = "drone"
@@ -88,3 +87,8 @@
name = "pAI"
desc = "It's a little robot."
icon_state = "pai"
/obj/item/weapon/holder/mouse
name = "mouse"
desc = "It's a small, disease-ridden rodent."
icon_state = "mouse_gray"
@@ -11,6 +11,8 @@
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
playsound(src.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
flick("gibbed-a", animation)
xgibs(loc, viruses)
dead_mob_list -= src
@@ -3,11 +3,9 @@
/obj/item/organ/internal/body_egg/alien_embryo
name = "alien embryo"
desc = "All slimy and yuck."
icon = 'icons/mob/alien.dmi'
icon_state = "larva0_dead"
var/stage = 0
var/growing = 0
/obj/item/organ/internal/body_egg/alien_embryo/on_find(mob/living/finder)
..()
@@ -58,13 +56,17 @@
RefreshInfectionImage()
if(stage == 5 && prob(50))
for(var/datum/surgery/S in owner.surgeries)
if(S.location == "chest" && istype(S.get_surgery_step(), /datum/surgery_step/internal/manipulate_organs))
AttemptGrow(0)
return
AttemptGrow()
/obj/item/organ/internal/body_egg/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
if(growing)
return
growing = 1
/obj/item/organ/internal/body_egg/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
if(!owner)
return
spawn()
var/list/candidates = pollCandidates("Do you want to play as an alien?", ROLE_ALIEN, 0)
var/mob/C = null
@@ -77,15 +79,14 @@
if(candidates.len)
C = pick(candidates)
else if(owner.client)
C = owner
C = owner.client
else
stage = 4 // Let's try again later.
return
if(owner.lying)
owner.overlays += image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_lie")
else
owner.overlays += image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_stand")
var/overlay = image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_lie")
owner.overlays += overlay
spawn(6)
var/mob/living/carbon/alien/larva/new_xeno = new(owner.loc)
new_xeno.key = C.key
@@ -97,19 +98,11 @@
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
if(gib_on_success)
owner.gib()
if(istype(new_xeno.loc,/mob/living/carbon))
var/mob/living/carbon/digester = new_xeno.loc
digester.stomach_contents += new_xeno
else
owner.adjustBruteLoss(40)
owner.overlays -= overlay
qdel(src)
/*----------------------------------------
Proc: RefreshInfectionImage()
Des: Removes the current icons located in the infected mob adds the current stage
----------------------------------------*/
/obj/item/organ/internal/body_egg/alien_embryo/RefreshInfectionImage()
RemoveInfectionImages()
AddInfectionImages()
/*----------------------------------------
Proc: AddInfectionImages(C)
Des: Adds the infection image to all aliens for this embryo
@@ -15,8 +15,10 @@ var/const/MAX_ACTIVE_TIME = 400
icon_state = "facehugger"
item_state = "facehugger"
w_class = 1 //note: can be picked up by aliens unlike most other items of w_class below 4
flags = MASKCOVERSMOUTH | MASKCOVERSEYES | AIRTIGHT
throw_range = 5
tint = 3
flags = MASKCOVERSMOUTH | MASKCOVERSEYES | AIRTIGHT
layer = MOB_LAYER
var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
@@ -26,19 +28,17 @@ var/const/MAX_ACTIVE_TIME = 400
var/attached = 0
/obj/item/clothing/mask/facehugger/attack_alien(user as mob) //can be picked up by aliens
/obj/item/clothing/mask/facehugger/attack_alien(mob/user) //can be picked up by aliens
attack_hand(user)
return
/obj/item/clothing/mask/facehugger/attack_hand(user as mob)
/obj/item/clothing/mask/facehugger/attack_hand(mob/user)
if((stat == CONSCIOUS && !sterile) && !isalien(user))
Attach(user)
return
else
..()
return
if(Attach(user))
return
..()
/obj/item/clothing/mask/facehugger/attack(mob/living/M as mob, mob/user as mob)
/obj/item/clothing/mask/facehugger/attack(mob/living/M, mob/user)
..()
user.unEquip(src)
Attach(M)
@@ -49,25 +49,25 @@ var/const/MAX_ACTIVE_TIME = 400
return
switch(stat)
if(DEAD,UNCONSCIOUS)
user << "<span class='userdanger'>[src] is not moving.</span>"
user << "<span class='boldannounce'>[src] is not moving.</span>"
if(CONSCIOUS)
user << "<span class='userdanger'>[src] seems to be active!</span>"
user << "<span class='boldannounce'>[src] seems to be active!</span>"
if (sterile)
user << "<span class='userdanger'>It looks like the proboscis has been removed.</span>"
user << "<span class='boldannounce'>It looks like the proboscis has been removed.</span>"
/obj/item/clothing/mask/facehugger/attackby(var/obj/item/O,var/mob/m, params)
/obj/item/clothing/mask/facehugger/attackby(obj/item/O,mob/m, params)
if(O.force)
death()
Die()
return
/obj/item/clothing/mask/facehugger/bullet_act(var/obj/item/projectile/P)
/obj/item/clothing/mask/facehugger/bullet_act(obj/item/projectile/P)
if(P.damage)
death()
Die()
return
/obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
death()
Die()
return
/obj/item/clothing/mask/facehugger/equipped(mob/M)
@@ -77,13 +77,13 @@ var/const/MAX_ACTIVE_TIME = 400
HasProximity(target)
return
/obj/item/clothing/mask/facehugger/on_found(mob/finder as mob)
/obj/item/clothing/mask/facehugger/on_found(mob/finder)
if(stat == CONSCIOUS)
return HasProximity(finder)
return 0
/obj/item/clothing/mask/facehugger/HasProximity(atom/movable/AM as mob|obj)
if(CanHug(AM))
if(CanHug(AM) && Adjacent(AM))
return Attach(AM)
return 0
@@ -102,10 +102,10 @@ var/const/MAX_ACTIVE_TIME = 400
icon_state = "[initial(icon_state)]"
Attach(hit_atom)
/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M as mob)
/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M)
if(!isliving(M))
return 0
if( (!iscorgi(M) && !iscarbon(M)) || isalien(M))
if((!iscorgi(M) && !iscarbon(M)) || isalien(M))
return 0
if(attached)
return 0
@@ -113,25 +113,24 @@ var/const/MAX_ACTIVE_TIME = 400
attached++
spawn(MAX_IMPREGNATION_TIME)
attached = 0
if(M.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
return 0
if(M.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo))
return 0
if(loc == M) return 0
if(M.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo))
return 0
if(loc == M)
return 0
if(stat != CONSCIOUS)
return 0
if(!sterile) M.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
M.visible_message("<span class='userdanger'>[src] leaps at [M]'s face!</span>")
M.visible_message("<span class='danger'>[src] leaps at [M]'s face!</span>", \
"<span class='userdanger'>[src] leaps at [M]'s face!</span>")
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.head && H.head.flags & HEADCOVERSMOUTH)
H.visible_message("<span class='userdanger'>[src] smashes against [H]'s [H.head]!</span>")
death()
H.visible_message("<span class='danger'>[src] smashes against [H]'s [H.head]!</span>", \
"<span class='userdanger'>[src] smashes against [H]'s [H.head]!</span>")
Die()
return 0
if(iscarbon(M))
var/mob/living/carbon/target = M
if(target.wear_mask)
@@ -147,8 +146,8 @@ var/const/MAX_ACTIVE_TIME = 400
src.loc = target
target.equip_to_slot(src, slot_wear_mask,,0)
if(!sterile) M.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
if(!sterile)
M.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
else if (iscorgi(M))
var/mob/living/simple_animal/pet/corgi/C = M
loc = C
@@ -181,13 +180,12 @@ var/const/MAX_ACTIVE_TIME = 400
target.visible_message("<span class='danger'>[src] falls limp after violating [target]'s face!</span>", \
"<span class='userdanger'>[src] falls limp after violating [target]'s face!</span>")
death()
Die()
icon_state = "[initial(icon_state)]_impregnated"
if(!(target.status_flags & XENO_HOST))
if(!target.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo))
new /obj/item/organ/internal/body_egg/alien_embryo(target)
if(iscorgi(target))
var/mob/living/simple_animal/pet/corgi/C = target
src.loc = get_turf(C)
@@ -195,7 +193,6 @@ var/const/MAX_ACTIVE_TIME = 400
else
target.visible_message("<span class='danger'>[src] violates [target]'s face!</span>", \
"<span class='userdanger'>[src] violates [target]'s face!</span>")
return
/obj/item/clothing/mask/facehugger/proc/GoActive()
if(stat == DEAD || stat == CONSCIOUS)
@@ -204,20 +201,10 @@ var/const/MAX_ACTIVE_TIME = 400
stat = CONSCIOUS
icon_state = "[initial(icon_state)]"
/* for(var/mob/living/carbon/alien/alien in world)
var/image/activeIndicator = image('icons/mob/alien.dmi', loc = src, icon_state = "facehugger_active")
activeIndicator.override = 1
if(alien && alien.client)
alien.client.images += activeIndicator */
return
/obj/item/clothing/mask/facehugger/proc/GoIdle()
if(stat == DEAD || stat == UNCONSCIOUS)
return
/* RemoveActiveIndicators() */
stat = UNCONSCIOUS
icon_state = "[initial(icon_state)]_inactive"
@@ -225,32 +212,27 @@ var/const/MAX_ACTIVE_TIME = 400
GoActive()
return
/obj/item/clothing/mask/facehugger/proc/death()
/obj/item/clothing/mask/facehugger/proc/Die()
if(stat == DEAD)
return
/* RemoveActiveIndicators() */
icon_state = "[initial(icon_state)]_dead"
item_state = "facehugger_inactive"
stat = DEAD
src.visible_message("<span class='userdanger'>[src] curls up into a ball!</span>")
visible_message("<span class='danger'>[src] curls up into a ball!</span>")
return
/proc/CanHug(var/mob/living/M)
if(!M || !ismob(M))
/proc/CanHug(mob/living/M)
if(!istype(M))
return 0
if(M.stat == DEAD)
return 0
if(M.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
return 0
if(iscorgi(M))
return 1
if(M.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
return 0
var/mob/living/carbon/C = M
if(ishuman(C))
var/mob/living/carbon/human/H = C
@@ -1,15 +1,9 @@
/mob/living/carbon/hitby(atom/movable/AM)
// if(!skip) //ugly, but easy
// message_admins("Skip Check Passed")
if(in_throw_mode && !get_active_hand()) //empty active hand and we're in throw mode
// message_admins("In Throw Mode and active hand check passed")
if(canmove && !restrained())
// message_admins("Restrained/moving check passed")
if(istype(AM, /obj/item))
// message_admins("Item check passed")
var/obj/item/I = AM
if(isturf(I.loc))
// message_admins("Turf check passed")
put_in_active_hand(I)
visible_message("<span class='warning'>[src] catches [I]!</span>")
throw_mode_off()
+19 -18
View File
@@ -47,7 +47,9 @@
if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt
return
if("scream", "screams", "fart", "farts", "flip", "flips", "snap", "snaps")
if("scream", "screams")
on_CD = handle_emote_CD(50) //longer cooldown
if("fart", "farts", "flip", "flips", "snap", "snaps")
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
//Everything else, including typos of the above emotes
else
@@ -76,7 +78,7 @@
else
message = "<B>[src]</B> pings."
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
m_type = 1
m_type = 2
if("buzz", "buzzes")
var/M = null
@@ -93,7 +95,7 @@
else
message = "<B>[src]</B> buzzes."
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
m_type = 1
m_type = 2
if("beep", "beeps")
var/M = null
@@ -110,7 +112,7 @@
else
message = "<B>[src]</B> beeps."
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
m_type = 1
m_type = 2
if("squish", "squishes")
var/M = null
@@ -127,7 +129,7 @@
else
message = "<B>[src]</B> squishes."
playsound(src.loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
m_type = 1
m_type = 2
if("yes")
var/M = null
@@ -144,7 +146,7 @@
else
message = "<B>[src]</B> emits an affirmative blip."
playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0)
m_type = 1
m_type = 2
if("no")
var/M = null
@@ -161,7 +163,7 @@
else
message = "<B>[src]</B> emits a negative blip."
playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0)
m_type = 1
m_type = 2
if("wag", "wags")
if(body_accessory)
@@ -177,6 +179,7 @@
return
else
return
m_type = 1
if("swag", "swags")
if(species.bodyflags & TAIL_WAGGING || body_accessory)
@@ -184,6 +187,7 @@
src.stop_tail_wagging(1)
else
return
m_type = 1
if ("airguitar")
if (!src.restrained())
@@ -409,6 +413,7 @@
message = "<B>[src]</B> glares at [param]."
else
message = "<B>[src]</B> glares."
m_type = 1
if ("stare", "stares")
var/M = null
@@ -424,6 +429,7 @@
message = "<B>[src]</B> stares at [param]."
else
message = "<B>[src]</B> stares."
m_type = 1
if ("look", "looks")
var/M = null
@@ -586,7 +592,7 @@
m_type = 1
if ("tremble", "trembles")
message = "<B>[src]</B> trembles in fear!"
message = "<B>[src]</B> trembles."
m_type = 1
if ("sneeze", "sneezes")
@@ -721,17 +727,12 @@
m_type = 1
else
if (!muzzled)
if (!(species.name == "Vox" || species.name == "Vox Armalis"))
message = "<B>[src]</B> screams!"
m_type = 2
if (prob(5))
playsound(src.loc, 'sound/voice/WilhelmScream.ogg', 100, 1, 10)
else
playsound(src.loc, 'sound/voice/scream2.ogg', 100, 1, 10)
message = "<B>[src]</B> [species.scream_verb]!"
m_type = 2
if(gender == FEMALE)
playsound(src.loc, "[species.female_scream_sound]", 80, 1, 0, pitch = get_age_pitch())
else
message = "<B>[src]</B> shrieks!"
m_type = 2
playsound(src.loc, 'sound/voice/shriek1.ogg', 100, 1, 10)
playsound(src.loc, "[species.male_scream_sound]", 80, 1, 0, pitch = get_age_pitch()) //default to male screams if no gender is present.
else
message = "<B>[src]</B> makes a very loud noise."
@@ -1308,7 +1308,8 @@
/mob/living/carbon/human/revive()
if(species && !(species.flags & NO_BLOOD))
vessel.add_reagent("blood",560-vessel.total_volume)
var/blood_reagent = get_blood_name()
vessel.add_reagent(blood_reagent, max_blood-vessel.total_volume)
fixblood()
// Fix up all organs.
@@ -1922,4 +1923,7 @@
if(hat.blockTracking)
return 0
return ..()
return ..()
/mob/living/carbon/human/proc/get_age_pitch()
return 1.0 + 0.5*(30 - age)/80
@@ -135,7 +135,7 @@
M << "<span class='warning'>Blood from a monkey is useless!</span>"
return 0
//we're good to suck the blood, blaah
M.handle_bloodsucking(src)
M.mind.vampire.handle_bloodsucking(src)
add_logs(src, M, "vampirebit")
msg_admin_attack("[key_name_admin(M)] vampirebit [key_name_admin(src)]")
return
+1 -1
View File
@@ -88,7 +88,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
pulse = handle_pulse()
if(mind && mind.vampire)
handle_vampire()
mind.vampire.handle_vampire()
if(life_tick == 1)
regenerate_icons() // Make sure the inventory updates
@@ -19,6 +19,10 @@
eyes = "blank_eyes"
death_message = "lets out a faint chimper as it collapses and stops moving..."
scream_verb = "screeches"
male_scream_sound = 'sound/goonstation/voice/monkey_scream.ogg'
female_scream_sound = 'sound/goonstation/voice/monkey_scream.ogg'
tail = "chimptail"
bodyflags = FEET_PADDED | HAS_TAIL
reagent_tag = PROCESS_ORG
@@ -104,6 +104,9 @@
var/secondary_langs = list() // The names of secondary languages that are available to this species.
var/list/speech_sounds // A list of sounds to potentially play when speaking.
var/list/speech_chance // The likelihood of a speech sound playing.
var/scream_verb = "screams"
var/male_scream_sound = 'sound/goonstation/voice/male_scream.ogg'
var/female_scream_sound = 'sound/goonstation/voice/female_scream.ogg'
// Determines the organs that the species spawns with and
var/list/has_organ = list( // which required-organ checks are conducted.
@@ -423,14 +426,12 @@
H.see_invisible = SEE_INVISIBLE_LIVING
if(H.mind && H.mind.vampire)
if((VAMP_VISION in H.mind.vampire.powers) && (!(VAMP_FULL in H.mind.vampire.powers)))
H.sight |= SEE_MOBS
else if(VAMP_FULL in H.mind.vampire.powers)
if(H.mind.vampire.get_ability(/datum/vampire_passive/full))
H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
H.see_in_dark = 8
H.see_invisible = SEE_INVISIBLE_MINIMUM
else if(H.mind.vampire.get_ability(/datum/vampire_passive/vision))
H.sight |= SEE_MOBS
if(XRAY in H.mutations)
H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
@@ -231,6 +231,9 @@
flesh_color = "#808D11"
reagent_tag = PROCESS_ORG
scream_verb = "shrieks"
male_scream_sound = 'sound/voice/shriek1.ogg'
female_scream_sound = 'sound/voice/shriek1.ogg'
suicide_messages = list(
"is attempting to bite their tongue off!",
@@ -453,8 +456,8 @@
set name = "Regrow Limbs"
set desc = "Regrow one of your missing limbs at the cost of a large amount of hunger"
#define SLIMEPERSON_HUNGERCOST 125
#define SLIMEPERSON_MINHUNGER 300
#define SLIMEPERSON_HUNGERCOST 50
#define SLIMEPERSON_MINHUNGER 250
#define SLIMEPERSON_REGROWTHDELAY 450 // 45 seconds
if(stat || paralysis || stunned)
@@ -717,6 +720,8 @@
virus_immune = 1
can_revive_by_healing = 1
reagent_tag = PROCESS_SYN
male_scream_sound = 'sound/goonstation/voice/robot_scream.ogg'
female_scream_sound = 'sound/goonstation/voice/robot_scream.ogg'
has_organ = list(
"brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain,
+12 -5
View File
@@ -13,6 +13,8 @@
var/on_CD = 0
switch(act)
//Cooldown-inducing emotes
if("scream", "screams")
on_CD = handle_emote_CD(50) //longer cooldown
if("ping","buzz","beep","yes","no") //halt is exempt because it's used to stop criminal scum //WHOEVER THOUGHT THAT WAS A GOOD IDEA IS GOING TO GET SHOT.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
//Everything else, including typos of the above emotes
@@ -39,7 +41,7 @@
else
message = "<B>[src]</B> pings."
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
m_type = 1
m_type = 2
if("buzz")
var/M = null
@@ -56,7 +58,7 @@
else
message = "<B>[src]</B> buzzes."
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
m_type = 1
m_type = 2
if("beep")
var/M = null
@@ -73,7 +75,7 @@
else
message = "<B>[src]</B> beeps."
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
m_type = 1
m_type = 2
if("yes")
var/M = null
@@ -90,7 +92,7 @@
else
message = "<B>[src]</B> emits an affirmative blip."
playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0)
m_type = 1
m_type = 2
if("no")
var/M = null
@@ -107,6 +109,11 @@
else
message = "<B>[src]</B> emits a negative blip."
playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0)
m_type = 1
m_type = 2
if("scream", "screams")
message = "<B>[src]</B> screams!"
playsound(src.loc, 'sound/goonstation/voice/robot_scream.ogg', 80, 0)
m_type = 2
..(act, m_type, message)
@@ -30,6 +30,7 @@
maxbodytemp = 323 //Above 50 Degrees Celcius
universal_speak = 0
can_hide = 1
holder_type = /obj/item/weapon/holder/mouse
/mob/living/simple_animal/mouse/handle_automated_speech()
..()
@@ -63,7 +64,6 @@
icon_dead = "mouse_[mouse_color]_dead"
desc = "It's a small [mouse_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
/mob/living/simple_animal/mouse/proc/splat()
src.health = 0
src.stat = DEAD
@@ -73,6 +73,11 @@
if(client)
client.time_died_as_mouse = world.time
/mob/living/simple_animal/mouse/attack_hand(mob/living/carbon/human/M as mob)
if(M.a_intent == I_HELP)
get_scooped(M)
..()
//make mice fit under tables etc? this was hacky, and not working
/*
/mob/living/simple_animal/mouse/Move(var/dir)
+8 -4
View File
@@ -241,12 +241,16 @@
powernets.Cut()
for(var/obj/structure/cable/PC in cable_list)
if(!PC.powernet)
var/datum/powernet/NewPN = new()
NewPN.add_cable(PC)
propagate_network(PC,PC.powernet)
makepowernet_for(PC)
return 1
/proc/makepowernet_for(var/obj/structure/cable/PC)
if(!PC.powernet)
var/datum/powernet/NewPN = new()
NewPN.add_cable(PC)
propagate_network(PC,PC.powernet)
//remove the old powernet and replace it with a new one throughout the network.
/proc/propagate_network(var/obj/O, var/datum/powernet/PN)
//log_to_dd("propagating new network")
+27 -5
View File
@@ -91,12 +91,27 @@ var/const/INGEST = 2
return the_id
/datum/reagents/proc/trans_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
if (!target )
/datum/reagents/proc/trans_to(var/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
if (!target)
return
if (!target.reagents || src.total_volume<=0)
if(src.total_volume <= 0)
return
var/datum/reagents/R = target.reagents
var/datum/reagents/R
if(istype(target, /obj))
var/obj/O = target
if (!O.reagents )
return
R = O.reagents
else if (istype(target, /mob/living))
var/mob/living/M = target
if(!M.reagents)
return
R = M.reagents
else if(istype(target, /datum/reagents))
R = target
else
return
amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
var/part = amount / src.total_volume
var/trans_data = null
@@ -333,7 +348,6 @@ var/const/INGEST = 2
qdel(A)
update_total()
my_atom.on_reagent_change()
check_ignoreslow(my_atom)
check_gofast(my_atom)
check_goreallyfast(my_atom)
return 0
@@ -606,6 +620,14 @@ atom/proc/create_reagents(var/max_vol)
reagents = new/datum/reagents(max_vol)
reagents.my_atom = src
/datum/reagents/proc/get_reagent_from_id(var/id)
var/datum/reagent/result = null
for(var/datum/reagent/R in reagent_list)
if(R.id == id)
result = R
break
return result
/datum/reagents/Destroy()
. = ..()
processing_objects.Remove(src)
+83 -25
View File
@@ -16,19 +16,18 @@
/datum/reagent/ginsonic/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(10))
M.drowsyness = max(0, M.drowsyness-5)
if(prob(25))
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
if(prob(8))
M.reagents.add_reagent("methamphetamine",1.2)
M.reagents.add_reagent("ethanol",1.4)
if(prob(8))
M.say(pick("Gotta go fast!", "Let's juice.", "I feel a need for speed!", "Way Past Cool!"))
if(prob(8))
switch(pick(1, 2, 3))
if(1)
M << "<span class='notice'>Time to speed, keed!</span>"
if(2)
M << "<span class='notice'>Let's juice.</span>"
if(3)
M << "<span class='notice'>Way Past Cool!</span>"
var/sonic_message = pick("Gotta go fast!", "Time to speed, keed!", "I feel a need for speed!", "Let's juice.", "Juice time.", "Way Past Cool!")
if(prob(50))
M.say("[sonic_message]")
else
M << "<span class='notice'>[sonic_message ]</span>"
..()
return
@@ -76,13 +75,14 @@
description = "A runny liquid with conductive capacities. Its effects on synthetics are similar to those of alcohol on organics."
reagent_state = LIQUID
color = "#1BB1FF"
process_flags = SYNTHETIC
process_flags = ORGANIC | SYNTHETIC
metabolization_rate = 0.4
vomit_start = INFINITY //
blur_start = INFINITY //
pass_out = INFINITY //INFINITY, so that IPCs don't puke and stuff
var/collapse_start = 200 //amount absorbed after wich mob starts collapsing
var/braindamage_start = 300 //amount absorbed after which mob starts taking small amount of brain damage
var/spark_start = 50 //amount absorbed after which mob starts sparking
var/collapse_start = 150 //amount absorbed after wich mob starts sparking and collapsing (DOUBLE THE SPARKS, DOUBLE THE FUN)
var/braindamage_start = 250 //amount absorbed after which mob starts taking a small amount of brain damage
/datum/chemical_reaction/synthanol
@@ -92,20 +92,39 @@
required_reagents = list("lube" = 1, "plasma" = 1, "fuel" = 1)
result_amount = 3
mix_message = "The chemicals mix to create shiny, blue substance."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/reagent/ethanol/synthanol/on_mob_life(var/mob/living/M as mob, var/alien)
var/d = data
if(M.isSynthetic()) //works normally on synthetics
if(d >= spark_start && prob(25))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, M)
s.start()
if(d >= collapse_start && prob(10))
M.emote("collapse")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, M)
s.start()
if(d >= braindamage_start && prob(33))
M.adjustBrainLoss(1)
if(d >= collapse_start && prob(10))
M.emote("collapse")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, M)
s.start()
if(d >= braindamage_start && prob(33))
M.adjustBrainLoss(1)
else
holder.remove_reagent(id, 3.6) //gets removed from organics very fast
if(prob(25))
holder.remove_reagent(id, 15)
M.fakevomit()
..()
datum/reagent/ethanol/synthanol/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(M.isSynthetic())
return
if(method == INGEST)
M << pick("<span class = 'danger'>That was awful!</span>", "<span class = 'danger'>Yuck!</span>")
/datum/reagent/ethanol/synthanol/robottears
name = "Robot Tears"
id = "robottears"
@@ -120,7 +139,6 @@
required_reagents = list("synthanol" = 1, "oil" = 1, "sodawater" = 1)
result_amount = 3
mix_message = "The ingredients combine into a stiff, dark goo."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/reagent/ethanol/synthanol/trinary
name = "Trinary"
@@ -136,7 +154,6 @@
required_reagents = list("synthanol" = 1, "limejuice" = 1, "orangejuice" = 1)
result_amount = 3
mix_message = "The ingredients mix into a colorful substance."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/reagent/ethanol/synthanol/servo
name = "Servo"
@@ -152,6 +169,47 @@
required_reagents = list("synthanol" = 2, "cream" = 1, "hot_coco" = 1)
result_amount = 4
mix_message = "The ingredients mix into a dark brown substance."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/reagent/ethanol/synthanol/uplink
name = "Uplink"
id = "uplink"
description = "A potent mix of alcohol and synthanol. Will only work on synthetics."
reagent_state = LIQUID
color = "#e7ae04"
/datum/chemical_reaction/synthanol/uplink
name = "Uplink"
id = "uplink"
result = "uplink"
required_reagents = list("rum" = 1, "vodka" = 1, "tequilla" = 1, "whiskey" = 1, "synthanol" = 1)
result_amount = 5
/datum/reagent/ethanol/synthanol/synthnsoda
name = "Synth 'n Soda"
id = "synthnsoda"
description = "The classic drink adjusted for a robot's tastes."
reagent_state = LIQUID
color = "#7204e7"
/datum/chemical_reaction/synthanol/synthnsoda
name = "Synth 'n Soda"
id = "synthnsoda"
result = "synthnsoda"
required_reagents = list("synthanol" = 1, "cola" = 1)
result_amount = 2
/datum/reagent/ethanol/synthanol/synthignon
name = "Synthignon"
id = "synthignon"
description = "Someone mixed wine and alcohol for robots. Hope you're proud of yourself."
reagent_state = LIQUID
color = "#d004e7"
/datum/chemical_reaction/synthanol/synthignon
name = "Synthignon"
id = "synthignon"
result = "synthignon"
required_reagents = list("synthanol" = 1, "wine" = 1)
result_amount = 2
// ROBOT ALCOHOL ENDS
+73 -29
View File
@@ -43,17 +43,23 @@
/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(prob(15))
M.emote(pick("twitch", "twitch_s", "grumble", "laugh"))
if(prob(8))
M.reagents.add_reagent("methamphetamine",2)
M << "<span class='notice'>You feel great!</span>"
M.reagents.add_reagent("methamphetamine", rand(1,2))
M.emote(pick("laugh", "giggle"))
if(prob(6))
M << "<span class='notice'>You feel warm.</span>"
M.bodytemperature += rand(1,10)
if(prob(4))
M.Jitter(10)
M.adjustToxLoss(1.0)
M << "<span class='notice'>You feel kinda awful!</span>"
M.adjustToxLoss(1)
M.jitteriness += 30
M.emote(pick("groan", "moan"))
..()
return
/datum/reagent/crank/overdose_process(var/mob/living/M as mob)
@@ -88,6 +94,7 @@
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."
mix_sound = 'sound/goonstation/effects/crystalshatter.ogg'
min_temp = 390
/datum/chemical_reaction/crank/on_reaction(var/datum/reagents/holder, var/created_volume)
@@ -109,9 +116,25 @@
/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.")
M.jitteriness -= 40
if(prob(25))
M.adjustBrainLoss(1)
if(prob(15))
M.emote(pick("smile", "grin", "yawn", "laugh", "drool"))
if(prob(10))
M << "<span class='notice'>You feel pretty chill.</span>"
M.bodytemperature--
M.emote("smile")
if(prob(5))
M << "<span class='notice'>[high_message]</span>"
M << "<span class='notice'>You feel too chill!</span>"
M.emote(pick("yawn", "drool"))
M.Stun(1)
M.adjustToxLoss(1)
M.adjustBrainLoss(1)
M.bodytemperature -= 20
if(prob(2))
M << "<span class='warning'>Your skin feels all rough and dry.</span>"
M.adjustBruteLoss(2)
..()
return
@@ -172,19 +195,19 @@
/datum/reagent/methamphetamine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.")
if(prob(5))
M << "<span class='notice'>[high_message]</span>"
M.emote(pick("twitch_s","blink_r","shiver"))
if(current_cycle >= 25)
M.jitteriness += 5
M.drowsyness = max(0, M.drowsyness-10)
M.AdjustParalysis(-2.5)
M.AdjustStunned(-2.5)
M.AdjustWeakened(-2.5)
M.adjustStaminaLoss(-2)
M.SetSleeping(0)
M.status_flags |= GOTTAGOREALLYFAST
M.Jitter(3)
if(prob(50))
M.adjustBrainLoss(1.0)
if(prob(5))
M.emote(pick("twitch", "shiver"))
..()
return
@@ -192,7 +215,7 @@
if(prob(20))
M.emote("laugh")
if(prob(33))
M.visible_message("<span class = 'danger'>[M]'s hands flip out and flail everywhere!</span>")
M.visible_message("<span class='danger'>[M]'s hands flip out and flail everywhere!</span>")
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
@@ -239,6 +262,16 @@
result_amount = 4
min_temp = 374
/datum/chemical_reaction/methamphetamine/on_reaction(var/datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='warning'>The solution generates a strong vapor!</span>")
for(var/mob/living/carbon/C in range(T, 1))
if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)))
C.emote("gasp")
C.losebreath++
C.reagents.add_reagent("toxin",10)
C.reagents.add_reagent("neurotoxin2",20)
/datum/chemical_reaction/saltpetre
name = "saltpetre"
id = "saltpetre"
@@ -372,17 +405,19 @@
/datum/reagent/aranesp/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/high_message = pick("You feel like you're made of steel!", "You feel invigorated!", "You feel really buff!", "You feel on top of the world!", "You feel full of energy!")
if(prob(5))
M << "<span class='notice'>[high_message]</span>"
M.adjustStaminaLoss(-40)
if(prob(90))
M.adjustToxLoss(1)
if(prob(5))
M.emote(pick("twitch", "shake", "tremble","quiver", "twitch_s"))
var/high_message = pick("really buff", "on top of the world","like you're made of steel", "energized", "invigorated", "full of energy")
if(prob(8))
M << "<span class='notice'>[high_message]!</span>"
if(prob(5))
M << "<span class='danger'>You cannot breathe!</span>"
M.losebreath += 1
M.adjustOxyLoss(15)
M.Stun(1)
M.losebreath++
..()
return
@@ -396,10 +431,16 @@
/datum/reagent/thc/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(8))
M.emote(pick("smile","giggle","laugh"))
if(prob(50))
M.stuttering += 2
M.stuttering += rand(0,2)
if(prob(5))
M.emote(pick("laugh","giggle","smile"))
if(prob(5))
M << "[pick("You feel hungry.","Your stomach rumbles.","You feel cold.","You feel warm.")]"
if(prob(4))
M.confused = max(M.confused, 10)
if(volume >= 50 && prob(25))
if(prob(10))
M.drowsyness = max(M.drowsyness, 10)
..()
return
@@ -445,10 +486,13 @@
M.SpinAnimation(speed = 5, loops = -1)
if(current_cycle == 50)
M.SpinAnimation(speed = 4, loops = -1)
M.AdjustParalysis(-2)
M.AdjustStunned(-2)
M.AdjustWeakened(-2)
M.adjustStaminaLoss(-2)
M.drowsyness = max(0, M.drowsyness-6)
M.AdjustParalysis(-1.5)
M.AdjustStunned(-1.5)
M.AdjustWeakened(-1.5)
M.adjustStaminaLoss(-1.5)
M.SetSleeping(0)
..()
return
@@ -463,11 +507,11 @@
M.emote("laugh")
M.adjustToxLoss(1)
if(2)
M << "<span class = 'danger'>[M] can't seem to control their legs!</span>"
M << "<span class='danger'>[M] can't seem to control their legs!</span>"
M.Weaken(8)
M.adjustToxLoss(1)
if(3)
M << "<span class = 'danger'>[M]'s hands flip out and flail everywhere!</span>"
M << "<span class='danger'>[M]'s hands flip out and flail everywhere!</span>"
M.drop_l_hand()
M.drop_r_hand()
M.adjustToxLoss(1)
@@ -523,7 +567,7 @@
if(prob(20))
M.emote("ping")
if(prob(33))
M.visible_message("<span class = 'danger'>[M]'s hands flip out and flail everywhere!</span>")
M.visible_message("<span class='danger'>[M]'s hands flip out and flail everywhere!</span>")
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
+128 -27
View File
@@ -11,7 +11,7 @@ datum/reagent/questionmark/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
return
if(method == INGEST)
M.Weaken(2)
M << "<span class = 'danger'>Ugh! Eating that was a terrible idea!</span>"
M << "<span class='danger'>Ugh! Eating that was a terrible idea!</span>"
datum/reagent/egg
name = "Egg"
@@ -22,8 +22,10 @@ datum/reagent/egg
datum/reagent/egg/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(5))
if(prob(8))
M.emote("fart")
if(prob(3))
M.reagents.add_reagent("cholesterol", rand(1,2))
..()
return
@@ -118,7 +120,7 @@ datum/reagent/vhfcs/on_mob_life(var/mob/living/M as mob)
datum/reagent/honey/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.reagents.add_reagent("sugar", 0.8)
M.reagents.add_reagent("sugar", 0.4)
..()
return
@@ -174,13 +176,15 @@ datum/reagent/mugwort/on_mob_life(var/mob/living/M as mob)
reagent_state = LIQUID
color = "#AB5D5D"
metabolization_rate = 0.2
overdose_threshold = 125
overdose_threshold = 133
datum/reagent/porktonium/overdose_process(var/mob/living/M as mob)
if(volume > 125)
if(volume > 133)
if(prob(15))
M.reagents.add_reagent("cholesterol", rand(1,3))
if(prob(8))
M.reagents.add_reagent("cyanide", 10)
M.reagents.add_reagent("radium", 15)
M.reagents.add_reagent("cyanide", 10)
..()
return
@@ -195,7 +199,13 @@ datum/reagent/fungus/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == INGEST)
M << "<span class = 'danger'>Yuck!</span>"
var/ranchance = rand(1,10)
if(ranchance == 1)
M << "<span class='warning'>You feel very sick.</span>"
M.reagents.add_reagent("toxin", rand(1,5))
else if(ranchance <= 5)
M << "<span class='warning'>That tasted absolutely FOUL.</span>"
else M << "<span class='warning'>Yuck!</span>"
/datum/reagent/chicken_soup
name = "Chicken soup"
@@ -216,18 +226,22 @@ datum/reagent/fungus/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
description = "Monosodium Glutamate is a sodium salt known chiefly for its use as a controversial flavor enhancer."
reagent_state = LIQUID
color = "#F5F5F5"
metabolization_rate = 0.2
datum/reagent/msg/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == INGEST)
M << "<span class = 'notice'>That tasted amazing!</span>"
M << "<span class='notice'>That tasted amazing!</span>"
/datum/reagent/msg/on_mob_life(var/mob/living/M as mob)
if(prob(1))
M.Stun(rand(4,10))
M << "<span class='warning'>A horrible migraine overpowers you.</span>"
if(prob(5))
if(prob(10))
M.adjustToxLoss(rand(2.4))
if(prob(7))
M << "<span class='warning'>A horrible migraine overpowers you.</span>"
M.Stun(rand(2,5))
..()
return
@@ -237,6 +251,13 @@ datum/reagent/msg/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
description = "Some cheese. Pour it out to make it solid."
reagent_state = SOLID
color = "#FFFF00"
metabolization_rate = 0 //heheheh
/datum/reagent/cheese/on_mob_life(var/mob/living/M as mob)
if(prob(3))
M.reagents.add_reagent("cholesterol", rand(1,2))
..()
datum/reagent/cheese/reaction_turf(var/turf/T, var/volume)
src = null
@@ -252,12 +273,23 @@ datum/reagent/cheese/reaction_turf(var/turf/T, var/volume)
result_amount = 1
mix_message = "The mixture curdles up."
/datum/chemical_reaction/cheese/on_reaction(var/datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='notice'>A faint cheesy smell drifts through the air...</span>")
/datum/reagent/fake_cheese
name = "Cheese substitute"
id = "fake_cheese"
description = "A cheese-like substance derived loosely from actual cheese."
reagent_state = LIQUID
color = "#B2B139"
overdose_threshold = 50
/datum/reagent/fake_cheese/overdose_process(var/mob/living/M as mob)
if(prob(8))
M << "<span class='warning'>You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat.</span>"
M.adjustToxLoss(rand(1,2))
..()
/datum/reagent/weird_cheese
name = "Weird cheese"
@@ -265,6 +297,12 @@ datum/reagent/cheese/reaction_turf(var/turf/T, var/volume)
description = "Hell, I don't even know if this IS cheese. Whatever it is, it ain't normal. If you want to, pour it out to make it solid."
reagent_state = SOLID
color = "#50FF00"
metabolization_rate = 0 //heheheh
/datum/reagent/weird_cheese/on_mob_life(var/mob/living/M as mob)
if(prob(5))
M.reagents.add_reagent("cholesterol", rand(1,3))
..()
datum/reagent/weird_cheese/reaction_turf(var/turf/T, var/volume)
src = null
@@ -279,6 +317,11 @@ datum/reagent/weird_cheese/reaction_turf(var/turf/T, var/volume)
required_reagents = list("green_vomit" = 1, "milk" = 1)
result_amount = 1
mix_message = "The disgusting mixture sloughs together horribly, emitting a foul stench."
mix_sound = 'sound/goonstation/misc/gurggle.ogg'
/datum/chemical_reaction/weird_cheese/on_reaction(var/datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='warning'>A horrible smell assaults your nose! What in space is it?</span>")
datum/reagent/beans
name = "Refried beans"
@@ -289,7 +332,7 @@ datum/reagent/beans
datum/reagent/beans/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(8))
if(prob(10))
M.emote("fart")
..()
return
@@ -349,11 +392,11 @@ datum/reagent/ectoplasm/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
return
if(method == INGEST)
var/spooky_eat = pick("Ugh, why did you eat that? Your mouth feels haunted. Haunted with bad flavors.", "Ugh, why did you eat that? It has the texture of ham aspic. From the 1950s. Left out in the sun.", "Ugh, why did you eat that? It tastes like a ghost fart.", "Ugh, why did you eat that? It tastes like flavor died.")
M << "<span class = 'warning'>[spooky_eat]</span>"
M << "<span class='warning'>[spooky_eat]</span>"
/datum/reagent/ectoplasm/on_mob_life(var/mob/living/M as mob)
var/spooky_message = pick("You notice something moving out of the corner of your eye, but nothing is there...", "Your eyes twitch, you feel like something you can't see is here...", "You've got the heebie-jeebies.", "You feel uneasy.", "You shudder as if cold...", "You feel something gliding across your back...")
if(prob(5))
if(prob(8))
M << "<span class='warning'>[spooky_message]</span>"
..()
return
@@ -365,15 +408,17 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
return
/datum/reagent/soybeanoil
name = "Space-soybean oil "
name = "Space-soybean oil"
id = "soybeanoil"
description = "An oil derived from extra-terrestrial soybeans."
reagent_state = LIQUID
color = "#B1B0B0"
/datum/reagent/soybeanoil/on_mob_life(var/mob/living/M as mob)
if(prob(5))
M.reagents.add_reagent("porktonium",5)
if(prob(10))
M.reagents.add_reagent("cholesterol", rand(1,3))
if(prob(8))
M.reagents.add_reagent("porktonium", 5)
..()
return
@@ -383,13 +428,34 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
description = "An oil derived from extra-terrestrial soybeans, with additional hydrogen atoms added to convert it into a saturated form."
reagent_state = LIQUID
color = "#B1B0B0"
metabolization_rate = 0.2
overdose_threshold = 75
/datum/reagent/hydrogenated_soybeanoil/on_mob_life(var/mob/living/M as mob)
if(prob(15))
M.reagents.add_reagent("cholesterol", rand(1,3))
if(prob(8))
M.reagents.add_reagent("porktonium",5)
M.reagents.add_reagent("porktonium", 5)
if(volume >= 75)
metabolization_rate = 0.4
else
metabolization_rate = 0.2
..()
return
/datum/reagent/hydrogenated_soybeanoil/overdose_process(var/mob/living/M as mob)
if(prob(33))
M << "<span class='warning'>You feel horribly weak.</span>"
if(prob(10))
M << "<span class='warning'>You cannot breathe!</span>"
M.adjustOxyLoss(5)
if(prob(5))
M << "<span class='warning'>You feel a sharp pain in your chest!</span>"
M.adjustOxyLoss(25)
M.Stun(5)
M.Paralyse(10)
..()
/datum/chemical_reaction/hydrogenated_soybeanoil
name = "Partially hydrogenated space-soybean oil"
id = "hydrogenated_soybeanoil"
@@ -406,6 +472,17 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
reagent_state = LIQUID
color = "#EBD7D7"
/datum/reagent/meatslurry/on_mob_life(var/mob/living/M as mob)
if(prob(4))
M.reagents.add_reagent("cholesterol", rand(1,3))
..()
/datum/reagent/meatslurry/reaction_turf(var/turf/T, var/volume)
src = null
if(volume >= 5 && prob(10))
new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
/datum/chemical_reaction/meatslurry
name = "Meat Slurry"
id = "meatslurry"
@@ -447,13 +524,12 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
/datum/reagent/beff/on_mob_life(var/mob/living/M as mob)
if(prob(5))
M.reagents.add_reagent("porktonium",5)
if(prob(5))
M.reagents.add_reagent(pick("blood", "corn_syrup", "synthflesh", "hydrogenated_soybeanoil"), 0.8)
if(prob(5))
M.emote("groan")
if(prob(2))
M << "<span class='warning'>You feel sick.</span>"
M.reagents.add_reagent("cholesterol", rand(1,3))
if(prob(8))
M.reagents.add_reagent(pick("blood", "corn_syrup", "synthflesh", "hydrogenated_soybeanoil", "porktonium", "toxic_slurry"), 0.8)
else if(prob(6))
M << "<span class='warning'>[pick("You feel ill.","Your stomach churns.","You feel queasy.","You feel sick.")]</span>"
M.emote(pick("groan","moan"))
..()
return
@@ -488,7 +564,7 @@ datum/reagent/pepperoni/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vol
if(prob(50))
M.adjustBruteLoss(1)
playsound(M, 'sound/effects/woodhit.ogg', 50, 1, -1)
playsound(M, 'sound/effects/woodhit.ogg', 50, 1)
M << "<span class='warning'>A slice of pepperoni slaps you!</span>"
else
M.emote("burp")
@@ -502,4 +578,29 @@ datum/reagent/pepperoni/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vol
required_reagents = list("beff" = 1, "saltpetre" = 1, "synthflesh" = 1)
result_amount = 2
mix_message = "The beff and the synthflesh combine to form a smoky red log."
mix_sound = 'sound/effects/blobattack.ogg'
mix_sound = 'sound/effects/blobattack.ogg'
/datum/reagent/cholesterol
name = "cholesterol"
id = "cholesterol"
description = "Pure cholesterol. Probably not very good for you."
reagent_state = LIQUID
color = "#FFFAC8"
/datum/reagent/cholesterol/on_mob_life(var/mob/living/M as mob)
if(volume >= 25 && prob(volume*0.15))
M << "<span class='warning'>Your chest feels [pick("weird","uncomfortable","nasty","gross","odd","unusual","warm")]!</span>"
M.adjustToxLoss(rand(1,2))
else if(volume >= 45 && prob(volume*0.08))
M << "<span class='warning'>Your chest [pick("hurts","stings","aches","burns")]!</span>"
M.adjustToxLoss(rand(2,4))
M.Stun(1)
else if(volume >= 150 && prob(volume*0.01))
M << "<span class='warning'>Your chest is burning with pain!</span>"
M.Stun(1)
M.Weaken(1)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!H.heart_attack)
H.heart_attack = 1
..()
+92 -61
View File
@@ -203,7 +203,7 @@ datum/reagent/calomel/on_mob_life(var/mob/living/M as mob)
M.reagents.remove_reagent(R.id,5)
if(M.health > 20)
M.adjustToxLoss(5*REM)
if(prob(10))
if(prob(6))
M.fakevomit()
..()
return
@@ -226,11 +226,8 @@ datum/reagent/potass_iodide
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
if(prob(80))
M.radiation = max(0, M.radiation-1)
..()
return
@@ -251,18 +248,15 @@ datum/reagent/pen_acid
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
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,4)
M.radiation = max(0, M.radiation-7)
if(prob(75))
M.adjustToxLoss(-4*REM)
if(prob(33))
M.adjustBruteLoss(1*REM)
M.adjustFireLoss(1*REM)
if(M.radiation < 0)
M.radiation = 0
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,4)
..()
return
@@ -322,8 +316,7 @@ datum/reagent/salbutamol
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
M.losebreath = max(0, M.losebreath-4)
..()
return
@@ -347,7 +340,9 @@ datum/reagent/perfluorodecalin
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(volume >= 4)
M.losebreath = max(M.losebreath, 6)
M.silent = max(M.silent, 6)
if(prob(33))
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
@@ -376,10 +371,18 @@ datum/reagent/ephedrine
datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.drowsyness = max(0, M.drowsyness-5)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
M.adjustStaminaLoss(-1*REM)
if(M.losebreath > 5)
M.losebreath = max(5, M.losebreath-1)
if(M.oxyloss > 75)
M.adjustOxyLoss(-1)
if(M.health < 0 || M.health > 0 && prob(33))
M.adjustToxLoss(-1)
M.heal_organ_damage(1,1)
..()
return
@@ -429,12 +432,18 @@ datum/reagent/diphenhydramine
description = "Anti-allergy medication. May cause drowsiness, do not operate heavy machinery while using this."
reagent_state = LIQUID
color = "#5BCBE1"
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.jitteriness = max(0, M.jitteriness-20)
M.reagents.remove_reagent("histamine",3)
M.reagents.remove_reagent("itching_powder",3)
if(prob(7))
M.emote("yawn")
if(prob(3))
M.Stun(2)
M.drowsyness += 1
M.visible_message("<span class='notice'>[M] looks a bit dazed.</span>")
..()
return
@@ -459,16 +468,16 @@ datum/reagent/morphine
datum/reagent/morphine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.status_flags |= IGNORESLOWDOWN
M.jitteriness = max(0, M.jitteriness-25)
switch(current_cycle)
if(0 to 15)
if(prob(5))
if(1 to 15)
if(prob(7))
M.emote("yawn")
if(16 to 35)
M.drowsyness = max(M.drowsyness, 10)
M.drowsyness = max(M.drowsyness, 20)
if(36 to INFINITY)
M.Paralyse(10)
M.drowsyness = max(M.drowsyness, 15)
M.Paralyse(15)
M.drowsyness = max(M.drowsyness, 20)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.traumatic_shock < 100)
@@ -575,18 +584,21 @@ datum/reagent/atropine
datum/reagent/atropine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.health > -60)
M.adjustToxLoss(1*REM)
if(M.health < -25)
M.adjustBruteLoss(-3*REM)
M.adjustFireLoss(-3*REM)
M.dizziness += 1
M.confused = max(M.confused, 5)
if(prob(4))
M.emote("collapse")
if(M.losebreath > 5)
M.losebreath = max(5, M.losebreath-5)
if(M.oxyloss > 65)
M.adjustOxyLoss(-10*REM)
if(M.losebreath > 5)
M.losebreath = 5
if(M.confused > 60)
M.confused += 5
M.reagents.remove_reagent("tabun",10)
if(M.health < -25)
M.adjustToxLoss(-1)
M.adjustBruteLoss(-3*REM)
M.adjustFireLoss(-3*REM)
else if(M.health > -60)
M.adjustToxLoss(1)
M.reagents.remove_reagent("sarin", 20)
..()
return
@@ -617,14 +629,26 @@ datum/reagent/epinephrine
datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.drowsyness = max(0, M.drowsyness-5)
if(prob(20))
M.AdjustParalysis(-1)
if(prob(20))
M.AdjustStunned(-1)
if(prob(20))
M.AdjustWeakened(-1)
if(prob(5))
M.SetSleeping(0)
if(prob(5))
M.adjustBrainLoss(-1)
holder.remove_reagent("histamine", 15)
if(M.losebreath > 3)
M.losebreath--
if(M.oxyloss > 35)
M.adjustOxyLoss(-10*REM)
if(M.health < -10 && M.health > -65)
M.adjustToxLoss(-1*REM)
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
if(M.oxyloss > 35)
M.adjustOxyLoss(-10*REM)
if(M.losebreath >= 3)
M.losebreath = 3
..()
return
@@ -806,12 +830,9 @@ datum/reagent/antihol
color = "#009CA8"
datum/reagent/antihol/on_mob_life(var/mob/living/M as mob)
M.dizziness = 0
M.drowsyness = 0
M.slurring = 0
M.confused = 0
M.reagents.remove_all_type(/datum/reagent/ethanol, 8, 0, 1)
if(M.health < 25)
if(M.toxloss <= 25)
M.adjustToxLoss(-2.0)
..()
@@ -833,21 +854,29 @@ datum/reagent/antihol/on_mob_life(var/mob/living/M as mob)
datum/reagent/stimulants/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustOxyLoss(-5*REM)
M.adjustToxLoss(-5*REM)
M.adjustBruteLoss(-10*REM)
M.adjustFireLoss(-10*REM)
M.setStaminaLoss(0)
var/status = CANSTUN | CANWEAKEN | CANPARALYSE
M.status_flags &= ~status
if(volume > 5)
M.adjustOxyLoss(-5*REM)
M.adjustToxLoss(-5*REM)
M.adjustBruteLoss(-10*REM)
M.adjustFireLoss(-10*REM)
M.setStaminaLoss(0)
M.dizziness = max(0,M.dizziness-10)
M.drowsyness = max(0,M.drowsyness-10)
M.confused = 0
M.SetSleeping(0)
var/status = CANSTUN | CANWEAKEN | CANPARALYSE
M.status_flags &= ~status
else
M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE
M.adjustToxLoss(2)
M.adjustBruteLoss(1)
if(prob(10))
M.Stun(3)
..()
datum/reagent/stimulants/reagent_deleted(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE
M.adjustBruteLoss(12)
M.adjustToxLoss(24)
M.Stun(4)
..()
return
@@ -948,14 +977,15 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
M.reagents.remove_reagent("psilocybin", 5)
M.reagents.remove_reagent("ephedrine", 5)
M.reagents.remove_reagent("epinephrine", 5)
M.reagents.remove_reagent("stimulants", 5)
M.reagents.remove_reagent("stimulants", 3)
M.reagents.remove_reagent("bath_salts", 5)
M.reagents.remove_reagent("lsd", 5)
M.reagents.remove_reagent("thc", 5)
M.druggy -= 5
M.hallucination -= 5
M.jitteriness -= 5
if(prob(40))
M.drowsyness = max(M.drowsyness, 2)
if(prob(50))
M.drowsyness = max(M.drowsyness, 3)
if(prob(10))
M.emote("drool")
if(prob(20))
@@ -981,15 +1011,16 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
/datum/reagent/ether/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.jitteriness = max(M.jitteriness-25,0)
switch(current_cycle)
if(0 to 15)
if(prob(5))
if(1 to 15)
if(prob(7))
M.emote("yawn")
if(16 to 35)
M.drowsyness = max(M.drowsyness, 10)
M.drowsyness = max(M.drowsyness, 20)
if(36 to INFINITY)
M.Paralyse(10)
M.drowsyness = max(M.drowsyness, 15)
M.Paralyse(15)
M.drowsyness = max(M.drowsyness, 20)
..()
return
@@ -1034,7 +1065,7 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
M.confused -= 5
M.confused = max(0, M.confused-5)
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
if(R.id == "ultralube" || R.id == "lube")
+6 -13
View File
@@ -3,7 +3,7 @@ datum/reagent
var/addiction_threshold = 0
var/addiction_stage = 0
var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick.
var/current_cycle = 0
var/current_cycle = 1
datum/reagents
var/chem_temp = 300
var/addiction_tick = 1
@@ -83,7 +83,7 @@ datum/reagents/proc/metabolize(var/mob/M)
R.addiction_act_stage4(M)
R.addiction_stage++
if(R.addiction_stage > 40)
M << "<span class = 'notice'>You feel like you've gotten over your need for [R.name].</span>"
M << "<span class='notice'>You feel like you've gotten over your need for [R.name].</span>"
addiction_list.Remove(R)
addiction_tick++
update_total()
@@ -101,13 +101,6 @@ datum/reagents/proc/reagent_on_tick()
R.on_tick()
return
datum/reagents/proc/check_ignoreslow(var/mob/M)
if(istype(M, /mob))
if(M.reagents.has_reagent("morphine"))
return 1
else
M.status_flags &= ~IGNORESLOWDOWN
datum/reagents/proc/check_gofast(var/mob/M)
if(istype(M, /mob))
if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("stimulative_agent"))
@@ -139,22 +132,22 @@ datum/reagent/proc/overdose_start(var/mob/living/M as mob)
datum/reagent/proc/addiction_act_stage1(var/mob/living/M as mob)
if(prob(30))
M << "<span class = 'notice'>You feel like some [name] right about now.</span>"
M << "<span class='notice'>You feel like some [name] right about now.</span>"
return
datum/reagent/proc/addiction_act_stage2(var/mob/living/M as mob)
if(prob(30))
M << "<span class = 'notice'>You feel like you need [name]. You just can't get enough.</span>"
M << "<span class='notice'>You feel like you need [name]. You just can't get enough.</span>"
return
datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob)
if(prob(30))
M << "<span class = 'danger'>You have an intense craving for [name].</span>"
M << "<span class='danger'>You have an intense craving for [name].</span>"
return
datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob)
if(prob(30))
M << "<span class = 'danger'>You're not feeling good at all! You really need some [name].</span>"
M << "<span class='danger'>You're not feeling good at all! You really need some [name].</span>"
return
/datum/reagent/proc/reagent_deleted()
+14 -19
View File
@@ -265,7 +265,7 @@ datum/reagent/super_hairgrownium/on_mob_life(var/mob/living/M as mob)
H.unEquip(H.wear_mask)
var/obj/item/clothing/mask/fakemoustache = new /obj/item/clothing/mask/fakemoustache
H.equip_to_slot(fakemoustache, slot_wear_mask)
H << "<span class = 'notice'>Hair bursts forth from your every follicle!"
H << "<span class='notice'>Hair bursts forth from your every follicle!"
..()
return
@@ -286,25 +286,20 @@ datum/reagent/fartonium
datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.emote("fart")
if(prob(66))
M.emote("fart")
if(holder.has_reagent("simethicone"))
if(prob(30))
switch(pick(1,2))
if(1)
M << "<span class = 'danger'>Something isn't right!"
M.adjustBruteLoss(1)
if(2)
M.custom_emote(1,"strains, but nothing happens.")
M.adjustBruteLoss(2)
if(3)
M.emote("scream")
M.adjustBruteLoss(2)
if(4)
M << "<span class = 'danger'>Oh gosh, the pain!"
M.adjustBruteLoss(1)
if(5)
M << "<span class = 'danger'>THE PAIN!"
M.adjustBruteLoss(1)
if(prob(25))
M << "<span class='danger'>[pick("Oh god, something doesn't feel right!", "IT HURTS!", "FUCK!", "Something is seriously wrong!", "THE PAIN!", "You feel like you're gonna die!")]</span>"
M.adjustBruteLoss(1)
if(prob(10))
M.custom_emote(1,"strains, but nothing happens.")
M.adjustBruteLoss(2)
if(prob(5))
M.emote("scream")
M.adjustBruteLoss(4)
..()
return
+2 -2
View File
@@ -541,7 +541,7 @@ datum/reagent/pyrosium/on_tick()
/datum/chemical_reaction/azide/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
explosion(location,0,1,3)
explosion(location,0,1,4)
return
datum/reagent/firefighting_foam
@@ -609,7 +609,7 @@ datum/reagent/firefighting_foam/reaction_obj(var/obj/O, var/volume)
/datum/chemical_reaction/clf3_firefighting/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
explosion(location,0,0,3)
explosion(location,-1,0,2)
return
/datum/chemical_reaction/shock_explosion
+296 -164
View File
@@ -27,34 +27,49 @@
reagent_state = LIQUID
color = "#E7C4C4"
metabolization_rate = 0.2
overdose_threshold = 30
overdose_threshold = 40
/datum/reagent/histamine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) //dumping histamine on someone is VERY mean.
if(iscarbon(M))
if(method == TOUCH)
M.reagents.add_reagent("histamine",10)
else
M << "<span class='danger'>You feel a burning sensation in your throat...</span>"
M.emote("drool")
/datum/reagent/histamine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
switch(pick(1, 2, 3, 4))
if(1)
M << "<span class='danger'>You can barely see!</span>"
M.eye_blurry = 3
if(2)
M.emote("cough")
if(3)
M.emote("sneeze")
if(4)
if(prob(75))
M << "You scratch at an itch."
M.adjustBruteLoss(2*REM)
if(prob(20))
M.emote(pick("twitch", "grumble", "sneeze", "cough"))
if(prob(10))
M << "<span class='notice'>Your eyes itch.</span>"
M.emote(pick("blink", "sneeze"))
M.eye_blurry += 3
if(prob(10))
M.visible_message("<span class='danger'>[M] scratches at an itch.</span>")
M.adjustBruteLoss(1)
M.emote("grumble")
if(prob(5))
M << "<span class='danger'>You're getting a rash!</span>"
M.adjustBruteLoss(2)
..()
return
/datum/reagent/histamine/overdose_process(var/mob/living/M as mob)
M.adjustOxyLoss(pick(1,3)*REM)
M.adjustBruteLoss(pick(1,3)*REM)
M.adjustToxLoss(pick(1,3)*REM)
if(prob(2))
M << "<span class='danger'>You feel mucus running down the back of your throat.</span>"
M.adjustToxLoss(1)
M.jitteriness += 4
M.emote("sneeze", "cough")
else if(prob(4))
M.stuttering += rand(0,5)
if(prob(25))
M.emote(pick("choke","gasp"))
M.adjustOxyLoss(5)
else if(prob(7))
M << "<span class='danger'>Your chest hurts!</span>"
M.emote(pick("cough","gasp"))
M.adjustOxyLoss(3)
..()
return
@@ -86,7 +101,7 @@
/datum/reagent/venom
name = "Venom"
id = "venom"
description = "Will deal scaling amounts of Toxin and Brute damage over time. 25% chance to decay into 5-10 histamine."
description = "An incredibly potent poison. Origin unknown."
reagent_state = LIQUID
color = "#CF3600"
metabolization_rate = 0.2
@@ -94,20 +109,27 @@
/datum/reagent/venom/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(1*REM)
M.adjustBruteLoss(1*REM)
if(volume >= 20)
M.adjustToxLoss(1*REM)
M.adjustBruteLoss(1*REM)
if(prob(25))
M.reagents.add_reagent("histamine",rand(5,10))
if(volume < 20)
M.adjustToxLoss(1)
M.adjustBruteLoss(1)
else if(volume < 40)
if(prob(8))
M.fakevomit()
M.adjustToxLoss(2)
M.adjustBruteLoss(2)
..()
return
/datum/reagent/venom/overdose_process(var/mob/living/M as mob)
if(volume >= 40)
if(prob(4))
M.gib()
M.visible_message("<span class='danger'><B>[M]</B> starts convulsing violently!</span>", "You feel as if your body is tearing itself apart!")
M.Weaken(15)
M.jitteriness += 1000
spawn(rand(20, 100))
M.gib()
..()
return
@@ -120,21 +142,32 @@
metabolization_rate = 1
/datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob)
if(current_cycle <= 4)
M.reagents.add_reagent("neurotoxin2", 1.0)
if(current_cycle >= 5)
if(prob(5))
M.emote("drool")
if(M.getBrainLoss() < 60)
M.adjustBrainLoss(1*REM)
M.adjustToxLoss(1*REM)
if(current_cycle >= 9)
M.drowsyness = max(M.drowsyness, 10)
if(current_cycle >= 13)
M.Paralyse(8)
switch(current_cycle)
if(5 to 45)
M.confused = max(M.confused, 15)
if(1 to 4)
current_cycle++
return
if(5 to 8)
M.dizziness += 1
M.confused = max(M.confused, 10)
if(9 to 12)
M.drowsyness = max(M.drowsyness, 10)
M.dizziness += 1
M.confused = max(M.confused, 20)
if(13)
M.emote("faint")
if(14 to INFINITY)
M.Paralyse(10)
M.drowsyness = max(M.drowsyness, 20)
M.jitteriness = max(0, M.jitteriness-30)
if(M.getBrainLoss() <= 80)
M.adjustBrainLoss(1)
else
if(prob(10))
M.adjustBrainLoss(1)
if(prob(10))
M.emote("drool")
M.adjustToxLoss(1)
..()
return
@@ -159,16 +192,17 @@
/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(5))
M.emote("drool")
M.adjustToxLoss(1.5*REM)
if(prob(10))
M << "<span class = 'danger'>You cannot breathe!</span>"
M << "<span class='danger'>You cannot breathe!</span>"
M.losebreath += 1
M.emote("gasp")
if(prob(8))
M << "<span class = 'danger'>You feel horrendously weak!</span>"
M << "<span class='danger'>You feel horrendously weak!</span>"
M.Stun(2)
M.adjustToxLoss(2*REM)
M.adjustToxLoss(2)
..()
return
@@ -182,6 +216,12 @@
mix_message = "The mixture gives off a faint scent of almonds."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/chemical_reaction/cyanide/on_reaction(var/datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='warning'>The solution generates a strong vapor!</span>")
for(var/mob/living/carbon/C in range(T, 1))
if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)))
C.reagents.add_reagent("cyanide",7)
/datum/reagent/itching_powder
name = "Itching Powder"
@@ -194,17 +234,28 @@
/datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(rand(5,50)))
M << "You scratch at your head."
M.adjustBruteLoss(0.2*REM)
if(prob(rand(5,50)))
M << "You scratch at your leg."
M.adjustBruteLoss(0.2*REM)
if(prob(rand(5,50)))
M << "You scratch at your arm."
M.adjustBruteLoss(0.2*REM)
if(prob(25))
M.emote(pick("twitch", "laugh", "sneeze", "cry"))
if(prob(20))
M << "<span class='notice'>Something tickles!</span>"
M.emote(pick("laugh", "giggle"))
if(prob(15))
M.visible_message("<span class='danger'>[M] scratches at an itch.</span>")
M.adjustBruteLoss(1)
M.Stun(rand(0,1))
M.emote("grumble")
if(prob(10))
M << "<span class='danger'>So itchy!</span>"
M.adjustBruteLoss(2)
if(prob(6))
M.reagents.add_reagent("histamine",rand(1,3))
M.reagents.add_reagent("histamine", rand(1,3))
if(prob(2))
M << "<span class='danger'>AHHHHHH!</span>"
M.adjustBruteLoss(5)
M.Weaken(5)
M.jitteriness += 6
M.visible_message("<span class='danger'>[M] falls to the floor, scratching themselves violently!</span>")
M.emote("scream")
..()
return
@@ -240,7 +291,7 @@
var/mob/living/carbon/human/H = M
if(volume < 5)
M << "<span class = 'danger'>The blueish acidic substance stings you, but isn't concentrated enough to harm you!</span>"
M << "<span class='danger'>The blueish acidic substance stings you, but isn't concentrated enough to harm you!</span>"
if(volume >=5 && volume <=10)
if(!H.unacidable)
@@ -305,22 +356,24 @@
/datum/reagent/initropidril/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(33))
switch(pick(1,2))
if(1)
M << "<span class = 'danger'>You feel horrendously weak!</span>"
M.Stun(2)
if(2)
M.adjustToxLoss(rand(5,25))
M.adjustToxLoss(rand(5,25))
if(prob(33))
M << "<span class='danger'>You feel horribly weak.</span>"
M.Stun(2)
if(prob(10))
switch(pick(1,2))
if(1)
M << "<span class = 'danger'>You cannot breathe!</span>"
M.losebreath += 5
M.adjustOxyLoss(10)
if(2)
var/mob/living/carbon/human/H = M
if(!H.heart_attack)
H.heart_attack = 1 // rip in pepperoni
M << "<span class='danger'>You cannot breathe!</span>"
M.adjustOxyLoss(10)
M.losebreath++
if(prob(10))
M << "<span class='danger'>Your chest is burning with pain!</span>"
M.adjustOxyLoss(10)
M.losebreath++
M.Stun(3)
M.Weaken(2)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!H.heart_attack)
H.heart_attack = 1 // rip in pepperoni
..()
return
@@ -335,9 +388,10 @@
/datum/reagent/concentrated_initro/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(volume >=5)
var/mob/living/carbon/human/H = M
if(!H.heart_attack)
H.heart_attack = 1 // rip in pepperoni
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!H.heart_attack)
H.heart_attack = 1 // rip in pepperoni
/datum/reagent/pancuronium
name = "Pancuronium"
@@ -349,12 +403,27 @@
/datum/reagent/pancuronium/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(current_cycle >= 10)
M.Weaken(3)
if(prob(10))
M.losebreath += 1
if(prob(7))
M.losebreath += 3
switch(current_cycle)
if(1 to 5)
if(prob(10))
M.emote(pick("drool", "tremble"))
if(6 to 10)
if(prob(8))
M << "<span class='danger'>You feel [pick("weak", "horribly weak", "numb", "like you can barely move", "tingly")].</span>"
M.Stun(1)
else if(prob(8))
M.emote(pick("drool", "tremble"))
if(11 to INFINITY)
M.Stun(20)
M.Weaken(20)
if(prob(10))
M.emote(pick("drool", "tremble", "gasp"))
M.losebreath++
if(prob(9))
M << "<span class='danger'>You can't [pick("move", "feel your legs", "feel your face", "feel anything")]!</span>"
if(prob(7))
M << "<span class='danger'>You can't breathe!</span>"
M.losebreath += 3
..()
return
@@ -368,12 +437,21 @@
/datum/reagent/sodium_thiopental/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(current_cycle == 1)
switch(current_cycle)
if(1)
M.emote("drool")
M.confused = max(M.confused, 5)
if(2 to 4)
M.drowsyness = max(M.drowsyness, 20)
if(5)
M.emote("faint")
M.Weaken(5)
if(6 to INFINITY)
M.Paralyse(20)
M.jitteriness = max(0, M.jitteriness-50)
if(prob(10))
M.emote("drool")
if(current_cycle >= 2)
M.drowsyness = max(M.drowsyness, 20)
if(current_cycle >= 5)
M.Paralyse(4)
M.adjustBrainLoss(1)
..()
return
@@ -388,13 +466,19 @@
/datum/reagent/ketamine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(current_cycle <= 10)
if(prob(20))
M.emote("yawn")
if(current_cycle == 6)
M.eye_blurry = max(M.eye_blurry, 5)
if(current_cycle >= 10)
M.Paralyse(10)
switch(current_cycle)
if(1 to 5)
if(prob(25))
M.emote("yawn")
if(6 to 9)
M.eye_blurry += 5
if(prob(35))
M.emote("yawn")
if(10)
M.emote("faint")
M.Weaken(5)
if(11 to INFINITY)
M.Paralyse(25)
..()
return
@@ -417,18 +501,21 @@
/datum/reagent/sulfonal/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(1)
if(current_cycle >= 11)
M.drowsyness = max(M.drowsyness, 20)
M.jitteriness = max(0, M.jitteriness-30)
switch(current_cycle)
if(0 to 10)
if(prob(5))
if(1 to 10)
if(prob(7))
M.emote("yawn")
if(22)
if(11 to 20)
M.drowsyness = max(M.drowsyness, 20)
if(21)
M.emote("faint")
if(23 to INFINITY)
if(22 to INFINITY)
if(prob(20))
M.emote("faint")
M.Paralyse(5)
M.drowsyness = max(M.drowsyness, 20)
M.adjustToxLoss(1)
..()
return
@@ -467,13 +554,18 @@
/datum/reagent/lipolicide/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(!holder.has_reagent("nutriment"))
if(prob(30))
M.adjustToxLoss(1)
M.nutrition -= 10 * REAGENTS_METABOLISM
M.overeatduration = 0
if(M.nutrition < 0)//Prevent from going into negatives.
M.nutrition = 0
if(!M.nutrition)
switch(rand(1,3))
if(1)
M << "<span class='warning'>You feel hungry...</span>"
if(2)
M.adjustToxLoss(1)
M << "<span class='warning'>Your stomach grumbles painfully!</span>"
else
if(prob(60))
var/fat_to_burn = max(round(M.nutrition/100,1), 5)
M.nutrition = max(0, M.nutrition-fat_to_burn)
M.overeatduration = 0
..()
return
@@ -487,8 +579,8 @@
/datum/reagent/coniine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.losebreath += 5
M.adjustToxLoss(2)
M.losebreath += 5
..()
return
@@ -503,65 +595,101 @@
/datum/reagent/curare/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(5))
M.emote(pick("gasp","drool", "pale"))
if(current_cycle >= 11)
M.Weaken(15)
M.adjustToxLoss(1)
M.adjustOxyLoss(1)
switch(current_cycle)
if(1 to 5)
if(prob(20))
M.emote(pick("drool", "pale", "gasp"))
if(6 to 10)
M.eye_blurry += 5
if(prob(8))
M << "<span class='danger'>You feel [pick("weak", "horribly weak", "numb", "like you can barely move", "tingly")].</span>"
M.Stun(1)
else if(prob(8))
M.emote(pick("drool","pale", "gasp"))
if(11 to INFINITY)
M.Stun(30)
M.drowsyness = max(M.drowsyness, 20)
if(prob(20))
M.emote(pick("drool", "faint", "pale", "gasp", "collapse"))
else if(prob(8))
M << "<span class='danger'>You can't [pick("breathe", "move", "feel your legs", "feel your face", "feel anything")]!</span>"
M.losebreath++
..()
return
/datum/reagent/tabun
name = "Tabun"
id = "tabun"
/datum/reagent/sarin
name = "Sarin"
id = "sarin"
description = "An extremely deadly neurotoxin."
reagent_state = LIQUID
color = "#C7C7C7"
metabolization_rate = 0.1
penetrates_skin = 1
/datum/chemical_reaction/tabun
name = "tabun"
id = "tabun"
result = "tabun"
required_reagents = list("phenol" = 1, "diethylamine" = 1, "phosphorus" = 1, "oxygen" = 1, "chlorine" = 1, "sodiumchloride" = 1, "ethanol" = 1, "cyanide" = 1)
result_amount = 8
/datum/chemical_reaction/sarin
name = "sarin"
id = "sarin"
result = "sarin"
required_reagents = list("chlorine" = 1, "fuel" = 1, "oxygen" = 1, "phosphorus" = 1, "fluorine" = 1, "hydrogen" = 1, "acetone" = 1, "atrazine" = 1)
result_amount = 3
mix_message = "The mixture yields a colorless, odorless liquid."
min_temp = 374
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/reagent/tabun/on_mob_life(var/mob/living/M as mob)
/datum/chemical_reaction/sarin/on_reaction(var/datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='warning'>The solution generates a strong vapor!</span>")
for(var/mob/living/carbon/C in range(T, 2))
if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)))
C.reagents.add_reagent("sarin",4)
/datum/reagent/sarin/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustFireLoss(1)
if(prob(20))
M.emote(pick("twitch","drool", "quiver"))
if(prob(10))
M.emote("scream")
M.drop_l_hand()
M.drop_r_hand()
if(prob(5))
M.confused = max(M.confused, 3)
if(prob(15))
M.fakevomit()
if(prob(2))
M.visible_message("<span class='danger'>[M] starts having a seizure!</span>", "<span class='danger'>You have a seizure!</span>")
M.Paralyse(5)
M.jitteriness = 1000
if(current_cycle >= 5)
M.jitteriness += 10
if(current_cycle >= 20)
if(prob(5))
M.emote("collapse")
switch(current_cycle)
if(0 to 60)
M.adjustBrainLoss(1)
M.adjustToxLoss(1)
if(1 to 15)
M.jitteriness += 20
if(prob(20))
M.emote(pick("twitch","twitch_s","quiver"))
if(16 to 30)
if(prob(25))
M.emote(pick("twitch","twitch","drool","quiver","tremble"))
M.eye_blurry += 5
M.stuttering = max(M.stuttering, 5)
if(prob(10))
M.confused = max(M.confused, 15)
if(prob(15))
M.Stun(1)
M.emote("scream")
if(30 to 60)
M.eye_blurry += 5
M.stuttering = max(M.stuttering, 5)
if(prob(10))
M.Stun(1)
M.emote(pick("twitch","twitch","drool","shake","tremble"))
if(prob(5))
M.emote("collapse")
if(prob(5))
M.Weaken(3)
M.visible_message("<span class='warning'>[M] has a seizure!</span>")
M.jitteriness = 1000
if(prob(5))
M << "<span class='warning'>You can't breathe!</span>"
M.emote(pick("gasp", "choke", "cough"))
M.losebreath++
if(61 to INFINITY)
M.adjustBrainLoss(2)
M.adjustToxLoss(2)
M.Paralyse(5)
M.losebreath += 5
if(prob(15))
M.emote(pick("gasp", "choke", "cough","twitch", "shake", "tremble","quiver","drool", "twitch","collapse"))
M.losebreath = max(5, M.losebreath + 5)
M.adjustToxLoss(1)
M.adjustBrainLoss(1)
M.Weaken(4)
if(prob(8))
M.fakevomit()
M.adjustToxLoss(1)
M.adjustBrainLoss(1)
M.adjustFireLoss(1)
..()
return
@@ -646,10 +774,18 @@
/datum/reagent/capulettium/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.eye_blurry = max(M.eye_blurry, 2)
if(current_cycle == 12)
M.emote("deathgasp")
M.Paralyse(10)
switch(current_cycle)
if(1 to 5)
M.eye_blurry += 10
if(6 to 10)
M.drowsyness = max(M.drowsyness, 10)
if(11)
M.Paralyse(10)
M.visible_message("<B>[M]</B> seizes up and falls limp, their eyes dead and lifeless...") //so you can't trigger deathgasp emote on people. Edge case, but necessary.
if(12 to 60)
M.Paralyse(10)
if(61 to INFINITY)
M.eye_blurry += 10
..()
return
@@ -684,14 +820,12 @@
/datum/reagent/toxic_slurry/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(10))
M.adjustToxLoss(rand(2,4))
M.adjustToxLoss(rand(2.4))
if(prob(7))
switch(pick(1,2))
if(1)
M.fakevomit(1)
if(2)
M.Stun(rand(4,10))
M << "<span class='warning'>A horrible migraine overpowers you.</span>"
M << "<span class='danger'>A horrible migraine overpowers you.</span>"
M.Stun(rand(2,5))
if(prob(7))
M.fakevomit(1)
..()
return
@@ -706,21 +840,18 @@
if(!..()) return
if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
src = null
if((method==TOUCH && prob(33)) || method==INGEST)
if(prob(98))
randmutb(M)
else
randmutg(M)
if((method==TOUCH && prob(50)) || method==INGEST)
randmutb(M)
domutcheck(M, null)
M.UpdateAppearance()
return
/datum/reagent/glowing_slurry/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.apply_effect(2*REM, IRRADIATE, 0, negate_armor = 1)
M.apply_effect(2, IRRADIATE, 0, negate_armor = 1)
if(prob(15))
randmutb(M)
if(prob(5))
if(prob(3))
randmutg(M)
domutcheck(M, null)
M.UpdateAppearance()
@@ -738,9 +869,9 @@
/datum/reagent/ants/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) //NOT THE ANTS
if(iscarbon(M))
if(method == TOUCH || method==INGEST)
M.adjustBruteLoss(4)
M.emote("scream")
M << "<span class='warning'>OH SHIT ANTS!!!!</span>"
M.emote("scream")
M.adjustBruteLoss(4)
/datum/reagent/ants/on_mob_life(var/mob/living/M as mob)
@@ -757,6 +888,7 @@
color = "#20324D" //RGB: 32, 50, 77
metabolization_rate = 0.2
var/shock_timer = 0
process_flags = ORGANIC | SYNTHETIC
/datum/reagent/teslium/on_mob_life(mob/living/M)
shock_timer++
@@ -4,11 +4,13 @@
description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans."
reagent_state = LIQUID
color = "#202040" // rgb: 20, 20, 40
metabolization_rate = 0.25 * REAGENTS_METABOLISM
/datum/reagent/serotrotium/on_mob_life(var/mob/living/M as mob)
if(ishuman(M))
if(prob(7)) M.emote(pick("twitch","drool","moan","gasp"))
holder.remove_reagent(src.id, 0.25 * REAGENTS_METABOLISM)
if(prob(7))
M.emote(pick("twitch","drool","moan","gasp"))
..()
return
@@ -21,8 +23,9 @@
/datum/reagent/lithium/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.canmove && !M.restrained() && istype(M.loc, /turf/space))
step(M, pick(cardinal))
if(isturf(M.loc) && !istype(M.loc, /turf/space))
if(M.canmove && !M.restrained())
step(M, pick(cardinal))
if(prob(5)) M.emote(pick("twitch","drool","moan"))
..()
return
@@ -71,6 +74,7 @@
/datum/reagent/lsd/on_mob_life(var/mob/living/M)
if(!M) M = holder.my_atom
M.druggy = max(M.druggy, 15)
M.hallucination += 10
..()
return
@@ -89,7 +93,7 @@
M.druggy = max(M.druggy, 15)
if(isturf(M.loc) && !istype(M.loc, /turf/space))
if(M.canmove && !M.restrained())
if(prob(10)) step(M, pick(cardinal))
step(M, pick(cardinal))
if(prob(7)) M.emote(pick("twitch","drool","moan","giggle"))
..()
return
@@ -13,12 +13,6 @@
return
..()
/datum/reagent/fuel/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(1)
..()
return
/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
name = "Unholy Water"
id = "unholywater"
@@ -84,13 +78,6 @@
T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
return
/datum/reagent/thermite/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustFireLoss(1)
..()
return
/datum/reagent/glycerol
name = "Glycerol"
id = "glycerol"
@@ -436,22 +436,28 @@
overdose_threshold = 200 // Hyperglycaemic shock
/datum/reagent/sugar/on_mob_life(var/mob/living/M as mob)
if(prob(4))
M.reagents.add_reagent("epinephrine", 1.2)
M.drowsyness = max(0, M.drowsyness-5)
if(current_cycle >= 90)
M.jitteriness += 2
if(prob(50))
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
if(current_cycle >= 90)
M.jitteriness += 10
if(prob(4))
M.reagents.add_reagent("epinephrine", 1.2)
..()
return
/datum/reagent/sugar/overdose_start(var/mob/living/M as mob)
M << "<span class='danger'>You pass out from hyperglycemic shock!</span>"
M.emote("collapse")
..()
/datum/reagent/sugar/overdose_process(var/mob/living/M as mob)
if(volume > 200)
M << "<span class = 'danger'>You pass out from hyperglycemic shock!</span>"
M.Paralyse(1)
M.Paralyse(3)
M.Weaken(4)
if(prob(8))
M.adjustToxLoss(rand(1,2))
M.adjustToxLoss(1)
..()
return
@@ -57,9 +57,11 @@
/datum/reagent/synaptizine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.drowsyness = max(0, M.drowsyness-5)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
M.SetSleeping(0)
if(prob(50))
M.adjustBrainLoss(-1.0)
..()
@@ -97,8 +99,8 @@
if(M.bodytemperature < 265)
M.adjustCloneLoss(-4)
M.adjustOxyLoss(-10)
M.heal_organ_damage(12,12)
M.adjustToxLoss(-3)
M.heal_organ_damage(12,12)
M.status_flags &= ~DISFIGURED
..()
return
@@ -132,8 +134,4 @@
description = "An all-purpose antibiotic agent extracted from space fungus."
reagent_state = LIQUID
color = "#0AB478"
metabolization_rate = 0.2
/datum/reagent/spaceacillin/on_mob_life(var/mob/living/M as mob)
..()
return
metabolization_rate = 0.2
@@ -188,7 +188,7 @@
/datum/reagent/radium/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.radiation < 80)
M.apply_effect(4,IRRADIATE,0)
M.apply_effect(4, IRRADIATE, negate_armor = 1)
// radium may increase your chances to cure a disease
if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs
var/mob/living/carbon/C = M
@@ -197,7 +197,7 @@
var/datum/disease2/disease/V = C.virus2[ID]
if(prob(5))
if(prob(50))
M.apply_effect(50,IRRADIATE,0) // curing it that way may kill you instead
M.apply_effect(50, IRRADIATE, negate_armor = 1) // curing it that way may kill you instead
M.adjustToxLoss(100)
C.antibodies |= V.antigen
..()
@@ -224,10 +224,7 @@
if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
src = null
if((method==TOUCH && prob(33)) || method==INGEST)
if(prob(98))
randmutb(M)
else
randmutg(M)
randmutb(M)
domutcheck(M, null)
M.UpdateAppearance()
return
@@ -235,7 +232,7 @@
/datum/reagent/mutagen/on_mob_life(var/mob/living/M as mob)
if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
if(!M) M = holder.my_atom
M.apply_effect(2*REM,IRRADIATE,0)
M.apply_effect(2*REM, IRRADIATE, negate_armor = 1)
if(prob(4))
randmutb(M)
..()
@@ -251,7 +248,7 @@
/datum/reagent/uranium/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.apply_effect(2,IRRADIATE,0)
M.apply_effect(2, IRRADIATE, negate_armor = 1)
..()
return
@@ -327,7 +324,7 @@
var/mob/living/carbon/human/H = M
if(volume < 10)
M << "<span class = 'danger'>The greenish acidic substance stings you, but isn't concentrated enough to harm you!</span>"
M << "<span class='danger'>The greenish acidic substance stings you, but isn't concentrated enough to harm you!</span>"
if(volume >=10 && volume <=25)
if(!H.unacidable)
@@ -184,16 +184,18 @@
if(!istype(T)) return
var/datum/reagent/blood/self = src
src = null
if(!(volume >= 3)) return
var/big_splash = 1
if(volume < 3)
big_splash = 0
//var/datum/disease/D = self.data["virus"]
if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human))
blood_splatter(T, src, big_splash)
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here
if(!blood_prop) //first blood!
blood_prop = new(T)
blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"]
if(self.data["virus2"])
blood_prop.virus2 = virus_copylist(self.data["virus2"])
if(blood_prop)
blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"]
if(self.data["virus2"])
blood_prop.virus2 = virus_copylist(self.data["virus2"])
else if(istype(self.data["donor"], /mob/living/carbon/alien))
var/obj/effect/decal/cleanable/blood/xeno/blood_prop = locate() in T
@@ -264,44 +266,40 @@
M.stuttering = 0
M.confused = 0
return
if(ishuman(M) && M.mind) .
if(((M.mind in ticker.mode.vampires) || M.mind.vampire) && (!(VAMP_FULL in M.mind.vampire.powers)) && prob(80))
switch(data)
if(1 to 4)
M << "<span class = 'warning'>Something sizzles in your veins!</span>"
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
if(5 to 12)
M << "<span class = 'danger'>You feel an intense burning inside of you!</span>"
M.adjustFireLoss(1)
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
if(13 to INFINITY)
M << "<span class = 'danger'>You suddenly ignite in a holy fire!</span>"
for(var/mob/O in viewers(M, null))
O.show_message(text("<span class = 'danger'>[] suddenly bursts into flames!<span>", M), 1)
M.fire_stacks = min(5,M.fire_stacks + 3)
M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
M.adjustFireLoss(3) //Hence the other damages... ain't I a bastard?
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full) && prob(80))
switch(data)
if(1 to 4)
M << "<span class = 'warning'>Something sizzles in your veins!</span>"
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
if(5 to 12)
M << "<span class = 'danger'>You feel an intense burning inside of you!</span>"
M.adjustFireLoss(1)
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
if(13 to INFINITY)
M << "<span class = 'danger'>You suddenly ignite in a holy fire!</span>"
for(var/mob/O in viewers(M, null))
O.show_message(text("<span class = 'danger'>[] suddenly bursts into flames!<span>", M), 1)
M.fire_stacks = min(5,M.fire_stacks + 3)
M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
M.adjustFireLoss(3) //Hence the other damages... ain't I a bastard?
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
..()
return
/datum/reagent/holywater/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
// Vampires have their powers weakened by holy water applied to the skin.
if(ishuman(M))
if((M.mind in ticker.mode.vampires) && !(VAMP_FULL in M.mind.vampire.powers))
var/mob/living/carbon/human/H=M
if(method == TOUCH)
if(H.wear_mask)
H << "\red Your mask protects you from the holy water!"
return
else if(H.head)
H << "\red Your helmet protects you from the holy water!"
return
else
M << "<span class='warning'>Something holy interferes with your powers!</span>"
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
return
if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full))
var/mob/living/carbon/human/H=M
if(method == TOUCH)
if(H.wear_mask)
H << "\red Your mask protects you from the holy water!"
return
else if(H.head)
H << "\red Your helmet protects you from the holy water!"
return
else
M << "<span class='warning'>Something holy interferes with your powers!</span>"
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
/datum/reagent/holywater/reaction_turf(var/turf/simulated/T, var/volume)
@@ -580,6 +580,22 @@
icon_state = "servoglass"
name = "Glass of Servo"
desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe."
if("synthnsoda")
icon_state = "synthnsodaglass"
name = "Glass of Synth 'n Soda"
desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon."
if("synthignon")
icon_state = "synthignonglass"
name = "Glass of Synthignon"
desc = "Someone mixed good wine and robot booze. Romantic, but atrocious."
if("uplink")
icon_state = "uplinkglass"
name = "Glass of Uplink"
desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics."
if("holywater")
icon_state = "glass_clear"
name = "Glass of Water"
desc = "The father of all refreshments."
else
@@ -299,4 +299,4 @@
New()
..()
reagents.add_reagent(pick("polonium","initropidril","concentrated_initro","pancuronium","sodium_thiopental","ketamine","sulfonal","amanitin","coniine","curare","tabun","histamine","venom","cyanide"), 40)
reagents.add_reagent(pick("polonium","initropidril","concentrated_initro","pancuronium","sodium_thiopental","ketamine","sulfonal","amanitin","coniine","curare","sarin","histamine","venom","cyanide"), 40)
@@ -15,327 +15,330 @@
possible_transfer_amounts = null //list(5,10,15)
volume = 15
w_class = 1
sharp = 1
var/mode = SYRINGE_DRAW
on_reagent_change()
update_icon()
/obj/item/weapon/reagent_containers/syringe/on_reagent_change()
update_icon()
pickup(mob/user)
/obj/item/weapon/reagent_containers/syringe/pickup(mob/user)
..()
update_icon()
/obj/item/weapon/reagent_containers/syringe/dropped(mob/user)
..()
update_icon()
/obj/item/weapon/reagent_containers/syringe/attack_self(mob/user as mob)
switch(mode)
if(SYRINGE_DRAW)
mode = SYRINGE_INJECT
if(SYRINGE_INJECT)
mode = SYRINGE_DRAW
if(SYRINGE_BROKEN)
return
update_icon()
/obj/item/weapon/reagent_containers/syringe/attack_hand()
..()
update_icon()
/obj/item/weapon/reagent_containers/syringe/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
return
/obj/item/weapon/reagent_containers/syringe/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I,/obj/item/weapon/storage/bag))
..()
update_icon()
return
dropped(mob/user)
..()
update_icon()
/obj/item/weapon/reagent_containers/syringe/afterattack(obj/target, mob/user, proximity)
if(!proximity) return
if(!target.reagents) return
attack_self(mob/user as mob)
switch(mode)
if(SYRINGE_DRAW)
mode = SYRINGE_INJECT
if(SYRINGE_INJECT)
mode = SYRINGE_DRAW
if(SYRINGE_BROKEN)
return
update_icon()
attack_hand()
..()
update_icon()
attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I,/obj/item/weapon/storage/bag))
..()
return
afterattack(obj/target, mob/user, proximity)
if(!proximity) return
if(!target.reagents) return
if(isliving(target))
var/mob/living/M = target
if(!M.can_inject(user, 1))
return
if(mode == SYRINGE_BROKEN)
user << "\red This syringe is broken!"
if(isliving(target))
var/mob/living/M = target
if(!M.can_inject(user, 1))
return
/* if (user.a_intent == I_HARM && ismob(target))
if((CLUMSY in user.mutations) && prob(50))
target = user
syringestab(target, user)
return */
if(mode == SYRINGE_BROKEN)
user << "\red This syringe is broken!"
return
/* if (user.a_intent == I_HARM && ismob(target))
if((CLUMSY in user.mutations) && prob(50))
target = user
syringestab(target, user)
return */
switch(mode)
if(SYRINGE_DRAW)
switch(mode)
if(SYRINGE_DRAW)
if(reagents.total_volume >= reagents.maximum_volume)
user << "\red The syringe is full."
if(reagents.total_volume >= reagents.maximum_volume)
user << "\red The syringe is full."
return
if(ismob(target))//Blood!
if(istype(target, /mob/living/carbon/slime))
user << "\red You are unable to locate any blood."
return
if(ismob(target))//Blood!
if(istype(target, /mob/living/carbon/slime))
if(src.reagents.has_reagent("blood"))
user << "\red There is already a blood sample in this syringe"
return
if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea.
var/mob/living/carbon/T = target
if(!T.dna)
usr << "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)"
return
if(NOCLONE in T.mutations) //target done been et, no more blood in him
user << "\red You are unable to locate any blood."
return
if(src.reagents.has_reagent("blood"))
user << "\red There is already a blood sample in this syringe"
return
if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea.
var/mob/living/carbon/T = target
if(!T.dna)
usr << "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)"
return
if(NOCLONE in T.mutations) //target done been et, no more blood in him
user << "\red You are unable to locate any blood."
return
var/time = 30 //Injecting through a hardsuit takes longer due to needing to find a port.
if(istype(target,/mob/living/carbon/human))
var/mob/living/carbon/human/H = T
if(H.species.flags & NO_BLOOD)
usr << "<span class='warning'>You are unable to locate any blood.</span>"
return
if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space))
time = 60
if(target == user)
time = 0
else
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red <B>[] is trying to take a blood sample from []!</B>", user, target), 1)
if(!do_mob(user, target, time))
return
var/amount = src.reagents.maximum_volume - src.reagents.total_volume
if(amount == 0)
usr << "<span class='warning'>The syringe is full!</span>"
return
var/datum/reagent/B
if(istype(T,/mob/living/carbon/human))
var/mob/living/carbon/human/H = T
if(H.species && H.species.exotic_blood && H.reagents.total_volume)
H.reagents.trans_to(src,amount)
else
B = T.take_blood(src,amount)
else
B = T.take_blood(src,amount)
if (B)
src.reagents.reagent_list |= B
src.reagents.update_total()
src.on_reagent_change()
src.reagents.handle_reactions()
user << "\blue You take a blood sample from [target]"
for(var/mob/O in viewers(4, user))
O.show_message("\red [user] takes a blood sample from [target].", 1)
else //if not mob
if(!target.reagents.total_volume)
user << "\red [target] is empty."
return
if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract))
user << "\red You cannot directly remove reagents from this object."
return
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares?
user << "\blue You fill the syringe with [trans] units of the solution."
if (reagents.total_volume >= reagents.maximum_volume)
mode=!mode
update_icon()
if(SYRINGE_INJECT)
if(!reagents.total_volume)
user << "\red The Syringe is empty."
return
if(istype(target, /obj/item/weapon/implantcase/chem))
return
if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes))
user << "\red You cannot directly fill this object."
return
if(istype(target, /obj/item/clothing/mask/cigarette))
var/obj/item/clothing/mask/cigarette/C = target
if(istype(C.loc, /obj/item/weapon/storage/fancy/cigarettes))
user << "\red You cannot inject a cigarette while it's still in the pack."
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
user << "\red [target] is full."
return
var/mob/living/carbon/human/H = target
if(istype(H))
var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
if(!affected)
user << "<span class='danger'>\The [H] is missing that limb!</span>"
return
/* else if(affected.status & ORGAN_ROBOT)
user << "<span class='danger'>You cannot inject a robotic limb.</span>"
return */
if(ismob(target) && target != user)
var/time = 30 //Injecting through a hardsuit takes longer due to needing to find a port.
if(istype(target,/mob/living/carbon/human))
var/mob/living/carbon/human/H = T
if(H.species.flags & NO_BLOOD)
usr << "<span class='warning'>You are unable to locate any blood.</span>"
return
if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space))
time = 60
for(var/mob/O in viewers(world.view, user))
if(time == 30)
O.show_message(text("\red <B>[] is trying to inject []!</B>", user, target), 1)
else
O.show_message(text("\red <B>[] begins hunting for an injection port on []'s suit!</B>", user, target), 1)
if(!do_mob(user, target, time)) return
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red [] injects [] with the syringe!", user, target), 1)
if(istype(target,/mob/living))
var/mob/living/M = target
var/list/injected = list()
for(var/datum/reagent/R in src.reagents.reagent_list)
injected += R.name
var/contained = english_list(injected)
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been injected with [src.name] by [key_name(user)]. Reagents: [contained]</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to inject [key_name(M)]. Reagents: [contained]</font>")
if(M.ckey)
msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
if(!iscarbon(user))
M.LAssailant = null
else
M.LAssailant = user
src.reagents.reaction(target, INGEST)
if(ismob(target) && target == user)
src.reagents.reaction(target, INGEST)
if(isobj(target))
// /vg/: Logging transfers of bad things
if(target.reagents_to_log.len)
var/list/badshit=list()
for(var/bad_reagent in target.reagents_to_log)
if(reagents.has_reagent(bad_reagent))
badshit += reagents_to_log[bad_reagent]
if(badshit.len)
var/hl="\red <b>([english_list(badshit)])</b> \black"
message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] ")
log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].")
spawn(5)
var/datum/reagent/blood/B
for(var/datum/reagent/blood/d in src.reagents.reagent_list)
B = d
break
var/datum/reagent/water/W
for(var/datum/reagent/water/r in src.reagents.reagent_list)
W = r
break
var/trans
if(W && istype(target,/mob/living/carbon/human/slime))
var/mob/living/carbon/human/slime/S = target
S.vessel.add_reagent("water", 5)
S.vessel.update_total()
if(B && istype(target,/mob/living/carbon))
if(istype(target,/mob/living/carbon/human/slime))
var/mob/living/carbon/human/slime/S = target
S.reagents.add_reagent("blood", 5)
S.reagents.update_total()
else
var/mob/living/carbon/C = target
C.inject_blood(src,5)
if(target == user)
time = 0
else
trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units."
if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT)
mode = SYRINGE_DRAW
update_icon()
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red <B>[] is trying to take a blood sample from []!</B>", user, target), 1)
if(!do_mob(user, target, time))
return
return
var/amount = src.reagents.maximum_volume - src.reagents.total_volume
if(amount == 0)
usr << "<span class='warning'>The syringe is full!</span>"
return
update_icon()
if(mode == SYRINGE_BROKEN)
icon_state = "broken"
overlays.Cut()
return
var/rounded_vol = round(reagents.total_volume,5)
overlays.Cut()
if(ismob(loc))
var/injoverlay
switch(mode)
if (SYRINGE_DRAW)
injoverlay = "draw"
if (SYRINGE_INJECT)
injoverlay = "inject"
overlays += injoverlay
icon_state = "[rounded_vol]"
item_state = "syringe_[rounded_vol]"
var/datum/reagent/B
if(istype(T,/mob/living/carbon/human))
var/mob/living/carbon/human/H = T
if(H.species && H.species.exotic_blood && H.reagents.total_volume)
H.reagents.trans_to(src,amount)
else
B = T.take_blood(src,amount)
else
B = T.take_blood(src,amount)
if(reagents.total_volume)
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "syringe10")
if (B)
src.reagents.reagent_list |= B
src.reagents.update_total()
src.on_reagent_change()
src.reagents.handle_reactions()
filling.icon_state = "syringe[rounded_vol]"
user << "\blue You take a blood sample from [target]"
for(var/mob/O in viewers(4, user))
O.show_message("\red [user] takes a blood sample from [target].", 1)
filling.icon += mix_color_from_reagents(reagents.reagent_list)
overlays += filling
else //if not mob
if(!target.reagents.total_volume)
user << "\red [target] is empty."
return
if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract))
user << "\red You cannot directly remove reagents from this object."
return
/obj/item/weapon/reagent_containers/syringe/proc/syringestab(mob/living/carbon/target as mob, mob/living/carbon/user as mob)
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares?
user.attack_log += "\[[time_stamp()]\]<font color='red'> Attacked [target.name] ([target.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
target.attack_log += "\[[time_stamp()]\]<font color='orange'> Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
if(target.ckey)
msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(target)] with [src.name] (INTENT: [uppertext(user.a_intent)])")
if(!iscarbon(user))
target.LAssailant = null
else
target.LAssailant = user
user << "\blue You fill the syringe with [trans] units of the solution."
if (reagents.total_volume >= reagents.maximum_volume)
mode=!mode
update_icon()
if(istype(target, /mob/living/carbon/human))
var/target_zone = ran_zone(check_zone(user.zone_sel.selecting, target))
var/obj/item/organ/external/affecting = target:get_organ(target_zone)
if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump())
user << "<span class='danger'>They are missing that limb!</span>"
if(SYRINGE_INJECT)
if(!reagents.total_volume)
user << "\red The Syringe is empty."
return
if(istype(target, /obj/item/weapon/implantcase/chem))
return
if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes))
user << "\red You cannot directly fill this object."
return
if(istype(target, /obj/item/clothing/mask/cigarette))
var/obj/item/clothing/mask/cigarette/C = target
if(istype(C.loc, /obj/item/weapon/storage/fancy/cigarettes))
user << "\red You cannot inject a cigarette while it's still in the pack."
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
user << "\red [target] is full."
return
var/hit_area = affecting.name
var/mob/living/carbon/human/H = target
if((user != target) && H.check_shields(7, "the [src.name]"))
return
if(istype(H))
var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
if(!affected)
user << "<span class='danger'>\The [H] is missing that limb!</span>"
return
/* else if(affected.status & ORGAN_ROBOT)
user << "<span class='danger'>You cannot inject a robotic limb.</span>"
return */
if(ismob(target) && target != user)
var/time = 30 //Injecting through a hardsuit takes longer due to needing to find a port.
if(istype(target,/mob/living/carbon/human))
if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space))
time = 60
if (target != user && target.getarmor(target_zone, "melee") > 5 && prob(50))
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red <B>[user] tries to stab [target] in \the [hit_area] with [src.name], but the attack is deflected by armor!</B>"), 1)
user.unEquip(src)
qdel(src)
return
if(time == 30)
O.show_message(text("\red <B>[] is trying to inject []!</B>", user, target), 1)
else
O.show_message(text("\red <B>[] begins hunting for an injection port on []'s suit!</B>", user, target), 1)
if(!do_mob(user, target, time)) return
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red [] injects [] with the syringe!", user, target), 1)
if(istype(target,/mob/living))
var/mob/living/M = target
var/list/injected = list()
for(var/datum/reagent/R in src.reagents.reagent_list)
injected += R.name
var/contained = english_list(injected)
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been injected with [src.name] by [key_name(user)]. Reagents: [contained]</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to inject [key_name(M)]. Reagents: [contained]</font>")
if(M.ckey)
msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
if(!iscarbon(user))
M.LAssailant = null
else
M.LAssailant = user
src.reagents.reaction(target, INGEST)
if(ismob(target) && target == user)
src.reagents.reaction(target, INGEST)
if(isobj(target))
// /vg/: Logging transfers of bad things
if(target.reagents_to_log.len)
var/list/badshit=list()
for(var/bad_reagent in target.reagents_to_log)
if(reagents.has_reagent(bad_reagent))
badshit += reagents_to_log[bad_reagent]
if(badshit.len)
var/hl="\red <b>([english_list(badshit)])</b> \black"
message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] ")
log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].")
spawn(5)
var/datum/reagent/blood/B
for(var/datum/reagent/blood/d in src.reagents.reagent_list)
B = d
break
var/datum/reagent/water/W
for(var/datum/reagent/water/r in src.reagents.reagent_list)
W = r
break
var/trans
if(W && istype(target,/mob/living/carbon/human/slime))
var/mob/living/carbon/human/slime/S = target
S.vessel.add_reagent("water", 5)
S.vessel.update_total()
if(B && istype(target,/mob/living/carbon))
if(istype(target,/mob/living/carbon/human/slime))
var/mob/living/carbon/human/slime/S = target
S.reagents.add_reagent("blood", 5)
S.reagents.update_total()
else
var/mob/living/carbon/C = target
C.inject_blood(src,5)
else
trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units."
if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT)
mode = SYRINGE_DRAW
update_icon()
return
/obj/item/weapon/reagent_containers/syringe/update_icon()
if(mode == SYRINGE_BROKEN)
icon_state = "broken"
overlays.Cut()
return
var/rounded_vol = round(reagents.total_volume,5)
overlays.Cut()
if(ismob(loc))
var/injoverlay
switch(mode)
if (SYRINGE_DRAW)
injoverlay = "draw"
if (SYRINGE_INJECT)
injoverlay = "inject"
overlays += injoverlay
icon_state = "[rounded_vol]"
item_state = "syringe_[rounded_vol]"
if(reagents.total_volume)
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "syringe10")
filling.icon_state = "syringe[rounded_vol]"
filling.icon += mix_color_from_reagents(reagents.reagent_list)
overlays += filling
/obj/item/weapon/reagent_containers/syringe/proc/syringestab(mob/living/carbon/target as mob, mob/living/carbon/user as mob)
user.attack_log += "\[[time_stamp()]\]<font color='red'> Attacked [target.name] ([target.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
target.attack_log += "\[[time_stamp()]\]<font color='orange'> Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
if(target.ckey)
msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(target)] with [src.name] (INTENT: [uppertext(user.a_intent)])")
if(!iscarbon(user))
target.LAssailant = null
else
target.LAssailant = user
if(istype(target, /mob/living/carbon/human))
var/target_zone = ran_zone(check_zone(user.zone_sel.selecting, target))
var/obj/item/organ/external/affecting = target:get_organ(target_zone)
if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump())
user << "<span class='danger'>They are missing that limb!</span>"
return
var/hit_area = affecting.name
var/mob/living/carbon/human/H = target
if((user != target) && H.check_shields(7, "the [src.name]"))
return
if (target != user && target.getarmor(target_zone, "melee") > 5 && prob(50))
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red <B>[user] stabs [target] in \the [hit_area] with [src.name]!</B>"), 1)
O.show_message(text("\red <B>[user] tries to stab [target] in \the [hit_area] with [src.name], but the attack is deflected by armor!</B>"), 1)
user.unEquip(src)
qdel(src)
return
if(affecting.take_damage(3))
target:UpdateDamageIcon()
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red <B>[user] stabs [target] in \the [hit_area] with [src.name]!</B>"), 1)
else
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red <B>[user] stabs [target] with [src.name]!</B>"), 1)
target.take_organ_damage(3)// 7 is the same as crowbar punch
if(affecting.take_damage(3))
target:UpdateDamageIcon()
src.reagents.reaction(target, INGEST)
var/syringestab_amount_transferred = rand(0, (reagents.total_volume - 5)) //nerfed by popular demand
src.reagents.trans_to(target, syringestab_amount_transferred)
src.desc += " It is broken."
src.mode = SYRINGE_BROKEN
src.add_blood(target)
src.add_fingerprint(usr)
src.update_icon()
else
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red <B>[user] stabs [target] with [src.name]!</B>"), 1)
target.take_organ_damage(3)// 7 is the same as crowbar punch
src.reagents.reaction(target, INGEST)
var/syringestab_amount_transferred = rand(0, (reagents.total_volume - 5)) //nerfed by popular demand
src.reagents.trans_to(target, syringestab_amount_transferred)
src.desc += " It is broken."
src.mode = SYRINGE_BROKEN
src.add_blood(target)
src.add_fingerprint(usr)
src.update_icon()
/obj/item/weapon/reagent_containers/ld50_syringe
@@ -273,14 +273,6 @@
materials = list(MAT_METAL = 100)
build_path = /obj/item/weapon/canvas/twentythreeXtwentythree
category = list("initial", "Miscellaneous")
/datum/design/glass_picture_frame
name = "Glass Picture Frame"
id = "glass_picture_frame"
build_type = AUTOLATHE
materials = list(MAT_METAL = 25, MAT_GLASS = 75)
build_path = /obj/item/weapon/picture_frame/glass
category = list("initial", "Miscellaneous")
/datum/design/camera_assembly
name = "Camera Assembly"
@@ -500,4 +500,24 @@
build_type = IMPRINTER
materials = list(MAT_GLASS=1000, "sacid"=20)
build_path = /obj/item/weapon/circuitboard/prize_counter
category = list("Misc. Machinery")
category = list("Misc. Machinery")
/datum/design/botany_extractor
name = "Machine Design (Lysis-Isolation Centrifuge)"
desc = "The circuit board for a lysis-isolation centrifuge."
id = "botany_extractor"
req_tech = list("biotech" = 3, "programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS=1000, "sacid"=20)
build_path = /obj/item/weapon/circuitboard/botany_extractor
category = list("Hydroponics Machinery")
/datum/design/botany_editor
name = "Machine Design (Bioballistic Delivery System)"
desc = "The circuit board for a bioballistic delivery system."
id = "botany_editor"
req_tech = list("biotech" = 3, "programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS=1000, "sacid"=20)
build_path = /obj/item/weapon/circuitboard/botany_editor
category = list("Hydroponics Machinery")
@@ -124,6 +124,39 @@
category = list("Pod_Weaponry")
materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_GOLD=1000,MAT_SILVER=2000)
locked = 1
/datum/design/pod_mining_laser_basic
construction_time = 200
name = "Basic Mining Laser"
desc = "Allows for the construction of a weak mining laser"
id = "pod_mining_laser_basic"
req_tech = list("materials" = 3, "powerstorage" = 2, "engineering" = 2, "magnets" = 3, "combat" = 2)
build_type = PODFAB
materials = list(MAT_METAL = 10000, MAT_GLASS = 5000, MAT_SILVER = 2000, MAT_URANIUM = 2000)
build_path = /obj/item/device/spacepod_equipment/weaponry/mining_laser_basic
category = list("Pod_Weaponry")
/datum/design/pod_mining_laser
construction_time = 200
name = "Mining Laser"
desc = "Allows for the construction of a mining laser."
id = "pod_mining_laser"
req_tech = list("materials" = 6, "powerstorage" = 6, "engineering" = 5, "magnets" = 6, "combat" = 4)
build_type = PODFAB
materials = list(MAT_METAL = 10000, MAT_GLASS = 5000, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
build_path = /obj/item/device/spacepod_equipment/weaponry/mining_laser
category = list("Pod_Weaponry")
/datum/design/pod_mining_laser_hyper
construction_time = 200
name = "Enhanced Mining Laser"
desc = "Allows for the construction of an enhanced mining laser."
id = "pod_mining_laser_hyper"
req_tech = list("materials" = 7, "powerstorage" = 6, "engineering" = 5, "magnets" = 6, "combat" = 4)
build_type = PODFAB
materials = list(MAT_METAL = 10000, MAT_GLASS = 5000, MAT_SILVER = 4000, MAT_GOLD = 4000, MAT_DIAMOND = 4000)
build_path = /obj/item/device/spacepod_equipment/weaponry/mining_laser_hyper
category = list("Pod_Weaponry")
//////////////////////////////////////////
//////SPACEPOD MISC. ITEMS////////////////
//////////////////////////////////////////
@@ -137,4 +170,15 @@
build_type = PODFAB
materials = list(MAT_METAL=5000)
build_path = /obj/item/device/spacepod_equipment/misc/tracker
category = list("Pod_Parts")
/datum/design/pod_cargo_ore
construction_time = 100
name = "Spacepod Ore Storage Module"
desc = "Allows for the construction of a Space Pod Ore Storage Module."
id = "podcargo_ore"
req_tech = list("materials" = 3)
build_type = PODFAB
materials = list(MAT_METAL=20000, MAT_GLASS=2000)
build_path = /obj/item/device/spacepod_equipment/cargo/ore
category = list("Pod_Parts")
@@ -18,7 +18,7 @@
name = "Decloner"
desc = "Your opponent will bubble into a messy pile of goop."
id = "decloner"
req_tech = list("combat" = 8, "materials" = 7, "biotech" = 5, "powerstorage" = 6)
req_tech = list("combat" = 6, "materials" = 7, "biotech" = 5, "powerstorage" = 6)
build_type = PROTOLATHE
materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000)
reagents = list("mutagen" = 40)
+2 -2
View File
@@ -483,7 +483,7 @@
if(!istype(S0))
return 1
for(var/obj/machinery/door/airlock/A in machines)
for(var/obj/machinery/door/airlock/A in airlocks)
if(A.id_tag == S0.id)
spawn(-1)
A.close()
@@ -493,7 +493,7 @@
if(!istype(S1))
return 0
for(var/obj/machinery/door/airlock/A in machines)
for(var/obj/machinery/door/airlock/A in airlocks)
if(A.id_tag == S1.id)
spawn(-1)
if(A.locked)
+1 -7
View File
@@ -59,14 +59,8 @@
if(severity > 1)
if(prob(10 * severity))
return
var/save_sight = owner.sight
owner.sight &= 0
owner.sdisabilities |= BLIND
owner << "<span class='warning'>Static obfuscates your vision!</span>"
spawn(60 / severity)
if(owner)
owner.sight |= save_sight
owner.sdisabilities ^= BLIND
flick("e_flash", owner.flash)
@@ -188,7 +188,7 @@
desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
icon_state = "chest_implant"
implant_color = "#006607"
hunger_threshold = 250
hunger_threshold = 300
poison_amount = 10
origin_tech = "materials=5;programming=3;biotech=5"
@@ -328,18 +328,27 @@
holder = new /obj/item/weapon/gun/energy/laser/mounted(src)
//BOX O' IMPLANTS
/obj/item/weapon/storage/box/cyber_implants
name = "boxed cybernetic implants"
name = "boxed cybernetic implant"
desc = "A sleek, sturdy box."
icon_state = "cyber_implants"
/obj/item/weapon/storage/box/cyber_implants/New(loc, implant)
..()
new /obj/item/device/autoimplanter(src)
if(ispath(implant))
new implant(src)
/obj/item/weapon/storage/box/cyber_implants/bundle
name = "boxed cybernetic implants"
var/list/boxed = list(/obj/item/organ/internal/cyberimp/eyes/xray,/obj/item/organ/internal/cyberimp/eyes/thermals,
/obj/item/organ/internal/cyberimp/brain/anti_stun, /obj/item/organ/internal/cyberimp/chest/reviver)
var/amount = 5
/obj/item/weapon/storage/box/cyber_implants/New()
/obj/item/weapon/storage/box/cyber_implants/bundle/New()
..()
var/i
var/implant
for(i = 0, i < amount, i++)
while(contents.len <= amount + 1) // +1 for the autoimplanter.
implant = pick(boxed)
new implant(src)
@@ -0,0 +1,35 @@
/obj/item/device/autoimplanter
name = "autoimplanter"
desc = "A device that automatically injects a cyber-implant into the user without the hassle of extensive surgery. It has a slot to insert implants and a screwdriver slot for removing accidentally added implants."
icon_state = "autoimplanter"
item_state = "walkietalkie"//left as this so as to intentionally not have inhands
w_class = 2
var/obj/item/organ/internal/cyberimp/storedorgan
/obj/item/device/autoimplanter/attack_self(mob/user)//when the object it used...
if(!storedorgan)
user << "<span class='notice'>[src] currently has no implant stored.</span>"
return
storedorgan.insert(user)//insert stored organ into the user
user.visible_message("<span class='notice'>[user] presses a button on [src], and you hear a short mechanical noise.</span>", "<span class='notice'>You feel a sharp sting as [src] plunges into your body.</span>")
playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 50, 1)
storedorgan = null
/obj/item/device/autoimplanter/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/organ/internal/cyberimp))
if(storedorgan)
user << "<span class='notice'>[src] already has an implant stored.</span>"
return
if(!user.drop_item())
return
I.forceMove(src)
storedorgan = I
user << "<span class='notice'>You insert the [I] into [src].</span>"
else if(istype(I, /obj/item/weapon/screwdriver))
if(!storedorgan)
user << "<span class='notice'>There's no implant in [src] for you to remove.</span>"
else
storedorgan.forceMove(get_turf(user))
storedorgan = null
user << "<span class='notice'>You remove the [storedorgan] from [src].</span>"
playsound(get_turf(user), 'sound/items/Screwdriver.ogg', 50, 1)
+69 -34
View File
@@ -16,13 +16,13 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if(vessel)
return
vessel = new/datum/reagents(600)
vessel = new/datum/reagents(max_blood)
vessel.my_atom = src
if(species && species.exotic_blood)
vessel.add_reagent(species.exotic_blood,560)
vessel.add_reagent(species.exotic_blood, max_blood)
else
vessel.add_reagent("blood",560)
vessel.add_reagent("blood", max_blood)
spawn(1)
fixblood()
@@ -41,18 +41,21 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
return
if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood.
if(species.exotic_blood)
blood_volume = round(vessel.get_reagent_amount(species.exotic_blood))
if(blood_volume < 560 && blood_volume)
var/datum/reagent/water/W = locate() in vessel.reagent_list //Grab some blood
if(W) // Make sure there's some blood at all
W.volume += 0.1 // regenerate blood VERY slowly
if (reagents.has_reagent("nutriment")) //Getting food speeds it up
W.volume += 0.4
reagents.remove_reagent("nutriment", 0.1)
var/blood_reagent = species.exotic_blood // This is a string of the name of the species' blood reagent
blood_volume = round(vessel.get_reagent_amount(blood_reagent))
if(blood_volume < max_blood && blood_volume)
vessel.add_reagent(blood_reagent, 0.1) // regenerate blood VERY slowly
if (reagents.has_reagent("nutriment")) //Getting food speeds it up
vessel.add_reagent(blood_reagent, 0.4)
reagents.remove_reagent("nutriment", 0.1)
else if (reagents.has_reagent(blood_reagent))
vessel.add_reagent(blood_reagent, 0.4)
reagents.remove_reagent(blood_reagent, 0.4)
else
blood_volume = round(vessel.get_reagent_amount("blood"))
//Blood regeneration if there is some space
if(blood_volume < 560 && blood_volume)
if(blood_volume < max_blood && blood_volume)
var/datum/reagent/blood/B = locate() in vessel.reagent_list //Grab some blood
if(B) // Make sure there's some blood at all
@@ -74,16 +77,16 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
B = D
break
B.volume += 0.1 // regenerate blood VERY slowly
vessel.add_reagent("blood", 0.1) // regenerate blood VERY slowly
if (reagents.has_reagent("nutriment")) //Getting food speeds it up
B.volume += 0.4
vessel.add_reagent("blood", 0.4)
reagents.remove_reagent("nutriment", 0.1)
if (reagents.has_reagent("iron")) //Hematogen candy anyone?
B.volume += 0.8
vessel.add_reagent("blood", 0.8)
reagents.remove_reagent("iron", 0.1)
if (reagents.has_reagent("salglu_solution")) //saline is good for blood regeneration
if(prob(33))
B.volume += 1.0
vessel.add_reagent("blood", 1.0)
// Damaged heart virtually reduces the blood volume, as the blood isn't
// being pumped properly anymore.
@@ -187,12 +190,10 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//Gets blood from mob to the container, preserving all data in it.
/mob/living/carbon/proc/take_blood(obj/item/weapon/reagent_containers/container, var/amount)
var/datum/reagent/B = get_blood(container.reagents)
if(!B) B = new /datum/reagent/blood
if(!istype(B, /datum/reagent/blood)) B = new /datum/reagent/blood
B.holder = container
B.volume += amount
//set reagent data
B.data["donor"] = src
if (!B.data["virus2"])
@@ -241,7 +242,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//Transfers blood from container ot vessels
/mob/living/carbon/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount)
var/datum/reagent/blood/injected = get_blood(container.reagents)
if (!injected)
if (!istype(injected))
return
var/list/sniffles = virus_copylist(injected.data["virus2"])
for(var/ID in sniffles)
@@ -269,7 +270,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
var/datum/reagent/blood/our = get_blood(vessel)
if (!injected || !our)
if (!istype(injected) || !istype(our))
return
if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) )
reagents.add_reagent("toxin",amount * 0.5)
@@ -289,6 +290,21 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
return D
return res
/mob/living/carbon/human/get_blood(datum/reagents/container)
if(species.exotic_blood)
return container.get_reagent_from_id(species.exotic_blood)
else
return ..()
/mob/living/carbon/proc/get_blood_name()
return "blood"
/mob/living/carbon/human/get_blood_name()
if(species.exotic_blood)
return species.exotic_blood
else
return ..()
/proc/blood_incompatible(donor,receiver)
var/donor_antigen = copytext(donor,1,lentext(donor))
@@ -307,15 +323,34 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//AB is a universal receiver.
return 0
proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large)
/*
Target: Thing/tile to get bloody
Source: Human or blood reagent
Large: Whether the splat should be big or not
*/
/proc/blood_splatter(var/target,var/source,var/large = 0)
var/obj/effect/decal/cleanable/blood/B
var/decal_type = /obj/effect/decal/cleanable/blood/splatter
var/turf/T = get_turf(target)
var/datum/reagent/blood/bld
if(istype(source,/mob/living/carbon/human))
var/mob/living/carbon/human/M = source
source = M.get_blood(M.vessel)
var/mob/living/carbon/human/H = source
bld = H.get_blood(H.vessel)
if(H.species.exotic_blood)
H.vessel.reaction(T, TOUCH)
return
else if(H.species.flags & NO_BLOOD)
return
else if(istype(source, /datum/reagent))
bld = source
if(!istype(bld, /datum/reagent/blood))
var/datum/reagent/R = bld
if(istype(R))
R.reaction_turf(T, R.volume)
return
else if(source)
log_to_dd("Non-human or reagent blood source. Area: [get_area(source)], Name: [source]")
// Are we dripping or splattering?
var/list/drips = list()
@@ -337,24 +372,24 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large)
drop.drips |= drips
// If there's no data to copy, call it quits here.
if(!source)
if(!bld)
return B
// Update appearance.
if(source.data["blood_colour"])
B.basecolor = source.data["blood_colour"]
if(bld.data["blood_colour"])
B.basecolor = bld.data["blood_colour"]
B.update_icon()
// Update blood information.
if(source.data["blood_DNA"])
if(bld.data["blood_DNA"])
B.blood_DNA = list()
if(source.data["blood_type"])
B.blood_DNA[source.data["blood_DNA"]] = source.data["blood_type"]
if(bld.data["blood_type"])
B.blood_DNA[bld.data["blood_DNA"]] = bld.data["blood_type"]
else
B.blood_DNA[source.data["blood_DNA"]] = "O+"
B.blood_DNA[bld.data["blood_DNA"]] = "O+"
// Update virus information.
if(source.data["virus2"])
B.virus2 = virus_copylist(source.data["virus2"])
if(bld.data["virus2"])
B.virus2 = virus_copylist(bld.data["virus2"])
return B
+2 -6
View File
@@ -10,11 +10,6 @@
..()
finder << "<span class='warning'>You found an unknown alien organism in [owner]'s [parent_organ]!</span>"
/obj/item/organ/internal/body_egg/New(loc)
if(iscarbon(loc))
insert(loc)
return ..()
/obj/item/organ/internal/body_egg/insert(var/mob/living/carbon/M, special = 0)
..()
owner.status_flags |= XENO_HOST
@@ -33,7 +28,8 @@
..()
/obj/item/organ/internal/body_egg/process()
if(!owner) return
if(!owner)
return
if(!(src in owner.internal_organs))
remove(owner)
return
+7 -7
View File
@@ -86,11 +86,11 @@ var/list/organ_cache = list()
return
if(!owner)
if(reagents)
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
if(B && prob(40))
reagents.remove_reagent("blood",0.1)
blood_splatter(src,B,1)
if(reagents && prob(40))
reagents.remove_any(0.1)
for(var/datum/reagent/R in reagents.reagent_list)
R.reaction_turf(get_turf(src), 0.1)
// Maybe scale it down a bit, have it REALLY kick in once past the basic infection threshold
// Another mercy for surgeons preparing transplant organs
germ_level++
@@ -268,8 +268,8 @@ var/list/organ_cache = list()
loc = get_turf(owner)
processing_objects |= src
var/datum/reagent/blood/organ_blood
if(reagents) organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list
if(!organ_blood || !organ_blood.data["blood_DNA"])
if(reagents) organ_blood = reagents.get_reagent_from_id(owner.get_blood_name())
if((!organ_blood || !organ_blood.data["blood_DNA"]) && (owner && !(owner.species.flags & NO_BLOOD)))
owner.vessel.trans_to(src, 5, 1, 1)
if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead
+9 -9
View File
@@ -207,12 +207,12 @@ var/global/list/virusDB = list()
/datum/disease2/disease/proc/get_info()
var/r = {"
<small>Analysis determined the existence of a GNAv2-based viral lifeform.</small><br>
<u>Designation:</u> [name()]<br>
<u>Antigen:</u> [antigens2string(antigen)]<br>
<u>Transmitted By:</u> [spreadtype]<br>
<u>Rate of Progression:</u> [stageprob * 10]<br>
<u>Species Affected:</u> [list2text(affected_species, ", ")]<br>
<small>Analysis determined the existence of a GNAv2-based viral lifeform.</small><br>
<u>Designation:</u> [name()]<br>
<u>Antigen:</u> [antigens2string(antigen)]<br>
<u>Transmitted By:</u> [spreadtype]<br>
<u>Rate of Progression:</u> [stageprob * 10]<br>
<u>Species Affected:</u> [list2text(affected_species, ", ")]<br>
"}
r += "<u>Symptoms:</u><br>"
@@ -262,7 +262,7 @@ proc/virus2_greater_infection()
proc/virology_letterhead(var/report_name)
return {"
<center><h1><b>[report_name]</b></h1></center>
<center><small><i>[station_name()] Virology Lab</i></small></center>
<hr>
<center><h1><b>[report_name]</b></h1></center>
<center><small><i>[station_name()] Virology Lab</i></small></center>
<hr>
"}