Files
CHOMPStation2/code/game/gamemodes/objective.dm
CHOMPStation2StaffMirrorBot ed79946ade [MIRROR] some istype to macros (#9802)
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2025-01-05 23:01:49 +01:00

906 lines
28 KiB
Plaintext

//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
var/global/list/all_objectives = list()
/datum/objective
var/datum/mind/owner = null //Who owns the objective.
var/explanation_text = "Nothing" //What that person is supposed to do.
var/datum/mind/target = null //If they are focused on a particular person.
var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter.
var/completed = 0 //currently only used for custom objectives.
/datum/objective/New(var/text)
all_objectives |= src
if(text)
explanation_text = text
..()
/datum/objective/Destroy()
all_objectives -= src
..()
/datum/objective/proc/check_completion()
return completed
/datum/objective/proc/find_target()
var/list/possible_targets = list()
for(var/datum/mind/possible_target in ticker.minds)
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2))
possible_targets += possible_target
if(possible_targets.len > 0)
target = pick(possible_targets)
/datum/objective/proc/find_target_by_role(role, role_type=0)//Option sets either to check assigned role or special role. Default to assigned.
for(var/datum/mind/possible_target in ticker.minds)
if((possible_target != owner) && ishuman(possible_target.current) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role) )
target = possible_target
break
/datum/objective/assassinate/find_target()
..()
if(target && target.current)
explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]."
else
explanation_text = "Free Objective"
return target
/datum/objective/assassinate/find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Assassinate [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]."
else
explanation_text = "Free Objective"
return target
/datum/objective/assassinate/check_completion()
if(target && target.current)
if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
return 1
return 0
return 1
/datum/objective/anti_revolution/execute/find_target()
..()
if(target && target.current)
var/datum/gender/T = gender_datums[target.current.get_visible_gender()]
explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute [T.him]."
else
explanation_text = "Free Objective"
return target
/datum/objective/anti_revolution/execute/find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
var/datum/gender/T = gender_datums[target.current.get_visible_gender()]
explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has extracted confidential information above their clearance. Execute [T.him]."
else
explanation_text = "Free Objective"
return target
/datum/objective/anti_revolution/execute/check_completion()
if(target && target.current)
if(target.current.stat == DEAD || !ishuman(target.current))
return 1
return 0
return 1
/datum/objective/anti_revolution/brig
var/already_completed = 0
/datum/objective/anti_revolution/brig/find_target()
..()
if(target && target.current)
explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example."
else
explanation_text = "Free Objective"
return target
/datum/objective/anti_revolution/brig/find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Brig [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] for 20 minutes to set an example."
else
explanation_text = "Free Objective"
return target
/datum/objective/anti_revolution/brig/check_completion()
if(already_completed)
return 1
if(target && target.current)
if(target.current.stat == DEAD)
return 0
if(target.is_brigged(10 * 60 * 10))
already_completed = 1
return 1
return 0
return 0
/datum/objective/anti_revolution/demote/find_target()
..()
if(target && target.current)
var/datum/gender/T = gender_datums[target.current.get_visible_gender()]
explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to [using_map.company_name]'s goals. Demote [T.him] to assistant."
else
explanation_text = "Free Objective"
return target
/datum/objective/anti_revolution/demote/find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
var/datum/gender/T = gender_datums[target.current.get_visible_gender()]
explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to [using_map.company_name]'s goals. Demote [T.him] to assistant."
else
explanation_text = "Free Objective"
return target
/datum/objective/anti_revolution/demote/check_completion()
if(target && target.current && ishuman(target))
var/obj/item/card/id/I = target.current:wear_id
if(istype(I, /obj/item/pda))
var/obj/item/pda/P = I
I = P.id
if(!istype(I)) return 1
if(I.assignment == JOB_ALT_VISITOR) //VOREStation Edit - Visitor not Assistant
return 1
else
return 0
return 1
//I want braaaainssss
/datum/objective/debrain/find_target()
..()
if(target && target.current)
explanation_text = "Steal the brain of [target.current.real_name]."
else
explanation_text = "Free Objective"
return target
/datum/objective/debrain/find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Steal the brain of [target.current.real_name] the [!role_type ? target.assigned_role : target.special_role]."
else
explanation_text = "Free Objective"
return target
/datum/objective/debrain/check_completion()
if(!target)//If it's a free objective.
return 1
if( !owner.current || owner.current.stat==DEAD )//If you're otherwise dead.
return 0
if( !target.current || !isbrain(target.current) )
return 0
var/atom/A = target.current
while(A.loc) //check to see if the brainmob is on our person
A = A.loc
if(A == owner.current)
return 1
return 0
//The opposite of killing a dude.
/datum/objective/protect/find_target()
..()
if(target && target.current)
explanation_text = "Protect [target.current.real_name], the [target.assigned_role]."
else
explanation_text = "Free Objective"
return target
/datum/objective/protect/find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Protect [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]."
else
explanation_text = "Free Objective"
return target
/datum/objective/protect/check_completion()
if(!target) //If it's a free objective.
return 1
if(target.current)
if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current))
return 0
return 1
return 0
/datum/objective/hijack
explanation_text = "Hijack the emergency shuttle by escaping alone."
/datum/objective/hijack/check_completion()
if(!owner.current || owner.current.stat)
return 0
if(!emergency_shuttle.returned())
return 0
if(issilicon(owner.current))
return 0
var/area/shuttle = locate(/area/shuttle/escape/centcom)
var/list/protected_mobs = list(/mob/living/silicon/ai, /mob/living/silicon/pai)
for(var/mob/living/player in player_list)
if(player.type in protected_mobs) continue
if (player.mind && (player.mind != owner))
if(player.stat != DEAD) //they're not dead!
if(get_turf(player) in shuttle)
return 0
return 1
/datum/objective/block
explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive."
/datum/objective/block/check_completion()
if(!istype(owner.current, /mob/living/silicon))
return 0
if(!emergency_shuttle.returned())
return 0
if(!owner.current)
return 0
var/area/shuttle = locate(/area/shuttle/escape/centcom)
var/protected_mobs[] = list(/mob/living/silicon/ai, /mob/living/silicon/pai, /mob/living/silicon/robot)
for(var/mob/living/player in player_list)
if(player.type in protected_mobs) continue
if (player.mind)
if (player.stat != 2)
if (get_turf(player) in shuttle)
return 0
return 1
/datum/objective/silence
explanation_text = "Do not allow anyone to escape the station. Only allow the shuttle to be called when everyone is dead and your story is the only one left."
/datum/objective/silence/check_completion()
if(!emergency_shuttle.returned())
return 0
for(var/mob/living/player in player_list)
if(player == owner.current)
continue
if(player.mind)
if(player.stat != DEAD)
var/turf/T = get_turf(player)
if(!T) continue
switch(T.loc.type)
if(/area/shuttle/escape/centcom, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom)
return 0
return 1
/datum/objective/escape
explanation_text = "Escape on the shuttle or an escape pod alive and free."
/datum/objective/escape/check_completion()
if(issilicon(owner.current))
return 0
if(isbrain(owner.current))
return 0
if(!emergency_shuttle.returned())
return 0
if(!owner.current || owner.current.stat ==2)
return 0
var/turf/location = get_turf(owner.current.loc)
if(!location)
return 0
if(istype(location, /turf/simulated/shuttle/floor4)) // Fails traitors if they are in the shuttle brig -- Polymorph
if(istype(owner.current, /mob/living/carbon))
var/mob/living/carbon/C = owner.current
if (!C.handcuffed)
return 1
return 0
var/area/check_area = location.loc
if(istype(check_area, /area/shuttle/escape/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod1/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod2/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod3/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod5/centcom))
return 1
else
return 0
/datum/objective/survive
explanation_text = "Stay alive until the end."
/datum/objective/survive/check_completion()
if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current))
return 0 //Brains no longer win survive objectives. --NEO
if(issilicon(owner.current) && owner.current != owner.original)
return 0
return 1
// Similar to the anti-rev objective, but for traitors
/datum/objective/brig
var/already_completed = 0
/datum/objective/brig/find_target()
..()
if(target && target.current)
explanation_text = "Have [target.current.real_name], the [target.assigned_role] brigged for 10 minutes."
else
explanation_text = "Free Objective"
return target
/datum/objective/brig/find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Have [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] brigged for 10 minutes."
else
explanation_text = "Free Objective"
return target
/datum/objective/brig/check_completion()
if(already_completed)
return 1
if(target && target.current)
if(target.current.stat == DEAD)
return 0
// Make the actual required time a bit shorter than the official time
if(target.is_brigged(10 * 60 * 5))
already_completed = 1
return 1
return 0
return 0
// Harm a crew member, making an example of them
/datum/objective/harm
var/already_completed = 0
/datum/objective/harm/find_target()
..()
if(target && target.current)
explanation_text = "Make an example of [target.current.real_name], the [target.assigned_role]. Break one of their bones, detach one of their limbs or disfigure their face. Make sure they're alive when you do it."
else
explanation_text = "Free Objective"
return target
/datum/objective/harm/find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Make an example of [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]. Break one of their bones, detach one of their limbs or disfigure their face. Make sure they're alive when you do it."
else
explanation_text = "Free Objective"
return target
/datum/objective/harm/check_completion()
if(already_completed)
return 1
if(target && target.current && ishuman(target.current))
if(target.current.stat == DEAD)
return 0
var/mob/living/carbon/human/H = target.current
for(var/obj/item/organ/external/E in H.organs)
if(E.status & ORGAN_BROKEN)
return 1
for(var/limb_tag in H.species.has_limbs) //todo check prefs for robotic limbs and amputations.
var/list/organ_data = H.species.has_limbs[limb_tag]
var/limb_type = organ_data["path"]
var/found
for(var/obj/item/organ/external/E in H.organs)
if(limb_type == E.type)
found = 1
break
if(!found)
return 1
var/obj/item/organ/external/head/head = H.get_organ(BP_HEAD)
if(head.disfigured)
return 1
return 0
/datum/objective/nuclear
explanation_text = "Destroy the station with a nuclear device."
/datum/objective/steal
var/obj/item/steal_target
var/target_name
var/global/possible_items[] = list(
"the Site Manager's antique laser gun" = /obj/item/gun/energy/captain,
"a hand teleporter" = /obj/item/hand_tele,
"an RCD" = /obj/item/rcd,
"a jetpack" = /obj/item/tank/jetpack,
"a site manager's jumpsuit" = /obj/item/clothing/under/rank/captain,
"a functional AI" = /obj/item/aicard,
"a pair of magboots" = /obj/item/clothing/shoes/magboots,
"the station blueprints" = /obj/item/areaeditor/blueprints,
"a nasa voidsuit" = /obj/item/clothing/suit/space/void,
"28 moles of phoron (full tank)" = /obj/item/tank,
"a sample of slime extract" = /obj/item/slime_extract,
"a piece of corgi meat" = /obj/item/reagent_containers/food/snacks/meat/corgi,
"a research director's jumpsuit" = /obj/item/clothing/under/rank/research_director,
"a chief engineer's jumpsuit" = /obj/item/clothing/under/rank/chief_engineer,
"a chief medical officer's jumpsuit" = /obj/item/clothing/under/rank/chief_medical_officer,
"a head of security's jumpsuit" = /obj/item/clothing/under/rank/head_of_security,
"a head of personnel's jumpsuit" = /obj/item/clothing/under/rank/head_of_personnel,
"the hypospray" = /obj/item/reagent_containers/hypospray/vial,
"the site manager's pinpointer" = /obj/item/pinpointer,
"an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof,
)
var/global/possible_items_special[] = list(
/*"nuclear authentication disk" = /obj/item/disk/nuclear,*///Broken with the change to nuke disk making it respawn on z level change.
"nuclear gun" = /obj/item/gun/energy/gun/nuclear,
"diamond drill" = /obj/item/pickaxe/diamonddrill,
"bag of holding" = /obj/item/storage/backpack/holding,
"hyper-capacity cell" = /obj/item/cell/hyper,
"10 diamonds" = /obj/item/stack/material/diamond,
"50 gold bars" = /obj/item/stack/material/gold,
"25 refined uranium bars" = /obj/item/stack/material/uranium,
)
/datum/objective/steal/proc/set_target(item_name)
target_name = item_name
steal_target = possible_items[target_name]
if (!steal_target )
steal_target = possible_items_special[target_name]
explanation_text = "Steal [target_name]."
return steal_target
/datum/objective/steal/find_target()
return set_target(pick(possible_items))
/datum/objective/steal/proc/select_target()
var/list/possible_items_all = possible_items+possible_items_special+"custom"
var/new_target = tgui_input_list(usr, "Select target:", "Objective target", possible_items_all)
if (!new_target) return
if (new_target == "custom")
var/obj/item/custom_target = tgui_input_list(usr, "Select type:", "Type", typesof(/obj/item))
if (!custom_target) return
var/tmp_obj = new custom_target
var/custom_name = tmp_obj:name
qdel(tmp_obj)
custom_name = sanitize(tgui_input_text(usr, "Enter target name:", "Objective target", custom_name))
if (!custom_name) return
target_name = custom_name
steal_target = custom_target
explanation_text = "Steal [target_name]."
else
set_target(new_target)
return steal_target
/datum/objective/steal/check_completion()
if(!steal_target || !owner.current) return 0
if(!isliving(owner.current)) return 0
var/list/all_items = owner.current.get_contents()
switch (target_name)
if("28 moles of phoron (full tank)","10 diamonds","50 gold bars","25 refined uranium bars")
var/target_amount = text2num(target_name)//Non-numbers are ignored.
var/found_amount = 0.0//Always starts as zero.
for(var/obj/item/I in all_items) //Check for phoron tanks
if(istype(I, steal_target))
found_amount += (target_name=="28 moles of phoron (full tank)" ? (I:air_contents:gas[GAS_PHORON]) : (I:amount))
return found_amount>=target_amount
if("50 coins (in bag)")
var/obj/item/moneybag/B = locate() in all_items
if(B)
var/target = text2num(target_name)
var/found_amount = 0.0
for(var/obj/item/coin/C in B)
found_amount++
return found_amount>=target
if("a functional AI")
for(var/obj/item/aicard/C in all_items) //Check for ai card
for(var/mob/living/silicon/ai/M in C)
if(isAI(M) && M.stat != 2) //See if any AI's are alive inside that card.
return 1
for(var/mob/living/silicon/ai/ai in mob_list)
var/turf/T = get_turf(ai)
if(istype(T))
var/area/check_area = get_area(ai)
if(istype(check_area, /area/shuttle/escape/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod1/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod2/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod3/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod5/centcom))
return 1
else
for(var/obj/I in all_items) //Check for items
if(istype(I, steal_target))
return 1
return 0
/datum/objective/download/proc/gen_amount_goal()
target_amount = rand(10,20)
explanation_text = "Download [target_amount] research levels."
return target_amount
/datum/objective/download/check_completion()
if(!ishuman(owner.current))
return 0
if(!owner.current || owner.current.stat == 2)
return 0
var/current_amount
var/obj/item/rig/S
if(ishuman(owner.current))
var/mob/living/carbon/human/H = owner.current
S = H.back
if(!istype(S) || !S.installed_modules || !S.installed_modules.len)
return 0
var/obj/item/rig_module/datajack/stolen_data = locate() in S.installed_modules
if(!istype(stolen_data))
return 0
for(var/datum/tech/current_data in stolen_data.stored_research)
if(current_data.level > 1)
current_amount += (current_data.level-1)
return (current_amount<target_amount) ? 0 : 1
/datum/objective/capture/proc/gen_amount_goal()
target_amount = rand(5,10)
explanation_text = "Accumulate [target_amount] capture points."
return target_amount
/datum/objective/capture/check_completion()//Basically runs through all the mobs in the area to determine how much they are worth.
var/captured_amount = 0
var/area/centcom/holding/A = locate()
for(var/mob/living/carbon/human/M in A) // Humans (and subtypes).
var/worth = M.species.rarity_value
if(M.stat==2)//Dead folks are worth less.
worth*=0.5
continue
captured_amount += worth
for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research.
if(M.stat==2)
captured_amount+=0.5
continue
captured_amount+=1
if(captured_amount<target_amount)
return 0
return 1
/datum/objective/absorb/proc/gen_amount_goal(var/lowbound = 4, var/highbound = 6)
target_amount = rand (lowbound,highbound)
if (ticker)
var/n_p = 1 //autowin
if (ticker.current_state == GAME_STATE_SETTING_UP)
for(var/mob/new_player/P in player_list)
if(P.client && P.ready && P.mind!=owner)
n_p ++
else if (ticker.current_state == GAME_STATE_PLAYING)
for(var/mob/living/carbon/human/P in player_list)
if(P.client && !(P.mind.changeling) && P.mind!=owner)
n_p ++
target_amount = min(target_amount, n_p)
explanation_text = "Absorb [target_amount] compatible genomes."
return target_amount
/datum/objective/absorb/check_completion()
if(owner && owner.changeling && owner.changeling.absorbed_dna && (owner.changeling.absorbedcount >= target_amount))
return 1
else
return 0
/datum/objective/vore/check_completion()
if(owner && owner.vore_prey_eaten >= target_amount)
return 1
else
return 0
// Heist objectives.
/datum/objective/heist/proc/choose_target()
return
/datum/objective/heist/kidnap/choose_target()
var/list/roles = list(JOB_CHIEF_ENGINEER,JOB_RESEARCH_DIRECTOR,JOB_ROBOTICIST,JOB_CHEMIST,JOB_ENGINEER)
var/list/possible_targets = list()
var/list/priority_targets = list()
for(var/datum/mind/possible_target in ticker.minds)
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && (!possible_target.special_role))
possible_targets += possible_target
for(var/role in roles)
if(possible_target.assigned_role == role)
priority_targets += possible_target
continue
if(priority_targets.len > 0)
target = pick(priority_targets)
else if(possible_targets.len > 0)
target = pick(possible_targets)
if(target && target.current)
explanation_text = "We can get a good price for [target.current.real_name], the [target.assigned_role]. Take them alive."
else
explanation_text = "Free Objective"
return target
/datum/objective/heist/kidnap/check_completion()
if(target && target.current)
if (target.current.stat == 2)
return 0 // They're dead. Fail.
//if (!target.current.restrained())
// return 0 // They're loose. Close but no cigar.
var/area/shuttle/skipjack/A = locate() // CHOMPEdit: Shuttle consensing
for(var/mob/living/carbon/human/M in A)
if(target.current == M)
return 1 //They're restrained on the shuttle. Success.
else
return 0
/datum/objective/heist/loot/choose_target()
var/loot = "an object"
switch(rand(1,8))
if(1)
target = /obj/structure/particle_accelerator
target_amount = 6
loot = "a complete particle accelerator"
if(2)
target = /obj/machinery/the_singularitygen
target_amount = 1
loot = "a gravitational generator"
if(3)
target = /obj/machinery/power/emitter
target_amount = 4
loot = "four emitters"
if(4)
target = /obj/machinery/nuclearbomb
target_amount = 1
loot = "a nuclear bomb"
if(5)
target = /obj/item/gun
target_amount = 6
loot = "six guns"
if(6)
target = /obj/item/gun/energy
target_amount = 4
loot = "four energy guns"
if(7)
target = /obj/item/gun/energy/laser
target_amount = 2
loot = "two laser guns"
if(8)
target = /obj/item/gun/energy/ionrifle
target_amount = 1
loot = "an ion gun"
explanation_text = "It's a buyer's market out here. Steal [loot] for resale."
/datum/objective/heist/loot/check_completion()
var/total_amount = 0
for(var/obj/O in locate(/area/shuttle/skipjack)) // CHOMPEdit: Shuttle area pathname
if(istype(O,target)) total_amount++
for(var/obj/I in O.contents)
if(istype(I,target)) total_amount++
if(total_amount >= target_amount) return 1
for(var/datum/mind/raider in raiders.current_antagonists)
if(raider.current)
for(var/obj/O in raider.current.get_contents())
if(istype(O,target)) total_amount++
if(total_amount >= target_amount) return 1
return 0
/datum/objective/heist/salvage/choose_target()
switch(rand(1,8))
if(1)
target = MAT_STEEL
target_amount = 300
if(2)
target = MAT_GLASS
target_amount = 200
if(3)
target = MAT_PLASTEEL
target_amount = 100
if(4)
target = MAT_PHORON
target_amount = 100
if(5)
target = MAT_SILVER
target_amount = 50
if(6)
target = MAT_GOLD
target_amount = 20
if(7)
target = MAT_URANIUM
target_amount = 20
if(8)
target = MAT_DIAMOND
target_amount = 20
explanation_text = "Ransack the station and escape with [target_amount] [target]."
/datum/objective/heist/salvage/check_completion()
var/total_amount = 0
for(var/obj/item/O in locate(/area/shuttle/skipjack)) //CHOMP Edit: Skipjack area pathname
var/obj/item/stack/material/S
if(istype(O,/obj/item/stack/material))
if(O.name == target)
S = O
total_amount += S.get_amount()
for(var/obj/I in O.contents)
if(istype(I,/obj/item/stack/material))
if(I.name == target)
S = I
total_amount += S.get_amount()
for(var/datum/mind/raider in raiders.current_antagonists)
if(raider.current)
for(var/obj/item/O in raider.current.get_contents())
if(istype(O,/obj/item/stack/material))
if(O.name == target)
var/obj/item/stack/material/S = O
total_amount += S.get_amount()
if(total_amount >= target_amount) return 1
return 0
/datum/objective/heist/preserve_crew
explanation_text = "Do not leave anyone behind, alive or dead."
/datum/objective/heist/preserve_crew/check_completion()
if(raiders && raiders.is_raider_crew_safe()) return 1
return 0
//Borer objective(s).
/datum/objective/borer_survive
explanation_text = "Survive in a host until the end of the round."
/datum/objective/borer_survive/check_completion()
if(owner)
var/mob/living/simple_mob/animal/borer/B = owner
if(istype(B) && B.stat < 2 && B.host && B.host.stat < 2) return 1
return 0
/datum/objective/borer_reproduce
explanation_text = "Reproduce at least once."
/datum/objective/borer_reproduce/check_completion()
if(owner && owner.current)
var/mob/living/simple_mob/animal/borer/B = owner.current
if(istype(B) && B.has_reproduced) return 1
return 0
/datum/objective/ninja_highlander
explanation_text = "You aspire to be a Grand Master of the Spider Clan. Kill all of your fellow acolytes."
/datum/objective/ninja_highlander/check_completion()
if(owner)
for(var/datum/mind/ninja in get_antags("ninja"))
if(ninja != owner)
if(ninja.current.stat < 2) return 0
return 1
return 0
/datum/objective/cult/survive
explanation_text = "Our knowledge must live on."
target_amount = 5
/datum/objective/cult/survive/New()
..()
explanation_text = "Our knowledge must live on. Make sure at least [target_amount] acolytes escape on the shuttle to spread their work on an another station."
/datum/objective/cult/survive/check_completion()
var/acolytes_survived = 0
if(!cult)
return 0
for(var/datum/mind/cult_mind in cult.current_antagonists)
if (cult_mind.current && cult_mind.current.stat!=2)
var/area/A = get_area(cult_mind.current )
if ( is_type_in_list(A, centcom_areas))
acolytes_survived++
if(acolytes_survived >= target_amount)
return 0
else
return 1
/datum/objective/cult/eldergod
explanation_text = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it. The convert rune is join blood self."
/datum/objective/cult/eldergod/check_completion()
return (locate(/obj/singularity/narsie/large) in machines)
/datum/objective/cult/sacrifice
explanation_text = "Conduct a ritual sacrifice for the glory of Nar-Sie."
/datum/objective/cult/sacrifice/find_target()
var/list/possible_targets = list()
if(!possible_targets.len)
for(var/mob/living/carbon/human/player in player_list)
if(player.mind && !(player.mind in cult))
possible_targets += player.mind
if(possible_targets.len > 0)
target = pick(possible_targets)
if(target) explanation_text = "Sacrifice [target.name], the [target.assigned_role]. You will need the sacrifice rune (Hell blood join) and three acolytes to do so."
/datum/objective/cult/sacrifice/check_completion()
return (target && cult && !cult.sacrificed.Find(target))
/datum/objective/rev/find_target()
..()
if(target && target.current)
explanation_text = "Assassinate, capture or convert [target.current.real_name], the [target.assigned_role]."
else
explanation_text = "Free Objective"
return target
/datum/objective/rev/find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Assassinate, capture or convert [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]."
else
explanation_text = "Free Objective"
return target
/datum/objective/rev/check_completion()
var/rval = 1
if(target && target.current)
var/mob/living/carbon/human/H = target.current
if(!istype(H))
return 1
if(H.stat == DEAD || H.restrained())
return 1
// Check if they're converted
if(target in revs.current_antagonists)
return 1
var/turf/T = get_turf(H)
if(T && isNotStationLevel(T.z)) //If they leave the station they count as dead for this
rval = 2
return 0
return rval