mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 13:10:02 +01:00
Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-sync
This commit is contained in:
@@ -74,11 +74,11 @@
|
||||
objectives += team.objectives
|
||||
finalize_abductor()
|
||||
// We don't want abductors to be converted by other antagonists
|
||||
owner.add_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST)
|
||||
owner.add_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_ABDUCTOR_HUD, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST)
|
||||
return ..()
|
||||
|
||||
/datum/antagonist/abductor/on_removal()
|
||||
owner.remove_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST)
|
||||
owner.remove_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_ABDUCTOR_HUD, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST)
|
||||
return ..()
|
||||
|
||||
/datum/antagonist/abductor/greet()
|
||||
|
||||
@@ -4,6 +4,14 @@ GLOBAL_LIST_EMPTY(blob_cores)
|
||||
GLOBAL_LIST_EMPTY(overminds)
|
||||
GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
|
||||
/// Clean up blob references after overmind is destroyed - called asynchronously to avoid blocking Destroy()
|
||||
/proc/cleanup_overmind_blobs(mob/eye/blob/dead_overmind)
|
||||
// Clear overmind reference from global blobs
|
||||
for(var/obj/structure/blob/blob_structure as anything in GLOB.blobs)
|
||||
if(blob_structure && blob_structure.overmind == dead_overmind)
|
||||
blob_structure.overmind = null
|
||||
blob_structure.update_appearance() //reset anything that was ours
|
||||
|
||||
|
||||
/mob/eye/blob
|
||||
name = "Blob Overmind"
|
||||
@@ -157,11 +165,19 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
else
|
||||
// If we get here, it means yes: the blob is kill
|
||||
SSticker.news_report = BLOB_DESTROYED
|
||||
|
||||
// Clear the biohazard emergency display when blob is defeated - async to avoid blocking
|
||||
INVOKE_ASYNC(src, PROC_REF(clear_biohazard_display))
|
||||
|
||||
qdel(src)
|
||||
else if(!victory_in_progress && (blobs_legit.len >= blobwincount))
|
||||
victory_in_progress = TRUE
|
||||
priority_announce("Biohazard has reached critical mass. Station loss is imminent.", "Biohazard Alert")
|
||||
SSsecurity_level.set_level(SEC_LEVEL_DELTA)
|
||||
|
||||
// Set status displays to biohazard alert - critical level
|
||||
send_status_display_biohazard_alert()
|
||||
|
||||
max_blob_points = INFINITY
|
||||
blob_points = INFINITY
|
||||
addtimer(CALLBACK(src, PROC_REF(victory)), 45 SECONDS)
|
||||
@@ -174,6 +190,10 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
|
||||
if(announcement_time && (world.time >= announcement_time || blobs_legit.len >= announcement_size) && !has_announced)
|
||||
priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", ANNOUNCER_OUTBREAK5)
|
||||
|
||||
// Set status displays to biohazard alert
|
||||
send_status_display_biohazard_alert()
|
||||
|
||||
has_announced = TRUE
|
||||
|
||||
/// Create a blob spore and link it to us
|
||||
@@ -186,7 +206,26 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
/mob/eye/blob/proc/register_new_minion(mob/living/minion)
|
||||
blob_mobs |= minion
|
||||
|
||||
/// Clear biohazard emergency display when blob is defeated
|
||||
/mob/eye/blob/proc/clear_biohazard_display()
|
||||
clear_status_display_biohazard()
|
||||
|
||||
/mob/eye/blob/proc/victory()
|
||||
// Set victory flags immediately
|
||||
var/datum/antagonist/blob/B = mind.has_antag_datum(/datum/antagonist/blob)
|
||||
if(B)
|
||||
var/datum/objective/blob_takeover/main_objective = locate() in B.objectives
|
||||
if(main_objective)
|
||||
main_objective.completed = TRUE
|
||||
|
||||
to_chat(world, span_blobannounce("[real_name] consumed the station in an unstoppable tide!"))
|
||||
SSticker.news_report = BLOB_WIN
|
||||
SSticker.force_ending = FORCE_END_ROUND
|
||||
|
||||
// Handle the heavy victory operations asynchronously
|
||||
INVOKE_ASYNC(src, PROC_REF(victory_sequence))
|
||||
|
||||
/mob/eye/blob/proc/victory_sequence()
|
||||
sound_to_playing_players('sound/announcer/alarm/nuke_alarm.ogg', 70)
|
||||
sleep(10 SECONDS)
|
||||
for(var/mob/living/live_guy as anything in GLOB.mob_living_list)
|
||||
@@ -222,25 +261,11 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
check_area.SetInvisibility(INVISIBILITY_NONE)
|
||||
check_area.blend_mode = 0
|
||||
|
||||
var/datum/antagonist/blob/B = mind.has_antag_datum(/datum/antagonist/blob)
|
||||
if(B)
|
||||
var/datum/objective/blob_takeover/main_objective = locate() in B.objectives
|
||||
if(main_objective)
|
||||
main_objective.completed = TRUE
|
||||
to_chat(world, span_blobannounce("[real_name] consumed the station in an unstoppable tide!"))
|
||||
SSticker.news_report = BLOB_WIN
|
||||
SSticker.force_ending = FORCE_END_ROUND
|
||||
|
||||
/mob/eye/blob/Destroy()
|
||||
QDEL_NULL(blobstrain)
|
||||
QDEL_NULL(blob_power_hud)
|
||||
for(var/BL in GLOB.blobs)
|
||||
var/obj/structure/blob/B = BL
|
||||
if(B && B.overmind == src)
|
||||
B.overmind = null
|
||||
B.update_appearance() //reset anything that was ours
|
||||
for(var/obj/structure/blob/blob_structure as anything in all_blobs)
|
||||
blob_structure.overmind = null
|
||||
|
||||
// Clear references immediately without iterating to avoid blocking
|
||||
all_blobs = null
|
||||
resource_blobs = null
|
||||
factory_blobs = null
|
||||
@@ -253,6 +278,9 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
GLOB.blob_telepathy_mobs -= src
|
||||
|
||||
// Handle blob cleanup asynchronously to avoid blocking Destroy()
|
||||
INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(cleanup_overmind_blobs), src)
|
||||
|
||||
return ..()
|
||||
|
||||
/mob/eye/blob/Login()
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
roundend_category = "changelings"
|
||||
antagpanel_category = "Changeling"
|
||||
pref_flag = ROLE_CHANGELING
|
||||
antag_moodlet = /datum/mood_event/focused
|
||||
antag_moodlet = /datum/mood_event/ling
|
||||
antag_hud_name = "changeling"
|
||||
hijack_speed = 0.5
|
||||
ui_name = "AntagInfoChangeling"
|
||||
|
||||
@@ -465,7 +465,7 @@
|
||||
|
||||
var/old_color = target.color
|
||||
target.color = COLOR_HERETIC_GREEN
|
||||
animate(target, color = old_color, time = 4 SECONDS, easing = EASE_IN)
|
||||
animate(target, color = old_color, time = 4 SECONDS, easing = SINE_EASING|EASE_IN)
|
||||
target.mob_light(range = 1.5, power = 2.5, color = COLOR_HERETIC_GREEN, duration = 0.5 SECONDS)
|
||||
playsound(target, 'sound/effects/magic/magic_block_mind.ogg', 150, TRUE) // insanely quiet
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
SEND_SOUND(mind.current, 'sound/music/antag/bloodcult/bloodcult_eyes.ogg')
|
||||
to_chat(mind.current, span_cult_large(span_warning("The veil weakens as your cult grows, your eyes begin to glow...")))
|
||||
mind.current.AddElement(/datum/element/cult_eyes)
|
||||
ADD_TRAIT(mind.current, TRAIT_DESENSITIZED, CULT_TRAIT)
|
||||
cult_risen = TRUE
|
||||
log_game("The blood cult has risen with [cultplayers] players.")
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
|
||||
if(cult_team.cult_risen)
|
||||
current.AddElement(/datum/element/cult_eyes, initial_delay = 0 SECONDS)
|
||||
ADD_TRAIT(current, TRAIT_DESENSITIZED, CULT_TRAIT)
|
||||
if(cult_team.cult_ascendent)
|
||||
current.AddElement(/datum/element/cult_halo, initial_delay = 0 SECONDS)
|
||||
|
||||
@@ -87,7 +88,8 @@
|
||||
if (HAS_TRAIT(current, TRAIT_CULT_HALO))
|
||||
current.RemoveElement(/datum/element/cult_halo)
|
||||
|
||||
REMOVE_TRAIT(owner.current, TRAIT_HEALS_FROM_CULT_PYLONS, CULT_TRAIT)
|
||||
REMOVE_TRAIT(current, TRAIT_DESENSITIZED, CULT_TRAIT)
|
||||
REMOVE_TRAIT(current, TRAIT_HEALS_FROM_CULT_PYLONS, CULT_TRAIT)
|
||||
|
||||
/datum/antagonist/cult/on_mindshield(mob/implanter)
|
||||
if(!silent)
|
||||
|
||||
@@ -1173,14 +1173,13 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0)
|
||||
empulse(T, 0.42*(intensity), 1)
|
||||
|
||||
var/list/images = list()
|
||||
var/datum/atom_hud/sec_hud = GLOB.huds[DATA_HUD_SECURITY_ADVANCED]
|
||||
for(var/mob/living/M in GLOB.alive_mob_list)
|
||||
if(!is_valid_z_level(T, get_turf(M)))
|
||||
continue
|
||||
if(ishuman(M))
|
||||
if(!IS_CULTIST(M))
|
||||
sec_hud.hide_from(M)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(hudFix), M), duration)
|
||||
ADD_TRAIT(M, TRAIT_BLOCK_SECHUD, CULT_TRAIT)
|
||||
addtimer(TRAIT_CALLBACK_REMOVE(M, TRAIT_BLOCK_SECHUD, CULT_TRAIT), duration)
|
||||
var/image/A = image('icons/mob/nonhuman-player/cult.dmi',M,"cultist", ABOVE_MOB_LAYER)
|
||||
A.override = 1
|
||||
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/noncult, "human_apoc", A, NONE)
|
||||
@@ -1257,13 +1256,3 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0)
|
||||
if(I.icon_state != "bloodsparkles")
|
||||
I.override = TRUE
|
||||
sleep(19 SECONDS)
|
||||
|
||||
|
||||
|
||||
/proc/hudFix(mob/living/carbon/human/target)
|
||||
if(!target || !target.client)
|
||||
return
|
||||
var/obj/O = target.get_item_by_slot(ITEM_SLOT_EYES)
|
||||
if(istype(O, /obj/item/clothing/glasses/hud/security))
|
||||
var/datum/atom_hud/sec_hud = GLOB.huds[DATA_HUD_SECURITY_ADVANCED]
|
||||
sec_hud.show_to(target)
|
||||
|
||||
@@ -38,6 +38,14 @@
|
||||
owner?.current.faction |= FACTION_ERT // SKYRAT EDIT ADDITION
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/ert/apply_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/carbon/human/officer = mob_override || owner.current
|
||||
ADD_TRAIT(officer, TRAIT_DESENSITIZED, REF(src))
|
||||
|
||||
/datum/antagonist/ert/remove_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/carbon/human/officer = mob_override || owner.current
|
||||
REMOVE_TRAIT(officer, TRAIT_DESENSITIZED, REF(src))
|
||||
|
||||
/datum/antagonist/ert/get_team()
|
||||
return ert_team
|
||||
|
||||
|
||||
@@ -85,8 +85,8 @@
|
||||
|
||||
if(istype(equip_to.w_uniform, /obj/item/clothing/under))
|
||||
var/obj/item/clothing/under/uniform = equip_to.w_uniform
|
||||
uniform.sensor_mode = NO_SENSORS
|
||||
uniform.has_sensor = NO_SENSORS
|
||||
uniform.set_sensor_mode(SENSOR_OFF)
|
||||
uniform.set_has_sensor(NO_SENSORS)
|
||||
|
||||
/datum/outfit/russian_hunter/leader
|
||||
name = "Russian Hunter Leader"
|
||||
|
||||
@@ -606,6 +606,7 @@
|
||||
if(!isnull(ascension_achievement))
|
||||
user.client?.give_award(ascension_achievement, user)
|
||||
heretic_datum.increase_rust_strength()
|
||||
ADD_TRAIT(user, TRAIT_DESENSITIZED, type)
|
||||
return TRUE
|
||||
|
||||
/datum/heretic_knowledge/ultimate/cleanup_atoms(list/selected_atoms)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
icon_state = "phylactery"
|
||||
base_icon_state = "phylactery"
|
||||
has_variable_transfer_amount = FALSE
|
||||
reagent_flags = OPENCONTAINER | DUNKABLE | TRANSPARENT
|
||||
initial_reagent_flags = OPENCONTAINER | DUNKABLE | TRANSPARENT
|
||||
volume = 10
|
||||
/// Cooldown before you can steal blood again
|
||||
COOLDOWN_DECLARE(drain_cooldown)
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
else
|
||||
team_color = pick(COLOR_CULT_RED, COLOR_GREEN)
|
||||
|
||||
user.add_traits(list(TRAIT_MANSUS_TOUCHED, TRAIT_BLOODY_MESS), REF(src))
|
||||
user.add_traits(list(TRAIT_MANSUS_TOUCHED, TRAIT_BLOOD_FOUNTAIN), REF(src))
|
||||
to_chat(user, span_alert("Your heart takes on a strange yet soothing irregular rhythm, and your blood feels significantly less viscous than it used to be. You're not sure if that's a good thing."))
|
||||
component = user.AddComponent( \
|
||||
/datum/component/aura_healing, \
|
||||
@@ -65,7 +65,7 @@
|
||||
spell_action.cooldown_time *= 2
|
||||
active = FALSE
|
||||
QDEL_NULL(component)
|
||||
user.remove_traits(list(TRAIT_MANSUS_TOUCHED, TRAIT_BLOODY_MESS), REF(src))
|
||||
user.remove_traits(list(TRAIT_MANSUS_TOUCHED, TRAIT_BLOOD_FOUNTAIN), REF(src))
|
||||
|
||||
// If boosted enable is set, to prevent false dropped() calls from repeatedly nuking the max spells.
|
||||
var/datum/action/innate/cult/blood_magic/magic_holder = locate() in user.actions
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
var/old_color = carbon_hit.color
|
||||
carbon_hit.color = COLOR_CULT_RED
|
||||
animate(carbon_hit, color = old_color, time = 4 SECONDS, easing = EASE_IN)
|
||||
animate(carbon_hit, color = old_color, time = 4 SECONDS, easing = SINE_EASING|EASE_IN)
|
||||
carbon_hit.mob_light(range = 1.5, power = 2.5, color = COLOR_CULT_RED, duration = 0.5 SECONDS)
|
||||
playsound(carbon_hit, 'sound/effects/magic/curse.ogg', 50, TRUE)
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
if(WOUND_SEVERITY_CRITICAL)
|
||||
heal_amt = 6
|
||||
var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[wound.type]
|
||||
if (pregen_data.wounding_types_valid(list(WOUND_BURN)))
|
||||
if (pregen_data.wounding_types_valid(WOUND_BURN))
|
||||
carbie.adjustFireLoss(-heal_amt)
|
||||
else
|
||||
carbie.adjustBruteLoss(-heal_amt)
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
on_made_callback?.Invoke(human_target)
|
||||
ADD_TRAIT(human_target, TRAIT_FAKEDEATH, TRAIT_STATUS_EFFECT(id))
|
||||
ADD_TRAIT(human_target, TRAIT_HERETIC_SUMMON, TRAIT_STATUS_EFFECT(id))
|
||||
ADD_TRAIT(human_target, TRAIT_DESENSITIZED, TRAIT_STATUS_EFFECT(id))
|
||||
human_target.become_husk(TRAIT_STATUS_EFFECT(id))
|
||||
human_target.faction |= FACTION_HERETIC
|
||||
|
||||
@@ -92,6 +93,7 @@
|
||||
on_lost_callback?.Invoke(human_target)
|
||||
REMOVE_TRAIT(human_target, TRAIT_FAKEDEATH, TRAIT_STATUS_EFFECT(id))
|
||||
REMOVE_TRAIT(human_target, TRAIT_HERETIC_SUMMON, TRAIT_STATUS_EFFECT(id))
|
||||
REMOVE_TRAIT(human_target, TRAIT_DESENSITIZED, TRAIT_STATUS_EFFECT(id))
|
||||
human_target.cure_husk(TRAIT_STATUS_EFFECT(id))
|
||||
human_target.faction -= FACTION_HERETIC
|
||||
human_target.mind?.remove_antag_datum(/datum/antagonist/heretic_monster)
|
||||
|
||||
@@ -8,12 +8,13 @@
|
||||
antag_flags = ANTAG_FAKE|ANTAG_SKIP_GLOBAL_LIST
|
||||
/// Traits we apply/remove to our target on-demand.
|
||||
var/static/list/applicable_traits = list(
|
||||
TRAIT_DESENSITIZED,
|
||||
TRAIT_NOBREATH,
|
||||
TRAIT_NODISMEMBER,
|
||||
TRAIT_NOFIRE,
|
||||
TRAIT_NOGUNS,
|
||||
TRAIT_TOSS_GUN_HARD,
|
||||
TRAIT_SHOCKIMMUNE,
|
||||
TRAIT_TOSS_GUN_HARD,
|
||||
)
|
||||
|
||||
/datum/antagonist/highlander/apply_innate_effects(mob/living/mob_override)
|
||||
|
||||
@@ -409,8 +409,8 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf))
|
||||
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_malf_ai_undo_lockdown)), 90 SECONDS)
|
||||
|
||||
var/obj/machinery/computer/communications/random_comms_console = locate() in GLOB.shuttle_caller_list
|
||||
random_comms_console?.post_status("alert", "lockdown")
|
||||
// Set status displays to lockdown alert
|
||||
send_status_display_lockdown_alert()
|
||||
|
||||
minor_announce("Hostile runtime detected in door controllers. Isolation lockdown protocols are now in effect. Please remain calm.", "Network Alert:", TRUE)
|
||||
to_chat(owner, span_danger("Lockdown initiated. Network reset in 90 seconds."))
|
||||
@@ -427,6 +427,9 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf))
|
||||
INVOKE_ASYNC(locked_down, TYPE_PROC_REF(/obj/machinery/door, disable_lockdown))
|
||||
CHECK_TICK
|
||||
|
||||
// Clear the lockdown emergency display
|
||||
clear_status_display_lockdown()
|
||||
|
||||
/// Override Machine: Allows the AI to override a machine, animating it into an angry, living version of itself.
|
||||
/datum/ai_module/malf/destructive/override_machine
|
||||
name = "Machine Override"
|
||||
@@ -890,7 +893,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf))
|
||||
|
||||
/datum/ai_module/malf/upgrade/upgrade_turrets/upgrade(mob/living/silicon/ai/AI)
|
||||
for(var/obj/machinery/porta_turret/ai/turret as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/porta_turret/ai))
|
||||
turret.AddElement(/datum/element/empprotection, EMP_PROTECT_ALL)
|
||||
turret.AddElement(/datum/element/empprotection, EMP_PROTECT_ALL|EMP_NO_EXAMINE)
|
||||
turret.max_integrity = 200
|
||||
turret.repair_damage(200)
|
||||
turret.lethal_projectile = /obj/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR.
|
||||
|
||||
@@ -17,6 +17,14 @@
|
||||
forge_objectives()
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/nightmare/apply_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/nightmare = mob_override || owner.current
|
||||
nightmare.mob_mood.mood_modifier -= 1
|
||||
|
||||
/datum/antagonist/nightmare/remove_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/nightmare = mob_override || owner.current
|
||||
nightmare.mob_mood.mood_modifier += 1
|
||||
|
||||
/datum/outfit/nightmare
|
||||
name = "Nightmare (Preview only)"
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
/datum/antagonist/nukeop/on_gain()
|
||||
give_alias()
|
||||
forge_objectives()
|
||||
owner.current.add_personality(/datum/personality/callous)
|
||||
. = ..()
|
||||
owner.set_assigned_role(SSjob.get_job_type(job_type))
|
||||
equip_op()
|
||||
@@ -129,6 +130,7 @@
|
||||
|
||||
var/mob/living/carbon/human/operative = owner.current
|
||||
ADD_TRAIT(operative, TRAIT_NOFEAR_HOLDUPS, INNATE_TRAIT)
|
||||
ADD_TRAIT(operative, TRAIT_DESENSITIZED, INNATE_TRAIT)
|
||||
|
||||
if(!nukeop_outfit) // this variable is null in instances where an antagonist datum is granted via enslaving the mind (/datum/mind/proc/enslave_mind_to_creator), like in golems.
|
||||
return
|
||||
|
||||
@@ -102,7 +102,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec)
|
||||
|
||||
var/datum/techweb/station_techweb = locate(/datum/techweb/science) in SSresearch.techwebs
|
||||
if(station_techweb)
|
||||
var/obj/machinery/announcement_system/announcement_system = get_announcement_system()
|
||||
var/obj/machinery/announcement_system/announcement_system = get_announcement_system(null, null, list(RADIO_CHANNEL_SCIENCE))
|
||||
if (!isnull(announcement_system))
|
||||
announcement_system.broadcast("Additional research data received from Nanotrasen R&D Division following the emergency protocol.", list(RADIO_CHANNEL_SCIENCE), TRUE)
|
||||
station_techweb.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS * 3))
|
||||
|
||||
@@ -50,9 +50,8 @@
|
||||
//dont want anyone noticing there's two now
|
||||
var/mob/living/carbon/human/clone_human = owner.current
|
||||
var/obj/item/clothing/under/sensor_clothes = clone_human.w_uniform
|
||||
if(sensor_clothes)
|
||||
sensor_clothes.sensor_mode = SENSOR_OFF
|
||||
clone_human.update_suit_sensors()
|
||||
if(istype(sensor_clothes))
|
||||
sensor_clothes.set_sensor_mode(SENSOR_OFF)
|
||||
|
||||
// Perform a quick copy of existing memories.
|
||||
// This may result in some minutely imperfect memories, but it'll do
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
show_in_antagpanel = FALSE
|
||||
show_to_ghosts = TRUE
|
||||
suicide_cry = "FOR ME MATEYS!!"
|
||||
stinger_sound = 'sound/music/antag/pirate/pirate_start.ogg'
|
||||
hijack_speed = 2 // That is without doubt the worst pirate I have ever seen.
|
||||
var/datum/team/pirate/crew
|
||||
|
||||
@@ -45,11 +46,12 @@
|
||||
var/datum/language_holder/holder = owner_mob.get_language_holder()
|
||||
holder.grant_language(/datum/language/piratespeak, source = LANGUAGE_PIRATE)
|
||||
holder.selected_language = /datum/language/piratespeak
|
||||
ADD_TRAIT(owner_mob, TRAIT_DESENSITIZED, REF(src))
|
||||
|
||||
/datum/antagonist/pirate/remove_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/owner_mob = mob_override || owner.current
|
||||
if (owner_mob)
|
||||
owner_mob.remove_language(/datum/language/piratespeak, source = LANGUAGE_PIRATE)
|
||||
owner_mob.remove_language(/datum/language/piratespeak, source = LANGUAGE_PIRATE)
|
||||
REMOVE_TRAIT(owner_mob, TRAIT_DESENSITIZED, REF(src))
|
||||
|
||||
/datum/team/pirate
|
||||
name = "\improper Pirate crew"
|
||||
|
||||
@@ -25,10 +25,9 @@
|
||||
outfit_id.update_icon()
|
||||
|
||||
var/obj/item/clothing/under/pirate_uniform = equipped.w_uniform
|
||||
if(pirate_uniform)
|
||||
pirate_uniform.has_sensor = NO_SENSORS
|
||||
pirate_uniform.sensor_mode = SENSOR_OFF
|
||||
equipped.update_suit_sensors()
|
||||
if(istype(pirate_uniform))
|
||||
pirate_uniform.set_has_sensor(NO_SENSORS)
|
||||
pirate_uniform.set_sensor_mode(SENSOR_OFF)
|
||||
|
||||
/datum/outfit/pirate/captain
|
||||
name = "Space Pirate Captain"
|
||||
|
||||
@@ -73,6 +73,10 @@ GLOBAL_DATUM(revolution_handler, /datum/revolution_handler)
|
||||
if(isnull(real_headrev))
|
||||
continue
|
||||
add_memory_in_range(real_headrev, 5, /datum/memory/revolution_rev_victory, protagonist = real_headrev)
|
||||
add_personality_mood_to_viewers(real_headrev, "revwin", list(
|
||||
/datum/personality/nt/loyalist = /datum/mood_event/loyalist_revs_win,
|
||||
/datum/personality/nt/disillusioned = /datum/mood_event/disillusioned_revs_win,
|
||||
), range = 5)
|
||||
|
||||
result = REVOLUTION_VICTORY
|
||||
|
||||
@@ -99,6 +103,10 @@ GLOBAL_DATUM(revolution_handler, /datum/revolution_handler)
|
||||
var/mob/living/head_of_staff = head_tracker.target?.current
|
||||
if(!isnull(head_of_staff))
|
||||
add_memory_in_range(head_of_staff, 5, /datum/memory/revolution_heads_victory, protagonist = head_of_staff)
|
||||
add_personality_mood_to_viewers(head_of_staff, "revlost", list(
|
||||
/datum/personality/nt/loyalist = /datum/mood_event/loyalist_revs_lost,
|
||||
/datum/personality/nt/disillusioned = /datum/mood_event/disillusioned_revs_lost
|
||||
), range = 5)
|
||||
|
||||
priority_announce("It appears the mutiny has been quelled. Please return yourself and your incapacitated colleagues to work. \
|
||||
We have remotely blacklisted the head revolutionaries in your medical records to prevent accidental revival.", null, null, null, "[command_name()] Loyalty Monitoring Division")
|
||||
|
||||
@@ -15,6 +15,14 @@
|
||||
///Whether or not this ninja will obtain objectives
|
||||
var/give_objectives = TRUE
|
||||
|
||||
/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override)
|
||||
var/mob/ninja = mob_override || owner.current
|
||||
ADD_TRAIT(ninja, TRAIT_DESENSITIZED, REF(src))
|
||||
|
||||
/datum/antagonist/ninja/remove_innate_effects(mob/living/mob_override)
|
||||
var/mob/ninja = mob_override || owner.current
|
||||
REMOVE_TRAIT(ninja, TRAIT_DESENSITIZED, REF(src))
|
||||
|
||||
/**
|
||||
* Proc that equips the space ninja outfit on a given individual. By default this is the owner of the antagonist datum.
|
||||
*
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
/datum/action/cooldown/spell/pointed/unsettle
|
||||
name = "Unsettle"
|
||||
desc = "Stare directly into someone who doesn't see you. Remain in their view for a bit to stun them for 2 seconds and announce your presence to them. "
|
||||
button_icon_state = "terrify"
|
||||
button_icon = 'icons/mob/actions/actions_voidwalker.dmi'
|
||||
button_icon_state = "unsettle"
|
||||
background_icon_state = "bg_void"
|
||||
overlay_icon_state = null
|
||||
panel = null
|
||||
@@ -80,7 +81,7 @@
|
||||
name = "Cosmic Transmit"
|
||||
background_icon_state = "bg_void"
|
||||
button_icon = 'icons/mob/actions/actions_voidwalker.dmi'
|
||||
button_icon_state = "voidwalker_telepathy"
|
||||
button_icon_state = "telepathy"
|
||||
panel = null
|
||||
overlay_icon_state = null
|
||||
|
||||
@@ -112,7 +113,9 @@
|
||||
|
||||
/datum/action/cooldown/mob_cooldown/charge/voidwalker
|
||||
name = "Cosmic Dash"
|
||||
button_icon_state = "void_dash"
|
||||
background_icon_state = "bg_void"
|
||||
button_icon = 'icons/mob/actions/actions_voidwalker.dmi'
|
||||
button_icon_state = "dash"
|
||||
charge_past = 0
|
||||
charge_damage = 20
|
||||
cooldown_time = 8 SECONDS
|
||||
|
||||
@@ -84,7 +84,8 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key)
|
||||
CRASH("Wizard datum with no owner.")
|
||||
assign_ritual()
|
||||
equip_wizard()
|
||||
owner.current.add_quirk(/datum/quirk/introvert, announce = FALSE)
|
||||
owner.current.add_personality(/datum/personality/introvert)
|
||||
owner.current.add_personality(/datum/personality/callous) // no sense of right and wrong
|
||||
if(give_objectives)
|
||||
create_objectives()
|
||||
if(move_to_lair)
|
||||
|
||||
Reference in New Issue
Block a user