From c6bb2ecd4d6b60b0d48159ca924227ab9c26ff62 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Wed, 18 Jul 2018 19:51:22 -0400 Subject: [PATCH] abductor stuff --- code/datums/mind.dm | 34 +- code/game/gamemodes/cult/cult_items.dm | 1 + .../abduction/abductee_objectives.dm | 147 ++++++++ .../miniantags/abduction/abduction.dm | 318 ++---------------- .../miniantags/abduction/abduction_gear.dm | 23 +- .../miniantags/abduction/abduction_outfits.dm | 62 ++++ .../miniantags/abduction/machinery/camera.dm | 73 ++-- .../machinery/computer/camera_advanced.dm | 2 + code/game/objects/items/devices/megaphone.dm | 2 +- .../weapons/implants/implant_abductor.dm | 3 +- code/game/objects/items/weapons/whetstone.dm | 16 +- code/modules/mob/language.dm | 8 +- .../living/carbon/human/species/abductor.dm | 8 +- icons/mob/ears.dmi | Bin 1716 -> 1926 bytes icons/obj/abductor.dmi | Bin 55430 -> 55758 bytes paradise.dme | 2 + 16 files changed, 334 insertions(+), 365 deletions(-) create mode 100644 code/game/gamemodes/miniantags/abduction/abductee_objectives.dm create mode 100644 code/game/gamemodes/miniantags/abduction/abduction_outfits.dm diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 667ad44e027..0e8d655c546 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -61,7 +61,6 @@ var/linglink var/datum/vampire/vampire //vampire holder var/datum/nations/nation //nation holder - var/datum/abductor/abductor //abductor holder var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD @@ -1132,14 +1131,17 @@ log_admin("[key_name(usr)] turned [current] into abductor.") ticker.mode.update_abductor_icons_added(src) if("equip") + if(!ishuman(current)) + to_chat(usr, "This only works on humans!") + return + + var/mob/living/carbon/human/H = current var/gear = alert("Agent or Scientist Gear","Gear","Agent","Scientist") if(gear) - var/datum/game_mode/abduction/temp = new - temp.equip_common(current) if(gear=="Agent") - temp.equip_agent(current) + H.equipOutfit(/datum/outfit/abductor/agent) else - temp.equip_scientist(current) + H.equipOutfit(/datum/outfit/abductor/scientist) else if(href_list["silicon"]) switch(href_list["silicon"]) @@ -1425,35 +1427,31 @@ var/mob/living/carbon/human/H = current H.set_species(/datum/species/abductor) + var/datum/species/abductor/S = H.dna.species - switch(role) - if("Agent") - H.mind.abductor.agent = 1 - if("Scientist") - H.mind.abductor.scientist = 1 - H.mind.abductor.team = team + if(role == "Scientist") + S.scientist = TRUE + + S.team = team var/list/obj/effect/landmark/abductor/agent_landmarks = new var/list/obj/effect/landmark/abductor/scientist_landmarks = new agent_landmarks.len = 4 scientist_landmarks.len = 4 for(var/obj/effect/landmark/abductor/A in landmarks_list) - if(istype(A,/obj/effect/landmark/abductor/agent)) + if(istype(A, /obj/effect/landmark/abductor/agent)) agent_landmarks[text2num(A.team)] = A - else if(istype(A,/obj/effect/landmark/abductor/scientist)) + else if(istype(A, /obj/effect/landmark/abductor/scientist)) scientist_landmarks[text2num(A.team)] = A var/obj/effect/landmark/L - if(teleport=="Yes") + if(teleport == "Yes") switch(role) if("Agent") - H.mind.abductor.agent = 1 L = agent_landmarks[team] - H.loc = L.loc if("Scientist") - H.mind.abductor.scientist = 1 L = agent_landmarks[team] - H.loc = L.loc + H.forceMove(L.loc) // check whether this mind's mob has been brigged for the given duration diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index a223f2e5125..b8e5365cb5d 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -201,6 +201,7 @@ increment = 5 max = 40 prefix = "darkened" + claw_damage_increase = 2 /obj/item/whetstone/cult/update_icon() icon_state = "cult_sharpener[used ? "_used" : ""]" diff --git a/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm new file mode 100644 index 00000000000..af2920c4626 --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm @@ -0,0 +1,147 @@ +/datum/objective/abductee + completed = 1 + +/datum/objective/abductee/steal + explanation_text = "Steal all" + +/datum/objective/abductee/steal/New() + var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs")) + explanation_text+=" [target]." + +/datum/objective/abductee/paint + explanation_text = "The station is hideous. You must color it all" + +/datum/objective/abductee/paint/New() + var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood")) + explanation_text+= " [color]!" + +/datum/objective/abductee/speech + explanation_text = "Your brain is broken... you can only communicate in" + +/datum/objective/abductee/speech/New() + var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon")) + explanation_text+= " [style]." + +/datum/objective/abductee/capture + explanation_text = "Capture" + +/datum/objective/abductee/capture/New() + var/list/jobs = job_master.occupations.Copy() + for(var/datum/job/J in jobs) + if(J.current_positions < 1) + jobs -= J + if(jobs.len > 0) + var/datum/job/target = pick(jobs) + explanation_text += " a [target.title]." + else + explanation_text += " someone." + +/datum/objective/abductee/shuttle + explanation_text = "You must escape the station! Get the shuttle called!" + +/datum/objective/abductee/noclone + 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 wood, carpeting, grass or bling." + +/datum/objective/abductee/POWERUNLIMITED + explanation_text = "Flood the station's powernet with as much electricity as you can." + +/datum/objective/abductee/pristine + explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition." + +/datum/objective/abductee/nowalls + explanation_text = "The crew must get to know one another better. Break down the walls inside the station!" + +/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/summon + explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one." + +/datum/objective/abductee/machine + explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last." + +/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. Hold a seance to 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 = "Fuck the system! Defect from the station and start an independent colony in space, Mining Outpost or the derelict. Recruit crewmates if you can." + +/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." + +/datum/objective/abductee/engine + explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds." + +/datum/objective/abductee/music + explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!" + +/datum/objective/abductee/clown + explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!" + +/datum/objective/abductee/party + explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!" + +/datum/objective/abductee/pets + explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!" + +/datum/objective/abductee/conspiracy + explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!" + +/datum/objective/abductee/stalker + explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it." + +/datum/objective/abductee/narrator + explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story." + +/datum/objective/abductee/lurve + explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!" + +/datum/objective/abductee/sixthsense + explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo." \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 09e91869fd9..5d5c3342010 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -89,62 +89,14 @@ return 1 /datum/game_mode/abduction/post_setup() - //Spawn Team - var/list/obj/effect/landmark/abductor/agent_landmarks = new - var/list/obj/effect/landmark/abductor/scientist_landmarks = new - agent_landmarks.len = max_teams - scientist_landmarks.len = max_teams - for(var/obj/effect/landmark/abductor/A in landmarks_list) - if(istype(A,/obj/effect/landmark/abductor/agent)) - agent_landmarks[text2num(A.team)] = A - else if(istype(A,/obj/effect/landmark/abductor/scientist)) - scientist_landmarks[text2num(A.team)] = A - - var/datum/mind/agent - var/obj/effect/landmark/L - var/datum/mind/scientist - var/team_name - var/mob/living/carbon/human/H for(var/team_number=1,team_number<=abductor_teams,team_number++) - team_name = team_names[team_number] - agent = agents[team_number] - H = agent.current - L = agent_landmarks[team_number] - H.forceMove(get_turf(L)) - H.body_accessory = null - H.set_species(/datum/species/abductor) - H.mind.abductor.agent = 1 - H.mind.abductor.team = team_number - H.real_name = team_name + " Agent" - H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys. - H.overeatduration = 0 - equip_common(H,team_number) - equip_agent(H,team_number) - greet_agent(agent,team_number) - update_abductor_icons_added(agent) - - scientist = scientists[team_number] - H = scientist.current - L = scientist_landmarks[team_number] - H.forceMove(get_turf(L)) - H.body_accessory = null - H.set_species(/datum/species/abductor) - H.mind.abductor.scientist = 1 - H.mind.abductor.team = team_number - H.real_name = team_name + " Scientist" - H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys. - H.overeatduration = 0 - equip_common(H,team_number) - equip_scientist(H,team_number) - greet_scientist(scientist,team_number) - update_abductor_icons_added(scientist) - + post_setup_team(team_number) return ..() //Used for create antag buttons /datum/game_mode/abduction/proc/post_setup_team(team_number) - var/list/obj/effect/landmark/abductor/agent_landmarks = new - var/list/obj/effect/landmark/abductor/scientist_landmarks = new + var/list/obj/effect/landmark/abductor/agent_landmarks = list() + var/list/obj/effect/landmark/abductor/scientist_landmarks = list() agent_landmarks.len = max_teams scientist_landmarks.len = max_teams for(var/obj/effect/landmark/abductor/A in landmarks_list) @@ -153,11 +105,13 @@ else if(istype(A,/obj/effect/landmark/abductor/scientist)) scientist_landmarks[text2num(A.team)] = A + var/team_name = team_names[team_number] + var/datum/mind/agent var/obj/effect/landmark/L var/datum/mind/scientist - var/team_name var/mob/living/carbon/human/H + var/datum/species/abductor/S team_name = team_names[team_number] agent = agents[team_number] @@ -166,11 +120,12 @@ H.forceMove(get_turf(L)) H.body_accessory = null H.set_species(/datum/species/abductor) - H.mind.abductor.agent = 1 - H.mind.abductor.team = team_number + S = H.dna.species + S.team = team_number H.real_name = team_name + " Agent" - equip_common(H,team_number) - equip_agent(H,team_number) + H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys. + H.overeatduration = 0 + H.equipOutfit(/datum/outfit/abductor/agent) greet_agent(agent,team_number) update_abductor_icons_added(agent) @@ -180,20 +135,16 @@ H.forceMove(get_turf(L)) H.body_accessory = null H.set_species(/datum/species/abductor) - H.mind.abductor.scientist = 1 - H.mind.abductor.team = team_number + S = H.dna.species + S.scientist = TRUE + S.team = team_number H.real_name = team_name + " Scientist" - equip_common(H,team_number) - equip_scientist(H,team_number) + H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys. + H.overeatduration = 0 + H.equipOutfit(/datum/outfit/abductor/scientist) greet_scientist(scientist,team_number) update_abductor_icons_added(scientist) - -/datum/abductor //stores abductor's team and whether they're a scientist or agent; since species datums are global, we have to use this, instead. - var/scientist = 0 - var/agent = 0 - var/team = 1 - /datum/game_mode/abduction/proc/greet_agent(datum/mind/abductor,team_number) abductor.objectives += team_objectives[team_number] var/team_name = team_names[team_number] @@ -202,11 +153,7 @@ to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!") to_chat(abductor.current, "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve.") - var/obj_count = 1 - for(var/datum/objective/objective in abductor.objectives) - to_chat(abductor.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ - return + abductor.announce_objectives() /datum/game_mode/abduction/proc/greet_scientist(datum/mind/abductor,team_number) abductor.objectives += team_objectives[team_number] @@ -216,64 +163,12 @@ to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!") to_chat(abductor.current, "Use your tool and ship consoles to support the agent and retrieve human specimens.") - var/obj_count = 1 - for(var/datum/objective/objective in abductor.objectives) - to_chat(abductor.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ - return - -/datum/game_mode/abduction/proc/equip_common(mob/living/carbon/human/agent,team_number) - var/radio_freq = SYND_FREQ - - var/obj/item/radio/R = new /obj/item/radio/headset/syndicate/alt(agent) - R.set_frequency(radio_freq) - R.name = "alien headset" - agent.equip_to_slot_or_del(R, slot_l_ear) - agent.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(agent), slot_shoes) - agent.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(agent), slot_w_uniform) //they're greys gettit - agent.equip_to_slot_or_del(new /obj/item/storage/backpack(agent), slot_back) - -/datum/game_mode/abduction/proc/get_team_console(team) - var/obj/machinery/abductor/console/console - for(var/obj/machinery/abductor/console/c in abductor_equipment) - if(c.team == team) - console = c - break - return console - -/datum/game_mode/abduction/proc/equip_agent(mob/living/carbon/human/agent,team_number) - if(!team_number) - team_number = agent.mind.abductor.team - - var/obj/machinery/abductor/console/console = get_team_console(team_number) - var/obj/item/clothing/suit/armor/abductor/vest/V = new /obj/item/clothing/suit/armor/abductor/vest(agent) - if(console!=null) - console.vest = V - V.flags |= NODROP - agent.equip_to_slot_or_del(V, slot_wear_suit) - agent.equip_to_slot_or_del(new /obj/item/abductor_baton(agent), slot_in_backpack) - agent.equip_to_slot_or_del(new /obj/item/gun/energy/alien(agent), slot_in_backpack) - agent.equip_to_slot_or_del(new /obj/item/abductor/silencer(agent), slot_in_backpack) - agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head) - agent.equip_to_slot_or_del(new /obj/item/storage/belt/military/abductor/full(agent), slot_belt) - agent.update_icons() - - -/datum/game_mode/abduction/proc/equip_scientist(var/mob/living/carbon/human/scientist,var/team_number) - if(!team_number) - team_number = scientist.mind.abductor.team - - var/obj/machinery/abductor/console/console = get_team_console(team_number) - var/obj/item/abductor/gizmo/G = new /obj/item/abductor/gizmo(scientist) - if(console!=null) - console.gizmo = G - G.console = console - scientist.equip_to_slot_or_del(G, slot_in_backpack) - - var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(scientist) - beamplant.implant(scientist) - scientist.update_icons() + abductor.announce_objectives() +/datum/game_mode/abduction/proc/get_team_console(team_number) + for(var/obj/machinery/abductor/console/C in machines) + if(C.team == team_number) + return C /datum/game_mode/abduction/check_finished() if(!finished) @@ -336,18 +231,19 @@ var/ab_team = team if(owner) if(!owner.current || !ishuman(owner.current)) - return 0 + return FALSE var/mob/living/carbon/human/H = owner.current if(!isabductor(H)) - return 0 - ab_team = H.mind.abductor.team - for(var/obj/machinery/abductor/experiment/E in abductor_equipment) + return FALSE + 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) - return 1 + return TRUE else - return 0 - return 0 + return FALSE + return FALSE /datum/game_mode/proc/remove_abductor(datum/mind/abductor_mind) if(abductor_mind in abductors) @@ -358,7 +254,7 @@ to_chat(abductor_mind.current, "You have been turned into a robot! You are no longer an abductor.") else to_chat(abductor_mind.current, "You have been brainwashed! You are no longer an abductor.") - ticker.mode.update_abductor_icons_added(abductor_mind) + ticker.mode.update_abductor_icons_removed(abductor_mind) /datum/game_mode/proc/update_abductor_icons_added(datum/mind/alien_mind) var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR] @@ -368,152 +264,4 @@ /datum/game_mode/proc/update_abductor_icons_removed(datum/mind/alien_mind) var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR] hud.leave_hud(alien_mind.current) - set_antag_hud(alien_mind.current, null) - -/datum/objective/abductee - completed = 1 - -/datum/objective/abductee/steal - explanation_text = "Steal all" - -/datum/objective/abductee/steal/New() - var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs")) - explanation_text+=" [target]." - -/datum/objective/abductee/paint - explanation_text = "The station is hideous. You must color it all" - -/datum/objective/abductee/paint/New() - var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood")) - explanation_text+= " [color]!" - -/datum/objective/abductee/speech - explanation_text = "Your brain is broken... you can only communicate in" - -/datum/objective/abductee/speech/New() - var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon")) - explanation_text+= " [style]." - -/datum/objective/abductee/capture - explanation_text = "Capture" - -/datum/objective/abductee/capture/New() - var/list/jobs = job_master.occupations.Copy() - for(var/datum/job/J in jobs) - if(J.current_positions < 1) - jobs -= J - if(jobs.len > 0) - var/datum/job/target = pick(jobs) - explanation_text += " a [target.title]." - else - explanation_text += " someone." - -/datum/objective/abductee/shuttle - explanation_text = "You must escape the station! Get the shuttle called!" - -/datum/objective/abductee/noclone - 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 wood, carpeting, grass or bling." - -/datum/objective/abductee/POWERUNLIMITED - explanation_text = "Flood the station's powernet with as much electricity as you can." - -/datum/objective/abductee/pristine - explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition." - -/datum/objective/abductee/nowalls - explanation_text = "The crew must get to know one another better. Break down the walls inside the station!" - -/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/summon - explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one." - -/datum/objective/abductee/machine - explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last." - -/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. Hold a seance to 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 = "Fuck the system! Defect from the station and start an independent colony in space, Mining Outpost or the derelict. Recruit crewmates if you can." - -/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." - -/datum/objective/abductee/engine - explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds." - -/datum/objective/abductee/music - explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!" - -/datum/objective/abductee/clown - explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!" - -/datum/objective/abductee/party - explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!" - -/datum/objective/abductee/pets - explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!" - -/datum/objective/abductee/conspiracy - explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!" - -/datum/objective/abductee/stalker - explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it." - -/datum/objective/abductee/narrator - explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story." - -/datum/objective/abductee/lurve - explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!" - -/datum/objective/abductee/sixthsense - explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo." \ No newline at end of file + set_antag_hud(alien_mind.current, null) \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 73a910e54ef..4f7d260db92 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -117,8 +117,8 @@ /obj/item/abductor/proc/ScientistCheck(user) var/mob/living/carbon/human/H = user - if(H.mind && H.mind.abductor) - return H.mind.abductor.scientist + var/datum/species/abductor/S = H.dna.species + return S.scientist /obj/item/abductor/gizmo name = "science tool" @@ -477,6 +477,25 @@ Congratulations! You are now trained for invasive xenobiology research!"} to_chat(user, "The baton is in probing mode.") +/obj/item/radio/headset/abductor + name = "alien headset" + desc = "An advanced alien headset designed to monitor communications of human space stations. Why does it have a microphone? No one knows." + flags = EARBANGPROTECT + origin_tech = "magnets=2;abductor=3" + icon = 'icons/obj/abductor.dmi' + icon_state = "abductor_headset" + item_state = "abductor_headset" + ks2type = /obj/item/encryptionkey/heads/captain + +/obj/item/radio/headset/abductor/New() + ..() + make_syndie() + +/obj/item/radio/headset/abductor/attackby(obj/item/I, mob/user, params) + if(isscrewdriver(I)) + return // Stops humans from disassembling abductor headsets. + return ..() + /obj/item/scalpel/alien name = "alien scalpel" desc = "It's a gleaming sharp knife made out of silvery-green metal." diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm new file mode 100644 index 00000000000..bb39e90cd01 --- /dev/null +++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm @@ -0,0 +1,62 @@ +/datum/outfit/abductor + name = "Abductor Basic" + uniform = /obj/item/clothing/under/color/grey //they're greys gettit + shoes = /obj/item/clothing/shoes/combat + back = /obj/item/storage/backpack + l_ear = /obj/item/radio/headset/abductor + +/datum/outfit/abductor/proc/get_team_console(team_number) + for(var/obj/machinery/abductor/console/C in machines) + if(C.team == team_number) + return C + +/datum/outfit/abductor/proc/link_to_console(mob/living/carbon/human/H, team_number) + if(!team_number && isabductor(H)) + var/datum/species/abductor/S = H.dna.species + team_number = S.team + + if(!team_number) + team_number = 1 + + var/obj/machinery/abductor/console/console = get_team_console(team_number) + if(console) + var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H + if(V) + console.vest = V + V.flags |= NODROP + + var/obj/item/abductor/gizmo/G = locate() in H.get_item_by_slot(slot_back) + if(G) + console.gizmo = G + G.console = console + +/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(!visualsOnly) + link_to_console(H) + + +/datum/outfit/abductor/agent + name = "Abductor Agent" + head = /obj/item/clothing/head/helmet/abductor + suit = /obj/item/clothing/suit/armor/abductor/vest + belt = /obj/item/storage/belt/military/abductor/full + + backpack_contents = list( + /obj/item/abductor_baton = 1, + /obj/item/gun/energy/alien = 1, + /obj/item/abductor/silencer = 1 + ) + +/datum/outfit/abductor/scientist + name = "Abductor Scientist" + + backpack_contents = list( + /obj/item/abductor/gizmo = 1 + ) + +/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(!visualsOnly) + var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H) + beamplant.implant(H) \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm index 219ae4b6e54..cd4f80f2527 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm @@ -2,7 +2,6 @@ name = "Human Observation Console" var/team = 0 networks = list("SS13","Abductor") - off_action = new /datum/action/innate/camera_off/abductor //specific datum var/datum/action/innate/teleport_in/tele_in_action = new var/datum/action/innate/teleport_out/tele_out_action = new var/datum/action/innate/teleport_self/tele_self_action = new @@ -25,65 +24,43 @@ eyeobj.icon_state = "camera_target" /obj/machinery/computer/camera_advanced/abductor/GrantActions(mob/living/carbon/user) - off_action.target = user - off_action.Grant(user) + ..() - jump_action.target = user - jump_action.Grant(user) - //TODO : add null checks - tele_in_action.target = console.pad - tele_in_action.Grant(user) + if(tele_in_action) + tele_in_action.target = console.pad + tele_in_action.Grant(user) + actions += tele_in_action - tele_out_action.target = console - tele_out_action.Grant(user) + if(tele_out_action) + tele_out_action.target = console + tele_out_action.Grant(user) + actions += tele_out_action - tele_self_action.target = console.pad - tele_self_action.Grant(user) + if(tele_self_action) + tele_self_action.target = console.pad + tele_self_action.Grant(user) + actions += tele_self_action - vest_mode_action.target = console - vest_mode_action.Grant(user) + if(vest_mode_action) + vest_mode_action.target = console + vest_mode_action.Grant(user) + actions += vest_mode_action - vest_disguise_action.target = console - vest_disguise_action.Grant(user) + if(vest_disguise_action) + vest_disguise_action.target = console + vest_disguise_action.Grant(user) + actions += vest_disguise_action - set_droppoint_action.target = console - set_droppoint_action.Grant(user) - -/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H) - if(H.mind && H.mind.abductor) - return H.mind.abductor.scientist + if(set_droppoint_action) + set_droppoint_action.target = console + set_droppoint_action.Grant(user) + actions += set_droppoint_action /obj/machinery/computer/camera_advanced/abductor/attack_hand(mob/user) if(!isabductor(user)) return return ..() -/datum/action/innate/camera_off/abductor/Activate() - if(!target || !iscarbon(target)) - return - var/mob/living/carbon/C = target - var/mob/camera/aiEye/remote/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/abductor/origin = remote_eye.origin - C.remote_view = 0 - origin.current_user = null - origin.jump_action.Remove(C) - origin.tele_in_action.Remove(C) - origin.tele_out_action.Remove(C) - origin.tele_self_action.Remove(C) - origin.vest_mode_action.Remove(C) - origin.vest_disguise_action.Remove(C) - origin.set_droppoint_action.Remove(C) - remote_eye.eye_user = null - C.reset_perspective(null) - if(C.client) - 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) - - /datum/action/innate/teleport_in name = "Send To" button_icon_state = "beam_down" diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 00f6a98f2bc..99eaeae3fe6 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -31,6 +31,7 @@ for(var/V in actions) var/datum/action/A = V A.Remove(user) + actions.Cut() if(user.client) user.reset_perspective(null) eyeobj.RemoveImages() @@ -52,6 +53,7 @@ if(current_user) current_user.unset_machine() QDEL_NULL(eyeobj) + QDEL_LIST(actions) return ..() /obj/machinery/computer/camera_advanced/on_unset_machine(mob/M) diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 4bbdaa2f723..4fea8e93a39 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -24,7 +24,7 @@ return if(ishuman(user)) var/mob/living/carbon/human/abductor/H = user - if(H && H.mind.abductor) + if(isabductor(H)) to_chat(user, "Megaphones can't project psionic communication!") return if(ishuman(user)) diff --git a/code/game/objects/items/weapons/implants/implant_abductor.dm b/code/game/objects/items/weapons/implants/implant_abductor.dm index 40ed4d3bfa3..3ec571c94a6 100644 --- a/code/game/objects/items/weapons/implants/implant_abductor.dm +++ b/code/game/objects/items/weapons/implants/implant_abductor.dm @@ -29,7 +29,8 @@ if(ishuman(source)) var/mob/living/carbon/human/H = source if(isabductor(H)) - console = get_team_console(H.mind.abductor.team) + var/datum/species/abductor/S = H.dna.species + console = get_team_console(S.team) home = console.pad if(!home) diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm index 5d17e66d976..fcb2fab2d4e 100644 --- a/code/game/objects/items/weapons/whetstone.dm +++ b/code/game/objects/items/weapons/whetstone.dm @@ -10,6 +10,7 @@ var/max = 30 var/prefix = "sharpened" var/requires_sharpness = 1 + var/claw_damage_increase = 1 /obj/item/whetstone/attackby(obj/item/I, mob/user, params) @@ -46,16 +47,24 @@ playsound(get_turf(src), usesound, 50, 1) name = "worn out [name]" desc = "[desc] At least, it used to." - used = 1 + used = TRUE update_icon() -/obj/item/whetstone/attack_self(mob/user as mob) //This is just fluff for now. Species datums are global and not newly created instances, so we can't adjust unarmed damage on a per mob basis. +/obj/item/whetstone/attack_self(mob/user) + if(used) + to_chat(user, "The whetstone is too worn to use again!") + return if(ishuman(user)) var/mob/living/carbon/human/H = user var/datum/unarmed_attack/attack = H.dna.species.unarmed if(istype(attack, /datum/unarmed_attack/claws)) - H.visible_message("[H] sharpens [H.p_their()] claws on the [src]!", "You sharpen your claws on the [src].") + attack.damage += claw_damage_increase + H.visible_message("[H] sharpens [H.p_their()] claws on [src]!", "You sharpen your claws on [src].") playsound(get_turf(H), usesound, 50, 1) + name = "worn out [name]" + desc = "[desc] At least, it used to." + used = TRUE + update_icon() /obj/item/whetstone/super name = "super whetstone block" @@ -64,3 +73,4 @@ max = 200 prefix = "super-sharpened" requires_sharpness = 0 + claw_damage_increase = 200 diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 93bdfe30c27..6ed8baf5de0 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -507,8 +507,10 @@ ..(speaker,message,speaker.real_name) /datum/language/abductor/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker) - if(other.mind && other.mind.abductor) - if(other.mind.abductor.team == speaker.mind.abductor.team) + if(isabductor(other) && isabductor(speaker)) + var/datum/species/abductor/A = speaker.dna.species + var/datum/species/abductor/A2 = other.dna.species + if(A.team == A2.team) return TRUE return FALSE @@ -553,7 +555,7 @@ if(!message) return - + log_say("(ROBOT) [message]", speaker) var/message_start = "[name], [speaker.name]" var/message_body = "[speaker.say_quote(message)],\"[message]\"" diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm index ec2bb7514ed..16fcd34d315 100644 --- a/code/modules/mob/living/carbon/human/species/abductor.dm +++ b/code/modules/mob/living/carbon/human/species/abductor.dm @@ -27,14 +27,14 @@ female_scream_sound = 'sound/goonstation/voice/male_scream.ogg' female_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg') female_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg' //Abductors always scream like guys + var/team = 1 + var/scientist = FALSE // vars to not pollute spieces list with castes /datum/species/abductor/can_understand(mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member - return 1 + return TRUE /datum/species/abductor/handle_post_spawn(mob/living/carbon/human/H) H.gender = NEUTER - if(H.mind) - H.mind.abductor = new /datum/abductor H.languages.Cut() //Under no condition should you be able to speak any language H.add_language("Abductor Mindlink") //other than over the abductor's own mindlink - return ..() + return ..() \ No newline at end of file diff --git a/icons/mob/ears.dmi b/icons/mob/ears.dmi index 13d5981c458502f54cecfb4c329aa2fcb26831de..597029a456cde0fb24669e4623c1f2d30f080670 100644 GIT binary patch delta 1885 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%0DYAW6?=oHzoWt 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 diff --git a/paradise.dme b/paradise.dme index daa3e1c9b65..cd51288c9a1 100644 --- a/paradise.dme +++ b/paradise.dme @@ -472,8 +472,10 @@ #include "code\game\gamemodes\malfunction\Malf_Modules.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\miniantags\abduction\abductee_objectives.dm" #include "code\game\gamemodes\miniantags\abduction\abduction.dm" #include "code\game\gamemodes\miniantags\abduction\abduction_gear.dm" +#include "code\game\gamemodes\miniantags\abduction\abduction_outfits.dm" #include "code\game\gamemodes\miniantags\abduction\abduction_surgery.dm" #include "code\game\gamemodes\miniantags\abduction\gland.dm" #include "code\game\gamemodes\miniantags\abduction\machinery\camera.dm"