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:
Kyani
2025-06-10 16:46:56 +00:00
committed by GitHub
co-authored by PollardTheDragon 1080pCat Luc warriorstar-orion BeagleGaming1 Burzah
parent 438b3d7c98
commit fdcf4899a2
107 changed files with 4269 additions and 742 deletions
@@ -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 -4
View File
@@ -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."
+55 -2
View File
@@ -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
+1
View File
@@ -53,6 +53,7 @@ GLOBAL_LIST_INIT(science_positions, list(
"Research Director",
"Scientist",
"Geneticist", //Part of both medical and science
"Xenobiologist",
"Roboticist",
))
+16
View File
@@ -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
+2
View File
@@ -96,6 +96,8 @@
"Scientist" = "sciradio",
"Xenoarcheologist" = "sciradio",
"Xenobiologist" = "sciradio",
"Slime Cultivator" = "sciradio",
"Slime Rancher" = "sciradio",
// Security
"Detective" = "secradio",
"Forensic Technician" = "secradio",
+4
View File
@@ -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()
+6
View File
@@ -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))