mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-27 06:00:23 +01:00
Miscellaneous Virology Update (#18039)
* Roanoake + heal * Robutt * Buff suits * Macrophages * More symptoms!! * Infective component
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
/datum/component/infective
|
||||
dupe_mode = COMPONENT_DUPE_ALLOWED
|
||||
var/list/datum/disease/diseases
|
||||
var/expire_time
|
||||
var/required_clean_types = CLEAN_TYPE_DISEASE
|
||||
|
||||
/datum/component/infective/Initialize(list/datum/disease/_diseases, expire_in)
|
||||
if(islist(_diseases))
|
||||
diseases = _diseases
|
||||
else
|
||||
diseases = list(_diseases)
|
||||
if(!diseases.len || isnull(diseases[1]))
|
||||
stack_trace("Infective component initialized without any diseases!")
|
||||
qdel(src)
|
||||
if(expire_in)
|
||||
expire_time = world.time + expire_in
|
||||
QDEL_IN(src, expire_in)
|
||||
if(!ismovable(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
var/static/list/disease_connections = list(
|
||||
COMSIG_ATOM_ENTERED = PROC_REF(try_infect_crossed),
|
||||
)
|
||||
AddComponent(/datum/component/connect_loc_behalf, parent, disease_connections)
|
||||
|
||||
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean))
|
||||
RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(try_infect_collide))
|
||||
|
||||
RegisterSignal(parent, COMSIG_ATOM_EXTRAPOLATOR_ACT, PROC_REF(extrapolation))
|
||||
|
||||
if(isitem(parent))
|
||||
RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(try_infect_attack))
|
||||
// RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(try_infect_eat)) - TODO: Send signal when eating
|
||||
|
||||
/datum/component/infective/proc/clean(datum/source, clean_types)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(clean_types & required_clean_types)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/datum/component/infective/proc/try_infect_crossed(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(isliving(arrived))
|
||||
try_infect(arrived, BP_L_FOOT)
|
||||
|
||||
/*
|
||||
/datum/component/proc/try_infect_eat(datum/source, mob/living/eater, mob/living/feeder)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
for(var/datum/disease/D in diseases)
|
||||
eater.ForceContractDisease(D)
|
||||
try_infect(feeder, BP_L_ARM)
|
||||
*/
|
||||
|
||||
/datum/component/infective/proc/try_infect_collide(datum/source, atom/A)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
var/atom/movable/P = parent
|
||||
if(P.throwing)
|
||||
// This will be handled by COMSIG_MOVABLE_IMPACT_ZONE, whenever we get that.
|
||||
return
|
||||
if(isliving(A))
|
||||
try_infect(A)
|
||||
|
||||
/datum/component/infective/proc/try_infect_attack(datum/source, mob/living/target, mob/living/user)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!iscarbon(target))
|
||||
try_infect(target)
|
||||
try_infect(user, BP_L_ARM)
|
||||
|
||||
/datum/component/infective/proc/try_infect(mob/living/L, target_zone)
|
||||
for(var/datum/disease/D in diseases)
|
||||
L.ContractDisease(D)
|
||||
|
||||
/datum/component/infective/proc/extrapolation(datum/source, mob/user, obj/item/extrapolator/extrapolator, dry_run = FALSE, list/result)
|
||||
SIGNAL_HANDLER
|
||||
EXTRAPOLATOR_ACT_ADD_DISEASES(result, diseases)
|
||||
Reference in New Issue
Block a user