mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 02:54:41 +01:00
Merge remote-tracking branch 'upstream/master' into tgcam
Conflicts: code/modules/mob/living/carbon/human/human.dm
This commit is contained in:
@@ -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///////////
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
@@ -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!
|
||||
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
@@ -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")
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
"}
|
||||
|
||||
Reference in New Issue
Block a user