#define FRAME_PROBABILITY 3 #define THEFT_PROBABILITY 55 #define KILL_PROBABILITY 37 #define PROTECT_PROBABILITY 5 #define LENIENT 0 #define NORMAL 1 #define HARD 2 #define IMPOSSIBLE 3 /proc/GenerateTheft(var/job,var/datum/mind/traitor) var/list/datum/objective/objectives = list() for(var/o in typesof(/datum/objective/steal)) if(o != /datum/objective/steal) //Make sure not to get a blank steal objective. var/datum/objective/target = new o(null,job) objectives += target objectives[target] = target.weight return objectives /proc/GenerateAssassinate(var/job,var/datum/mind/traitor) var/list/datum/objective/assassinate/missions = list() for(var/datum/mind/target in SSticker.minds) if((target != traitor) && ishuman(target.current)) if(target && target.current) var/datum/objective/target_obj = new /datum/objective/assassinate(null,job,target) missions += target_obj missions[target_obj] = target_obj.weight return missions /proc/GenerateFrame(var/job,var/datum/mind/traitor) var/list/datum/objective/frame/missions = list() for(var/datum/mind/target in SSticker.minds) if((target != traitor) && ishuman(target.current)) if(target && target.current) var/datum/objective/target_obj = new /datum/objective/frame(null,job,target) missions += target_obj missions[target_obj] = target_obj.weight return missions /proc/GenerateProtection(var/job,var/datum/mind/traitor) var/list/datum/objective/frame/missions = list() for(var/datum/mind/target in SSticker.minds) if((target != traitor) && ishuman(target.current)) if(target && target.current) var/datum/objective/target_obj = new /datum/objective/protection(null,job,target) missions += target_obj missions[target_obj] = target_obj.weight return missions /proc/SelectObjectives(var/job,var/datum/mind/traitor,var/hijack = 0) var/list/chosenobjectives = list() var/list/theftobjectives = GenerateTheft(job,traitor) //Separated all the objective types so they can be picked independantly of each other. var/list/killobjectives = GenerateAssassinate(job,traitor) var/list/frameobjectives = GenerateFrame(job,traitor) var/list/protectobjectives = GenerateProtection(job,traitor) var/total_weight var/conflict var/steal_weight = THEFT_PROBABILITY var/frame_weight = FRAME_PROBABILITY var/kill_weight = KILL_PROBABILITY var/protect_weight = PROTECT_PROBABILITY var/target_weight = 50 ///////////////////////////////////////////////////////////// //HANDLE ASSIGNING OBJECTIVES BASED OFF OF PREVIOUS SUCCESS// ///////////////////////////////////////////////////////////// var/savefile/info = new("data/player_saves/[copytext(traitor.key, 1, 2)]/[traitor.key]/traitor.sav") var/list/infos info >> infos if(istype(infos)) var/total_attempts = infos["Total"] var/total_overall_success = infos["Success"] var/success_ratio = total_overall_success/total_attempts var/steal_success = infos["Steal"] var/kill_success = infos["Kill"] var/frame_success = infos["Frame"] var/protect_success = infos["Protect"] var/list/ordered_success = list(steal_success, kill_success, frame_success, protect_success) var/difficulty = pick(LENIENT, LENIENT, NORMAL, NORMAL, NORMAL, HARD, HARD, IMPOSSIBLE) //Highest to lowest in terms of success rate, and resulting weight for later computation var/success_weights = list(1, 1, 1, 1) switch(difficulty) if(LENIENT) success_weights = list(1.5, 1, 0.75, 0.5) target_weight = success_ratio*100 if(NORMAL) target_weight = success_ratio*150 if(HARD) success_weights = list(0.66, 0.8, 1, 1.25) target_weight = success_ratio*200 if(IMPOSSIBLE) //YOU SHALL NOT PASS success_weights = list(0.5, 0.75, 1.2, 2) target_weight = success_ratio*300 for(var/i = 1, i <= 4, i++) //Iterate through the success rates, and determine the weights to chose based on the highest to // the lowest to multiply it by the proper success ratio. var/weight = max(ordered_success) ordered_success -= weight if(weight == steal_success) steal_weight *= steal_success*success_weights[i] else if(weight == frame_success) frame_weight *= frame_success*success_weights[i] else if(weight == protect_success) protect_weight *= protect_success*success_weights[i] else if(weight == kill_success) kill_weight *= kill_success*success_weights[i] var/total_weights = kill_weight + protect_weight + frame_weight + steal_weight frame_weight = round(frame_weight/total_weights) kill_weight = round(kill_weight/total_weights) steal_weight = round(steal_weight/total_weights) //Protect is whatever is left over. var/steal_range = steal_weight var/frame_range = frame_weight + steal_range var/kill_range = kill_weight + frame_range //Protect is whatever is left over. while(total_weight < target_weight) var/selectobj = rand(1,100) //Randomly determine the type of objective to be given. if(!length(killobjectives) || !length(protectobjectives)|| !length(frameobjectives)) //If any of these lists are empty, just give them theft objectives. var/datum/objective/objective = pickweight(theftobjectives) chosenobjectives += objective total_weight += objective.points theftobjectives -= objective else switch(selectobj) if(1 to steal_range) if(!theftobjectives.len) continue var/datum/objective/objective = pickweight(theftobjectives) for(1 to 10) if(objective.points + total_weight <= 100 || !theftobjectives.len) break theftobjectives -= objective objective = pickweight(theftobjectives) if(!objective && !theftobjectives.len) continue chosenobjectives += objective total_weight += objective.points theftobjectives -= objective if(steal_range + 1 to frame_range) //Framing Objectives (3% chance) if(!frameobjectives.len) continue var/datum/objective/objective = pickweight(frameobjectives) for(1 to 10) if(objective.points + total_weight <= 100 || !frameobjectives.len) break frameobjectives -= objective objective = pickweight(frameobjectives) if(!objective && !frameobjectives.len) continue for(var/datum/objective/protection/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Assassinate somebody they need to Protect. if(conflicttest.target == objective.target) conflict = 1 break for(var/datum/objective/assassinate/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Protect somebody they need to Assassinate. if(conflicttest.target == objective.target) conflict = 1 break if(!conflict) chosenobjectives += objective total_weight += objective.points frameobjectives -= objective conflict = 0 if(frame_range + 1 to kill_range) if(!killobjectives.len) continue var/datum/objective/assassinate/objective = pickweight(killobjectives) to_world(objective) for(1 to 10) if(objective.points + total_weight <= 100 || !killobjectives.len) break killobjectives -= objective objective = pickweight(killobjectives) if(!objective && !killobjectives.len) continue for(var/datum/objective/protection/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Assassinate somebody they need to Protect. if(conflicttest.target == objective.target) conflict = 1 break for(var/datum/objective/frame/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Protect somebody they need to Assassinate. if(conflicttest.target == objective.target) conflict = 1 break if(!conflict) chosenobjectives += objective total_weight += objective.points killobjectives -= objective conflict = 0 if(kill_range + 1 to 100) //Protection Objectives (5% chance) if(!protectobjectives.len) continue var/datum/objective/protection/objective = pickweight(protectobjectives) for(1 to 10) if(objective.points + total_weight <= 100 || !protectobjectives.len) break protectobjectives -= objective objective = pickweight(protectobjectives) if(!objective || !protectobjectives.len) continue for(var/datum/objective/assassinate/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Protect somebody they need to Assassinate. if(conflicttest.target == objective.target) conflict = 1 break for(var/datum/objective/frame/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Protect somebody they need to Assassinate. if(conflicttest.target == objective.target) conflict = 1 break if(!conflict) chosenobjectives += objective total_weight += objective.points protectobjectives -= objective conflict = 0 if(!locate(/datum/objective/hijack) in chosenobjectives && !locate(/datum/objective/escape) in chosenobjectives) if(hijack) chosenobjectives += new /datum/objective/hijack(null,job) else chosenobjectives += new /datum/objective/escape(null,job) return chosenobjectives datum objective var/datum/mind/owner var/datum/mind/target var/explanation_text = "text not set" var/job var/points = INFINITY //If this isn't set to something else, the objective is bugged and should be ignored var/weight = INFINITY New(var/text,var/joba) if(text) src.explanation_text = text job=joba weight = get_weight(job) points = get_points(job) proc/check_completion() return 1 proc/get_points(var/job) return INFINITY proc/get_weight(var/job) return INFINITY 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 SSticker.minds) if((possible_target != owner) && ishuman(possible_target.current) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role) ) target = possible_target break frame New(var/text,var/joba,var/datum/mind/targeta) target = targeta job = joba weight = get_points(job) explanation_text = "Frame [target.current.real_name], the [target.assigned_role] for a crime and make sure they are arrested and brought back to the CentCom station alive. We'll handle the rest from there." check_completion() if(!emergency_shuttle.returned()) return 0 if(target.current.stat == 2) return 0 var/turf/location = get_turf(target.current.loc) if(!location) return 0 if(!target.current:handcuffed && !istype(location, /turf/simulated/shuttle/floor4)) return 0 if(location in locate(/area/shuttle/escape/centcom)) return 1 return 0 get_points() if(target) var/difficulty = GetRank(target.assigned_role) + 1 switch(GetRank(job)) if(4) return 20*difficulty if(3) return 30*difficulty if(2) return 40*difficulty if(1) return 55*difficulty if(0) return 60*difficulty else return INFINITY get_weight() if(target) return 1 return 0 protection New(var/text,var/joba,var/datum/mind/targeta) target = targeta job = joba weight = get_points(job) explanation_text = "[target.current.real_name], the [target.assigned_role] is a [pick("relative of a","friend of a","") + pick("high ranking","important","well-liked")] mercenary [pick("Leader","Officer","Agent","sympathiser")]. Make sure they get off the station safely, while minimizing intervention." check_completion() if(!emergency_shuttle.returned()) return 0 if(target.current.stat == 2) return 0 var/turf/location = get_turf(target.current.loc) if(!location) return 0 if(location in locate(/area/shuttle/escape/centcom)) return 1 return 0 get_points() if(target) return 30 else return INFINITY get_weight() if(target) return 1 return 0 find_target_by_role(role, role_type=0) ..(role, role_type) if(target && target.current) explanation_text = "Protect [target.current.real_name], the [target.role_alt_title ? target.role_alt_title : (!role_type ? target.assigned_role : target.special_role)]." else explanation_text = "Free Objective" return target assassinate New(var/text,var/joba,var/datum/mind/targeta) target = targeta job = joba weight = get_points(job) explanation_text = "Assassinate [target.current.real_name], the [target.role_alt_title ? target.role_alt_title : target.assigned_role]." check_completion() if(target && target.current) if(target.current.stat == 2 || istype(get_area(target.current), /area/tdome) || issilicon(target.current) || isbrain(target.current)) return 1 else return 0 else return 1 get_points() if(target) var/difficulty = GetRank(target.assigned_role) + 1 switch(GetRank(job)) if(4) return 20*difficulty if(3) return 30*difficulty if(2) return 40*difficulty if(1) return 55*difficulty if(0) return 60*difficulty else return 0 get_weight() if(target) return 1 return 0 find_target_by_role(var/role) for(var/datum/mind/possible_target in SSticker.minds) if((possible_target != owner) && ishuman(possible_target.current) && (possible_target.assigned_role == role)) target = possible_target break if(target && target.current) explanation_text = "Assassinate [target.current.real_name], the [target.role_alt_title ? target.role_alt_title : target.assigned_role]." else explanation_text = "Free Objective" return target proc/find_target() var/list/possible_targets = list() for(var/datum/mind/possible_target in SSticker.minds) if((possible_target != owner) && ishuman(possible_target.current)) possible_targets += possible_target if(possible_targets.len > 0) target = pick(possible_targets) if(target && target.current) explanation_text = "Assassinate [target.current.real_name], the [target.role_alt_title ? target.role_alt_title : target.assigned_role]." else explanation_text = "Free Objective" return target capture var/separation_time = 0 var/almost_complete = 0 New(var/text,var/joba,var/datum/mind/targeta) target = targeta job = joba explanation_text = "Capture [target.current.real_name], the [target.assigned_role]." check_completion() if(target && target.current) if(target.current.stat == 2) if(config.require_heads_alive) return 0 else if(!target.current.handcuffed) return 0 else if(config.require_heads_alive) return 0 return 1 find_target_by_role(var/role) for(var/datum/mind/possible_target in SSticker.minds) if((possible_target != owner) && ishuman(possible_target.current) && (possible_target.assigned_role == role)) target = possible_target break if(target && target.current) explanation_text = "Capture [target.current.real_name], the [target.assigned_role]." else explanation_text = "Free Objective" return target get_points() if(target) var/difficulty = GetRank(target.assigned_role) + 1 switch(GetRank(job)) if(4) return 20*difficulty if(3) return 30*difficulty if(2) return 40*difficulty if(1) return 55*difficulty if(0) return 60*difficulty else return INFINITY get_weight() if(target) return 1 return 0 hijack explanation_text = "Hijack the emergency shuttle by escaping alone." check_completion() 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 in locate(/area/shuttle/escape/centcom)) for(var/mob/living/player in locate(/area/shuttle/escape/centcom)) if (player.mind && (player.mind != owner)) if (player.stat != 2) //they're not dead return 0 return 1 return 0 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 65 if(2) return 65 if(3) return 50 if(4) return 35 get_weight(var/job) return 1 escape explanation_text = "Escape on the shuttle alive, without being arrested." check_completion() 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(owner.current:handcuffed || istype(location, /turf/simulated/shuttle/floor4)) return 0 if(location in locate(/area/shuttle/escape/centcom)) return 1 return 0 get_points() return INFINITY get_weight(var/job) return 1 survive explanation_text = "Stay alive." check_completion() if(!owner.current || owner.current.stat == 2) return 0 return 1 get_points() return INFINITY get_weight(var/job) return 1 steal var/obj/item/steal_target check_completion() if(steal_target) if(owner.current.check_contents_for(steal_target)) return 1 else return 0 captainslaser steal_target = /obj/item/gun/energy/captain explanation_text = "Steal the Site Manager's antique laser gun." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 60 if(1) return 50 if(2) return 40 if(3) return 30 if(4) return 20 get_weight(var/job) if(GetRank(job) == 4) return 10 else return 20 plasmatank steal_target = /obj/item/tank/plasma explanation_text = "Steal a small plasma tank." weight = 20 get_points(var/job) if(job in science_positions || job in command_positions) return 20 return 40 get_weight(var/job) return 20 check_completion() var/list/all_items = owner.current.get_contents() for(var/obj/item/I in all_items) if(!istype(I, steal_target)) continue//If it's not actually that item. if(I:air_contents:phoron) return 1 //If they got one with plasma return 0 /*Removing this as an objective. Not necessary to have two theft objectives in the same room. steal/captainssuit steal_target = /obj/item/clothing/under/rank/captain explanation_text = "Steal a captain's rank jumpsuit" weight = 50 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return INFINITY */ handtele steal_target = /obj/item/hand_tele explanation_text = "Steal a hand teleporter." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return 20 get_weight(var/job) if(GetRank(job) == 4) return 10 else return 20 RCD steal_target = /obj/item/rcd explanation_text = "Steal a rapid construction device." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return 20 get_weight(var/job) if(GetRank(job) == 4) return 10 else return 20 /*burger steal_target = /obj/item/reagent_containers/food/snacks/human/burger explanation_text = "Steal a burger made out of human organs, this will be presented as proof of NanoTrasen's chronic lack of standards." weight = 60 get_points(var/job) switch(GetRank(job)) if(0) return 80 if(1) return 65 if(2) return 55 if(3) return 40 if(4) return 25*/ jetpack steal_target = /obj/item/tank/jetpack/oxygen explanation_text = "Steal a blue oxygen jetpack." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return 20 get_weight(var/job) if(GetRank(job) == 4) return 10 else return 20 /*magboots steal_target = /obj/item/clothing/shoes/magboots explanation_text = "Steal a pair of \"NanoTrasen\" brand magboots." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return 20 get_weight(var/job) if(GetRank(job) == 4) return 10 else return 20*/ blueprints steal_target = /obj/item/areaeditor/blueprints explanation_text = "Steal the station's blueprints." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return 20 get_weight(var/job) if(GetRank(job) == 4) return 10 else return 20 voidsuit steal_target = /obj/item/clothing/suit/space/nasavoid explanation_text = "Steal a voidsuit." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return 20 get_weight(var/job) return 20 nuke_disk steal_target = /obj/item/disk/nuclear explanation_text = "Steal the station's nuclear authentication disk." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 90 if(1) return 80 if(2) return 70 if(3) return 40 if(4) return 25 get_weight(var/job) if(GetRank(job) == 4) return 10 else return 20 nuke_gun steal_target = /obj/item/gun/energy/gun/nuclear explanation_text = "Steal a nuclear powered gun." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 90 if(1) return 85 if(2) return 80 if(3) return 75 if(4) return 75 get_weight(var/job) return 2 diamond_drill steal_target = /obj/item/pickaxe/diamonddrill explanation_text = "Steal a diamond drill." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 90 if(1) return 85 if(2) return 70 if(3) return 75 if(4) return 75 get_weight(var/job) return 2 boh steal_target = /obj/item/storage/backpack/holding explanation_text = "Steal a \"bag of holding.\"" weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 90 if(1) return 85 if(2) return 80 if(3) return 75 if(4) return 75 get_weight(var/job) return 2 hyper_cell steal_target = /obj/item/cell/hyper explanation_text = "Steal a hyper capacity power cell." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 90 if(1) return 85 if(2) return 80 if(3) return 75 if(4) return 75 get_weight(var/job) return 2 lucy steal_target = /obj/item/stack/sheet/diamond explanation_text = "Steal 10 diamonds." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 90 if(1) return 85 if(2) return 80 if(3) return 75 if(4) return 75 get_weight(var/job) return 2 check_completion() var/target_amount = 10 var/found_amount = 0.0//Always starts as zero. for(var/obj/item/I in owner.current.get_contents()) if(!istype(I, steal_target)) continue//If it's not actually that item. var/obj/item/stack/sheet/diamond/D = I found_amount += D.get_amount() return found_amount>=target_amount gold steal_target = /obj/item/stack/sheet/gold explanation_text = "Steal 50 gold bars." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 90 if(1) return 85 if(2) return 80 if(3) return 75 if(4) return 70 get_weight(var/job) return 2 check_completion() var/target_amount = 50 var/found_amount = 0.0//Always starts as zero. for(var/obj/item/I in owner.current.get_contents()) if(!istype(I, steal_target)) continue//If it's not actually that item. var/obj/item/stack/sheet/gold/G = I found_amount += G.get_amount() return found_amount>=target_amount uranium steal_target = /obj/item/stack/sheet/uranium explanation_text = "Steal 25 uranium bars." weight = 20 get_points(var/job) switch(GetRank(job)) if(0) return 90 if(1) return 85 if(2) return 80 if(3) return 75 if(4) return 70 get_weight(var/job) return 2 check_completion() var/target_amount = 25 var/found_amount = 0.0//Always starts as zero. for(var/obj/item/I in owner.current.get_contents()) if(!istype(I, steal_target)) continue//If it's not actually that item. var/obj/item/stack/sheet/uranium/U = I found_amount += U.get_amount() return found_amount>=target_amount /*Needs some work before it can be put in the game to differentiate ship implanters from syndicate implanters. steal/implanter steal_target = /obj/item/implanter explanation_text = "Steal an implanter" weight = 50 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return INFINITY */ cyborg steal_target = /obj/item/robot_parts/robot_suit explanation_text = "Steal a completed robot shell (no brain)" weight = 30 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return 20 check_completion() if(steal_target) for(var/obj/item/robot_parts/robot_suit/objective in owner.current.get_contents()) if(istype(objective,/obj/item/robot_parts/robot_suit) && objective.check_completion()) return 1 return 0 get_weight(var/job) return 20 AI steal_target = /obj/structure/AIcore explanation_text = "Steal a finished AI, either by intelliCore or stealing the whole construct." weight = 50 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return 20 get_weight(var/job) return 15 check_completion() if(steal_target) for(var/obj/item/aicard/C in owner.current.get_contents()) for(var/mob/living/silicon/ai/M in C) if(isAI(M) && M.stat != 2) return 1 for(var/mob/living/silicon/ai/M in world) if(istype(M.loc, /turf)) if(istype(get_area(M), /area/shuttle/escape)) return 1 for(var/obj/structure/AIcore/M in world) if(istype(M.loc, /turf) && M.state == 4) if(istype(get_area(M), /area/shuttle/escape)) return 1 return 0 drugs steal_target = /datum/reagent/drugs/bliss explanation_text = "Steal some bliss." weight = 40 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return 20 check_completion() if(steal_target) if(owner.current.check_contents_for_reagent(steal_target)) return 1 else return 0 get_weight(var/job) return 20 pacid steal_target = /datum/reagent/pacid explanation_text = "Steal some polytrinic acid." weight = 40 get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return 20 check_completion() if(steal_target) if(owner.current.check_contents_for_reagent(steal_target)) return 1 else return 0 get_weight(var/job) return 20 reagent weight = 20 var/target_name New(var/text,var/joba) ..() var/list/items = list(REAGENT_SACID, REAGENT_PACID, REAGENT_LUBE, REAGENT_MUTAGEN,\ REAGENT_LEPORAZINE, REAGENT_CRYPTOBIOLIN, REAGENT_LEXORIN,\ REAGENT_KELOTANE, REAGENT_DEXALIN, REAGENT_TRICORDRAZINE) target_name = pick(items) switch(target_name) if(REAGENT_SACID) steal_target = /datum/reagent/acid if(REAGENT_PACID) steal_target = /datum/reagent/pacid if(REAGENT_LUBE) steal_target = /datum/reagent/lube if(REAGENT_MUTAGEN) steal_target = /datum/reagent/mutagen if(REAGENT_LEPORAZINE) steal_target = /datum/reagent/leporazine if(REAGENT_CRYPTOBIOLIN) steal_target =/datum/reagent/cryptobiolin if(REAGENT_LEXORIN) steal_target = /datum/reagent/lexorin if(REAGENT_KELOTANE) steal_target = /datum/reagent/kelotane if(REAGENT_DEXALIN) steal_target = /datum/reagent/dexalin if(REAGENT_TRICORDRAZINE) steal_target = /datum/reagent/tricordrazine explanation_text = "Steal a container filled with [target_name]." get_points(var/job) switch(GetRank(job)) if(0) return 75 if(1) return 60 if(2) return 50 if(3) return 30 if(4) return 20 check_completion() if(steal_target) if(owner.current.check_contents_for_reagent(steal_target)) return 1 else return 0 get_weight(var/job) return 20 cash //must be in credits - atm and coins don't count var/steal_amount = 2000 explanation_text = "Beg, borrow or steal 2000 credits." weight = 20 New(var/text,var/joba) ..(text,joba) steal_amount = 1250 + rand(0,3750) explanation_text = "Beg, borrow or steal [steal_amount] credits." get_points(var/job) return 10 + 25 * round(steal_amount / 5000) check_completion() var/held_credits = 0 for(var/obj/item/spacecash/M in owner.current.get_contents()) held_credits += M.worth if(held_credits >= steal_amount) return 1 return 0 get_weight(var/job) return 20 nuclear explanation_text = "Destroy the station with a nuclear device." block explanation_text = "Do not allow any humans to escape on the shuttle alive." 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 world) if(player.type in protected_mobs) continue if (player.mind) if (player.stat != 2) if (get_turf(player) in shuttle) return 0 return 1 decapitate New(var/text,var/joba,var/datum/mind/targeta) target = targeta job = joba explanation_text = "Remove and recover the head of [target.current.real_name], the [target.assigned_role]." proc/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.role_alt_title ? target.role_alt_title : target.assigned_role], has defied us for the last time. Make an example of [T.him], and bring us [T.his] severed head." else explanation_text = "Free Objective" return target 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 [target.role_alt_title ? target.role_alt_title : (!role_type ? target.assigned_role : target.special_role)], has defied us for the last time. Make an example of [T.him], and bring us [T.his] severed head." else explanation_text = "Free Objective" return target check_completion() if(target && target.current) if(!owner.current||owner.current.stat==2)//If you're otherwise dead. return 0 var/list/all_items = owner.current.get_contents() for(var/obj/item/organ/head/mmi in all_items) if(mmi.brainmob&&mmi.brainmob.mind==target) return 1 return 0 else return 1 absorb var/target_amount proc/gen_amount_goal(var/lowbound = 4, var/highbound = 6) target_amount = rand (lowbound,highbound) if (ticker) var/n_p = 1 //autowin if (SSticker.current_state == GAME_STATE_SETTING_UP) for(var/mob/new_player/P in world) if(P.client && P.ready && P.mind!=owner) n_p ++ else if (SSticker.current_state == GAME_STATE_PLAYING) for(var/mob/living/carbon/human/P in world) if(P.client && !(P.mind in SSticker.mode.changelings) && P.mind!=owner) n_p ++ target_amount = min(target_amount, n_p) explanation_text = "Absorb [target_amount] compatible genomes." return target_amount check_completion() if(owner && owner.current && owner.current.changeling && owner.current.changeling.absorbed_dna && ((owner.current.changeling.absorbed_dna.len - 1) >= target_amount)) return 1 else return 0 meme_attune var/target_amount proc/gen_amount_goal(var/lowbound = 4, var/highbound = 6) target_amount = rand (lowbound,highbound) explanation_text = "Attune [target_amount] humanoid brains." return target_amount check_completion() if(owner && owner.current && istype(owner.current,/mob/living/parasite/meme) && (owner.current:indoctrinated.len >= target_amount)) return 1 else return 0 download var/target_amount proc/gen_amount_goal() target_amount = rand(10,20) explanation_text = "Download [target_amount] research levels." return target_amount 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(!S || !istype(S) || !S.stored_research.len) return 0 else for(var/datum/tech/current_data in S.stored_research) if(current_data.level>1) current_amount+=(current_data.level-1) if(current_amount