mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-01-07 16:12:24 +00:00
goodies. (Among them are a modified traitor beacon, a cloaking device and a closet full of resources so you can go build your own honk.) These rooms will spawn at least out of range of space and the explored pathways, so at the very least some mining is required to even detect them with mesons. Adds a borg upgrade system. Right now, it just contians a borg reset module that allows the borg to choose their module again. Adds some support code to borgs to suppot flashproofing and renaming. Adds a few various admin commands like a quick-list of objects (which is hardcoded) and a command to break the local air group. Revision: r3415 Author: VivianFoxfoot
1389 lines
36 KiB
Plaintext
1389 lines
36 KiB
Plaintext
/proc/GenerateTheft(var/job,var/datum/mind/traitor)
|
|
var/list/datum/objective/objectives = list()
|
|
var/list/weight = list()
|
|
var/index = 1
|
|
|
|
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)
|
|
weight += list("[index]" = target.weight)
|
|
objectives += target
|
|
index++
|
|
return list(objectives, weight)
|
|
|
|
/proc/GenerateAssassinate(var/job,var/datum/mind/traitor)
|
|
var/list/datum/objective/assassinate/missions = list()
|
|
var/list/weight = list()
|
|
var/index = 1
|
|
|
|
for(var/datum/mind/target in ticker.minds)
|
|
if((target != traitor) && istype(target.current, /mob/living/carbon/human))
|
|
if(target && target.current)
|
|
var/datum/objective/target_obj = new /datum/objective/assassinate(null,job,target)
|
|
weight += list("[index]" = target_obj.weight)
|
|
missions += target_obj
|
|
index++
|
|
return list(missions, weight)
|
|
|
|
/proc/GenerateFrame(var/job,var/datum/mind/traitor)
|
|
var/list/datum/objective/frame/missions = list()
|
|
var/list/weight = list()
|
|
var/index = 1
|
|
|
|
for(var/datum/mind/target in ticker.minds)
|
|
if((target != traitor) && istype(target.current, /mob/living/carbon/human))
|
|
if(target && target.current)
|
|
var/datum/objective/target_obj = new /datum/objective/frame(null,job,target)
|
|
weight += list("[index]" = target_obj.weight)
|
|
missions += target_obj
|
|
index++
|
|
return list(missions, weight)
|
|
|
|
/proc/GenerateProtection(var/job,var/datum/mind/traitor)
|
|
var/list/datum/objective/frame/missions = list()
|
|
var/list/weight = list()
|
|
var/index = 1
|
|
|
|
for(var/datum/mind/target in ticker.minds)
|
|
if((target != traitor) && istype(target.current, /mob/living/carbon/human))
|
|
if(target && target.current)
|
|
var/datum/objective/target_obj = new /datum/objective/protection(null,job,target)
|
|
weight += list("[index]" = target_obj.weight)
|
|
missions += target_obj
|
|
index++
|
|
return list(missions, weight)
|
|
|
|
/proc/PickObjectiveFromList(var/list/objectivesArray)
|
|
var/list/datum/objectives = objectivesArray[1]
|
|
var/pick_index = text2num(pickweight(objectivesArray[2]))
|
|
if (pick_index > objectives.len || pick_index < 1)
|
|
log_admin("Objective picking failed. Error logged. One or more traitors will need to be manually-assigned objectives. Pick_index was [pick_index]. Tell Sky.")
|
|
message_admins("Objective picking failed. Error logged. One or more traitors will need to be manually-assigned objectives. Pick_index was [pick_index]. Tell Sky.")
|
|
CRASH("Objective picking failed. Pick_index was [pick_index].")
|
|
|
|
return objectives[pick_index]
|
|
|
|
/proc/RemoveObjectiveFromList(var/list/objectiveArray, var/datum/objective/objective)
|
|
var/list/datum/objective/temp = objectiveArray[1]
|
|
var/list/weight = objectiveArray[2]
|
|
var/index = temp.Find(objective)
|
|
if(index == temp.len)
|
|
temp.Cut(index)
|
|
weight.Cut(index)
|
|
else
|
|
temp.Cut(index, index+1)
|
|
weight.Cut(index, index+1)
|
|
return list(temp,weight)
|
|
|
|
/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/points
|
|
var/totalweight
|
|
var/selectobj
|
|
var/conflict
|
|
|
|
while(totalweight < 100)
|
|
selectobj = rand(1,100) //Randomly determine the type of objective to be given.
|
|
if(!length(killobjectives[1]) || !length(protectobjectives[1])|| !length(frameobjectives[1])) //If any of these lists are empty, just give them theft objectives.
|
|
var/datum/objective/objective = PickObjectiveFromList(theftobjectives)
|
|
chosenobjectives += objective
|
|
totalweight += objective.points
|
|
theftobjectives = RemoveObjectiveFromList(theftobjectives, objective)
|
|
else switch(selectobj)
|
|
if(1 to 55) //Theft Objectives (55% chance)
|
|
var/datum/objective/objective = PickObjectiveFromList(theftobjectives)
|
|
for(1 to 10)
|
|
if(objective.points + totalweight <= 100)
|
|
break
|
|
objective = PickObjectiveFromList(theftobjectives)
|
|
chosenobjectives += objective
|
|
totalweight += objective.points
|
|
theftobjectives = RemoveObjectiveFromList(theftobjectives, objective)
|
|
if(56 to 92) //Assassination Objectives (37% chance)
|
|
var/datum/objective/assassinate/objective = PickObjectiveFromList(killobjectives)
|
|
world << objective
|
|
for(1 to 10)
|
|
if(objective.points + totalweight <= 100)
|
|
break
|
|
objective = PickObjectiveFromList(killobjectives)
|
|
if(!objective)
|
|
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
|
|
totalweight += objective.points
|
|
killobjectives = RemoveObjectiveFromList(killobjectives, objective)
|
|
conflict = 0
|
|
if(93 to 95) //Framing Objectives (3% chance)
|
|
var/datum/objective/objective = PickObjectiveFromList(frameobjectives)
|
|
for(1 to 10)
|
|
if(objective.points + totalweight <= 100)
|
|
break
|
|
objective = PickObjectiveFromList(frameobjectives)
|
|
if(!objective)
|
|
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
|
|
totalweight += objective.points
|
|
frameobjectives = RemoveObjectiveFromList(frameobjectives, objective)
|
|
conflict = 0
|
|
if(96 to 100) //Protection Objectives (5% chance)
|
|
var/datum/objective/protection/objective = PickObjectiveFromList(protectobjectives)
|
|
for(1 to 10)
|
|
if(objective.points + totalweight <= 100)
|
|
break
|
|
objective = PickObjectiveFromList(protectobjectives)
|
|
if(!objective)
|
|
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
|
|
totalweight += objective.points
|
|
protectobjectives = RemoveObjectiveFromList(protectobjectives, objective)
|
|
conflict = 0
|
|
|
|
var/hasendgame = 0
|
|
for(var/datum/objective/o in chosenobjectives)
|
|
if(o.type == /datum/objective/hijack || o.type == /datum/objective/escape)
|
|
hasendgame = 1
|
|
break
|
|
for(var/datum/objective/o in chosenobjectives)
|
|
if(o.explanation_text == "Free Objective")
|
|
del(o) //Cleaning up any sillies.
|
|
if(hasendgame == 0)
|
|
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 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
|
|
|
|
|
|
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.location<2)
|
|
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 relative of a high ranking Syndicate Leader. Make sure they get off the ship safely, while minimizing intervention."
|
|
|
|
check_completion()
|
|
if(emergency_shuttle.location<2)
|
|
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.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 ticker.minds)
|
|
if((possible_target != owner) && istype(possible_target.current, /mob/living/carbon/human) && (possible_target.assigned_role == role))
|
|
target = possible_target
|
|
break
|
|
|
|
if(target && target.current)
|
|
explanation_text = "Assassinate [target.current.real_name], the [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 ticker.minds)
|
|
if((possible_target != owner) && istype(possible_target.current, /mob/living/carbon/human))
|
|
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.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 ticker.minds)
|
|
if((possible_target != owner) && istype(possible_target.current, /mob/living/carbon/human) && (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.location<2)
|
|
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.location<2)
|
|
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/weapon/gun/energy/laser/captain
|
|
explanation_text = "Steal the captain'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/weapon/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:toxins) 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/weapon/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/weapon/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/weapon/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/weapon/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/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/weapon/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/weapon/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/weapon/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/weapon/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/weapon/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.
|
|
found_amount += I: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.
|
|
found_amount += I: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.
|
|
found_amount += I: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/weapon/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 cyborg 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 intellicard 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/device/aicard/C in owner.current.get_contents())
|
|
for(var/mob/living/silicon/ai/M in C)
|
|
if(istype(M, /mob/living/silicon/ai) && 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/space_drugs
|
|
explanation_text = "Steal some space drugs."
|
|
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
|
|
var/target_name
|
|
New(var/text,var/joba)
|
|
..()
|
|
var/list/items = list("Sulphuric acid", "Polytrinic acid", "Space Lube", "Unstable mutagen",\
|
|
"Leporazine", "Cryptobiolin", "Lexorin ",\
|
|
"Kelotane", "Dexalin", "Tricordrazine")
|
|
target_name = pick(items)
|
|
switch(target_name)
|
|
if("Sulphuric acid")
|
|
steal_target = /datum/reagent/acid
|
|
if("Polytrinic acid")
|
|
steal_target = /datum/reagent/pacid
|
|
if("Space Lube")
|
|
steal_target = /datum/reagent/lube
|
|
if("Unstable mutagen")
|
|
steal_target = /datum/reagent/mutagen
|
|
if("Leporazine")
|
|
steal_target = /datum/reagent/leporazine
|
|
if("Cryptobiolin")
|
|
steal_target =/datum/reagent/cryptobiolin
|
|
if("Lexorin")
|
|
steal_target = /datum/reagent/lexorin
|
|
if("Kelotane")
|
|
steal_target = /datum/reagent/kelotane
|
|
if("Dexalin")
|
|
steal_target = /datum/reagent/dexalin
|
|
if("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
|
|
|
|
|
|
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.location<2)
|
|
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)
|
|
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 him, and bring us 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)
|
|
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 him, and bring us 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/weapon/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 (ticker.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 (ticker.current_state == GAME_STATE_PLAYING)
|
|
for(var/mob/living/carbon/human/P in world)
|
|
if(P.client && !(P.mind in ticker.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
|
|
|
|
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
|
|
if(!(istype(owner.current:wear_suit, /obj/item/clothing/suit/space/space_ninja)&&owner.current:wear_suit:s_initialized))
|
|
return 0
|
|
var/current_amount
|
|
var/obj/item/clothing/suit/space/space_ninja/S = owner.current:wear_suit
|
|
if(!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<target_amount) return 0
|
|
return 1
|
|
|
|
|
|
debrain//I want braaaainssss
|
|
New(var/text,var/joba,var/datum/mind/targeta)
|
|
target = targeta
|
|
job = joba
|
|
explanation_text = "Remove and recover the brain of [target.current.real_name], the [target.assigned_role]."
|
|
|
|
proc/find_target()
|
|
..()
|
|
if(target && target.current)
|
|
explanation_text = "Steal the brain of [target.current.real_name]."
|
|
else
|
|
explanation_text = "Free Objective"
|
|
return target
|
|
|
|
|
|
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 [target.role_alt_title ? target.role_alt_title : (!role_type ? target.assigned_role : target.special_role)]."
|
|
else
|
|
explanation_text = "Free Objective"
|
|
return target
|
|
|
|
|
|
check_completion()
|
|
if(!target)//If it's a free objective.
|
|
return 1
|
|
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/device/mmi/mmi in all_items)
|
|
if(mmi.brainmob&&mmi.brainmob.mind==target) return 1
|
|
for(var/obj/item/brain/brain in all_items)
|
|
if(brain.brainmob&&brain.brainmob.mind==target) return 1
|
|
return 0
|
|
|
|
mutiny
|
|
proc/find_target()
|
|
..()
|
|
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
|
|
|
|
|
|
find_target_by_role(role, role_type=0)
|
|
..(role, role_type)
|
|
if(target && target.current)
|
|
explanation_text = "Assassinate [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
|
|
|
|
|
|
check_completion()
|
|
if(target && target.current)
|
|
var/turf/T = get_turf(target.current)
|
|
if(target.current.stat == 2)
|
|
return 1
|
|
else if((T) && (T.z != 1))//If they leave the station they count as dead for this
|
|
return 2
|
|
else
|
|
return 0
|
|
else
|
|
return 1
|
|
|
|
capture
|
|
var/target_amount
|
|
proc/gen_amount_goal()
|
|
target_amount = rand(5,10)
|
|
explanation_text = "Accumulate [target_amount] capture points."
|
|
return target_amount
|
|
|
|
|
|
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.
|
|
if(M.stat==2)//Dead folks are worth less.
|
|
captured_amount+=0.5
|
|
continue
|
|
captured_amount+=1
|
|
for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure.
|
|
captured_amount+=0.1
|
|
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
|
|
for(var/mob/living/carbon/alien/humanoid/M in A)//Aliens are worth twice as much as humans.
|
|
if(istype(M, /mob/living/carbon/alien/humanoid/queen))//Queens are worth three times as much as humans.
|
|
if(M.stat==2)
|
|
captured_amount+=1.5
|
|
else
|
|
captured_amount+=3
|
|
continue
|
|
if(M.stat==2)
|
|
captured_amount+=1
|
|
continue
|
|
captured_amount+=2
|
|
if(captured_amount<target_amount)
|
|
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."
|
|
|
|
check_completion()
|
|
if(emergency_shuttle.location<2)
|
|
return 0
|
|
|
|
var/area/shuttle = locate(/area/shuttle/escape/centcom)
|
|
var/area/pod1 = locate(/area/shuttle/escape_pod1/centcom)
|
|
var/area/pod2 = locate(/area/shuttle/escape_pod2/centcom)
|
|
var/area/pod3 = locate(/area/shuttle/escape_pod3/centcom)
|
|
var/area/pod4 = locate(/area/shuttle/escape_pod5/centcom)
|
|
|
|
for(var/mob/living/player in world)
|
|
if (player == owner.current)
|
|
continue
|
|
if (player.mind)
|
|
if (player.stat != 2)
|
|
if (get_turf(player) in shuttle)
|
|
return 0
|
|
if (get_turf(player) in pod1)
|
|
return 0
|
|
if (get_turf(player) in pod2)
|
|
return 0
|
|
if (get_turf(player) in pod3)
|
|
return 0
|
|
if (get_turf(player) in pod4)
|
|
return 0
|
|
return 1
|