|
|
|
@@ -4,7 +4,8 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
|
|
|
|
|
/datum/objective
|
|
|
|
|
var/datum/mind/owner //The primary owner of the objective. !!SOMEWHAT DEPRECATED!! Prefer using 'team' for new code.
|
|
|
|
|
var/datum/team/team //An alternative to 'owner': a team. Use this when writing new code.
|
|
|
|
|
var/datum/team/team //An alternative to 'owner': a team. Use this when writing new code.
|
|
|
|
|
var/name = "generic objective" //Name for admin prompts
|
|
|
|
|
var/explanation_text = "Nothing" //What that person is supposed to do.
|
|
|
|
|
var/team_explanation_text //For when there are multiple owners.
|
|
|
|
|
var/datum/mind/target = null //If they are focused on a particular person.
|
|
|
|
@@ -22,6 +23,32 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
if(owner)
|
|
|
|
|
. += owner
|
|
|
|
|
|
|
|
|
|
/datum/objective/proc/admin_edit(mob/admin)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
//Shared by few objective types
|
|
|
|
|
/datum/objective/proc/admin_simple_target_pick(mob/admin)
|
|
|
|
|
var/list/possible_targets = list("Free objective")
|
|
|
|
|
var/def_value
|
|
|
|
|
for(var/datum/mind/possible_target in SSticker.minds)
|
|
|
|
|
if ((possible_target != src) && ishuman(possible_target.current))
|
|
|
|
|
possible_targets += possible_target.current
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(target && target.current)
|
|
|
|
|
def_value = target.current
|
|
|
|
|
|
|
|
|
|
var/mob/new_target = input(admin,"Select target:", "Objective target", def_value) as null|anything in possible_targets
|
|
|
|
|
if (!new_target)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if (new_target == "Free objective")
|
|
|
|
|
target = null
|
|
|
|
|
else
|
|
|
|
|
target = new_target.mind
|
|
|
|
|
|
|
|
|
|
update_explanation_text()
|
|
|
|
|
|
|
|
|
|
/datum/objective/proc/considered_escaped(datum/mind/M)
|
|
|
|
|
if(!considered_alive(M))
|
|
|
|
|
return FALSE
|
|
|
|
@@ -42,7 +69,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
/datum/objective/proc/is_unique_objective(possible_target)
|
|
|
|
|
var/list/datum/mind/owners = get_owners()
|
|
|
|
|
for(var/datum/mind/M in owners)
|
|
|
|
|
for(var/datum/objective/O in M.objectives)
|
|
|
|
|
for(var/datum/objective/O in M.get_all_objectives()) //This scope is debatable, probably should be passed in by caller.
|
|
|
|
|
if(istype(O, type) && O.get_target() == possible_target)
|
|
|
|
|
return FALSE
|
|
|
|
|
return TRUE
|
|
|
|
@@ -122,6 +149,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
H.equip_in_one_of_slots(O, slots)
|
|
|
|
|
|
|
|
|
|
/datum/objective/assassinate
|
|
|
|
|
name = "assasinate"
|
|
|
|
|
var/target_role_type=0
|
|
|
|
|
martyr_compatible = 1
|
|
|
|
|
|
|
|
|
@@ -141,6 +169,9 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
else
|
|
|
|
|
explanation_text = "Free Objective"
|
|
|
|
|
|
|
|
|
|
/datum/objective/assassinate/admin_edit(mob/admin)
|
|
|
|
|
admin_simple_target_pick(admin)
|
|
|
|
|
|
|
|
|
|
/datum/objective/assassinate/internal
|
|
|
|
|
var/stolen = 0 //Have we already eliminated this target?
|
|
|
|
|
|
|
|
|
@@ -150,6 +181,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
explanation_text = "Assassinate [target.name], who was obliterated"
|
|
|
|
|
|
|
|
|
|
/datum/objective/mutiny
|
|
|
|
|
name = "mutiny"
|
|
|
|
|
var/target_role_type=0
|
|
|
|
|
martyr_compatible = 1
|
|
|
|
|
|
|
|
|
@@ -173,6 +205,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
explanation_text = "Free Objective"
|
|
|
|
|
|
|
|
|
|
/datum/objective/maroon
|
|
|
|
|
name = "maroon"
|
|
|
|
|
var/target_role_type=0
|
|
|
|
|
martyr_compatible = 1
|
|
|
|
|
|
|
|
|
@@ -191,7 +224,11 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
else
|
|
|
|
|
explanation_text = "Free Objective"
|
|
|
|
|
|
|
|
|
|
/datum/objective/maroon/admin_edit(mob/admin)
|
|
|
|
|
admin_simple_target_pick(admin)
|
|
|
|
|
|
|
|
|
|
/datum/objective/debrain
|
|
|
|
|
name = "debrain"
|
|
|
|
|
var/target_role_type=0
|
|
|
|
|
|
|
|
|
|
/datum/objective/debrain/find_target_by_role(role, role_type=0, invert=0)
|
|
|
|
@@ -222,7 +259,11 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
else
|
|
|
|
|
explanation_text = "Free Objective"
|
|
|
|
|
|
|
|
|
|
/datum/objective/debrain/admin_edit(mob/admin)
|
|
|
|
|
admin_simple_target_pick(admin)
|
|
|
|
|
|
|
|
|
|
/datum/objective/protect//The opposite of killing a dude.
|
|
|
|
|
name = "protect"
|
|
|
|
|
martyr_compatible = 1
|
|
|
|
|
var/target_role_type = 0
|
|
|
|
|
var/human_check = TRUE
|
|
|
|
@@ -243,10 +284,15 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
else
|
|
|
|
|
explanation_text = "Free Objective"
|
|
|
|
|
|
|
|
|
|
/datum/objective/protect/admin_edit(mob/admin)
|
|
|
|
|
admin_simple_target_pick(admin)
|
|
|
|
|
|
|
|
|
|
/datum/objective/protect/nonhuman
|
|
|
|
|
name = "protect nonhuman"
|
|
|
|
|
human_check = FALSE
|
|
|
|
|
|
|
|
|
|
/datum/objective/hijack
|
|
|
|
|
name = "hijack"
|
|
|
|
|
explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody."
|
|
|
|
|
team_explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody. Leave no team member behind."
|
|
|
|
|
martyr_compatible = 0 //Technically you won't get both anyway.
|
|
|
|
@@ -261,6 +307,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
return SSshuttle.emergency.is_hijacked()
|
|
|
|
|
|
|
|
|
|
/datum/objective/block
|
|
|
|
|
name = "no organics on shuttle"
|
|
|
|
|
explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive."
|
|
|
|
|
martyr_compatible = 1
|
|
|
|
|
|
|
|
|
@@ -274,6 +321,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
return TRUE
|
|
|
|
|
|
|
|
|
|
/datum/objective/purge
|
|
|
|
|
name = "no mutants on shuttle"
|
|
|
|
|
explanation_text = "Ensure no mutant humanoid species are present aboard the escape shuttle."
|
|
|
|
|
martyr_compatible = 1
|
|
|
|
|
|
|
|
|
@@ -288,6 +336,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
return TRUE
|
|
|
|
|
|
|
|
|
|
/datum/objective/robot_army
|
|
|
|
|
name = "robot army"
|
|
|
|
|
explanation_text = "Have at least eight active cyborgs synced to you."
|
|
|
|
|
martyr_compatible = 0
|
|
|
|
|
|
|
|
|
@@ -304,6 +353,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
return counter >= 8
|
|
|
|
|
|
|
|
|
|
/datum/objective/escape
|
|
|
|
|
name = "escape"
|
|
|
|
|
explanation_text = "Escape on the shuttle or an escape pod alive and without being in custody."
|
|
|
|
|
team_explanation_text = "Have all members of your team escape on a shuttle or pod alive, without being in custody."
|
|
|
|
|
|
|
|
|
@@ -316,6 +366,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
return TRUE
|
|
|
|
|
|
|
|
|
|
/datum/objective/escape/escape_with_identity
|
|
|
|
|
name = "escape with identity"
|
|
|
|
|
var/target_real_name // Has to be stored because the target's real_name can change over the course of the round
|
|
|
|
|
var/target_missing_id
|
|
|
|
|
|
|
|
|
@@ -351,7 +402,11 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
return TRUE
|
|
|
|
|
return FALSE
|
|
|
|
|
|
|
|
|
|
/datum/objective/escape/escape_with_identity/admin_edit(mob/admin)
|
|
|
|
|
admin_simple_target_pick(admin)
|
|
|
|
|
|
|
|
|
|
/datum/objective/survive
|
|
|
|
|
name = "survive"
|
|
|
|
|
explanation_text = "Stay alive until the end."
|
|
|
|
|
|
|
|
|
|
/datum/objective/survive/check_completion()
|
|
|
|
@@ -362,6 +417,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
return TRUE
|
|
|
|
|
|
|
|
|
|
/datum/objective/survive/exist //Like survive, but works for silicons and zombies and such.
|
|
|
|
|
name = "survive nonhuman"
|
|
|
|
|
|
|
|
|
|
/datum/objective/survive/exist/check_completion()
|
|
|
|
|
var/list/datum/mind/owners = get_owners()
|
|
|
|
@@ -371,6 +427,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
return TRUE
|
|
|
|
|
|
|
|
|
|
/datum/objective/martyr
|
|
|
|
|
name = "martyr"
|
|
|
|
|
explanation_text = "Die a glorious death."
|
|
|
|
|
|
|
|
|
|
/datum/objective/martyr/check_completion()
|
|
|
|
@@ -383,6 +440,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
return TRUE
|
|
|
|
|
|
|
|
|
|
/datum/objective/nuclear
|
|
|
|
|
name = "nuclear"
|
|
|
|
|
explanation_text = "Destroy the station with a nuclear device."
|
|
|
|
|
martyr_compatible = 1
|
|
|
|
|
|
|
|
|
@@ -393,6 +451,7 @@ GLOBAL_LIST_EMPTY(objectives)
|
|
|
|
|
|
|
|
|
|
GLOBAL_LIST_EMPTY(possible_items)
|
|
|
|
|
/datum/objective/steal
|
|
|
|
|
name = "steal"
|
|
|
|
|
var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later.
|
|
|
|
|
var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums).
|
|
|
|
|
martyr_compatible = 0
|
|
|
|
@@ -430,18 +489,19 @@ GLOBAL_LIST_EMPTY(possible_items)
|
|
|
|
|
explanation_text = "Free objective"
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
/datum/objective/steal/proc/select_target() //For admins setting objectives manually.
|
|
|
|
|
/datum/objective/steal/admin_edit(mob/admin)
|
|
|
|
|
var/list/possible_items_all = GLOB.possible_items+"custom"
|
|
|
|
|
var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all
|
|
|
|
|
var/new_target = input(admin,"Select target:", "Objective target", steal_target) as null|anything in possible_items_all
|
|
|
|
|
if (!new_target)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if (new_target == "custom") //Can set custom items.
|
|
|
|
|
var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item)
|
|
|
|
|
if (!custom_target)
|
|
|
|
|
var/custom_path = input(admin,"Search for target item type:","Type") as null|text
|
|
|
|
|
if (!custom_path)
|
|
|
|
|
return
|
|
|
|
|
var/obj/item/custom_target = pick_closest_path(custom_path, make_types_fancy(subtypesof(/obj/item)))
|
|
|
|
|
var/custom_name = initial(custom_target.name)
|
|
|
|
|
custom_name = stripped_input("Enter target name:", "Objective target", custom_name)
|
|
|
|
|
custom_name = stripped_input(admin,"Enter target name:", "Objective target", custom_name)
|
|
|
|
|
if (!custom_name)
|
|
|
|
|
return
|
|
|
|
|
steal_target = custom_target
|
|
|
|
@@ -449,7 +509,6 @@ GLOBAL_LIST_EMPTY(possible_items)
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
set_target(new_target)
|
|
|
|
|
return steal_target
|
|
|
|
|
|
|
|
|
|
/datum/objective/steal/check_completion()
|
|
|
|
|
var/list/datum/mind/owners = get_owners()
|
|
|
|
@@ -476,6 +535,7 @@ GLOBAL_LIST_EMPTY(possible_items)
|
|
|
|
|
|
|
|
|
|
GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
/datum/objective/steal/special //ninjas are so special they get their own subtype good for them
|
|
|
|
|
name = "steal special"
|
|
|
|
|
|
|
|
|
|
/datum/objective/steal/special/New()
|
|
|
|
|
..()
|
|
|
|
@@ -487,8 +547,12 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
return set_target(pick(GLOB.possible_items_special))
|
|
|
|
|
|
|
|
|
|
/datum/objective/steal/exchange
|
|
|
|
|
name = "exchange"
|
|
|
|
|
martyr_compatible = 0
|
|
|
|
|
|
|
|
|
|
/datum/objective/steal/exchange/admin_edit(mob/admin)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
/datum/objective/steal/exchange/proc/set_faction(faction,otheragent)
|
|
|
|
|
target = otheragent
|
|
|
|
|
if(faction == "red")
|
|
|
|
@@ -508,6 +572,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/datum/objective/steal/exchange/backstab
|
|
|
|
|
name = "prevent exchange"
|
|
|
|
|
|
|
|
|
|
/datum/objective/steal/exchange/backstab/set_faction(faction)
|
|
|
|
|
if(faction == "red")
|
|
|
|
@@ -519,12 +584,17 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/datum/objective/download
|
|
|
|
|
name = "download"
|
|
|
|
|
|
|
|
|
|
/datum/objective/download/proc/gen_amount_goal()
|
|
|
|
|
target_amount = rand(20,40)
|
|
|
|
|
explanation_text = "Download [target_amount] research node\s."
|
|
|
|
|
update_explanation_text()
|
|
|
|
|
return target_amount
|
|
|
|
|
|
|
|
|
|
/datum/objective/download/update_explanation_text()
|
|
|
|
|
..()
|
|
|
|
|
explanation_text = "Download [target_amount] research node\s."
|
|
|
|
|
|
|
|
|
|
/datum/objective/download/check_completion()
|
|
|
|
|
var/datum/techweb/checking = new
|
|
|
|
|
var/list/datum/mind/owners = get_owners()
|
|
|
|
@@ -541,13 +611,24 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
TD.stored_research.copy_research_to(checking)
|
|
|
|
|
return checking.researched_nodes.len >= target_amount
|
|
|
|
|
|
|
|
|
|
/datum/objective/download/admin_edit(mob/admin)
|
|
|
|
|
var/count = input(admin,"How many nodes ?","Nodes",target_amount) as num|null
|
|
|
|
|
if(count)
|
|
|
|
|
target_amount = count
|
|
|
|
|
update_explanation_text()
|
|
|
|
|
|
|
|
|
|
/datum/objective/capture
|
|
|
|
|
name = "capture"
|
|
|
|
|
var/captured_amount = 0
|
|
|
|
|
|
|
|
|
|
/datum/objective/capture/proc/gen_amount_goal()
|
|
|
|
|
target_amount = rand(5,10)
|
|
|
|
|
explanation_text = "Capture [target_amount] lifeform\s with an energy net. Live, rare specimens are worth more."
|
|
|
|
|
return target_amount
|
|
|
|
|
target_amount = rand(5,10)
|
|
|
|
|
explanation_text = "Capture [target_amount] lifeform\s with an energy net. Live, rare specimens are worth more."
|
|
|
|
|
return target_amount
|
|
|
|
|
|
|
|
|
|
/datum/objective/capture/update_explanation_text()
|
|
|
|
|
. = ..()
|
|
|
|
|
explanation_text = "Capture [target_amount] lifeform\s with an energy net. Live, rare specimens are worth more."
|
|
|
|
|
|
|
|
|
|
/datum/objective/capture/check_completion()//Basically runs through all the mobs in the area to determine how much they are worth.
|
|
|
|
|
/*var/area/centcom/holding/A = GLOB.areas_by_type[/area/centcom/holding]
|
|
|
|
@@ -576,10 +657,16 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
captured_amount+=2*/ //Removed in favour of adding points on capture, in energy_net_nets.dm
|
|
|
|
|
return captured_amount >= target_amount
|
|
|
|
|
|
|
|
|
|
/datum/objective/capture/admin_edit(mob/admin)
|
|
|
|
|
var/count = input(admin,"How many mobs to capture ?","capture",target_amount) as num|null
|
|
|
|
|
if(count)
|
|
|
|
|
target_amount = count
|
|
|
|
|
update_explanation_text()
|
|
|
|
|
|
|
|
|
|
//Changeling Objectives
|
|
|
|
|
|
|
|
|
|
/datum/objective/absorb
|
|
|
|
|
name = "absorb"
|
|
|
|
|
|
|
|
|
|
/datum/objective/absorb/proc/gen_amount_goal(lowbound = 4, highbound = 6)
|
|
|
|
|
target_amount = rand (lowbound,highbound)
|
|
|
|
@@ -595,9 +682,19 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
n_p ++
|
|
|
|
|
target_amount = min(target_amount, n_p)
|
|
|
|
|
|
|
|
|
|
explanation_text = "Extract [target_amount] compatible genome\s."
|
|
|
|
|
update_explanation_text()
|
|
|
|
|
return target_amount
|
|
|
|
|
|
|
|
|
|
/datum/objective/absorb/update_explanation_text()
|
|
|
|
|
. = ..()
|
|
|
|
|
explanation_text = "Extract [target_amount] compatible genome\s."
|
|
|
|
|
|
|
|
|
|
/datum/objective/absorb/admin_edit(mob/admin)
|
|
|
|
|
var/count = input(admin,"How many people to absorb?","absorb",target_amount) as num|null
|
|
|
|
|
if(count)
|
|
|
|
|
target_amount = count
|
|
|
|
|
update_explanation_text()
|
|
|
|
|
|
|
|
|
|
/datum/objective/absorb/check_completion()
|
|
|
|
|
var/list/datum/mind/owners = get_owners()
|
|
|
|
|
var/absorbedcount = 0
|
|
|
|
@@ -611,6 +708,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
return absorbedcount >= target_amount
|
|
|
|
|
|
|
|
|
|
/datum/objective/absorb_most
|
|
|
|
|
name = "absorb most"
|
|
|
|
|
explanation_text = "Extract more compatible genomes than any other Changeling."
|
|
|
|
|
|
|
|
|
|
/datum/objective/absorb_most/check_completion()
|
|
|
|
@@ -631,6 +729,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
return TRUE
|
|
|
|
|
|
|
|
|
|
/datum/objective/absorb_changeling
|
|
|
|
|
name = "absorb changeling"
|
|
|
|
|
explanation_text = "Absorb another Changeling."
|
|
|
|
|
|
|
|
|
|
/datum/objective/absorb_changeling/check_completion()
|
|
|
|
@@ -653,6 +752,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
//End Changeling Objectives
|
|
|
|
|
|
|
|
|
|
/datum/objective/destroy
|
|
|
|
|
name = "destroy AI"
|
|
|
|
|
martyr_compatible = 1
|
|
|
|
|
|
|
|
|
|
/datum/objective/destroy/find_target()
|
|
|
|
@@ -674,10 +774,20 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
else
|
|
|
|
|
explanation_text = "Free Objective"
|
|
|
|
|
|
|
|
|
|
/datum/objective/destroy/admin_edit(mob/admin)
|
|
|
|
|
var/list/possible_targets = active_ais(1)
|
|
|
|
|
if(possible_targets.len)
|
|
|
|
|
var/mob/new_target = input(admin,"Select target:", "Objective target") as null|anything in possible_targets
|
|
|
|
|
target = new_target.mind
|
|
|
|
|
else
|
|
|
|
|
to_chat(admin, "No active AIs with minds")
|
|
|
|
|
update_explanation_text()
|
|
|
|
|
|
|
|
|
|
/datum/objective/destroy/internal
|
|
|
|
|
var/stolen = FALSE //Have we already eliminated this target?
|
|
|
|
|
|
|
|
|
|
/datum/objective/steal_five_of_type
|
|
|
|
|
name = "steal five of"
|
|
|
|
|
explanation_text = "Steal at least five items!"
|
|
|
|
|
var/list/wanted_items = list(/obj/item)
|
|
|
|
|
|
|
|
|
@@ -686,10 +796,12 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
wanted_items = typecacheof(wanted_items)
|
|
|
|
|
|
|
|
|
|
/datum/objective/steal_five_of_type/summon_guns
|
|
|
|
|
name = "steal guns"
|
|
|
|
|
explanation_text = "Steal at least five guns!"
|
|
|
|
|
wanted_items = list(/obj/item/gun)
|
|
|
|
|
|
|
|
|
|
/datum/objective/steal_five_of_type/summon_magic
|
|
|
|
|
name = "steal magic"
|
|
|
|
|
explanation_text = "Steal at least five magical artefacts!"
|
|
|
|
|
wanted_items = list(/obj/item/spellbook, /obj/item/gun/magic, /obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/scrying, /obj/item/antag_spawner/contract, /obj/item/necromantic_stone)
|
|
|
|
|
|
|
|
|
@@ -705,6 +817,14 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
|
|
|
|
stolen_count++
|
|
|
|
|
return stolen_count >= 5
|
|
|
|
|
|
|
|
|
|
//Created by admin tools
|
|
|
|
|
/datum/objective/custom
|
|
|
|
|
name = "custom"
|
|
|
|
|
|
|
|
|
|
/datum/objective/custom/admin_edit(mob/admin)
|
|
|
|
|
var/expl = stripped_input(admin, "Custom objective:", "Objective", explanation_text)
|
|
|
|
|
if(expl)
|
|
|
|
|
explanation_text = expl
|
|
|
|
|
|
|
|
|
|
////////////////////////////////
|
|
|
|
|
// Changeling team objectives //
|
|
|
|
|