Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-sync

This commit is contained in:
xPokee
2025-10-03 07:05:54 -04:00
517 changed files with 24339 additions and 21253 deletions
@@ -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()
+44 -16
View File
@@ -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"
+1 -1
View File
@@ -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)
+2 -13
View File
@@ -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)
+8
View File
@@ -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
+4 -2
View File
@@ -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
+2 -1
View File
@@ -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)