Merge pull request #2603 from deathride58/crewobjectivesandmiscreants
Ports Goon's Crew Objectives (feat. objectives from old Hippie) and Miscreants
This commit is contained in:
@@ -93,6 +93,9 @@ GLOBAL_LIST_EMPTY(mentors)
|
||||
GLOBAL_VAR_INIT(looc_allowed, 1)
|
||||
GLOBAL_VAR_INIT(dlooc_allowed, 1)
|
||||
|
||||
//Crew objective and miscreants stuff
|
||||
GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
|
||||
|
||||
/client/proc/reload_mentors()
|
||||
set name = "Reload Mentors"
|
||||
set category = "Admin"
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
/datum/controller/subsystem/ticker/proc/generate_crew_objectives()
|
||||
for(var/datum/mind/crewMind in SSticker.minds)
|
||||
if(prob(2) && !issilicon(crewMind.current) && !jobban_isbanned(crewMind, "Syndicate") && GLOB.miscreants_allowed)
|
||||
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 = get_valid_crew_objs(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>Your objective:</B> [newObjective.explanation_text]")
|
||||
|
||||
/datum/controller/subsystem/ticker/proc/get_valid_crew_objs(var/job = "")//taken from old hippie with adjustments
|
||||
var/list/objpaths = typesof(/datum/objective/crew)
|
||||
var/list/objlist = list()
|
||||
for(var/hoorayhackyshit in objpaths)
|
||||
var/datum/objective/crew/obj = hoorayhackyshit //dm is not a sane language in any way, shape, or form.
|
||||
var/list/availableto = splittext(initial(obj.jobs),",")
|
||||
if(job in availableto)
|
||||
objlist += obj
|
||||
return objlist
|
||||
|
||||
/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()
|
||||
@@ -0,0 +1,61 @@
|
||||
/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(jobban_isbanned(crewMind, "Syndicate"))
|
||||
return
|
||||
var/list/objectiveTypes = typesof(/datum/objective/miscreant) - /datum/objective/miscreant
|
||||
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/blockade
|
||||
explanation_text = "Try to completely block off access to an area, under the pretense that it's too dangerous."
|
||||
|
||||
/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/stalk
|
||||
explanation_text = "Single out a crew member and stalk them everywhere."
|
||||
|
||||
/datum/objective/miscreant/creepy
|
||||
explanation_text = "Sneak around looking as suspicious as possible without actually doing anything illegal."
|
||||
|
||||
/datum/objective/miscreant/construction
|
||||
explanation_text = "Perform obnoxious construction and renovation projects. Insist that you're just doing your job."
|
||||
|
||||
/datum/objective/miscreant/access
|
||||
explanation_text = "Make as much of the station as possible accessible to the public."
|
||||
|
||||
/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 out of character as you possibly can."
|
||||
|
||||
/datum/objective/miscreant/racism
|
||||
explanation_text = "Attempt to establish superiority of your race."
|
||||
@@ -0,0 +1,81 @@
|
||||
/* 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 == ZLEVEL_STATION_PRIMARY || 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 == ZLEVEL_STATION_PRIMARY || 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
|
||||
@@ -0,0 +1,267 @@
|
||||
/* 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/changelingAdrenaline2)
|
||||
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.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.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 == ZLEVEL_STATION_PRIMARY || 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))
|
||||
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/device/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)
|
||||
if(owner.current.check_contents_for(typesof(/obj/item/nullrod)))
|
||||
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/departmentclothes
|
||||
var/obj/item/clothing/under/rank/targetuniform
|
||||
explanation_text = "Be wearing a (Yo, this objective broke. report this to citadels discord via the development channel) at the end of the shift."
|
||||
jobs = "assistant"
|
||||
|
||||
/datum/objective/crew/departmentclothes/New()
|
||||
. = ..()
|
||||
var/list/blacklist = list(/obj/item/clothing/under/rank, /obj/item/clothing/under/rank/miner, /obj/item/clothing/under/rank/medical/blue, /obj/item/clothing/under/rank/medical/green, /obj/item/clothing/under/rank/medical/purple, /obj/item/clothing/under/rank/security/grey, /obj/item/clothing/under/rank/warden/grey, /obj/item/clothing/under/rank/head_of_security/grey, /obj/item/clothing/under/rank/mailman, /obj/item/clothing/under/rank/psyche, /obj/item/clothing/under/rank/clown/sexy, /obj/item/clothing/under/rank/centcom_officer, /obj/item/clothing/under/rank/centcom_commander, /obj/item/clothing/under/rank/security/navyblue/russian, /obj/item/clothing/under/rank/security/blueshirt)
|
||||
var/list/validclothes = typesof(/obj/item/clothing/under/rank) - blacklist
|
||||
targetuniform = pick(validclothes)
|
||||
update_explanation_text()
|
||||
|
||||
/datum/objective/crew/departmentclothes/update_explanation_text()
|
||||
. = ..()
|
||||
explanation_text = "Be wearing a [initial(targetuniform.name)] at the end of the shift."
|
||||
|
||||
/datum/objective/crew/departmentclothes/check_completion()
|
||||
if(owner && owner.current)
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
if(istype(H.w_uniform, targetuniform))
|
||||
return TRUE
|
||||
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, /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.current && owner.current.check_contents_for(typesof(targettidegarb)))
|
||||
return TRUE
|
||||
else
|
||||
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
|
||||
@@ -0,0 +1,33 @@
|
||||
/* 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.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.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.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
|
||||
@@ -0,0 +1,34 @@
|
||||
/* 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/device/radio/headset))
|
||||
return TRUE
|
||||
return FALSE
|
||||
@@ -0,0 +1,86 @@
|
||||
/* 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 == ZLEVEL_STATION_PRIMARY)
|
||||
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/changelingAdrenaline2)
|
||||
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 = "Ensure no living crew members are infected with harmful viruses 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 == ZLEVEL_STATION_PRIMARY || SSshuttle.emergency.shuttle_areas[get_area(H)])
|
||||
if(H.check_virus() == 2)
|
||||
return FALSE
|
||||
return TRUE
|
||||
@@ -0,0 +1,45 @@
|
||||
/* 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.living_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/r_n_d/server/S in GLOB.machines)
|
||||
if(S && S.files && S.files.known_designs)
|
||||
if(targetdesign in S.files.known_designs)
|
||||
return TRUE
|
||||
return FALSE
|
||||
@@ -0,0 +1,33 @@
|
||||
/* SECURITY OBJECTIVES */
|
||||
|
||||
/datum/objective/crew/enjoyyourstay
|
||||
explanation_text = "Welcome to Space Station 13. Enjoy your stay."
|
||||
jobs = "headofsecurity,securityofficer,warden,detective"
|
||||
var/list/edglines = list("Welcome to Space Station 13. Enjoy your stay.", "You signed up for this.", "Abandon hope.", "The tide's gonna stop eventually.", "Hey, someone's gotta do it.", "No, you can't resign.", "Security is a mission, not an intermission.")
|
||||
|
||||
/datum/objective/crew/enjoyyourstay/New()
|
||||
. = ..()
|
||||
update_explanation_text()
|
||||
|
||||
/datum/objective/crew/enjoyyourstay/update_explanation_text()
|
||||
. = ..()
|
||||
explanation_text = pick(edglines)
|
||||
|
||||
/datum/objective/crew/enjoyyourstay/check_completion()
|
||||
explanation_text = "Enforce Space Law to the best of your ability."
|
||||
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
|
||||
@@ -256,6 +256,10 @@ CONFIG_DEF(number/bombcap)
|
||||
value = 14
|
||||
min_val = 4
|
||||
|
||||
CONFIG_DEF(flag/allow_crew_objectives)
|
||||
CONFIG_DEF(flag/allow_miscreants)
|
||||
CONFIG_DEF(flag/allow_extended_miscreants)
|
||||
|
||||
/datum/config_entry/number/bombcap/ValidateAndSet(str_val)
|
||||
. = ..()
|
||||
if(.)
|
||||
|
||||
@@ -258,6 +258,13 @@ SUBSYSTEM_DEF(ticker)
|
||||
//Deleting Startpoints but we need the ai point to AI-ize people later
|
||||
if(S.name != "AI")
|
||||
qdel(S)
|
||||
|
||||
//assign crew objectives and generate miscreants
|
||||
if(CONFIG_GET(flag/allow_extended_miscreants) && GLOB.master_mode == "extended")
|
||||
GLOB.miscreants_allowed = TRUE
|
||||
if(CONFIG_GET(flag/allow_miscreants) && GLOB.master_mode != "extended")
|
||||
GLOB.miscreants_allowed = TRUE
|
||||
generate_crew_objectives()
|
||||
|
||||
var/list/adm = get_admin_counts()
|
||||
var/list/allmins = adm["present"]
|
||||
@@ -333,6 +340,8 @@ SUBSYSTEM_DEF(ticker)
|
||||
var/num_survivors = 0
|
||||
var/num_escapees = 0
|
||||
var/num_shuttle_escapees = 0
|
||||
var/list/successfulCrew = list()
|
||||
var/list/miscreants = list()
|
||||
|
||||
to_chat(world, "<BR><BR><BR><FONT size=3><B>The round has ended.</B></FONT>")
|
||||
if(LAZYLEN(GLOB.round_end_notifiees))
|
||||
@@ -459,6 +468,37 @@ SUBSYSTEM_DEF(ticker)
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
for(var/datum/mind/crewMind in minds)
|
||||
if(!crewMind.current || !crewMind.objectives.len)
|
||||
continue
|
||||
for(var/datum/objective/miscreant/MO in crewMind.objectives)
|
||||
miscreants += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>). <B>Objective</B>: [MO.explanation_text]"
|
||||
for(var/datum/objective/crew/CO in crewMind.objectives)
|
||||
if(CO.check_completion())
|
||||
to_chat(crewMind.current, "<br><B>Your objective</B>: [CO.explanation_text] <font color='green'><B>Success!</B></font>")
|
||||
successfulCrew += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>). <B>Objective</B>: [CO.explanation_text]"
|
||||
else
|
||||
to_chat(crewMind.current, "<br><B>Your objective</B>: [CO.explanation_text] <font color='red'><B>Failed.</B></font>")
|
||||
|
||||
if (successfulCrew.len)
|
||||
var/completedObjectives = "<B>The following crew members completed their Crew Objectives:</B><BR>"
|
||||
for(var/i in successfulCrew)
|
||||
completedObjectives += "[i]<BR>"
|
||||
to_chat(world, "[completedObjectives]<BR>")
|
||||
else
|
||||
if(CONFIG_GET(flag/allow_crew_objectives))
|
||||
to_chat(world, "<B>Nobody completed their Crew Objectives!</B><BR>")
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
if (miscreants.len)
|
||||
var/miscreantObjectives = "<B>The following crew members were miscreants:</B><BR>"
|
||||
for(var/i in miscreants)
|
||||
miscreantObjectives += "[i]<BR>"
|
||||
to_chat(world, "[miscreantObjectives]<BR>")
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
mode.declare_station_goal_completion()
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
@@ -245,13 +245,21 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w
|
||||
if(changeling.objectives.len)
|
||||
var/count = 1
|
||||
for(var/datum/objective/objective in changeling.objectives)
|
||||
if(objective.check_completion())
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='green'><b>Success!</b></font>"
|
||||
SSblackbox.add_details("changeling_objective","[objective.type]|SUCCESS")
|
||||
if(istype(objective, /datum/objective/crew))
|
||||
if(objective.check_completion())
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='green'><b>Success!</b></font> <font color='grey'>(Optional)</font>"
|
||||
SSblackbox.add_details("changeling_objective","[objective.type]|SUCCESS")
|
||||
else
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='danger'>Fail.</span> <font color='grey'>(Optional)</font>"
|
||||
SSblackbox.add_details("changeling_objective","[objective.type]|FAIL")
|
||||
else
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='danger'>Fail.</span>"
|
||||
SSblackbox.add_details("changeling_objective","[objective.type]|FAIL")
|
||||
changelingwin = 0
|
||||
if(objective.check_completion())
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='green'><b>Success!</b></font>"
|
||||
SSblackbox.add_details("changeling_objective","[objective.type]|SUCCESS")
|
||||
else
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='danger'>Fail.</span>"
|
||||
SSblackbox.add_details("changeling_objective","[objective.type]|FAIL")
|
||||
changelingwin = 0
|
||||
count++
|
||||
|
||||
if(changelingwin)
|
||||
@@ -520,4 +528,3 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w
|
||||
var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING]
|
||||
hud.leave_hud(changling_mind.current)
|
||||
set_antag_hud(changling_mind.current, null)
|
||||
|
||||
|
||||
@@ -111,13 +111,21 @@
|
||||
if(traitor.objectives.len)//If the traitor had no objectives, don't need to process this.
|
||||
var/count = 1
|
||||
for(var/datum/objective/objective in traitor.objectives)
|
||||
if(objective.check_completion())
|
||||
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
|
||||
SSblackbox.add_details("traitor_objective","[objective.type]|SUCCESS")
|
||||
if(istype(objective, /datum/objective/crew))
|
||||
if(objective.check_completion())
|
||||
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font> <font color='grey'>(Optional)</font>"
|
||||
SSblackbox.add_details("traitor_objective","[objective.type]|SUCCESS")
|
||||
else
|
||||
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font> <font color='grey'>(Optional)</font>"
|
||||
SSblackbox.add_details("traitor_objective","[objective.type]|FAIL")
|
||||
else
|
||||
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
|
||||
SSblackbox.add_details("traitor_objective","[objective.type]|FAIL")
|
||||
traitorwin = 0
|
||||
if(objective.check_completion())
|
||||
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
|
||||
SSblackbox.add_details("traitor_objective","[objective.type]|SUCCESS")
|
||||
else
|
||||
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
|
||||
SSblackbox.add_details("traitor_objective","[objective.type]|FAIL")
|
||||
traitorwin = 0
|
||||
count++
|
||||
|
||||
if(uplink_true)
|
||||
|
||||
@@ -212,13 +212,21 @@
|
||||
var/count = 1
|
||||
var/wizardwin = 1
|
||||
for(var/datum/objective/objective in wizard.objectives)
|
||||
if(objective.check_completion())
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
|
||||
SSblackbox.add_details("wizard_objective","[objective.type]|SUCCESS")
|
||||
if(istype(objective, /datum/objective/crew))
|
||||
if(objective.check_completion())
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font> <font color='grey'>(Optional)</font>"
|
||||
SSblackbox.add_details("wizard_objective","[objective.type]|SUCCESS")
|
||||
else
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font> <font color='grey'>(Optional)</font>"
|
||||
SSblackbox.add_details("wizard_objective","[objective.type]|FAIL")
|
||||
else
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
|
||||
SSblackbox.add_details("wizard_objective","[objective.type]|FAIL")
|
||||
wizardwin = 0
|
||||
if(objective.check_completion())
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
|
||||
SSblackbox.add_details("wizard_objective","[objective.type]|SUCCESS")
|
||||
else
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
|
||||
SSblackbox.add_details("wizard_objective","[objective.type]|FAIL")
|
||||
wizardwin = 0
|
||||
count++
|
||||
|
||||
if(wizard.current && wizard.current.stat!=2 && wizardwin)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
icon_state = "pda-clown"
|
||||
desc = "A portable microcomputer by Thinktronic Systems, LTD. The surface is coated with polytetrafluoroethylene and banana drippings."
|
||||
ttone = "honk"
|
||||
var/slipvictims = list()
|
||||
|
||||
/obj/item/device/pda/clown/Initialize()
|
||||
. = ..()
|
||||
@@ -18,6 +19,7 @@
|
||||
return
|
||||
var/mob/living/carbon/human/M = S.slip_victim
|
||||
if (istype(M) && (M.real_name != src.owner))
|
||||
slipvictims |= M
|
||||
var/obj/item/cartridge/virus/clown/cart = cartridge
|
||||
if(istype(cart) && cart.charges < 5)
|
||||
cart.charges++
|
||||
|
||||
@@ -375,6 +375,11 @@
|
||||
if(GLOB.highlander)
|
||||
to_chat(humanc, "<span class='userdanger'><i>THERE CAN BE ONLY ONE!!!</i></span>")
|
||||
humanc.make_scottish()
|
||||
if(prob(2) && !issilicon(humanc) && !jobban_isbanned(humanc.mind, "Syndicate") && GLOB.miscreants_allowed)
|
||||
SSticker.generate_miscreant_objectives(humanc.mind)
|
||||
else
|
||||
if(CONFIG_GET(flag/allow_crew_objectives))
|
||||
SSticker.generate_individual_objectives(humanc.mind)
|
||||
|
||||
GLOB.joined_player_list += character.ckey
|
||||
GLOB.latejoiners += character
|
||||
|
||||
Reference in New Issue
Block a user