mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-22 19:47:22 +01:00
Frankenstein Station 13: Introducing dissections and alien organs to xenobiology (#29093)
* ddsadsa ddsadsa * moderate again * revert * beginning with rebase * organssssssssss * organs now process! * analyzer finished! + mapping * tool bit implementation and quality * organs and fixes and reworks * more organ work * more organs done * more organ progress! * more organ work * MORE. ORGANS. * temp * more organsssss * ITS DONE!!!!!!!! * oops * also oops * linter stuff * forgot this + oops * linter * i forgot to save! * lots of improvements and tweaks * move icon over * icon tweaks * icon mistake * oops * dumb * more icon validations * i think thisll fix it? * Apply suggestions from code review Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * fixes * fixes+tweaks * fix * oops * linter * i didnt save.... * this should give -some- warning * forgot a span * Apply suggestions from code review Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * beginning edits * more fixed and tweaks with cooldowns * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * lots of tweaks * more review changes * comment change * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * returns start back to gland * Apply suggestions from code review Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * code review fixes * trying to make surgery work.... * might as well push this * perfection. now i need text * text + small tweaks and bugfixing * linting * forgot to implement this * deconflicting maps * modifying for xenos again * i guess this wasnt needed??? * added surgical belts to xeno * minor swap * quick fix * small tweaks * small tweak * tiny tweak * some slime updates * more tweaks * more updates * first batch of fixes * hiero audio fix * robotic fauna fixes * more rounds of bugfixes * prevents teleporting * tiny fix * makes sharp more common * misc fixes * surgery and revenant fixes + extractor * adds cursed organ logging * small bananium organ tweak * actually gives teleporter access * adds a message to the analyzer * can now drag naughts * slime behavior tweaks * headslug tweak, cant eat organs * Update code/datums/components/special_tastes.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/datums/components/special_tastes.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/datums/components/special_tastes.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/mob/living/simple_animal/slime/slime_mob.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/mob/living/simple_animal/slime/slime_mob.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/gamemodes/miniantags/revenant/revenant.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/datums/components/special_tastes.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/gamemodes/miniantags/abduction/gland.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/game/gamemodes/miniantags/abduction/gland.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * moved this * major rework prep * didnt save * rework done * small fix * makes aliens draggable by crew after death * shouldnt have cut this * xeno organ tweak + tips * oops * fixes and tweaks to slimes * not used * temp revert * rebase map files to master * re-applying changes * access fix * access tweak * big fix for new refactor * more refactoring * forgot a span * Update code/datums/components/surgery_initiator.dm Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * hiero only doesnt target dead megafauna * various fixes * fix requests * fixed weird conflict markers * deconflict * deconflicting * antimagic flags * merge fixing * Update code/modules/mining/lavaland/loot/hierophant_loot.dm Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com> * regen mesh fix * small fixes * tick fix * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * grammar * Update code/modules/surgery/organs/organ_internal.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/surgery/organs/organ_internal.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/research/xenobiology/xenobiology_organs.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/research/xenobiology/xenobiology_organs.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * Update code/modules/research/xenobiology/xenobiology_organs.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> * tweaks --------- Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com> Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com> Co-authored-by: BeagleGaming1 <56142455+BeagleGaming1@users.noreply.github.com> Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com> Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
co-authored by
PollardTheDragon
1080pCat
Luc
warriorstar-orion
BeagleGaming1
Burzah
parent
438b3d7c98
commit
fdcf4899a2
@@ -1,3 +1,4 @@
|
||||
|
||||
///////////////////////////////////
|
||||
// POWERS
|
||||
///////////////////////////////////
|
||||
@@ -364,6 +365,24 @@
|
||||
..()
|
||||
block = GLOB.eatblock
|
||||
|
||||
// checks with those with the hungry organ from adding/removing matter eater
|
||||
/datum/mutation/grant_spell/mattereater/activate(mob/living/M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/internal/liver/xenobiology/hungry/O = H.get_int_organ(/obj/item/organ/internal/liver/xenobiology/hungry)
|
||||
if(O)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/datum/mutation/grant_spell/mattereater/deactivate(mob/living/M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/internal/liver/xenobiology/hungry/O = H.get_int_organ(/obj/item/organ/internal/liver/xenobiology/hungry)
|
||||
if(O)
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/spell/eat
|
||||
name = "Eat"
|
||||
desc = "Eat just about anything!"
|
||||
|
||||
@@ -9,12 +9,18 @@
|
||||
organ_datums = list(/datum/organ/heart/always_beating, /datum/organ/battery) // alien glands are immune to stopping, and provide power to IPCs
|
||||
tough = TRUE //not easily broken by combat damage
|
||||
|
||||
var/cooldown_low = 300
|
||||
var/cooldown_high = 300
|
||||
var/next_activation = 0
|
||||
var/uses // -1 For inifinite
|
||||
var/human_only = FALSE
|
||||
/// Do these organs have an repeatable ongoing effects?
|
||||
var/has_ongoing_effect = TRUE
|
||||
/// Is this organ's effect currently active
|
||||
var/active = FALSE
|
||||
/// the low-end of random cooldown times between activations
|
||||
var/cooldown_low = 300
|
||||
/// the high-end of random cooldown times between activations
|
||||
var/cooldown_high = 300
|
||||
/// what time will the organ activate next
|
||||
var/next_activation = 0
|
||||
/// How many uses of this organ remain before it goes dormant; -1 for infinite uses
|
||||
var/uses
|
||||
|
||||
var/mind_control_uses = 1
|
||||
var/mind_control_duration = 1800
|
||||
@@ -23,13 +29,6 @@
|
||||
/obj/item/organ/internal/heart/gland/update_icon_state()
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/heart/gland/proc/ownerCheck()
|
||||
if(ishuman(owner))
|
||||
return TRUE
|
||||
if(!human_only && iscarbon(owner))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/organ/internal/heart/gland/proc/Start()
|
||||
active = TRUE
|
||||
next_activation = world.time + rand(cooldown_low,cooldown_high)
|
||||
@@ -46,7 +45,7 @@
|
||||
holder.icon_state = "hudgland_spent"
|
||||
|
||||
/obj/item/organ/internal/heart/gland/proc/mind_control(command, mob/living/user)
|
||||
if(!ownerCheck() || !mind_control_uses || active_mind_control)
|
||||
if(!owner_check() || !mind_control_uses || active_mind_control)
|
||||
return
|
||||
mind_control_uses--
|
||||
to_chat(owner, "<span class='userdanger'>You suddenly feel an irresistible compulsion to follow an order...</span>")
|
||||
@@ -61,14 +60,13 @@
|
||||
addtimer(CALLBACK(src, PROC_REF(clear_mind_control)), mind_control_duration)
|
||||
|
||||
/obj/item/organ/internal/heart/gland/proc/clear_mind_control()
|
||||
if(!ownerCheck() || !active_mind_control)
|
||||
if(!owner_check() || !active_mind_control)
|
||||
return
|
||||
to_chat(owner, "<span class='userdanger'>You feel the compulsion fade, and you completely forget about your previous orders.</span>")
|
||||
active_mind_control = FALSE
|
||||
update_gland_hud()
|
||||
|
||||
/obj/item/organ/internal/heart/gland/remove(mob/living/carbon/M, special = 0)
|
||||
active = FALSE
|
||||
if(initial(uses) == 1)
|
||||
uses = initial(uses)
|
||||
var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
|
||||
@@ -85,19 +83,18 @@
|
||||
update_gland_hud()
|
||||
|
||||
/obj/item/organ/internal/heart/gland/on_life()
|
||||
if(!active)
|
||||
return
|
||||
if(!ownerCheck())
|
||||
active = FALSE
|
||||
return
|
||||
if(next_activation <= world.time)
|
||||
activate()
|
||||
uses--
|
||||
next_activation = world.time + rand(cooldown_low,cooldown_high)
|
||||
if(!uses)
|
||||
active = FALSE
|
||||
if(has_ongoing_effect && active)
|
||||
if(!owner_check())
|
||||
active = FALSE
|
||||
return
|
||||
if(next_activation <= world.time)
|
||||
trigger()
|
||||
uses--
|
||||
next_activation = world.time + rand(cooldown_low, cooldown_high)
|
||||
if(!uses)
|
||||
active = FALSE
|
||||
|
||||
/obj/item/organ/internal/heart/gland/proc/activate()
|
||||
/obj/item/organ/internal/heart/gland/proc/trigger()
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/heart/gland/heals
|
||||
@@ -108,7 +105,7 @@
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 3000
|
||||
|
||||
/obj/item/organ/internal/heart/gland/heals/activate()
|
||||
/obj/item/organ/internal/heart/gland/heals/trigger()
|
||||
if(!(owner.mob_biotypes & MOB_ORGANIC))
|
||||
return
|
||||
to_chat(owner, "<span class='notice'>You feel curiously revitalized.</span>")
|
||||
@@ -130,7 +127,7 @@
|
||||
owner.faction |= "slime"
|
||||
owner.add_language("Bubblish")
|
||||
|
||||
/obj/item/organ/internal/heart/gland/slime/activate()
|
||||
/obj/item/organ/internal/heart/gland/slime/trigger()
|
||||
to_chat(owner, "<span class='warning'>You feel nauseous!</span>")
|
||||
owner.vomit(20)
|
||||
|
||||
@@ -145,7 +142,7 @@
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 6000
|
||||
|
||||
/obj/item/organ/internal/heart/gland/mindshock/activate()
|
||||
/obj/item/organ/internal/heart/gland/mindshock/trigger()
|
||||
to_chat(owner, "<span class='notice'>You get a headache.</span>")
|
||||
|
||||
var/turf/T = get_turf(owner)
|
||||
@@ -167,12 +164,11 @@
|
||||
cooldown_low = 900
|
||||
cooldown_high = 1800
|
||||
uses = -1
|
||||
human_only = TRUE
|
||||
icon_state = "species"
|
||||
mind_control_uses = 5
|
||||
mind_control_duration = 3000
|
||||
|
||||
/obj/item/organ/internal/heart/gland/pop/activate()
|
||||
/obj/item/organ/internal/heart/gland/pop/trigger()
|
||||
to_chat(owner, "<span class='notice'>You feel unlike yourself.</span>")
|
||||
var/species = pick(/datum/species/unathi, /datum/species/skrell, /datum/species/diona, /datum/species/tajaran, /datum/species/vulpkanin, /datum/species/kidan, /datum/species/grey)
|
||||
owner.set_species(species, keep_missing_bodyparts = TRUE)
|
||||
@@ -186,7 +182,7 @@
|
||||
mind_control_uses = 4
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/internal/heart/gland/ventcrawling/activate()
|
||||
/obj/item/organ/internal/heart/gland/ventcrawling/trigger()
|
||||
to_chat(owner, "<span class='notice'>You feel very stretchy.</span>")
|
||||
owner.ventcrawler = VENTCRAWLER_ALWAYS
|
||||
|
||||
@@ -199,7 +195,7 @@
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/internal/heart/gland/viral/activate()
|
||||
/obj/item/organ/internal/heart/gland/viral/trigger()
|
||||
to_chat(owner, "<span class='warning'>You feel sick.</span>")
|
||||
var/datum/disease/advance/A = random_virus(pick(2, 6), 6)
|
||||
A.carrier = TRUE
|
||||
@@ -236,7 +232,7 @@
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/internal/heart/gland/emp/activate()
|
||||
/obj/item/organ/internal/heart/gland/emp/trigger()
|
||||
to_chat(owner, "<span class='warning'>You feel a spike of pain in your head.</span>")
|
||||
empulse(get_turf(owner), 2, 5, 1)
|
||||
|
||||
@@ -248,7 +244,7 @@
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 2400
|
||||
|
||||
/obj/item/organ/internal/heart/gland/spiderman/activate()
|
||||
/obj/item/organ/internal/heart/gland/spiderman/trigger()
|
||||
to_chat(owner, "<span class='warning'>You feel something crawling in your skin.</span>")
|
||||
owner.faction |= "spiders"
|
||||
var/obj/structure/spider/spiderling/S = new(owner.loc)
|
||||
@@ -262,7 +258,7 @@
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/internal/heart/gland/egg/activate()
|
||||
/obj/item/organ/internal/heart/gland/egg/trigger()
|
||||
owner.visible_message("<span class='alertalien'>[owner] [pick(EGG_LAYING_MESSAGES)]</span>")
|
||||
new /obj/item/food/egg/gland(get_turf(owner))
|
||||
|
||||
@@ -287,7 +283,7 @@
|
||||
singlemutcheck(owner, GLOB.shockimmunityblock, MUTCHK_FORCED)
|
||||
return ..()
|
||||
|
||||
/obj/item/organ/internal/heart/gland/electric/activate()
|
||||
/obj/item/organ/internal/heart/gland/electric/trigger()
|
||||
owner.visible_message("<span class='danger'>[owner]'s skin starts emitting electric arcs!</span>",\
|
||||
"<span class='warning'>You feel electric energy building up inside you!</span>")
|
||||
playsound(get_turf(owner), "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
@@ -304,7 +300,7 @@
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1200
|
||||
|
||||
/obj/item/organ/internal/heart/gland/chem/activate()
|
||||
/obj/item/organ/internal/heart/gland/chem/trigger()
|
||||
owner.reagents.add_reagent(get_random_reagent_id(), 2)
|
||||
owner.adjustToxLoss(-2)
|
||||
..()
|
||||
@@ -314,7 +310,7 @@
|
||||
cooldown_high = 400
|
||||
uses = -1
|
||||
|
||||
/obj/item/organ/internal/heart/gland/bloody/activate()
|
||||
/obj/item/organ/internal/heart/gland/bloody/trigger()
|
||||
owner.blood_volume = max(owner.blood_volume - 20, 0)
|
||||
owner.visible_message("<span class='danger'>[owner]'s skin erupts with blood!</span>",\
|
||||
"<span class='userdanger'>Blood pours from your skin!</span>")
|
||||
@@ -333,7 +329,7 @@
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 800
|
||||
|
||||
/obj/item/organ/internal/heart/gland/plasma/activate()
|
||||
/obj/item/organ/internal/heart/gland/plasma/trigger()
|
||||
spawn(0)
|
||||
to_chat(owner, "<span class='warning'>You feel bloated.</span>")
|
||||
sleep(150)
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
attacktext = "glomps"
|
||||
attack_sound = 'sound/effects/blobattack.ogg'
|
||||
butcher_results = list(/obj/item/food/meat/slab = 2)
|
||||
contains_xeno_organ = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/morph
|
||||
|
||||
/// If the morph is disguised or not
|
||||
var/morphed = FALSE
|
||||
@@ -207,14 +209,36 @@
|
||||
. = ..()
|
||||
add_to_all_human_data_huds()
|
||||
if(stat == DEAD && gibbed)
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(loc)
|
||||
if(prob(90))
|
||||
step(AM, pick(GLOB.alldirs))
|
||||
eject_contents()
|
||||
// Only execute the below if we successfully died
|
||||
if(!.)
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/proc/eject_contents()
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(loc)
|
||||
if(prob(90))
|
||||
step(AM, pick(GLOB.alldirs))
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/crowbar_act(mob/living/user, obj/item/I)
|
||||
if(stat != DEAD)
|
||||
return CONTINUE_ATTACK
|
||||
if(user.a_intent != INTENT_HELP)
|
||||
return CONTINUE_ATTACK
|
||||
if(!contents.len)
|
||||
to_chat(user, "<span class='warning'>[src] doesnt have anything left inside it!</span>")
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 50, TRUE, -1)
|
||||
visible_message(
|
||||
"<span class='warning'>[src] begins to pry open the morph's massive jaws!</span>",
|
||||
"<span class='danger'>You begin to pry open the morph's massive jaws!</span>",
|
||||
"<span class='warning'>You hear wet, meaty tearing nearby!</span>"
|
||||
)
|
||||
if(do_after_once(user, 8 SECONDS, target = src))
|
||||
eject_contents()
|
||||
playsound(loc, 'sound/effects/splat.ogg', 50, TRUE, -1)
|
||||
return ITEM_INTERACT_COMPLETE
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/attack_hand(mob/living/carbon/human/M)
|
||||
if(ambush_prepared)
|
||||
to_chat(M, "<span class='warning'>[src] feels a bit different from normal... it feels more.. </span><span class='userdanger'>SLIMEY?!</span>")
|
||||
@@ -222,6 +246,13 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/examine(mob/user)
|
||||
. = ..()
|
||||
if(stat == DEAD)
|
||||
if(length(contents))
|
||||
. += "<span class='notice'>You can use <b>ALT + Click</b> to eject anything the morph may have eaten.</span>"
|
||||
else if(in_range(user, src))
|
||||
. += "<span class='warning'>\The [src] seems to have nothing left inside of it!</span>"
|
||||
#define MORPH_ATTACKED if((. = ..()) && morphed) mimic_spell.restore_form(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/attack_by(obj/item/O, mob/living/user, params)
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
desc = "A malevolent spirit."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "revenant_idle"
|
||||
|
||||
mob_biotypes = MOB_SPIRIT
|
||||
sentience_type = SENTIENCE_BOSS // no reviving funny ghost
|
||||
incorporeal_move = INCORPOREAL_MOVE_HOLY_BLOCK
|
||||
see_invisible = INVISIBILITY_REVENANT
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
@@ -37,6 +37,9 @@
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
initial_traits = list(TRAIT_FLYING)
|
||||
contains_xeno_organ = TRUE
|
||||
ignore_generic_organs = TRUE
|
||||
surgery_container = /datum/xenobiology_surgery_container/revenant
|
||||
|
||||
/// The revenant's idle icon
|
||||
var/icon_idle = "revenant_idle"
|
||||
@@ -73,20 +76,23 @@
|
||||
var/list/drained_mobs = list()
|
||||
///How many perfect, regen-cap increasing souls the revenant has.
|
||||
var/perfectsouls = 0
|
||||
/// Are we currently dying? extra check against becomming incorporeal
|
||||
var/dying = FALSE
|
||||
|
||||
/mob/living/simple_animal/revenant/Life(seconds, times_fired)
|
||||
..()
|
||||
if(revealed && essence <= 0)
|
||||
dying = TRUE
|
||||
death()
|
||||
if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
|
||||
essence = min(essence_regen_cap, essence+essence_regen_amount)
|
||||
if(unreveal_time && world.time >= unreveal_time)
|
||||
if(unreveal_time && world.time >= unreveal_time && !dying)
|
||||
unreveal_time = 0
|
||||
revealed = FALSE
|
||||
incorporeal_move = INCORPOREAL_MOVE_HOLY_BLOCK
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
to_chat(src, "<span class='revennotice bold'>You are once more concealed.</span>")
|
||||
if(unstun_time && world.time >= unstun_time)
|
||||
if(unstun_time && world.time >= unstun_time && !dying)
|
||||
unstun_time = 0
|
||||
notransform = FALSE
|
||||
to_chat(src, "<span class='revennotice bold'>You can move again!</span>")
|
||||
@@ -206,9 +212,13 @@
|
||||
icon_state = "revenant_draining"
|
||||
animate(src, alpha = 0, time = 3 SECONDS)
|
||||
visible_message("<span class='danger'>[src]'s body breaks apart into a fine pile of blue dust.</span>")
|
||||
new /obj/item/ectoplasm(get_turf(src))
|
||||
ghostize()
|
||||
qdel(src)
|
||||
ghostize(FALSE)
|
||||
name = "ectoplasm"
|
||||
desc = "A pile of clumpy dust from a restless spirit"
|
||||
alpha = 255
|
||||
icon_state = "revenant_ectoplasm"
|
||||
move_resist = null
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/revenant/attack_by(obj/item/W, mob/living/user, params)
|
||||
if(..())
|
||||
@@ -279,6 +289,9 @@
|
||||
update_spooky_icon()
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/update_spooky_icon()
|
||||
if(dying)
|
||||
return
|
||||
|
||||
if(!revealed)
|
||||
icon_state = icon_idle
|
||||
return
|
||||
@@ -290,6 +303,7 @@
|
||||
if(draining)
|
||||
icon_state = icon_drain
|
||||
return
|
||||
|
||||
// No other state is happening, therefore we are stunned
|
||||
icon_state = icon_stun
|
||||
|
||||
@@ -338,6 +352,7 @@
|
||||
/datum/objective/revenant_fluff/check_completion()
|
||||
return TRUE
|
||||
|
||||
//no longer used
|
||||
/obj/item/ectoplasm
|
||||
name = "glimmering residue"
|
||||
desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it."
|
||||
|
||||
@@ -81,9 +81,8 @@
|
||||
ACCESS_RESEARCH,
|
||||
ACCESS_TOX_STORAGE,
|
||||
ACCESS_TOX,
|
||||
ACCESS_XENOBIOLOGY
|
||||
)
|
||||
alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist", "Chemical Researcher")
|
||||
alt_titles = list("Anomalist", "Plasma Researcher", "Chemical Researcher")
|
||||
minimal_player_age = 3
|
||||
exp_map = list(EXP_TYPE_CREW = 300)
|
||||
// All science-y guys get bonuses for maxing out their tech.
|
||||
@@ -108,6 +107,60 @@
|
||||
satchel = /obj/item/storage/backpack/satchel_tox
|
||||
dufflebag = /obj/item/storage/backpack/duffel/science
|
||||
|
||||
/datum/job/xenobiologist
|
||||
title = "Xenobiologist"
|
||||
flag = JOB_XENOBIOLOGIST
|
||||
department_flag = JOBCAT_MEDSCI
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
job_department_flags = DEP_FLAG_SCIENCE
|
||||
supervisors = "the research director"
|
||||
department_head = list("Research Director")
|
||||
selection_color = "#ffeeff"
|
||||
access = list(
|
||||
ACCESS_MAINT_TUNNELS,
|
||||
ACCESS_MINERAL_STOREROOM,
|
||||
ACCESS_RESEARCH,
|
||||
ACCESS_XENOBIOLOGY,
|
||||
ACCESS_EVA,
|
||||
ACCESS_MINING,
|
||||
ACCESS_MINING_STATION,
|
||||
ACCESS_EXTERNAL_AIRLOCKS,
|
||||
ACCESS_TELEPORTER,
|
||||
)
|
||||
alt_titles = list("Xenoarcheologist", "Slime Cultivator", "Slime Rancher")
|
||||
minimal_player_age = 3
|
||||
exp_map = list(EXP_TYPE_CREW = 300)
|
||||
// All science-y guys get bonuses for maxing out their tech.
|
||||
required_objectives = list(
|
||||
/datum/job_objective/scan_organs,
|
||||
)
|
||||
|
||||
outfit = /datum/outfit/job/xenobiologist
|
||||
|
||||
/datum/outfit/job/xenobiologist
|
||||
name = "Xenobiologist"
|
||||
jobtype = /datum/job/xenobiologist
|
||||
|
||||
uniform = /obj/item/clothing/under/rank/rnd/scientist
|
||||
suit = /obj/item/clothing/suit/storage/labcoat/science
|
||||
shoes = /obj/item/clothing/shoes/white
|
||||
gloves = /obj/item/clothing/gloves/color/latex/nitrile
|
||||
glasses = /obj/item/clothing/glasses/science
|
||||
l_ear = /obj/item/radio/headset/headset_sci
|
||||
id = /obj/item/card/id/xenobiology
|
||||
pda = /obj/item/pda/toxins
|
||||
|
||||
backpack = /obj/item/storage/backpack/science
|
||||
satchel = /obj/item/storage/backpack/satchel_tox
|
||||
dufflebag = /obj/item/storage/backpack/duffel/science
|
||||
|
||||
backpack_contents = list(
|
||||
/obj/item/healthanalyzer = 1,
|
||||
/obj/item/storage/box/bodybags = 1,
|
||||
/obj/item/clipboard = 1,
|
||||
)
|
||||
|
||||
/datum/job/roboticist
|
||||
title = "Roboticist"
|
||||
flag = JOB_ROBOTICIST
|
||||
|
||||
@@ -53,6 +53,7 @@ GLOBAL_LIST_INIT(science_positions, list(
|
||||
"Research Director",
|
||||
"Scientist",
|
||||
"Geneticist", //Part of both medical and science
|
||||
"Xenobiologist",
|
||||
"Roboticist",
|
||||
))
|
||||
|
||||
|
||||
@@ -41,3 +41,19 @@
|
||||
|
||||
/datum/job_objective/make_ripley/check_for_completion()
|
||||
return completed
|
||||
|
||||
/datum/job_objective/scan_organs
|
||||
objective_name = "Scan Extraterrestrial Organs"
|
||||
description = "Scan alien organs via the organ analyzer to learn more about their local ecology."
|
||||
gives_payout = TRUE
|
||||
completion_payment = 200
|
||||
/// How many organs should be scanned to complete this goal
|
||||
var/amount_to_scan = 10
|
||||
|
||||
/datum/job_objective/scan_organs/check_for_completion()
|
||||
var/total_organs
|
||||
for(var/item in GLOB.scanned_organs)
|
||||
total_organs += GLOB.scanned_organs[item]
|
||||
if(total_organs >= amount_to_scan)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -96,6 +96,8 @@
|
||||
"Scientist" = "sciradio",
|
||||
"Xenoarcheologist" = "sciradio",
|
||||
"Xenobiologist" = "sciradio",
|
||||
"Slime Cultivator" = "sciradio",
|
||||
"Slime Rancher" = "sciradio",
|
||||
// Security
|
||||
"Detective" = "secradio",
|
||||
"Forensic Technician" = "secradio",
|
||||
|
||||
@@ -422,6 +422,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/newplayer_start) //Without this you sp
|
||||
name = "Scientist"
|
||||
icon_state = "Sci"
|
||||
|
||||
/obj/effect/landmark/start/xenobiologist
|
||||
name = "Xenobiologist"
|
||||
icon_state = "Sci"
|
||||
|
||||
/obj/effect/landmark/start/security_officer
|
||||
name = "Security Officer"
|
||||
icon_state = "Sec"
|
||||
|
||||
@@ -94,6 +94,8 @@
|
||||
// Xenobio
|
||||
/obj/item/slimepotion/sentience = 50, // Low-value, but we want to encourage getting more players back in the round.
|
||||
/obj/item/slimepotion/transference = 50,
|
||||
/obj/item/dissector/alien = 50,
|
||||
/obj/item/regen_mesh = 50,
|
||||
|
||||
// Might as well let AI be interested
|
||||
/obj/item/ai_upgrade/surveillance_upgrade = 25,
|
||||
|
||||
@@ -546,6 +546,12 @@
|
||||
icon_state = "research"
|
||||
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM)
|
||||
|
||||
/obj/item/card/id/xenobiology
|
||||
name = "Xenobiology ID"
|
||||
registered_name = "Xenobiologist"
|
||||
icon_state = "xenobiologist"
|
||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_EVA, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_TELEPORTER)
|
||||
|
||||
/obj/item/card/id/roboticist
|
||||
name = "Roboticist ID"
|
||||
registered_name = "Roboticist"
|
||||
|
||||
@@ -238,6 +238,7 @@
|
||||
/obj/item/fix_o_vein,
|
||||
/obj/item/surgicaldrill,
|
||||
/obj/item/cautery,
|
||||
/obj/item/dissector
|
||||
)
|
||||
|
||||
/obj/item/storage/belt/medical/surgery/loaded/populate_contents()
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
/obj/item/bonesetter,
|
||||
/obj/item/stack/medical/bruise_pack,
|
||||
/obj/item/stack/medical/ointment,
|
||||
/obj/item/surgical_drapes
|
||||
/obj/item/surgical_drapes,
|
||||
/obj/item/dissector,
|
||||
)
|
||||
|
||||
/obj/item/storage/surgical_tray/Initialize(mapload)
|
||||
|
||||
@@ -181,6 +181,8 @@
|
||||
for(var/obj/structure/closet/closet in get_turf(src))
|
||||
if(closet != src && closet.anchored != 1)
|
||||
return FALSE
|
||||
for(var/mob/living/simple_animal/hostile/megafauna/M in get_turf(src))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/closet/proc/dump_contents()
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
var/list/ui_users = list()
|
||||
var/broken_icon_state = "mirror_broke"
|
||||
|
||||
/obj/structure/mirror/organ
|
||||
|
||||
/obj/structure/mirror/Initialize(mapload, newdir = SOUTH, building = FALSE)
|
||||
. = ..()
|
||||
if(building)
|
||||
@@ -53,6 +55,10 @@
|
||||
broken = TRUE
|
||||
GLOB.mirrors -= src
|
||||
|
||||
/obj/structure/mirror/organ/obj_break(damage_flag, mapload)
|
||||
playsound(src, "shatter", 70, TRUE)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/mirror/screwdriver_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(!I.tool_use_check(user, 0))
|
||||
|
||||
Reference in New Issue
Block a user