mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-27 07:08:00 +01:00
Merge pull request #9185 from AnturK/aliens_stole_my_branch_name
Abduction Update 2.5
This commit is contained in:
@@ -455,6 +455,25 @@
|
||||
|
||||
sections["shadowling"] = text
|
||||
|
||||
/** Abductors **/
|
||||
|
||||
text = "Abductor"
|
||||
if(ticker.mode.config_tag == "abductor")
|
||||
text = uppertext(text)
|
||||
text = "<i><b>[text]</b></i>: "
|
||||
if(src in ticker.mode.abductors)
|
||||
text += "<b>Abductor</b>|<a href='?src=\ref[src];abductor=clear'>human</a>"
|
||||
text += "|<a href='?src=\ref[src];common=undress'>undress</a>|<a href='?src=\ref[src];abductor=equip'>equip</a>"
|
||||
else
|
||||
text += "<a href='?src=\ref[src];abductor=abductor'>Abductor</a>|<b>human</b>"
|
||||
|
||||
if(current && current.client && current.client.prefs.be_special & BE_ABDUCTOR)
|
||||
text += "|Enabled in Prefs"
|
||||
else
|
||||
text += "|Disabled in Prefs"
|
||||
|
||||
sections["abductor"] = text
|
||||
|
||||
/** MONKEY ***/
|
||||
if (istype(current, /mob/living/carbon))
|
||||
text = "monkey"
|
||||
@@ -1074,6 +1093,26 @@
|
||||
message_admins("[key_name_admin(usr)] has thrall'ed [current].")
|
||||
log_admin("[key_name(usr)] has thrall'ed [current].")
|
||||
|
||||
else if(href_list["abductor"])
|
||||
switch(href_list["abductor"])
|
||||
if("clear")
|
||||
usr << "Not implemented yet. Sorry!"
|
||||
if("abductor")
|
||||
if(!ishuman(current))
|
||||
usr << "<span class='warning'>This only works on humans!</span>"
|
||||
return
|
||||
make_Abductor()
|
||||
log_admin("[key_name(usr)] turned [current] into abductor.")
|
||||
if("equip")
|
||||
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)
|
||||
else
|
||||
temp.equip_scientist(current)
|
||||
|
||||
else if (href_list["monkey"])
|
||||
var/mob/living/L = current
|
||||
if (L.notransform)
|
||||
@@ -1349,6 +1388,57 @@
|
||||
ticker.mode.greet_gang(src)
|
||||
ticker.mode.equip_gang(current)
|
||||
|
||||
/datum/mind/proc/make_Abductor()
|
||||
var/role = alert("Abductor Role ?","Role","Agent","Scientist")
|
||||
var/team = input("Abductor Team ?","Team ?") in list(1,2,3,4)
|
||||
var/teleport = alert("Teleport to ship ?","Teleport","Yes","No")
|
||||
|
||||
if(!role || !team || !teleport)
|
||||
return
|
||||
|
||||
if(!ishuman(current))
|
||||
return
|
||||
|
||||
ticker.mode.abductors |= src
|
||||
|
||||
var/datum/objective/experiment/O = new
|
||||
O.owner = src
|
||||
objectives += O
|
||||
|
||||
var/mob/living/carbon/human/H = current
|
||||
|
||||
hardset_dna(H,null,null,null,null,/datum/species/abductor,null)
|
||||
var/datum/species/abductor/S = H.dna.species
|
||||
|
||||
switch(role)
|
||||
if("Agent")
|
||||
S.agent = 1
|
||||
if("Scientist")
|
||||
S.scientist = 1
|
||||
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))
|
||||
agent_landmarks[text2num(A.team)] = A
|
||||
else if(istype(A,/obj/effect/landmark/abductor/scientist))
|
||||
scientist_landmarks[text2num(A.team)] = A
|
||||
|
||||
var/obj/effect/landmark/L
|
||||
if(teleport=="Yes")
|
||||
switch(role)
|
||||
if("Agent")
|
||||
S.agent = 1
|
||||
L = agent_landmarks[team]
|
||||
H.loc = L.loc
|
||||
if("Scientist")
|
||||
S.scientist = 1
|
||||
L = agent_landmarks[team]
|
||||
H.loc = L.loc
|
||||
|
||||
|
||||
|
||||
/datum/mind/proc/AddSpell(var/obj/effect/proc_holder/spell/spell)
|
||||
|
||||
@@ -223,6 +223,10 @@
|
||||
return console
|
||||
|
||||
/datum/game_mode/abduction/proc/equip_agent(var/mob/living/carbon/human/agent,var/team_number)
|
||||
if(!team_number)
|
||||
var/datum/species/abductor/S = agent.dna.species
|
||||
team_number = S.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)
|
||||
@@ -236,6 +240,10 @@
|
||||
|
||||
|
||||
/datum/game_mode/abduction/proc/equip_scientist(var/mob/living/carbon/human/scientist,var/team_number)
|
||||
if(!team_number)
|
||||
var/datum/species/abductor/S = scientist.dna.species
|
||||
team_number = S.team
|
||||
|
||||
var/obj/machinery/abductor/console/console = get_team_console(team_number)
|
||||
var/obj/item/device/abductor/gizmo/G = new /obj/item/device/abductor/gizmo(scientist)
|
||||
if(console!=null)
|
||||
@@ -259,6 +267,7 @@
|
||||
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++)
|
||||
var/obj/machinery/abductor/console/console = get_team_console(team_number)
|
||||
var/datum/objective/objective = team_objectives[team_number]
|
||||
@@ -274,7 +283,7 @@
|
||||
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 << "<b>Abductees:</b>"
|
||||
world << "<br><font size=2><b>The Abductees were:</b></font>"
|
||||
display_abductees(console)
|
||||
|
||||
..()
|
||||
@@ -285,20 +294,24 @@
|
||||
for(var/mob/living/abductee in abductees)
|
||||
if(!abductee.mind)
|
||||
continue
|
||||
world << "[abductee.name]([abductee.ckey]))"
|
||||
var/count = 1
|
||||
for(var/datum/objective/objective in abductee.mind.objectives)
|
||||
if(objective.check_completion())
|
||||
world << "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='green'><b>Success!</b></font>"
|
||||
else
|
||||
world << "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='danger'>Fail.</span>"
|
||||
count++
|
||||
world << printplayer(abductee.mind)
|
||||
world << printobjectives(abductee.mind)
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_abduction()
|
||||
if(abductors.len)
|
||||
world << "Abductors:"
|
||||
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
|
||||
|
||||
//Landmarks
|
||||
@@ -329,6 +342,19 @@ datum/objective/experiment/New()
|
||||
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
|
||||
for(var/obj/machinery/abductor/experiment/E in machines)
|
||||
if(E.team == ab_team)
|
||||
if(E.points >= target_amount)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 0
|
||||
|
||||
datum/objective/abductee
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
icon_state = "vest_stealth"
|
||||
item_state = "armor"
|
||||
blood_overlay_type = "armor"
|
||||
origin_tech = "materials=5;biotech=4;powerstorage=5"
|
||||
armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15)
|
||||
action_button_name = "Activate"
|
||||
action_button_is_hands_free = 1
|
||||
@@ -147,6 +148,7 @@
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "gizmo_scan"
|
||||
item_state = "silencer"
|
||||
origin_tech = "materials=5;magnets=5;bluespace=6"
|
||||
var/mode = GIZMO_SCAN
|
||||
var/mob/living/marked = null
|
||||
var/obj/machinery/abductor/console/console
|
||||
@@ -208,6 +210,8 @@
|
||||
user << "<span class='notice'>You mark the target for future retrieval.</span>"
|
||||
else
|
||||
prepare(target,user)
|
||||
else
|
||||
prepare(target,user)
|
||||
|
||||
/obj/item/device/abductor/gizmo/proc/prepare(var/atom/target, var/mob/living/user)
|
||||
if(get_dist(target,user)>1)
|
||||
@@ -225,6 +229,7 @@
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "silencer"
|
||||
item_state = "gizmo"
|
||||
origin_tech = "materials=5;magnets=5"
|
||||
|
||||
/obj/item/device/abductor/silencer/attack(mob/living/M, mob/user)
|
||||
if(!AbductorCheck(user))
|
||||
@@ -246,6 +251,8 @@
|
||||
|
||||
var/mob/living/carbon/human/M
|
||||
for(M in view(2,targloc))
|
||||
if(M == user)
|
||||
continue
|
||||
user << "<span class='notice'>You silence [M.name] radio devices.</span>"
|
||||
radio_off_mob(M)
|
||||
|
||||
@@ -327,7 +334,8 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
#define BATON_STUN 0
|
||||
#define BATON_SLEEP 1
|
||||
#define BATON_CUFF 2
|
||||
#define BATON_MODES 3
|
||||
#define BATON_PROBE 3
|
||||
#define BATON_MODES 4
|
||||
|
||||
/obj/item/weapon/abductor_baton
|
||||
name = "Advanced Baton"
|
||||
@@ -336,6 +344,7 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
icon_state = "wonderprod"
|
||||
item_state = "wonderprod"
|
||||
slot_flags = SLOT_BELT
|
||||
origin_tech = "materials=6;combat=5;biotech=7"
|
||||
force = 7
|
||||
w_class = 3
|
||||
action_button_name = "Toggle Mode"
|
||||
@@ -350,6 +359,8 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
txt = "sleep inducment"
|
||||
if(BATON_CUFF)
|
||||
txt = "restraining"
|
||||
if(BATON_PROBE)
|
||||
txt = "probing"
|
||||
|
||||
usr << "<span class='notice'>You switch the baton to [txt] mode</span>"
|
||||
update_icon()
|
||||
@@ -362,6 +373,8 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
icon_state = "wonderprod"
|
||||
if(BATON_CUFF)
|
||||
icon_state = "wonderprod"
|
||||
if(BATON_PROBE)
|
||||
icon_state = "wonderprod"
|
||||
|
||||
/obj/item/weapon/abductor_baton/proc/IsAbductor(var/mob/living/user)
|
||||
if(!ishuman(user))
|
||||
@@ -384,11 +397,6 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
if(!isliving(target))
|
||||
return
|
||||
|
||||
if(user.a_intent == "help")
|
||||
target.visible_message("<span class='danger'>[user] probes [target] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] probed [target]!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/L = target
|
||||
|
||||
user.do_attack_animation(L)
|
||||
@@ -399,6 +407,8 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
SleepAttack(L,user)
|
||||
if(BATON_CUFF)
|
||||
CuffAttack(L,user)
|
||||
if(BATON_PROBE)
|
||||
ProbeAttack(L,user)
|
||||
|
||||
/obj/item/weapon/abductor_baton/attack_self(mob/living/user)
|
||||
toggle(user)
|
||||
@@ -450,6 +460,19 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
user << "<span class='warning'>You fail to handcuff [C].</span>"
|
||||
return
|
||||
|
||||
/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>")
|
||||
|
||||
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]"
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy
|
||||
name = "energy cuffs"
|
||||
desc = "Energy field restraining the hands."
|
||||
@@ -505,10 +528,11 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
|
||||
/obj/item/clothing/head/helmet/abductor
|
||||
name = "Agent Headgear"
|
||||
desc = "Abducting with style. Spiky style."
|
||||
desc = "Abducting with style. Spiky style. Prevents digital tracking."
|
||||
icon_state = "alienhelmet"
|
||||
item_state = "alienhelmet"
|
||||
blockTracking = 1
|
||||
origin_tech = "materials=6;magnets=5"
|
||||
|
||||
// Operating Table / Beds / Lockers
|
||||
|
||||
|
||||
@@ -51,6 +51,11 @@
|
||||
if(experiment != null)
|
||||
var/points = experiment.points
|
||||
dat += "Collected Samples : [points] <br>"
|
||||
dat += "<b>Transfer data in exchange for supplies:</b><br>"
|
||||
dat += "<a href='?src=\ref[src];dispense=baton'>Advanced Baton</A><br>"
|
||||
dat += "<a href='?src=\ref[src];dispense=helmet'>Agent Helmet</A><br>"
|
||||
dat += "<a href='?src=\ref[src];dispense=silencer'>Radio Silencer</A><br>"
|
||||
dat += "<a href='?src=\ref[src];dispense=tool'>Science Tool</A><br>"
|
||||
else
|
||||
dat += "<span class='bad'>NO EXPERIMENT MACHINE DETECTED</span> <br>"
|
||||
|
||||
@@ -101,6 +106,16 @@
|
||||
FlipVest()
|
||||
else if(href_list["select_disguise"])
|
||||
SelectDisguise()
|
||||
else if(href_list["dispense"])
|
||||
switch(href_list["dispense"])
|
||||
if("baton")
|
||||
Dispense(/obj/item/weapon/abductor_baton,cost=2)
|
||||
if("helmet")
|
||||
Dispense(/obj/item/clothing/head/helmet/abductor)
|
||||
if("silencer")
|
||||
Dispense(/obj/item/device/abductor/silencer)
|
||||
if("tool")
|
||||
Dispense(/obj/item/device/abductor/gizmo)
|
||||
src.updateUsrDialog()
|
||||
|
||||
/obj/machinery/abductor/console/proc/TeleporterSet()
|
||||
@@ -181,4 +196,17 @@
|
||||
user << "<span class='notice'>You link the vest to the console.</span>"
|
||||
vest = V
|
||||
else
|
||||
..()
|
||||
..()
|
||||
|
||||
/obj/machinery/abductor/console/proc/Dispense(var/item,var/cost=1)
|
||||
if(experiment && experiment.points >= cost)
|
||||
experiment.points-=cost
|
||||
say("Incoming supply!")
|
||||
if(pad)
|
||||
flick("alien-pad", pad)
|
||||
new item(pad.loc)
|
||||
else
|
||||
new item(src.loc)
|
||||
else
|
||||
say("Insufficent data!")
|
||||
return
|
||||
@@ -49,7 +49,7 @@
|
||||
spawn(0)
|
||||
anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir)
|
||||
|
||||
/obj/machinery/abductor/pad/proc/Retrieve(var/mob/living/carbon/human/target)
|
||||
/obj/machinery/abductor/pad/proc/Retrieve(var/mob/living/target)
|
||||
flick("alien-pad", src)
|
||||
spawn(0)
|
||||
anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir)
|
||||
|
||||
@@ -487,6 +487,17 @@ proc/display_roundstart_logout_report()
|
||||
|
||||
return text
|
||||
|
||||
/datum/game_mode/proc/printobjectives(var/datum/mind/ply)
|
||||
var/text = ""
|
||||
var/count = 1
|
||||
for(var/datum/objective/objective in ply.objectives)
|
||||
if(objective.check_completion())
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='green'><b>Success!</b></font>"
|
||||
else
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='danger'>Fail.</span>"
|
||||
count++
|
||||
return text
|
||||
|
||||
//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
|
||||
/datum/game_mode/proc/age_check(client/C)
|
||||
if(get_remaining_days(C) == 0)
|
||||
|
||||
@@ -73,11 +73,10 @@
|
||||
//Cameras can't track people wearing an agent card or a ninja hood.
|
||||
if(H.wear_id && istype(H.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
|
||||
continue
|
||||
//Generic variable who's existance is to blame on shitty old ninja code
|
||||
if(istype(H.head, /obj/item/clothing/head))
|
||||
var/obj/item/clothing/head/hat = H.head
|
||||
if(hat.blockTracking)
|
||||
continue
|
||||
if(istype(H.head, /obj/item/clothing/head))
|
||||
var/obj/item/clothing/head/hat = H.head
|
||||
if(hat.blockTracking)
|
||||
continue
|
||||
|
||||
// Now, are they viewable by a camera? (This is last because it's the most intensive check)
|
||||
if(!near_camera(M))
|
||||
@@ -130,10 +129,10 @@
|
||||
U << "Follow camera mode terminated."
|
||||
U.cameraFollow = null
|
||||
return
|
||||
if(istype(H.head, /obj/item/clothing/head))
|
||||
var/obj/item/clothing/head/hat = H.head
|
||||
if(hat.blockTracking)
|
||||
U << "Follow camera mode terminated."
|
||||
if(istype(H.head, /obj/item/clothing/head))
|
||||
var/obj/item/clothing/head/hat = H.head
|
||||
if(hat.blockTracking)
|
||||
U << "Follow camera mode terminated."
|
||||
U.cameraFollow = null
|
||||
return
|
||||
if(H.digitalcamo)
|
||||
@@ -194,4 +193,4 @@
|
||||
else
|
||||
if (sorttext(a.c_tag, b.c_tag) < 0)
|
||||
L.Swap(j, j + 1)
|
||||
return L
|
||||
return L
|
||||
|
||||
@@ -25,3 +25,7 @@
|
||||
/turf/unsimulated/floor/abductor
|
||||
name = "alien floor"
|
||||
icon_state = "alienpod1"
|
||||
|
||||
/turf/unsimulated/floor/abductor/New()
|
||||
..()
|
||||
icon_state = "alienpod[rand(1,9)]"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
if(success)
|
||||
if(target_zone == surgery.location)
|
||||
if(get_location_accessible(target, target_zone))
|
||||
if(get_location_accessible(target, target_zone) || surgery.ignore_clothes)
|
||||
initiate(user, target, target_zone, tool, surgery)
|
||||
return 1
|
||||
else
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 108 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 349 KiB After Width: | Height: | Size: 377 KiB |
Reference in New Issue
Block a user