mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-13 08:03:43 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise
This commit is contained in:
+21
-4
@@ -44,12 +44,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())
|
||||
@@ -102,20 +104,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 +319,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"
|
||||
|
||||
@@ -443,6 +457,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
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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,
|
||||
@@ -120,41 +120,6 @@
|
||||
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
|
||||
|
||||
|
||||
/datum/outfit/admin/syndicate/spy
|
||||
name = "Syndicate Spy"
|
||||
uniform = /obj/item/clothing/under/suit_jacket/really_black
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -143,7 +144,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
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>")
|
||||
return 0
|
||||
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
|
||||
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal) && !istype(H.shoes, /obj/item/clothing/shoes/magboots/wizard))
|
||||
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))
|
||||
@@ -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)
|
||||
@@ -458,11 +459,11 @@ 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))
|
||||
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))
|
||||
return 0
|
||||
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
|
||||
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal) && !istype(H.shoes, /obj/item/clothing/shoes/magboots/wizard))
|
||||
return 0
|
||||
if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard))
|
||||
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))
|
||||
return 0
|
||||
else
|
||||
if(clothes_req || human_req)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
|
||||
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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -32,6 +32,43 @@
|
||||
amt_weakened = 3
|
||||
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"
|
||||
desc = "This always-on spell allows you to cast magic without your garments."
|
||||
@@ -148,49 +185,41 @@
|
||||
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."
|
||||
|
||||
school = "transmutation"
|
||||
charge_max = 100
|
||||
clothes_req = 0
|
||||
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
|
||||
|
||||
action_icon_state = "shield"
|
||||
cast_sound = 'sound/magic/ForceWall.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/forcewall
|
||||
name = "Greater Forcewall"
|
||||
desc = "Create a magical barrier that only you can pass through."
|
||||
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 = FALSE
|
||||
invocation = "TARCOL MINTI ZHERI"
|
||||
invocation_type = "shout"
|
||||
invocation_type = "whisper"
|
||||
sound = 'sound/magic/ForceWall.ogg'
|
||||
action_icon_state = "shield"
|
||||
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(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/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"
|
||||
|
||||
@@ -934,7 +934,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
|
||||
@@ -1290,12 +1290,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,
|
||||
@@ -1341,6 +1341,15 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
cost = 15
|
||||
containername = "bureaucracy crate"
|
||||
|
||||
/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 +1720,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 /////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
+104
-82
@@ -163,6 +163,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
/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
|
||||
@@ -183,8 +184,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
//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
|
||||
@@ -530,15 +531,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."
|
||||
@@ -547,38 +539,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
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. \
|
||||
@@ -889,13 +849,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."
|
||||
@@ -904,14 +857,6 @@ 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."
|
||||
@@ -926,13 +871,105 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
item = /obj/item/clothing/glasses/hud/security/chameleon
|
||||
cost = 2
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/chameleonflag
|
||||
// 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/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
|
||||
|
||||
/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 = 8
|
||||
|
||||
/datum/uplink_item/explosives/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
|
||||
|
||||
/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/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/explosives/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
|
||||
|
||||
// STEALTHY TOOLS
|
||||
|
||||
/datum/uplink_item/stealthy_tools
|
||||
@@ -1225,21 +1262,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."
|
||||
@@ -1267,14 +1289,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
excludefrom = list()
|
||||
gamemodes = 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/syndicate_detonator
|
||||
name = "Syndicate Detonator"
|
||||
desc = "The Syndicate Detonator is a companion device to the Syndicate Bomb. Simply press the included button and an encrypted radio frequency will instruct all live syndicate bombs to detonate. \
|
||||
@@ -1321,6 +1335,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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
Reference in New Issue
Block a user