mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-28 07:38:05 +01:00
Merge pull request #10129 from AnturK/ayy
Abductors fixes and improvements
This commit is contained in:
@@ -1,14 +1,16 @@
|
||||
/datum/game_mode
|
||||
var/abductor_teams = 0
|
||||
var/list/datum/mind/abductors = list()
|
||||
var/list/datum/mind/abductees = list()
|
||||
|
||||
/datum/game_mode/abduction
|
||||
name = "Abduction"
|
||||
name = "abduction"
|
||||
config_tag = "abduction"
|
||||
antag_flag = BE_ABDUCTOR
|
||||
recommended_enemies = 2
|
||||
required_players = 15
|
||||
var/max_teams = 4
|
||||
var/teams = 1
|
||||
abductor_teams = 1
|
||||
var/list/datum/mind/scientists = list()
|
||||
var/list/datum/mind/agents = list()
|
||||
var/list/datum/objective/team_objectives = list()
|
||||
@@ -17,19 +19,22 @@
|
||||
|
||||
/datum/game_mode/abduction/announce()
|
||||
world << "<B>The current game mode is - Abduction!</B>"
|
||||
world << "There are alien <b>abductors</b> sent to [world.name] to perform nefarious experiments!"
|
||||
world << "<b>Abductors</b> - kidnap the crew and replace their organs with experimental ones."
|
||||
world << "<b>Crew</b> - don't get abducted and stop the abductors."
|
||||
|
||||
/datum/game_mode/abduction/pre_setup()
|
||||
teams = max(1, min(max_teams,round(num_players()/config.abductor_scaling_coeff)))
|
||||
abductor_teams = max(1, min(max_teams,round(num_players()/config.abductor_scaling_coeff)))
|
||||
var/possible_teams = max(1,round(antag_candidates.len / 2))
|
||||
teams = min(teams,possible_teams)
|
||||
abductor_teams = min(abductor_teams,possible_teams)
|
||||
|
||||
abductors.len = 2*teams
|
||||
scientists.len = teams
|
||||
agents.len = teams
|
||||
team_objectives.len = teams
|
||||
team_names.len = teams
|
||||
abductors.len = 2*abductor_teams
|
||||
scientists.len = abductor_teams
|
||||
agents.len = abductor_teams
|
||||
team_objectives.len = abductor_teams
|
||||
team_names.len = abductor_teams
|
||||
|
||||
for(var/i=1,i<=teams,i++)
|
||||
for(var/i=1,i<=abductor_teams,i++)
|
||||
if(!make_abductor_team(i))
|
||||
return 0
|
||||
|
||||
@@ -64,12 +69,12 @@
|
||||
agent = preset_agent
|
||||
|
||||
|
||||
scientist.assigned_role = "Abductor"
|
||||
scientist.special_role = "Abductor"
|
||||
scientist.assigned_role = "abductor scientist"
|
||||
scientist.special_role = "abductor scientist"
|
||||
log_game("[scientist.key] (ckey) has been selected as an abductor team [team_number] scientist.")
|
||||
|
||||
agent.assigned_role = "Abductor"
|
||||
agent.special_role = "Abductor"
|
||||
agent.assigned_role = "abductor agent"
|
||||
agent.special_role = "abductor agent"
|
||||
log_game("[agent.key] (ckey) has been selected as an abductor team [team_number] agent.")
|
||||
|
||||
abductors |= agent
|
||||
@@ -96,7 +101,7 @@
|
||||
var/team_name
|
||||
var/mob/living/carbon/human/H
|
||||
var/datum/species/abductor/S
|
||||
for(var/team_number=1,team_number<=teams,team_number++)
|
||||
for(var/team_number=1,team_number<=abductor_teams,team_number++)
|
||||
team_name = team_names[team_number]
|
||||
agent = agents[team_number]
|
||||
H = agent.current
|
||||
@@ -134,6 +139,7 @@
|
||||
agent_landmarks.len = max_teams
|
||||
scientist_landmarks.len = max_teams
|
||||
for(var/obj/effect/landmark/abductor/A in landmarks_list)
|
||||
world << "Found this [A]"
|
||||
if(istype(A,/obj/effect/landmark/abductor/agent))
|
||||
agent_landmarks[text2num(A.team)] = A
|
||||
else if(istype(A,/obj/effect/landmark/abductor/scientist))
|
||||
@@ -180,8 +186,8 @@
|
||||
abductor.objectives += team_objectives[team_number]
|
||||
var/team_name = team_names[team_number]
|
||||
|
||||
abductor.current << "<span class='notice'>You are an Abductor Agent of [team_name]!</span>"
|
||||
abductor.current << "<span class='notice'>With the help of your teammate kidnap and experiment on station members!</span>"
|
||||
abductor.current << "<span class='notice'>You are an agent of [team_name]!</span>"
|
||||
abductor.current << "<span class='notice'>With the help of your teammate, kidnap and experiment on station crew members!</span>"
|
||||
abductor.current << "<span class='notice'>Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve.</span>"
|
||||
|
||||
var/obj_count = 1
|
||||
@@ -194,8 +200,8 @@
|
||||
abductor.objectives += team_objectives[team_number]
|
||||
var/team_name = team_names[team_number]
|
||||
|
||||
abductor.current << "<span class='notice'>You are an Abductor Scientist of [team_name]!</span>"
|
||||
abductor.current << "<span class='notice'>With the help of your teammate kidnap and experiment on station members!</span>"
|
||||
abductor.current << "<span class='notice'>You are a scientist of [team_name]!</span>"
|
||||
abductor.current << "<span class='notice'>With the help of your teammate, kidnap and experiment on station crew members!</span>"
|
||||
abductor.current << "<span class='notice'>Use your tool and ship consoles to support the agent and retrieve human specimens.</span>"
|
||||
|
||||
var/obj_count = 1
|
||||
@@ -260,7 +266,7 @@
|
||||
|
||||
/datum/game_mode/abduction/check_finished()
|
||||
if(!finished)
|
||||
for(var/team_number=1,team_number<=teams,team_number++)
|
||||
for(var/team_number=1,team_number<=abductor_teams,team_number++)
|
||||
var/obj/machinery/abductor/console/con = get_team_console(team_number)
|
||||
var/datum/objective/objective = team_objectives[team_number]
|
||||
if (con.experiment.points >= objective.target_amount)
|
||||
@@ -270,52 +276,32 @@
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/abduction/declare_completion()
|
||||
world << "<br><font size=3><b>The Abductors were:</b></font>"
|
||||
for(var/team_number=1,team_number<=teams,team_number++)
|
||||
for(var/team_number=1,team_number<=abductor_teams,team_number++)
|
||||
var/obj/machinery/abductor/console/console = get_team_console(team_number)
|
||||
var/datum/objective/objective = team_objectives[team_number]
|
||||
var/team_name = team_names[team_number]
|
||||
var/datum/mind/amind = agents[team_number]
|
||||
var/datum/mind/smind = scientists[team_number]
|
||||
var/mob/living/carbon/human/agent = amind.current
|
||||
var/mob/living/carbon/human/scientist = smind.current
|
||||
if (console.experiment.points >= objective.target_amount)
|
||||
world << "<font size = 3 color='green'><b>[team_name] team fullfilled its mission! </b></font>"
|
||||
world << "<b>Team Members : [agent.name]([agent.ckey]),[scientist.name]([scientist.ckey])</b>"
|
||||
if(console.experiment.points >= objective.target_amount)
|
||||
world << "<span class='greentext'><b>[team_name] team fullfilled its mission!</b></span>"
|
||||
else
|
||||
world << "<font size = 3 color='red'><b>[team_name] team failed its mission! </b></font>"
|
||||
world << "<b>Team Members</b>: [agent.name]([agent.ckey])<br>[scientist.name]([scientist.ckey])"
|
||||
|
||||
world << "<br><font size=2><b>The Abductees were:</b></font>"
|
||||
display_abductees(console)
|
||||
|
||||
world << "<span class='greentext'><b>[team_name] team failed its mission.</b></span>"
|
||||
..()
|
||||
return 1
|
||||
|
||||
/datum/game_mode/abduction/proc/display_abductees(var/obj/machinery/abductor/console/console)
|
||||
var/list/mob/living/abductees = console.experiment.history
|
||||
for(var/mob/living/abductee in abductees)
|
||||
if(!abductee.mind)
|
||||
continue
|
||||
world << printplayer(abductee.mind)
|
||||
world << printobjectives(abductee.mind)
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_abduction()
|
||||
if(abductors.len && ticker.mode.config_tag != "abduction") // no repeating for the gamemode
|
||||
world << "<br><font size=3><b>The Abductors were:</b></font>"
|
||||
for(var/datum/mind/M in abductors)
|
||||
world << "<font size = 2><b>Abductor [M.current ? M.current.name : "Abductor"]([M.key])</b></font>"
|
||||
world << printobjectives(M)
|
||||
world << "<br><font size=3><b>The Abductees were:</b></font>"
|
||||
var/list/full_history = list()
|
||||
for(var/obj/machinery/abductor/console/C in machines)
|
||||
full_history |= C.experiment.history
|
||||
for(var/mob/living/abductee in full_history)
|
||||
if(!abductee.mind)
|
||||
continue
|
||||
world << printplayer(abductee.mind)
|
||||
world << printobjectives(abductee.mind)
|
||||
return
|
||||
var/text = ""
|
||||
if(abductors.len)
|
||||
text += "<br><span class='big'><b>The abductors were:</b></span>"
|
||||
for(var/datum/mind/abductor_mind in abductors)
|
||||
text += printplayer(abductor_mind)
|
||||
text += printobjectives(abductor_mind)
|
||||
text += "<br>"
|
||||
if(abductees.len)
|
||||
text += "<br><span class='big'><b>The abductees were:</b></span>"
|
||||
for(var/datum/mind/abductee_mind in abductees)
|
||||
text += printplayer(abductee_mind)
|
||||
text += printobjectives(abductee_mind)
|
||||
text += "<br>"
|
||||
world << text
|
||||
|
||||
//Landmarks
|
||||
// TODO: Split into seperate landmarks for prettier ships
|
||||
@@ -342,16 +328,18 @@
|
||||
var/team
|
||||
|
||||
/datum/objective/experiment/New()
|
||||
explanation_text = "Experiment on [target_amount] humans"
|
||||
explanation_text = "Experiment on [target_amount] humans."
|
||||
|
||||
/datum/objective/experiment/check_completion()
|
||||
if(!owner.current || !ishuman(owner.current))
|
||||
return 0
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
if(!H.dna || !H.dna.species || !(H.dna.species.id == "abductor"))
|
||||
return 0
|
||||
var/datum/species/abductor/S = H.dna.species
|
||||
var/ab_team = S.team
|
||||
var/ab_team = team
|
||||
if(owner)
|
||||
if(!owner.current || !ishuman(owner.current))
|
||||
return 0
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
if(!H.dna || !H.dna.species || !(H.dna.species.id == "abductor"))
|
||||
return 0
|
||||
var/datum/species/abductor/S = H.dna.species
|
||||
ab_team = S.team
|
||||
for(var/obj/machinery/abductor/experiment/E in machines)
|
||||
if(E.team == ab_team)
|
||||
if(E.points >= target_amount)
|
||||
@@ -368,8 +356,8 @@
|
||||
explanation_text = "Steal all"
|
||||
|
||||
/datum/objective/abductee/steal/New()
|
||||
var/target = pick(list("Pets","Lights","Monkeys","Fruits","Shoes","Soap Bars"))
|
||||
explanation_text+=" [target]"
|
||||
var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap"))
|
||||
explanation_text+=" [target]."
|
||||
|
||||
/datum/objective/abductee/capture
|
||||
explanation_text = "Capture"
|
||||
@@ -381,7 +369,7 @@
|
||||
jobs -= J
|
||||
if(jobs.len > 0)
|
||||
var/datum/job/target = pick(jobs)
|
||||
explanation_text += " \a [target.title]."
|
||||
explanation_text += " a [target.title]."
|
||||
else
|
||||
explanation_text += " someone."
|
||||
|
||||
@@ -389,4 +377,84 @@
|
||||
explanation_text = "You must escape the station! Get the shuttle called!"
|
||||
|
||||
/datum/objective/abductee/noclone
|
||||
explanation_text = "Don't allow anyone to be cloned."
|
||||
explanation_text = "Don't allow anyone to be cloned."
|
||||
|
||||
/datum/objective/abductee/oxygen
|
||||
explanation_text = "The oxygen is killing them all and they don't even know it. Make sure no oxygen is on the station."
|
||||
|
||||
/datum/objective/abductee/blazeit
|
||||
explanation_text = "Your body must be improved. Ingest as many drugs as you can."
|
||||
|
||||
/datum/objective/abductee/yumyum
|
||||
explanation_text = "You are hungry. Eat as much food as you can find."
|
||||
|
||||
/datum/objective/abductee/insane
|
||||
explanation_text = "You see you see what they cannot you see the open door you seeE you SEeEe you SEe yOU seEee SHOW THEM ALL"
|
||||
|
||||
/datum/objective/abductee/cannotmove
|
||||
explanation_text = "Convince the crew that you are a paraplegic."
|
||||
|
||||
/datum/objective/abductee/deadbodies
|
||||
explanation_text = "Start a collection of corpses. Don't kill people to get these corpses."
|
||||
|
||||
/datum/objective/abductee/floors
|
||||
explanation_text = "Replace all the floor tiles with carpeting, wooden boards, or grass."
|
||||
|
||||
/datum/objective/abductee/POWERUNLIMITED
|
||||
explanation_text = "Flood the station's powernet with as much electricity as you can."
|
||||
|
||||
/datum/objective/abductee/pristine
|
||||
explanation_text = "Ensure the station is in absolutely pristine condition."
|
||||
|
||||
/datum/objective/abductee/window
|
||||
explanation_text = "Replace all normal windows with reinforced windows."
|
||||
|
||||
/datum/objective/abductee/nations
|
||||
explanation_text = "Ensure your department prospers over all else."
|
||||
|
||||
/datum/objective/abductee/abductception
|
||||
explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine."
|
||||
|
||||
/datum/objective/abductee/ghosts
|
||||
explanation_text = "Conduct a seance with the spirits of the afterlife."
|
||||
|
||||
/datum/objective/abductee/summon
|
||||
explanation_text = "Conduct a ritual to summon an elder god."
|
||||
|
||||
/datum/objective/abductee/machine
|
||||
explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power."
|
||||
|
||||
/datum/objective/abductee/prevent
|
||||
explanation_text = "You have been enlightened. This knowledge must not escape. Ensure nobody else can become enlightened."
|
||||
|
||||
/datum/objective/abductee/calling
|
||||
explanation_text = "Call forth a spirit from the other side."
|
||||
|
||||
/datum/objective/abductee/calling/New()
|
||||
var/mob/dead/D = pick(dead_mob_list)
|
||||
if(D)
|
||||
explanation_text = "You know that [D] has perished. Call them from the spirit realm."
|
||||
|
||||
/datum/objective/abductee/social_experiment
|
||||
explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth."
|
||||
|
||||
/datum/objective/abductee/vr
|
||||
explanation_text = "It's all an entirely virtual simulation within an underground vault. Convince the crew to escape the shackles of VR."
|
||||
|
||||
/datum/objective/abductee/pets
|
||||
explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!"
|
||||
|
||||
/datum/objective/abductee/defect
|
||||
explanation_text = "Defect from your employer."
|
||||
|
||||
/datum/objective/abductee/promote
|
||||
explanation_text = "Climb the corporate ladder all the way to the top!"
|
||||
|
||||
/datum/objective/abductee/science
|
||||
explanation_text = "So much lies undiscovered. Look deeper into the machinations of the universe."
|
||||
|
||||
/datum/objective/abductee/build
|
||||
explanation_text = "Expand the station."
|
||||
|
||||
/datum/objective/abductee/pragnant
|
||||
explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby."
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
|
||||
//AGENT VEST
|
||||
/obj/item/clothing/suit/armor/abductor/vest
|
||||
name = "Agent Vest"
|
||||
desc = "Vest outfitted with alien stealth technology."
|
||||
name = "agent vest"
|
||||
desc = "A vest outfitted with advanced stealth technology. It has two modes - combat and stealth."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "vest_stealth"
|
||||
item_state = "armor"
|
||||
@@ -134,8 +134,8 @@
|
||||
return S.scientist
|
||||
|
||||
/obj/item/device/abductor/gizmo
|
||||
name = "Science Tool"
|
||||
desc = "Alien science is 90% dissections 10% probings."
|
||||
name = "science tool"
|
||||
desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "gizmo_scan"
|
||||
item_state = "silencer"
|
||||
@@ -189,7 +189,7 @@
|
||||
if(istype(target,/mob/living/carbon/human))
|
||||
if(console!=null)
|
||||
console.AddSnapshot(target)
|
||||
user << "<span class='notice'>You scan and add the being to the database</span>"
|
||||
user << "<span class='notice'>You scan [target] and add them to the database.</span>"
|
||||
|
||||
/obj/item/device/abductor/gizmo/proc/mark(var/atom/target, var/mob/living/user)
|
||||
if(marked == target)
|
||||
@@ -198,7 +198,7 @@
|
||||
if(istype(target,/mob/living/carbon/human))
|
||||
if(IsAbductor(target))
|
||||
marked = target
|
||||
user << "<span class='notice'>You mark the target for future retrieval.</span>"
|
||||
user << "<span class='notice'>You mark [target] for future retrieval.</span>"
|
||||
else
|
||||
prepare(target,user)
|
||||
else
|
||||
@@ -208,15 +208,15 @@
|
||||
if(get_dist(target,user)>1)
|
||||
user << "<span class='warning'>You need to be next to the specimen to prepare it for transport!</span>"
|
||||
return
|
||||
user << "<span class='notice'>You start preparing the specimen for transport...</span>"
|
||||
user << "<span class='notice'>You begin preparing [target] for transport...</span>"
|
||||
if(do_after(user, 100, target = target))
|
||||
marked = target
|
||||
user << "<span class='notice'>You finish preparing the specimen for transport.</span>"
|
||||
user << "<span class='notice'>You finish preparing [target] for transport.</span>"
|
||||
|
||||
|
||||
/obj/item/device/abductor/silencer
|
||||
name = "Abductor Silencer"
|
||||
desc = "Device used to break communication equipment"
|
||||
name = "abductor silencer"
|
||||
desc = "A compact device used to shut down communications equipment."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "silencer"
|
||||
item_state = "gizmo"
|
||||
@@ -244,7 +244,7 @@
|
||||
for(M in view(2,targloc))
|
||||
if(M == user)
|
||||
continue
|
||||
user << "<span class='notice'>You silence [M.name] radio devices.</span>"
|
||||
user << "<span class='notice'>You silence [M]'s radio devices.</span>"
|
||||
radio_off_mob(M)
|
||||
|
||||
/obj/item/device/abductor/silencer/proc/radio_off_mob(var/mob/living/carbon/human/M)
|
||||
@@ -259,8 +259,8 @@
|
||||
|
||||
|
||||
/obj/item/weapon/implant/abductor
|
||||
name = "Emergency Beam"
|
||||
desc = "Gets you back on the ship."
|
||||
name = "recall implant"
|
||||
desc = "Returns you to the mothership."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "implant"
|
||||
activated = 1
|
||||
@@ -273,7 +273,7 @@
|
||||
cooldown = 0
|
||||
SSobj.processing |= src
|
||||
else
|
||||
imp_in << "<span class='warning'>The emergency beam is still recharging!</span>"
|
||||
imp_in << "<span class='warning'>You must wait [30 - cooldown] seconds to use [src] again!</span>"
|
||||
return
|
||||
|
||||
/obj/item/weapon/implant/abductor/process()
|
||||
@@ -284,9 +284,9 @@
|
||||
|
||||
|
||||
/obj/item/device/firing_pin/alien
|
||||
name = "alien-looking pin"
|
||||
desc = "Only non-humans can use this pin"
|
||||
fail_message = "<span class='alienwarning'>Human DNA detected! Authorization revoked!</span>"
|
||||
name = "alien firing pin"
|
||||
desc = "An odd device that resembles a firing pin."
|
||||
fail_message = "<span class='alienwarning'>UNAUTHORIZED -- UNAUTHORIZED</span>"
|
||||
|
||||
/obj/item/device/firing_pin/alien/pin_auth(mob/living/user)
|
||||
if(ishuman(user))
|
||||
@@ -329,7 +329,8 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
#define BATON_MODES 4
|
||||
|
||||
/obj/item/weapon/abductor_baton
|
||||
name = "Advanced Baton"
|
||||
name = "advanced baton"
|
||||
desc = "A quad-mode baton used for incapacitation and restraining of specimens."
|
||||
var/mode = BATON_STUN
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "wonderprod"
|
||||
@@ -345,15 +346,15 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
var/txt
|
||||
switch(mode)
|
||||
if(BATON_STUN)
|
||||
txt = "stun"
|
||||
txt = "stunning"
|
||||
if(BATON_SLEEP)
|
||||
txt = "sleep inducment"
|
||||
txt = "sleep inducement"
|
||||
if(BATON_CUFF)
|
||||
txt = "restraining"
|
||||
if(BATON_PROBE)
|
||||
txt = "probing"
|
||||
|
||||
usr << "<span class='notice'>You switch the baton to [txt] mode</span>"
|
||||
usr << "<span class='notice'>You switch the baton to [txt] mode.</span>"
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/abductor_baton/update_icon()
|
||||
@@ -439,8 +440,8 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
var/mob/living/carbon/C = L
|
||||
if(!C.handcuffed)
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
|
||||
C.visible_message("<span class='danger'>[user] is trying to put energy cuffs on [C]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to put energy cuffs on [C]!</span>")
|
||||
C.visible_message("<span class='danger'>[user] begins restraining [C] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] begins shaping an energy field around your hands!</span>")
|
||||
if(do_mob(user, C, 30))
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(C)
|
||||
@@ -453,30 +454,30 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
|
||||
/obj/item/weapon/abductor_baton/proc/ProbeAttack(mob/living/L,mob/living/user)
|
||||
L.visible_message("<span class='danger'>[user] probes [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] probed [L]!</span>")
|
||||
"<span class='userdanger'>[user] probes you!</span>")
|
||||
|
||||
var/species = "<span class='warning'>Unknown Species</span>"
|
||||
var/species = "<span class='warning'>Unknown species</span>"
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.dna && H.dna.species)
|
||||
species = "<span clas=='notice'>[H.dna.species.name]</span>"
|
||||
if(L.mind && L.mind.changeling)
|
||||
species = "<span class='warning'>Changeling Lifeform</span>"
|
||||
user << "<span class='notice'>Probing Result:</span>[species]"
|
||||
species = "<span class='warning'>Changeling lifeform</span>"
|
||||
user << "<span class='notice'>Probing result:</span>[species]"
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy
|
||||
name = "energy cuffs"
|
||||
desc = "Energy field restraining the hands."
|
||||
name = "hard-light energy field"
|
||||
desc = "A hard-light field restraining the hands."
|
||||
icon_state = "cuff_white" // Needs sprite
|
||||
breakouttime = 450
|
||||
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy/used
|
||||
desc = "Energy Discharge"
|
||||
desc = "energy discharge"
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy/used/dropped(mob/user)
|
||||
user.visible_message("<span class='danger'>[user] cuffs break in a discharge of energy!</span>", \
|
||||
"<span class='userdanger'>[user] cuffs break in a discharge of energy!</span>")
|
||||
user.visible_message("<span class='danger'>[user]'s [src] break in a discharge of energy!</span>", \
|
||||
"<span class='userdanger'>[user]'s [src] break in a discharge of energy!</span>")
|
||||
var/datum/effect/effect/system/spark_spread/S = new
|
||||
S.set_up(4,0,user.loc)
|
||||
S.start()
|
||||
@@ -488,9 +489,11 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
if(BATON_STUN)
|
||||
user <<"<span class='warning'>The baton is in stun mode.</span>"
|
||||
if(BATON_SLEEP)
|
||||
user <<"<span class='warning'>The baton is in sleep induction mode.</span>"
|
||||
user <<"<span class='warning'>The baton is in sleep inducement mode.</span>"
|
||||
if(BATON_CUFF)
|
||||
user <<"<span class='warning'>The baton is in restrain mode.</span>"
|
||||
user <<"<span class='warning'>The baton is in restraining mode.</span>"
|
||||
if(BATON_PROBE)
|
||||
user << "<span class='warning'>The baton is in probing mode.</span>"
|
||||
|
||||
|
||||
/obj/item/weapon/scalpel/alien
|
||||
@@ -518,8 +521,8 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
|
||||
/obj/item/clothing/head/helmet/abductor
|
||||
name = "Agent Headgear"
|
||||
desc = "Abducting with style. Spiky style. Prevents digital tracking."
|
||||
name = "agent headgear"
|
||||
desc = "Abduct with style - spiky style. Prevents digital tracking."
|
||||
icon_state = "alienhelmet"
|
||||
item_state = "alienhelmet"
|
||||
blockTracking = 1
|
||||
@@ -546,6 +549,6 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
|
||||
/obj/structure/closet/abductor
|
||||
name = "alien locker"
|
||||
desc = "Contains secrets of the universe"
|
||||
desc = "Contains secrets of the universe."
|
||||
icon_state = "abductor"
|
||||
icon_door = "abductor"
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/gland/
|
||||
name = "Fleshy mass"
|
||||
desc = "Eww"
|
||||
name = "fleshy mass"
|
||||
desc = "A nausea-inducing hunk of twisting flesh and metal."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "gland"
|
||||
var/cooldown_low = 300
|
||||
@@ -51,7 +51,7 @@
|
||||
icon_state = "health"
|
||||
|
||||
/obj/item/gland/heals/activate()
|
||||
host << "<span class='notice'>You feel weird.</span>"
|
||||
host << "<span class='notice'>You feel curiously revitalized.</span>"
|
||||
host.adjustBruteLoss(-20)
|
||||
host.adjustOxyLoss(-20)
|
||||
host.adjustFireLoss(-20)
|
||||
@@ -63,7 +63,9 @@
|
||||
icon_state = "slime"
|
||||
|
||||
/obj/item/gland/slime/activate()
|
||||
host << "<span class='notice'>You feel weird.</span>"
|
||||
host << "<span class='warning'>You feel nauseous!</span>"
|
||||
if(host.is_muzzled())
|
||||
host << "<span class='warning'>The muzzle prevents you from vomiting!</span>"
|
||||
|
||||
host.visible_message("<span class='danger'>[host] vomits on the floor!</span>", \
|
||||
"<span class='userdanger'>You throw up on the floor!</span>")
|
||||
@@ -86,7 +88,7 @@
|
||||
icon_state = "mindshock"
|
||||
|
||||
/obj/item/gland/mindshock/activate()
|
||||
host << "<span class='notice'>You feel weird.</span>"
|
||||
host << "<span class='notice'>You get a headache.</span>"
|
||||
|
||||
var/turf/T = get_turf(host)
|
||||
for(var/mob/living/carbon/human/H in orange(4,T))
|
||||
@@ -102,7 +104,7 @@
|
||||
icon_state = "species"
|
||||
|
||||
/obj/item/gland/pop/activate()
|
||||
host << "<span class='notice'>You feel weird.</span>"
|
||||
host << "<span class='notice'>You feel unlike yourself.</span>"
|
||||
var/species = pick(list(/datum/species/lizard,/datum/species/slime,/datum/species/plant/pod,/datum/species/fly))
|
||||
hardset_dna(host, null, null, null, null, species)
|
||||
host.regenerate_icons()
|
||||
@@ -115,7 +117,6 @@
|
||||
icon_state = "vent"
|
||||
|
||||
/obj/item/gland/ventcrawling/activate()
|
||||
host << "<span class='notice'>You feel weird.</span>"
|
||||
host << "<span class='notice'>You feel very stretchy.</span>"
|
||||
host.ventcrawler = 2
|
||||
return
|
||||
@@ -128,6 +129,7 @@
|
||||
icon_state = "viral"
|
||||
|
||||
/obj/item/gland/viral/activate()
|
||||
host << "<span class='warning'>You feel sick.</span>"
|
||||
var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis)
|
||||
var/datum/disease/D = new virus_type()
|
||||
D.carrier = 1
|
||||
@@ -144,6 +146,7 @@
|
||||
icon_state = "emp"
|
||||
|
||||
/obj/item/gland/emp/activate()
|
||||
host << "<span class='warning'>You feel a spike of pain in your head.</span>"
|
||||
empulse(get_turf(host), 2, 5, 1)
|
||||
|
||||
/obj/item/gland/spiderman
|
||||
@@ -153,17 +156,19 @@
|
||||
icon_state = "spider"
|
||||
|
||||
/obj/item/gland/spiderman/activate()
|
||||
host << "<span class='warning'>You feel something crawling in your skin.</span>"
|
||||
if(uses == initial(uses))
|
||||
host.faction += "spiders"
|
||||
new /obj/effect/spider/spiderling(host.loc)
|
||||
|
||||
/obj/item/gland/egg
|
||||
cooldown_low = 300
|
||||
cooldown_high = 600
|
||||
cooldown_high = 400
|
||||
uses = -1
|
||||
icon_state = "egg"
|
||||
|
||||
/obj/item/gland/egg/activate()
|
||||
host << "<span class='boldannounce'>You lay an egg!</span>"
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/egg/egg = new(host.loc)
|
||||
egg.reagents.add_reagent("sacid",20)
|
||||
egg.desc += " It smells bad."
|
||||
@@ -176,8 +181,8 @@
|
||||
/obj/item/gland/bloody/activate()
|
||||
host.adjustBruteLoss(15)
|
||||
|
||||
host.visible_message("<span class='danger'>[host] skin erupts with blood!</span>",\
|
||||
"<span class='userdanger'>Your skin erupts with blood! It hurts!</span>")
|
||||
host.visible_message("<span class='danger'>[host]'s skin erupts with blood!</span>",\
|
||||
"<span class='userdanger'>Blood pours from your skin!</span>")
|
||||
|
||||
for(var/turf/T in oview(3,host)) //Make this respect walls and such
|
||||
T.add_blood_floor(host)
|
||||
@@ -195,6 +200,7 @@
|
||||
uses = 1
|
||||
|
||||
/obj/item/gland/bodysnatch/activate()
|
||||
host << "<span class='warning'>You feel something moving around inside you...</span>"
|
||||
//spawn cocoon with clone greytide snpc inside
|
||||
var/obj/effect/cocoon/abductor/C = new (get_turf(host))
|
||||
C.Copy(host)
|
||||
@@ -203,8 +209,8 @@
|
||||
return
|
||||
|
||||
/obj/effect/cocoon/abductor
|
||||
name = "Slimy cocoon"
|
||||
desc = "You can see something moving inside"
|
||||
name = "slimy cocoon"
|
||||
desc = "Something is moving inside."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "cocoon_large3"
|
||||
color = rgb(10,120,10)
|
||||
@@ -238,14 +244,14 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/item/gland/plasma
|
||||
cooldown_low = 1200
|
||||
cooldown_high = 2400
|
||||
cooldown_low = 2400
|
||||
cooldown_high = 3000
|
||||
uses = 1
|
||||
|
||||
/obj/item/gland/plasma/activate()
|
||||
host << "<span class='warning'>You feel bloated.</span>"
|
||||
sleep(150)
|
||||
host << "<span class='userdanger'>Your stomach feels about to explode!</span>"
|
||||
host << "<span class='userdanger'>A massive stomachache overcomes you.</span>"
|
||||
sleep(50)
|
||||
host.visible_message("<span class='danger'>[host] explodes in a cloud of plasma!</span>")
|
||||
var/turf/simulated/T = get_turf(host)
|
||||
|
||||
@@ -67,10 +67,13 @@
|
||||
origin.tele_self_action.Remove(C)
|
||||
origin.vest_mode_action.Remove(C)
|
||||
origin.vest_disguise_action.Remove(C)
|
||||
remote_eye.user = null
|
||||
if(C.client)
|
||||
C.client.perspective = MOB_PERSPECTIVE
|
||||
C.client.eye = src
|
||||
C.client.images -= remote_eye.user_image
|
||||
for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
|
||||
C.client.images -= chunk.obscured
|
||||
C.remote_control = null
|
||||
C.unset_machine()
|
||||
src.Remove(C)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/machinery/abductor/experiment
|
||||
name = "Experimental machinery"
|
||||
desc = "A human-sized coffin sporting wide array of automatic surgery tools"
|
||||
name = "experimentation machine"
|
||||
desc = "A large man-sized tube sporting a complex array of surgical apparatus."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "experiment-open"
|
||||
density = 0
|
||||
@@ -99,7 +99,7 @@
|
||||
if(1)
|
||||
dat += "<span class='average'>Unconscious</span>"
|
||||
else
|
||||
dat += "<span class='bad'>DEAD</span>"
|
||||
dat += "<span class='bad'>Deceased</span>"
|
||||
dat += "<br>"
|
||||
dat += "[flash]"
|
||||
dat += "<br>"
|
||||
@@ -133,10 +133,10 @@
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
var/point_reward = 0
|
||||
if(H in history)
|
||||
return "<span class='bad'>Specimen already in the database</span>"
|
||||
return "<span class='bad'>Specimen already in database.</span>"
|
||||
if(H.stat == DEAD)
|
||||
say("Specimen deceased - please provide fresh sample.")
|
||||
return "<span class='bad'>Specimen Deceased</span>"
|
||||
return "<span class='bad'>Specimen deceased.</span>"
|
||||
var/obj/item/gland/GlandTest = locate() in H
|
||||
if(!GlandTest)
|
||||
say("Experimental dissection not detected!")
|
||||
@@ -144,19 +144,20 @@
|
||||
if(H.mind != null && H.ckey != null)
|
||||
history += H
|
||||
abductee_minds += H.mind
|
||||
say("Processing Specimen...")
|
||||
say("Processing specimen...")
|
||||
sleep(5)
|
||||
switch(text2num(type))
|
||||
if(1)
|
||||
H << "<span class='warning'>You feel violated.</span>"
|
||||
if(2)
|
||||
H << "<span class='warning'>You feel being sliced and put back together.</span>"
|
||||
H << "<span class='warning'>You feel yourself being sliced apart and put back together.</span>"
|
||||
if(3)
|
||||
H << "<span class='warning'>You feel under intense scrutiny.</span>"
|
||||
H << "<span class='warning'>You feel intensely watched.</span>"
|
||||
sleep(5)
|
||||
H << "<span class='warning'>Your mind snaps!</span>"
|
||||
H << "<span class='warning'><b>Your mind snaps!</b></span>"
|
||||
var/objtype = pick(typesof(/datum/objective/abductee/) - /datum/objective/abductee/)
|
||||
var/datum/objective/abductee/O = new objtype()
|
||||
ticker.mode.abductees += H.mind
|
||||
H.mind.objectives += O
|
||||
var/obj_count = 1
|
||||
H << "<span class='notice'>Your current objectives:</span>"
|
||||
@@ -172,15 +173,15 @@
|
||||
SendBack(H)
|
||||
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
|
||||
points += point_reward
|
||||
return "<span class='good'>Experiment Successfull! [point_reward] new data-points collected.</span>"
|
||||
return "<span class='good'>Experiment successful! [point_reward] new data-points collected.</span>"
|
||||
else
|
||||
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
|
||||
return "<span class='bad'>Experiment Failed! No replacement organ detected.</span>"
|
||||
return "<span class='bad'>Experiment failed! No replacement organ detected.</span>"
|
||||
else
|
||||
say("Brain Activity Nonexistant - Disposing Sample...")
|
||||
say("Brain activity nonexistant - disposing sample...")
|
||||
open_machine()
|
||||
SendBack(H)
|
||||
return "<span class='bad'>Specimen Braindead - Disposed</span>"
|
||||
return "<span class='bad'>Specimen braindead - disposed.</span>"
|
||||
return "<span class='bad'>ERROR</span>"
|
||||
|
||||
|
||||
@@ -191,8 +192,12 @@
|
||||
A = console.pad.teleport_target
|
||||
if(A.safe) // right now crew areas are safe - being locked behind closed doors is not fun
|
||||
TeleportToArea(H,A)
|
||||
H.uncuff()
|
||||
return
|
||||
//Area not chosen / It's not safe area - teleport to arrivals
|
||||
H.forceMove(pick(latejoin))
|
||||
H.uncuff()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/abductor/experiment/update_icon()
|
||||
|
||||
@@ -116,10 +116,13 @@
|
||||
C.remote_view = 0
|
||||
remote_eye.origin.current_user = null
|
||||
remote_eye.origin.jump_action.Remove(C)
|
||||
remote_eye.user = null
|
||||
if(C.client)
|
||||
C.client.perspective = MOB_PERSPECTIVE
|
||||
C.client.eye = src
|
||||
C.client.images -= remote_eye.user_image
|
||||
for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
|
||||
C.client.images -= chunk.obscured
|
||||
C.remote_control = null
|
||||
C.unset_machine()
|
||||
src.Remove(C)
|
||||
|
||||
@@ -14,30 +14,7 @@
|
||||
imp_in << "You feel a faint click."
|
||||
if(iscarbon(imp_in))
|
||||
var/mob/living/carbon/C_imp_in = imp_in
|
||||
if (C_imp_in.handcuffed)
|
||||
var/obj/item/weapon/W = C_imp_in.handcuffed
|
||||
C_imp_in.handcuffed = null
|
||||
if(C_imp_in.buckled && C_imp_in.buckled.buckle_requires_restraints)
|
||||
C_imp_in.buckled.unbuckle_mob()
|
||||
C_imp_in.update_inv_handcuffed(0)
|
||||
if (C_imp_in.client)
|
||||
C_imp_in.client.screen -= W
|
||||
if (W)
|
||||
W.loc = C_imp_in.loc
|
||||
W.dropped(C_imp_in)
|
||||
if (W)
|
||||
W.layer = initial(W.layer)
|
||||
if (C_imp_in.legcuffed)
|
||||
var/obj/item/weapon/W = C_imp_in.legcuffed
|
||||
C_imp_in.legcuffed = null
|
||||
C_imp_in.update_inv_legcuffed(0)
|
||||
if (C_imp_in.client)
|
||||
C_imp_in.client.screen -= W
|
||||
if (W)
|
||||
W.loc = C_imp_in.loc
|
||||
W.dropped(C_imp_in)
|
||||
if (W)
|
||||
W.layer = initial(W.layer)
|
||||
C_imp_in.uncuff()
|
||||
|
||||
|
||||
/obj/item/weapon/implant/freedom/get_data()
|
||||
|
||||
@@ -562,13 +562,7 @@
|
||||
|
||||
if(candidates.len >= 2)
|
||||
//Oh god why we can't have static functions
|
||||
var/teams_finished = 0
|
||||
if(ticker.mode.config_tag == "abduction")
|
||||
var/datum/game_mode/abduction/A = ticker.mode
|
||||
teams_finished = A.teams
|
||||
else
|
||||
teams_finished = round(ticker.mode.abductors.len / 2)
|
||||
var/number = teams_finished + 1
|
||||
var/number = ticker.mode.abductor_teams + 1
|
||||
|
||||
var/datum/game_mode/abduction/temp
|
||||
if(ticker.mode.config_tag == "abduction")
|
||||
@@ -596,10 +590,10 @@
|
||||
temp.abductors |= list(agent_mind,scientist_mind)
|
||||
temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind)
|
||||
temp.post_setup_team(number)
|
||||
if(ticker.mode.config_tag == "abduction")
|
||||
var/datum/game_mode/abduction/A = ticker.mode
|
||||
A.teams += 1
|
||||
else
|
||||
|
||||
ticker.mode.abductor_teams++
|
||||
|
||||
if(ticker.mode.config_tag != "abduction")
|
||||
ticker.mode.abductors |= temp.abductors
|
||||
|
||||
return 1
|
||||
|
||||
@@ -494,6 +494,32 @@ var/const/GALOSHES_DONT_HELP = 8
|
||||
else
|
||||
src << "<span class='warning'>You fail to break [I]!</span>"
|
||||
|
||||
/mob/living/carbon/proc/uncuff()
|
||||
if (handcuffed)
|
||||
var/obj/item/weapon/W = handcuffed
|
||||
handcuffed = null
|
||||
if (buckled && buckled.buckle_requires_restraints)
|
||||
buckled.unbuckle_mob()
|
||||
update_inv_handcuffed(0)
|
||||
if (client)
|
||||
client.screen -= W
|
||||
if (W)
|
||||
W.loc = loc
|
||||
W.dropped(src)
|
||||
if (W)
|
||||
W.layer = initial(W.layer)
|
||||
if (legcuffed)
|
||||
var/obj/item/weapon/W = legcuffed
|
||||
legcuffed = null
|
||||
update_inv_legcuffed(0)
|
||||
if (client)
|
||||
client.screen -= W
|
||||
if (W)
|
||||
W.loc = loc
|
||||
W.dropped(src)
|
||||
if (W)
|
||||
W.layer = initial(W.layer)
|
||||
|
||||
/mob/living/carbon/proc/is_mouth_covered(head_only = 0, mask_only = 0)
|
||||
if( (!mask_only && head && (head.flags_cover & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)) )
|
||||
return 1
|
||||
|
||||
Reference in New Issue
Block a user