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

This commit is contained in:
Dip
2020-11-10 12:15:44 -03:00
55 changed files with 1320 additions and 246 deletions
@@ -5,25 +5,48 @@ is currently following.
*/
GLOBAL_LIST_INIT(disease_ability_singletons, list(
new /datum/disease_ability/action/cough(),
new /datum/disease_ability/action/sneeze(),
new /datum/disease_ability/action/infect(),
new /datum/disease_ability/symptom/cough(),
new /datum/disease_ability/symptom/sneeze(),\
new /datum/disease_ability/symptom/hallucigen(),
new /datum/disease_ability/symptom/choking(),
new /datum/disease_ability/symptom/confusion(),
new /datum/disease_ability/symptom/youth(),
new /datum/disease_ability/symptom/vomit(),
new /datum/disease_ability/symptom/voice_change(),
new /datum/disease_ability/symptom/visionloss(),
new /datum/disease_ability/symptom/viraladaptation(),
new /datum/disease_ability/symptom/vitiligo(),
new /datum/disease_ability/symptom/sensory_restoration(),
new /datum/disease_ability/symptom/itching(),
new /datum/disease_ability/symptom/weight_loss(),
new /datum/disease_ability/symptom/metabolism_heal(),
new /datum/disease_ability/symptom/coma_heal()
new /datum/disease_ability/action/cough,
new /datum/disease_ability/action/sneeze,
new /datum/disease_ability/action/infect,
new /datum/disease_ability/symptom/mild/cough,
new /datum/disease_ability/symptom/mild/sneeze,
new /datum/disease_ability/symptom/medium/shedding,
new /datum/disease_ability/symptom/medium/beard,
new /datum/disease_ability/symptom/medium/hallucigen,
new /datum/disease_ability/symptom/medium/choking,
new /datum/disease_ability/symptom/medium/confusion,
new /datum/disease_ability/symptom/medium/vomit,
new /datum/disease_ability/symptom/medium/voice_change,
new /datum/disease_ability/symptom/medium/visionloss,
new /datum/disease_ability/symptom/medium/deafness,
new /datum/disease_ability/symptom/powerful/narcolepsy,
new /datum/disease_ability/symptom/medium/fever,
new /datum/disease_ability/symptom/medium/shivering,
new /datum/disease_ability/symptom/medium/headache,
new /datum/disease_ability/symptom/medium/nano_boost,
new /datum/disease_ability/symptom/medium/nano_destroy,
new /datum/disease_ability/symptom/medium/viraladaptation,
new /datum/disease_ability/symptom/medium/viralevolution,
new /datum/disease_ability/symptom/medium/vitiligo,
new /datum/disease_ability/symptom/medium/revitiligo,
new /datum/disease_ability/symptom/medium/itching,
new /datum/disease_ability/symptom/medium/heal/weight_loss,
new /datum/disease_ability/symptom/medium/heal/sensory_restoration,
new /datum/disease_ability/symptom/medium/heal/mind_restoration,
new /datum/disease_ability/symptom/powerful/fire,
new /datum/disease_ability/symptom/powerful/flesh_eating,
// new /datum/disease_ability/symptom/powerful/genetic_mutation,
new /datum/disease_ability/symptom/powerful/inorganic_adaptation,
new /datum/disease_ability/symptom/powerful/heal/starlight,
new /datum/disease_ability/symptom/powerful/heal/oxygen,
new /datum/disease_ability/symptom/powerful/heal/chem,
new /datum/disease_ability/symptom/powerful/heal/metabolism,
new /datum/disease_ability/symptom/powerful/heal/dark,
new /datum/disease_ability/symptom/powerful/heal/water,
new /datum/disease_ability/symptom/powerful/heal/plasma,
new /datum/disease_ability/symptom/powerful/heal/radiation,
new /datum/disease_ability/symptom/powerful/heal/coma,
new /datum/disease_ability/symptom/powerful/youth
))
/datum/disease_ability
@@ -54,7 +77,13 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
stage_speed += initial(S.stage_speed)
transmittable += initial(S.transmittable)
threshold_block += "<br><br>[initial(S.threshold_desc)]"
stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmissibility: [transmittable]<br><br>"
stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmissibility: [transmittable]<br><br>"
if(symptoms.len == 1) //lazy boy's dream
name = initial(S.name)
if(short_desc == "")
short_desc = initial(S.desc)
if(long_desc == "")
long_desc = initial(S.desc)
/datum/disease_ability/proc/CanBuy(mob/camera/disease/D)
if(world.time < D.next_adaptation_time)
@@ -77,8 +106,10 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
for(var/T in symptoms)
var/datum/symptom/S = new T()
SD.symptoms += S
S.OnAdd(SD)
if(SD.processing)
S.Start(SD)
if(S.Start(SD))
S.next_activation = world.time + rand(S.symptom_delay_min * 10, S.symptom_delay_max * 10)
SD.Refresh()
for(var/T in actions)
var/datum/action/A = new T()
@@ -105,6 +136,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
var/datum/symptom/S = locate(T) in SD.symptoms
if(S)
SD.symptoms -= S
S.OnRemove(SD)
if(SD.processing)
S.End(SD)
qdel(S)
@@ -152,8 +184,9 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
return FALSE
to_chat(D, "<span class='notice'>You force [L.real_name] to cough.</span>")
L.emote("cough")
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
SD.spread(2)
if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
SD.spread(2)
StartCooldown()
return TRUE
@@ -185,11 +218,12 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
return FALSE
to_chat(D, "<span class='notice'>You force [L.real_name] to sneeze.</span>")
L.emote("sneeze")
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
for(var/mob/living/M in oview(4, SD.affected_mob))
if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M)))
M.AirborneContractDisease(SD, TRUE)
for(var/mob/living/M in oview(4, SD.affected_mob))
if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M)))
M.AirborneContractDisease(SD, TRUE)
StartCooldown()
return TRUE
@@ -235,143 +269,192 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
StartCooldown()
return TRUE
//passive symptom abilities
/*******************BASE SYMPTOM TYPES*******************/
// cost is for convenience and can be changed. If you're changing req_tot_points then don't use the subtype...
//healing costs more so you have to techswitch from naughty disease otherwise we'd have friendly disease for easy greentext (no fun!)
/datum/disease_ability/symptom/cough
name = "Involuntary Coughing"
symptoms = list(/datum/symptom/cough)
/datum/disease_ability/symptom/mild
cost = 2
required_total_points = 4
category = "Symptom (Weak)"
/datum/disease_ability/symptom/medium
cost = 4
required_total_points = 8
category = "Symptom"
/datum/disease_ability/symptom/medium/heal
cost = 5
category = "Symptom (+)"
/datum/disease_ability/symptom/powerful
cost = 4
required_total_points = 16
category = "Symptom (Strong)"
/datum/disease_ability/symptom/powerful/heal
cost = 8
category = "Symptom (Strong+)"
/******MILD******/
/datum/disease_ability/symptom/mild/cough
name = "Involuntary Coughing"
symptoms = list(/datum/symptom/cough)
short_desc = "Cause victims to cough intermittently."
long_desc = "Cause victims to cough intermittently, spreading your infection if your transmissibility is high."
/datum/disease_ability/symptom/sneeze
/datum/disease_ability/symptom/mild/sneeze
name = "Involuntary Sneezing"
symptoms = list(/datum/symptom/sneeze)
cost = 2
required_total_points = 4
short_desc = "Cause victims to sneeze intermittently."
long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmissibility and resistance, at the cost of stealth."
/datum/disease_ability/symptom/beard
//I don't think I need to justify the fact that this is the best symptom
name = "Beard Growth"
symptoms = list(/datum/symptom/beard)
cost = 1
required_total_points = 8
short_desc = "Cause all victims to grow a luscious beard."
long_desc = "Cause all victims to grow a luscious beard. Decreases stats slightly. Ineffective against Santa Claus."
/******MEDIUM******/
/datum/disease_ability/symptom/hallucigen
name = "Hallucinations"
/datum/disease_ability/symptom/medium/shedding
symptoms = list(/datum/symptom/shedding)
/datum/disease_ability/symptom/medium/beard
symptoms = list(/datum/symptom/beard)
short_desc = "Cause all victims to grow a luscious beard."
long_desc = "Cause all victims to grow a luscious beard. Ineffective against Santa Claus."
/datum/disease_ability/symptom/medium/hallucigen
symptoms = list(/datum/symptom/hallucigen)
cost = 4
required_total_points = 8
short_desc = "Cause victims to hallucinate."
long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance."
/datum/disease_ability/symptom/choking
name = "Choking"
/datum/disease_ability/symptom/medium/choking
symptoms = list(/datum/symptom/choking)
cost = 4
required_total_points = 8
short_desc = "Cause victims to choke."
long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmissibility."
/datum/disease_ability/symptom/confusion
name = "Confusion"
/datum/disease_ability/symptom/medium/confusion
symptoms = list(/datum/symptom/confusion)
cost = 4
required_total_points = 8
short_desc = "Cause victims to become confused."
long_desc = "Cause victims to become confused intermittently."
/datum/disease_ability/symptom/youth
name = "Eternal Youth"
symptoms = list(/datum/symptom/youth)
cost = 4
required_total_points = 8
short_desc = "Cause victims to become eternally young."
long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
/datum/disease_ability/symptom/vomit
name = "Vomiting"
/datum/disease_ability/symptom/medium/vomit
symptoms = list(/datum/symptom/vomit)
cost = 4
required_total_points = 8
short_desc = "Cause victims to vomit."
long_desc = "Cause victims to vomit. Slightly increases transmissibility. Vomiting also also causes the victims to lose nutrition and removes some toxin damage."
/datum/disease_ability/symptom/voice_change
name = "Voice Changing"
/datum/disease_ability/symptom/medium/voice_change
symptoms = list(/datum/symptom/voice_change)
cost = 4
required_total_points = 8
short_desc = "Change the voice of victims."
long_desc = "Change the voice of victims, causing confusion in communications."
/datum/disease_ability/symptom/visionloss
name = "Vision Loss"
/datum/disease_ability/symptom/medium/visionloss
symptoms = list(/datum/symptom/visionloss)
cost = 4
required_total_points = 8
short_desc = "Damage the eyes of victims, eventually causing blindness."
long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats."
/datum/disease_ability/symptom/viraladaptation
name = "Self-Adaptation"
/datum/disease_ability/symptom/medium/deafness
symptoms = list(/datum/symptom/deafness)
/datum/disease_ability/symptom/medium/fever
symptoms = list(/datum/symptom/fever)
/datum/disease_ability/symptom/medium/shivering
symptoms = list(/datum/symptom/shivering)
/datum/disease_ability/symptom/medium/headache
symptoms = list(/datum/symptom/headache)
/datum/disease_ability/symptom/medium/nano_boost
symptoms = list(/datum/symptom/nano_boost)
/datum/disease_ability/symptom/medium/nano_destroy
symptoms = list(/datum/symptom/nano_destroy)
/datum/disease_ability/symptom/medium/viraladaptation
symptoms = list(/datum/symptom/viraladaptation)
cost = 4
required_total_points = 8
short_desc = "Cause your infection to become more resistant to detection and eradication."
long_desc = "Cause your infection to mimic the function of normal body cells, becoming much harder to spot and to eradicate, but reducing its speed."
/datum/disease_ability/symptom/vitiligo
name = "Skin Paleness"
/datum/disease_ability/symptom/medium/viralevolution
symptoms = list(/datum/symptom/viralevolution)
/datum/disease_ability/symptom/medium/vitiligo
symptoms = list(/datum/symptom/vitiligo)
cost = 1
required_total_points = 8
short_desc = "Cause victims to become pale."
long_desc = "Cause victims to become pale. Decreases all stats."
/datum/disease_ability/symptom/sensory_restoration
name = "Sensory Restoration"
symptoms = list(/datum/symptom/sensory_restoration)
cost = 4
required_total_points = 8
short_desc = "Regenerate eye and ear damage of victims."
long_desc = "Regenerate eye and ear damage of victims."
/datum/disease_ability/symptom/medium/revitiligo
symptoms = list(/datum/symptom/revitiligo)
/datum/disease_ability/symptom/itching
name = "Itching"
/datum/disease_ability/symptom/medium/itching
symptoms = list(/datum/symptom/itching)
cost = 4
required_total_points = 8
short_desc = "Cause victims to itch."
long_desc = "Cause victims to itch, increasing all stats except stealth."
/datum/disease_ability/symptom/weight_loss
name = "Weight Loss"
/datum/disease_ability/symptom/medium/heal/weight_loss
symptoms = list(/datum/symptom/weight_loss)
cost = 4
required_total_points = 8
short_desc = "Cause victims to lose weight."
long_desc = "Cause victims to lose weight, and make it almost impossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing."
/datum/disease_ability/symptom/metabolism_heal
name = "Metabolic Boost"
/datum/disease_ability/symptom/medium/heal/sensory_restoration
symptoms = list(/datum/symptom/sensory_restoration)
short_desc = "Regenerate eye and ear damage of victims."
long_desc = "Regenerate eye and ear damage of victims."
/datum/disease_ability/symptom/medium/heal/mind_restoration
symptoms = list(/datum/symptom/mind_restoration)
/******POWERFUL******/
/datum/disease_ability/symptom/powerful/fire
symptoms = list(/datum/symptom/fire)
/datum/disease_ability/symptom/powerful/flesh_eating
symptoms = list(/datum/symptom/flesh_eating)
/*
/datum/disease_ability/symptom/powerful/genetic_mutation
symptoms = list(/datum/symptom/genetic_mutation)
cost = 8
*/
/datum/disease_ability/symptom/powerful/inorganic_adaptation
symptoms = list(/datum/symptom/inorganic_adaptation)
/datum/disease_ability/symptom/powerful/narcolepsy
symptoms = list(/datum/symptom/narcolepsy)
/datum/disease_ability/symptom/powerful/youth
symptoms = list(/datum/symptom/youth)
short_desc = "Cause victims to become eternally young."
long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
/****HEALING SUBTYPE****/
/datum/disease_ability/symptom/powerful/heal/starlight
symptoms = list(/datum/symptom/heal/starlight)
/datum/disease_ability/symptom/powerful/heal/oxygen
symptoms = list(/datum/symptom/oxygen)
/datum/disease_ability/symptom/powerful/heal/chem
symptoms = list(/datum/symptom/heal/chem)
/datum/disease_ability/symptom/powerful/heal/metabolism
symptoms = list(/datum/symptom/heal/metabolism)
cost = 4
required_total_points = 16
short_desc = "Increase the metabolism of victims, causing them to process chemicals and grow hungry faster."
long_desc = "Increase the metabolism of victims, causing them to process chemicals twice as fast and grow hungry more quickly."
/datum/disease_ability/symptom/coma_heal
name = "Regenerative Coma"
/datum/disease_ability/symptom/powerful/heal/dark
symptoms = list(/datum/symptom/heal/darkness)
/datum/disease_ability/symptom/powerful/heal/water
symptoms = list(/datum/symptom/heal/water)
/datum/disease_ability/symptom/powerful/heal/plasma
symptoms = list(/datum/symptom/heal/plasma)
/datum/disease_ability/symptom/powerful/heal/radiation
symptoms = list(/datum/symptom/heal/radiation)
/datum/disease_ability/symptom/powerful/heal/coma
symptoms = list(/datum/symptom/heal/coma)
cost = 8
required_total_points = 16
short_desc = "Cause victims to fall into a healing coma when hurt."
long_desc = "Cause victims to fall into a healing coma when hurt."
@@ -51,6 +51,7 @@
if(cures.len)
return
var/list/not_used = advance_cures.Copy()
not_used.Cut(1, 6) // Removes the first five tiers of cures.
cures = list(pick(pick_n_take(not_used)), pick(pick_n_take(not_used)))
// Get the cure name from the cure_id
@@ -18,7 +18,7 @@ the new instance inside the host to be updated to the template's stats.
layer = BELOW_MOB_LAYER
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
sight = SEE_SELF|SEE_THRU
initial_language_holder = /datum/language_holder/empty
initial_language_holder = /datum/language_holder/universal
var/freemove = TRUE
var/freemove_end = 0
@@ -43,7 +43,7 @@ the new instance inside the host to be updated to the template's stats.
var/move_delay = 1
var/next_adaptation_time = 0
var/adaptation_cooldown = 1200
var/adaptation_cooldown = 600
var/list/purchased_abilities
var/list/unpurchased_abilities
@@ -118,10 +118,28 @@ the new instance inside the host to be updated to the template's stats.
follow_next(Dir & NORTHWEST)
last_move_tick = world.time
/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
. = ..()
var/atom/movable/to_follow = speaker
if(radio_freq)
var/atom/movable/virtualspeaker/V = speaker
to_follow = V.source
var/link
if(to_follow in hosts)
link = FOLLOW_LINK(src, to_follow)
else
link = ""
// Recompose the message, because it's scrambled by default
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
to_chat(src, "[link] [message]")
/mob/camera/disease/mind_initialize()
. = ..()
if(!mind.has_antag_datum(/datum/antagonist/disease))
mind.add_antag_datum(/datum/antagonist/disease)
var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
medsensor.add_hud_to(src)
/mob/camera/disease/proc/pick_name()
var/static/list/taken_names
@@ -247,9 +265,12 @@ the new instance inside the host to be updated to the template's stats.
if(!move_listener)
move_listener = L.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/follow_mob)))
else
L.TakeComponent(move_listener)
if(QDELING(move_listener))
move_listener = null
if(L)
L.TakeComponent(move_listener)
if(QDELING(move_listener))
move_listener = null
else
QDEL_NULL(move_listener)
follow_mob()
/mob/camera/disease/proc/follow_next(reverse = FALSE)
+1 -1
View File
@@ -1103,7 +1103,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
#undef APPEARANCE_CATEGORY_COLUMN
#undef MAX_MUTANT_ROWS
/datum/preferences/proc/SetChoices(mob/user, limit = 17, list/splitJobs = list("Chief Engineer"), widthPerColumn = 295, height = 620)
/datum/preferences/proc/SetChoices(mob/user, limit = 22, list/splitJobs = list("Chief Engineer"), widthPerColumn = 295, height = 620)
if(!SSjob)
return
+3 -3
View File
@@ -12,8 +12,8 @@ Captain
supervisors = "Kinaris officials and Space law"
selection_color = "#ccccff"
req_admin_notify = 1
minimal_player_age = 20
exp_requirements = 480
minimal_player_age = 30
exp_requirements = 3000
exp_type = EXP_TYPE_COMMAND
exp_type_department = EXP_TYPE_COMMAND
@@ -84,7 +84,7 @@ Head of Personnel
selection_color = "#ddddff"
req_admin_notify = 1
minimal_player_age = 20
exp_requirements = 180
exp_requirements = 1500
exp_type = EXP_TYPE_SERVICE
exp_type_department = EXP_TYPE_SERVICE
+9 -5
View File
@@ -12,15 +12,15 @@ Quartermaster is a real head fuck you
spawn_positions = 1
supervisors = "the captain"
selection_color = "#d7b088"
minimal_player_age = 10
minimal_player_age = 7
exp_type = EXP_TYPE_SUPPLY
exp_type_department = EXP_TYPE_SUPPLY
exp_requirements = 300
exp_requirements = 1200
outfit = /datum/outfit/job/quartermaster
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT)
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT)
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, ACCESS_SEC_DOORS, ACCESS_HEADS, ACCESS_VAULT)
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, ACCESS_SEC_DOORS, ACCESS_HEADS, ACCESS_VAULT)
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
@@ -35,6 +35,10 @@ Quartermaster is a real head fuck you
glasses = /obj/item/clothing/glasses/sunglasses
l_hand = /obj/item/clipboard
id = /obj/item/card/id/silver
ears = /obj/item/radio/headset/heads/qm
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
chameleon_extras = /obj/item/stamp/qm
/*
@@ -81,7 +85,7 @@ Shaft Miner
selection_color = "#dcba97"
custom_spawn_text = "Remember, you are a miner, not a hunter. Hunting monsters is not a requirement of your job, the only requirement of your job is to provide materials for the station. Don't be afraid to run away if you're inexperienced with fighting the mining area's locals."
minimal_player_age = 1
exp_requirements = 120
exp_requirements = 600
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SUPPLY
+73 -8
View File
@@ -13,8 +13,8 @@ Chief Engineer
supervisors = "the captain"
selection_color = "#ffeeaa"
req_admin_notify = 1
minimal_player_age = 20
exp_requirements = 300
minimal_player_age = 14
exp_requirements = 1500
exp_type = EXP_TYPE_ENGINEERING
exp_type_department = EXP_TYPE_ENGINEERING
@@ -79,8 +79,9 @@ Station Engineer
minimal_player_age = 1
supervisors = "the chief engineer"
selection_color = "#fff5cc"
exp_requirements = 120
exp_type = EXP_TYPE_CREW
exp_requirements = 300
exp_type = EXP_TYPE_ENGINEERING
exp_type_department = EXP_TYPE_ENGINEERING
outfit = /datum/outfit/job/engineer
@@ -136,14 +137,16 @@ Atmospheric Technician
minimal_player_age = 2
supervisors = "the chief engineer"
selection_color = "#fff5cc"
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_requirements = 600
exp_type = EXP_TYPE_ENGINEERING
exp_type_department = EXP_TYPE_ENGINEERING
outfit = /datum/outfit/job/atmos
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS,
ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/atmos
name = "Atmospheric Technician"
@@ -169,3 +172,65 @@ Atmospheric Technician
suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos
suit_store = /obj/item/tank/internals/oxygen
internals_slot = SLOT_S_STORE
/*
Junior Engineer
*/
/datum/job/junior_engineer
title = "Engineering Intern"
flag = JR_ENGINEER
department_head = list("Chief Engineer")
department_flag = ENGSEC
faction = "Station"
total_positions = 2
spawn_positions = 2
minimal_player_age = 0
supervisors = "the chief engineer, and any other more experienced engineers"
selection_color = "#fff5cc"
exp_requirements = 120
exp_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/engineer/junior
access = list(ACCESS_TECH_STORAGE, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_TECH_STORAGE, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/engineer/junior
name = "Engineering Intern"
jobtype = /datum/job/junior_engineer
belt = /obj/item/storage/belt/utility/full/engi
l_pocket = /obj/item/pda/engineering
ears = /obj/item/radio/headset/headset_eng
uniform = /obj/item/clothing/under/rank/engineer
shoes = /obj/item/clothing/shoes/workboots
head = /obj/item/clothing/head/hardhat
r_pocket = /obj/item/t_scanner
backpack = /obj/item/storage/backpack/industrial
satchel = /obj/item/storage/backpack/satchel/eng
duffelbag = /obj/item/storage/backpack/duffelbag/engineering
box = /obj/item/storage/box/engineer
pda_slot = SLOT_L_STORE
backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
/datum/outfit/job/engineer/junior/gloved/
name = "Station Engineer (Gloves)"
gloves = /obj/item/clothing/gloves/color/yellow
/datum/outfit/job/engineer/junior/gloved/rig/junior
name = "Station Engineer (Hardsuit)"
mask = /obj/item/clothing/mask/breath
suit = /obj/item/clothing/suit/space/hardsuit/engine
suit_store = /obj/item/tank/internals/oxygen
head = null
internals_slot = SLOT_S_STORE
/datum/job/junior_engineer/after_spawn(mob/living/carbon/human/H, mob/M) //Instead of going through the process of adding spawnpoints
var/turf/T
var/spawn_point = locate(/obj/effect/landmark/start/station_engineer) in GLOB.start_landmarks_list
T = get_turf(spawn_point)
H.Move(T)
+1
View File
@@ -45,6 +45,7 @@
var/outfit = null
//Minutes required in specified job or department type.
var/exp_requirements = 0
var/exp_type = ""
+11 -1
View File
@@ -1,3 +1,5 @@
//This file also determines the order for the choose your occupation chances screen.
//Engineering
/datum/job/chief_engineer
alt_titles = list("Head Engineer", "Construction Coordinator", "Project Manager")
@@ -8,6 +10,8 @@
/datum/job/atmos
alt_titles = list("Firefighter", "Life Support Specialist")
/datum/job/junior_engineer
//Service
/datum/job/assistant
alt_titles = list("Civilian", "Visitor", "Businessman", "Trader", "Entertainer", "Tourist")
@@ -49,12 +53,14 @@
/datum/job/roboticist
alt_titles = list("Biomechanical Engineer", "Mechatronic Engineer", "Mechanic")
/datum/job/junior_scientist
//Medical
/datum/job/cmo
alt_titles = list("Medical Director")
/datum/job/doctor
alt_titles = list("Nurse", "Surgeon", "Physician")
alt_titles = list("Nurse", "Surgeon", "Physician", "Paramedic")
/datum/job/chemist
alt_titles = list("Pharmacist", "Pharmacologist")
@@ -65,6 +71,8 @@
/datum/job/geneticist
alt_titles = list("Gene Therapist")
/datum/job/junior_doctor
//Security
/datum/job/hos
alt_titles = list("Chief of Security", "Security Commander")
@@ -78,6 +86,8 @@
/datum/job/detective
alt_titles = list("Forensics Technician", "Private Investigator", "Gumshoe")
/datum/job/junior_officer
//Supply
/datum/job/qm
alt_titles = list("Supply Chief")
+63 -8
View File
@@ -13,8 +13,8 @@ Chief Medical Officer
supervisors = "the captain"
selection_color = "#ffddf0"
req_admin_notify = 1
minimal_player_age = 10
exp_requirements = 300
minimal_player_age = 14
exp_requirements = 1500
exp_type = EXP_TYPE_MEDICAL
exp_type_department = EXP_TYPE_MEDICAL
@@ -94,6 +94,8 @@ Medical Doctor
satchel = /obj/item/storage/backpack/satchel/med
duffelbag = /obj/item/storage/backpack/duffelbag/med
backpack_contents = list(/obj/item/storage/hypospraykit/regular)
chameleon_extras = /obj/item/gun/syringe
/*
@@ -110,8 +112,10 @@ Chemist
minimal_player_age = 1
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
exp_type = EXP_TYPE_CREW
exp_requirements = 60
exp_requirements = 480
exp_type = EXP_TYPE_MEDICAL
exp_type_department = EXP_TYPE_MEDICAL
outfit = /datum/outfit/job/chemist
@@ -133,6 +137,8 @@ Chemist
duffelbag = /obj/item/storage/backpack/duffelbag/med
l_hand = /obj/item/fermichem/pHbooklet
backpack_contents = list(/obj/item/storage/hypospraykit/regular)
chameleon_extras = /obj/item/gun/syringe
/*
@@ -148,8 +154,9 @@ Geneticist
spawn_positions = 2
supervisors = "the chief medical officer and research director"
selection_color = "#ffeef0"
exp_type = EXP_TYPE_CREW
exp_requirements = 30
exp_requirements = 480
exp_type = EXP_TYPE_MEDICAL
exp_type_department = EXP_TYPE_MEDICAL
outfit = /datum/outfit/job/geneticist
@@ -186,8 +193,9 @@ Virologist
minimal_player_age = 2
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
exp_type = EXP_TYPE_CREW
exp_requirements = 120
exp_requirements = 600
exp_type = EXP_TYPE_MEDICAL
exp_type_department = EXP_TYPE_MEDICAL
outfit = /datum/outfit/job/virologist
@@ -209,3 +217,50 @@ Virologist
backpack = /obj/item/storage/backpack/virology
satchel = /obj/item/storage/backpack/satchel/vir
duffelbag = /obj/item/storage/backpack/duffelbag/med
/*
Junior Doctor
*/
/datum/job/junior_doctor
title = "Medical Resident"
flag = JR_DOCTOR
department_head = list("Chief Medical Officer")
department_flag = MEDSCI
faction = "Station"
total_positions = 2
spawn_positions = 2
minimal_player_age = 0
supervisors = "the chief medical officer, and any other senior medical staff"
selection_color = "#ffeef0"
exp_requirements = 120
exp_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/doctor/junior
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/doctor/junior
name = "Medical Resident"
jobtype = /datum/job/junior_doctor
belt = /obj/item/pda/medical
ears = /obj/item/radio/headset/headset_med
uniform = /obj/item/clothing/under/rank/medical
shoes = /obj/item/clothing/shoes/sneakers/white
suit = /obj/item/clothing/suit/toggle/labcoat
l_hand = /obj/item/storage/firstaid/regular
suit_store = /obj/item/flashlight/pen
backpack = /obj/item/storage/backpack/medic
satchel = /obj/item/storage/backpack/satchel/med
duffelbag = /obj/item/storage/backpack/duffelbag/med
chameleon_extras = /obj/item/gun/syringe
/datum/job/junior_doctor/after_spawn(mob/living/carbon/human/H, mob/M) //Instead of going through the process of adding spawnpoints
var/turf/T
var/spawn_point = locate(/obj/effect/landmark/start/medical_doctor) in GLOB.start_landmarks_list
T = get_turf(spawn_point)
H.Move(T)
+54 -8
View File
@@ -13,10 +13,10 @@ Research Director
supervisors = "the captain"
selection_color = "#ffddff"
req_admin_notify = 1
minimal_player_age = 10
exp_type_department = EXP_TYPE_SCIENCE
exp_requirements = 300
minimal_player_age = 14
exp_requirements = 1500
exp_type = EXP_TYPE_SCIENCE
exp_type_department = EXP_TYPE_SCIENCE
outfit = /datum/outfit/job/rd
@@ -71,12 +71,13 @@ Scientist
department_flag = MEDSCI
faction = "Station"
total_positions = 5
spawn_positions = 3
spawn_positions = 2
minimal_player_age = 1
supervisors = "the research director"
selection_color = "#ffeeff"
exp_requirements = 120
exp_type = EXP_TYPE_CREW
exp_requirements = 480
exp_type = EXP_TYPE_SCIENCE
exp_type_department = EXP_TYPE_SCIENCE
outfit = /datum/outfit/job/scientist
@@ -111,8 +112,10 @@ Roboticist
minimal_player_age = 2
supervisors = "the research director"
selection_color = "#ffeeff"
exp_requirements = 120
exp_type = EXP_TYPE_CREW
exp_requirements = 300
exp_type = EXP_TYPE_SCIENCE
exp_type_department = EXP_TYPE_SCIENCE
outfit = /datum/outfit/job/roboticist
@@ -133,3 +136,46 @@ Roboticist
satchel = /obj/item/storage/backpack/satchel/tox
pda_slot = SLOT_L_STORE
/*
Junior Scientist
*/
/datum/job/junior_scientist
title = "Research Student"
flag = JR_SCIENTIST
department_head = list("Research Director")
department_flag = MEDSCI
faction = "Station"
total_positions = 2
spawn_positions = 1
minimal_player_age = 0
supervisors = "the research director, and any other senior science staff"
selection_color = "#ffeeff"
exp_requirements = 120
exp_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/scientist/junior
access = list(ACCESS_ROBOTICS, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS)
minimal_access = list(ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
/datum/outfit/job/scientist/junior
name = "Scientist"
jobtype = /datum/job/scientist
belt = /obj/item/pda/toxins
ears = /obj/item/radio/headset/headset_sci
uniform = /obj/item/clothing/under/rank/scientist
shoes = /obj/item/clothing/shoes/sneakers/white
suit = /obj/item/clothing/suit/toggle/labcoat/science
backpack = /obj/item/storage/backpack/science
satchel = /obj/item/storage/backpack/satchel/tox
/datum/job/junior_scientist/after_spawn(mob/living/carbon/human/H, mob/M) //Instead of going through the process of adding spawnpoints
var/turf/T
var/spawn_point = locate(/obj/effect/landmark/start/scientist) in GLOB.start_landmarks_list
T = get_turf(spawn_point)
H.Move(T)
+153 -10
View File
@@ -20,7 +20,7 @@ Head of Security
selection_color = "#ffdddd"
req_admin_notify = 1
minimal_player_age = 20
exp_requirements = 420
exp_requirements = 2000
exp_type = EXP_TYPE_SECURITY
exp_type_department = EXP_TYPE_SECURITY
@@ -87,9 +87,10 @@ Warden
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
minimal_player_age = 3
exp_requirements = 360
exp_type = EXP_TYPE_CREW
minimal_player_age = 9
exp_requirements = 720
exp_type = EXP_TYPE_SECURITY
exp_type_department = EXP_TYPE_SECURITY
outfit = /datum/outfit/job/warden
@@ -118,7 +119,9 @@ Warden
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
r_pocket = /obj/item/assembly/flash/handheld
l_pocket = /obj/item/restraints/handcuffs
suit_store = /obj/item/gun/energy/e_gun/advtaser
//suit_store = /obj/item/gun/energy/e_gun/advtaser
suit_store = /obj/item/gun/energy/pumpaction/defender
backpack_contents = list(/obj/item/melee/baton/loaded=1)
backpack = /obj/item/storage/backpack/security
@@ -143,9 +146,10 @@ Detective
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
minimal_player_age = 2
minimal_player_age = 5
exp_requirements = 300
exp_type = EXP_TYPE_CREW
exp_type = EXP_TYPE_SECURITY
exp_type_department = EXP_TYPE_SECURITY
outfit = /datum/outfit/job/detective
@@ -199,9 +203,10 @@ Security Officer
spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions()
supervisors = "the head of security, and the head of your assigned department (if applicable)"
selection_color = "#ffeeee"
minimal_player_age = 1
exp_requirements = 300
exp_type = EXP_TYPE_CREW
minimal_player_age = 5
exp_requirements = 420
exp_type = EXP_TYPE_SECURITY
exp_type_department = EXP_TYPE_SECURITY
outfit = /datum/outfit/job/security
@@ -344,3 +349,141 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S
/obj/item/radio/headset/headset_sec/alt/department/sci
keyslot = new /obj/item/encryptionkey/headset_sec
keyslot2 = new /obj/item/encryptionkey/headset_sci
/*
Junior Security Officer
*/
/datum/job/junior_officer
title = "Rookie"
flag = JR_OFFICER
department_head = list("Head of Security")
department_flag = ENGSEC
faction = "Station"
total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions()
spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions()
supervisors = "the head of security, and the head of your assigned department (if applicable), and any other senior officer"
selection_color = "#ffeeee"
minimal_player_age = 3
exp_requirements = 300
exp_type = EXP_TYPE_CREW
outfit = /datum/outfit/job/security/junior
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MINERAL_STOREROOM) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS()
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic)
/datum/job/junior_officer/get_access()
var/list/L = list()
L |= ..() | check_config_for_sec_maint()
return L
/datum/job/junior_officer/after_spawn(mob/living/carbon/human/H, mob/M)
// Assign department security
var/department
if(M && M.client && M.client.prefs)
department = M.client.prefs.prefered_security_department
if(!LAZYLEN(GLOB.available_depts) || department == "None")
return
else if(department in GLOB.available_depts)
LAZYREMOVE(GLOB.available_depts, department)
else
department = pick_n_take(GLOB.available_depts)
var/ears = null
var/accessory = null
var/list/dep_access = null
var/destination = null
var/spawn_point = locate(/obj/effect/landmark/start/security_officer) in GLOB.start_landmarks_list
switch(department)
if(SEC_DEPT_SUPPLY)
ears = /obj/item/radio/headset/headset_sec/alt/department/supply
dep_access = list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION)
destination = /area/security/checkpoint/supply
spawn_point = locate(/obj/effect/landmark/start/depsec/supply) in GLOB.department_security_spawns
accessory = /obj/item/clothing/accessory/armband/cargo
if(SEC_DEPT_ENGINEERING)
ears = /obj/item/radio/headset/headset_sec/alt/department/engi
dep_access = list(ACCESS_CONSTRUCTION, ACCESS_ENGINE)
destination = /area/security/checkpoint/engineering
spawn_point = locate(/obj/effect/landmark/start/depsec/engineering) in GLOB.department_security_spawns
accessory = /obj/item/clothing/accessory/armband/engine
if(SEC_DEPT_MEDICAL)
ears = /obj/item/radio/headset/headset_sec/alt/department/med
dep_access = list(ACCESS_MEDICAL)
destination = /area/security/checkpoint/medical
spawn_point = locate(/obj/effect/landmark/start/depsec/medical) in GLOB.department_security_spawns
accessory = /obj/item/clothing/accessory/armband/medblue
if(SEC_DEPT_SCIENCE)
ears = /obj/item/radio/headset/headset_sec/alt/department/sci
dep_access = list(ACCESS_RESEARCH)
destination = /area/security/checkpoint/science
spawn_point = locate(/obj/effect/landmark/start/depsec/science) in GLOB.department_security_spawns
accessory = /obj/item/clothing/accessory/armband/science
if(accessory)
var/obj/item/clothing/under/U = H.w_uniform
U.attach_accessory(new accessory)
if(ears)
if(H.ears)
qdel(H.ears)
H.equip_to_slot_or_del(new ears(H),SLOT_EARS)
var/obj/item/card/id/W = H.wear_id
W.access |= dep_access
var/teleport = 0
if(!CONFIG_GET(flag/sec_start_brig))
if(destination || spawn_point)
teleport = 1
if(teleport)
var/turf/T
if(spawn_point)
T = get_turf(spawn_point)
H.Move(T)
else
var/safety = 0
while(safety < 25)
T = safepick(get_area_turfs(destination))
if(T && !H.Move(T))
safety += 1
continue
else
break
if(department)
to_chat(M, "<b>You have been assigned to [department]!</b>")
else
to_chat(M, "<b>You have not been assigned to any department. Patrol the halls and help where needed.</b>")
/datum/outfit/job/security/junior
name = "Security Officer"
jobtype = /datum/job/officer
belt = /obj/item/pda/security
ears = /obj/item/radio/headset/headset_sec/alt
uniform = /obj/item/clothing/under/rank/security
gloves = /obj/item/clothing/gloves/color/black
head = /obj/item/clothing/head/helmet/sec
suit = /obj/item/clothing/suit/armor/vest/alt
shoes = /obj/item/clothing/shoes/jackboots
l_pocket = /obj/item/restraints/handcuffs
r_pocket = /obj/item/assembly/flash/handheld
suit_store = /obj/item/gun/energy/e_gun/advtaser
backpack_contents = list(/obj/item/melee/baton/loaded=1)
backpack = /obj/item/storage/backpack/security
satchel = /obj/item/storage/backpack/satchel/sec
duffelbag = /obj/item/storage/backpack/duffelbag/sec
box = /obj/item/storage/box/security
implants = list(/obj/item/implant/mindshield)
chameleon_extras = list(/obj/item/gun/energy/e_gun/advtaser, /obj/item/clothing/glasses/hud/security/sunglasses, /obj/item/clothing/head/helmet)
//The helmet is necessary because /obj/item/clothing/head/helmet/sec is overwritten in the chameleon list by the standard helmet, which has the same name and icon state
+7 -7
View File
@@ -11,10 +11,10 @@ AI
selection_color = "#ccffcc"
supervisors = "your laws"
req_admin_notify = TRUE
minimal_player_age = 5
exp_requirements = 1200
exp_type = EXP_TYPE_CREW
// exp_type_department = EXP_TYPE_SILICON
minimal_player_age = 14
exp_requirements = 1800
//exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SILICON
var/do_special_check = TRUE
/datum/job/ai/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, outfit_override)
@@ -78,9 +78,9 @@ Cyborg
spawn_positions = 1
supervisors = "your laws and the AI" //Nodrak
selection_color = "#ddffdd"
// minimal_player_age = 0
// exp_requirements = 120
// exp_type = EXP_TYPE_CREW
minimal_player_age = 0
exp_requirements = 300
exp_type = EXP_TYPE_CREW
/datum/job/cyborg/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, outfit_override = null)
return H.Robotize(FALSE, latejoin)
+8 -4
View File
@@ -10,7 +10,8 @@ GLOBAL_LIST_INIT(command_positions, list(
GLOBAL_LIST_INIT(engineering_positions, list(
"Chief Engineer",
"Station Engineer",
"Atmospheric Technician"))
"Atmospheric Technician",
"Engineering Intern"))
GLOBAL_LIST_INIT(medical_positions, list(
@@ -18,13 +19,15 @@ GLOBAL_LIST_INIT(medical_positions, list(
"Medical Doctor",
"Geneticist",
"Virologist",
"Chemist"))
"Chemist",
"Medical Resident"))
GLOBAL_LIST_INIT(science_positions, list(
"Research Director",
"Scientist",
"Roboticist"))
"Roboticist",
"Research Student"))
GLOBAL_LIST_INIT(supply_positions, list(
"Quartermaster",
@@ -48,7 +51,8 @@ GLOBAL_LIST_INIT(security_positions, list(
"Head of Security",
"Warden",
"Detective",
"Security Officer"))
"Security Officer",
"Rookie"))
GLOBAL_LIST_INIT(nonhuman_positions, list(
+3
View File
@@ -31,5 +31,8 @@
loc = destination
Moved(oldloc, NONE, TRUE)
/mob/camera/canUseStorage()
return FALSE
/mob/camera/emote(act, m_type=1, message = null, intentional = FALSE)
return
+3
View File
@@ -21,6 +21,9 @@ INITIALIZE_IMMEDIATE(/mob/dead)
set_focus(src)
return INITIALIZE_HINT_NORMAL
/mob/dead/canUseStorage()
return FALSE
/mob/dead/dust(just_ash, drop_items, force) //ghosts can't be vaporised.
return
+5
View File
@@ -373,6 +373,11 @@
if(stat || IsUnconscious() || IsStun() || IsKnockdown() || recoveringstam || (!ignore_restraints && restrained(ignore_grab))) // CIT CHANGE - adds recoveringstam check here
return TRUE
/mob/living/canUseStorage()
if (get_num_arms() <= 0)
return FALSE
return TRUE
/mob/living/proc/InCritical()
return (health <= crit_threshold && (stat == SOFT_CRIT || stat == UNCONSCIOUS))
+3
View File
@@ -830,6 +830,9 @@
/mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
return
/mob/proc/canUseStorage()
return FALSE
/mob/proc/faction_check_mob(mob/target, exact_match)
if(exact_match) //if we need an exact match, we need to do some bullfuckery.
var/list/faction_src = faction.Copy()
@@ -76,3 +76,26 @@
if(S.emptrig == TRUE)
var/obj/item/projectile/bullet/dart/syringe/dart/D = BB
D.emptrig = TRUE
//Chemlight was here, adding dumb bussing things
/obj/item/ammo_casing/chemgun_debug
name = "dart synthesiser"
desc = "A high-power spring, linked to an energy-based dart synthesiser."
projectile_type = /obj/item/projectile/bullet/dart/syringe/debug
firing_effect_type = null
/obj/item/ammo_casing/chemgun_debug/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
if(!BB)
return
if(istype(loc, /obj/item/gun/chem/debug))
var/obj/item/gun/chem/debug/CGD = loc
if(CGD.syringes_left <= 0)
return
if(!CGD.infinite)
CGD.reagents.trans_to(BB, 10)
else
CGD.reagents.copy_to(BB, 10)
BB.name = "chemical dart"
CGD.syringes_left--
..()
+60 -1
View File
@@ -43,4 +43,63 @@
syringes_left++
if(chambered && !chambered.BB)
chambered.newshot()
last_synth = world.time
last_synth = world.time
//Chemlight was here, adding dumb busing things
/obj/item/gun/chem/debug
name = "experimental reagent gun"
desc = "a reagent gun seemingly made to be a part of the user, suggesting the individual generates reagents in their body for it to work."
icon_state = "syringe_pistol"
item_state = "gun" //Smaller inhand
suppressed = TRUE //Softer fire sound
can_unsuppress = FALSE //Permanently silenced
time_per_syringe = 150
syringes_left = 6
max_syringes = 6
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/infinite = FALSE
/obj/item/gun/chem/debug/Initialize()
. = ..()
chambered = new /obj/item/ammo_casing/chemgun_debug(src)
START_PROCESSING(SSobj, src)
create_reagents(100, OPENCONTAINER | NO_REACT)
/obj/item/gun/chem/debug/Destroy()
. = ..()
STOP_PROCESSING(SSobj, src)
/obj/item/gun/chem/debug/attack_self(mob/user)
var/list/reagent_ids = sortList(GLOB.chemical_reagents_list)
var/choose_operation = input(user, "Select an option", "Reagent fabricator", "cancel") in list("Select reagent", "Enable production", "Cancel")
if (choose_operation == "Select reagent")
reagents.clear_reagents()
var/chosen_reagent
switch(alert(usr, "Choose a method.", "Add Reagents", "Enter ID", "Choose ID"))
if("Enter ID")
var/valid_id
while(!valid_id)
chosen_reagent = stripped_input(usr, "Enter the ID of the reagent you want to add to your syringes.")
if(!chosen_reagent) //Get me out of here!
break
for(var/ID in reagent_ids)
if(ID == chosen_reagent)
valid_id = 1
if(!valid_id)
to_chat(usr, "<span class='warning'>A reagent with that ID doesn't exist!</span>")
if("Choose ID")
chosen_reagent = input(usr, "Choose a reagent to add to your syringes.", "Choose a reagent.") as null|anything in reagent_ids
if(chosen_reagent)
reagents.add_reagent(chosen_reagent, 100, null)
else if (choose_operation == "Enable production")
if(!infinite)
infinite = TRUE
to_chat(user, "Now constantly generating reagents.")
else
infinite = FALSE
to_chat(user, "Reagents generation now off.")
else
return
@@ -79,3 +79,10 @@
target.visible_message("<span class='danger'>\The [src] fails to land on target!</span>")
return TRUE
//Chemlight was here, adding dumb bussing things
/obj/item/projectile/bullet/dart/syringe/debug
name = "syringe"
icon_state = "syringeproj"
damage = 0
@@ -195,6 +195,8 @@
B.reagents.add_reagent("blood", 20, data)
wait = TRUE
update_icon()
var/turf/source_turf = get_turf(src)
log_virus("A culture bottle was printed for the virus [A.admin_details()] at [loc_name(source_turf)] by [key_name(usr)]")
addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 50)
. = TRUE
if("create_vaccine_bottle")
@@ -702,3 +702,11 @@
id = "royalbluecarpet"
results = list("royalbluecarpet" = 2)
required_reagents = list("carpet" = 1, "clonexadone" = 1)
/datum/chemical_reaction/synth_blood
name = "Synthetic Blood"
id = "syntheticblood"
results = list("syntheticblood" = 3)
required_reagents = list("salglu_solution" = 1, "iron" = 1, "stable_plasma" = 1)
mix_message = "The mixture congeals and gives off a faint copper scent."
required_temp = 350
@@ -0,0 +1,131 @@
// This is more or less my funny tongue being being coded in. - Ken
/obj/item/reagent_containers/chemical_tongue
name = "synthetic reagent tongue"
desc = "A cybernetic organ with the ability to produce reagents, neat!"
icon = 'icons/mob/dogborg.dmi'
icon_state = "synthtongue"
amount_per_transfer_from_this = 5
volume = 200
possible_transfer_amounts = list()
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
spillable = FALSE
splashable = FALSE
reagent_flags = OPENCONTAINER | NO_REACT
var/list/fun_ids = list("growthchem", "shrinkchem", "aphro", "aphro+", "penis_enlarger", "breast_enlarger", "space_drugs", "lithium")
/obj/item/reagent_containers/chemical_tongue/attack(mob/M, mob/user, obj/target)
if(user.a_intent == INTENT_HARM && user.zone_selected == BODY_ZONE_PRECISE_MOUTH)
if(M != user)
M.visible_message("<span class='danger'>[user] locks their lips with [M], attempting to give a deep kiss to [M].</span>", \
"<span class='userdanger'>[user] locks their lips with yours, you feel what might be a tongue pushing past your lips then towards your throat!</span>")
if(!do_mob(user, M, 80))
return
playsound(M.loc,'sound/effects/attackblob.ogg', rand(10,50), 1)
if(isliving(M))
var/mob/living/deepkiss = M
deepkiss.adjustOxyLoss(10)
if(!reagents || !reagents.total_volume)
M.visible_message("<span class='warning'>[user] pulls away from the kiss as their tongue in [M]'s mouth soon follows, slurping back into [user]'s muzzle.</span>", \
"<span class='userwarning'>[user] thrusts their tongue down your throat! Pulling it back up as it slithers up then out from your mouth.</span>")
return // The drink might be empty after the delay, such as by spam-feeding
M.visible_message("<span class='warning'>[user] pulls away from the kiss as their tongue in [M]'s mouth soon follows, slurping back into [user]'s muzzle, leaving a long strand of liquid from their lips to [M]'s own before wiping it away.</span>", \
"<span class='userwarning'>[user] thrusts their tongue down your throat! Pulling it back up as it slithers up then out from your mouth. You feel a strange liquid in your throat!</span>")
log_combat(user, M, "fed", reagents.log_list())
var/fraction = min(5/reagents.total_volume, 1)
reagents.reaction(M, INGEST, fraction)
addtimer(CALLBACK(reagents, /datum/reagents.proc/copy_to, M, 10), 5)
if(user.a_intent == INTENT_GRAB && user.zone_selected == BODY_ZONE_PRECISE_MOUTH)
if(M != user)
M.visible_message("<span class='warning'>[user] lightly places their lips on [M]'s providing a kiss.</span>", \
"<span class='userwarning'>[user] lightly places their lips against your, you can feel tongue pushing against your lips in the kiss.</span>")
if(!do_mob(user, M, 40))
return
playsound(M.loc,'sound/effects/attackblob.ogg', rand(10,50), 1)
if(!reagents || !reagents.total_volume)
M.visible_message("<span class='warning'>[user] breaks away from the kiss with [M]'s.</span>", \
"<span class='userwarning'>[user] rolls their tongue around the inside of your mouth, before pulling away.</span>")
return // The drink might be empty after the delay, such as by spam-feeding
M.visible_message("<span class='warning'>[user] breaks away from the kiss with [M]'s.</span>", \
"<span class='userwarning'>[user] rolls their tongue around the inside of your mouth, before pulling away. You can almost taste something as [user]'s tongue was laced in something.</span>")
log_combat(user, M, "fed", reagents.log_list())
var/fraction = min(5/reagents.total_volume, 1)
reagents.reaction(M, INGEST, fraction)
addtimer(CALLBACK(reagents, /datum/reagents.proc/copy_to, M, 5), 5)
if(user.a_intent == INTENT_DISARM && user.zone_selected == BODY_ZONE_PRECISE_MOUTH)
if(M != user)
M.visible_message("<span class='warning'>[user] attempts nuzzles into [M]'s.</span>", \
"<span class='userwarning'>[user] attempts to bump his snout against yours.</span>")
if(!do_mob(user, M, 10))
return
playsound(M.loc,'sound/effects/attackblob.ogg', rand(10,50), 1)
if(!reagents || !reagents.total_volume)
M.visible_message("<span class='warning'>[user] playfully licks over [M]'s lips.</span>", \
"<span class='userwarning'>[user] playfully licks over your lips.</span>")
return // The drink might be empty after the delay, such as by spam-feeding
M.visible_message("<span class='warning'>[user] playfully licks over [M]'s lips.</span>", \
"<span class='userwarning'>[user] playfully licks over your lips, leaving some chemicals along it.</span>")
log_combat(user, M, "fed", reagents.log_list())
var/fraction = min(5/reagents.total_volume, 1)
reagents.reaction(M, INGEST, fraction)
addtimer(CALLBACK(reagents, /datum/reagents.proc/copy_to, M, 1), 5)
if(user.a_intent == INTENT_HELP)
if(M != user && user.zone_selected == BODY_ZONE_PRECISE_MOUTH)
M.visible_message("<span class='notice'>[user] affectionately licks [M]'s lips.</span>", \
"<span class='userwarning'>[user] affectionately licks over your lips.</span>")
playsound(M.loc,'sound/effects/attackblob.ogg', rand(10,50), 1)
else
if(M != user)
M.visible_message("<span class='notice'>[user] affectionately licks [M].</span>", \
"<span class='userwarning'>[user] affectionately licks over you.</span>")
playsound(M.loc,'sound/effects/attackblob.ogg', rand(10,50), 1)
else
return
/obj/item/reagent_containers/chemical_tongue/attack_self(mob/user)
var/chosen_reagent
var/list/reagent_ids = sortList(GLOB.chemical_reagents_list)
var/quick_select = input(user, "Select an option", "Press start") in list("Quick Select", "Debug", "Cancel")
switch (quick_select)
if("Quick Select")
reagents.clear_reagents()
amount_per_transfer_from_this = 5
chosen_reagent = input(user, "What reagent do you want to dispense?") as null|anything in fun_ids
if(chosen_reagent)
reagents.add_reagent(chosen_reagent, 20, null)
if("Debug")
var/operation_selection = input(user, "Select an option", "Reagent fabricator", "cancel") in list("Select reagent", "Clear reagents", "Select transfer amount", "Cancel")
switch (operation_selection)
if("Select reagent")
switch(alert(usr, "Choose a method.", "Add Reagents", "Enter ID", "Choose ID"))
if("Enter ID")
var/valid_id
while(!valid_id)
chosen_reagent = stripped_input(usr, "Enter the ID of the reagent you want to add.")
if(!chosen_reagent) //Get me out of here!
break
for(var/ID in reagent_ids)
if(ID == chosen_reagent)
valid_id = 1
if(!valid_id)
to_chat(usr, "<span class='warning'>A reagent with that ID doesn't exist!</span>")
if("Choose ID")
chosen_reagent = input(usr, "Choose a reagent to add.", "Choose a reagent.") as null|anything in reagent_ids
if(chosen_reagent)
reagents.add_reagent(chosen_reagent, 20, null)
if("Clear reagents")
reagents.clear_reagents()
if("Select transfer amount")
var/transfer_select = input(user, "Select the amount of reagents you'd like to transfer.", "Transfer amount") as num|null
if(transfer_select)
amount_per_transfer_from_this = max(min(round(text2num(transfer_select)),20),1)
else
return
@@ -525,3 +525,76 @@
#undef COMBAT_WAIT_INJECT
#undef COMBAT_SELF_SPRAY
#undef COMBAT_SELF_INJECT
//Chemlight was here.
/obj/item/reagent_containers/hypospray/debug
name = "retractable hypospray syringe"
desc = "An advanced chemical synthesizer and injection system, designed for heavy-duty medical equipment."
icon = 'icons/obj/syringe.dmi'
item_state = "hypo"
icon_state = "borghypo"
amount_per_transfer_from_this = 5
volume = 200
possible_transfer_amounts = list()
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
reagent_flags = OPENCONTAINER | NO_REACT
slot_flags = ITEM_SLOT_BELT
infinite = TRUE
var/list/fun_ids = list("growthchem", "shrinkchem", "aphro", "aphro+", "penis_enlarger", "breast_enlarger", "space_drugs", "lithium")
/obj/item/reagent_containers/hypospray/debug/attack_self(mob/user)
var/chosen_reagent
var/list/reagent_ids = sortList(GLOB.chemical_reagents_list)
var/quick_select = input(user, "Select an option", "Press start") in list("Quick menu", "Debug", "Cancel")
switch (quick_select)
if("Quick menu")
var/list_selection = input(user, "Choose an catagory", "List Choice") in list("Emergency Meds", "Fun Chemicals", "Self Defense", "Cancel")
switch(list_selection)
if("Emergency Meds")
reagents.clear_reagents()
amount_per_transfer_from_this = 10
reagents.add_reagent_list(list("atropine" = 10, "oxandrolone" = 20, "sal_acid" = 20, "salbutamol" = 10))
if("Self Defense")
reagents.clear_reagents()
amount_per_transfer_from_this = 10
reagents.add_reagent_list(list("tirizene" = 14, "tiresolution" = 21, "bonehurtingjuice" = 14,)) // OOF
if("Fun Chemicals")
reagents.clear_reagents()
amount_per_transfer_from_this = 5
chosen_reagent = input(user, "What reagent do you want to dispense?") as null|anything in fun_ids
if(chosen_reagent)
reagents.add_reagent(chosen_reagent, 20, null)
if("Debug")
var/operation_selection = input(user, "Select an option", "Reagent fabricator", "cancel") in list("Select reagent", "Clear reagents", "Select transfer amount", "Cancel")
switch (operation_selection)
if("Select reagent")
switch(alert(usr, "Choose a method.", "Add Reagents", "Enter ID", "Choose ID"))
if("Enter ID")
var/valid_id
while(!valid_id)
chosen_reagent = stripped_input(usr, "Enter the ID of the reagent you want to add.")
if(!chosen_reagent) //Get me out of here!
break
for(var/ID in reagent_ids)
if(ID == chosen_reagent)
valid_id = 1
if(!valid_id)
to_chat(usr, "<span class='warning'>A reagent with that ID doesn't exist!</span>")
if("Choose ID")
chosen_reagent = input(usr, "Choose a reagent to add.", "Choose a reagent.") as null|anything in reagent_ids
if(chosen_reagent)
reagents.add_reagent(chosen_reagent, 20, null)
if("Clear reagents")
reagents.clear_reagents()
if("Select transfer amount")
var/transfer_select = input(user, "Select the amount of reagents you'd like to inject.", "Transfer amount") as num|null
if(transfer_select)
amount_per_transfer_from_this = max(min(round(text2num(transfer_select)),20),1)
else
return
@@ -47,7 +47,7 @@
"<span class='userdanger'>[user] forces [M] to [apply_method] [src].</span>")
var/makes_me_think = pick(strings("redpill.json", "redpill_questions"))
if(icon_state == "pill4" && prob(5)) //you take the red pill - you stay in Wonderland, and I show you how deep the rabbit hole goes
if(icon_state == "pill4" && prob(10)) //you take the red pill - you stay in Wonderland, and I show you how deep the rabbit hole goes
addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, M, "<span class='notice'>[makes_me_think]</span>"), 50)
log_combat(user, M, "fed", reagents.log_list())
@@ -159,10 +159,11 @@
/datum/design/large_beaker
name = "Large Beaker"
id = "large_beaker"
build_type = AUTOLATHE
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_GLASS = 2500)
build_path = /obj/item/reagent_containers/glass/beaker/large
category = list("initial", "Medical")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/healthanalyzer
name = "Health Analyzer"
@@ -208,7 +209,8 @@
/datum/design/hypoviallarge
name = "Large Hypovial"
id = "large_hypovial"
build_type = AUTOLATHE
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 2500)
build_path = /obj/item/reagent_containers/glass/bottle/vial/large
category = list("initial","Medical")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
@@ -960,3 +960,14 @@
build_path = /obj/item/hypospray/mkii/disposable
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/adv_hypo
name = "Hypospray MK.II"
desc = "A new development from DeForest Medical, this hypospray takes 30-unit vials as the drug supply for easy swapping."
id = "hypo2"
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500)
construction_time = 40
build_path = /obj/item/hypospray/mkii
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+3 -3
View File
@@ -12,7 +12,7 @@
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
"space_heater", "xlarge_beaker", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass","chem_pack","medkit_cabinet",
"disposable_hypospray","plastic_knife","plastic_fork","plastic_spoon")
"disposable_hypospray","plastic_knife","plastic_fork","plastic_spoon","large_beaker")
/datum/techweb_node/mmi
id = "mmi"
@@ -81,7 +81,7 @@
display_name = "Advanced Biotechnology"
description = "Advanced Biotechnology"
prereq_ids = list("biotech")
design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced","harvester","holobarrier_med","smartdartgun","medicinalsmartdart", "pHmeter")
design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced","harvester","holobarrier_med","smartdartgun","medicinalsmartdart", "pHmeter", "large_hypovial")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -673,7 +673,7 @@
display_name = "Medical Weaponry"
description = "Weapons using medical technology."
prereq_ids = list("adv_biotech", "adv_weaponry")
design_ids = list("rapidsyringe", "shotgundartcryostatis")
design_ids = list("rapidsyringe", "shotgundartcryostatis", "hypo2")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
export_price = 5000
@@ -0,0 +1,171 @@
// Testing things
/obj/effect/proc_holder/spell/self/Alteration_Mechanical
name = "Alter figure"
desc = "Change and alter your physical form."
human_req = 1
clothes_req = 0
charge_max = 100
cooldown_min = 50
action_icon = 'icons/mob/actions/actions_changeling.dmi'
action_icon_state = "ling_transform"
action_background_icon_state = "bg_spell"
still_recharging_msg = "<span class='notice'>Your reagents are still recharging.</span>"
invocation = null //what is uttered when the wizard casts the spell
invocation_emote_self = null
school = null
sound = 'sound/effects/pop.ogg'
var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
var/pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/rped.ogg'
/obj/effect/proc_holder/spell/self/Alteration_Mechanical/cast(mob/living/carbon/human/user)
var/mob/living/carbon/human/H = user
var/list/reagent_options = sortList(GLOB.chemical_reagents_list)
H.visible_message("<span class='notice'> user] gains a look of \
concentration while standing perfectly still.\
Their body seems to shift and starts reshaping itself.</span>",
"<span class='notice'>You focus intently on altering your body while \
standing perfectly still...</span>")
var/select_alteration = input(user, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Genitals", "Penis", "Vagina", "Penis Length", "Breast Size", "Penis Production", "Breast Production", "Alter Height", "Cancel")
do_sparks(5, FALSE, user.loc)
if (select_alteration == "Genitals")
var/list/organs = list()
var/operation = input("Select organ operation.", "Organ Manipulation", "cancel") in list("add sexual organ", "remove sexual organ", "cancel")
switch(operation)
if("add sexual organ")
var/new_organ = input("Select sexual organ:", "Organ Manipulation") in list("Penis", "Testicles", "Breasts", "Vagina", "Womb", "Cancel")
if(new_organ == "Penis")
H.give_penis()
else if(new_organ == "Testicles")
H.give_balls()
else if(new_organ == "Breasts")
H.give_breasts()
else if(new_organ == "Vagina")
H.give_vagina()
else if(new_organ == "Womb")
H.give_womb()
else
return
if("remove sexual organ")
for(var/obj/item/organ/genital/X in H.internal_organs)
var/obj/item/organ/I = X
organs["[I.name] ([I.type])"] = I
var/obj/item/organ = input("Select sexual organ:", "Organ Manipulation", null) in organs
organ = organs[organ]
if(!organ)
return
var/obj/item/organ/genital/O
if(isorgan(organ))
O = organ
O.Remove(H)
organ.forceMove(get_turf(H))
qdel(organ)
H.update_genitals()
else if (select_alteration == "Penis")
for(var/obj/item/organ/genital/penis/X in H.internal_organs)
qdel(X)
var/new_shape
new_shape = input(user, "Choose your character's dong", "Genital Alteration") as null|anything in GLOB.cock_shapes_list
if(new_shape)
H.dna.features["cock_shape"] = new_shape
H.update_genitals()
H.give_balls()
H.give_penis()
H.apply_overlay()
else if (select_alteration == "Vagina")
for(var/obj/item/organ/genital/vagina/X in H.internal_organs)
qdel(X)
var/new_shape
new_shape = input(user, "Choose your character's pussy", "Genital Alteration") as null|anything in GLOB.vagina_shapes_list
if(new_shape)
H.dna.features["vag_shape"] = new_shape
H.update_genitals()
H.give_womb()
H.give_vagina()
H.apply_overlay()
else if (select_alteration == "Penis Length")
for(var/obj/item/organ/genital/penis/X in H.internal_organs)
qdel(X)
var/new_length
new_length = input(user, "Penis length in inches:\n([COCK_SIZE_MIN]-[COCK_SIZE_MAX])", "Genital Alteration") as num|null
if(new_length)
H.dna.features["cock_length"] = max(min( round(text2num(new_length)), COCK_SIZE_MAX),COCK_SIZE_MIN)
H.update_genitals()
H.apply_overlay()
H.give_balls()
H.give_penis()
else if (select_alteration == "Breast Size")
for(var/obj/item/organ/genital/breasts/X in H.internal_organs)
qdel(X)
var/new_size
new_size = input(user, "Breast Size", "Genital Alteration") as null|anything in GLOB.breasts_size_list
if(new_size)
H.dna.features["breasts_size"] = new_size
H.update_genitals()
H.apply_overlay()
H.give_breasts()
else if (select_alteration == "Penis Production")
if(H.getorganslot("testicles"))
var/obj/item/organ/genital/testicles/T = H.getorganslot("testicles")
var/new_fluid_penis
switch(alert(usr, "Choose a method.", "Add Reagents", "Enter ID", "Choose ID"))
if("Enter ID")
var/valid_id
while(!valid_id)
new_fluid_penis = stripped_input(usr, "Enter the ID of the reagent you want to add to your testicles.")
if(!new_fluid_penis) //Get me out of here!
break
for(var/ID in reagent_options)
if(ID == new_fluid_penis)
valid_id = 1
if(!valid_id)
to_chat(usr, "<span class='warning'>A reagent with that ID doesn't exist!</span>")
if("Choose ID")
new_fluid_penis = input(usr, "Choose a reagent to add to your testicles.", "Choose a reagent.") as null|anything in reagent_options
if(new_fluid_penis)
T.fluid_id = new_fluid_penis
H.update_genitals()
H.apply_overlay()
else
to_chat(user, "You need balls for this to work.")
else if(select_alteration == "Breast Production")
if(H.getorganslot("breasts"))
var/obj/item/organ/genital/testicles/B = H.getorganslot("breasts")
var/new_fluid_breasts
switch(alert(usr, "Choose a method.", "Add Reagents", "Enter ID", "Choose ID"))
if("Enter ID")
var/valid_id
while(!valid_id)
new_fluid_breasts = stripped_input(usr, "Enter the ID of the reagent you want to add to your breasts.")
if(!new_fluid_breasts) //Get me out of here!
break
for(var/ID in reagent_options)
if(ID == new_fluid_breasts)
valid_id = 1
if(!valid_id)
to_chat(usr, "<span class='warning'>A reagent with that ID doesn't exist!</span>")
if("Choose ID")
new_fluid_breasts = input(usr, "Choose a reagent to add to your breasts.", "Choose a reagent.") as null|anything in reagent_options
if(new_fluid_breasts)
B.fluid_id = new_fluid_breasts
H.update_genitals()
H.apply_overlay()
else
to_chat(user, "You need functioning breasts for this to work.")
else if (select_alteration == "Alter Height")
var/altered_height
altered_height = input(user, "Choose your desired sprite size:\n([MIN_BODYSIZE]-400%)", "Height Alteration") as num|null
if(altered_height)
H.size_multiplier = (max(min( round(text2num(altered_height)),400),MIN_BODYSIZE))/100
playsound(user.loc, pshoom_or_beepboopblorpzingshadashwoosh, 40, 1)
do_sparks(5, FALSE, user.loc)
H.visible_message("<span class='danger'>[pick("[H] shifts in size!", "[H] alters in height!", "[H] reshapes into a new stature!")]</span>")
else
return
@@ -234,3 +234,10 @@
name = "surgical toolset implant"
desc = "A set of surgical tools hidden behind a concealed panel on the user's arm."
contents = newlist(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment, /obj/item/surgical_drapes)
//Ignore this one this is for a bus character.
/obj/item/organ/cyberimp/arm/COMPound
name = "chemical cybernetics implant"
desc = "A powerful cybernetic implant that contains chemical fabrication modules built into the user's arm."
contents = newlist(/obj/item/reagent_containers/hypospray/debug, /obj/item/gun/chem/debug, /obj/item/reagent_containers/chemical_tongue, /obj/item/fermichem/pHmeter)