Merge remote-tracking branch 'upstream/master' into fix-cqc

# Conflicts:
#	code/game/objects/items.dm
This commit is contained in:
Fox McCloud
2019-04-07 19:54:14 -04:00
1409 changed files with 1712308 additions and 63928 deletions
+25 -4
View File
@@ -23,6 +23,8 @@
button = new
button.linked_action = src
button.name = name
if(desc)
button.desc = desc
/datum/action/Destroy()
if(owner)
@@ -44,12 +46,14 @@
M.update_action_buttons()
/datum/action/proc/Remove(mob/M)
owner = null
if(!M)
return
if(M.client)
M.client.screen -= button
button.moved = FALSE //so the button appears in its normal position when given to another owner.
M.actions -= src
M.update_action_buttons()
owner = null
/datum/action/proc/Trigger()
if(!IsAvailable())
@@ -80,6 +84,7 @@
if(button)
button.icon = button_icon
button.icon_state = background_icon_state
button.desc = desc
ApplyIcon(button)
@@ -102,20 +107,24 @@
/datum/action/item_action
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS
var/use_itemicon = TRUE
/datum/action/item_action/New(Target)
/datum/action/item_action/New(Target, custom_icon, custom_icon_state)
..()
var/obj/item/I = target
I.actions += src
if(custom_icon && custom_icon_state)
use_itemicon = FALSE
icon_icon = custom_icon
button_icon_state = custom_icon_state
/datum/action/item_action/Destroy()
var/obj/item/I = target
I.actions -= src
return ..()
/datum/action/item_action/Trigger()
/datum/action/item_action/Trigger(attack_self = TRUE) //Maybe we don't want to click the thing itself
if(!..())
return 0
if(target)
if(target && attack_self)
var/obj/item/I = target
I.ui_action_click(owner, type)
return 1
@@ -313,6 +322,14 @@
/datum/action/item_action/toggle_helmet
name = "Toggle Helmet"
/datum/action/item_action/remove_tape
name = "Remove Duct Tape"
/datum/action/item_action/remove_tape/Trigger(attack_self = FALSE)
if(..())
GET_COMPONENT_FROM(DT, /datum/component/ducttape, target)
DT.remove_tape(target, usr)
/datum/action/item_action/toggle_jetpack
name = "Toggle Jetpack"
@@ -420,6 +437,7 @@
var/obj/effect/proc_holder/spell/S = target
S.action = src
name = S.name
desc = S.desc
button_icon = S.action_icon
button_icon_state = S.action_icon_state
background_icon_state = S.action_background_icon_state
@@ -443,6 +461,9 @@
return 0
var/obj/effect/proc_holder/spell/spell = target
if(spell.special_availability_check)
return 1
if(owner)
return spell.can_cast(owner)
return 0
+31
View File
@@ -17,6 +17,10 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
/datum/ai_law/zero/get_index()
return 0
/datum/ai_law/sixsixsix/get_index()
return 666
/datum/ai_laws
var/name = "Unknown Laws"
var/law_header = "Prime Directives"
@@ -27,9 +31,11 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
var/list/datum/ai_law/inherent_laws = list()
var/list/datum/ai_law/supplied_laws = list()
var/list/datum/ai_law/ion/ion_laws = list()
var/list/datum/ai_law/sixsixsix/devil_laws = list()
var/list/datum/ai_law/sorted_laws = list()
var/state_zeroth = 0
var/list/state_devil = list()
var/list/state_ion = list()
var/list/state_inherent = list()
var/list/state_supplied = list()
@@ -58,6 +64,9 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
for(var/ion_law in ion_laws)
sorted_laws += ion_law
for(var/evil_law in devil_laws)
sorted_laws += evil_law
if(zeroth_law)
sorted_laws += zeroth_law
@@ -117,6 +126,21 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
zeroth_law_borg = null
sorted_laws.Cut()
/datum/ai_laws/proc/set_sixsixsix_law(var/law)
if(!law)
return
for(var/datum/ai_law/AL in devil_laws)
if(AL.law == law)
return
var/new_law = new/datum/ai_law/sixsixsix(law)
devil_laws += new_law
if(state_devil.len < devil_laws.len)
state_devil += 1
sorted_laws.Cut()
/datum/ai_laws/proc/add_ion_law(var/law)
if(!law)
return
@@ -185,6 +209,9 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
/datum/ai_law/ion/delete_law(var/datum/ai_laws/laws)
laws.internal_delete_law(laws.ion_laws, laws.state_ion, src)
/datum/ai_law/sixsixsix/delete_law(var/datum/ai_laws/laws)
laws.internal_delete_law(laws.devil_laws, laws.state_devil, src)
/datum/ai_law/inherent/delete_law(var/datum/ai_laws/laws)
laws.internal_delete_law(laws.inherent_laws, laws.state_inherent, src)
@@ -210,6 +237,10 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
zeroth_law = null
zeroth_law_borg = null
/datum/ai_laws/proc/clear_sixsixsix_laws()
devil_laws.Cut()
sorted_laws.Cut()
/datum/ai_laws/proc/clear_ion_laws()
ion_laws.Cut()
sorted_laws.Cut()
+70
View File
@@ -0,0 +1,70 @@
/datum/component/ducttape
var/x_offset = 0
var/y_offset = 0
var/icon/tape_overlay = null
/datum/component/ducttape/Initialize(obj/item/I, mob/user, x, y)
if(!istype(I)) //Something went wrong
return
x_offset = x
y_offset = y
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/add_tape_text)
RegisterSignal(parent, COMSIG_OBJ_UPDATE_ICON, .proc/add_tape_overlay)
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/afterattack)
RegisterSignal(parent, COMSIG_ITEM_PICKUP, .proc/pick_up)
I.update_icon() //Do this first so the action button properly shows the icon
var/datum/action/item_action/remove_tape/RT = new(I)
if(I.loc == user)
RT.Grant(user)
/datum/component/proc/add_tape_text(datum/source, mob/user)
to_chat(user, "<span class='notice'>There's some sticky tape attached to [source].</span>")
/datum/component/ducttape/proc/add_tape_overlay(obj/item/O)
tape_overlay = new('icons/obj/bureaucracy.dmi', "tape")
tape_overlay.Shift(EAST, x_offset - 2)
tape_overlay.Shift(NORTH, y_offset - 2)
O.overlays += tape_overlay
/datum/component/ducttape/proc/remove_tape(obj/item/I, mob/user)
to_chat(user, "<span class='notice'>You tear the tape off [I]!</span>")
playsound(I, 'sound/items/poster_ripped.ogg', 50, 1)
new /obj/item/trash/tapetrash(user.loc)
I.update_icon()
I.anchored = initial(I.anchored)
for(var/datum/action/item_action/remove_tape/RT in I.actions)
RT.Remove(user)
RT.Destroy()
I.overlays.Cut(tape_overlay)
user.transfer_fingerprints_to(I)
Destroy()
/datum/component/ducttape/proc/afterattack(obj/item/I, atom/target, mob/user, proximity, params)
if(!proximity)
return
if(!isturf(target))
return
if(!user.unEquip(I))
return
var/turf/source_turf = get_turf(I)
var/turf/target_turf = target
var/list/clickparams = params2list(params)
var/x_offset = text2num(clickparams["icon-x"]) - 16
var/y_offset = text2num(clickparams["icon-y"]) - 16
if(target_turf != get_turf(I)) //Trying to stick it on a wall, don't move it to the actual wall or you can move the item through it. Instead set the pixels as appropriate
var/target_direction = get_dir(source_turf, target_turf)//The direction we clicked
if(target_direction & EAST)
x_offset += 32
else if(target_direction & WEST)
x_offset -= 32
if(target_direction & NORTH)
y_offset += 32
else if(target_direction & SOUTH)
y_offset -= 32
to_chat(user, "<span class='notice'>You stick [I] to [target_turf].</span>")
I.pixel_x = x_offset
I.pixel_y = y_offset
/datum/component/ducttape/proc/pick_up(obj/item/I, mob/user)
I.pixel_x = initial(I.pixel_x)
I.pixel_y = initial(I.pixel_y)
+5
View File
@@ -0,0 +1,5 @@
/datum/component/jestosterone
var/mind_type //Is the affected mob a clown / mime?
/datum/component/jestosterone/Initialize(mind_type_arg)
mind_type = mind_type_arg
+11 -6
View File
@@ -14,7 +14,7 @@
var/last_use = 0
var/use_delay = 20
/datum/component/squeak/Initialize(custom_sounds, volume_override, chance_override, step_delay_override, use_delay_override)
/datum/component/squeak/Initialize(custom_sounds, volume_override, chance_override, step_delay_override, use_delay_override, squeak_on_move)
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY), .proc/play_squeak)
@@ -22,6 +22,8 @@
RegisterSignal(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT), .proc/play_squeak)
RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/play_squeak_crossed)
RegisterSignal(parent, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react)
if(squeak_on_move)
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/play_squeak)
if(isitem(parent))
RegisterSignal(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT), .proc/play_squeak)
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/use_squeak)
@@ -47,12 +49,15 @@
else
playsound(parent, pickweight(override_squeak_sounds), volume, 1, -1)
/datum/component/squeak/proc/step_squeak()
if(steps > step_delay)
play_squeak()
steps = 0
/datum/component/squeak/proc/step_squeak(datum/source, mob/living/carbon/human/H)
if(H.m_intent == MOVE_INTENT_RUN)
if(steps > step_delay)
play_squeak()
steps = 0
else
steps++
else
steps++
play_squeak()
/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot)
RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE)
+162 -137
View File
@@ -339,10 +339,11 @@ var/record_id_num = 1001
L.fields["enzymes"] = H.dna.SE // Used in respawning
L.fields["identity"] = H.dna.UI // "
L.fields["image"] = getFlatIcon(H) //This is god-awful
L.fields["reference"] = H
locked += L
return
/proc/get_id_photo(mob/living/carbon/human/H)
/proc/get_id_photo(mob/living/carbon/human/H, var/custom_job = null)
var/icon/preview_icon = null
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = H.get_int_organ(/obj/item/organ/internal/eyes)
@@ -469,142 +470,166 @@ var/record_id_num = 1001
var/icon/clothes_s = null
if(H.mind)
switch(H.mind.assigned_role)
if("Head of Personnel")
clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Nanotrasen Representative")
clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
if("Blueshield")
clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "swat_gl"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "blueshield"), ICON_OVERLAY)
if("Magistrate")
clothes_s = new /icon('icons/mob/uniform.dmi', "really_black_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "judge"), ICON_OVERLAY)
if("Bartender")
clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Botanist")
clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Chef")
clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Janitor")
clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Librarian")
clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Quartermaster")
clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Cargo Technician")
clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Shaft Miner")
clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Lawyer")
clothes_s = new /icon('icons/mob/uniform.dmi', "internalaffairs_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Chaplain")
clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Research Director")
clothes_s = new /icon('icons/mob/uniform.dmi', "director_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
if("Scientist")
clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY)
if("Chemist")
clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY)
if("Chief Medical Officer")
clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY)
if("Medical Doctor")
clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
if("Geneticist")
clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY)
if("Virologist")
clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY)
if("Psychiatrist")
clothes_s = new /icon('icons/mob/uniform.dmi', "psych_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_UNDERLAY)
if("Paramedic")
clothes_s = new /icon('icons/mob/uniform.dmi', "paramedic_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Captain")
clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Head of Security")
clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Warden")
clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Detective")
clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY)
if("Security Pod Pilot")
clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "bomber"), ICON_OVERLAY)
if("Brig Physician")
clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "fr_jacket_open"), ICON_OVERLAY)
if("Security Officer")
clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Chief Engineer")
clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Station Engineer")
clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Life Support Specialist")
clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Mechanic")
clothes_s = new /icon('icons/mob/uniform.dmi', "mechanic_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Roboticist")
clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
else if(H.mind.assigned_role in get_all_centcom_jobs())
clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
else
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
else
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
var/job_clothes = null
if(custom_job)
job_clothes = custom_job
else if(H.mind)
job_clothes = H.mind.assigned_role
switch(job_clothes)
if("Head of Personnel")
clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Nanotrasen Representative")
clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
if("Blueshield")
clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "swat_gl"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "blueshield"), ICON_OVERLAY)
if("Magistrate")
clothes_s = new /icon('icons/mob/uniform.dmi', "really_black_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "judge"), ICON_OVERLAY)
if("Bartender")
clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Botanist")
clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Chef")
clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Janitor")
clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Librarian")
clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Barber")
clothes_s = new /icon('icons/mob/uniform.dmi', "barber_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Clown")
clothes_s = new /icon('icons/mob/uniform.dmi', "clown_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "clown"), ICON_UNDERLAY)
if("Mime")
clothes_s = new /icon('icons/mob/uniform.dmi', "mime_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Quartermaster")
clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Cargo Technician")
clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Shaft Miner")
clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Lawyer")
clothes_s = new /icon('icons/mob/uniform.dmi', "internalaffairs_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Chaplain")
clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Research Director")
clothes_s = new /icon('icons/mob/uniform.dmi', "director_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
if("Scientist")
clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY)
if("Chemist")
clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY)
if("Chief Medical Officer")
clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY)
if("Medical Doctor")
clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
if("Coroner")
clothes_s = new /icon('icons/mob/uniform.dmi', "scrubsblack_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_mort_open"), ICON_OVERLAY)
if("Geneticist")
clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY)
if("Virologist")
clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY)
if("Psychiatrist")
clothes_s = new /icon('icons/mob/uniform.dmi', "psych_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_UNDERLAY)
if("Paramedic")
clothes_s = new /icon('icons/mob/uniform.dmi', "paramedic_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Captain")
clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
if("Head of Security")
clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Warden")
clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Detective")
clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY)
if("Security Pod Pilot")
clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "bomber"), ICON_OVERLAY)
if("Brig Physician")
clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "fr_jacket_open"), ICON_OVERLAY)
if("Security Officer")
clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if("Chief Engineer")
clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Station Engineer")
clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Life Support Specialist")
clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Mechanic")
clothes_s = new /icon('icons/mob/uniform.dmi', "mechanic_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if("Roboticist")
clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
if("Syndicate Agent")
clothes_s = new /icon('icons/mob/uniform.dmi', "syndicate_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Syndicate Officer")
clothes_s = new /icon('icons/mob/uniform.dmi', "syndicate_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "swat_gl"), ICON_UNDERLAY)
if("Syndicate Nuclear Operative")
clothes_s = new /icon('icons/mob/uniform.dmi', "syndicate_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "swat_gl"), ICON_UNDERLAY)
else if(H.mind.assigned_role in get_all_centcom_jobs())
clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
else
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
preview_icon.Blend(face_s, ICON_OVERLAY) // Why do we do this twice
if(clothes_s)
+1 -1
View File
@@ -715,7 +715,7 @@
log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.")
var/minhours = input(usr, "Minimum hours required to play [M]?", "Set Min Hrs", 10) as num
message_admins("[key_name_admin(usr)] has offered control of ([key_name_admin(M)]) to ghosts with [minhours] hrs playtime")
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [M.real_name]?", poll_time = 100, min_hours = minhours)
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [M.real_name ? M.real_name : M.name]?", poll_time = 100, min_hours = minhours)
var/mob/dead/observer/theghost = null
if(candidates.len)
+6 -6
View File
@@ -9,21 +9,21 @@
/mob/proc/CanContractDisease(datum/disease/D)
if(stat == DEAD)
return 0
return FALSE
if(D.GetDiseaseID() in resistances)
return 0
return FALSE
if(HasDisease(D))
return 0
return FALSE
if(count_by_type(viruses, /datum/disease/advance) >= 3)
return 0
if(istype(D, /datum/disease/advance) && count_by_type(viruses, /datum/disease/advance) > 0)
return FALSE
if(!(type in D.viable_mobtypes))
return -1 //for stupid fucking monkies
return 1
return TRUE
/mob/proc/ContractDisease(datum/disease/D)
+1
View File
@@ -59,6 +59,7 @@ var/list/diseases = subtypesof(/datum/disease)
var/cure_chance = 8
var/carrier = FALSE //If our host is only a carrier
var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses
var/virus_heal_resistant = FALSE // Some things aren't technically viruses/traditional diseases and should be immune to edge case cure methods, like healing viruses.
var/permeability_mod = 1
var/severity = NONTHREAT
var/list/required_organs = list()
+2 -2
View File
@@ -298,7 +298,7 @@ var/list/advance_cures = list(
if(HasSymptom(S))
return
if(symptoms.len < 5 + rand(-1, 1))
if(symptoms.len < (VIRUS_SYMPTOM_LIMIT - 1) + rand(-1, 1))
symptoms += S
else
RemoveSymptom(pick(symptoms))
@@ -364,7 +364,7 @@ var/list/advance_cures = list(
if(!user)
return
var/i = 5
var/i = VIRUS_SYMPTOM_LIMIT
var/datum/disease/advance/D = new(0, null)
D.symptoms = list()
-8
View File
@@ -48,12 +48,4 @@
if(!D)
name = "Reality Enhancer"
symptoms = list(new/datum/symptom/sensory_restoration)
..(process, D, copy)
// Sensory Destruction
/datum/disease/advance/sensory_destruction/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
if(!D)
name = "Reality Destruction"
symptoms = list(new/datum/symptom/sensory_destruction)
..(process, D, copy)
@@ -45,13 +45,13 @@ Bonus
return
/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*2))-(sqrtor0(16+A.totalStealth()))
var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 2)) - (sqrtor0(16 + A.totalStealth())), 1)
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks/2)
M.adjustFireLoss(get_stacks * 0.5)
return 1
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*3))-(sqrtor0(16+A.totalStealth()))
var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 3))-(sqrtor0(16 + A.totalStealth())), 1)
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks)
return 1
return 1
@@ -69,6 +69,8 @@ Bonus
var/cured = 0
for(var/thing in M.viruses)
var/datum/disease/D = thing
if(D.virus_heal_resistant)
continue
if(D != A)
cured = 1
cured_diseases += D.GetDiseaseID()
@@ -15,8 +15,8 @@ Bonus
//////////////////////////////////////
*/
/datum/symptom/sensory_restoration
name = "Sensory Restoration"
/datum/symptom/mind_restoration
name = "Mind Restoration"
stealth = -1
resistance = -4
stage_speed = -4
@@ -24,85 +24,42 @@ Bonus
level = 5
severity = 0
/datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A)
/datum/symptom/mind_restoration/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 3))
var/mob/living/M = A.affected_mob
var/datum/reagents/RD = M.reagents
switch(A.stage)
if(2)
if(RD.check_and_add("oculine", 10, 10))
to_chat(M, "<span class='notice'>Your hearing feels clearer and crisp.</span>")
if(3)
if(RD.check_and_add("antihol", 10, 10))
to_chat(M, "<span class='notice'>You feel sober.</span>")
RD.check_and_add("oculine", 10, 10)
if(4)
if(RD.check_and_add("synaphydramine", 10, 5))
to_chat(M, "<span class='notice'>You feel focused.</span>")
RD.check_and_add("antihol", 10, 10)
RD.check_and_add("oculine", 10, 10)
if(5)
if(RD.check_and_add("mannitol", 10, 10))
to_chat(M, "<span class='notice'>Your mind feels relaxed.</span>")
RD.check_and_add("synaphydramine", 10, 5)
RD.check_and_add("antihol", 10, 10)
RD.check_and_add("oculine", 10, 10)
if(A.stage >= 3)
M.AdjustSlur(-2)
M.AdjustDrunk(-4)
M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3, 0, 1)
if(A.stage >= 4)
M.AdjustDrowsy(-2)
if(RD.has_reagent("lsd"))
RD.remove_reagent("lsd", 5)
if(RD.has_reagent("histamine"))
RD.remove_reagent("histamine", 5)
M.AdjustHallucinate(-10)
if(A.stage >= 5)
RD.check_and_add("mannitol", 10, 10)
return
/*
//////////////////////////////////////
Sensory-Destruction
noticable.
Lowers resistance
Decreases stage speed tremendously.
Decreases transmittablity tremendously.
the drugs hit them so hard they have to focus on not dying
Bonus
The body generates Sensory destructive chemicals.
You cannot taste anything anymore.
ethanol for extremely drunk victim
lsd to break the mind
impedrezene to ruin the brain
//////////////////////////////////////
*/
/datum/symptom/sensory_destruction
name = "Sensory destruction"
/datum/symptom/sensory_restoration
name = "Sensory Restoration"
stealth = -1
resistance = -2
stage_speed = -3
resistance = -3
stage_speed = -2
transmittable = -4
level = 6
severity = 5
level = 4
/datum/symptom/sensory_destruction/Activate(var/datum/disease/advance/A)
/datum/symptom/sensory_restoration/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
to_chat(M, "<span class='warning'><b>You can't taste a thing.</b></span>")
if(2)
to_chat(M, "<span class='warning'><b>You can't feel anything.</b></span>")
if(prob(10))
M.reagents.add_reagent("morphine",rand(5,7))
if(3)
M.reagents.add_reagent("ethanol",rand(5,7))
to_chat(M, "<span class='warning'><b>You feel absolutely hammered.</b></span>")
if(prob(15))
M.reagents.add_reagent("morphine",rand(5,7))
if(4)
M.reagents.add_reagent_list(list("ethanol"=rand(7,15),"lsd"=rand(5,10)))
to_chat(M, "<span class='warning'><b>You try to focus on not dying.</b></span>")
if(prob(20))
M.reagents.add_reagent("morphine",rand(5,7))
if(5)
M.reagents.add_reagent_list(list("haloperidol"=rand(5,15),"ethanol"=rand(7,20),"lsd"=rand(5,15)))
to_chat(M, "<span class='warning'><b>u can count 2 potato!</b></span>")
if(prob(25))
M.reagents.add_reagent("morphine",rand(5,7))
return
if(4, 5)
if(M.reagents.get_reagent_amount("oculine") < 20)
M.reagents.add_reagent("oculine", 20)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
to_chat(M, "<span class='notice'>[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your healing feels more acute.")]</span>")
@@ -1,38 +0,0 @@
/*
//////////////////////////////////////
Stimulant //gotta go fast
Noticable.
Lowers resistance significantly.
Decreases stage speed moderately..
Decreases transmittablity tremendously.
Moderate Level.
Bonus
The body generates Ephedrine.
//////////////////////////////////////
*/
/datum/symptom/stimulant
name = "Stimulant"
stealth = -1
resistance = -3
stage_speed = -2
transmittable = -4
level = 3
/datum/symptom/stimulant/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 10))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(5)
if(M.reagents.get_reagent_amount("ephedrine") < 10)
M.reagents.add_reagent("ephedrine", 10)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
to_chat(M, "<span class='notice'>[pick("You feel restless.", "You feel like running laps around the station.")]</span>")
return
@@ -47,44 +47,4 @@ Bonus
M.BecomeNearsighted()
if(prob(eyes.damage - 10 + 1))
if(M.BecomeBlind())
to_chat(M, "<span class='userdanger'>You go blind!</span>")
/*
//////////////////////////////////////
Ocular Restoration
Noticable.
Lowers resistance significantly.
Decreases stage speed moderately..
Decreases transmittablity tremendously.
High level.
Bonus
Restores eyesight.
//////////////////////////////////////
*/
/datum/symptom/visionaid
name = "Ocular Restoration"
stealth = -1
resistance = -3
stage_speed = -2
transmittable = -4
level = 4
/datum/symptom/visionaid/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
if(M.reagents.get_reagent_amount("oculine") < 20)
M.reagents.add_reagent("oculine", 20)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
to_chat(M, "<span class='notice'>[pick("Your eyes feel great.", "You are now blinking manually.", "You don't feel the need to blink.")]</span>")
return
to_chat(M, "<span class='userdanger'>You go blind!</span>")
@@ -1,47 +1,6 @@
/*
//////////////////////////////////////
Weight Gain
Very Very Noticable.
Decreases resistance.
Decreases stage speed.
Reduced transmittable.
Intense Level.
Bonus
Increases the weight gain of the mob,
forcing it to eventually turn fat.
//////////////////////////////////////
*/
/datum/symptom/weight_gain
name = "Weight Gain"
stealth = -3
resistance = -3
stage_speed = -2
transmittable = -2
level = 4
severity = 1
/datum/symptom/weight_gain/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
to_chat(M, "<span class='warning'>[pick("You feel blubbery.", "Your stomach hurts.")]</span>")
else
M.overeatduration = min(M.overeatduration + 100, 600)
M.nutrition = min(M.nutrition + 100, NUTRITION_LEVEL_FULL)
return
/*
//////////////////////////////////////
Weight Loss
Very Very Noticable.
@@ -77,45 +36,4 @@ Bonus
else
to_chat(M, "<span class='warning'><i>[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]</i></span>")
M.overeatduration = max(M.overeatduration - 100, 0)
M.nutrition = max(M.nutrition - 100, 0)
return
/*
//////////////////////////////////////
Weight Even
Very Noticable.
Decreases resistance.
Decreases stage speed.
Reduced transmittable.
High level.
Bonus
Causes the weight of the mob to
be even, meaning eating isn't
required anymore.
//////////////////////////////////////
*/
/datum/symptom/weight_even
name = "Weight Even"
stealth = -3
resistance = -2
stage_speed = -2
transmittable = -2
level = 4
/datum/symptom/weight_even/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
M.overeatduration = 0
M.nutrition = NUTRITION_LEVEL_WELL_FED + 50
return
M.nutrition = max(M.nutrition - 100, 0)
+1
View File
@@ -13,6 +13,7 @@
visibility_flags = HIDDEN_PANDEMIC
required_organs = list(/obj/item/organ/internal/appendix)
bypasses_immunity = TRUE
virus_heal_resistant = TRUE
/datum/disease/appendicitis/stage_act()
..()
+130
View File
@@ -0,0 +1,130 @@
/datum/disease/critical
/datum/disease/critical/stage_act() //overriden to ensure unique behavior
stage = min(stage, max_stages)
if(prob(stage_prob))
stage = min(stage + 1, max_stages)
for(var/C_id in cures)
if(affected_mob.reagents.has_reagent(C_id))
if(prob(cure_chance))
cure()
return FALSE
return TRUE
/datum/disease/critical/shock
name = "Shock"
form = "Medical Emergency"
spread_text = "The patient is in shock"
max_stages = 3
spread_flags = SPECIAL
cure_text = "Saline Solution"
cures = list("salglu_solution")
cure_chance = 10
viable_mobtypes = list(/mob/living/carbon/human)
stage_prob = 6
severity = DANGEROUS
disease_flags = CURABLE
bypasses_immunity = TRUE
virus_heal_resistant = TRUE
/datum/disease/critical/shock/stage_act()
if(..())
if(affected_mob.health >= 25)
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return
switch(stage)
if(1)
if(prob(1) && prob(10))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return
if(prob(8))
affected_mob.emote(pick("shiver", "pale", "moan"))
if(prob(5))
to_chat(affected_mob, "<span class='danger'>You feel weak!</span>")
if(2)
if(prob(1) && prob(10))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return
if(prob(8))
affected_mob.emote(pick("shiver", "pale", "moan", "shudder", "tremble"))
if(prob(5))
to_chat(affected_mob, "<span class='danger'>You feel absolutely terrible!</span>")
if(prob(5))
affected_mob.emote("faint", "collapse", "groan")
if(3)
if(prob(1) && prob(10))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return
if(prob(8))
affected_mob.emote(pick("shudder", "pale", "tremble", "groan", "bshake"))
if(prob(5))
to_chat(affected_mob, "<span class='danger'>You feel horrible!</span>")
if(prob(5))
affected_mob.emote(pick("faint", "collapse", "groan"))
if(prob(7))
to_chat(affected_mob, "<span class='danger'>You can't breathe!</span>")
affected_mob.AdjustLoseBreath(1)
if(prob(5))
var/datum/disease/D = new /datum/disease/critical/heart_failure
affected_mob.ForceContractDisease(D)
/datum/disease/critical/heart_failure
name = "Cardiac Failure"
form = "Medical Emergency"
spread_text = "The patient is having a cardiac emergency"
max_stages = 3
spread_flags = SPECIAL
cure_text = "Cardiac Stimulants"
cures = list("atropine", "epinephrine")
cure_chance = 10
needs_all_cures = FALSE
viable_mobtypes = list(/mob/living/carbon/human)
stage_prob = 5
severity = DANGEROUS
disease_flags = CURABLE
required_organs = list(/obj/item/organ/internal/heart)
bypasses_immunity = TRUE
virus_heal_resistant = TRUE
/datum/disease/critical/heart_failure/stage_act()
if(..())
switch(stage)
if(1)
if(prob(1) && prob(10))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return
if(prob(8))
affected_mob.emote(pick("pale", "shudder"))
if(prob(5))
to_chat(affected_mob, "<span class='danger'>Your arm hurts!</span>")
else if(prob(5))
to_chat(affected_mob, "<span class='danger'>Your chest hurts!</span>")
if(2)
if(prob(1) && prob(10))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return
if(prob(8))
affected_mob.emote(pick("pale", "groan"))
if(prob(5))
to_chat(affected_mob, "<span class='danger'>Your heart lurches in your chest!</span>")
affected_mob.AdjustLoseBreath(1)
if(prob(3))
to_chat(affected_mob, "<span class='danger'>Your heart stops beating!</span>")
affected_mob.AdjustLoseBreath(3)
if(prob(5))
affected_mob.emote(pick("faint", "collapse", "groan"))
if(3)
affected_mob.adjustOxyLoss(1)
if(prob(8))
affected_mob.emote(pick("twitch", "gasp"))
if(prob(5) && ishuman(affected_mob))
var/mob/living/carbon/human/H = affected_mob
H.set_heartattack(TRUE)
+4 -10
View File
@@ -13,20 +13,14 @@
severity = MINOR
disease_flags = CURABLE
spread_flags = NON_CONTAGIOUS
var/remissive = 0
virus_heal_resistant = TRUE
/datum/disease/food_poisoning/stage_act()
if(!remissive)
..()
..()
if(affected_mob.sleeping && prob(33))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
remissive = 1
if(remissive)
if(prob(stage_prob))
stage--
if(stage == 0)
cure()
return
cure()
return
switch(stage)
if(1)
if(prob(5))
+1 -1
View File
@@ -34,7 +34,7 @@
if(5)
to_chat(affected_mob, "<span class='danger'>Your body feels as if it's trying to rip itself open...</span>")
if(prob(50))
affected_mob.gib()
affected_mob.delayed_gib()
else
return
+2
View File
@@ -11,7 +11,9 @@
desc = "Uncontrollable laughing."
severity = BIOHAZARD
spread_flags = NON_CONTAGIOUS
disease_flags = CAN_CARRY
bypasses_immunity = TRUE //Kuru is a prion disorder, not a virus
virus_heal_resistant = TRUE
/datum/disease/kuru/stage_act()
..()
+1 -1
View File
@@ -54,7 +54,7 @@
if(3)
if(prob(10))
to_chat(affected_mob, "<span class='danger'>Your thoughts are interrupted by a loud <b>HONK!</b></span>")
affected_mob << 'sound/items/AirHorn.ogg'
affected_mob << 'sound/items/airhorn.ogg'
if(4)
if(prob(5))
affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) )
+1 -1
View File
@@ -117,7 +117,7 @@ What are the archived variables for?
trace_gas.moles -= reaction_rate*0.05
temperature -= (reaction_rate*20000)/heat_capacity()
temperature += (reaction_rate*20000)/heat_capacity()
reacting = 1
+27
View File
@@ -0,0 +1,27 @@
/datum/hotkey_mode
var/name
var/macro_hotkeys_inactive
var/macro_hotkeys_active
var/mob/my_mob
/datum/hotkey_mode/New(mob)
my_mob = mob
/datum/hotkey_mode/proc/set_winset_values()
winset(my_mob, null, "mainwindow.macro=[macro_hotkeys_inactive] hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5")
winset(my_mob, null, "hotkey_toggle.command=\".winset \\\"mainwindow.macro != [macro_hotkeys_inactive] ? mainwindow.macro=[macro_hotkeys_inactive] hotkey_toggle.is-checked=false input.focus=true input.background-color=#d3b5b5 : mainwindow.macro=[macro_hotkeys_active] hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#f0f0f0\\\"\"")
/datum/hotkey_mode/qwerty
name = "QWERTY"
macro_hotkeys_inactive = "macro"
macro_hotkeys_active = "hotkeymode"
/datum/hotkey_mode/azerty
name = "AZERTY"
macro_hotkeys_inactive = "azertymacro"
macro_hotkeys_active = "azertyhotkeymode"
/datum/hotkey_mode/cyborg
name = "Cyborg"
macro_hotkeys_inactive = "borgmacro"
macro_hotkeys_active = "borghotkeymode"
+10 -9
View File
@@ -112,7 +112,7 @@
else
destturf = get_turf(destination)
if(!is_teleport_allowed(destturf.z))
if(!is_teleport_allowed(destturf.z) && !ignore_area_flag)
return 0
// Only check the destination zlevel for is_teleport_allowed. Checking origin as well breaks ERT teleporters.
@@ -173,13 +173,14 @@
/datum/teleport/instant/science/setPrecision(aprecision)
..()
if(istype(teleatom, /obj/item/storage/backpack/holding))
precision = rand(1,100)
if(!is_admin_level(destination.z))
if(istype(teleatom, /obj/item/storage/backpack/holding))
precision = rand(1, 100)
var/list/bagholding = teleatom.search_contents_for(/obj/item/storage/backpack/holding)
if(bagholding.len)
precision = max(rand(1,100)*bagholding.len,100)
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
to_chat(MM, "<span class='warning'>The bluespace interface on your bag of holding interferes with the teleport!</span>")
var/list/bagholding = teleatom.search_contents_for(/obj/item/storage/backpack/holding)
if(bagholding.len)
precision = max(rand(1, 100)*bagholding.len, 100)
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
to_chat(MM, "<span class='warning'>The bluespace interface on your bag of holding interferes with the teleport!</span>")
return 1
+3 -1
View File
@@ -21,7 +21,9 @@ var/datum/atom_hud/huds = list( \
ANTAG_HUD_CHANGELING = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_VAMPIRE = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),\
DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor()\
DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(),\
ANTAG_HUD_DEVIL = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_EVENTMISC = new/datum/atom_hud/antag/hidden()\
)
/datum/atom_hud
+164 -4
View File
@@ -30,6 +30,7 @@
var/assigned_role //assigned role is what job you're assigned to when you join the station.
var/special_role //special roles are typically reserved for antags or roles like ERT. If you want to avoid a character being automatically announced by the AI, on arrival (becuase they're an off station character or something); ensure that special_role and assigned_role are equal.
var/offstation_role = FALSE //set to true for ERT, deathsquad, abductors, etc, that can go from and to z2 at will and shouldn't be antag targets
var/list/restricted_roles = list()
var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button.
@@ -51,13 +52,23 @@
var/linglink
var/datum/vampire/vampire //vampire holder
var/datum/nations/nation //nation holder
var/datum/abductor/abductor //abductor holder
var/datum/devilinfo/devilinfo //devil 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
var/datum/mindslaves/som //stands for slave or master...hush..
var/datum/devilinfo/devilinfo //Information about the devil, if any.
var/damnation_type = 0
var/datum/mind/soulOwner //who owns the soul. Under normal circumstances, this will point to src
var/hasSoul = TRUE
var/rev_cooldown = 0
var/isholy = FALSE // is this person a chaplain or admin role allowed to use bibles
var/isblessed = FALSE // is this person blessed by a chaplain?
var/num_blessed = 0 // for prayers
// the world.time since the mob has been brigged, or -1 if not at all
var/brigged_since = -1
var/suicided = FALSE
@@ -70,6 +81,7 @@
/datum/mind/New(new_key)
key = new_key
soulOwner = src
/datum/mind/Destroy()
ticker.minds -= src
@@ -287,6 +299,29 @@
. += _memory_edit_role_enabled(ROLE_ABDUCTOR)
/datum/mind/proc/memory_edit_devil(mob/living/H)
. = _memory_edit_header("devil", list("devilagents"))
if(src in ticker.mode.devils)
if(!devilinfo)
. += "<b>No devilinfo found! Yell at a coder!</b>"
else if(!devilinfo.ascendable)
. += "<b>DEVIL</b>|<a href='?src=[UID()];devil=ascendable_devil'>Ascendable Devil</a>|sintouched|<a href='?src=[UID()];devil=clear'>no</a>"
else
. += "<a href='?src=[UID()];devil=devil'>DEVIL</a>|<b>ASCENDABLE DEVIL</b>|sintouched|<a href='?src=[UID()];devil=clear'>no</a>"
else if(src in ticker.mode.sintouched)
. += "devil|Ascendable Devil|<b>SINTOUCHED</b>|<a href='?src=[UID()];devil=clear'>no</a>"
else
. += "<a href='?src=[UID()];devil=devil'>devil</a>|<a href='?src=[UID()];devil=ascendable_devil'>Ascendable Devil</a>|<a href='?src=[UID()];devil=sintouched'>sintouched</a>|<b>NO</b>"
. += _memory_edit_role_enabled(ROLE_DEVIL)
/datum/mind/proc/memory_edit_eventmisc(mob/living/H)
. = _memory_edit_header("event", list())
if(src in ticker.mode.eventmiscs)
. += "<b>YES</b>|<a href='?src=[UID()];eventmisc=clear'>no</a>"
else
. += "<a href='?src=[UID()];eventmisc=eventmisc'>Event Role</a>|<b>NO</b>"
/datum/mind/proc/memory_edit_traitor()
. = _memory_edit_header("traitor", list("traitorchan", "traitorvamp"))
if(src in ticker.mode.traitors)
@@ -370,14 +405,19 @@
sections["shadowling"] = memory_edit_shadowling(H)
/** Abductors **/
sections["abductor"] = memory_edit_abductor(H)
/** DEVIL ***/
var/static/list/devils_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/carbon/true_devil, /mob/living/silicon/robot))
if(is_type_in_typecache(current, devils_typecache))
sections["devil"] = memory_edit_devil(H)
sections["eventmisc"] = memory_edit_eventmisc(H)
/** TRAITOR ***/
sections["traitor"] = memory_edit_traitor()
/** SILICON ***/
if(issilicon(current))
sections["silicon"] = memory_edit_silicon()
/*
This prioritizes antags relevant to the current round to make them appear at the top of the panel.
Traitorchan and traitorvamp are snowflaked in because they have multiple sections.
/*
This prioritizes antags relevant to the current round to make them appear at the top of the panel.
Traitorchan and traitorvamp are snowflaked in because they have multiple sections.
*/
if(ticker.mode.config_tag == "traitorchan")
if(sections["traitor"])
@@ -416,7 +456,7 @@
out += gen_objective_text(admin = TRUE)
out += "<a href='?src=[UID()];obj_add=1'>Add objective</a><br><br>"
out += "<a href='?src=[UID()];obj_announce=1'>Announce objectives</a><br><br>"
usr << browse(out, "window=edit_memory[src];size=400x500")
usr << browse(out, "window=edit_memory[src];size=500x500")
/datum/mind/Topic(href, href_list)
if(!check_rights(R_ADMIN))
@@ -830,6 +870,7 @@
special_role = SPECIAL_ROLE_WIZARD
//ticker.mode.learn_basic_spells(current)
ticker.mode.update_wiz_icons_added(src)
SEND_SOUND(current, 'sound/ambience/antag/ragesmages.ogg')
to_chat(current, "<span class='danger'>You are a Space Wizard!</span>")
current.faction = list("wizard")
log_admin("[key_name(usr)] has wizarded [key_name(current)]")
@@ -871,6 +912,7 @@
ticker.mode.grant_changeling_powers(current)
ticker.mode.update_change_icons_added(src)
special_role = SPECIAL_ROLE_CHANGELING
SEND_SOUND(current, 'sound/ambience/antag/ling_aler.ogg')
to_chat(current, "<B><font color='red'>Your powers have awoken. A flash of memory returns to us... we are a changeling!</font></B>")
log_admin("[key_name(usr)] has changelinged [key_name(current)]")
message_admins("[key_name_admin(usr)] has changelinged [key_name_admin(current)]")
@@ -915,6 +957,7 @@
slaved.masters += src
som = slaved //we MIGT want to mindslave someone
special_role = SPECIAL_ROLE_VAMPIRE
SEND_SOUND(current, 'sound/ambience/antag/vampalert.ogg')
to_chat(current, "<B><font color='red'>Your powers have awoken. Your lust for blood grows... You are a Vampire!</font></B>")
log_admin("[key_name(usr)] has vampired [key_name(current)]")
message_admins("[key_name_admin(usr)] has vampired [key_name_admin(current)]")
@@ -999,6 +1042,92 @@
else
to_chat(usr, "<span class='warning'>No valid nuke found!</span>")
else if(href_list["eventmisc"])
switch(href_list["eventmisc"])
if("clear")
if(src in ticker.mode.eventmiscs)
ticker.mode.eventmiscs -= src
ticker.mode.update_eventmisc_icons_removed(src)
special_role = null
message_admins("[key_name_admin(usr)] has de-eventantag'ed [current].")
log_admin("[key_name(usr)] has de-eventantag'ed [current].")
if("eventmisc")
ticker.mode.eventmiscs += src
special_role = SPECIAL_ROLE_EVENTMISC
ticker.mode.update_eventmisc_icons_added(src)
message_admins("[key_name_admin(usr)] has eventantag'ed [current].")
log_admin("[key_name(usr)] has eventantag'ed [current].")
else if(href_list["devil"])
switch(href_list["devil"])
if("clear")
if(src in ticker.mode.devils)
if(istype(current,/mob/living/carbon/true_devil/))
to_chat(usr,"<span class='warning'>This cannot be used on true or arch-devils.</span>")
else
ticker.mode.devils -= src
ticker.mode.update_devil_icons_removed(src)
special_role = null
to_chat(current,"<span class='userdanger'>Your infernal link has been severed! You are no longer a devil!</span>")
RemoveSpell(/obj/effect/proc_holder/spell/targeted/infernal_jaunt)
RemoveSpell(/obj/effect/proc_holder/spell/fireball/hellish)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/summon_contract)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork/greater)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork/ascended)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/violin)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/summon_dancefloor)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/sintouch)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/sintouch/ascended)
message_admins("[key_name_admin(usr)] has de-devil'ed [current].")
if(issilicon(current))
var/mob/living/silicon/S = current
S.laws.clear_sixsixsix_laws()
devilinfo = null
log_admin("[key_name(usr)] has de-devil'ed [current].")
else if(src in ticker.mode.sintouched)
ticker.mode.sintouched -= src
message_admins("[key_name_admin(usr)] has de-sintouch'ed [current].")
log_admin("[key_name(usr)] has de-sintouch'ed [current].")
if("devil")
if(devilinfo)
devilinfo.ascendable = FALSE
message_admins("[key_name_admin(usr)] has made [current] unable to ascend as a devil.")
log_admin("[key_name_admin(usr)] has made [current] unable to ascend as a devil.")
return
if(!ishuman(current) && !isrobot(current))
to_chat(usr, "<span class='warning'>This only works on humans and cyborgs!</span>")
return
ticker.mode.devils += src
special_role = "devil"
ticker.mode.update_devil_icons_added(src)
ticker.mode.finalize_devil(src, FALSE)
ticker.mode.forge_devil_objectives(src, 2)
ticker.mode.greet_devil(src)
message_admins("[key_name_admin(usr)] has devil'ed [current].")
log_admin("[key_name(usr)] has devil'ed [current].")
if("ascendable_devil")
if(devilinfo)
devilinfo.ascendable = TRUE
message_admins("[key_name_admin(usr)] has made [current] able to ascend as a devil.")
log_admin("[key_name_admin(usr)] has made [current] able to ascend as a devil.")
return
if(!ishuman(current) && !isrobot(current))
to_chat(usr, "<span class='warning'>This only works on humans and cyborgs!</span>")
return
ticker.mode.devils += src
special_role = "devil"
ticker.mode.update_devil_icons_added(src)
ticker.mode.finalize_devil(src, TRUE)
ticker.mode.forge_devil_objectives(src, 2)
ticker.mode.greet_devil(src)
message_admins("[key_name_admin(usr)] has devil'ed [current]. The devil has been marked as ascendable.")
log_admin("[key_name(usr)] has devil'ed [current]. The devil has been marked as ascendable.")
if("sintouched")
var/mob/living/carbon/human/H = current
H.influenceSin()
message_admins("[key_name_admin(usr)] has sintouch'ed [current].")
log_admin("[key_name(usr)] has sintouch'ed [current].")
else if(href_list["traitor"])
switch(href_list["traitor"])
if("clear")
@@ -1031,6 +1160,9 @@
if(isAI(current))
var/mob/living/silicon/ai/A = current
ticker.mode.add_law_zero(A)
SEND_SOUND(current, 'sound/ambience/antag/malf.ogg')
else
SEND_SOUND(current, 'sound/ambience/antag/tatoralert.ogg')
ticker.mode.update_traitor_icons_added(src)
if("autoobjectives")
@@ -1316,6 +1448,11 @@
ticker.mode.greet_changeling(src)
ticker.mode.update_change_icons_added(src)
/datum/mind/proc/make_Overmind()
if(!(src in ticker.mode.blob_overminds))
ticker.mode.blob_overminds += src
special_role = SPECIAL_ROLE_BLOB_OVERMIND
/datum/mind/proc/make_Wizard()
if(!(src in ticker.mode.wizards))
ticker.mode.wizards += src
@@ -1451,6 +1588,17 @@
var/obj/effect/proc_holder/spell/S = X
S.action.Grant(new_character)
/datum/mind/proc/disrupt_spells(delay, list/exceptions = New())
for(var/X in spell_list)
var/obj/effect/proc_holder/spell/S = X
for(var/type in exceptions)
if(istype(S, type))
continue
S.charge_counter = delay
spawn(0)
S.start_recharge()
S.updateButtonIcon()
/datum/mind/proc/get_ghost(even_if_they_cant_reenter)
for(var/mob/dead/observer/G in GLOB.dead_mob_list)
if(G.mind == src)
@@ -1529,6 +1677,18 @@
to_chat(current, "<span class='warning'>You seem to have forgotten the events of the past 10 minutes or so, and your head aches a bit as if someone beat it savagely with a stick.</span>")
to_chat(current, "<span class='warning'>This means you don't remember who you were working for or what you were doing.</span>")
/datum/mind/proc/is_revivable() //Note, this ONLY checks the mind.
if(damnation_type)
return FALSE
return TRUE
// returns a mob to message to produce something visible for the target mind
/datum/mind/proc/messageable_mob()
if(!QDELETED(current) && current.client)
return current
else
return get_ghost(even_if_they_cant_reenter = TRUE)
//Initialisation procs
/mob/proc/mind_initialize()
if(mind)
+29 -39
View File
@@ -63,7 +63,7 @@
var/obj/item/radio/R = H.l_ear
if(istype(R))
R.set_frequency(SYND_FREQ)
H.faction += "syndicate"
/datum/outfit/admin/syndicate_infiltrator
name = "Syndicate Infiltrator"
@@ -83,12 +83,12 @@
l_ear = /obj/item/radio/headset/syndicate/alt
glasses = /obj/item/clothing/glasses/night
shoes = /obj/item/clothing/shoes/magboots/syndie
r_pocket = /obj/item/radio/uplink/nuclear
l_pocket = /obj/item/pinpointer/advpinpointer
l_hand = /obj/item/tank/jetpack/oxygen/harness
backpack_contents = list(
/obj/item/storage/box/engineer = 1,
/obj/item/reagent_containers/food/pill/initropidril = 1,
/obj/item/storage/box/survival_syndi = 1,
/obj/item/gun/projectile/automatic/pistol = 1,
/obj/item/ammo_box/magazine/m10mm = 1,
/obj/item/crowbar/red = 1,
@@ -117,42 +117,7 @@
name = "Syndicate Strike Team"
/datum/outfit/admin/syndicate_strike_team/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
return H.equip_syndicate_commando()
/datum/outfit/admin/syndicate/officer
name = "Syndicate Officer"
head = /obj/item/clothing/head/beret
mask = /obj/item/clothing/mask/cigarette/cigar/havana
belt = /obj/item/gun/projectile/automatic/pistol/deagle/camo
l_ear = /obj/item/radio/headset/syndicate/alt
l_pocket = /obj/item/pinpointer/advpinpointer
r_pocket = null // stop them getting a radio uplink, they get an implant instead
backpack_contents = list(
/obj/item/storage/box/engineer = 1,
/obj/item/flashlight = 1,
/obj/item/reagent_containers/food/pill/initropidril = 1,
/obj/item/reagent_containers/food/snacks/syndidonkpocket = 1,
/obj/item/ammo_box/magazine/m50 = 2,
/obj/item/clothing/shoes/magboots/syndie/advance = 1,
/obj/item/lighter/zippo/gonzofist = 1
)
implants = list(
/obj/item/implant/dust
)
id_icon = "commander"
id_access = "Syndicate Operative Leader"
/datum/outfit/admin/syndicate/officer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(visualsOnly)
return
var/obj/item/implant/uplink/U = new /obj/item/implant/uplink(H)
U.implant(H)
U.hidden_uplink.uses = 500
return H.equip_syndicate_commando(FALSE, TRUE)
/datum/outfit/admin/syndicate/spy
@@ -732,6 +697,31 @@
)
is_tsf_lieutenant = TRUE
/datum/outfit/admin/sol_trader
name = "Sol Trader"
uniform = /obj/item/clothing/under/rank/cargotech
back = /obj/item/storage/backpack/industrial
belt = /obj/item/melee/classic_baton
head = /obj/item/clothing/head/soft
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/radio/headset
glasses = /obj/item/clothing/glasses/sunglasses
id = /obj/item/card/id/supply
pda = /obj/item/pda
backpack_contents = list(
/obj/item/storage/box/survival = 1,
/obj/item/hand_labeler = 1
)
/datum/outfit/admin/sol_trader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(visualsOnly)
return
var/obj/item/card/id/I = H.wear_id
if(istype(I))
apply_to_card(I, H, list(access_trade_sol, access_maint_tunnels, access_external_airlocks), name)
/datum/outfit/admin/chrono
name = "Chrono Legionnaire"
+7
View File
@@ -175,3 +175,10 @@
description = "The crew of a space station awaken one hundred years after a crisis. Awaking to a derelict space station on the verge of collapse, and a hostile force of invading \
hivebots. Can the surviving crew overcome the odds and survive and rebuild, or will the cold embrace of the stars become their new home?"
cost = 2
/datum/map_template/ruin/space/wizardcrash
id = "wizardcrash"
suffix = "wizardcrash.dmm"
name = "Crashed Wizard Shuttle"
description = "A shuttle of the Wizard Federation, sent out to crush some wandless scum. Unfortunately, the pilot suffered a magic-related accident and the shuttle crashed into a nearby asteroid."
cost = 2
+1
View File
@@ -122,6 +122,7 @@
if(soulsharer)
soulsharer.dust(FALSE)
/datum/soullink/oneway/devilfriend
/////////////////
// SHARED BODY //
+2 -2
View File
@@ -6,10 +6,10 @@
qdel(src)
owner = new_owner
/datum/spawners_menu/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = FALSE, datum/nanoui/master_ui = null)
/datum/spawners_menu/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = FALSE, datum/topic_state/state = ghost_state, datum/nanoui/master_ui = null)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "spawners_menu.tmpl", "Spawners Menu", 700, 600, master_ui)
ui = new(user, src, ui_key, "spawners_menu.tmpl", "Spawners Menu", 700, 600, master_ui, state = state)
ui.open()
/datum/spawners_menu/ui_data(mob/user)
+18 -12
View File
@@ -100,6 +100,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/action_icon = 'icons/mob/actions/actions.dmi'
var/action_icon_state = "spell_default"
var/action_background_icon_state = "bg_spell"
var/special_availability_check = 0//Whether the spell needs to bypass the action button's IsAvailable()
var/sound = null //The sound the spell makes when it is cast
@@ -140,14 +141,14 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/obj/effect/proc_holder/spell/noclothes/clothes_spell = locate() in (user.mob_spell_list | (user.mind ? user.mind.spell_list : list()))
if((ishuman(user) && clothes_req) && !istype(clothes_spell))//clothes check
var/mob/living/carbon/human/H = user
if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/wizard) && !istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman/wizard))
to_chat(user, "<span class='notice'>I don't feel strong enough without my robe.</span>")
var/obj/item/clothing/robe = H.wear_suit
var/obj/item/clothing/hat = H.head
var/obj/item/clothing/shoes = H.shoes
if(!robe || !hat || !shoes)
to_chat(user, "<span class='notice'>Your outfit isn't complete, you should put on your robe and wizard hat, as well as sandals.</span>")
return 0
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
to_chat(user, "<span class='notice'>I don't feel strong enough without my sandals.</span>")
return 0
if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman/wizard))
to_chat(user, "<span class='notice'>I don't feel strong enough without my hat.</span>")
if(!robe.magical || !hat.magical || !shoes.magical)
to_chat(user, "<span class='notice'>Your outfit isn't magical enough, you should put on your robe and wizard hat, as well as your sandals.</span>")
return 0
else if(!ishuman(user))
if(clothes_req || human_req)
@@ -172,7 +173,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
switch(invocation_type)
if("shout")
if(!user.IsVocal())
user.emote("makes frantic gestures!")
user.custom_emote(1, "makes frantic gestures!")
else
if(prob(50))//Auto-mute? Fuck that noise
user.say(invocation)
@@ -293,6 +294,10 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
return
/obj/effect/proc_holder/spell/proc/updateButtonIcon()
if(action)
action.UpdateButtonIcon()
/obj/effect/proc_holder/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types
switch(type)
if("bruteloss")
@@ -458,11 +463,12 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/clothcheck = locate(/obj/effect/proc_holder/spell/noclothes) in user.mob_spell_list
var/clothcheck2 = user.mind && (locate(/obj/effect/proc_holder/spell/noclothes) in user.mind.spell_list)
if(clothes_req && !clothcheck && !clothcheck2) //clothes check
if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/wizard))
var/obj/item/clothing/robe = H.wear_suit
var/obj/item/clothing/hat = H.head
var/obj/item/clothing/shoes = H.shoes
if(!robe || !hat || !shoes)
return 0
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
return 0
if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard))
if(!robe.magical || !hat.magical || !shoes.magical)
return 0
else
if(clothes_req || human_req)
+5 -5
View File
@@ -2,13 +2,13 @@
name = "Area teleport"
desc = "This spell teleports you to a type of area of your selection."
nonabstract_req = 1
var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list
var/invocation_area = 1 //if the invocation appends the selected area
var/sound1 = 'sound/weapons/ZapBang.ogg'
var/sound2 = 'sound/weapons/ZapBang.ogg'
var/sound1 = 'sound/weapons/zapbang.ogg'
var/sound2 = 'sound/weapons/zapbang.ogg'
/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1, mob/living/user = usr)
var/thearea = before_cast(targets)
if(!thearea || !cast_check(1))
+73
View File
@@ -0,0 +1,73 @@
/obj/effect/proc_holder/spell/targeted/chaplain_bless
name = "Bless"
desc = "Blesses a single person."
school = "transmutation"
charge_max = 60
clothes_req = 0
invocation = "none"
invocation_type = "none"
max_targets = 1
include_user = 0
humans_only = 1
range = 1
cooldown_min = 20
action_icon_state = "shield"
/obj/effect/proc_holder/spell/targeted/chaplain_bless/cast(list/targets, mob/living/user = usr, distanceoverride)
if(!istype(user))
to_chat(user, "Somehow, you are not a living mob. This should never happen. Report this bug.")
revert_cast()
return
if(!user.mind)
to_chat(user, "Somehow, you are mindless. This should never happen. Report this bug.")
revert_cast()
return
if(!user.mind.isholy)
to_chat(user, "Somehow, you are not holy enough to use this ability. This should never happen. Report this bug.")
revert_cast()
return
var/mob/living/carbon/human/target = targets[range]
if(!istype(target))
to_chat(user, "No target.")
revert_cast()
return
if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
to_chat(user, "[target] is too far away!")
revert_cast()
return
if(!target.mind)
to_chat(user, "[target] appears to be catatonic. Your blessing would have no effect.")
revert_cast()
return
if(!target.ckey)
to_chat(user, "[target] appears to be too out of it to benefit from this.")
revert_cast()
return
if(target.stat == DEAD)
to_chat(user, "[target] is already dead. There is no point.")
revert_cast()
return
spawn(0) // allows cast to complete even if recipient ignores the prompt
if(alert(target, "[user] wants to bless you, in the name of [user.p_their()] religion. Accept?", "Accept Blessing?", "Yes", "No") == "Yes") // prevents forced conversions
user.visible_message("[user] starts blessing [target] in the name of [ticker.Bible_deity_name].", "<span class='notice'>You start blessing [target] in the name of [ticker.Bible_deity_name].</span>")
if(do_after(user, 150, target = target))
user.visible_message("[user] has blessed [target] in the name of [ticker.Bible_deity_name].", "<span class='notice'>You have blessed [target] in the name of [ticker.Bible_deity_name].</span>")
if(!target.mind.isblessed)
target.mind.isblessed = TRUE
user.mind.num_blessed++
+25
View File
@@ -0,0 +1,25 @@
/obj/effect/proc_holder/spell/targeted/conjure_item
name = "Summon weapon"
desc = "A generic spell that should not exist. This summons an instance of a specific type of item, or if one already exists, un-summons it."
invocation_type = "none"
include_user = 1
range = -1
clothes_req = FALSE
var/obj/item/item
var/item_type = /obj/item/banhammer
school = "conjuration"
charge_max = 150
cooldown_min = 10
/obj/effect/proc_holder/spell/targeted/conjure_item/cast(list/targets, mob/user = usr)
if(item)
QDEL_NULL(item)
else
for(var/mob/living/carbon/C in targets)
if(C.drop_item())
item = new item_type
C.put_in_hands(item)
/obj/effect/proc_holder/spell/targeted/conjure_item/Destroy()
QDEL_NULL(item)
return ..()
+251
View File
@@ -0,0 +1,251 @@
/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork
name = "Summon Pitchfork"
desc = "A devil's weapon of choice. Use this to summon/unsummon your pitchfork."
item_type = /obj/item/twohanded/pitchfork/demonic
action_icon_state = "pitchfork"
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork/greater
item_type = /obj/item/twohanded/pitchfork/demonic/greater
/obj/effect/proc_holder/spell/targeted/conjure_item/pitchfork/ascended
item_type = /obj/item/twohanded/pitchfork/demonic/ascended
/obj/effect/proc_holder/spell/targeted/conjure_item/violin
item_type = /obj/item/instrument/violin/golden
desc = "A devil's instrument of choice. Use this to summon/unsummon your golden violin."
invocation_type = "whisper"
invocation = "I ain't have this much fun since Georgia."
action_icon_state = "golden_violin"
name = "Summon golden violin"
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/targeted/summon_contract
name = "Summon infernal contract"
desc = "Skip making a contract by hand, just do it by magic."
invocation_type = "whisper"
invocation = "Just sign on the dotted line."
include_user = 0
range = 5
clothes_req = FALSE
school = "conjuration"
charge_max = 150
cooldown_min = 10
action_icon_state = "spell_default"
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/targeted/summon_contract/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/C in targets)
if(C.mind && user.mind)
if(C.stat == DEAD)
if(user.drop_item())
var/obj/item/paper/contract/infernal/revive/contract = new(user.loc, C.mind, user.mind)
user.put_in_hands(contract)
else
var/obj/item/paper/contract/infernal/contract
var/contractTypeName = input(user, "What type of contract?") in list (CONTRACT_POWER, CONTRACT_WEALTH, CONTRACT_PRESTIGE, CONTRACT_MAGIC, CONTRACT_KNOWLEDGE, CONTRACT_FRIENDSHIP) //TODO: Refactor this to be less boilerplate-y
switch(contractTypeName)
if(CONTRACT_POWER)
contract = new /obj/item/paper/contract/infernal/power(C.loc, C.mind, user.mind)
if(CONTRACT_WEALTH)
contract = new /obj/item/paper/contract/infernal/wealth(C.loc, C.mind, user.mind)
if(CONTRACT_PRESTIGE)
contract = new /obj/item/paper/contract/infernal/prestige(C.loc, C.mind, user.mind)
if(CONTRACT_MAGIC)
contract = new /obj/item/paper/contract/infernal/magic(C.loc, C.mind, user.mind)
if(CONTRACT_KNOWLEDGE)
contract = new /obj/item/paper/contract/infernal/knowledge(C.loc, C.mind, user.mind)
if(CONTRACT_FRIENDSHIP)
contract = new /obj/item/paper/contract/infernal/friendship(C.loc, C.mind, user.mind)
C.put_in_hands(contract)
else
to_chat(user,"<span class='notice'>[C] seems to not be sentient. You are unable to summon a contract for them.</span>")
/obj/effect/proc_holder/spell/fireball/hellish
name = "Hellfire"
desc = "This spell launches hellfire at the target."
school = "evocation"
charge_max = 80
clothes_req = FALSE
invocation = "Your very soul will catch fire!"
invocation_type = "shout"
fireball_type = /obj/item/projectile/magic/fireball/infernal
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/fireball/hellish/cast(list/targets, mob/living/user = usr)
msg_admin_attack("[key_name_admin(usr)] has fired a fireball.", ATKLOG_FEW)
.=..()
/obj/effect/proc_holder/spell/targeted/infernal_jaunt
name = "Infernal Jaunt"
desc = "Use hellfire to phase out of existence."
charge_max = 200
clothes_req = FALSE
selection_type = "range"
range = -1
cooldown_min = 0
overlay = null
include_user = TRUE
action_icon_state = "jaunt"
action_background_icon_state = "bg_demon"
/obj/effect/proc_holder/spell/targeted/infernal_jaunt/cast(list/targets, mob/living/user = usr)
if(istype(user))
if(istype(user.loc, /obj/effect/dummy/slaughter))
var/continuing = 0
if(istype(get_area(user), /area/shuttle)) // Can always phase in in a shuttle.
continuing = TRUE
else
for(var/mob/living/C in orange(2, get_turf(user.loc))) //Can also phase in when nearby a potential buyer.
if (C.mind && C.mind.soulOwner == C.mind)
continuing = TRUE
break
if(continuing)
to_chat(user,"<span class='warning'>You are now phasing in.</span>")
if(do_mob(user,user,150))
user.infernalphasein()
else
to_chat(user,"<span class='warning'>You can only re-appear near a potential signer or on a shuttle.</span>")
revert_cast()
return ..()
else
user.notransform = TRUE
user.fakefire()
to_chat(user,"<span class='warning'>You begin to phase back into sinful flames.</span>")
if(do_mob(user,user,150))
user.infernalphaseout()
else
to_chat(user,"<span class='warning'>You must remain still while exiting.</span>")
user.ExtinguishMob()
start_recharge()
return
revert_cast()
/mob/living/proc/infernalphaseout()
dust_animation()
visible_message("<span class='warning'>[src] disappears in a flashfire!</span>")
playsound(get_turf(src), 'sound/misc/enter_blood.ogg', 100, 1, -1)
var/obj/effect/dummy/slaughter/s_holder = new(loc)
ExtinguishMob()
if(buckled)
buckled.unbuckle_mob(src,force=1)
if(has_buckled_mobs())
unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
if(pulling)
stop_pulling()
forceMove(s_holder)
holder = s_holder
notransform = FALSE
fakefireextinguish()
/mob/living/proc/infernalphasein()
if(notransform)
to_chat(src,"<span class='warning'>You're too busy to jaunt in.</span>")
return 0
fakefire()
forceMove(get_turf(src))
reset_perspective()
visible_message("<span class='warning'><B>[src] appears in a firey blaze!</B></span>")
playsound(get_turf(src), 'sound/misc/exit_blood.ogg', 100, 1, -1)
spawn(15)
fakefireextinguish(TRUE)
/obj/effect/proc_holder/spell/targeted/sintouch
name = "Sin Touch"
desc = "Subtly encourage someone to sin."
charge_max = 1800
clothes_req = FALSE
selection_type = "range"
range = 2
cooldown_min = 0
overlay = null
include_user = FALSE
action_icon_state = "sintouch"
action_background_icon_state = "bg_demon"
random_target = TRUE
random_target_priority = TARGET_RANDOM
max_targets = 3
invocation = "TASTE SIN AND INDULGE!!"
invocation_type = "shout"
/obj/effect/proc_holder/spell/targeted/sintouch/ascended
name = "Greater sin touch"
charge_max = 100
range = 7
max_targets = 10
/obj/effect/proc_holder/spell/targeted/sintouch/cast(list/targets, mob/living/user = usr)
for(var/mob/living/carbon/human/H in targets)
if(!H.mind)
continue
for(var/datum/objective/sintouched/A in H.mind.objectives)
continue
H.influenceSin()
H.Weaken(2)
H.Stun(2)
/obj/effect/proc_holder/spell/targeted/summon_dancefloor
name = "Summon Dancefloor"
desc = "When what a Devil really needs is funk."
include_user = TRUE
range = -1
clothes_req = FALSE
school = "conjuration"
charge_max = 10
cooldown_min = 50 //5 seconds, so the smoke can't be spammed
action_icon_state = "funk"
action_background_icon_state = "bg_demon"
var/list/dancefloor_turfs
var/list/dancefloor_turfs_types
var/dancefloor_exists = FALSE
// var/datum/effect_system/smoke_spread/transparent/dancefloor_devil/smoke
/obj/effect/proc_holder/spell/targeted/summon_dancefloor/cast(list/targets, mob/user = usr)
LAZYINITLIST(dancefloor_turfs)
LAZYINITLIST(dancefloor_turfs_types)
/*
if(!smoke)
smoke = new()
smoke.set_up(0, get_turf(user))
smoke.start()
*/
if(dancefloor_exists)
dancefloor_exists = FALSE
for(var/i in 1 to dancefloor_turfs.len)
var/turf/T = dancefloor_turfs[i]
T.ChangeTurf(dancefloor_turfs_types[i])
else
var/list/funky_turfs = RANGE_TURFS(1, user)
for(var/turf/T in funky_turfs)
if(T.density)
to_chat(user, "<span class='warning'>You're too close to a wall.</span>")
return
dancefloor_exists = TRUE
var/i = 1
dancefloor_turfs.len = funky_turfs.len
dancefloor_turfs_types.len = funky_turfs.len
for(var/t in funky_turfs)
var/turf/T = t
dancefloor_turfs[i] = T
dancefloor_turfs_types[i] = T.type
T.ChangeTurf((i % 2 == 0) ? /turf/simulated/floor/light/colour_cycle/dancefloor_a : /turf/simulated/floor/light/colour_cycle/dancefloor_b)
i++
/*
/datum/effect_system/smoke_spread/transparent/dancefloor_devil
effect_type = /obj/effect/particle_effect/smoke/transparent/dancefloor_devil
/obj/effect/particle_effect/smoke/transparent/dancefloor_devil
lifetime = 2
*/
+73
View File
@@ -0,0 +1,73 @@
/obj/effect/proc_holder/spell/targeted/summon_wealth
name = "Summon wealth"
desc = "The reward for selling your soul."
invocation_type = "none"
include_user = 1
range = -1
clothes_req = 0
school = "conjuration"
charge_max = 100
cooldown_min = 10
action_icon_state = "moneybag"
/obj/effect/proc_holder/spell/targeted/summon_wealth/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/C in targets)
if(user.drop_item())
var/obj/item = pick(
new /obj/item/coin/gold(user.loc),
new /obj/item/coin/diamond(user.loc),
new /obj/item/coin/silver(user.loc),
new /obj/item/stack/sheet/mineral/gold(user.loc),
new /obj/item/stack/sheet/mineral/silver(user.loc),
new /obj/item/stack/sheet/mineral/diamond(user.loc),
new /obj/item/stack/spacecash/c1000(user.loc))
C.put_in_hands(item)
/obj/effect/proc_holder/spell/targeted/view_range
name = "Distant vision"
desc = "The reward for selling your soul."
invocation_type = "none"
include_user = 1
range = -1
clothes_req = 0
charge_max = 50
cooldown_min = 10
action_icon_state = "camera_jump"
var/ranges = list(7,8,9,10/*,11,12*/)
/obj/effect/proc_holder/spell/targeted/view_range/cast(list/targets, mob/user = usr)
for(var/mob/C in targets)
if(!C.client)
continue
C.client.view = input("Select view range:", "Range", 4) in ranges
/obj/effect/proc_holder/spell/targeted/summon_friend
name = "Summon Friend"
desc = "The reward for selling your soul."
invocation_type = "none"
include_user = 1
range = -1
clothes_req = 0
charge_max = 50
cooldown_min = 10
action_icon_state = "sacredflame"
var/mob/living/friend
var/obj/effect/mob_spawn/human/demonic_friend/friendShell
/obj/effect/proc_holder/spell/targeted/summon_friend/cast(list/targets, mob/user = usr)
if(!QDELETED(friend))
to_chat(friend, "<span class='userdanger'>Your master has deemed you a poor friend. Your durance in hell will now resume.</span>")
to_chat(user, "<span class='notice'>You banish your friend back to whence [friend.p_they()] came.</span>")
friend.dust()
qdel(friendShell)
return
if(!QDELETED(friendShell))
qdel(friendShell)
return
for(var/C in targets)
var/mob/living/L = C
friendShell = new /obj/effect/mob_spawn/human/demonic_friend(L.loc, L.mind, src)
/obj/effect/proc_holder/spell/targeted/conjure_item/spellpacket/robeless
clothes_req = FALSE
+2 -7
View File
@@ -12,7 +12,7 @@
var/proj_trail_icon = 'icons/obj/wizard.dmi'
var/proj_trail_icon_state = "trail"
var/proj_type = "/obj/effect/proc_holder/spell" //IMPORTANT use only subtypes of this
var/proj_type = /obj/effect/proc_holder/spell //IMPORTANT use only subtypes of this
var/proj_insubstantial = 0 //if it can pass through dense objects or not
var/proj_trigger_range = 1 //the range from target at which the projectile triggers cast(target)
@@ -35,12 +35,7 @@
for(var/turf/target in targets)
spawn(0)
var/obj/effect/proc_holder/spell/targeted/projectile
if(istext(proj_type))
var/projectile_type = text2path(proj_type)
projectile = new projectile_type(user)
if(istype(proj_type,/obj/effect/proc_holder/spell))
projectile = new /obj/effect/proc_holder/spell/targeted/trigger(user)
projectile:linked_spells += proj_type
projectile = new proj_type(user)
projectile.icon = proj_icon
projectile.icon_state = proj_icon_state
projectile.dir = get_dir(projectile, target)
+2 -2
View File
@@ -21,7 +21,7 @@
action_icon_state = "jaunt"
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets, mob/user = usr) //magnets, so mostly hardcoded
playsound(get_turf(user), 'sound/magic/Ethereal_Enter.ogg', 50, 1, -1)
playsound(get_turf(user), 'sound/magic/ethereal_enter.ogg', 50, 1, -1)
for(var/mob/living/target in targets)
if(!target.can_safely_leave_loc()) // No more brainmobs hopping out of their brains
to_chat(target, "<span class='warning'>You are somehow too bound to your current location to abandon it.</span>")
@@ -48,7 +48,7 @@
jaunt_steam(mobloc)
target.canmove = 0
holder.reappearing = 1
playsound(get_turf(target), 'sound/magic/Ethereal_Exit.ogg', 50, 1, -1)
playsound(get_turf(target), 'sound/magic/ethereal_exit.ogg', 50, 1, -1)
sleep(25 - jaunt_in_time)
new jaunt_in_type(mobloc, holder.dir)
target.setDir(holder.dir)
+1 -1
View File
@@ -45,4 +45,4 @@
qdel(target.wear_mask)
target.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1)
target.flash_eyes()
target.flash_eyes()
+1 -1
View File
@@ -44,7 +44,7 @@
else if(amt_dam_fire <= 0)
target.heal_overall_damage(amt_dam_brute,amt_dam_fire)
target.adjustToxLoss(amt_dam_tox)
target.oxyloss += amt_dam_oxy
target.adjustOxyLoss(amt_dam_oxy)
//disabling
target.Weaken(amt_weakened)
target.Paralyse(amt_paralysis)
+1 -1
View File
@@ -11,7 +11,7 @@
cooldown_min = 20 //20 deciseconds reduction per rank
action_icon_state = "knock"
sound = 'sound/magic/Knock.ogg'
sound = 'sound/magic/knock.ogg'
/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets, mob/user = usr)
for(var/turf/T in targets)
+3 -2
View File
@@ -10,6 +10,7 @@
cooldown_min = 30
selection_type = "view"
random_target = 1
special_availability_check = 1
var/start_time = 0
var/ready = 0
var/image/halo = null
@@ -95,7 +96,7 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
current.Slowed(3)
spawn(20)
current.AdjustJitter(-1000, bound_lower = 10) //Still jittery, but vastly less
playsound(get_turf(current), 'sound/magic/LightningShock.ogg', 50, 1, -1)
playsound(get_turf(current), 'sound/magic/lightningshock.ogg', 50, 1, -1)
else
if(damaging)
current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
@@ -106,7 +107,7 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
current.Slowed(3)
spawn(20)
current.AdjustJitter(-1000, bound_lower = 10) //Still jittery, but vastly less
playsound(get_turf(current), 'sound/magic/LightningShock.ogg', 50, 1, -1)
playsound(get_turf(current), 'sound/magic/lightningshock.ogg', 50, 1, -1)
var/list/possible_targets = new
for(var/mob/living/M in view_or_range(range,target,"view"))
if(user == M || target == M && los_check(current,M)) // || origin == M ? Not sure double shockings is good or not
+107 -2
View File
@@ -1,5 +1,5 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall
name = "Invisible wall"
name = "Invisible Wall"
desc = "The mime's performance transmutates into physical reality."
school = "mime"
panel = "Mime"
@@ -12,7 +12,7 @@
range = 0
cast_sound = null
human_req = 1
action_icon_state = "mime"
action_background_icon_state = "bg_mime"
@@ -60,3 +60,108 @@
to_chat(H, "<span class='notice'>You make a vow of silence.</span>")
else
to_chat(H, "<span class='notice'>You break your vow of silence.</span>")
//Advanced Mimery traitor item spells
/obj/effect/proc_holder/spell/targeted/forcewall/mime
name = "Invisible Greater Wall"
desc = "Form an invisible three tile wide blockade."
school = "mime"
panel = "Mime"
wall_type = /obj/effect/forcefield/mime/advanced
invocation_type = "emote"
invocation_emote_self = "<span class='notice'>You form a blockade in front of yourself.</span>"
charge_max = 600
sound = null
clothes_req = FALSE
range = -1
include_user = TRUE
action_icon_state = "mime"
action_background_icon_state = "bg_mime"
large = TRUE
/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click()
if(usr && usr.mind)
if(!usr.mind.miming)
to_chat(usr, "<span class='notice'>You must dedicate yourself to silence first.</span>")
return
invocation = "<B>[usr.real_name]</B> looks as if a blockade is in front of [usr.p_them()]."
else
invocation_type ="none"
..()
/obj/effect/proc_holder/spell/targeted/mime/fingergun
name = "Finger Gun"
desc = "Shoot stunning, invisible bullets out of your fingers! 6 bullets available per cast. Use your fingers to holster them manually."
school = "mime"
panel = "Mime"
clothes_req = 0
charge_max = 600
range = -1
include_user = 1
human_req = 1
action_icon_state = "fingergun"
action_background_icon_state = "bg_mime"
var/gun = /obj/item/gun/projectile/revolver/fingergun
/obj/effect/proc_holder/spell/targeted/mime/fingergun/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/human/C in targets)
if(!istype(C.get_active_hand(), gun) && !istype(C.get_inactive_hand(), gun))
to_chat(user, "<span class='notice'>You draw your fingers!</span>")
C.drop_item()
C.put_in_hands(new gun)
else
to_chat(user, "<span class='notice'>Holster your fingers first.</span>")
revert_cast(user)
/obj/effect/proc_holder/spell/targeted/mime/fingergun/fake
desc = "Pretend you're shooting bullets out of your fingers! 6 bullets available per cast. Use your fingers to holster them manually."
gun = /obj/item/gun/projectile/revolver/fingergun/fake
// Mime Spellbooks
/obj/item/spellbook/oneuse/mime
spell = /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall
spellname = "Invisible Wall"
name = "Miming Manual : "
desc = "It contains various pictures of mimes mid-performance, aswell as some illustrated tutorials."
icon_state = "bookmime"
/obj/item/spellbook/oneuse/mime/attack_self(mob/user)
var/obj/effect/proc_holder/spell/S = new spell
for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
if(knownspell.type == S.type)
if(user.mind)
to_chat(user, "<span class='notice'>You've already read this one.</span>")
return
if(used)
recoil(user)
else
user.mind.AddSpell(S)
to_chat(user, "<span class='notice'>You flip through the pages. Your understanding of the boundaries of reality increases. You can cast [spellname]!</span>")
user.create_attack_log("<font color='orange'>[key_name(user)] learned the spell [spellname] ([S]).</font>")
onlearned(user)
/obj/item/spellbook/oneuse/mime/recoil(mob/user)
to_chat(user, "<span class='notice'>You flip through the pages. Nothing of interest to you.</span>")
/obj/item/spellbook/oneuse/mime/onlearned(mob/user)
used = 1
if(!locate(/obj/effect/proc_holder/spell/targeted/mime/speak) in user.mind.spell_list) //add vow of silence if not known by user
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak)
to_chat(user, "<span class='notice'>You have learned how to use silence to improve your performance.</span>")
/obj/item/spellbook/oneuse/mime/fingergun
spell = /obj/effect/proc_holder/spell/targeted/mime/fingergun
spellname = "Finger Gun"
desc = "It contains illustrations of guns and how to mime them."
/obj/item/spellbook/oneuse/mime/fingergun/fake
spell = /obj/effect/proc_holder/spell/targeted/mime/fingergun/fake
/obj/item/spellbook/oneuse/mime/greaterwall
spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime
spellname = "Invisible Greater Wall"
desc = "It contains illustrations of the great walls of human history."
+2 -3
View File
@@ -3,16 +3,15 @@
desc = "Summons a powerful shockwave around you that tears the appendix and limbs off of enemies."
charge_max = 500
clothes_req = 1
invocation = "ARSE NATH!"
invocation = "APPEN NATH!"
invocation_type = "shout"
max_targets = 0
range = 7
cooldown_min = 200
selection_type = "view"
action_icon_state = "superfart"
action_icon_state = "lungpunch"
/obj/effect/proc_holder/spell/targeted/rathens/cast(list/targets, mob/user = usr)
playsound(get_turf(user), 'sound/goonstation/effects/superfart.ogg', 25, 1)
for(var/mob/living/carbon/human/H in targets)
var/datum/effect_system/smoke_spread/s = new
s.set_up(5, 0, H)
+12 -12
View File
@@ -77,9 +77,9 @@
invocation = "RAAAAAAAAWR!"
shapeshift_type = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
list/current_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser)
list/current_casters = list()
list/possible_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser)
current_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser)
current_casters = list()
possible_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser)
/obj/effect/proc_holder/spell/targeted/shapeshift/bats
name = "Bat Form"
@@ -89,9 +89,9 @@
action_icon_state = "vampire_bats"
shapeshift_type = /mob/living/simple_animal/hostile/scarybat/batswarm
list/current_shapes = list(/mob/living/simple_animal/hostile/scarybat/batswarm)
list/current_casters = list()
list/possible_shapes = list(/mob/living/simple_animal/hostile/scarybat/batswarm)
current_shapes = list(/mob/living/simple_animal/hostile/scarybat/batswarm)
current_casters = list()
possible_shapes = list(/mob/living/simple_animal/hostile/scarybat/batswarm)
/obj/effect/proc_holder/spell/targeted/shapeshift/hellhound
name = "Lesser Hellhound Form"
@@ -102,13 +102,13 @@
action_icon_state = "glare"
shapeshift_type = /mob/living/simple_animal/hostile/hellhound
list/current_shapes = list(/mob/living/simple_animal/hostile/hellhound)
list/current_casters = list()
list/possible_shapes = list(/mob/living/simple_animal/hostile/hellhound)
current_shapes = list(/mob/living/simple_animal/hostile/hellhound)
current_casters = list()
possible_shapes = list(/mob/living/simple_animal/hostile/hellhound)
/obj/effect/proc_holder/spell/targeted/shapeshift/hellhound/greater
name = "Greater Hellhound Form"
shapeshift_type = /mob/living/simple_animal/hostile/hellhound/greater
list/current_shapes = list(/mob/living/simple_animal/hostile/hellhound/greater)
list/current_casters = list()
list/possible_shapes = list(/mob/living/simple_animal/hostile/hellhound/greater)
current_shapes = list(/mob/living/simple_animal/hostile/hellhound/greater)
current_casters = list()
possible_shapes = list(/mob/living/simple_animal/hostile/hellhound/greater)
+3 -3
View File
@@ -96,7 +96,7 @@
if(istype(item_to_retrive.loc, /obj/structure/disposalholder) || istype(item_to_retrive.loc, /obj/machinery/disposal))//fixes the breaking of disposals. No more bluespace connected disposal bins!
break
item_to_retrive = item_to_retrive.loc
infinite_recursion += 1
if(!item_to_retrive)
@@ -116,10 +116,10 @@
if(butterfingers)
item_to_retrive.loc = target.loc
item_to_retrive.loc.visible_message("<span class='caution'>The [item_to_retrive.name] suddenly appears!</span>")
playsound(get_turf(target),'sound/magic/SummonItems_generic.ogg',50,1)
playsound(get_turf(target),'sound/magic/summonitems_generic.ogg',50,1)
else
item_to_retrive.loc.visible_message("<span class='caution'>The [item_to_retrive.name] suddenly appears in [target]'s hand!</span>")
playsound(get_turf(target),'sound/magic/SummonItems_generic.ogg',50,1)
playsound(get_turf(target),'sound/magic/summonitems_generic.ogg',50,1)
if(message)
to_chat(target, message)
+3 -3
View File
@@ -8,9 +8,9 @@
var/include_space = 0 //whether it includes space tiles in possible teleport locations
var/include_dense = 0 //whether it includes dense tiles in possible teleport locations
var/sound1 = 'sound/weapons/ZapBang.ogg'
var/sound2 = 'sound/weapons/ZapBang.ogg'
var/sound1 = 'sound/weapons/zapbang.ogg'
var/sound2 = 'sound/weapons/zapbang.ogg'
/obj/effect/proc_holder/spell/targeted/turf_teleport/cast(list/targets,mob/living/user = usr)
playsound(get_turf(user), sound1, 50,1)
+81 -26
View File
@@ -26,11 +26,48 @@
action_icon_state = "magicm"
sound = 'sound/magic/MAGIC_MISSILE.ogg'
sound = 'sound/magic/magic_missile.ogg'
/obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile
amt_weakened = 3
sound = 'sound/magic/MM_Hit.ogg'
sound = 'sound/magic/mm_hit.ogg'
/obj/effect/proc_holder/spell/targeted/projectile/honk_missile
name = "Honk Missile"
desc = "This spell fires several, slow moving, magic bikehorns at nearby targets."
school = "evocation"
charge_max = 60
clothes_req = 0
invocation = "HONK GY AMA"
invocation_type = "shout"
range = 7
cooldown_min = 60 //35 deciseconds reduction per rank
max_targets = 0
proj_icon = 'icons/obj/items.dmi'
proj_icon_state = "bike_horn"
proj_name = "A bike horn"
proj_lingering = 1
proj_type = "/obj/effect/proc_holder/spell/targeted/inflict_handler/honk_missile"
proj_lifespan = 20
proj_step_delay = 5
proj_trail_icon = 'icons/obj/items.dmi'
proj_trail = 1
proj_trail_lifespan = 5
proj_trail_icon_state = "bike_horn"
action_icon_state = "magicm"
sound = 'sound/items/bikehorn.ogg'
/obj/effect/proc_holder/spell/targeted/inflict_handler/honk_missile
amt_weakened = 3
sound = 'sound/items/bikehorn.ogg'
/obj/effect/proc_holder/spell/noclothes
name = "No Clothes"
@@ -55,7 +92,7 @@
cooldown_min = 300 //25 deciseconds reduction per rank
action_icon_state = "mutate"
sound = 'sound/magic/Mutate.ogg'
sound = 'sound/magic/mutate.ogg'
/obj/effect/proc_holder/spell/targeted/genetic/mutate/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
@@ -98,7 +135,7 @@
emp_heavy = 6
emp_light = 10
sound = 'sound/magic/Disable_Tech.ogg'
sound = 'sound/magic/disable_tech.ogg'
/obj/effect/proc_holder/spell/targeted/turf_teleport/blink
name = "Blink"
@@ -145,26 +182,44 @@
action_icon_state = "spell_teleport"
sound1 = 'sound/magic/Teleport_diss.ogg'
sound2 = 'sound/magic/Teleport_app.ogg'
sound1 = 'sound/magic/teleport_diss.ogg'
sound2 = 'sound/magic/teleport_app.ogg'
/obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
name = "Forcewall"
desc = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb."
/obj/effect/proc_holder/spell/targeted/forcewall
name = "Force Wall"
desc = "This spell creates a small unbreakable wall that only you can pass through, and does not need wizard garb. Lasts 30 seconds."
school = "transmutation"
charge_max = 100
clothes_req = 0
clothes_req = FALSE
invocation = "TARCOL MINTI ZHERI"
invocation_type = "whisper"
range = 0
cooldown_min = 50 //12 deciseconds reduction per rank
summon_type = list("/obj/effect/forcefield")
summon_lifespan = 300
sound = 'sound/magic/forcewall.ogg'
action_icon_state = "shield"
cast_sound = 'sound/magic/ForceWall.ogg'
range = -1
include_user = TRUE
cooldown_min = 50 //12 deciseconds reduction per rank
var/wall_type = /obj/effect/forcefield/wizard
var/large = FALSE
/obj/effect/proc_holder/spell/targeted/forcewall/cast(list/targets, mob/user = usr)
new wall_type(get_turf(user), user)
if(large) //Extra THICK
if(user.dir == SOUTH || user.dir == NORTH)
new wall_type(get_step(user, EAST), user)
new wall_type(get_step(user, WEST), user)
else
new wall_type(get_step(user, NORTH), user)
new wall_type(get_step(user, SOUTH), user)
/obj/effect/proc_holder/spell/targeted/forcewall/greater
name = "Greater Force Wall"
desc = "Create a larger magical barrier that only you can pass through, but requires wizard garb. Lasts 30 seconds."
clothes_req = TRUE
invocation = "TARCOL GRANDI ZHERI"
invocation_type = "shout"
large = TRUE
/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop
name = "Stop Time"
@@ -193,7 +248,7 @@
summon_type = list(/mob/living/simple_animal/hostile/carp)
cast_sound = 'sound/magic/Summon_Karp.ogg'
cast_sound = 'sound/magic/summon_karp.ogg'
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct
name = "Artificer"
@@ -209,7 +264,7 @@
summon_type = list(/obj/structure/constructshell)
action_icon_state = "artificer"
cast_sound = 'sound/magic/SummonItems_generic.ogg'
cast_sound = 'sound/magic/summonitems_generic.ogg'
/obj/effect/proc_holder/spell/aoe_turf/conjure/creature
name = "Summon Creature Swarm"
@@ -224,7 +279,7 @@
range = 3
summon_type = list(/mob/living/simple_animal/hostile/creature)
cast_sound = 'sound/magic/SummonItems_generic.ogg'
cast_sound = 'sound/magic/summonitems_generic.ogg'
/obj/effect/proc_holder/spell/targeted/trigger/blind
name = "Blind"
@@ -245,12 +300,12 @@
/obj/effect/proc_holder/spell/targeted/inflict_handler/blind
amt_eye_blind = 10
amt_eye_blurry = 20
sound = 'sound/magic/Blind.ogg'
sound = 'sound/magic/blind.ogg'
/obj/effect/proc_holder/spell/targeted/genetic/blind
disabilities = BLIND
duration = 300
sound = 'sound/magic/Blind.ogg'
sound = 'sound/magic/blind.ogg'
/obj/effect/proc_holder/spell/fireball
name = "Fireball"
@@ -265,7 +320,7 @@
cooldown_min = 20 //10 deciseconds reduction per rank
var/fireball_type = /obj/item/projectile/magic/fireball
action_icon_state = "fireball0"
sound = 'sound/magic/Fireball.ogg'
sound = 'sound/magic/fireball.ogg'
active = FALSE
@@ -336,7 +391,7 @@
var/maxthrow = 5
var/sparkle_path = /obj/effect/temp_visual/gravpush
action_icon_state = "repulse"
sound = 'sound/magic/Repulse.ogg'
sound = 'sound/magic/repulse.ogg'
/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets, mob/user = usr)
var/list/thrownatoms = list()
@@ -381,11 +436,11 @@
include_user = 1
selection_type = "view"
action_icon_state = "sacredflame"
sound = 'sound/magic/Fireball.ogg'
sound = 'sound/magic/fireball.ogg'
/obj/effect/proc_holder/spell/targeted/sacred_flame/cast(list/targets, mob/user = usr)
for(var/mob/living/L in targets)
L.adjust_fire_stacks(20)
if(isliving(user))
var/mob/living/U = user
U.IgniteMob()
U.IgniteMob()
+86 -20
View File
@@ -92,7 +92,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas)
/obj/item/clothing/mask/gas,
/obj/item/grenade/gas/oxygen,
/obj/item/grenade/gas/oxygen)
cost = 35
containertype = /obj/structure/closet/crate/internals
containername = "emergency crate"
@@ -147,6 +149,27 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
access = access_hydroponics
announce_beacons = list("Hydroponics" = list("Hydroponics"))
/datum/supply_packs/emergency/voxsupport
name = "Vox Life Support Supplies"
contains = list(/obj/item/clothing/mask/breath/vox,
/obj/item/clothing/mask/breath/vox,
/obj/item/tank/emergency_oxygen/vox,
/obj/item/tank/emergency_oxygen/vox)
cost = 50
containertype = /obj/structure/closet/crate/medical
containername = "vox life support supplies crate"
/datum/supply_packs/emergency/plasmamansupport
name = "Plasmaman Life Support Supplies"
contains = list(/obj/item/clothing/mask/breath,
/obj/item/tank/emergency_oxygen/plasma,
/obj/item/clothing/suit/space/eva/plasmaman,
/obj/item/clothing/head/helmet/space/eva/plasmaman)
cost = 75
containertype = /obj/structure/closet/crate/secure/plasma
containername = "plasmaman life support supplies crate"
access = access_eva
/datum/supply_packs/emergency/specialops
name = "Special Ops Supplies"
contains = list(/obj/item/storage/box/emps,
@@ -712,9 +735,11 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/reagent_containers/glass/beaker/large,
/obj/item/reagent_containers/glass/beaker/large,
/obj/item/stack/medical/bruise_pack,
/obj/item/reagent_containers/iv_bag/salglu,
/obj/item/storage/box/beakers,
/obj/item/storage/box/syringes,
/obj/item/storage/box/bodybags)
/obj/item/storage/box/bodybags,
/obj/item/storage/box/iv_bags)
cost = 20
containertype = /obj/structure/closet/crate/medical
containername = "medical supplies crate"
@@ -803,14 +828,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/medical/bloodpacks
name = "Blood Pack Variety Crate"
contains = list(/obj/item/reagent_containers/blood/empty,
/obj/item/reagent_containers/blood/empty,
/obj/item/reagent_containers/blood/APlus,
/obj/item/reagent_containers/blood/AMinus,
/obj/item/reagent_containers/blood/BPlus,
/obj/item/reagent_containers/blood/BMinus,
/obj/item/reagent_containers/blood/OPlus,
/obj/item/reagent_containers/blood/OMinus)
contains = list(/obj/item/reagent_containers/iv_bag,
/obj/item/reagent_containers/iv_bag,
/obj/item/reagent_containers/iv_bag/blood/APlus,
/obj/item/reagent_containers/iv_bag/blood/AMinus,
/obj/item/reagent_containers/iv_bag/blood/BPlus,
/obj/item/reagent_containers/iv_bag/blood/BMinus,
/obj/item/reagent_containers/iv_bag/blood/OPlus,
/obj/item/reagent_containers/iv_bag/blood/OMinus)
cost = 35
containertype = /obj/structure/closet/crate/freezer
containername = "blood pack crate"
@@ -821,7 +846,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 30
containertype = /obj/structure/closet/crate/secure
containername = "IV drip crate"
access = access_cmo
access = access_medical
/datum/supply_packs/medical/surgery
name = "Surgery Crate"
@@ -934,7 +959,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/science/oil
name = "Oil Tank Crate"
contains = list(/obj/structure/reagent_dispensers/oil,
contains = list(/obj/structure/reagent_dispensers/oil,
/obj/item/reagent_containers/food/drinks/oilcan)
cost = 10
containertype = /obj/structure/largecrate
@@ -1032,6 +1057,15 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "party equipment"
announce_beacons = list("Bar" = list("Bar"))
/datum/supply_packs/organic/bar
name = "Bar Starter Kit"
contains = list(/obj/item/storage/box/drinkingglasses,
/obj/item/circuitboard/chem_dispenser/soda,
/obj/item/circuitboard/chem_dispenser/beer)
cost = 20
containername = "beer starter kit"
announce_beacons = list("Bar" = list("Bar"))
//////// livestock
/datum/supply_packs/organic/cow
name = "Cow Crate"
@@ -1165,7 +1199,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/organic/hydroponics/beekeeping_fullkit
name = "Beekeeping Starter Kit"
contains = list(/obj/structure/beebox,
contains = list(/obj/structure/beebox/unwrenched,
/obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/honey_frame,
@@ -1290,12 +1324,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/misc/lasertag
name = "Laser Tag Crate"
contains = list(/obj/item/gun/energy/laser/redtag,
/obj/item/gun/energy/laser/redtag,
/obj/item/gun/energy/laser/redtag,
/obj/item/gun/energy/laser/bluetag,
/obj/item/gun/energy/laser/bluetag,
/obj/item/gun/energy/laser/bluetag,
contains = list(/obj/item/gun/energy/laser/tag/red,
/obj/item/gun/energy/laser/tag/red,
/obj/item/gun/energy/laser/tag/red,
/obj/item/gun/energy/laser/tag/blue,
/obj/item/gun/energy/laser/tag/blue,
/obj/item/gun/energy/laser/tag/blue,
/obj/item/clothing/suit/redtag,
/obj/item/clothing/suit/redtag,
/obj/item/clothing/suit/redtag,
@@ -1314,7 +1348,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/storage/bible/booze,
/obj/item/storage/bible/booze,
/obj/item/clothing/suit/hooded/chaplain_hoodie,
/obj/item/clothing/suit/hooded/chaplain_hoodie)
/obj/item/clothing/suit/hooded/chaplain_hoodie,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial)
cost = 40
containername = "religious supplies crate"
@@ -1341,6 +1377,28 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 15
containername = "bureaucracy crate"
/datum/supply_packs/misc/book_crate
name = "Research Crate"
contains = list(/obj/item/book/codex_gigas)
cost = 15
containername = "book crate"
/datum/supply_packs/misc/book_crate/New()
contains += pick(subtypesof(/obj/item/book/manual))
contains += pick(subtypesof(/obj/item/book/manual))
contains += pick(subtypesof(/obj/item/book/manual))
contains += pick(subtypesof(/obj/item/book/manual))
..()
/datum/supply_packs/misc/tape
name = "Sticky Tape Crate"
contains = list(/obj/item/stack/tape_roll,
/obj/item/stack/tape_roll,
/obj/item/stack/tape_roll)
cost = 10
containername = "sticky tape crate"
containertype = /obj/structure/closet/crate/tape
/datum/supply_packs/misc/toner
name = "Toner Cartridges Crate"
contains = list(/obj/item/toner,
@@ -1711,6 +1769,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
)
containername = "hygiene station crate"
/datum/supply_packs/misc/snow_machine
name = "Snow Machine Crate"
cost = 20
contains = list(
/obj/machinery/snow_machine
)
special = TRUE
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Vending /////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
+331 -173
View File
@@ -2,6 +2,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/proc/get_uplink_items(var/job = null)
var/list/uplink_items = list()
var/list/sales_items = list()
var/newreference = 1
if(!uplink_items.len)
var/list/last = list()
@@ -22,6 +24,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
uplink_items[I.category] = list()
uplink_items[I.category] += I
if(I.limited_stock < 0 && !I.cant_discount && I.item && I.cost > 1)
sales_items += I
for(var/datum/uplink_item/I in last)
if(!uplink_items[I.category])
@@ -29,6 +33,30 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
uplink_items[I.category] += I
for(var/i in 1 to 3)
var/datum/uplink_item/I = pick_n_take(sales_items)
var/datum/uplink_item/A = new I.type
var/discount = 0.5
A.limited_stock = 1
I.refundable = FALSE
A.refundable = FALSE
if(A.cost >= 20)
discount *= 0.5 // If the item costs 20TC or more, it's only 25% off.
A.cost = max(round(A.cost * (1-discount)),1)
A.category = "Discounted Gear"
A.name += " ([round(((initial(A.cost)-A.cost)/initial(A.cost))*100)]% off!)"
A.job = null // If you get a job specific item selected, actually lets you buy it in the discount section
A.reference = "DIS[newreference]"
A.desc += " Limit of [A.limited_stock] per uplink. Normally costs [initial(A.cost)] TC."
A.surplus = 0 // stops the surplus crate potentially giving out a bit too much
A.item = I.item
newreference++
if(!uplink_items[A.category])
uplink_items[A.category] = list()
uplink_items[A.category] += A
return uplink_items
/datum/nano_item_lists
@@ -51,22 +79,27 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
var/list/excludefrom = list() //Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something.
var/list/job = null
var/surplus = 100 //Chance of being included in the surplus crate (when pick() selects it)
var/cant_discount = FALSE
var/limited_stock = -1 // Can you only buy so many? -1 allows for infinite purchases
var/hijack_only = FALSE //can this item be purchased only during hijackings?
var/refundable = FALSE
var/refund_path = null // Alternative path for refunds, in case the item purchased isn't what is actually refunded (ie: holoparasites).
var/refund_amount // specified refund amount in case there needs to be a TC penalty for refunds.
/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/uplink/U)
if(hijack_only)
if(!(locate(/datum/objective/hijack) in usr.mind.objectives))
to_chat(usr, "<span class='warning'>The Syndicate lacks resources to provide you with this item.</span>")
to_chat(usr, "<span class='warning'>The Syndicate will only issue this extremely dangerous item to agents assigned the Hijack objective.</span>")
return
if(item)
U.uses -= max(cost, 0)
U.used_TC += cost
feedback_add_details("traitor_uplink_items_bought", name)
return new item(loc)
/datum/uplink_item/proc/description()
if(!desc)
// Fallback description
@@ -97,7 +130,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
if(I)
if(ishuman(user))
var/mob/living/carbon/human/A = user
log_game("[key_name(user)] purchased [name]")
if(limited_stock > 0)
log_game("[key_name(user)] purchased [name]. [name] was discounted to [cost].")
else
log_game("[key_name(user)] purchased [name].")
A.put_in_any_hand_if_possible(I)
if(istype(I,/obj/item/storage/box/) && I.contents.len>0)
@@ -117,8 +153,17 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
*/
//Work in Progress, job specific antag tools
//Discounts (dynamically filled above)
/datum/uplink_item/discounts
category = "Discounted Gear"
//Job specific gear
/datum/uplink_item/jobspecific
category = "Job Specific Tools"
cant_discount = TRUE
excludefrom = list(/datum/game_mode/nuclear) // Stops the job specific category appearing for nukies
//Clown
/datum/uplink_item/jobspecific/clowngrenade
@@ -137,19 +182,35 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 3
job = list("Clown")
/datum/uplink_item/jobspecific/trick_revolver
name = "Trick Revolver"
desc = "A revolver that will fire backwards and kill whoever attempts to use it. Perfect for those pesky vigilante or just a good laugh."
reference = "CTR"
item = /obj/item/storage/box/syndie_kit/fake_revolver
cost = 1
job = list("Clown")
//mime
/datum/uplink_item/jobspecific/caneshotgun
name = "Cane Shotgun + Assassination Darts"
desc = "A specialized, one shell shotgun with a built-in cloaking device to mimic a cane. The shotgun is capable of hiding it's contents and the pin alongside being supressed. Comes with 6 special darts and a preloaded shrapnel round."
name = "Cane Shotgun and Assassination Shells"
desc = "A specialised, one shell shotgun with a built-in cloaking device to mimic a cane. The shotgun is capable of hiding it's contents and the pin alongside being supressed. Comes boxed with 6 specialised shrapnel rounds laced with a silencing toxin and 1 preloaded in the shotgun's chamber."
reference = "MCS"
item = /obj/item/storage/box/syndie_kit/caneshotgun
cost = 10
job = list("Mime")
/datum/uplink_item/jobspecific/mimery
name = "Guide to Advanced Mimery Series"
desc = "Contains two manuals to teach you advanced Mime skills. You will be able to shoot stunning bullets out of your fingers, and create large walls that can block an entire hallway!"
reference = "AM"
item = /obj/item/storage/box/syndie_kit/mimery
cost = 10
job = list("Mime")
//Chef
/datum/uplink_item/jobspecific/specialsauce
name = "Chef Excellence's Special Sauce"
desc = "A custom made sauce made from the toxin glands of 1000 space carp, if somebody ingests enough they'll be dead in 3 minutes or less guaranteed."
desc = "A custom sauce made from the highly poisonous fly amanita mushrooms. Anyone who ingests it will take variable toxin damage depending on how long it has been in their system, with a higher dosage taking longer to metabolize."
reference = "CESS"
item = /obj/item/reagent_containers/food/condiment/syndisauce
cost = 2
@@ -298,6 +359,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 12
job = list("Research Director")
//Roboticist
/datum/uplink_item/jobspecific/syndiemmi
name = "Syndicate MMI"
desc = "A syndicate developed man-machine-interface which will make any cyborg it is inserted into follow the standard syndicate lawset."
reference = "SMMI"
item = /obj/item/mmi/syndie
cost = 2
job = list("Roboticist")
surplus = 0
//Librarian
/datum/uplink_item/jobspecific/etwenty
name = "The E20"
@@ -429,6 +500,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
surplus = 25
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/sniper_compact //For when you really really hate that one guy.
name = "Compact Sniper Rifle"
desc = "A compact, unscoped version of the operative sniper rifle. Packs a powerful punch, but ammo is limited."
reference = "CSR"
item = /obj/item/gun/projectile/automatic/sniper_rifle/compact
cost = 16
surplus = 0
cant_discount = TRUE
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/crossbow
name = "Energy Crossbow"
desc = "A miniature energy crossbow that is small enough both to fit into a pocket and to slip into a backpack unnoticed by observers. Fires bolts tipped with toxin, a poisonous substance that is the product of a living organism. Stuns enemies for a short period of time. Recharges automatically."
@@ -478,55 +559,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/batterer
cost = 5
/datum/uplink_item/dangerous/manhacks
name = "Viscerator Delivery Grenade"
desc = "A unique grenade that deploys a swarm of viscerators upon activation, which will chase down and shred any non-operatives in the area."
reference = "VDG"
item = /obj/item/grenade/spawnergrenade/manhacks
cost = 6
gamemodes = list(/datum/game_mode/nuclear)
surplus = 35
/datum/uplink_item/ammo/bioterror
name = "Box of Bioterror Syringes"
desc = "A box full of preloaded syringes, containing various chemicals that seize up the victim's motor and broca system , making it impossible for them to move or speak while in their system."
reference = "BTS"
item = /obj/item/storage/box/syndie_kit/bioterror
cost = 5
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/saringrenades
name = "Sarin Gas Grenades"
desc = "A box of four (4) grenades filled with Sarin, a deadly neurotoxin. Use extreme caution when handling and be sure to vacate the premise after using; ensure communication is maintained with team to avoid accidental gassings."
reference = "TGG"
item = /obj/item/storage/box/syndie_kit/sarin
cost = 12
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
/datum/uplink_item/dangerous/atmosgrenades
name = "Atmos Grenades"
desc = "A box of two (2) grenades that wreak havoc with the atmosphere of the target area. Capable of engulfing a large area in lit plasma, or N2O. Deploy with extreme caution!"
reference = "AGG"
item = /obj/item/storage/box/syndie_kit/atmosgasgrenades
cost = 11
surplus = 0
/datum/uplink_item/dangerous/emp
name = "EMP Grenades and Implanter Kit"
desc = "A box that contains two EMP grenades and an EMP implant. Useful to disrupt communication, \
security's energy weapons, and silicon lifeforms when you're in a tight spot."
reference = "EMPK"
item = /obj/item/storage/box/syndie_kit/emp
cost = 2
/datum/uplink_item/dangerous/syndicate_minibomb
name = "Syndicate Minibomb"
desc = "The minibomb is a grenade with a five-second fuse."
reference = "SMB"
item = /obj/item/grenade/syndieminibomb
cost = 6
/datum/uplink_item/dangerous/gygax
name = "Gygax Exosuit"
desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent for hit-and-run style attacks. \
@@ -548,7 +580,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/syndieborg
name = "Syndicate Cyborg"
desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel."
desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. Comes in Assault, Medical, or Saboteur variants."
reference = "SC"
item = /obj/item/antag_spawner/borg_tele
refund_path = /obj/item/antag_spawner/borg_tele
@@ -556,6 +588,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
refundable = TRUE
cant_discount = TRUE
/datum/uplink_item/dangerous/foamsmg
name = "Toy Submachine Gun"
@@ -575,15 +608,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
/datum/uplink_item/ammo/toydarts
name = "Box of Riot Darts"
desc = "A box of 40 Donksoft foam riot darts, for reloading any compatible foam dart gun. Don't forget to share!"
reference = "FOAM"
item = /obj/item/ammo_box/foambox/riot
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
/datum/uplink_item/dangerous/guardian
name = "Holoparasites"
desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an organic host as a home base and source of fuel. \
@@ -593,6 +617,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 12
refund_path = /obj/item/guardiancreator/tech/choose
refundable = TRUE
cant_discount = TRUE
// Ammunition
@@ -601,58 +626,44 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
surplus = 40
/datum/uplink_item/ammo/pistol
name = "Magazine - 10mm"
name = "Stechkin - 10mm Magazine"
desc = "An additional 8-round 10mm magazine for use in the syndicate pistol, loaded with rounds that are cheap but around half as effective as .357"
reference = "10MM"
item = /obj/item/ammo_box/magazine/m10mm
cost = 1
/datum/uplink_item/ammo/pistolap
name = "Magazine - 10mm Armour Piercing"
name = "Stechkin - 10mm Armour Piercing Magazine"
desc = "An additional 8-round 10mm magazine for use in the syndicate pistol, loaded with rounds that are less effective at injuring the target but penetrate protective gear."
reference = "10MMAP"
item = /obj/item/ammo_box/magazine/m10mm/ap
cost = 2
/datum/uplink_item/ammo/pistolfire
name = "Magazine - 10mm Incendiary"
name = "Stechkin - 10mm Incendiary Magazine"
desc = "An additional 8-round 10mm magazine for use in the syndicate pistol, loaded with incendiary rounds which ignite the target."
reference = "10MMFIRE"
item = /obj/item/ammo_box/magazine/m10mm/fire
cost = 2
/datum/uplink_item/ammo/pistolhp
name = "Magazine - 10mm Hollow Point"
name = "Stechkin - 10mm Hollow Point Magazine"
desc = "An additional 8-round 10mm magazine for use in the syndicate pistol, loaded with rounds which are more damaging but ineffective against armour."
reference = "10MMHP"
item = /obj/item/ammo_box/magazine/m10mm/hp
cost = 3
/datum/uplink_item/ammo/revolver
name = "Speed Loader - .357"
desc = "A speed loader that contains seven additional .357 Magnum rounds for the syndicate revolver. For when you really need a lot of things dead."
reference = "357"
item = /obj/item/ammo_box/a357
cost = 3
/datum/uplink_item/ammo/smg
name = "Magazine - .45"
desc = "An additional 20-round .45 magazine for use in the C-20r submachine gun. These bullets pack a lot of punch that can knock most targets down, but do limited overall damage."
reference = "45"
item = /obj/item/ammo_box/magazine/smgm45
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/ammobag
name = "Ammo Duffelbag - Shotgun Ammo Grab Bag"
name = "Bulldog - Shotgun Ammo Grab Bag"
desc = "A duffelbag filled with Bulldog ammo to kit out an entire team, at a discounted price."
reference = "SAGL"
item = /obj/item/storage/backpack/duffel/syndie/ammo/loaded
cost = 10 //bulk buyer's discount. Very useful if you're buying a mech and dont have TC left to buy people non-shotgun guns
gamemodes = list(/datum/game_mode/nuclear)
cant_discount = TRUE
/datum/uplink_item/ammo/bullslug
name = "Drum Magazine - 12g Slugs"
name = "Bulldog - 12g Slug Magazine"
desc = "An additional 8-round slug magazine for use in the Bulldog shotgun. Now 8 times less likely to shoot your pals."
reference = "12BSG"
item = /obj/item/ammo_box/magazine/m12g
@@ -660,7 +671,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/bullbuck
name = "Drum Magazine - 12g buckshot"
name = "Bulldog - 12g Buckshot Magazine"
desc = "An additional 8-round buckshot magazine for use in the Bulldog shotgun. Front towards enemy."
reference = "12BS"
item = /obj/item/ammo_box/magazine/m12g/buckshot
@@ -668,7 +679,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/bullstun
name = "Drum Magazine - 12g Stun Slug"
name = "Bulldog - 12g Stun Slug Magazine"
desc = "An alternative 8-round stun slug magazine for use in the Bulldog shotgun. Saying that they're completely non-lethal would be lying."
reference = "12SS"
item = /obj/item/ammo_box/magazine/m12g/stun
@@ -676,15 +687,23 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/bulldragon
name = "Drum Magazine - 12g Dragon's Breath"
name = "Bulldog - 12g Dragon's Breath Magazine"
desc = "An alternative 8-round dragon's breath magazine for use in the Bulldog shotgun. I'm a fire starter, twisted fire starter!"
reference = "12DB"
item = /obj/item/ammo_box/magazine/m12g/dragon
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/smg
name = "C-20r - .45 Magazine"
desc = "An additional 20-round .45 magazine for use in the C-20r submachine gun. These bullets pack a lot of punch that can knock most targets down, but do limited overall damage."
reference = "45"
item = /obj/item/ammo_box/magazine/smgm45
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/carbine
name = "Toploader Magazine - 5.56"
name = "Carbine - 5.56 Toploader Magazine"
desc = "An additional 30-round 5.56 magazine for use in the M-90gl carbine. These bullets don't have the punch to knock most targets down, but dish out higher overall damage."
reference = "556"
item = /obj/item/ammo_box/magazine/m556
@@ -692,7 +711,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/a40mm
name = "Ammo Box - 40mm grenades"
name = "Carbine - 40mm Grenade Ammo Box"
desc = "A box of 4 additional 40mm HE grenades for use the C-90gl's underbarrel grenade launcher. Your teammates will thank you to not shoot these down small hallways."
reference = "40MM"
item = /obj/item/ammo_box/a40mm
@@ -700,7 +719,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/machinegun
name = "Box Magazine - 5.56x45mm"
name = "L6 SAW - 5.56x45mm Box Magazine"
desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW machine gun. By the time you need to use this, you'll already be on a pile of corpses."
reference = "762"
item = /obj/item/ammo_box/magazine/mm556x45
@@ -713,33 +732,57 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/sniper/basic
name = ".50 Magazine"
name = "Sniper - .50 Magazine"
desc = "An additional standard 6-round magazine for use with .50 sniper rifles."
reference = "50M"
item = /obj/item/ammo_box/magazine/sniper_rounds
/datum/uplink_item/ammo/sniper/soporific
name = ".50 Soporific Magazine"
name = "Sniper - .50 Soporific Magazine"
desc = "A 3-round magazine of soporific ammo designed for use with .50 sniper rifles. Put your enemies to sleep today!"
reference = "50S"
item = /obj/item/ammo_box/magazine/sniper_rounds/soporific
cost = 3
/datum/uplink_item/ammo/sniper/haemorrhage
name = ".50 Haemorrhage Magazine"
name = "Sniper - .50 Haemorrhage Magazine"
desc = "A 5-round magazine of haemorrhage ammo designed for use with .50 sniper rifles; causes heavy bleeding \
in the target."
reference = "50B"
item = /obj/item/ammo_box/magazine/sniper_rounds/haemorrhage
/datum/uplink_item/ammo/sniper/penetrator
name = ".50 Penetrator Magazine"
name = "Sniper - .50 Penetrator Magazine"
desc = "A 5-round magazine of penetrator ammo designed for use with .50 sniper rifles. \
Can pierce walls and multiple enemies."
reference = "50P"
item = /obj/item/ammo_box/magazine/sniper_rounds/penetrator
cost = 5
/datum/uplink_item/ammo/bioterror
name = "Box of Bioterror Syringes"
desc = "A box full of preloaded syringes, containing various chemicals that seize up the victim's motor and broca system , making it impossible for them to move or speak while in their system."
reference = "BTS"
item = /obj/item/storage/box/syndie_kit/bioterror
cost = 5
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/toydarts
name = "Box of Riot Darts"
desc = "A box of 40 Donksoft foam riot darts, for reloading any compatible foam dart gun. Don't forget to share!"
reference = "FOAM"
item = /obj/item/ammo_box/foambox/riot
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
/datum/uplink_item/ammo/revolver
name = ".357 Revolver - Speedloader"
desc = "A speed loader that contains seven additional .357 Magnum rounds for the syndicate revolver. For when you really need a lot of things dead."
reference = "357"
item = /obj/item/ammo_box/a357
cost = 3
// STEALTHY WEAPONS
/datum/uplink_item/stealthy_weapons
@@ -763,6 +806,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 17
excludefrom = list(/datum/game_mode/nuclear)
refundable = TRUE
cant_discount = TRUE
/datum/uplink_item/stealthy_weapons/cqc
name = "CQC Manual"
@@ -773,6 +817,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 13
surplus = 0
/datum/uplink_item/stealthy_weapons/cameraflash
name = "Camera Flash"
desc = "A flash disguised as a camera with a self-charging safety system preventing the flash from burning out.\
Due to its design, this flash cannot be overcharged like regular flashes can.\
Useful for stunning borgs and individuals without eye protection or blinding a crowd for a get away."
reference = "CF"
item = /obj/item/flash/cameraflash
cost = 2
/datum/uplink_item/stealthy_weapons/throwingweapons
name = "Box of Throwing Weapons"
desc = "A box of shurikens and reinforced bolas from ancient Earth martial arts. They are highly effective \
@@ -829,13 +882,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 4
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_weapons/detomatix
name = "Detomatix PDA Cartridge"
desc = "When inserted into a personal digital assistant, this cartridge gives you five opportunities to detonate PDAs of crewmembers who have their message feature enabled. The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer. It has a chance to detonate your PDA."
reference = "DEPC"
item = /obj/item/cartridge/syndicate
cost = 6
/datum/uplink_item/stealthy_weapons/silencer
name = "Universal Suppressor"
desc = "Fitted for use on any small caliber weapon with a threaded barrel, this suppressor will silence the shots of the weapon for increased stealth and superior ambushing capability."
@@ -844,34 +890,122 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 1
surplus = 10
/datum/uplink_item/stealthy_weapons/pizza_bomb
name = "Pizza Bomb"
desc = "A pizza box with a bomb taped inside of it. The timer needs to be set by opening the box; afterwards, opening the box again will trigger the detonation."
reference = "PB"
item = /obj/item/pizza_bomb
cost = 5
surplus = 8
/datum/uplink_item/stealthy_weapons/dehy_carp
name = "Dehydrated Space Carp"
desc = "Just add water to make your very own hostile to everything space carp. It looks just like a plushie. The first person to squeeze it will be registered as its owner, who it will not attack. If no owner is registered, it'll just attack everyone."
reference = "DSC"
item = /obj/item/toy/carpplushie/dehy_carp
cost = 3
/datum/uplink_item/stealthy_weapons/chamsechud
name = "Chameleon Security HUD"
desc = "A stolen Nanotrasen Security HUD with Syndicate chameleon technology implemented into it. Similarly to a chameleon jumpsuit, the HUD can be morphed into various other eyewear, while retaining the HUD qualities when worn."
reference = "CHHUD"
item = /obj/item/clothing/glasses/hud/security/chameleon
cost = 2
/datum/uplink_item/stealthy_weapons/chameleonflag
name = "Chameleon Flag"
desc = "A flag that can be disguised as any other known flag. There is a heat sensitive bomb loaded into the pole that will be detonated if the flag is lit on fire."
reference = "CHFLAG"
item = /obj/item/flag/chameleon
cost = 7
// GRENADES AND EXPLOSIVES
/datum/uplink_item/explosives
category = "Grenades and Explosives"
/datum/uplink_item/explosives/plastic_explosives
name = "Composition C-4"
desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls or connect an assembly to its wiring to make it remotely detonable. It has a modifiable timer with a minimum setting of 10 seconds."
reference = "C4"
item = /obj/item/grenade/plastic/c4
cost = 1
/datum/uplink_item/explosives/plastic_explosives_pack
name = "Pack of 5 C-4 Explosives"
desc = "A package containing 5 C-4 Explosives at a discounted price. For when you need that little bit extra for your sabotaging needs."
reference = "C4P"
item = /obj/item/storage/box/syndie_kit/c4
cost = 4
/datum/uplink_item/explosives/breaching_charge
name = "Composition X-4"
desc = "X-4 is a shaped charge designed to be safe to the user while causing maximum damage to the occupants of the room beach breached. It has a modifiable timer with a minimum setting of 10 seconds."
reference = "X4"
item = /obj/item/grenade/plastic/x4
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/explosives/syndicate_bomb
name = "Syndicate Bomb"
desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 60 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \
You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb."
reference = "SB"
item = /obj/item/radio/beacon/syndicate/bomb
cost = 11
surplus = 0
cant_discount = TRUE
/datum/uplink_item/explosives/syndicate_minibomb
name = "Syndicate Minibomb"
desc = "The minibomb is a grenade with a five-second fuse."
reference = "SMB"
item = /obj/item/grenade/syndieminibomb
cost = 6
/datum/uplink_item/explosives/detomatix
name = "Detomatix PDA Cartridge"
desc = "When inserted into a personal digital assistant, this cartridge gives you five opportunities to detonate PDAs of crewmembers who have their message feature enabled. The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer. It has a chance to detonate your PDA."
reference = "DEPC"
item = /obj/item/cartridge/syndicate
cost = 6
/datum/uplink_item/explosives/pizza_bomb
name = "Pizza Bomb"
desc = "A pizza box with a bomb taped inside of it. The timer needs to be set by opening the box; afterwards, opening the box again will trigger the detonation."
reference = "PB"
item = /obj/item/pizza_bomb
cost = 5
surplus = 80
/datum/uplink_item/explosives/grenadier
name = "Grenadier's belt"
desc = "A belt containing 25 lethally dangerous and destructive grenades."
item = /obj/item/storage/belt/grenade/full
cost = 30
surplus = 0
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/explosives/manhacks
name = "Viscerator Delivery Grenade"
desc = "A unique grenade that deploys a swarm of viscerators upon activation, which will chase down and shred any non-operatives in the area."
reference = "VDG"
item = /obj/item/grenade/spawnergrenade/manhacks
cost = 6
gamemodes = list(/datum/game_mode/nuclear)
surplus = 35
/datum/uplink_item/explosives/saringrenades
name = "Sarin Gas Grenades"
desc = "A box of four (4) grenades filled with Sarin, a deadly neurotoxin. Use extreme caution when handling and be sure to vacate the premise after using; ensure communication is maintained with team to avoid accidental gassings."
reference = "TGG"
item = /obj/item/storage/box/syndie_kit/sarin
cost = 12
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
/datum/uplink_item/explosives/atmosn2ogrenades
name = "Knockout Gas Grenades"
desc = "A box of two (2) grenades that spread knockout gas over a large area. Equip internals before using one of these."
reference = "ANG"
item = /obj/item/storage/box/syndie_kit/atmosn2ogrenades
cost = 8
/datum/uplink_item/explosives/atmosfiregrenades
name = "Plasma Fire Grenades"
desc = "A box of two (2) grenades that cause large plasma fires. Can be used to deny access to a large area. Most useful if you have an atmospherics hardsuit."
reference = "APG"
item = /obj/item/storage/box/syndie_kit/atmosfiregrenades
hijack_only = TRUE
cost = 12
surplus = 0
cant_discount = TRUE
/datum/uplink_item/explosives/emp
name = "EMP Grenades and Implanter Kit"
desc = "A box that contains two EMP grenades and an EMP implant with 2 uses. Useful to disrupt communication, \
security's energy weapons, and silicon lifeforms when you're in a tight spot."
reference = "EMPK"
item = /obj/item/storage/box/syndie_kit/emp
cost = 2
// STEALTHY TOOLS
@@ -894,6 +1028,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 1
surplus = 35
/datum/uplink_item/stealthy_tools/chameleonflag
name = "Chameleon Flag"
desc = "A flag that can be disguised as any other known flag. There is a hidden spot in the pole to boobytrap the flag with a grenade or minibomb, which will detonate some time after the flag is set on fire."
reference = "CHFLAG"
item = /obj/item/flag/chameleon
cost = 1
surplus = 35
/datum/uplink_item/stealthy_tools/syndigaloshes
name = "No-Slip Syndicate Shoes"
desc = "These allow you to run on wet floors. They do not work on lubricated surfaces."
@@ -910,6 +1052,28 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
gamemodes = list(/datum/game_mode/nuclear)
excludefrom = list()
/datum/uplink_item/stealthy_tools/chamsechud
name = "Chameleon Security HUD"
desc = "A stolen Nanotrasen Security HUD with Syndicate chameleon technology implemented into it. Similarly to a chameleon jumpsuit, the HUD can be morphed into various other eyewear, while retaining the HUD qualities when worn."
reference = "CHHUD"
item = /obj/item/clothing/glasses/hud/security/chameleon
cost = 2
/datum/uplink_item/stealthy_tools/thermal
name = "Thermal Imaging Glasses"
desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
reference = "THIG"
item = /obj/item/clothing/glasses/thermal/syndi
cost = 6
/datum/uplink_item/stealthy_tools/traitor_belt
name = "Traitor's Toolbelt"
desc = "A robust seven-slot belt made for carrying a broad variety of weapons, ammunition and explosives. It's modelled after the standard NT toolbelt so as to avoid suspicion while wearing it."
reference = "SBM"
item = /obj/item/storage/belt/military/traitor
cost = 2
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/stealthy_tools/frame
name = "F.R.A.M.E. PDA Cartridge"
desc = "When inserted into a personal digital assistant, this cartridge gives you five PDA viruses which \
@@ -1027,25 +1191,17 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/device_tools/surgerybag
name = "Syndicate Surgery Duffelbag"
desc = "The Syndicate surgery duffelbag is a toolkit containing all surgery tools, a straitjacket, and a muzzle."
desc = "The Syndicate surgery duffelbag comes with a full set of surgery tools, a straightjacket and a muzzle. The bag itself is also made of very light materials and won't slow you down while it is equipped."
reference = "SSDB"
item = /obj/item/storage/backpack/duffel/syndie/surgery
cost = 4
cost = 2
/datum/uplink_item/device_tools/bonerepair
name = "Prototype Bone Repair Kit"
desc = "Stolen prototype bone repair nanites. Contains one nanocalcium autoinjector and guide."
reference = "NCAI"
item = /obj/item/storage/box/syndie_kit/bonerepair
cost = 6
/datum/uplink_item/device_tools/traitor_belt
name = "Traitor's Toolbelt"
desc = "A robust seven-slot belt made for carrying a broad variety of weapons, ammunition and explosives. It's modelled after the standard NT toolbelt so as to avoid suspicion while wearing it."
reference = "SBM"
item = /obj/item/storage/belt/military/traitor
cost = 2
excludefrom = list(/datum/game_mode/nuclear)
cost = 4
/datum/uplink_item/device_tools/thermal_drill
name = "Thermal Safe Drill"
@@ -1116,17 +1272,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
excludefrom = list()
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/thermal
name = "Thermal Imaging Glasses"
desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
reference = "THIG"
item = /obj/item/clothing/glasses/thermal/syndi
cost = 6
/datum/uplink_item/device_tools/binary
name = "Binary Translator Key"
desc = "A key, that when inserted into a radio headset, allows you to listen to and talk with artificial intelligences and cybernetic organisms in binary."
desc = "A key, that when inserted into a radio headset, allows you to listen to and talk with artificial intelligences and cybernetic organisms in binary. To talk on the binary channel, type :+ before your radio message."
reference = "BITK"
item = /obj/item/encryptionkey/binary
cost = 5
@@ -1165,21 +1313,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
excludefrom = list()
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/plastic_explosives
name = "Composition C-4"
desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls or connect an assembly to its wiring to make it remotely detonable. It has a modifiable timer with a minimum setting of 10 seconds."
reference = "C4"
item = /obj/item/grenade/plastic/c4
cost = 1
/datum/uplink_item/device_tools/breaching_charge
name = "Composition X-4"
desc = "X-4 is a shaped charge designed to be safe to the user while causing maximum damage to the occupants of the room beach breached. It has a modifiable timer with a minimum setting of 10 seconds."
reference = "X4"
item = /obj/item/grenade/plastic/x4
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/powersink
name = "Power Sink"
desc = "When screwed to wiring attached to an electric grid, then activated, this large device places excessive load on the grid, causing a stationwide blackout. The sink cannot be carried because of its excessive size. Ordering this sends you a small beacon that will teleport the power sink to your location on activation."
@@ -1195,16 +1328,17 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
sends you a small beacon that will teleport the larger beacon to your location upon activation."
reference = "SNGB"
item = /obj/item/radio/beacon/syndicate
cost = 12
cost = 10
surplus = 0
hijack_only = TRUE //This is an item only useful for a hijack traitor, as such, it should only be available in those scenarios.
cant_discount = TRUE
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/syndicate_bomb
name = "Syndicate Bomb"
desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 60 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \
You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb."
reference = "SB"
item = /obj/item/radio/beacon/syndicate/bomb
cost = 11
/datum/uplink_item/device_tools/singularity_beacon/nuke
reference = "SNGBN"
hijack_only = FALSE // This inherited version exists so nukies can use it while keeping the original hijack only
excludefrom = list()
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/syndicate_detonator
name = "Syndicate Detonator"
@@ -1236,6 +1370,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/stack/telecrystal
cost = 1
surplus = 0
cant_discount = TRUE
/datum/uplink_item/device_tools/telecrystal/five
name = "5 Raw Telecrystals"
@@ -1251,6 +1386,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/stack/telecrystal/twenty
cost = 20
/datum/uplink_item/device_tools/telecrystal/fifty
name = "50 Raw Telecrystals"
desc = "Fifty telecrystals in their rawest and purest form. You know you want that Mauler."
reference = "RTCB"
item = /obj/item/stack/telecrystal/fifty
cost = 50
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/jammer
name = "Radio Jammer"
desc = "This device will disrupt any nearby outgoing radio communication when activated."
@@ -1301,18 +1444,19 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/implants/freedom
name = "Freedom Implant"
desc = "An implant injected into the body and later activated using a bodily gesture to attempt to slip restraints."
desc = "An implant injected into the body and later activated manually to break out of any restraints. Can be activated up to 4 times."
reference = "FI"
item = /obj/item/implanter/freedom
cost = 5
/datum/uplink_item/implants/uplink
name = "Uplink Implant"
desc = "An implant injected into the body, and later activated using a bodily gesture to open an uplink with 10 telecrystals. The ability for an agent to open an uplink after their possessions have been stripped from them makes this implant excellent for escaping confinement."
desc = "An implant injected into the body, and later activated manually to open an uplink with 10 telecrystals. The ability for an agent to open an uplink after their possessions have been stripped from them makes this implant excellent for escaping confinement."
reference = "UI"
item = /obj/item/implanter/uplink
cost = 14
surplus = 0
cant_discount = TRUE
/datum/uplink_item/implants/storage
name = "Storage Implant"
@@ -1330,7 +1474,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/implants/adrenal
name = "Adrenal Implant"
desc = "An implant injected into the body, and later activated using a bodily gesture to inject a chemical cocktail, which has a mild healing effect along with removing all stuns and increasing his speed."
desc = "An implant injected into the body, and later activated manually to inject a chemical cocktail, which has a mild healing effect along with removing and reducing the time of all stuns and increasing movement speed. Can be activated up to 3 times."
reference = "AI"
item = /obj/item/implanter/adrenalin
cost = 8
@@ -1349,10 +1493,11 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
category = "Cybernetic Implants"
surplus = 0
gamemodes = list(/datum/game_mode/nuclear)
var/cyber_bundle = FALSE
/datum/uplink_item/cyber_implants/spawn_item(turf/loc, obj/item/uplink/U)
if(item)
if(findtext(item, /obj/item/organ/internal/cyberimp))
if(findtext(item, /obj/item/organ/internal/cyberimp) && !cyber_bundle)
U.uses -= max(cost, 0)
U.used_TC += cost
feedback_add_details("traitor_uplink_items_bought", name) //this one and the line before copypasted because snowflaek code
@@ -1396,6 +1541,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "CIB"
item = /obj/item/storage/box/cyber_implants/bundle
cost = 40
cyber_bundle = TRUE
cant_discount = TRUE
// POINTLESS BADASSERY
@@ -1417,6 +1564,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/storage/box/syndicate
cost = 20
excludefrom = list(/datum/game_mode/nuclear)
cant_discount = TRUE
/datum/uplink_item/badass/syndiecards
name = "Syndicate Playing Cards"
@@ -1450,6 +1598,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "BABA"
item = /obj/item/toy/syndicateballoon
cost = 20
cant_discount = TRUE
/datum/uplink_item/implants/macrobomb
name = "Macrobomb Implant"
@@ -1492,6 +1641,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 20
item = /obj/item/storage/box/syndicate
excludefrom = list(/datum/game_mode/nuclear)
cant_discount = TRUE // You fucking wish
var/crate_value = 50
/datum/uplink_item/badass/surplus_crate/super
name = "Syndicate Super Surplus Crate"
desc = "A crate containing 125 telecrystals worth of random syndicate leftovers."
reference = "SYSS"
cost = 40
crate_value = 125
/datum/uplink_item/badass/surplus_crate/spawn_item(turf/loc, obj/item/uplink/U)
var/obj/structure/closet/crate/C = new(loc)
@@ -1499,16 +1657,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
var/list/buyable_items = list()
for(var/category in temp_uplink_list)
buyable_items += temp_uplink_list[category]
var/remaining_TC = crate_value
var/list/bought_items = list()
var/list/itemlog = list()
U.uses -= cost
U.used_TC = 20
var/remaining_TC = 50
U.used_TC = cost
var/datum/uplink_item/I
while(remaining_TC)
I = pick(buyable_items)
if(!I.surplus)
if(!I.surplus || prob(100 - I.surplus))
continue
if(I.cost > remaining_TC)
continue
@@ -15,7 +15,7 @@
end_duration = 100
end_message = "<span class='notice'>The air seems to be cooling off again.</span>"
var/pre_maint_all_access
area_type = /area
protected_areas = list(/area/maintenance, /area/turret_protected/ai_upload, /area/turret_protected/ai_upload_foyer,
/area/turret_protected/ai, /area/storage/emergency, /area/storage/emergency2, /area/crew_quarters/sleep, /area/security/brig, /area/shuttle)
@@ -26,7 +26,9 @@
/datum/weather/rad_storm/telegraph()
..()
status_alarm(TRUE)
make_maint_all_access()
pre_maint_all_access = maint_all_access
if(!maint_all_access)
make_maint_all_access()
/datum/weather/rad_storm/weather_act(mob/living/L)
@@ -51,7 +53,8 @@
return
priority_announcement.Announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert")
status_alarm(FALSE)
revoke_maint_all_access()
if(!pre_maint_all_access)
revoke_maint_all_access()
/datum/weather/rad_storm/proc/status_alarm(active) //Makes the status displays show the radiation warning for those who missed the announcement.
if(active)
+69
View File
@@ -0,0 +1,69 @@
/datum/wires/suitstorage
holder_type = /obj/machinery/suit_storage_unit
wire_count = 8
var/const/SSU_WIRE_ID = 1
var/const/SSU_WIRE_SHOCK = 2
var/const/SSU_WIRE_SAFETY = 4
var/const/SSU_WIRE_UV = 8
/datum/wires/suitstorage/GetWireName(index)
switch(index)
if(SSU_WIRE_ID)
return "ID lock"
if(SSU_WIRE_SHOCK)
return "Shock wire"
if(SSU_WIRE_SAFETY)
return "Safety wire"
if(SSU_WIRE_UV)
return "UV wire"
/datum/wires/suitstorage/get_status()
. = ..()
var/obj/machinery/suit_storage_unit/A = holder
. += "The blue light is [A.secure ? "on" : "off"]."
. += "The red light is [A.safeties ? "off" : "blinking"]."
. += "The green light is [A.shocked ? "on" : "off"]."
. += "The UV display shows [A.uv_super ? "15 nm" : "185 nm"]."
datum/wires/suitstorage/CanUse()
var/obj/machinery/suit_storage_unit/A = holder
if(A.panel_open)
return 1
return 0
/datum/wires/suitstorage/UpdateCut(index, mended)
var/obj/machinery/suit_storage_unit/A = holder
switch(index)
if(SSU_WIRE_ID)
A.secure = mended
if(SSU_WIRE_SAFETY)
A.safeties = mended
if(SSU_WIRE_SHOCK)
A.shocked = !mended
A.shock(usr, 50)
if(SSU_WIRE_UV)
A.uv_super = !mended
..()
datum/wires/suitstorage/UpdatePulsed(index)
var/obj/machinery/suit_storage_unit/A = holder
if(IsIndexCut(index))
return
switch(index)
if(SSU_WIRE_ID)
A.secure = !A.secure
if(SSU_WIRE_SAFETY)
A.safeties = !A.safeties
if(SSU_WIRE_SHOCK)
A.shocked = !A.shocked
if(A.shocked)
A.shock(usr, 100)
spawn(50)
if(A && !IsIndexCut(index))
A.shocked = FALSE
if(SSU_WIRE_UV)
A.uv_super = !A.uv_super
..()