This commit is contained in:
Ghommie
2019-10-02 07:26:09 +02:00
1155 changed files with 15675 additions and 9317 deletions
@@ -1,35 +0,0 @@
/datum/controller/subsystem/ticker/proc/generate_crew_objectives()
for(var/datum/mind/crewMind in SSticker.minds)
if(prob(5) && !issilicon(crewMind.current) && !jobban_isbanned(crewMind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in crewMind.current.client.prefs.be_special)
generate_miscreant_objectives(crewMind)
else
if(CONFIG_GET(flag/allow_crew_objectives))
generate_individual_objectives(crewMind)
return
/datum/controller/subsystem/ticker/proc/generate_individual_objectives(var/datum/mind/crewMind)
if(!(CONFIG_GET(flag/allow_crew_objectives)))
return
if(!crewMind)
return
if(!crewMind.current || !crewMind.objectives || crewMind.special_role)
return
if(!crewMind.assigned_role)
return
var/list/validobjs = crewobjjobs["[ckey(crewMind.assigned_role)]"]
if(!validobjs || !validobjs.len)
return
var/selectedObj = pick(validobjs)
var/datum/objective/crew/newObjective = new selectedObj
if(!newObjective)
return
newObjective.owner = crewMind
crewMind.objectives += newObjective
to_chat(crewMind, "<B>As a part of Nanotrasen's anti-tide efforts, you have been assigned an optional objective. It will be checked at the end of the shift. <font color=red>Performing traitorous acts in pursuit of your objective may result in termination of your employment.</font></B>")
to_chat(crewMind, "<B>Your optional objective:</B> [newObjective.explanation_text]")
/datum/objective/crew/
var/jobs = ""
explanation_text = "Yell on the development discussion channel on Citadels discord if this ever shows up. Something just broke here, dude"
/datum/objective/crew/proc/setup()
@@ -1,52 +0,0 @@
/datum/controller/subsystem/ticker/proc/generate_miscreant_objectives(var/datum/mind/crewMind)
if(!GLOB.miscreants_allowed)
return
if(!crewMind)
return
if(!crewMind.current || !crewMind.objectives || crewMind.special_role)
return
if(!crewMind.assigned_role)
return
if(!(ROLE_MISCREANT in crewMind.current.client.prefs.be_special))
return
if(jobban_isbanned(crewMind, "Syndicate"))
return
var/list/objectiveTypes = miscreantobjlist
if(!objectiveTypes.len)
return
var/selectedType = pick(objectiveTypes)
var/datum/objective/miscreant/newObjective = new selectedType
if(!newObjective)
return
newObjective.owner = crewMind
crewMind.objectives += newObjective
crewMind.special_role = "miscreant"
to_chat(crewMind, "<B><font size=3 color=red>You are a Miscreant.</font></B>")
to_chat(crewMind, "<B>Pursuing your objective is entirely optional, as the completion of your objective is unable to be tracked. Performing traitorous acts not directly related to your objective may result in permanent termination of your employment.</B>")
to_chat(crewMind, "<B>Your objective:</B> [newObjective.explanation_text]")
/datum/objective/miscreant
explanation_text = "Something broke. Horribly. Dear god, im so sorry. Yell about this in the development discussion channel of citadels discord."
/* Goon's Miscreant Objectives */
/datum/objective/miscreant/incompetent
explanation_text = "Be as useless and incompetent as possible without getting killed."
/datum/objective/miscreant/litterbug
explanation_text = "Make a huge mess wherever you go."
/datum/objective/miscreant/creepy
explanation_text = "Sneak around looking as suspicious as possible without actually doing anything illegal."
/datum/objective/miscreant/whiny
explanation_text = "Complain incessantly about every minor issue you find."
/* Citadel's Miscreant Objectives */
/datum/objective/miscreant/immersions
explanation_text = "Act as uncharacteristic as you possibly can." // corrected from "Act as out of character as you can" people thought it meant to just ooc in ic
/datum/objective/miscreant/cargonia
explanation_text = "Attempt to establish independence of your department."
@@ -1,81 +0,0 @@
/* CARGO OBJECTIVES */
/datum/objective/crew/petsplosion
explanation_text = "Ensure there are at least (If you see this, yell on citadels discord in the development discussion channel) pets on the station by the end of the shift. Interpret this as you wish."
jobs = "quartermaster,cargotechnician"
/datum/objective/crew/petsplosion/New()
. = ..()
target_amount = rand(10,30)
update_explanation_text()
/datum/objective/crew/petsplosion/update_explanation_text()
. = ..()
explanation_text = "Ensure there are at least [target_amount] pets on the station by the end of the shift. Interpret this as you wish."
/datum/objective/crew/petsplosion/check_completion()
var/petcount = target_amount
for(var/mob/living/simple_animal/pet/P in GLOB.mob_list)
if(!(P.stat == DEAD))
if(P.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(P)])
petcount--
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(!(H.stat == DEAD))
if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar))
petcount--
if(petcount <= 0)
return TRUE
else
return FALSE
/datum/objective/crew/points //ported from old hippie
explanation_text = "Make sure the station has at least (Something broke, report this to the development discussion channel of citadels discord) supply points at the end of the shift."
jobs = "quartermaster,cargotechnician"
/datum/objective/crew/points/New()
. = ..()
target_amount = rand(25000,100000)
update_explanation_text()
/datum/objective/crew/points/update_explanation_text()
. = ..()
explanation_text = "Make sure the station has at least [target_amount] supply points at the end of the shift."
/datum/objective/crew/points/check_completion()
if(SSshuttle.points >= target_amount)
return TRUE
else
return FALSE
/datum/objective/crew/bubblegum
explanation_text = "Ensure Bubblegum is dead at the end of the shift."
jobs = "shaftminer"
/datum/objective/crew/bubblegum/check_completion()
for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_list)
if(!(B.stat == DEAD))
return FALSE
return TRUE
/datum/objective/crew/fatstacks //ported from old hippie
explanation_text = "Have at least (something broke, report this to the development discussion channel of citadels discord) mining points on your ID at the end of the shift."
jobs = "shaftminer"
/datum/objective/crew/fatstacks/New()
. = ..()
target_amount = rand(15000,50000)
update_explanation_text()
/datum/objective/crew/fatstacks/update_explanation_text()
. = ..()
explanation_text = "Have at least [target_amount] mining points on your ID at the end of the shift."
/datum/objective/crew/fatstacks/check_completion()
if(owner && owner.current)
var/mob/living/carbon/human/H = owner.current
var/obj/item/card/id/theID = H.get_idcard()
if(istype(theID))
if(theID.mining_points >= target_amount)
return TRUE
return FALSE
@@ -1,249 +0,0 @@
/* CIVILIAN OBJECTIVES */
/datum/objective/crew/druglordbot //ported from old Hippie with adjustments
var/targetchem = "none"
var/datum/reagent/chempath
explanation_text = "Have at least (somethin broke here) harvested plants containing (report this on the development discussion channel of citadel's discord) when the shift ends."
jobs = "botanist"
/datum/objective/crew/druglordbot/New()
. = ..()
target_amount = rand(3,20)
var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/menthol, /datum/reagent/medicine, /datum/reagent/medicine/adminordrazine, /datum/reagent/medicine/adminordrazine/nanites, /datum/reagent/medicine/mine_salve, /datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/strange_reagent, /datum/reagent/medicine/miningnanites, /datum/reagent/medicine/changelingadrenaline, /datum/reagent/medicine/changelinghaste)
var/drugs = typesof(/datum/reagent/drug) - blacklist
var/meds = typesof(/datum/reagent/medicine) - blacklist
var/chemlist = drugs + meds
chempath = pick(chemlist)
targetchem = initial(chempath.id)
update_explanation_text()
/datum/objective/crew/druglordbot/update_explanation_text()
. = ..()
explanation_text = "Have at least [target_amount] harvested plants containing [initial(chempath.name)] when the shift ends."
/datum/objective/crew/druglordbot/check_completion()
var/pillcount = target_amount
if(owner && owner.current)
if(owner.current.contents)
for(var/obj/item/reagent_containers/food/snacks/grown/P in owner.current.get_contents())
if(P.reagents.has_reagent(targetchem))
pillcount--
if(pillcount <= 0)
return TRUE
else
return FALSE
/datum/objective/crew/foodhoard
var/datum/crafting_recipe/food/targetfood
var/obj/item/reagent_containers/food/foodpath
explanation_text = "Personally deliver at least (yo something broke) (report this to the developer discussion channel in citadels discord)s to Centcom."
jobs = "cook"
/datum/objective/crew/foodhoard/New()
. = ..()
target_amount = rand(2,10)
var/blacklist = list(/datum/crafting_recipe/food, /datum/crafting_recipe/food/cak)
var/possiblefoods = typesof(/datum/crafting_recipe/food) - blacklist
targetfood = pick(possiblefoods)
foodpath = initial(targetfood.result)
update_explanation_text()
/datum/objective/crew/foodhoard/update_explanation_text()
. = ..()
explanation_text = "Personally deliver at least [target_amount] [initial(foodpath.name)]s to Centcom."
/datum/objective/crew/foodhoard/check_completion()
if(owner && owner.current && owner.current.check_contents_for(foodpath) && SSshuttle.emergency.shuttle_areas[get_area(owner.current)])
return TRUE
else
return FALSE
/datum/objective/crew/responsibility
explanation_text = "Make sure nobody dies with alcohol poisoning."
jobs = "bartender"
/datum/objective/crew/responsibility/check_completion()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(H.stat == DEAD && H.drunkenness >= 80)
if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
return FALSE
return TRUE
/datum/objective/crew/clean //ported from old Hippie
var/list/areas = list()
var/hardmode = FALSE
explanation_text = "Ensure sure that (Yo, something broke. Yell about this in citadels devlopmeent discussion channel.) remain spotless at the end of the shift."
jobs = "janitor"
/datum/objective/crew/clean/New()
. = ..()
if(prob(1))
hardmode = TRUE
var/list/blacklistnormal = list(typesof(/area/space) - typesof(/area/lavaland) - typesof(/area/mine) - typesof(/area/ai_monitored/turret_protected) - typesof(/area/tcommsat))
var/list/blacklisthard = list(typesof(/area/lavaland) - typesof(/area/mine))
var/list/possibleareas = list()
if(hardmode)
possibleareas = GLOB.teleportlocs - /area - blacklisthard
else
possibleareas = GLOB.teleportlocs - /area - blacklistnormal
for(var/i in 1 to rand(1,6))
areas |= pick_n_take(possibleareas)
update_explanation_text()
/datum/objective/crew/clean/update_explanation_text()
. = ..()
explanation_text = "Ensure that the"
for(var/i in 1 to areas.len)
var/area/A = areas[i]
explanation_text += " [A]"
if(i != areas.len && areas.len >= 3)
explanation_text += ","
if(i == areas.len - 1)
explanation_text += "and"
explanation_text += " [(areas.len ==1) ? "is completely" : "are [(areas.len == 2) ? "completely" : "all"]"] clean at the end of the shift."
if(hardmode)
explanation_text += " Chop-chop."
/datum/objective/crew/clean/check_completion()
for(var/area/A in areas)
for(var/obj/effect/decal/cleanable/C in area_contents(A))
if(C && C.alpha >= 150)
return FALSE
return TRUE
/datum/objective/crew/slipster //ported from old Hippie with adjustments
explanation_text = "Slip at least (Yell on citadel's development discussion channel if you see this) different people with your PDA, and have it on you at the end of the shift."
jobs = "clown"
/datum/objective/crew/slipster/New()
. = ..()
target_amount = rand(5, 20)
update_explanation_text()
/datum/objective/crew/slipster/update_explanation_text()
. = ..()
explanation_text = "Slip at least [target_amount] different people with your PDA, and have it on you at the end of the shift."
/datum/objective/crew/slipster/check_completion()
var/list/uniqueslips = list()
if(owner && owner.current)
for(var/obj/item/pda/clown/PDA in owner.current.get_contents())
for(var/mob/living/carbon/human/H in PDA.slipvictims)
uniqueslips |= H
if(uniqueslips.len >= target_amount)
return TRUE
else
return FALSE
/datum/objective/crew/vow //ported from old Hippie
explanation_text = "Never break your vow of silence."
jobs = "mime"
/datum/objective/crew/vow/check_completion()
if(owner && owner.current)
var/list/say_log = owner.current.logging[INDIVIDUAL_SAY_LOG]
if(say_log.len > 0)
return FALSE
return TRUE
/datum/objective/crew/nullrod
explanation_text = "Don't lose your holy rod."
jobs = "chaplain"
/datum/objective/crew/nullrod/check_completion()
if(owner && owner.current)
for(var/nullrodtypes in typesof(/obj/item/nullrod))
if(owner.current.check_contents_for(nullrodtypes))
return TRUE
if(owner.current.getorgan(/obj/item/organ/genital/penis))
return TRUE
return FALSE
/datum/objective/crew/reporter //ported from old hippie
var/charcount = 100
explanation_text = "Publish at least (Yo something broke) articles containing at least (Report this to Citadels development channel) characters."
jobs = "curator"
/datum/objective/crew/reporter/New()
. = ..()
target_amount = rand(2,10)
charcount = rand(20,250)
update_explanation_text()
/datum/objective/crew/reporter/update_explanation_text()
. = ..()
explanation_text = "Publish at least [target_amount] articles containing at least [charcount] characters."
/datum/objective/crew/reporter/check_completion()
if(owner && owner.current)
var/ownername = "[ckey(owner.current.real_name)][ckey(owner.assigned_role)]"
for(var/datum/newscaster/feed_channel/chan in GLOB.news_network.network_channels)
for(var/datum/newscaster/feed_message/msg in chan.messages)
if(ckey(msg.returnAuthor()) == ckey(ownername))
if(length(msg.returnBody()) >= charcount)
target_amount--
if(target_amount <= 0)
return TRUE
else
return FALSE
/datum/objective/crew/pwrgame //ported from Goon with adjustments
var/obj/item/clothing/targettidegarb
explanation_text = "Get your grubby hands on a (Dear god something broke. Report this to Citadel's development dicussion channel)."
jobs = "assistant"
/datum/objective/crew/pwrgame/New()
. = ..()
var/list/muhvalids = list(/obj/item/clothing/mask/gas, /obj/item/clothing/head/welding, /obj/item/clothing/head/ushanka, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas/owl_mask)
if(prob(10))
muhvalids += list(/obj/item/clothing/suit/space)
targettidegarb = pick(muhvalids)
update_explanation_text()
/datum/objective/crew/pwrgame/update_explanation_text()
. = ..()
explanation_text = "Get your grubby hands on a [initial(targettidegarb.name)]."
/* DM is not a sane language in any way, shape, or form. If anyone wants to try to get this bit functioning proper, I hold no responsibility for broken keyboards.
if(owner && owner.current)
var/mob/living/carbon/human/H = owner.current
if(H && H.dna && H.dna.species && H.dna.species.id)
explanation_text = "Get your "
if(H.dna.species.id == "avian")
explanation_text += "scratchy claws "
else if(H.dna.species.id == "mammal")
explanation_text += "dirty paws "
else if(H.dna.species.id == "aquatic")
explanation_text += "fishy hands "
else if(H.dna.species.id == "xeno")
explanation_text += "weird claws "
else if(H.dna.species.id == "guilmon")
explanation_text += "digital claws "
else if(H.dna.species.id == "lizard")
explanation_text += "slimy claws "
else if(H.dna.species.id == "datashark")
explanation_text += "glitchy hands "
else if(H.dna.species.id == "insect")
explanation_text += "gross grabbers "
else
explanation_text += "grubby hands "
explanation_text += "on a space suit." replace this if you're making this monstrosity work */
/datum/objective/crew/pwrgame/check_completion()
if(owner && owner.current)
for(var/tidegarbtypes in typesof(targettidegarb))
if(owner.current.check_contents_for(tidegarbtypes))
return TRUE
return FALSE
/datum/objective/crew/promotion //ported from Goon
explanation_text = "Have a non-assistant ID registered to you at the end of the shift."
jobs = "assistant"
/datum/objective/crew/promotion/check_completion()
if(owner && owner.current)
var/mob/living/carbon/human/H = owner.current
var/obj/item/card/id/theID = H.get_idcard()
if(istype(theID))
if(!(H.get_assignment() == "Assistant") && !(H.get_assignment() == "No id") && !(H.get_assignment() == "No job"))
return TRUE
return FALSE
@@ -1,33 +0,0 @@
/* COMMAND OBJECTIVES */
/datum/objective/crew/caphat //Ported from Goon
explanation_text = "Don't lose your hat."
jobs = "captain"
/datum/objective/crew/caphat/check_completion()
if(owner && owner.current && owner.current.check_contents_for(/obj/item/clothing/head/caphat))
return TRUE
else
return FALSE
/datum/objective/crew/datfukkendisk //Ported from old Hippie
explanation_text = "Defend the nuclear authentication disk at all costs, and be the one to personally deliver it to Centcom."
jobs = "captain" //give this to other heads at your own risk.
/datum/objective/crew/datfukkendisk/check_completion()
if(owner && owner.current && owner.current.check_contents_for(/obj/item/disk/nuclear) && SSshuttle.emergency.shuttle_areas[get_area(owner.current)])
return TRUE
else
return FALSE
/datum/objective/crew/ian //Ported from old Hippie
explanation_text = "Defend Ian at all costs, and ensure he gets delivered to Centcom at the end of the shift."
jobs = "headofpersonnel"
/datum/objective/crew/ian/check_completion()
if(owner && owner.current)
for(var/mob/living/simple_animal/pet/dog/corgi/Ian/goodboy in GLOB.mob_list)
if(goodboy.stat != DEAD && SSshuttle.emergency.shuttle_areas[get_area(goodboy)])
return TRUE
return FALSE
return FALSE
@@ -1,34 +0,0 @@
/* ENGINEERING OBJECTIVES */
/datum/objective/crew/integrity //ported from old Hippie
explanation_text = "Ensure the station's integrity rating is at least (Yo something broke, yell on the development discussion channel of citadels discord about this)% when the shift ends."
jobs = "chiefengineer,stationengineer"
/datum/objective/crew/integrity/New()
. = ..()
target_amount = rand(60,95)
update_explanation_text()
/datum/objective/crew/integrity/update_explanation_text()
. = ..()
explanation_text = "Ensure the station's integrity rating is at least [target_amount]% when the shift ends."
/datum/objective/crew/integrity/check_completion()
var/datum/station_state/end_state = new /datum/station_state()
end_state.count()
var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100)
if(!SSticker.mode.station_was_nuked && station_integrity >= target_amount)
return TRUE
else
return FALSE
/datum/objective/crew/poly
explanation_text = "Make sure Poly keeps his headset, and stays alive until the end of the shift."
jobs = "chiefengineer"
/datum/objective/crew/poly/check_completion()
for(var/mob/living/simple_animal/parrot/Poly/dumbbird in GLOB.mob_list)
if(!(dumbbird.stat == DEAD) && dumbbird.ears)
if(istype(dumbbird.ears, /obj/item/radio/headset))
return TRUE
return FALSE
@@ -1,86 +0,0 @@
/* MEDICAL OBJECTIVES */
/datum/objective/crew/morgue //Ported from old Hippie
explanation_text = "Ensure there are no corpses on the station outside of the morgue when the shift ends."
jobs = "chiefmedicalofficer,geneticist,medicaldoctor"
/datum/objective/crew/morgue/check_completion()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(H.stat == DEAD && H.z == SSmapping.station_start)
if(get_area(H) != /area/medical/morgue)
return FALSE
return TRUE
/datum/objective/crew/chems //Ported from old Hippie
var/targetchem = "none"
var/datum/reagent/chempath
explanation_text = "Have (yell about this in the development discussion channel of citadel's discord, something broke) in your bloodstream when the shift ends."
jobs = "chiefmedicalofficer,chemist"
/datum/objective/crew/chems/New()
. = ..()
var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/nicotine, /datum/reagent/drug/menthol, /datum/reagent/medicine, /datum/reagent/medicine/adminordrazine, /datum/reagent/medicine/adminordrazine/nanites, /datum/reagent/medicine/mine_salve, /datum/reagent/medicine/omnizine, /datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/earthsblood, /datum/reagent/medicine/strange_reagent, /datum/reagent/medicine/miningnanites, /datum/reagent/medicine/changelingadrenaline, /datum/reagent/medicine/changelinghaste)
var/drugs = typesof(/datum/reagent/drug) - blacklist
var/meds = typesof(/datum/reagent/medicine) - blacklist
var/chemlist = drugs + meds
chempath = pick(chemlist)
targetchem = initial(chempath.id)
update_explanation_text()
/datum/objective/crew/chems/update_explanation_text()
. = ..()
explanation_text = "Have [initial(chempath.name)] in your bloodstream when the shift ends."
/datum/objective/crew/chems/check_completion()
if(owner.current)
if(!owner.current.stat == DEAD && owner.current.reagents)
if(owner.current.reagents.has_reagent(targetchem))
return TRUE
else
return FALSE
/datum/objective/crew/druglordchem //ported from old Hippie with adjustments
var/targetchem = "none"
var/datum/reagent/chempath
var/chemamount = 0
explanation_text = "Have at least (somethin broke here) pills containing at least (like really broke) units of(report this on the development discussion channel of citadel's discord) when the shift ends."
jobs = "chemist"
/datum/objective/crew/druglordchem/New()
. = ..()
target_amount = rand(5,50)
chemamount = rand(1,20)
var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/nicotine, /datum/reagent/drug/menthol)
var/drugs = typesof(/datum/reagent/drug) - blacklist
var/chemlist = drugs
chempath = pick(chemlist)
targetchem = initial(chempath.id)
update_explanation_text()
/datum/objective/crew/druglordchem/update_explanation_text()
. = ..()
explanation_text = "Have at least [target_amount] pills containing at least [chemamount] units of [initial(chempath.name)] when the shift ends."
/datum/objective/crew/druglordchem/check_completion()
var/pillcount = target_amount
if(owner.current)
if(owner.current.contents)
for(var/obj/item/reagent_containers/pill/P in owner.current.get_contents())
if(P.reagents.has_reagent(targetchem, chemamount))
pillcount--
if(pillcount <= 0)
return TRUE
else
return FALSE
/datum/objective/crew/noinfections
explanation_text = "Make sure there are no crew members with harmful diseases at the end of the shift."
jobs = "virologist"
/datum/objective/crew/noinfections/check_completion()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(!H.stat == DEAD)
if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
if(H.check_virus() == 2)
return FALSE
return TRUE
@@ -1,45 +0,0 @@
/* SCIENCE OBJECTIVES */
/datum/objective/crew/cyborgs //Ported from old Hippie
explanation_text = "Ensure there are at least (Yo something broke here, yell on citadel's development discussion channel about this) functioning cyborgs when the shift ends."
jobs = "researchdirector,roboticist"
/datum/objective/crew/cyborgs/New()
. = ..()
target_amount = rand(3,10)
update_explanation_text()
/datum/objective/crew/cyborgs/update_explanation_text()
. = ..()
explanation_text = "Ensure there are at least [target_amount] functioning cyborgs when the shift ends."
/datum/objective/crew/cyborgs/check_completion()
var/borgcount = target_amount
for(var/mob/living/silicon/robot/R in GLOB.alive_mob_list)
if(!(R.stat == DEAD))
borgcount--
if(borgcount <= 0)
return TRUE
else
return FALSE
/datum/objective/crew/research //inspired by old hippie's research level objective. should hopefully be compatible with techwebs when that gets finished. hopefully. should be easy to update in the event that it is incompatible with techwebs.
var/datum/design/targetdesign
explanation_text = "Make sure the research required to produce a (something broke, yell on citadel's development discussion channel about this) is available on the R&D server by the end of the shift."
jobs = "researchdirector,scientist"
/datum/objective/crew/research/New()
. = ..()
targetdesign = pick(subtypesof(/datum/design))
update_explanation_text()
/datum/objective/crew/research/update_explanation_text()
. = ..()
explanation_text = "Make sure the research required to produce a [initial(targetdesign.name)] is available on the R&D server by the end of the shift."
/datum/objective/crew/research/check_completion()
for(var/obj/machinery/rnd/server/S in GLOB.machines)
if(S && S.stored_research)
if(S.stored_research.researched_designs[initial(targetdesign.id)])
return TRUE
return FALSE
@@ -1,23 +0,0 @@
/* SECURITY OBJECTIVES */
/datum/objective/crew/enjoyyourstay
explanation_text = "Enforce Space Law to the best of your ability."
jobs = "headofsecurity,securityofficer,warden,detective"
/datum/objective/crew/enjoyyourstay/check_completion()
if(owner && owner.current)
if(owner.current.stat != DEAD)
return TRUE
return FALSE
/datum/objective/crew/justicecrew
explanation_text = "Ensure there are no innocent crew members in the brig when the shift ends."
jobs = "lawyer"
/datum/objective/crew/justicecrew/check_completion()
if(owner && owner.current)
for(var/datum/mind/M in SSticker.minds)
if(M.current && isliving(M.current))
if(!M.special_role && !(M.assigned_role == "Security Officer") && !(M.assigned_role == "Detective") && !(M.assigned_role == "Head of Security") && !(M.assigned_role == "Lawyer") && !(M.assigned_role == "Warden") && get_area(M.current) != typesof(/area/security))
return FALSE
return TRUE
@@ -1,28 +0,0 @@
//supply packs
/datum/supply_pack/misc/kinkmate
name = "Kinkmate construction kit"
cost = 2000
contraband = TRUE
contains = list(/obj/item/vending_refill/kink, /obj/item/circuitboard/machine/kinkmate)
crate_name = "Kinkmate construction kit"
//Food and livestocks
/datum/supply_pack/organic/critter/kiwi
name = "Space kiwi Crate"
cost = 2000
contains = list( /mob/living/simple_animal/kiwi)
crate_name = "space kiwi crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Miscellaneous ///////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/misc/jukebox
name = "Jukebox"
cost = 35000
contains = list(/obj/machinery/jukebox)
crate_name = "Jukebox"
@@ -447,4 +447,8 @@ datum/gear/darksabresheath
path = /obj/item/clothing/head/blueberet
ckeywhitelist = list("foxystalin")
/datum/gear/donorgoggles
name = "Flight Goggles"
category = SLOT_HEAD
path = /obj/item/clothing/glasses/flight
ckeywhitelist = list("maxlynchy")
@@ -12,6 +12,7 @@
icon_state = "hostrench"
item_state = "hostrench"
mutantrace_variation = NO_MUTANTRACE_VARIATION
body_parts_covered = CHEST|ARMS|LEGS
/obj/item/clothing/suit/hooded/cloak/david
name = "red cloak"
@@ -1,11 +0,0 @@
/datum/crafting_recipe/toyneb
name = "Non-Euplastic Blade"
reqs = list(/obj/item/light/tube = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
result = /obj/item/toy/sword/cx
category = CAT_MISC
/datum/crafting_recipe/potatos
name = "Potat-OS"
reqs = list(/obj/item/stack/cable_coil = 1, /obj/item/stack/rods = 1, /obj/item/reagent_containers/food/snacks/grown/potato = 1, /obj/item/aicard = 1 )
result = /obj/item/aicard/potato
category = CAT_ROBOT
@@ -447,6 +447,7 @@
item_state = "kimono"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
body_parts_covered = CHEST|GROIN|LEGS|ARMS
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/commjacket
@@ -456,6 +457,7 @@
item_state = "commjacket"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
body_parts_covered = CHEST|GROIN|LEGS|ARMS
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/mw2_russian_para
@@ -491,3 +493,10 @@
item_state = "blueberet"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
/obj/item/clothing/glasses/flight
name = "flight goggles"
desc = "Old style flight goggles with a leather cap attached."
icon_state = "flight-g"
item_state = "flight-g"
actions_types = list(/datum/action/item_action/toggle)
@@ -1,3 +1,29 @@
/obj/item/reagent_containers/food/snacks/carpmeat/aquatic
name = "fillet"
desc = "A fillet of one of the local water dwelling species."
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
icon = 'modular_citadel/icons/obj/foods.dmi'
icon_state = "ipcmeat"
desc = "Gross robot meat."
filling_color = "#000000"
tastes = list("metal" = 1)
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect
desc = "Tastes like chicken, that's... not what it is!"
icon = 'modular_citadel/icons/obj/foods.dmi'
icon_state = "mothmeat"
filling_color = "#BF896B"
tastes = list("insects" = 1)
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/avian
desc = "Tastes like chicken, that's because it is!"
icon = 'modular_citadel/icons/obj/foods.dmi'
icon_state = "birdmeat"
filling_color = "#BF896B"
tastes = list("chicken" = 1)
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/mammal
desc = "Tastes sweet... reminds you vaguely of chicken."
filling_color = "#6B8E23"
tastes = list("brains" = 1, "meat" = 1)
@@ -1,2 +0,0 @@
/obj/machinery/computer/shuttle/mining
req_access = list(ACCESS_MINING)
File diff suppressed because it is too large Load Diff
@@ -1,12 +1,6 @@
/mob/living/carbon/human/species/mammal
race = /datum/species/mammal
/mob/living/carbon/human/species/avian
race = /datum/species/avian
/mob/living/carbon/human/species/aquatic
race = /datum/species/aquatic
/mob/living/carbon/human/species/insect
race = /datum/species/insect
@@ -1,21 +0,0 @@
/mob/living/carbon/human/Life(seconds, times_fired)
//citadel code
if(stat != DEAD)
handle_arousal(times_fired)
. = ..()
/mob/living/carbon/human/calculate_affecting_pressure(pressure)
if(ismob(loc))
return ONE_ATMOSPHERE
if(istype(loc, /obj/item/dogborg/sleeper))
return ONE_ATMOSPHERE
. = ..()
/mob/living/carbon/human/update_health_hud(shown_health_amount)
. = ..()
if(!client || !hud_used)
return
if(hud_used.staminas)
hud_used.staminas.icon_state = staminahudamount()
if(hud_used.staminabuffer)
hud_used.staminabuffer.icon_state = staminabufferhudamount()
@@ -1,166 +0,0 @@
/datum/species
var/should_draw_citadel = FALSE
/datum/species/proc/alt_spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
if(!istype(M))
return TRUE
CHECK_DNA_AND_SPECIES(M)
CHECK_DNA_AND_SPECIES(H)
if(!istype(M)) //sanity check for drones.
return TRUE
if(M.mind)
attacker_style = M.mind.martial_art
if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK))
log_combat(M, H, "attempted to touch")
H.visible_message("<span class='warning'>[M] attempted to touch [H]!</span>")
return TRUE
switch(M.a_intent)
if(INTENT_HELP)
if(M == H)
althelp(M, H, attacker_style)
return TRUE
return FALSE
if(INTENT_DISARM)
altdisarm(M, H, attacker_style)
return TRUE
return FALSE
/datum/species/proc/althelp(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(user == target && istype(user))
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
to_chat(user, "<span class='warning'>You're too exhausted for that.</span>")
return
if(!user.resting)
to_chat(user, "<span class='notice'>You can only force yourself up if you're on the ground.</span>")
return
user.visible_message("<span class='notice'>[user] forces [p_them()]self up to [p_their()] feet!</span>", "<span class='notice'>You force yourself up to your feet!</span>")
user.resting = 0
user.update_canmove()
user.adjustStaminaLossBuffered(user.stambuffer) //Rewards good stamina management by making it easier to instantly get up from resting
playsound(user, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
/datum/species/proc/altdisarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
to_chat(user, "<span class='warning'>You're too exhausted.</span>")
return FALSE
if(target.check_block())
target.visible_message("<span class='warning'>[target] blocks [user]'s shoving attempt!</span>")
return FALSE
if(attacker_style && attacker_style.disarm_act(user,target))
return TRUE
if(user.resting)
return FALSE
else
if(user == target)
return
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
user.adjustStaminaLossBuffered(4)
playsound(target, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
if(target.w_uniform)
target.w_uniform.add_fingerprint(user)
SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected)
if(!target.resting)
target.adjustStaminaLoss(5)
var/turf/target_oldturf = target.loc
var/shove_dir = get_dir(user.loc, target_oldturf)
var/turf/target_shove_turf = get_step(target.loc, shove_dir)
var/mob/living/carbon/human/target_collateral_human
var/obj/structure/table/target_table
var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied
//Thank you based whoneedsspace
target_collateral_human = locate(/mob/living/carbon/human) in target_shove_turf.contents
if(target_collateral_human)
shove_blocked = TRUE
else
target.Move(target_shove_turf, shove_dir)
if(get_turf(target) == target_oldturf)
if(target_shove_turf.density)
shove_blocked = TRUE
else
var/thoushallnotpass = FALSE
for(var/obj/O in target_shove_turf)
if(istype(O, /obj/structure/table))
target_table = O
else if(!O.CanPass(src, target_shove_turf))
shove_blocked = TRUE
thoushallnotpass = TRUE
if(thoushallnotpass)
target_table = null
if(target.is_shove_knockdown_blocked())
return
if(shove_blocked || target_table)
var/directional_blocked = FALSE
if(shove_dir in GLOB.cardinals) //Directional checks to make sure that we're not shoving through a windoor or something like that
var/target_turf = get_turf(target)
for(var/obj/O in target_turf)
if(O.flags_1 & ON_BORDER_1 && O.dir == shove_dir && O.density)
directional_blocked = TRUE
break
if(target_turf != target_shove_turf) //Make sure that we don't run the exact same check twice on the same tile
for(var/obj/O in target_shove_turf)
if(O.flags_1 & ON_BORDER_1 && O.dir == turn(shove_dir, 180) && O.density)
directional_blocked = TRUE
break
var/targetatrest = target.resting
if(((!target_table && !target_collateral_human) || directional_blocked) && !targetatrest)
target.Knockdown(SHOVE_KNOCKDOWN_SOLID)
user.visible_message("<span class='danger'>[user.name] shoves [target.name], knocking them down!</span>",
"<span class='danger'>You shove [target.name], knocking them down!</span>", null, COMBAT_MESSAGE_RANGE)
log_combat(user, target, "shoved", "knocking them down")
else if(target_table)
if(!targetatrest)
target.Knockdown(SHOVE_KNOCKDOWN_TABLE)
user.visible_message("<span class='danger'>[user.name] shoves [target.name] onto \the [target_table]!</span>",
"<span class='danger'>You shove [target.name] onto \the [target_table]!</span>", null, COMBAT_MESSAGE_RANGE)
target.forceMove(target_shove_turf)
log_combat(user, target, "shoved", "onto [target_table]")
else if(target_collateral_human && !targetatrest)
target.Knockdown(SHOVE_KNOCKDOWN_HUMAN)
if(!target_collateral_human.resting)
target_collateral_human.Knockdown(SHOVE_KNOCKDOWN_COLLATERAL)
user.visible_message("<span class='danger'>[user.name] shoves [target.name] into [target_collateral_human.name]!</span>",
"<span class='danger'>You shove [target.name] into [target_collateral_human.name]!</span>", null, COMBAT_MESSAGE_RANGE)
log_combat(user, target, "shoved", "into [target_collateral_human.name]")
else
user.visible_message("<span class='danger'>[user.name] shoves [target.name]!</span>",
"<span class='danger'>You shove [target.name]!</span>", null, COMBAT_MESSAGE_RANGE)
var/target_held_item = target.get_active_held_item()
var/knocked_item = FALSE
if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types))
target_held_item = null
if(!target.has_movespeed_modifier(SHOVE_SLOWDOWN_ID))
target.add_movespeed_modifier(SHOVE_SLOWDOWN_ID, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH)
if(target_held_item)
target.visible_message("<span class='danger'>[target.name]'s grip on \the [target_held_item] loosens!</span>",
"<span class='danger'>Your grip on \the [target_held_item] loosens!</span>", null, COMBAT_MESSAGE_RANGE)
addtimer(CALLBACK(target, /mob/living/carbon/human/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH)
else if(target_held_item)
target.dropItemToGround(target_held_item)
knocked_item = TRUE
target.visible_message("<span class='danger'>[target.name] drops \the [target_held_item]!!</span>",
"<span class='danger'>You drop \the [target_held_item]!!</span>", null, COMBAT_MESSAGE_RANGE)
var/append_message = ""
if(target_held_item)
if(knocked_item)
append_message = "causing them to drop [target_held_item]"
else
append_message = "loosening their grip on [target_held_item]"
log_combat(user, target, "shoved", append_message)
////////////////////
/////BODYPARTS/////
////////////////////
/obj/item/bodypart
var/should_draw_citadel = FALSE
@@ -1,237 +0,0 @@
/datum/species/mammal
name = "Mammal"
id = "mammal"
default_color = "4B4B4B"
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "legs")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs")
attack_verb = "claw"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/mammal
liked_food = MEAT | FRIED
disliked_food = TOXIC
//Curiosity killed the cat's wagging tail.
/datum/species/mammal/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
stop_wagging_tail(H)
/datum/species/mammal/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
. = ..()
/datum/species/mammal/can_wag_tail(mob/living/carbon/human/H)
return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
/datum/species/mammal/is_wagging_tail(mob/living/carbon/human/H)
return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/mammal/start_wagging_tail(mob/living/carbon/human/H)
if("mam_tail" in mutant_bodyparts)
mutant_bodyparts -= "mam_tail"
mutant_bodyparts |= "mam_waggingtail"
H.update_body()
/datum/species/mammal/stop_wagging_tail(mob/living/carbon/human/H)
if("mam_waggingtail" in mutant_bodyparts)
mutant_bodyparts -= "mam_waggingtail"
mutant_bodyparts |= "mam_tail"
H.update_body()
/datum/species/mammal/qualifies_for_rank(rank, list/features)
return TRUE
//AVIAN//
/datum/species/avian
name = "Avian"
id = "avian"
say_mod = "chirps"
default_color = "BCAC9B"
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("mam_snouts", "wings", "taur", "mam_tail", "mam_body_markings", "taur")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Beak", "mam_body_markings" = "Hawk", "wings" = "None", "taur" = "None", "mam_tail" = "Hawk")
attack_verb = "peck"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
liked_food = MEAT | FRUIT
disliked_food = TOXIC
/datum/species/avian/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
stop_wagging_tail(H)
/datum/species/avian/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
. = ..()
/datum/species/avian/can_wag_tail(mob/living/carbon/human/H)
return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
/datum/species/avian/is_wagging_tail(mob/living/carbon/human/H)
return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/avian/start_wagging_tail(mob/living/carbon/human/H)
if("mam_tail" in mutant_bodyparts)
mutant_bodyparts -= "mam_tail"
mutant_bodyparts |= "mam_waggingtail"
H.update_body()
/datum/species/avian/stop_wagging_tail(mob/living/carbon/human/H)
if("mam_waggingtail" in mutant_bodyparts)
mutant_bodyparts -= "mam_waggingtail"
mutant_bodyparts |= "mam_tail"
H.update_body()
/datum/species/avian/qualifies_for_rank(rank, list/features)
return TRUE
//AQUATIC//
/datum/species/aquatic
name = "Aquatic"
id = "aquatic"
default_color = "BCAC9B"
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("mam_tail", "mam_ears","mam_body_markings", "taur", "legs", "mam_snouts")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "Shark", "mam_ears" = "None", "mam_body_markings" = "Shark", "mam_snouts" = "Round", "taur" = "None", "legs" = "Normal Legs")
attack_verb = "bite"
attack_sound = 'sound/weapons/bite.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
liked_food = MEAT
disliked_food = TOXIC
meat = /obj/item/reagent_containers/food/snacks/carpmeat/aquatic
/datum/species/aquatic/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
stop_wagging_tail(H)
/datum/species/aquatic/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
. = ..()
/datum/species/aquatic/can_wag_tail(mob/living/carbon/human/H)
return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
/datum/species/aquatic/is_wagging_tail(mob/living/carbon/human/H)
return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/aquatic/start_wagging_tail(mob/living/carbon/human/H)
if("mam_tail" in mutant_bodyparts)
mutant_bodyparts -= "mam_tail"
mutant_bodyparts |= "mam_waggingtail"
H.update_body()
/datum/species/aquatic/stop_wagging_tail(mob/living/carbon/human/H)
if("mam_waggingtail" in mutant_bodyparts)
mutant_bodyparts -= "mam_waggingtail"
mutant_bodyparts |= "mam_tail"
H.update_body()
/datum/species/aquatic/qualifies_for_rank(rank, list/features)
return TRUE
//INSECT//
/datum/species/insect
name = "Insect"
id = "insect"
default_color = "BCAC9B"
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
mutant_bodyparts = list("mam_ears", "mam_body_markings", "mam_tail", "taur", "moth_wings", "mam_snouts")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "moth_wings" = "Plain", "mam_snouts" = "Bug", "mam_body_markings" = "Moth", "taur" = "None")
attack_verb = "flutter" //wat?
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
liked_food = MEAT | FRUIT
disliked_food = TOXIC
/datum/species/insect/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
stop_wagging_tail(H)
/datum/species/insect/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
. = ..()
/datum/species/insect/can_wag_tail(mob/living/carbon/human/H)
return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
/datum/species/insect/is_wagging_tail(mob/living/carbon/human/H)
return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/insect/start_wagging_tail(mob/living/carbon/human/H)
if("mam_tail" in mutant_bodyparts)
mutant_bodyparts -= "mam_tail"
mutant_bodyparts |= "mam_waggingtail"
H.update_body()
/datum/species/insect/stop_wagging_tail(mob/living/carbon/human/H)
if("mam_waggingtail" in mutant_bodyparts)
mutant_bodyparts -= "mam_waggingtail"
mutant_bodyparts |= "mam_tail"
H.update_body()
/datum/species/insect/qualifies_for_rank(rank, list/features)
return TRUE
//Alien//
/datum/species/xeno
// A cloning mistake, crossing human and xenomorph DNA
name = "Xeno Hybrid"
id = "xeno"
say_mod = "hisses"
default_color = "00FF00"
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "mam_body_markings", "taur", "legs")
default_features = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade Legs")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
skinned_type = /obj/item/stack/sheet/animalhide/xeno
exotic_bloodtype = "L"
damage_overlay_type = "xeno"
liked_food = MEAT
/datum/species/xeno/on_species_gain(mob/living/carbon/human/C, datum/species/old_species)
if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Digitigrade Legs")
species_traits += DIGITIGRADE
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(FALSE)
. = ..()
/datum/species/xeno/on_species_loss(mob/living/carbon/human/C, datum/species/new_species)
if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Normal Legs")
species_traits -= DIGITIGRADE
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(TRUE)
. = ..()
//Praise the Omnissiah, A challange worthy of my skills - HS
//EXOTIC//
//These races will likely include lots of downsides and upsides. Keep them relatively balanced.//
//misc
/mob/living/carbon/human/dummy
no_vore = TRUE
/mob/living/carbon/human/vore
devourable = TRUE
digestable = TRUE
feeding = TRUE
@@ -1,43 +0,0 @@
/datum/species/ipc
name = "IPC"
id = "ipc"
say_mod = "beeps"
default_color = "00FF00"
should_draw_citadel = TRUE
blacklisted = 0
sexes = 0
species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING)
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
mutant_bodyparts = list("ipc_screen", "ipc_antenna")
default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None")
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
mutanttongue = /obj/item/organ/tongue/robot/ipc
exotic_blood = "oil"
var/datum/action/innate/monitor_change/screen
/datum/species/ipc/on_species_gain(mob/living/carbon/human/C)
if(isipcperson(C) && !screen)
screen = new
screen.Grant(C)
..()
/datum/species/ipc/on_species_loss(mob/living/carbon/human/C)
if(screen)
screen.Remove(C)
..()
/datum/action/innate/monitor_change
name = "Screen Change"
check_flags = AB_CHECK_CONSCIOUS
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "drone_vision"
/datum/action/innate/monitor_change/Activate()
var/mob/living/carbon/human/H = owner
var/new_ipc_screen = input(usr, "Choose your character's screen:", "Monitor Display") as null|anything in GLOB.ipc_screens_list
if(!new_ipc_screen)
return
H.dna.features["ipc_screen"] = new_ipc_screen
H.update_body()
@@ -1,245 +0,0 @@
/datum/species/jelly/slime
name = "Xenobiological Slimeperson"
//##########SLIMEPEOPLE##########
/datum/species/jelly/roundstartslime
name = "Slimeperson"
id = "slimeperson"
limbs_id = "slime"
default_color = "00FFFF"
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
inherent_traits = list(TRAIT_TOXINLOVER)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur")
default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None")
say_mod = "says"
hair_color = "mutcolor"
hair_alpha = 160 //a notch brighter so it blends better.
coldmod = 3
heatmod = 1
burnmod = 1
/datum/species/jelly/roundstartslime/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
stop_wagging_tail(H)
/datum/species/jelly/roundstartslime/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
. = ..()
/datum/species/jelly/roundstartslime/can_wag_tail(mob/living/carbon/human/H)
return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
/datum/species/jelly/roundstartslime/is_wagging_tail(mob/living/carbon/human/H)
return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/jelly/roundstartslime/start_wagging_tail(mob/living/carbon/human/H)
if("mam_tail" in mutant_bodyparts)
mutant_bodyparts -= "mam_tail"
mutant_bodyparts |= "mam_waggingtail"
H.update_body()
/datum/species/jelly/roundstartslime/stop_wagging_tail(mob/living/carbon/human/H)
if("mam_waggingtail" in mutant_bodyparts)
mutant_bodyparts -= "mam_waggingtail"
mutant_bodyparts |= "mam_tail"
H.update_body()
/datum/action/innate/slime_change
name = "Alter Form"
check_flags = AB_CHECK_CONSCIOUS
button_icon_state = "alter_form" //placeholder
icon_icon = 'modular_citadel/icons/mob/actions/actions_slime.dmi'
background_icon_state = "bg_alien"
/datum/action/innate/slime_change/Activate()
var/mob/living/carbon/human/H = owner
if(!isjellyperson(H))
return
else
H.visible_message("<span class='notice'>[owner] gains a look of \
concentration while standing perfectly still.\
Their body seems to shift and starts getting more goo-like.</span>",
"<span class='notice'>You focus intently on altering your body while \
standing perfectly still...</span>")
change_form()
/datum/action/innate/slime_change/proc/change_form()
var/mob/living/carbon/human/H = owner
var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Hair Style", "Genitals", "Tail", "Snout", "Markings", "Ears", "Taur body", "Penis", "Vagina", "Penis Length", "Breast Size", "Breast Shape", "Cancel")
if(select_alteration == "Hair Style")
if(H.gender == MALE)
var/new_style = input(owner, "Select a facial hair style", "Hair Alterations") as null|anything in GLOB.facial_hair_styles_list
if(new_style)
H.facial_hair_style = new_style
else
H.facial_hair_style = "Shaved"
//handle normal hair
var/new_style = input(owner, "Select a hair style", "Hair Alterations") as null|anything in GLOB.hair_styles_list
if(new_style)
H.hair_style = new_style
H.update_hair()
else if (select_alteration == "Genitals")
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") as null|anything in GLOB.genitals_list
if(!new_organ)
return
H.give_genital(GLOB.genitals_list[new_organ])
if("remove sexual organ")
var/list/organs = list()
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/O = input("Select sexual organ:", "Organ Manipulation", null) as null|anything in organs
var/obj/item/organ/genital/G = organs[O]
if(!G)
return
G.forceMove(get_turf(H))
qdel(G)
H.update_genitals()
else if (select_alteration == "Ears")
var/list/snowflake_ears_list = list("Normal" = null)
for(var/path in GLOB.mam_ears_list)
var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
snowflake_ears_list[S.name] = path
var/new_ears
new_ears = input(owner, "Choose your character's ears:", "Ear Alteration") as null|anything in snowflake_ears_list
if(new_ears)
H.dna.features["mam_ears"] = new_ears
H.update_body()
else if (select_alteration == "Snout")
var/list/snowflake_snouts_list = list("Normal" = null)
for(var/path in GLOB.mam_snouts_list)
var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
snowflake_snouts_list[S.name] = path
var/new_snout
new_snout = input(owner, "Choose your character's face:", "Face Alteration") as null|anything in snowflake_snouts_list
if(new_snout)
H.dna.features["mam_snouts"] = new_snout
H.update_body()
else if (select_alteration == "Markings")
var/list/snowflake_markings_list = list()
for(var/path in GLOB.mam_body_markings_list)
var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
snowflake_markings_list[S.name] = path
var/new_mam_body_markings
new_mam_body_markings = input(H, "Choose your character's body markings:", "Marking Alteration") as null|anything in snowflake_markings_list
if(new_mam_body_markings)
H.dna.features["mam_body_markings"] = new_mam_body_markings
if(new_mam_body_markings == "None")
H.dna.features["mam_body_markings"] = "Plain"
for(var/X in H.bodyparts) //propagates the markings changes
var/obj/item/bodypart/BP = X
BP.update_limb(FALSE, H)
H.update_body()
else if (select_alteration == "Tail")
var/list/snowflake_tails_list = list("Normal" = null)
for(var/path in GLOB.mam_tails_list)
var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
snowflake_tails_list[S.name] = path
var/new_tail
new_tail = input(owner, "Choose your character's Tail(s):", "Tail Alteration") as null|anything in snowflake_tails_list
if(new_tail)
H.dna.features["mam_tail"] = new_tail
if(new_tail != "None")
H.dna.features["taur"] = "None"
H.update_body()
else if (select_alteration == "Taur body")
var/list/snowflake_taur_list = list("Normal" = null)
for(var/path in GLOB.taur_list)
var/datum/sprite_accessory/taur/instance = GLOB.taur_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
snowflake_taur_list[S.name] = path
var/new_taur
new_taur = input(owner, "Choose your character's tauric body:", "Tauric Alteration") as null|anything in snowflake_taur_list
if(new_taur)
H.dna.features["taur"] = new_taur
if(new_taur != "None")
H.dna.features["mam_tail"] = "None"
H.update_body()
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(owner, "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_genital(/obj/item/organ/genital/testicles)
H.give_genital(/obj/item/organ/genital/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(owner, "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_genital(/obj/item/organ/genital/womb)
H.give_genital(/obj/item/organ/genital/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(owner, "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_genital(/obj/item/organ/genital/testicles)
H.give_genital(/obj/item/organ/genital/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(owner, "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_genital(/obj/item/organ/genital/breasts)
else if (select_alteration == "Breast Shape")
for(var/obj/item/organ/genital/breasts/X in H.internal_organs)
qdel(X)
var/new_shape
new_shape = input(owner, "Breast Shape", "Genital Alteration") as null|anything in GLOB.breasts_shapes_list
if(new_shape)
H.dna.features["breasts_shape"] = new_shape
H.update_genitals()
H.apply_overlay()
H.give_genital(/obj/item/organ/genital/breasts)
else
return
@@ -0,0 +1,633 @@
// List is required to compile the resources into the game when it loads.
// Dynamically loading it has bad results with sounds overtaking each other, even with the wait variable.
#ifdef AI_VOX
GLOBAL_LIST_INIT(vox_sounds_male, list("," = 'modular_citadel/sound/vox/_comma.ogg',
"." = 'modular_citadel/sound/vox/_period.ogg',
"a" = 'modular_citadel/sound/vox/a.ogg',
"accelerating" = 'modular_citadel/sound/vox/accelerating.ogg',
"accelerator" = 'modular_citadel/sound/vox/accelerator.ogg',
"accepted" = 'modular_citadel/sound/vox/accepted.ogg',
"access" = 'modular_citadel/sound/vox/access.ogg',
"acknowledge" = 'modular_citadel/sound/vox/acknowledge.ogg',
"acknowledged" = 'modular_citadel/sound/vox/acknowledged.ogg',
"acquired" = 'modular_citadel/sound/vox/acquired.ogg',
"acquisition" = 'modular_citadel/sound/vox/acquisition.ogg',
"across" = 'modular_citadel/sound/vox/across.ogg',
"activate" = 'modular_citadel/sound/vox/activate.ogg',
"activated" = 'modular_citadel/sound/vox/activated.ogg',
"activity" = 'modular_citadel/sound/vox/activity.ogg',
"adios" = 'modular_citadel/sound/vox/adios.ogg',
"administration" = 'modular_citadel/sound/vox/administration.ogg',
"advanced" = 'modular_citadel/sound/vox/advanced.ogg',
"after" = 'modular_citadel/sound/vox/after.ogg',
"agent" = 'modular_citadel/sound/vox/agent.ogg',
"alarm" = 'modular_citadel/sound/vox/alarm.ogg',
"alert" = 'modular_citadel/sound/vox/alert.ogg',
"alien" = 'modular_citadel/sound/vox/alien.ogg',
"aligned" = 'modular_citadel/sound/vox/aligned.ogg',
"all" = 'modular_citadel/sound/vox/all.ogg',
"alpha" = 'modular_citadel/sound/vox/alpha.ogg',
"am" = 'modular_citadel/sound/vox/am.ogg',
"amigo" = 'modular_citadel/sound/vox/amigo.ogg',
"ammunition" = 'modular_citadel/sound/vox/ammunition.ogg',
"an" = 'modular_citadel/sound/vox/an.ogg',
"and" = 'modular_citadel/sound/vox/and.ogg',
"announcement" = 'modular_citadel/sound/vox/announcement.ogg',
"anomalous" = 'modular_citadel/sound/vox/anomalous.ogg',
"antenna" = 'modular_citadel/sound/vox/antenna.ogg',
"any" = 'modular_citadel/sound/vox/any.ogg',
"apprehend" = 'modular_citadel/sound/vox/apprehend.ogg',
"approach" = 'modular_citadel/sound/vox/approach.ogg',
"are" = 'modular_citadel/sound/vox/are.ogg',
"area" = 'modular_citadel/sound/vox/area.ogg',
"arm" = 'modular_citadel/sound/vox/arm.ogg',
"armed" = 'modular_citadel/sound/vox/armed.ogg',
"armor" = 'modular_citadel/sound/vox/armor.ogg',
"armory" = 'modular_citadel/sound/vox/armory.ogg',
"arrest" = 'modular_citadel/sound/vox/arrest.ogg',
"ass" = 'modular_citadel/sound/vox/ass.ogg',
"at" = 'modular_citadel/sound/vox/at.ogg',
"atomic" = 'modular_citadel/sound/vox/atomic.ogg',
"attention" = 'modular_citadel/sound/vox/attention.ogg',
"authorize" = 'modular_citadel/sound/vox/authorize.ogg',
"authorized" = 'modular_citadel/sound/vox/authorized.ogg',
"automatic" = 'modular_citadel/sound/vox/automatic.ogg',
"away" = 'modular_citadel/sound/vox/away.ogg',
"b" = 'modular_citadel/sound/vox/b.ogg',
"back" = 'modular_citadel/sound/vox/back.ogg',
"backman" = 'modular_citadel/sound/vox/backman.ogg',
"bad" = 'modular_citadel/sound/vox/bad.ogg',
"bag" = 'modular_citadel/sound/vox/bag.ogg',
"bailey" = 'modular_citadel/sound/vox/bailey.ogg',
"barracks" = 'modular_citadel/sound/vox/barracks.ogg',
"base" = 'modular_citadel/sound/vox/base.ogg',
"bay" = 'modular_citadel/sound/vox/bay.ogg',
"be" = 'modular_citadel/sound/vox/be.ogg',
"been" = 'modular_citadel/sound/vox/been.ogg',
"before" = 'modular_citadel/sound/vox/before.ogg',
"beyond" = 'modular_citadel/sound/vox/beyond.ogg',
"biohazard" = 'modular_citadel/sound/vox/biohazard.ogg',
"biological" = 'modular_citadel/sound/vox/biological.ogg',
"birdwell" = 'modular_citadel/sound/vox/birdwell.ogg',
"bizwarn" = 'modular_citadel/sound/vox/bizwarn.ogg',
"black" = 'modular_citadel/sound/vox/black.ogg',
"blast" = 'modular_citadel/sound/vox/blast.ogg',
"blocked" = 'modular_citadel/sound/vox/blocked.ogg',
"bloop" = 'modular_citadel/sound/vox/bloop.ogg',
"blue" = 'modular_citadel/sound/vox/blue.ogg',
"bottom" = 'modular_citadel/sound/vox/bottom.ogg',
"bravo" = 'modular_citadel/sound/vox/bravo.ogg',
"breach" = 'modular_citadel/sound/vox/breach.ogg',
"breached" = 'modular_citadel/sound/vox/breached.ogg',
"break" = 'modular_citadel/sound/vox/break.ogg',
"bridge" = 'modular_citadel/sound/vox/bridge.ogg',
"bust" = 'modular_citadel/sound/vox/bust.ogg',
"but" = 'modular_citadel/sound/vox/but.ogg',
"button" = 'modular_citadel/sound/vox/button.ogg',
"buzwarn" = 'modular_citadel/sound/vox/buzwarn.ogg',
"bypass" = 'modular_citadel/sound/vox/bypass.ogg',
"c" = 'modular_citadel/sound/vox/c.ogg',
"cable" = 'modular_citadel/sound/vox/cable.ogg',
"call" = 'modular_citadel/sound/vox/call.ogg',
"called" = 'modular_citadel/sound/vox/called.ogg',
"canal" = 'modular_citadel/sound/vox/canal.ogg',
"cap" = 'modular_citadel/sound/vox/cap.ogg',
"captain" = 'modular_citadel/sound/vox/captain.ogg',
"capture" = 'modular_citadel/sound/vox/capture.ogg',
"captured" = 'modular_citadel/sound/vox/captured.ogg',
"ceiling" = 'modular_citadel/sound/vox/ceiling.ogg',
"celsius" = 'modular_citadel/sound/vox/celsius.ogg',
"center" = 'modular_citadel/sound/vox/center.ogg',
"centi" = 'modular_citadel/sound/vox/centi.ogg',
"central" = 'modular_citadel/sound/vox/central.ogg',
"chamber" = 'modular_citadel/sound/vox/chamber.ogg',
"charlie" = 'modular_citadel/sound/vox/charlie.ogg',
"check" = 'modular_citadel/sound/vox/check.ogg',
"checkpoint" = 'modular_citadel/sound/vox/checkpoint.ogg',
"chemical" = 'modular_citadel/sound/vox/chemical.ogg',
"cleanup" = 'modular_citadel/sound/vox/cleanup.ogg',
"clear" = 'modular_citadel/sound/vox/clear.ogg',
"clearance" = 'modular_citadel/sound/vox/clearance.ogg',
"close" = 'modular_citadel/sound/vox/close.ogg',
"clown" = 'modular_citadel/sound/vox/clown.ogg',
"code" = 'modular_citadel/sound/vox/code.ogg',
"coded" = 'modular_citadel/sound/vox/coded.ogg',
"collider" = 'modular_citadel/sound/vox/collider.ogg',
"command" = 'modular_citadel/sound/vox/command.ogg',
"communication" = 'modular_citadel/sound/vox/communication.ogg',
"complex" = 'modular_citadel/sound/vox/complex.ogg',
"computer" = 'modular_citadel/sound/vox/computer.ogg',
"condition" = 'modular_citadel/sound/vox/condition.ogg',
"containment" = 'modular_citadel/sound/vox/containment.ogg',
"contamination" = 'modular_citadel/sound/vox/contamination.ogg',
"control" = 'modular_citadel/sound/vox/control.ogg',
"coolant" = 'modular_citadel/sound/vox/coolant.ogg',
"coomer" = 'modular_citadel/sound/vox/coomer.ogg',
"core" = 'modular_citadel/sound/vox/core.ogg',
"correct" = 'modular_citadel/sound/vox/correct.ogg',
"corridor" = 'modular_citadel/sound/vox/corridor.ogg',
"crew" = 'modular_citadel/sound/vox/crew.ogg',
"cross" = 'modular_citadel/sound/vox/cross.ogg',
"cryogenic" = 'modular_citadel/sound/vox/cryogenic.ogg',
"d" = 'modular_citadel/sound/vox/d.ogg',
"dadeda" = 'modular_citadel/sound/vox/dadeda.ogg',
"damage" = 'modular_citadel/sound/vox/damage.ogg',
"damaged" = 'modular_citadel/sound/vox/damaged.ogg',
"danger" = 'modular_citadel/sound/vox/danger.ogg',
"day" = 'modular_citadel/sound/vox/day.ogg',
"deactivated" = 'modular_citadel/sound/vox/deactivated.ogg',
"decompression" = 'modular_citadel/sound/vox/decompression.ogg',
"decontamination" = 'modular_citadel/sound/vox/decontamination.ogg',
"deeoo" = 'modular_citadel/sound/vox/deeoo.ogg',
"defense" = 'modular_citadel/sound/vox/defense.ogg',
"degrees" = 'modular_citadel/sound/vox/degrees.ogg',
"delta" = 'modular_citadel/sound/vox/delta.ogg',
"denied" = 'modular_citadel/sound/vox/denied.ogg',
"deploy" = 'modular_citadel/sound/vox/deploy.ogg',
"deployed" = 'modular_citadel/sound/vox/deployed.ogg',
"destroy" = 'modular_citadel/sound/vox/destroy.ogg',
"destroyed" = 'modular_citadel/sound/vox/destroyed.ogg',
"detain" = 'modular_citadel/sound/vox/detain.ogg',
"detected" = 'modular_citadel/sound/vox/detected.ogg',
"detonation" = 'modular_citadel/sound/vox/detonation.ogg',
"device" = 'modular_citadel/sound/vox/device.ogg',
"did" = 'modular_citadel/sound/vox/did.ogg',
"die" = 'modular_citadel/sound/vox/die.ogg',
"dimensional" = 'modular_citadel/sound/vox/dimensional.ogg',
"dirt" = 'modular_citadel/sound/vox/dirt.ogg',
"disengaged" = 'modular_citadel/sound/vox/disengaged.ogg',
"dish" = 'modular_citadel/sound/vox/dish.ogg',
"disposal" = 'modular_citadel/sound/vox/disposal.ogg',
"distance" = 'modular_citadel/sound/vox/distance.ogg',
"distortion" = 'modular_citadel/sound/vox/distortion.ogg',
"do" = 'modular_citadel/sound/vox/do.ogg',
"doctor" = 'modular_citadel/sound/vox/doctor.ogg',
"doop" = 'modular_citadel/sound/vox/doop.ogg',
"door" = 'modular_citadel/sound/vox/door.ogg',
"down" = 'modular_citadel/sound/vox/down.ogg',
"dual" = 'modular_citadel/sound/vox/dual.ogg',
"duct" = 'modular_citadel/sound/vox/duct.ogg',
"e" = 'modular_citadel/sound/vox/e.ogg',
"east" = 'modular_citadel/sound/vox/east.ogg',
"echo" = 'modular_citadel/sound/vox/echo.ogg',
"ed" = 'modular_citadel/sound/vox/ed.ogg',
"effect" = 'modular_citadel/sound/vox/effect.ogg',
"egress" = 'modular_citadel/sound/vox/egress.ogg',
"eight" = 'modular_citadel/sound/vox/eight.ogg',
"eighteen" = 'modular_citadel/sound/vox/eighteen.ogg',
"eighty" = 'modular_citadel/sound/vox/eighty.ogg',
"electric" = 'modular_citadel/sound/vox/electric.ogg',
"electromagnetic" = 'modular_citadel/sound/vox/electromagnetic.ogg',
"elevator" = 'modular_citadel/sound/vox/elevator.ogg',
"eleven" = 'modular_citadel/sound/vox/eleven.ogg',
"eliminate" = 'modular_citadel/sound/vox/eliminate.ogg',
"emergency" = 'modular_citadel/sound/vox/emergency.ogg',
"enemy" = 'modular_citadel/sound/vox/enemy.ogg',
"energy" = 'modular_citadel/sound/vox/energy.ogg',
"engage" = 'modular_citadel/sound/vox/engage.ogg',
"engaged" = 'modular_citadel/sound/vox/engaged.ogg',
"engine" = 'modular_citadel/sound/vox/engine.ogg',
"enter" = 'modular_citadel/sound/vox/enter.ogg',
"entry" = 'modular_citadel/sound/vox/entry.ogg',
"environment" = 'modular_citadel/sound/vox/environment.ogg',
"error" = 'modular_citadel/sound/vox/error.ogg',
"escape" = 'modular_citadel/sound/vox/escape.ogg',
"evacuate" = 'modular_citadel/sound/vox/evacuate.ogg',
"exchange" = 'modular_citadel/sound/vox/exchange.ogg',
"exit" = 'modular_citadel/sound/vox/exit.ogg',
"expect" = 'modular_citadel/sound/vox/expect.ogg',
"experiment" = 'modular_citadel/sound/vox/experiment.ogg',
"experimental" = 'modular_citadel/sound/vox/experimental.ogg',
"explode" = 'modular_citadel/sound/vox/explode.ogg',
"explosion" = 'modular_citadel/sound/vox/explosion.ogg',
"exposure" = 'modular_citadel/sound/vox/exposure.ogg',
"exterminate" = 'modular_citadel/sound/vox/exterminate.ogg',
"extinguish" = 'modular_citadel/sound/vox/extinguish.ogg',
"extinguisher" = 'modular_citadel/sound/vox/extinguisher.ogg',
"extreme" = 'modular_citadel/sound/vox/extreme.ogg',
"f" = 'modular_citadel/sound/vox/f.ogg',
"face" = 'modular_citadel/sound/vox/face.ogg',
"facility" = 'modular_citadel/sound/vox/facility.ogg',
"fahrenheit" = 'modular_citadel/sound/vox/fahrenheit.ogg',
"failed" = 'modular_citadel/sound/vox/failed.ogg',
"failure" = 'modular_citadel/sound/vox/failure.ogg',
"farthest" = 'modular_citadel/sound/vox/farthest.ogg',
"fast" = 'modular_citadel/sound/vox/fast.ogg',
"feet" = 'modular_citadel/sound/vox/feet.ogg',
"field" = 'modular_citadel/sound/vox/field.ogg',
"fifteen" = 'modular_citadel/sound/vox/fifteen.ogg',
"fifth" = 'modular_citadel/sound/vox/fifth.ogg',
"fifty" = 'modular_citadel/sound/vox/fifty.ogg',
"final" = 'modular_citadel/sound/vox/final.ogg',
"fine" = 'modular_citadel/sound/vox/fine.ogg',
"fire" = 'modular_citadel/sound/vox/fire.ogg',
"first" = 'modular_citadel/sound/vox/first.ogg',
"five" = 'modular_citadel/sound/vox/five.ogg',
"flag" = 'modular_citadel/sound/vox/flag.ogg',
"flooding" = 'modular_citadel/sound/vox/flooding.ogg',
"floor" = 'modular_citadel/sound/vox/floor.ogg',
"fool" = 'modular_citadel/sound/vox/fool.ogg',
"for" = 'modular_citadel/sound/vox/for.ogg',
"forbidden" = 'modular_citadel/sound/vox/forbidden.ogg',
"force" = 'modular_citadel/sound/vox/force.ogg',
"forms" = 'modular_citadel/sound/vox/forms.ogg',
"found" = 'modular_citadel/sound/vox/found.ogg',
"four" = 'modular_citadel/sound/vox/four.ogg',
"fourteen" = 'modular_citadel/sound/vox/fourteen.ogg',
"fourth" = 'modular_citadel/sound/vox/fourth.ogg',
"fourty" = 'modular_citadel/sound/vox/fourty.ogg',
"foxtrot" = 'modular_citadel/sound/vox/foxtrot.ogg',
"freeman" = 'modular_citadel/sound/vox/freeman.ogg',
"freezer" = 'modular_citadel/sound/vox/freezer.ogg',
"from" = 'modular_citadel/sound/vox/from.ogg',
"front" = 'modular_citadel/sound/vox/front.ogg',
"fuel" = 'modular_citadel/sound/vox/fuel.ogg',
"g" = 'modular_citadel/sound/vox/g.ogg',
"gay" = 'modular_citadel/sound/vox/gay.ogg',
"get" = 'modular_citadel/sound/vox/get.ogg',
"go" = 'modular_citadel/sound/vox/go.ogg',
"going" = 'modular_citadel/sound/vox/going.ogg',
"good" = 'modular_citadel/sound/vox/good.ogg',
"goodbye" = 'modular_citadel/sound/vox/goodbye.ogg',
"gordon" = 'modular_citadel/sound/vox/gordon.ogg',
"got" = 'modular_citadel/sound/vox/got.ogg',
"government" = 'modular_citadel/sound/vox/government.ogg',
"granted" = 'modular_citadel/sound/vox/granted.ogg',
"great" = 'modular_citadel/sound/vox/great.ogg',
"green" = 'modular_citadel/sound/vox/green.ogg',
"grenade" = 'modular_citadel/sound/vox/grenade.ogg',
"guard" = 'modular_citadel/sound/vox/guard.ogg',
"gulf" = 'modular_citadel/sound/vox/gulf.ogg',
"gun" = 'modular_citadel/sound/vox/gun.ogg',
"guthrie" = 'modular_citadel/sound/vox/guthrie.ogg',
"handling" = 'modular_citadel/sound/vox/handling.ogg',
"hangar" = 'modular_citadel/sound/vox/hangar.ogg',
"has" = 'modular_citadel/sound/vox/has.ogg',
"have" = 'modular_citadel/sound/vox/have.ogg',
"hazard" = 'modular_citadel/sound/vox/hazard.ogg',
"head" = 'modular_citadel/sound/vox/head.ogg',
"health" = 'modular_citadel/sound/vox/health.ogg',
"heat" = 'modular_citadel/sound/vox/heat.ogg',
"helicopter" = 'modular_citadel/sound/vox/helicopter.ogg',
"helium" = 'modular_citadel/sound/vox/helium.ogg',
"hello" = 'modular_citadel/sound/vox/hello.ogg',
"help" = 'modular_citadel/sound/vox/help.ogg',
"here" = 'modular_citadel/sound/vox/here.ogg',
"hide" = 'modular_citadel/sound/vox/hide.ogg',
"high" = 'modular_citadel/sound/vox/high.ogg',
"highest" = 'modular_citadel/sound/vox/highest.ogg',
"hit" = 'modular_citadel/sound/vox/hit.ogg',
"holds" = 'modular_citadel/sound/vox/holds.ogg',
"hole" = 'modular_citadel/sound/vox/hole.ogg',
"hostile" = 'modular_citadel/sound/vox/hostile.ogg',
"hot" = 'modular_citadel/sound/vox/hot.ogg',
"hotel" = 'modular_citadel/sound/vox/hotel.ogg',
"hour" = 'modular_citadel/sound/vox/hour.ogg',
"hours" = 'modular_citadel/sound/vox/hours.ogg',
"hundred" = 'modular_citadel/sound/vox/hundred.ogg',
"hydro" = 'modular_citadel/sound/vox/hydro.ogg',
"i" = 'modular_citadel/sound/vox/i.ogg',
"idiot" = 'modular_citadel/sound/vox/idiot.ogg',
"illegal" = 'modular_citadel/sound/vox/illegal.ogg',
"immediate" = 'modular_citadel/sound/vox/immediate.ogg',
"immediately" = 'modular_citadel/sound/vox/immediately.ogg',
"in" = 'modular_citadel/sound/vox/in.ogg',
"inches" = 'modular_citadel/sound/vox/inches.ogg',
"india" = 'modular_citadel/sound/vox/india.ogg',
"ing" = 'modular_citadel/sound/vox/ing.ogg',
"inoperative" = 'modular_citadel/sound/vox/inoperative.ogg',
"inside" = 'modular_citadel/sound/vox/inside.ogg',
"inspection" = 'modular_citadel/sound/vox/inspection.ogg',
"inspector" = 'modular_citadel/sound/vox/inspector.ogg',
"interchange" = 'modular_citadel/sound/vox/interchange.ogg',
"intruder" = 'modular_citadel/sound/vox/intruder.ogg',
"invallid" = 'modular_citadel/sound/vox/invallid.ogg',
"invasion" = 'modular_citadel/sound/vox/invasion.ogg',
"is" = 'modular_citadel/sound/vox/is.ogg',
"it" = 'modular_citadel/sound/vox/it.ogg',
"johnson" = 'modular_citadel/sound/vox/johnson.ogg',
"juliet" = 'modular_citadel/sound/vox/juliet.ogg',
"key" = 'modular_citadel/sound/vox/key.ogg',
"kill" = 'modular_citadel/sound/vox/kill.ogg',
"kilo" = 'modular_citadel/sound/vox/kilo.ogg',
"kit" = 'modular_citadel/sound/vox/kit.ogg',
"lab" = 'modular_citadel/sound/vox/lab.ogg',
"lambda" = 'modular_citadel/sound/vox/lambda.ogg',
"laser" = 'modular_citadel/sound/vox/laser.ogg',
"last" = 'modular_citadel/sound/vox/last.ogg',
"launch" = 'modular_citadel/sound/vox/launch.ogg',
"leak" = 'modular_citadel/sound/vox/leak.ogg',
"leave" = 'modular_citadel/sound/vox/leave.ogg',
"left" = 'modular_citadel/sound/vox/left.ogg',
"legal" = 'modular_citadel/sound/vox/legal.ogg',
"level" = 'modular_citadel/sound/vox/level.ogg',
"lever" = 'modular_citadel/sound/vox/lever.ogg',
"lie" = 'modular_citadel/sound/vox/lie.ogg',
"lieutenant" = 'modular_citadel/sound/vox/lieutenant.ogg',
"life" = 'modular_citadel/sound/vox/life.ogg',
"light" = 'modular_citadel/sound/vox/light.ogg',
"lima" = 'modular_citadel/sound/vox/lima.ogg',
"liquid" = 'modular_citadel/sound/vox/liquid.ogg',
"loading" = 'modular_citadel/sound/vox/loading.ogg',
"locate" = 'modular_citadel/sound/vox/locate.ogg',
"located" = 'modular_citadel/sound/vox/located.ogg',
"location" = 'modular_citadel/sound/vox/location.ogg',
"lock" = 'modular_citadel/sound/vox/lock.ogg',
"locked" = 'modular_citadel/sound/vox/locked.ogg',
"locker" = 'modular_citadel/sound/vox/locker.ogg',
"lockout" = 'modular_citadel/sound/vox/lockout.ogg',
"lower" = 'modular_citadel/sound/vox/lower.ogg',
"lowest" = 'modular_citadel/sound/vox/lowest.ogg',
"magnetic" = 'modular_citadel/sound/vox/magnetic.ogg',
"main" = 'modular_citadel/sound/vox/main.ogg',
"maintenance" = 'modular_citadel/sound/vox/maintenance.ogg',
"malfunction" = 'modular_citadel/sound/vox/malfunction.ogg',
"man" = 'modular_citadel/sound/vox/man.ogg',
"mass" = 'modular_citadel/sound/vox/mass.ogg',
"materials" = 'modular_citadel/sound/vox/materials.ogg',
"maximum" = 'modular_citadel/sound/vox/maximum.ogg',
"may" = 'modular_citadel/sound/vox/may.ogg',
"med" = 'modular_citadel/sound/vox/med.ogg',
"medical" = 'modular_citadel/sound/vox/medical.ogg',
"men" = 'modular_citadel/sound/vox/men.ogg',
"mercy" = 'modular_citadel/sound/vox/mercy.ogg',
"mesa" = 'modular_citadel/sound/vox/mesa.ogg',
"message" = 'modular_citadel/sound/vox/message.ogg',
"meter" = 'modular_citadel/sound/vox/meter.ogg',
"micro" = 'modular_citadel/sound/vox/micro.ogg',
"middle" = 'modular_citadel/sound/vox/middle.ogg',
"mike" = 'modular_citadel/sound/vox/mike.ogg',
"miles" = 'modular_citadel/sound/vox/miles.ogg',
"military" = 'modular_citadel/sound/vox/military.ogg',
"milli" = 'modular_citadel/sound/vox/milli.ogg',
"million" = 'modular_citadel/sound/vox/million.ogg',
"minefield" = 'modular_citadel/sound/vox/minefield.ogg',
"minimum" = 'modular_citadel/sound/vox/minimum.ogg',
"minutes" = 'modular_citadel/sound/vox/minutes.ogg',
"mister" = 'modular_citadel/sound/vox/mister.ogg',
"mode" = 'modular_citadel/sound/vox/mode.ogg',
"motor" = 'modular_citadel/sound/vox/motor.ogg',
"motorpool" = 'modular_citadel/sound/vox/motorpool.ogg',
"move" = 'modular_citadel/sound/vox/move.ogg',
"must" = 'modular_citadel/sound/vox/must.ogg',
"nearest" = 'modular_citadel/sound/vox/nearest.ogg',
"nice" = 'modular_citadel/sound/vox/nice.ogg',
"nine" = 'modular_citadel/sound/vox/nine.ogg',
"nineteen" = 'modular_citadel/sound/vox/nineteen.ogg',
"ninety" = 'modular_citadel/sound/vox/ninety.ogg',
"no" = 'modular_citadel/sound/vox/no.ogg',
"nominal" = 'modular_citadel/sound/vox/nominal.ogg',
"north" = 'modular_citadel/sound/vox/north.ogg',
"not" = 'modular_citadel/sound/vox/not.ogg',
"november" = 'modular_citadel/sound/vox/november.ogg',
"now" = 'modular_citadel/sound/vox/now.ogg',
"number" = 'modular_citadel/sound/vox/number.ogg',
"objective" = 'modular_citadel/sound/vox/objective.ogg',
"observation" = 'modular_citadel/sound/vox/observation.ogg',
"of" = 'modular_citadel/sound/vox/of.ogg',
"officer" = 'modular_citadel/sound/vox/officer.ogg',
"ok" = 'modular_citadel/sound/vox/ok.ogg',
"on" = 'modular_citadel/sound/vox/on.ogg',
"one" = 'modular_citadel/sound/vox/one.ogg',
"open" = 'modular_citadel/sound/vox/open.ogg',
"operating" = 'modular_citadel/sound/vox/operating.ogg',
"operations" = 'modular_citadel/sound/vox/operations.ogg',
"operative" = 'modular_citadel/sound/vox/operative.ogg',
"option" = 'modular_citadel/sound/vox/option.ogg',
"order" = 'modular_citadel/sound/vox/order.ogg',
"organic" = 'modular_citadel/sound/vox/organic.ogg',
"oscar" = 'modular_citadel/sound/vox/oscar.ogg',
"out" = 'modular_citadel/sound/vox/out.ogg',
"outside" = 'modular_citadel/sound/vox/outside.ogg',
"over" = 'modular_citadel/sound/vox/over.ogg',
"overload" = 'modular_citadel/sound/vox/overload.ogg',
"override" = 'modular_citadel/sound/vox/override.ogg',
"pacify" = 'modular_citadel/sound/vox/pacify.ogg',
"pain" = 'modular_citadel/sound/vox/pain.ogg',
"pal" = 'modular_citadel/sound/vox/pal.ogg',
"panel" = 'modular_citadel/sound/vox/panel.ogg',
"percent" = 'modular_citadel/sound/vox/percent.ogg',
"perimeter" = 'modular_citadel/sound/vox/perimeter.ogg',
"permitted" = 'modular_citadel/sound/vox/permitted.ogg',
"personnel" = 'modular_citadel/sound/vox/personnel.ogg',
"pipe" = 'modular_citadel/sound/vox/pipe.ogg',
"plant" = 'modular_citadel/sound/vox/plant.ogg',
"platform" = 'modular_citadel/sound/vox/platform.ogg',
"please" = 'modular_citadel/sound/vox/please.ogg',
"point" = 'modular_citadel/sound/vox/point.ogg',
"portal" = 'modular_citadel/sound/vox/portal.ogg',
"power" = 'modular_citadel/sound/vox/power.ogg',
"presence" = 'modular_citadel/sound/vox/presence.ogg',
"press" = 'modular_citadel/sound/vox/press.ogg',
"primary" = 'modular_citadel/sound/vox/primary.ogg',
"proceed" = 'modular_citadel/sound/vox/proceed.ogg',
"processing" = 'modular_citadel/sound/vox/processing.ogg',
"progress" = 'modular_citadel/sound/vox/progress.ogg',
"proper" = 'modular_citadel/sound/vox/proper.ogg',
"propulsion" = 'modular_citadel/sound/vox/propulsion.ogg',
"prosecute" = 'modular_citadel/sound/vox/prosecute.ogg',
"protective" = 'modular_citadel/sound/vox/protective.ogg',
"push" = 'modular_citadel/sound/vox/push.ogg',
"quantum" = 'modular_citadel/sound/vox/quantum.ogg',
"quebec" = 'modular_citadel/sound/vox/quebec.ogg',
"question" = 'modular_citadel/sound/vox/question.ogg',
"questioning" = 'modular_citadel/sound/vox/questioning.ogg',
"quick" = 'modular_citadel/sound/vox/quick.ogg',
"quit" = 'modular_citadel/sound/vox/quit.ogg',
"radiation" = 'modular_citadel/sound/vox/radiation.ogg',
"radioactive" = 'modular_citadel/sound/vox/radioactive.ogg',
"rads" = 'modular_citadel/sound/vox/rads.ogg',
"rapid" = 'modular_citadel/sound/vox/rapid.ogg',
"reach" = 'modular_citadel/sound/vox/reach.ogg',
"reached" = 'modular_citadel/sound/vox/reached.ogg',
"reactor" = 'modular_citadel/sound/vox/reactor.ogg',
"red" = 'modular_citadel/sound/vox/red.ogg',
"relay" = 'modular_citadel/sound/vox/relay.ogg',
"released" = 'modular_citadel/sound/vox/released.ogg',
"remaining" = 'modular_citadel/sound/vox/remaining.ogg',
"renegade" = 'modular_citadel/sound/vox/renegade.ogg',
"repair" = 'modular_citadel/sound/vox/repair.ogg',
"report" = 'modular_citadel/sound/vox/report.ogg',
"reports" = 'modular_citadel/sound/vox/reports.ogg',
"required" = 'modular_citadel/sound/vox/required.ogg',
"research" = 'modular_citadel/sound/vox/research.ogg',
"reset" = 'modular_citadel/sound/vox/reset.ogg',
"resevoir" = 'modular_citadel/sound/vox/resevoir.ogg',
"resistance" = 'modular_citadel/sound/vox/resistance.ogg',
"returned" = 'modular_citadel/sound/vox/returned.ogg',
"right" = 'modular_citadel/sound/vox/right.ogg',
"rocket" = 'modular_citadel/sound/vox/rocket.ogg',
"roger" = 'modular_citadel/sound/vox/roger.ogg',
"romeo" = 'modular_citadel/sound/vox/romeo.ogg',
"room" = 'modular_citadel/sound/vox/room.ogg',
"round" = 'modular_citadel/sound/vox/round.ogg',
"run" = 'modular_citadel/sound/vox/run.ogg',
"safe" = 'modular_citadel/sound/vox/safe.ogg',
"safety" = 'modular_citadel/sound/vox/safety.ogg',
"sargeant" = 'modular_citadel/sound/vox/sargeant.ogg',
"satellite" = 'modular_citadel/sound/vox/satellite.ogg',
"save" = 'modular_citadel/sound/vox/save.ogg',
"science" = 'modular_citadel/sound/vox/science.ogg',
"scores" = 'modular_citadel/sound/vox/scores.ogg',
"scream" = 'modular_citadel/sound/vox/scream.ogg',
"screen" = 'modular_citadel/sound/vox/screen.ogg',
"search" = 'modular_citadel/sound/vox/search.ogg',
"second" = 'modular_citadel/sound/vox/second.ogg',
"secondary" = 'modular_citadel/sound/vox/secondary.ogg',
"seconds" = 'modular_citadel/sound/vox/seconds.ogg',
"sector" = 'modular_citadel/sound/vox/sector.ogg',
"secure" = 'modular_citadel/sound/vox/secure.ogg',
"secured" = 'modular_citadel/sound/vox/secured.ogg',
"security" = 'modular_citadel/sound/vox/security.ogg',
"select" = 'modular_citadel/sound/vox/select.ogg',
"selected" = 'modular_citadel/sound/vox/selected.ogg',
"service" = 'modular_citadel/sound/vox/service.ogg',
"seven" = 'modular_citadel/sound/vox/seven.ogg',
"seventeen" = 'modular_citadel/sound/vox/seventeen.ogg',
"seventy" = 'modular_citadel/sound/vox/seventy.ogg',
"severe" = 'modular_citadel/sound/vox/severe.ogg',
"sewage" = 'modular_citadel/sound/vox/sewage.ogg',
"sewer" = 'modular_citadel/sound/vox/sewer.ogg',
"shield" = 'modular_citadel/sound/vox/shield.ogg',
"shipment" = 'modular_citadel/sound/vox/shipment.ogg',
"shock" = 'modular_citadel/sound/vox/shock.ogg',
"shoot" = 'modular_citadel/sound/vox/shoot.ogg',
"shower" = 'modular_citadel/sound/vox/shower.ogg',
"shut" = 'modular_citadel/sound/vox/shut.ogg',
"side" = 'modular_citadel/sound/vox/side.ogg',
"sierra" = 'modular_citadel/sound/vox/sierra.ogg',
"sight" = 'modular_citadel/sound/vox/sight.ogg',
"silo" = 'modular_citadel/sound/vox/silo.ogg',
"six" = 'modular_citadel/sound/vox/six.ogg',
"sixteen" = 'modular_citadel/sound/vox/sixteen.ogg',
"sixty" = 'modular_citadel/sound/vox/sixty.ogg',
"slime" = 'modular_citadel/sound/vox/slime.ogg',
"slow" = 'modular_citadel/sound/vox/slow.ogg',
"soldier" = 'modular_citadel/sound/vox/soldier.ogg',
"some" = 'modular_citadel/sound/vox/some.ogg',
"someone" = 'modular_citadel/sound/vox/someone.ogg',
"something" = 'modular_citadel/sound/vox/something.ogg',
"son" = 'modular_citadel/sound/vox/son.ogg',
"sorry" = 'modular_citadel/sound/vox/sorry.ogg',
"south" = 'modular_citadel/sound/vox/south.ogg',
"squad" = 'modular_citadel/sound/vox/squad.ogg',
"square" = 'modular_citadel/sound/vox/square.ogg',
"stairway" = 'modular_citadel/sound/vox/stairway.ogg',
"status" = 'modular_citadel/sound/vox/status.ogg',
"sterile" = 'modular_citadel/sound/vox/sterile.ogg',
"sterilization" = 'modular_citadel/sound/vox/sterilization.ogg',
"stolen" = 'modular_citadel/sound/vox/stolen.ogg',
"storage" = 'modular_citadel/sound/vox/storage.ogg',
"sub" = 'modular_citadel/sound/vox/sub.ogg',
"subsurface" = 'modular_citadel/sound/vox/subsurface.ogg',
"sudden" = 'modular_citadel/sound/vox/sudden.ogg',
"suit" = 'modular_citadel/sound/vox/suit.ogg',
"superconducting" = 'modular_citadel/sound/vox/superconducting.ogg',
"supercooled" = 'modular_citadel/sound/vox/supercooled.ogg',
"supply" = 'modular_citadel/sound/vox/supply.ogg',
"surface" = 'modular_citadel/sound/vox/surface.ogg',
"surrender" = 'modular_citadel/sound/vox/surrender.ogg',
"surround" = 'modular_citadel/sound/vox/surround.ogg',
"surrounded" = 'modular_citadel/sound/vox/surrounded.ogg',
"switch" = 'modular_citadel/sound/vox/switch.ogg',
"system" = 'modular_citadel/sound/vox/system.ogg',
"systems" = 'modular_citadel/sound/vox/systems.ogg',
"tactical" = 'modular_citadel/sound/vox/tactical.ogg',
"take" = 'modular_citadel/sound/vox/take.ogg',
"talk" = 'modular_citadel/sound/vox/talk.ogg',
"tango" = 'modular_citadel/sound/vox/tango.ogg',
"tank" = 'modular_citadel/sound/vox/tank.ogg',
"target" = 'modular_citadel/sound/vox/target.ogg',
"team" = 'modular_citadel/sound/vox/team.ogg',
"temperature" = 'modular_citadel/sound/vox/temperature.ogg',
"temporal" = 'modular_citadel/sound/vox/temporal.ogg',
"ten" = 'modular_citadel/sound/vox/ten.ogg',
"terminal" = 'modular_citadel/sound/vox/terminal.ogg',
"terminated" = 'modular_citadel/sound/vox/terminated.ogg',
"termination" = 'modular_citadel/sound/vox/termination.ogg',
"test" = 'modular_citadel/sound/vox/test.ogg',
"that" = 'modular_citadel/sound/vox/that.ogg',
"the" = 'modular_citadel/sound/vox/the.ogg',
"then" = 'modular_citadel/sound/vox/then.ogg',
"there" = 'modular_citadel/sound/vox/there.ogg',
"third" = 'modular_citadel/sound/vox/third.ogg',
"thirteen" = 'modular_citadel/sound/vox/thirteen.ogg',
"thirty" = 'modular_citadel/sound/vox/thirty.ogg',
"this" = 'modular_citadel/sound/vox/this.ogg',
"those" = 'modular_citadel/sound/vox/those.ogg',
"thousand" = 'modular_citadel/sound/vox/thousand.ogg',
"threat" = 'modular_citadel/sound/vox/threat.ogg',
"three" = 'modular_citadel/sound/vox/three.ogg',
"through" = 'modular_citadel/sound/vox/through.ogg',
"time" = 'modular_citadel/sound/vox/time.ogg',
"to" = 'modular_citadel/sound/vox/to.ogg',
"top" = 'modular_citadel/sound/vox/top.ogg',
"topside" = 'modular_citadel/sound/vox/topside.ogg',
"touch" = 'modular_citadel/sound/vox/touch.ogg',
"towards" = 'modular_citadel/sound/vox/towards.ogg',
"track" = 'modular_citadel/sound/vox/track.ogg',
"train" = 'modular_citadel/sound/vox/train.ogg',
"transportation" = 'modular_citadel/sound/vox/transportation.ogg',
"truck" = 'modular_citadel/sound/vox/truck.ogg',
"tunnel" = 'modular_citadel/sound/vox/tunnel.ogg',
"turn" = 'modular_citadel/sound/vox/turn.ogg',
"turret" = 'modular_citadel/sound/vox/turret.ogg',
"twelve" = 'modular_citadel/sound/vox/twelve.ogg',
"twenty" = 'modular_citadel/sound/vox/twenty.ogg',
"two" = 'modular_citadel/sound/vox/two.ogg',
"unauthorized" = 'modular_citadel/sound/vox/unauthorized.ogg',
"under" = 'modular_citadel/sound/vox/under.ogg',
"uniform" = 'modular_citadel/sound/vox/uniform.ogg',
"unlocked" = 'modular_citadel/sound/vox/unlocked.ogg',
"until" = 'modular_citadel/sound/vox/until.ogg',
"up" = 'modular_citadel/sound/vox/up.ogg',
"upper" = 'modular_citadel/sound/vox/upper.ogg',
"uranium" = 'modular_citadel/sound/vox/uranium.ogg',
"us" = 'modular_citadel/sound/vox/us.ogg',
"usa" = 'modular_citadel/sound/vox/usa.ogg',
"use" = 'modular_citadel/sound/vox/use.ogg',
"used" = 'modular_citadel/sound/vox/used.ogg',
"user" = 'modular_citadel/sound/vox/user.ogg',
"vacate" = 'modular_citadel/sound/vox/vacate.ogg',
"valid" = 'modular_citadel/sound/vox/valid.ogg',
"vapor" = 'modular_citadel/sound/vox/vapor.ogg',
"vent" = 'modular_citadel/sound/vox/vent.ogg',
"ventillation" = 'modular_citadel/sound/vox/ventillation.ogg',
"victor" = 'modular_citadel/sound/vox/victor.ogg',
"violated" = 'modular_citadel/sound/vox/violated.ogg',
"violation" = 'modular_citadel/sound/vox/violation.ogg',
"voltage" = 'modular_citadel/sound/vox/voltage.ogg',
"vox_login" = 'modular_citadel/sound/vox/vox_login.ogg',
"walk" = 'modular_citadel/sound/vox/walk.ogg',
"wall" = 'modular_citadel/sound/vox/wall.ogg',
"want" = 'modular_citadel/sound/vox/want.ogg',
"wanted" = 'modular_citadel/sound/vox/wanted.ogg',
"warm" = 'modular_citadel/sound/vox/warm.ogg',
"warn" = 'modular_citadel/sound/vox/warn.ogg',
"warning" = 'modular_citadel/sound/vox/warning.ogg',
"waste" = 'modular_citadel/sound/vox/waste.ogg',
"water" = 'modular_citadel/sound/vox/water.ogg',
"we" = 'modular_citadel/sound/vox/we.ogg',
"weapon" = 'modular_citadel/sound/vox/weapon.ogg',
"west" = 'modular_citadel/sound/vox/west.ogg',
"whiskey" = 'modular_citadel/sound/vox/whiskey.ogg',
"white" = 'modular_citadel/sound/vox/white.ogg',
"wilco" = 'modular_citadel/sound/vox/wilco.ogg',
"will" = 'modular_citadel/sound/vox/will.ogg',
"with" = 'modular_citadel/sound/vox/with.ogg',
"without" = 'modular_citadel/sound/vox/without.ogg',
"woop" = 'modular_citadel/sound/vox/woop.ogg',
"xeno" = 'modular_citadel/sound/vox/xeno.ogg',
"yankee" = 'modular_citadel/sound/vox/yankee.ogg',
"yards" = 'modular_citadel/sound/vox/yards.ogg',
"year" = 'modular_citadel/sound/vox/year.ogg',
"yellow" = 'modular_citadel/sound/vox/yellow.ogg',
"yes" = 'modular_citadel/sound/vox/yes.ogg',
"you" = 'modular_citadel/sound/vox/you.ogg',
"your" = 'modular_citadel/sound/vox/your.ogg',
"yourself" = 'modular_citadel/sound/vox/yourself.ogg',
"zero" = 'modular_citadel/sound/vox/zero.ogg',
"zone" = 'modular_citadel/sound/vox/zone.ogg',
"zulu" = 'modular_citadel/sound/vox/zulu.ogg',))
#endif
@@ -10,7 +10,7 @@ mob/living/silicon
/mob/living/silicon/robot/update_canmove()
..()
if(client && stat != DEAD && dogborg == TRUE)
if(client && stat != DEAD && dogborg == FALSE)
if(resting)
cut_overlays()
icon_state = "[module.cyborg_base_icon]-rest"
@@ -18,6 +18,9 @@ mob/living/silicon
icon_state = "[module.cyborg_base_icon]"
update_icons()
/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_stamina = 1)
if(istype(cell))
cell.charge -= amount*5
@@ -61,7 +61,7 @@
/obj/item/robot_module/k9/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
var/list/sechoundmodels = list("Default")
var/list/sechoundmodels = list("Default", "Dark", "Vale")
if(R.client && R.client.ckey in list("nezuli"))
sechoundmodels += "Alina"
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in sechoundmodels
@@ -70,11 +70,14 @@
switch(borg_icon)
if("Default")
cyborg_base_icon = "k9"
moduleselect_icon = "k9"
if("Alina")
cyborg_base_icon = "alina-sec"
special_light_key = "alina"
sleeper_overlay = "alinasleeper"
if("Dark")
cyborg_base_icon = "k9dark"
if("Vale")
cyborg_base_icon = "valesec"
return ..()
/obj/item/robot_module/medihound
@@ -109,7 +112,7 @@
/obj/item/robot_module/medihound/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
var/list/medhoundmodels = list("Default", "Dark")
var/list/medhoundmodels = list("Default", "Dark", "Vale")
if(R.client && R.client.ckey in list("nezuli"))
medhoundmodels += "Alina"
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in medhoundmodels
@@ -121,6 +124,9 @@
if("Dark")
cyborg_base_icon = "medihounddark"
sleeper_overlay = "mdsleeper"
if("Vale")
cyborg_base_icon = "valemed"
sleeper_overlay = "valemedsleeper"
if("Alina")
cyborg_base_icon = "alina-med"
special_light_key = "alina"
@@ -313,7 +319,7 @@
/obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Heavy", "Sleek", "Butler", "Tophat", "Kent", "Bro")
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Heavy", "Sleek", "Butler", "Tophat", "Kent", "Bro", "DarkK9", "Vale", "ValeDark")
if(!borg_icon)
return FALSE
switch(borg_icon)
@@ -339,11 +345,32 @@
cyborg_base_icon = "heavyserv"
special_light_key = "heavyserv"
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
if("DarkK9")
cyborg_base_icon = "k50"
special_light_key = "k50"
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
has_snowflake_deadsprite = TRUE
dogborg = TRUE
cyborg_pixel_offset = -16
if("Vale")
cyborg_base_icon = "valeserv"
special_light_key = "valeserv"
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
has_snowflake_deadsprite = TRUE
dogborg = TRUE
cyborg_pixel_offset = -16
if("ValeDark")
cyborg_base_icon = "valeservdark"
special_light_key = "valeservdark"
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
has_snowflake_deadsprite = TRUE
dogborg = TRUE
cyborg_pixel_offset = -16
return ..()
/obj/item/robot_module/engineering/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer")
var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale")
if(R.client && R.client.ckey in list("nezuli"))
engymodels += "Alina"
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in engymodels
@@ -386,6 +413,14 @@
has_snowflake_deadsprite = TRUE
dogborg = TRUE
cyborg_pixel_offset = -16
if("Vale")
cyborg_base_icon = "valeeng"
can_be_pushed = FALSE
hat_offset = INFINITY
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
has_snowflake_deadsprite = TRUE
dogborg = TRUE
cyborg_pixel_offset = -16
if("Alina")
cyborg_base_icon = "alina-eng"
special_light_key = "alina"
@@ -1,306 +0,0 @@
//Sprites are trademarks of Gamefreak, Nintendo, The Pokemon Company, and Spike Chunsoft.
#define ispokemon(A) (istype(A, /mob/living/simple_animal/pokemon))
//POKEBALL
/obj/item/pokeball
name = "pokeball"
icon = 'icons/obj/pokeball.dmi'
icon_state = "pokeball"
force = 0
throwforce = 0
var/success_chance = 25
var/pokemon
/obj/item/pokeball/great
name = "great ball"
icon_state = "pokeball_great"
success_chance = 50
/obj/item/pokeball/ultra
icon_state = "pokeball_ultra"
name = "ultra ball"
success_chance = 75
/obj/item/pokeball/master
icon_state = "pokeball_master"
name = "master ball"
success_chance = 100
/* //WIP
/obj/item/pokeball/throw_impact(atom/hit_atom)
if(ispokemon(hit_atom))
var/mob/living/simple_animal/pokemon/pmon = hit_atom
var/initial_success_chance = success_chance
pmon.resize = 0.1
pmon.color = "RED"
pmon.canmove = 0
sleep(15)
if(pmon.pokeball == src)
pmon.loc = src
pokemon = pmon
return 1
if(pmon.pokeball && pmon.pokeball !=src)
return ..()
var/bonus_chance = ((pmon.maxHealth - pmon.health) / 2)
if(bonus_chance > 100)
bonus_chance = 100
success_chance = (success_chance + bonus_chance)
if(success_chance > 100)
success_chance = 100
if(success_chance < 0)//just in case
success_chance = 0
sleep(15)
if(prob(success_chance))
visible_message("<span class='warning'>[src] shakes...</span>")
else
escape()
sleep(15)
if(prob(success_chance))
visible_message("<span class='warning'>[src] shakes...</span>")
else
escape()
sleep(15)
if(prob(success_chance))
visible_message("<span class='warning'>[src] shakes...</span>")
else
escape()
else
..()
/obj/item/pokeball/proc/capture(mob/living/simple_animal/pokemon/pmon, mob/living/user)
/obj/item/pokeball/proc/escape(mob/living/simple_animal/pokemon/pmon, mob/living/user)
if(!pokemon)
return
pmon.resize = 10
pmon.color = null
pmon.canmove = 1
pmon.loc = src.loc
if(pmon.pokeball != src)
visible_message("<span class='warning'>[pmon] breaks free from [src]</span>")
PoolOrNew(/obj/effect/particle_effect/sparks, loc)
playsound(src.loc, "sparks", 50, 1)
qdel(src)
else
/obj/item/pokeball/proc/recall
/obj/item/pokeball/proc/release
*/
/mob/living/simple_animal/pokemon
name = "eevee"
icon_state = "eevee"
icon_living = "eevee"
icon_dead = "eevee_d"
desc = "Gotta catch 'em all!"
icon = 'icons/mob/pokemon.dmi'
var/pokeball
pixel_x = -16
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5)
ventcrawler = 2
health = 100
maxHealth = 100
layer = 4
response_help = "pets"
wander = 1
turns_per_move = 2
pass_flags = PASSTABLE | PASSMOB
/mob/living/simple_animal/pokemon/proc/simple_lay_down()
set name = "Rest"
set category = "IC"
resting = !resting
src << "<span class='notice'>You are now [resting ? "resting" : "getting up"].</span>"
update_canmove()
update_icon()
/mob/living/simple_animal/pokemon/proc/update_icon()
if(lying || resting || sleeping)
icon_state = "[icon_state]_rest"
else
icon_state = "[icon_living]"
/mob/living/simple_animal/pokemon/New()
..()
verbs += /mob/living/simple_animal/pokemon/proc/simple_lay_down
/*
/////TEMPLATE/////
/mob/living/simple_animal/pokemon/
name = ""
icon_state = ""
icon_living = ""
icon_dead = ""
*/
/mob/living/simple_animal/pokemon/leg
icon = 'icons/mob/legendary.dmi'
pixel_x = -32
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 12)
health = 200
maxHealth = 200
/mob/living/simple_animal/pokemon/leg/articuno
name = "Articuno"
icon_state = "articuno"
icon_living = "articuno"
icon_dead = "articuno_d"
flying = 1
/mob/living/simple_animal/pokemon/leg/rayquaza
name = "Rayquaza"
icon_state = "rayquaza"
icon_living = "rayquaza"
icon_dead = "rayquaza_d"
flying = 1
//ALPHABETICAL PLEASE
/mob/living/simple_animal/pokemon/absol
name = "absol"
icon_state = "absol"
icon_living = "absol"
icon_dead = "absol_d"
speak = list("Absol!", "Ab-Absol!")
/mob/living/simple_animal/pokemon/aggron
name = "aggron"
icon_state = "aggron"
icon_living = "aggron"
icon_dead = "aggron_d"
/mob/living/simple_animal/pokemon/ampharos
name = "ampharos"
icon_state = "ampharos"
icon_living = "ampharos"
icon_dead = "ampharos_d"
/mob/living/simple_animal/pokemon/charmander
name = "charmander"
icon_state = "charmander"
icon_living = "charmander"
icon_dead = "charmander_d"
/mob/living/simple_animal/pokemon/ditto
name = "ditto"
icon_state = "ditto"
icon_living = "ditto"
icon_dead = "ditto_d"
/mob/living/simple_animal/pokemon/dratini/dragonair
name = "dragonair"
desc = "A Dragonair stores an enormous amount of energy inside its body. It is said to alter the weather around it by loosing energy from the crystals on its neck and tail."
icon_state = "dragonair"
icon_living = "dragonair"
icon_dead = "dragonair_d"
/mob/living/simple_animal/pokemon/dratini/dragonair/dragonite
name = "dragonite"
desc = "It can circle the globe in just 16 hours. It is a kindhearted Pokémon that leads lost and foundering ships in a storm to the safety of land."
icon_state = "dragonite"
icon_living = "dragonite"
icon_dead = "dragonite_d"
/mob/living/simple_animal/pokemon/dratini
name = "dratini"
desc = "A Dratini continually molts and sloughs off its old skin. It does so because the life energy within its body steadily builds to reach uncontrollable levels."
icon_state = "dratini"
icon_living = "dratini"
icon_dead = "dratini_d"
/mob/living/simple_animal/pokemon/eevee
name = "eevee"
desc = "Eevee has an unstable genetic makeup that suddenly mutates due to its environment. Radiation from various stones causes this Pokémon to evolve."
icon_state = "eevee"
icon_living = "eevee"
icon_dead = "eevee_d"
speak = list("Eevee!", "Ee-Eevee!")
response_help = "pets"
response_harm = "hits"
/mob/living/simple_animal/pokemon/eevee/espeon
name = "espeon"
desc = "Espeon is extremely loyal to any trainer it considers to be worthy. It is said to have developed precognitive powers to protect its trainer from harm."
icon_state = "espeon"
icon_living = "espeon"
icon_dead = "espeon_d"
/mob/living/simple_animal/pokemon/flaaffy
name = "flaaffy"
icon_state = "flaaffy"
icon_living = "flaaffy"
icon_dead = "flaaffy_d"
/mob/living/simple_animal/pokemon/eevee/flareon
name = "flareon"
desc = "Flareon's fluffy fur releases heat into the air so that its body does not get excessively hot. Its body temperature can rise to a maximum of 1,650 degrees F."
icon_state = "flareon"
icon_living = "flareon"
icon_dead = "flareon_d"
speak = list("Flare!", "Flareon!")
/mob/living/simple_animal/pokemon/eevee/glaceon
name = "glaceon"
desc = "By controlling its body heat, it can freeze the atmosphere around it to make a diamond-dust flurry."
icon_state = "glaceon"
icon_living = "glaceon"
icon_dead = "glaceon_d"
speak = list("Glace!", "Glaceon!")
/mob/living/simple_animal/pokemon/eevee/jolteon
name = "jolteon"
desc = "Its cells generate weak power that is amplified by its fur's static electricity to drop thunderbolts. The bristling fur is made of electrically charged needles."
icon_state = "jolteon"
icon_living = "jolteon"
icon_dead = "jolteon_d"
speak = list("Jolt!", "Jolteon!")
/mob/living/simple_animal/pokemon/larvitar
name = "larvitar"
desc = "It is born deep underground. It can't emerge until it has entirely consumed the soil around it."
icon_state = "larvitar"
icon_living = "larvitar"
icon_dead = "larvitar_d"
/mob/living/simple_animal/pokemon/mareep
name = "mareep"
icon_state = "mareep"
icon_living = "mareep"
icon_dead = "mareep_d"
/mob/living/simple_animal/pokemon/poochyena/mightyena
name = "mightyena"
icon_state = "mightyena"
icon_living = "mightyena"
icon_dead = "mightyena"
/mob/living/simple_animal/pokemon/miltank
name = "miltank"
icon_state = "miltank"
icon_living = "miltank"
icon_dead = "miltank_d"
/mob/living/simple_animal/pokemon/poochyena
name = "poochyena"
icon_state = "poochyena"
icon_living = "poochyena"
icon_dead = "poochyena_d"
/mob/living/simple_animal/pokemon/eevee/sylveon
name = "Sylveon"
desc = "Sylveon, the Intertwining Pokémon. Sylveon affectionately wraps its ribbon-like feelers around its Trainer's arm as they walk together."
icon_state = "sylveon"
icon_living = "sylveon"
icon_dead = "sylveon_d"
speak = list("Sylveon!", "Syl!")
response_help = "pets"
response_harm = "hits"
/mob/living/simple_animal/pokemon/eevee/umbreon
name = "umbreon"
icon_state = "umbreon"
icon_dead = "umbreon_d"
icon_living = "umbreon"
/mob/living/simple_animal/pokemon/vulpix
name = "vulpix"
icon_state = "vulpix"
icon_living = "vulpix"
icon_dead = "vulpix_d"
@@ -81,9 +81,19 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
SM.real_name = M.real_name
M.dna.transfer_identity(SM)
SM.updateappearance(mutcolor_update=1)
var/mob/dead/observer/C = pick(candies)
message_admins("Ghost candidate found! [C] key [C.key] is becoming a clone of [M] key: [M.key] (They agreed to respect the character they're becoming, and agreed to not ERP without express permission from the original.)")
SM.key = C.key
candies = shuffle(candies)//Shake those ghosts up!
for(var/mob/dead/observer/C2 in candies)
if(C2.key && C2)
SM.key = C2.key
message_admins("Ghost candidate found! [C2] key [C2.key] is becoming a clone of [M] key: [M.key] (They agreed to respect the character they're becoming, and agreed to not ERP without express permission from the original.)")
log_game("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [C2]")
break
else
candies =- C2
if(!SM.mind) //Something went wrong, use alt mechanics
return ..()
SM.mind.enslave_mind_to_creator(M)
//If they're a zombie, they can try to negate it with this.
@@ -6,58 +6,17 @@
id = "fermi"
taste_description = "affection and love!"
can_synth = FALSE
SplitChem = TRUE
//This should process fermichems to find out how pure they are and what effect to do.
/datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount)
. = ..()
if(!M)
return
if(purity < 0)
CRASH("Purity below 0 for chem: [id], Please let Fermis Know!")
if (purity == 1 || DoNotSplit == TRUE)
log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [id]")
return
else if (InverseChemVal > purity)//Turns all of a added reagent into the inverse chem
M.reagents.remove_reagent(id, amount, FALSE)
M.reagents.add_reagent(InverseChem, amount, FALSE, other_purity = 1)
log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [InverseChem]")
return
else
var/impureVol = amount * (1 - purity) //turns impure ratio into impure chem
M.reagents.remove_reagent(id, (impureVol), FALSE)
M.reagents.add_reagent(ImpureChem, impureVol, FALSE, other_purity = 1)
log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume - impureVol]u of [id]")
log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [ImpureChem]")
return
//When merging two fermichems, see above
/datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging
. = ..()
if(!ishuman(M))
return
if (purity < 0)
CRASH("Purity below 0 for chem: [id], Please let Fermis Know!")
if (purity == 1 || DoNotSplit == TRUE)
log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [id] in themselves")
return
else if (InverseChemVal > purity)
M.reagents.remove_reagent(id, amount, FALSE)
M.reagents.add_reagent(InverseChem, amount, FALSE, other_purity = 1)
for(var/datum/reagent/fermi/R in M.reagents.reagent_list)
if(R.name == "")
R.name = name//Negative effects are hidden
log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [InverseChem]")
return
else
var/impureVol = amount * (1 - purity)
M.reagents.remove_reagent(id, impureVol, FALSE)
M.reagents.add_reagent(ImpureChem, impureVol, FALSE, other_purity = 1)
for(var/datum/reagent/fermi/R in M.reagents.reagent_list)
if(R.name == "")
R.name = name//Negative effects are hidden
log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume - impureVol]u of [id]")
log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [ImpureChem]")
return
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -372,6 +331,8 @@
//Consumes self on addition and shifts pH
/datum/reagent/fermi/acidic_buffer/on_new(datapH)
if(holder.has_reagent("stabilizing_agent"))
return ..()
data = datapH
if(LAZYLEN(holder.reagent_list) == 1)
return
@@ -392,6 +353,8 @@
can_synth = TRUE
/datum/reagent/fermi/basic_buffer/on_new(datapH)
if(holder.has_reagent("stabilizing_agent"))
return ..()
data = datapH
if(LAZYLEN(holder.reagent_list) == 1)
return
@@ -2,15 +2,15 @@
mix_sound = 'sound/effects/bubbles.ogg'
//Called for every reaction step
/datum/chemical_reaction/fermi/proc/FermiCreate(holder)
/datum/chemical_reaction/proc/FermiCreate(holder)
return
//Called when reaction STOP_PROCESSING
/datum/chemical_reaction/fermi/proc/FermiFinish(datum/reagents/holder)
/datum/chemical_reaction/proc/FermiFinish(datum/reagents/holder)
return
//Called when temperature is above a certain threshold, or if purity is too low.
/datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE)
/datum/chemical_reaction/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE)
if (Exploding == TRUE)
return
@@ -24,26 +24,32 @@
if (500 to 750)
for(var/turf/turf in range(1,T))
new /obj/effect/hotspot(turf)
volume*=1.1
if (751 to 1100)
for(var/turf/turf in range(2,T))
new /obj/effect/hotspot(turf)
volume*=1.2
if (1101 to 1500) //If you're crafty
for(var/turf/turf in range(3,T))
new /obj/effect/hotspot(turf)
volume*=1.3
if (1501 to 2500) //requested
for(var/turf/turf in range(4,T))
new /obj/effect/hotspot(turf)
volume*=1.4
if (2501 to 5000)
for(var/turf/turf in range(5,T))
new /obj/effect/hotspot(turf)
volume*=1.5
if (5001 to INFINITY)
for(var/turf/turf in range(6,T))
new /obj/effect/hotspot(turf)
volume*=1.6
message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].")
@@ -66,7 +72,7 @@
if (pH > 10) //if alkaline, small explosion.
var/datum/effect_system/reagents_explosion/e = new()
e.set_up(round((volume/30)*(pH-9)), T, 0, 0)
e.set_up(round((volume/28)*(pH-9)), T, 0, 0)
e.start()
if(!ImpureTot == 0) //If impure, v.small emp (0.6 or less)
@@ -101,10 +107,10 @@
PurityMin = 0.4 //The minimum purity something has to be above, otherwise it explodes.
/datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does.
if(!locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list)
var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list
if(!E)
return
var/turf/open/location = get_turf(my_atom)
var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list
if(location)
E.location_created = location
E.data.["location_created"] = location
@@ -137,12 +143,16 @@
/datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma!
var/turf/T = get_turf(my_atom)
var/mob/living/simple_animal/slime/S = new(T,"green")
S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
S.name = "Living teratoma"
S.real_name = "Living teratoma"
S.rabid = 1//Make them an angery boi
S.color = "#810010"
var/amount_to_spawn = round((volume/100), 1)
if(amount_to_spawn <= 0)
amount_to_spawn = 1
for(var/i in 1 to amount_to_spawn)
var/mob/living/simple_animal/slime/S = new(T,"green")
S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
S.name = "Living teratoma"
S.real_name = "Living teratoma"
S.rabid = 1//Make them an angery boi
S.color = "#810010"
my_atom.reagents.clear_reagents()
var/list/seen = viewers(8, get_turf(my_atom))
for(var/mob/M in seen)
@@ -353,11 +363,15 @@
PurityMin = 0.5
/datum/chemical_reaction/fermi/hatmium/FermiExplode(src, var/atom/my_atom, volume, temp, pH)
var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom))
hat.animate_atom_living()
var/amount_to_spawn = round((volume/100), 1)
if(amount_to_spawn <= 0)
amount_to_spawn = 1
for(var/i in 1 to amount_to_spawn)
var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom))
hat.animate_atom_living()
var/list/seen = viewers(8, get_turf(my_atom))
for(var/mob/M in seen)
to_chat(M, "<span class='warning'>The makes an off sounding pop, as a hat suddenly climbs out of the beaker!</b></span>")
to_chat(M, "<span class='warning'>The [my_atom] makes an off sounding pop, as a hat suddenly climbs out of it!</b></span>")
my_atom.reagents.clear_reagents()
/datum/chemical_reaction/fermi/furranium
@@ -382,6 +396,9 @@
FermiChem = TRUE
PurityMin = 0.3
/datum/chemical_reaction/fermi/furranium/organic
required_reagents = list("aphro" = 0.1, "catnip" = 0.1, "silver" = 0.2, "salglu_solution" = 0.1)
//FOR INSTANT REACTIONS - DO NOT MULTIPLY LIMIT BY 10.
//There's a weird rounding error or something ugh.
@@ -1,36 +0,0 @@
/datum/techweb_node/bluespace_basic/New()
. = ..()
design_ids += "xenobio_monkeys"
/datum/techweb_node/practical_bluespace/New()
. = ..()
design_ids += "xenobio_slimebasic"
/datum/techweb_node/adv_bluespace/New()
. = ..()
design_ids += "xenobio_slimeadv"
/datum/techweb_node/ballistic_weapons/New()
. = ..()
design_ids += "mag_oldsmg_rubber"
/datum/techweb_node/computer_board_gaming
id = "computer_board_gaming"
display_name = "Games and Toys"
description = "For the slackers on the station."
prereq_ids = list("comptech")
design_ids = list("arcade_battle", "arcade_orion", "arcade_minesweeper", "slotmachine", "autoylathe")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
export_price = 5000
/datum/techweb_node/ballistic_weapons
design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_tx")
/datum/techweb_node/advanced_illegl_ballistics
id = "advanced_illegal_ballistics"
display_name = "Advanced Illegal Ballistics"
description = "Advanced Ballistic for Illegal weaponds."
design_ids = list("10mm","10mmap","10mminc","10mmhp","pistolm9mm","m45","bolt_clip")
prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns form traitors or space.
export_price = 7000
@@ -1,33 +0,0 @@
/datum/techweb_node/bluespace_basic/New()
. = ..()
design_ids += "xenobio_monkeys"
/datum/techweb_node/practical_bluespace/New()
. = ..()
design_ids += "xenobio_slimebasic"
/datum/techweb_node/adv_bluespace/New()
. = ..()
design_ids += "xenobio_slimeadv"
/datum/techweb_node/ballistic_weapons/New()
. = ..()
design_ids += "mag_oldsmg_rubber"
/datum/techweb_node/computer_board_gaming
id = "computer_board_gaming"
display_name = "Games and Toys"
description = "For the slackers on the station."
prereq_ids = list("comptech")
design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
export_price = 5000
/datum/techweb_node/advanced_illegl_ballistics
id = "advanced_illegal_ballistics"
display_name = "Advanced Illegal Ballistics
description = "Advanced Ballistic for Illegal weaponds."
design_ids = list("10mm","10mmap","10mminc","10mmhp","9mm","point_45","bolt_clip")
prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns form traitors or space.
export_price = 7000