mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-07-19 19:12:31 +01:00
Merge branch 'master' of https://github.com/VOREStation/VOREStation into Fluff_Items_worshop
This commit is contained in:
@@ -9,3 +9,6 @@ Thumbs.db
|
||||
data/
|
||||
cfg/
|
||||
|
||||
code/game/gamemodes/technomancer/spells/projectile/overload.dm
|
||||
code/game/gamemodes/technomancer/spells/projectile/overload.dm
|
||||
code/modules/client/preference_setup/loadout/loadout_xeno.dm
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
var/datum/pipe_network/network
|
||||
|
||||
var/welded = 0 //defining this here for ventcrawl stuff
|
||||
|
||||
New()
|
||||
..()
|
||||
initialize_directions = dir
|
||||
|
||||
@@ -40,8 +40,6 @@
|
||||
var/internal_pressure_bound_default = INTERNAL_PRESSURE_BOUND
|
||||
var/pressure_checks_default = PRESSURE_CHECKS
|
||||
|
||||
var/welded = 0 // Added for aliens -- TLE
|
||||
|
||||
var/frequency = 1439
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
|
||||
@@ -291,8 +291,8 @@
|
||||
/obj/machinery/atmospherics/valve/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
if (!istype(W, /obj/item/weapon/wrench))
|
||||
return ..()
|
||||
if (istype(src, /obj/machinery/atmospherics/valve/digital))
|
||||
user << "<span class='warning'>You cannot unwrench \the [src], it's too complicated.</span>"
|
||||
if (istype(src, /obj/machinery/atmospherics/valve/digital) && !src.allowed(user))
|
||||
user << "<span class='warning'>Access denied.</span>"
|
||||
return 1
|
||||
var/datum/gas_mixture/int_air = return_air()
|
||||
var/datum/gas_mixture/env_air = loc.return_air()
|
||||
|
||||
@@ -52,6 +52,8 @@
|
||||
#define HIDEJUMPSUIT 0x4
|
||||
#define HIDESHOES 0x8
|
||||
#define HIDETAIL 0x10
|
||||
#define HIDETIE 0x20
|
||||
#define HIDEHOLSTER 0x40 //Some clothing hides holsters, but not all accessories
|
||||
|
||||
// WARNING: The following flags apply only to the helmets and masks!
|
||||
#define HIDEMASK 0x1
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
//
|
||||
// Lets read our settings from the configuration file on startup too!
|
||||
//
|
||||
|
||||
/hook/startup/proc/read_vs_config()
|
||||
var/list/Lines = file2list("config/config.txt")
|
||||
for(var/t in Lines)
|
||||
if(!t) continue
|
||||
|
||||
t = trim(t)
|
||||
if (length(t) == 0)
|
||||
continue
|
||||
else if (copytext(t, 1, 2) == "#")
|
||||
continue
|
||||
|
||||
var/pos = findtext(t, " ")
|
||||
var/name = null
|
||||
var/value = null
|
||||
|
||||
if (pos)
|
||||
name = lowertext(copytext(t, 1, pos))
|
||||
value = copytext(t, pos + 1)
|
||||
else
|
||||
name = lowertext(t)
|
||||
|
||||
if (!name)
|
||||
continue
|
||||
|
||||
switch (name)
|
||||
if ("chat_webhook_url")
|
||||
config.chat_webhook_url = value
|
||||
if ("chat_webhook_key")
|
||||
config.chat_webhook_key = value
|
||||
if ("fax_export_dir")
|
||||
config.fax_export_dir = value
|
||||
if ("items_survive_digestion")
|
||||
config.items_survive_digestion = 1
|
||||
return 1
|
||||
@@ -47,7 +47,7 @@
|
||||
access = access_armory
|
||||
|
||||
/datum/supply_packs/munitions/energyweapons
|
||||
name = "Energy weapons crate"
|
||||
name = "Laser carbine crate"
|
||||
contains = list(/obj/item/weapon/gun/energy/laser = 3)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
@@ -98,11 +98,11 @@
|
||||
access = access_armory
|
||||
|
||||
/datum/supply_packs/munitions/energy_guns
|
||||
name = "energy guns crate"
|
||||
name = "Energy gun crate"
|
||||
contains = list(/obj/item/weapon/gun/energy/gun = 2)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
containername = "energy guns crate"
|
||||
containername = "Energy gun crate"
|
||||
access = access_armory
|
||||
|
||||
/datum/supply_packs/munitions/bolt_rifles_competitive
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
containername = "Robotics assembly"
|
||||
access = access_robotics
|
||||
|
||||
/datum/supply_packs/robotics/robolimbs_basic
|
||||
/*/datum/supply_packs/robotics/robolimbs_basic
|
||||
name = "Basic robolimb blueprints"
|
||||
contains = list(
|
||||
/obj/item/weapon/disk/limb/morpheus,
|
||||
@@ -50,6 +50,55 @@
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "Robolimb blueprints (adv)"
|
||||
access = access_robotics
|
||||
*/
|
||||
|
||||
/datum/supply_packs/robotics/robolimbs/morpheus
|
||||
name = "Morpheus robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/morpheus)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "Robolimb blueprints (Morpheus)"
|
||||
access = access_robotics
|
||||
|
||||
/datum/supply_packs/robotics/robolimbs/xion
|
||||
name = "Xion robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/xion)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "Robolimb blueprints (Xion)"
|
||||
access = access_robotics
|
||||
|
||||
/datum/supply_packs/robotics/robolimbs/wardtakahashi
|
||||
name = "Ward-Takahashi robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/wardtakahashi)
|
||||
cost = 35
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "Robolimb blueprints (Ward-Takahashi)"
|
||||
access = access_robotics
|
||||
|
||||
/datum/supply_packs/robotics/robolimbs/zenghu
|
||||
name = "Zeng Hu robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/zenghu)
|
||||
cost = 35
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "Robolimb blueprints (Zeng Hu)"
|
||||
access = access_robotics
|
||||
|
||||
/datum/supply_packs/robotics/robolimbs/bishop
|
||||
name = "Bishop robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/bishop)
|
||||
cost = 70
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "Robolimb blueprints (Bishop)"
|
||||
access = access_robotics
|
||||
|
||||
/datum/supply_packs/robotics/robolimbs/veymed
|
||||
name = "Vey-Med robolimb blueprints"
|
||||
contains = list(/obj/item/weapon/disk/limb/veymed)
|
||||
cost = 70
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "Robolimb blueprints (Vey-Med)"
|
||||
access = access_robotics
|
||||
|
||||
/datum/supply_packs/robotics/mecha_ripley
|
||||
name = "Circuit Crate (\"Ripley\" APLU)"
|
||||
|
||||
@@ -21,6 +21,20 @@
|
||||
containername = "Atmospheric voidsuit crate"
|
||||
access = access_atmospherics
|
||||
|
||||
/datum/supply_packs/voidsuits/atmos/alt
|
||||
name = "Heavy Duty Atmospheric voidsuits"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/space/void/atmos/alt = 2,
|
||||
/obj/item/clothing/head/helmet/space/void/atmos/alt = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/shoes/magboots = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2,
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Heavy Duty Atmospheric voidsuit crate"
|
||||
access = access_atmospherics
|
||||
|
||||
/datum/supply_packs/voidsuits/engineering
|
||||
name = "Engineering voidsuits"
|
||||
contains = list(
|
||||
@@ -35,6 +49,48 @@
|
||||
containername = "Engineering voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
/datum/supply_packs/voidsuits/engineering/construction
|
||||
name = "Engineering Construction voidsuits"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/space/void/engineering/construction = 2,
|
||||
/obj/item/clothing/head/helmet/space/void/engineering/construction = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/shoes/magboots = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Engineering Construction voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
/datum/supply_packs/voidsuits/engineering/hazmat
|
||||
name = "Engineering Hazmat voidsuits"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/space/void/engineering/hazmat = 2,
|
||||
/obj/item/clothing/head/helmet/space/void/engineering/hazmat = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/shoes/magboots = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 45
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Engineering Hazmat voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
/datum/supply_packs/voidsuits/engineering/alt
|
||||
name = "Reinforced Engineering voidsuits"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/space/void/engineering/alt = 2,
|
||||
/obj/item/clothing/head/helmet/space/void/engineering/alt = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/shoes/magboots = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Reinforced Engineering voidsuit crate"
|
||||
access = access_engine_equip
|
||||
|
||||
/datum/supply_packs/voidsuits/medical
|
||||
name = "Medical voidsuits"
|
||||
contains = list(
|
||||
@@ -49,6 +105,48 @@
|
||||
containername = "Medical voidsuit crate"
|
||||
access = access_medical_equip
|
||||
|
||||
/datum/supply_packs/voidsuits/medical/emt
|
||||
name = "Medical EMT voidsuits"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/space/void/medical/emt = 2,
|
||||
/obj/item/clothing/head/helmet/space/void/medical/emt = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/shoes/magboots = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Medical EMT voidsuit crate"
|
||||
access = access_medical_equip
|
||||
|
||||
/datum/supply_packs/voidsuits/medical/bio
|
||||
name = "Medical Biohazard voidsuits"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/space/void/medical/bio = 2,
|
||||
/obj/item/clothing/head/helmet/space/void/medical/bio = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/shoes/magboots = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 45
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Medical Biohazard voidsuit crate"
|
||||
access = access_medical_equip
|
||||
|
||||
/datum/supply_packs/voidsuits/medical/alt
|
||||
name = "Vey-Med Medical voidsuits"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/space/void/medical/alt = 2,
|
||||
/obj/item/clothing/head/helmet/space/void/medical/alt = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/shoes/magboots = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Vey-Med Medical voidsuit crate"
|
||||
access = access_medical_equip
|
||||
|
||||
/datum/supply_packs/voidsuits/security
|
||||
name = "Security voidsuits"
|
||||
contains = list(
|
||||
@@ -62,6 +160,32 @@
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Security voidsuit crate"
|
||||
|
||||
/datum/supply_packs/voidsuits/security/crowd
|
||||
name = "Security Crowd Control voidsuits"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/space/void/security/riot = 2,
|
||||
/obj/item/clothing/head/helmet/space/void/security/riot = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/shoes/magboots = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Security Crowd Control voidsuit crate"
|
||||
|
||||
/datum/supply_packs/voidsuits/security/alt
|
||||
name = "Security EVA Riot voidsuits"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/space/void/security/alt = 2,
|
||||
/obj/item/clothing/head/helmet/space/void/security/alt = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/clothing/shoes/magboots = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Security EVA Riot voidsuit crate"
|
||||
|
||||
/datum/supply_packs/voidsuits/supply
|
||||
name = "Mining voidsuits"
|
||||
contains = list(
|
||||
@@ -73,4 +197,17 @@
|
||||
cost = 40
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Mining voidsuit crate"
|
||||
access = access_mining
|
||||
|
||||
/datum/supply_packs/voidsuits/supply/alt
|
||||
name = "Frontier Mining voidsuits"
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/space/void/mining/alt = 2,
|
||||
/obj/item/clothing/head/helmet/space/void/mining/alt = 2,
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/weapon/tank/oxygen = 2
|
||||
)
|
||||
cost = 50
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Frontier Mining voidsuit crate"
|
||||
access = access_mining
|
||||
@@ -8,11 +8,21 @@
|
||||
icon_state = "undershirt"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_fem
|
||||
name = "Babydoll shirt"
|
||||
icon_state = "undershirt_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long
|
||||
name = "Longsleeve Shirt"
|
||||
icon_state = "undershirt_long"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long_fem
|
||||
name = "Longsleeve Shirt, feminine"
|
||||
icon_state = "undershirt_long_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top
|
||||
name = "Tank top"
|
||||
icon_state = "tanktop"
|
||||
@@ -23,27 +33,59 @@
|
||||
icon_state = "tanktop_alt"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_alt_fem
|
||||
name = "Tank top, alt, feminine"
|
||||
icon_state = "tanktop_alt_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_alt_fem_vneck
|
||||
name = "Tank top, feminine, v-neck"
|
||||
icon_state = "tanktop_alt_fem_vneck"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_fire
|
||||
name = "Tank top, fire"
|
||||
icon_state = "tank_fire_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top_fire_fem
|
||||
name = "Tank top, fire, feminine"
|
||||
icon_state = "tank_fire_fem_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_heart
|
||||
name = "Shirt, heart"
|
||||
icon_state = "lover_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_heart_fem
|
||||
name = "Shirt, heart, babydoll"
|
||||
icon_state = "lover_fem_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_nt
|
||||
name = "Shirt, NT"
|
||||
icon_state = "shirt_nano_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_love_nt
|
||||
name = "Shirt, I<3NT"
|
||||
icon_state = "lover_s"
|
||||
icon_state = "ilovent_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_love_nt_fem
|
||||
name = "Shirt, I<3NT, babydoll"
|
||||
icon_state = "ilovent_fem_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/shortsleeve_shirt
|
||||
name = "Shortsleeve shirt"
|
||||
icon_state = "shortsleeve"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem
|
||||
name = "Shortsleeve babydoll shirt"
|
||||
icon_state = "shortsleeve_fem"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shortsleeve_shirt_fem_vneck
|
||||
name = "Shortsleeve babydoll shirt, v-neck"
|
||||
icon_state = "shortsleeve_fem_vneck"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/polo_shirt
|
||||
name = "Polo shirt"
|
||||
icon_state = "polo"
|
||||
|
||||
@@ -67,7 +67,7 @@ datum/category_group/underwear/dd_SortValue()
|
||||
if(!icon_state)
|
||||
return
|
||||
|
||||
var/image/I = image(icon = 'icons/mob/human.dmi', icon_state = icon_state)
|
||||
var/image/I = image(icon = icon, icon_state = icon_state)
|
||||
for(var/datum/gear_tweak/gt in tweaks)
|
||||
gt.tweak_item(I, metadata && metadata["[gt]"] ? metadata["[gt]"] : gt.get_default())
|
||||
return I
|
||||
@@ -18,14 +18,26 @@
|
||||
name = "Pistol Magazine (.45)"
|
||||
path = /obj/item/ammo_magazine/c45m
|
||||
|
||||
/datum/uplink_item/item/ammo/c45map
|
||||
name = "Pistol Magazine (.45 AP)"
|
||||
path = /obj/item/ammo_magazine/c45m/ap
|
||||
|
||||
/datum/uplink_item/item/ammo/tommymag
|
||||
name = "Tommygun Magazine (.45)"
|
||||
path = /obj/item/ammo_magazine/tommymag
|
||||
|
||||
/datum/uplink_item/item/ammo/tommymagap
|
||||
name = "Tommygun Magazine (.45 AP)"
|
||||
path = /obj/item/ammo_magazine/tommymag/ap
|
||||
|
||||
/datum/uplink_item/item/ammo/tommydrum
|
||||
name = "Tommygun Drum Magazine (.45)"
|
||||
path = /obj/item/ammo_magazine/tommydrum
|
||||
item_cost = 40 // Buy 40 bullets, get 10 free!
|
||||
item_cost = 40
|
||||
|
||||
/datum/uplink_item/item/ammo/tommydrumap
|
||||
name = "Tommygun Drum Magazine (.45 AP)"
|
||||
path = /obj/item/ammo_magazine/tommydrum/ap
|
||||
|
||||
/datum/uplink_item/item/ammo/darts
|
||||
name = "Darts"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
************/
|
||||
/datum/uplink_item/item/badassery
|
||||
category = /datum/uplink_category/badassery
|
||||
blacklisted = 1
|
||||
|
||||
/datum/uplink_item/item/badassery/balloon
|
||||
name = "For showing that You Are The BOSS (Useless Balloon)"
|
||||
@@ -19,7 +20,6 @@
|
||||
/datum/uplink_item/item/badassery/random_one
|
||||
name = "Random Item"
|
||||
desc = "Buys you one random item."
|
||||
blacklisted = 1
|
||||
|
||||
/datum/uplink_item/item/badassery/random_one/buy(var/obj/item/device/uplink/U, var/mob/user)
|
||||
var/datum/uplink_item/item = default_uplink_selection.get_random_item(U.uses)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
// Text shown when becoming this antagonist.
|
||||
var/list/restricted_jobs = list() // Jobs that cannot be this antagonist (depending on config)
|
||||
var/list/protected_jobs = list() // As above.
|
||||
var/list/roundstart_restricted = list() //Jobs that can be this antag, but not at roundstart
|
||||
|
||||
// Strings.
|
||||
var/welcome_text = "Cry havoc and let slip the dogs of war!"
|
||||
@@ -171,7 +172,7 @@
|
||||
|
||||
/datum/antagonist/proc/draft_antagonist(var/datum/mind/player)
|
||||
//Check if the player can join in this antag role, or if the player has already been given an antag role.
|
||||
if(!can_become_antag(player))
|
||||
if(!can_become_antag(player) || player.assigned_role in roundstart_restricted)
|
||||
log_debug("[player.key] was selected for [role_text] by lottery, but is not allowed to be that role.")
|
||||
return 0
|
||||
if(player.special_role)
|
||||
|
||||
@@ -11,8 +11,9 @@ var/datum/antagonist/cultist/cult
|
||||
role_text = "Cultist"
|
||||
role_text_plural = "Cultists"
|
||||
bantype = "cultist"
|
||||
restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Head of Security", "Colony Director")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective")
|
||||
restricted_jobs = list("Chaplain","AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director")
|
||||
roundstart_restricted = list("Internal Affairs Agent", "Head of Security", "Colony Director")
|
||||
role_type = BE_CULTIST
|
||||
feedback_tag = "cult_objective"
|
||||
antag_indicator = "cult"
|
||||
|
||||
@@ -29,8 +29,9 @@ var/datum/antagonist/revolutionary/revs
|
||||
faction_indicator = "rev"
|
||||
faction_invisible = 1
|
||||
|
||||
restricted_jobs = list("Internal Affairs Agent", "AI", "Cyborg", "Colony Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective")
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Colony Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||
roundstart_restricted = list("Internal Affairs Agent", "Colony Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||
|
||||
/datum/antagonist/revolutionary/New()
|
||||
..()
|
||||
|
||||
@@ -2545,7 +2545,7 @@ area/space/atmosalert()
|
||||
|
||||
/area/tcomfoyer
|
||||
name = "\improper Telecomms Foyer"
|
||||
icon_state = "tcomsatentrance"
|
||||
icon_state = "tcomsatfoyer"
|
||||
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
|
||||
|
||||
/area/tcomwest
|
||||
|
||||
@@ -53,6 +53,9 @@
|
||||
src << "<span class='notice'>We stab [T] with the proboscis.</span>"
|
||||
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
|
||||
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was absorbed by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Absorbed [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was absorbed by [key_name(src)]")
|
||||
var/obj/item/organ/external/affecting = T.get_organ(src.zone_sel.selecting)
|
||||
if(affecting.take_damage(39,0,1,0,"large organic needle"))
|
||||
T:UpdateDamageIcon()
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
if(istype(held_item,/obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = held_item
|
||||
if(G.affecting)
|
||||
G.affecting.electrocute_act(10 * siemens,src,1.0,BP_TORSO)
|
||||
G.affecting.electrocute_act(10 * siemens, src, 1.0, BP_TORSO, 0)
|
||||
var/agony = 80 * siemens //Does more than if hit with an electric hand, since grabbing is slower.
|
||||
G.affecting.stun_effect_act(0, agony, BP_TORSO, src)
|
||||
|
||||
@@ -166,7 +166,7 @@
|
||||
src << "<span class='warning'>We require more chemicals to electrocute [S]!</span>"
|
||||
return 0
|
||||
|
||||
S.electrocute_act(60 * siemens,src,1.0) //If only they had surge protectors.
|
||||
S.electrocute_act(60,src,0.75) //If only they had surge protectors.
|
||||
if(siemens)
|
||||
visible_message("<span class='warning'>Arcs of electricity strike [S]!</span>",
|
||||
"<span class='warning'>Our hand channels raw electricity into [S]</span>",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Blind Sting"
|
||||
desc = "We silently sting a human, completely blinding them for a short time."
|
||||
enhancedtext = "Duration is extended."
|
||||
ability_icon_state = " ling_sting_blind"
|
||||
ability_icon_state = "ling_sting_blind"
|
||||
genomecost = 2
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/proc/changeling_blind_sting
|
||||
@@ -15,6 +15,9 @@
|
||||
var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_blind_sting)
|
||||
if(!T)
|
||||
return 0
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was blind stung by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used blind sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was blind stung by [key_name(src)]")
|
||||
T << "<span class='danger'>Your eyes burn horrificly!</span>"
|
||||
T.disabilities |= NEARSIGHTED
|
||||
var/duration = 300
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_cryo_sting)
|
||||
if(!T)
|
||||
return 0
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was cryo stung by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used cryo sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was cryo stung by [key_name(src)]")
|
||||
var/inject_amount = 10
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
inject_amount = inject_amount * 1.5
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
|
||||
var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_deaf_sting)
|
||||
if(!T) return 0
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was deaf stung by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used deaf sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was deaf stung by [key_name(src)]")
|
||||
var/duration = 300
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 100
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_DEATHsting)
|
||||
if(!T)
|
||||
return 0
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was death stung by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used death sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was death stung by [key_name(src)]")
|
||||
T << "<span class='danger'>You feel a small prick and your chest becomes tight.</span>"
|
||||
T.silent = 10
|
||||
T.Paralyse(10)
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_delayed_toxic_sting)
|
||||
if(!T)
|
||||
return 0
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was delayed toxic stung by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used delayed toxic sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was delayed toxic stung by [key_name(src)]")
|
||||
var/i = rand(20,30)
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
i = i * 2
|
||||
|
||||
@@ -19,6 +19,11 @@
|
||||
if(ishuman(T))
|
||||
var/mob/living/carbon/human/H = T
|
||||
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was enfeebling stung by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used enfeebling sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was enfeebling stung by [key_name(src)]")
|
||||
|
||||
|
||||
var/effect = 30 //percent
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
effect = effect + 20
|
||||
|
||||
@@ -35,6 +35,10 @@
|
||||
src << "<span class='warning'>This creature's DNA is ruined beyond useability!</span>"
|
||||
return 0
|
||||
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Had DNA extracted via sting by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used DNA extraction sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was DNA extraction stung by [key_name(src)]")
|
||||
|
||||
var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages)
|
||||
absorbDNA(newDNA)
|
||||
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
|
||||
var/mob/living/carbon/T = changeling_sting(15,/mob/proc/changeling_lsdsting)
|
||||
if(!T) return 0
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was hallucination stung by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used hallucination sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was hallucination stung by [key_name(src)]")
|
||||
spawn(rand(300,600))
|
||||
if(T) T.hallucination += 400
|
||||
feedback_add_details("changeling_powers","HS")
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
var/mob/living/carbon/T = changeling_sting(30,/mob/proc/changeling_paralysis_sting)
|
||||
if(!T)
|
||||
return 0
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was paralysis stung by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used paralysis sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was paralysis stung by [key_name(src)]")
|
||||
T << "<span class='danger'>Your muscles begin to painfully tighten.</span>"
|
||||
T.Weaken(20)
|
||||
feedback_add_details("changeling_powers","PS")
|
||||
|
||||
@@ -41,6 +41,10 @@
|
||||
range = range * 2
|
||||
src << "<span class='notice'>We are extra loud.</span>"
|
||||
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='red'>Used Resonant Shriek.</font>")
|
||||
message_admins("[key_name(src)] used Resonant Shriek ([src.x],[src.y],[src.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>).")
|
||||
log_game("[key_name(src)] used Resonant Shriek.")
|
||||
|
||||
for(var/mob/living/M in range(range, src))
|
||||
if(iscarbon(M))
|
||||
if(!M.mind || !M.mind.changeling)
|
||||
@@ -51,6 +55,7 @@
|
||||
M.adjustEarDamage(0,30)
|
||||
M.confused += 20
|
||||
M << sound('sound/effects/screech.ogg')
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Was affected by [key_name(src)]'s Resonant Shriek.</font>")
|
||||
else
|
||||
if(M != src)
|
||||
M << "<span class='notice'>You hear a familiar screech from nearby. It has no effect on you.</span>"
|
||||
@@ -60,6 +65,7 @@
|
||||
M << sound('sound/weapons/flash.ogg')
|
||||
M << "<span class='notice'>Auditory input overloaded. Reinitializing...</span>"
|
||||
M.Weaken(rand(5,10))
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Was affected by [key_name(src)]'s Resonant Shriek.</font>")
|
||||
|
||||
for(var/obj/machinery/light/L in range(range, src))
|
||||
L.on = 1
|
||||
@@ -97,6 +103,10 @@
|
||||
src << "<span class='notice'>We are extra loud.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='red'>Used Dissonant Shriek.</font>")
|
||||
message_admins("[key_name(src)] used Dissonant Shriek ([src.x],[src.y],[src.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>).")
|
||||
log_game("[key_name(src)] used Dissonant Shriek.")
|
||||
|
||||
for(var/obj/machinery/light/L in range(5, src))
|
||||
L.on = 1
|
||||
L.broken()
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
|
||||
var/mob/living/carbon/T = changeling_sting(10,/mob/proc/changeling_silence_sting)
|
||||
if(!T) return 0
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was silence stung by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used silence sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was silence stung by [key_name(src)]")
|
||||
var/duration = 30
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 10
|
||||
|
||||
@@ -36,6 +36,9 @@
|
||||
if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T)))
|
||||
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
|
||||
return 0
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was transform stung by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used transform sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was transform stung by [key_name(src)]")
|
||||
T.visible_message("<span class='warning'>[T] transforms!</span>")
|
||||
T.dna = chosen_dna.Clone()
|
||||
T.real_name = chosen_dna.real_name
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
|
||||
var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_unfat_sting)
|
||||
if(!T) return 0
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was unfat stung by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Used unfat sting on [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was unfat stung by [key_name(src)]")
|
||||
T << "<span class='danger'>you feel a small prick as stomach churns violently and you become to feel skinnier.</span>"
|
||||
T.overeatduration = 0
|
||||
T.nutrition -= 100
|
||||
|
||||
@@ -110,6 +110,7 @@
|
||||
slowdown = 1
|
||||
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
siemens_coefficient = 0
|
||||
flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
|
||||
|
||||
/obj/item/clothing/suit/space/cult/cultify()
|
||||
|
||||
@@ -329,9 +329,8 @@ var/list/sacrificed = list()
|
||||
is_sacrifice_target = 1
|
||||
else
|
||||
corpse_to_raise = M
|
||||
if(M.key)
|
||||
M.ghostize(1) //kick them out of their body
|
||||
break
|
||||
|
||||
if(!corpse_to_raise)
|
||||
if(is_sacrifice_target)
|
||||
usr << "<span class='warning'>The Geometer of blood wants this mortal for himself.</span>"
|
||||
@@ -357,38 +356,41 @@ var/list/sacrificed = list()
|
||||
usr << "<span class='warning'>The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used.</span>"
|
||||
return fizzle()
|
||||
|
||||
var/mob/observer/dead/ghost
|
||||
for(var/mob/observer/dead/O in loc)
|
||||
if(!O.client) continue
|
||||
if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
|
||||
if(!(O.client.prefs.be_special & BE_CULTIST)) continue
|
||||
ghost = O
|
||||
break
|
||||
|
||||
if(!ghost)
|
||||
usr << "<span class='warning'>You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie.</span>"
|
||||
if(!cult.can_become_antag(corpse_to_raise.mind) || jobban_isbanned(corpse_to_raise, "cultist"))
|
||||
usr << "<span class='warning'>The Geometer of Blood refuses to touch this one.</span>"
|
||||
return fizzle()
|
||||
else if(!corpse_to_raise.client && corpse_to_raise.mind) //Don't force the dead person to come back if they don't want to.
|
||||
for(var/mob/observer/dead/ghost in player_list)
|
||||
if(ghost.mind == corpse_to_raise.mind)
|
||||
ghost << "<b><font color = #330033><font size = 3>The cultist [usr.real_name] is trying to \
|
||||
revive you. Return to your body if you want to be resurrected into the service of Nar'Sie!</b> \
|
||||
(Verbs -> Ghost -> Re-enter corpse)</font></font>"
|
||||
break
|
||||
|
||||
corpse_to_raise.revive()
|
||||
sleep(10 SECONDS)
|
||||
|
||||
corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed)
|
||||
//This means, should that player leave the body, the original may re-enter
|
||||
usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
|
||||
corpse_to_raise.visible_message("<span class='warning'>[corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.</span>", \
|
||||
"<span class='warning'>Life... I'm alive again...</span>", \
|
||||
"<span class='warning'>You hear a faint, slightly familiar whisper.</span>")
|
||||
body_to_sacrifice.visible_message("<span class='danger'>[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from \his remains!</span>", \
|
||||
"<span class='danger'>You feel as your blood boils, tearing you apart.</span>", \
|
||||
"<span class='danger'>You hear a thousand voices, all crying in pain.</span>")
|
||||
body_to_sacrifice.gib()
|
||||
if(corpse_to_raise.client)
|
||||
|
||||
cult.add_antagonist(corpse_to_raise.mind)
|
||||
corpse_to_raise.revive()
|
||||
|
||||
usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
|
||||
corpse_to_raise.visible_message("<span class='warning'>[corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.</span>", \
|
||||
"<span class='warning'>Life... I'm alive again...</span>", \
|
||||
"<span class='warning'>You hear a faint, slightly familiar whisper.</span>")
|
||||
body_to_sacrifice.visible_message("<span class='danger'>[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from \his remains!</span>", \
|
||||
"<span class='danger'>You feel as your blood boils, tearing you apart.</span>", \
|
||||
"<span class='danger'>You hear a thousand voices, all crying in pain.</span>")
|
||||
body_to_sacrifice.gib()
|
||||
|
||||
// if(ticker.mode.name == "cult")
|
||||
// ticker.mode:add_cultist(corpse_to_raise.mind)
|
||||
// else
|
||||
// ticker.mode.cult |= corpse_to_raise.mind
|
||||
|
||||
corpse_to_raise << "<span class='cult'>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</span>"
|
||||
corpse_to_raise << "<span class='cult'>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</span>"
|
||||
corpse_to_raise << "<span class='cult'>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</span>"
|
||||
corpse_to_raise << "<span class='cult'>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</span>"
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
|
||||
H << "<b>You are the Technomancer's apprentice! Your goal is to assist them in their mission at the [station_name()].</b>"
|
||||
H << "<b>Your service has not gone unrewarded, however. Studying under them, you have learned how to use a Manipulation Core \
|
||||
of your own. You also have a Catelog, to purchase your own functions and equipment as you see fit.</b>"
|
||||
of your own. You also have a catalog, to purchase your own functions and equipment as you see fit.</b>"
|
||||
H << "<b>It would be wise to speak to your master, and learn what their plans are for today.</b>"
|
||||
|
||||
spawn(1)
|
||||
|
||||
@@ -42,33 +42,33 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
|
||||
var/show_scepter_text = 0
|
||||
|
||||
/obj/item/weapon/technomancer_catalog/apprentice
|
||||
name = "apprentice's catelog"
|
||||
name = "apprentice's catalog"
|
||||
budget = 700
|
||||
max_budget = 700
|
||||
|
||||
/obj/item/weapon/technomancer_catalog/master //for badmins, I suppose
|
||||
name = "master's catelog"
|
||||
name = "master's catalog"
|
||||
budget = 2000
|
||||
max_budget = 2000
|
||||
|
||||
|
||||
// Proc: bind_to_owner()
|
||||
// Parameters: 1 (new_owner - mob that the book is trying to bind to)
|
||||
// Description: Links the catelog to hopefully the technomancer, so that only they can access it.
|
||||
// Description: Links the catalog to hopefully the technomancer, so that only they can access it.
|
||||
/obj/item/weapon/technomancer_catalog/proc/bind_to_owner(var/mob/living/carbon/human/new_owner)
|
||||
if(!owner && technomancers.is_antagonist(new_owner.mind))
|
||||
owner = new_owner
|
||||
|
||||
// Proc: New()
|
||||
// Parameters: 0
|
||||
// Description: Sets up the catelog, as shown below.
|
||||
// Description: Sets up the catalog, as shown below.
|
||||
/obj/item/weapon/technomancer_catalog/New()
|
||||
..()
|
||||
set_up()
|
||||
|
||||
// Proc: set_up()
|
||||
// Parameters: 0
|
||||
// Description: Instantiates all the catelog datums for everything that can be bought.
|
||||
// Description: Instantiates all the catalog datums for everything that can be bought.
|
||||
/obj/item/weapon/technomancer_catalog/proc/set_up()
|
||||
if(!spell_instances.len)
|
||||
for(var/S in all_technomancer_spells)
|
||||
@@ -100,7 +100,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
|
||||
return "<b>[category]</b>"
|
||||
|
||||
// Proc: attack_self()
|
||||
// Parameters: 1 (user - the mob clicking on the catelog)
|
||||
// Parameters: 1 (user - the mob clicking on the catalog)
|
||||
// Description: Shows an HTML window, to buy equipment and spells, if the user is the legitimate owner. Otherwise it cannot be used.
|
||||
/obj/item/weapon/technomancer_catalog/attack_self(mob/user)
|
||||
if(!user)
|
||||
@@ -207,12 +207,12 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
|
||||
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
|
||||
dat += "<br>"
|
||||
dat += "<h1>Manipulation Core Owner's Manual</h1><br>"
|
||||
dat += "This brief entry in your catelog will try to explain what everything does. For starters, the thing you're \
|
||||
dat += "This brief entry in your catalog will try to explain what everything does. For starters, the thing you're \
|
||||
probably wearing on your back is known as a <b>Manipulation Core</b>, or just a 'Core'. It allows you to do amazing \
|
||||
things with almost no effort, depending on what <b>functions</b> you've purchased for it. Don't lose your core!<br>"
|
||||
dat += "<br>"
|
||||
dat += "There are a few things you need to keep in mind as you use your Core to manipulate the universe. The core \
|
||||
requires a special type of <b>energy</b>, that is referred to as just 'Energy' in the catelog. All cores generate \
|
||||
requires a special type of <b>energy</b>, that is referred to as just 'Energy' in the catalog. All cores generate \
|
||||
their own energy, some more than others. Most functions require energy be spent in order to work, so make sure not \
|
||||
to run out in a critical moment. Besides waiting for your Core to recharge, you can buy certain functions which \
|
||||
do something to generate energy.<br>"
|
||||
@@ -242,13 +242,13 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
|
||||
dat += "<b>You can refund functions, equipment items, and assistance items, so long as you are in your base.</b> \
|
||||
Once you leave, you can't refund anything, however you can still buy things if you still have points remaining. \
|
||||
To refund functions, just click the 'Refund Functions' button on the top, when in the functions tabs. \
|
||||
For equipment items, you need to hit it against the catelog.<br>"
|
||||
For equipment items, you need to hit it against the catalog.<br>"
|
||||
dat += "<br>"
|
||||
dat += "Your blue robes and hat are both stylish, and somewhat protective against hostile energies, which includes \
|
||||
EXTERNAL instability sources (like Glow), and mundane electricity. If you're looking for protection against other \
|
||||
things, it's suggested you purchase or otherwise obtain armor.<br>"
|
||||
dat += "<br>"
|
||||
dat += "There are a few terms you may not understand in the catelog, so this will try to explain them.<br>"
|
||||
dat += "There are a few terms you may not understand in the catalog, so this will try to explain them.<br>"
|
||||
dat += "A function can be thought of as a 'spell', that you use by holding in your hands and trying to use it on \
|
||||
a target of your choice.<br>"
|
||||
dat += "Some functions can have their abilities enhanced by a special rod called the Scepter of Enhancement. \
|
||||
@@ -265,7 +265,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
|
||||
|
||||
// Proc: Topic()
|
||||
// Parameters: 2 (href - don't know, href_list - the choice that the person using the interface above clicked on.)
|
||||
// Description: Acts upon clicks on links for the catelog, if they are the rightful owner.
|
||||
// Description: Acts upon clicks on links for the catalog, if they are the rightful owner.
|
||||
/obj/item/weapon/technomancer_catalog/Topic(href, href_list)
|
||||
..()
|
||||
var/mob/living/carbon/human/H = usr
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
var/instability_modifier = 0.8 // Multiplier on how much instability is added.
|
||||
var/energy_cost_modifier = 1.0 // Multiplier on how much spells will cost.
|
||||
var/spell_power_modifier = 1.0 // Multiplier on how strong spells are.
|
||||
var/cooldown_modifier = 1.0 // Multiplier on cooldowns for spells.
|
||||
var/list/spells = list() // This contains the buttons used to make spells in the user's hand.
|
||||
var/list/appearances = list( // Assoc list containing possible icon_states that the wiz can change the core to.
|
||||
"default" = "technomancer_core",
|
||||
@@ -118,7 +119,11 @@
|
||||
var/mob/living/L = A
|
||||
if(L.stat == DEAD)
|
||||
summoned_mobs -= L
|
||||
qdel(L)
|
||||
spawn(1)
|
||||
L.visible_message("<span class='notice'>\The [L] begins to fade away...</span>")
|
||||
animate(L, alpha = 255, alpha = 0, time = 30) // Makes them fade into nothingness.
|
||||
sleep(30)
|
||||
qdel(L)
|
||||
|
||||
// Deletes all the summons and wards from the core, so that Destroy() won't have issues.
|
||||
/obj/item/weapon/technomancer_core/proc/dismiss_all_summons()
|
||||
@@ -248,6 +253,7 @@
|
||||
regen_rate = 70 //100 seconds to full
|
||||
slowdown = -1
|
||||
instability_modifier = 0.9
|
||||
cooldown_modifier = 0.9
|
||||
|
||||
//Big batteries but slow regen, buying energy spells is highly recommended.
|
||||
/obj/item/weapon/technomancer_core/bulky
|
||||
|
||||
@@ -60,6 +60,10 @@
|
||||
var/obj/item/projectile/P = damage_source
|
||||
P.sharp = 0
|
||||
P.edge = 0
|
||||
P.embed_chance = 0
|
||||
if(P.agony)
|
||||
var/agony_blocked = P.agony * (modified_block_percentage / 100)
|
||||
P.agony -= agony_blocked
|
||||
P.damage = P.damage - damage_blocked
|
||||
|
||||
user.visible_message("<span class='danger'>\The [user]'s [src] absorbs [attack_text]!</span>")
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
rng = rand(0,4)
|
||||
switch(rng)
|
||||
if(0)
|
||||
electrocute_act(instability * 0.3, "unstable energies")
|
||||
electrocute_act(instability * 0.3, "unstable energies", 0.75)
|
||||
if(1)
|
||||
adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability
|
||||
src << "<span class='danger'>Your chassis alerts you to overheating from an unknown external force!</span>"
|
||||
@@ -132,7 +132,7 @@
|
||||
rng = rand(0,3)
|
||||
switch(rng)
|
||||
if(0)
|
||||
electrocute_act(instability * 0.5, "extremely unstable energies")
|
||||
electrocute_act(instability * 0.5, "extremely unstable energies", 0.75)
|
||||
if(1)
|
||||
emp_act(2)
|
||||
if(2)
|
||||
@@ -146,7 +146,7 @@
|
||||
rng = rand(0,4)
|
||||
switch(rng)
|
||||
if(0)
|
||||
electrocute_act(instability, "extremely unstable energies")
|
||||
electrocute_act(instability, "extremely unstable energies", 0.75)
|
||||
if(1)
|
||||
emp_act(1)
|
||||
if(2)
|
||||
|
||||
@@ -230,8 +230,9 @@
|
||||
else if(cast_methods & CAST_RANGED) //Try to use a ranged method if a melee one doesn't exist.
|
||||
on_ranged_cast(target, user)
|
||||
if(cooldown)
|
||||
user.setClickCooldown(cooldown)
|
||||
flick("cooldown_[cooldown]",src)
|
||||
var/effective_cooldown = round(cooldown * core.cooldown_modifier, 5)
|
||||
user.setClickCooldown(effective_cooldown)
|
||||
flick("cooldown_[effective_cooldown]",src)
|
||||
|
||||
// Proc: place_spell_in_hand()
|
||||
// Parameters: 1 (path - the type path for the spell that is desired.)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
/obj/item/weapon/spell/aura/New()
|
||||
..()
|
||||
set_light(7, calculate_spell_power(4), l_color = glow_color)
|
||||
set_light(calculate_spell_power(7), calculate_spell_power(4), l_color = glow_color)
|
||||
processing_objects |= src
|
||||
log_and_message_admins("has started casting [src].")
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
name = "restoration aura"
|
||||
desc = "Allows everyone, or just your allies, to slowly regenerate."
|
||||
icon_state = "generic"
|
||||
cast_methods = null
|
||||
cast_methods = CAST_USE
|
||||
aspect = ASPECT_BIOMED
|
||||
glow_color = "#33CC33"
|
||||
var/regen_tick = 0
|
||||
@@ -31,8 +31,8 @@
|
||||
else
|
||||
mobs_to_heal |= L // Heal everyone!
|
||||
for(var/mob/living/L in mobs_to_heal)
|
||||
L.adjustBruteLoss(calculate_spell_power(-2))
|
||||
L.adjustFireLoss(calculate_spell_power(-2))
|
||||
L.adjustBruteLoss(calculate_spell_power(-5))
|
||||
L.adjustFireLoss(calculate_spell_power(-5))
|
||||
adjust_instability(2)
|
||||
|
||||
/obj/item/weapon/spell/aura/biomed/on_use_cast(mob/living/user)
|
||||
|
||||
@@ -22,14 +22,14 @@
|
||||
qdel(src)
|
||||
var/list/nearby_things = range(calculate_spell_power(4),owner)
|
||||
|
||||
var/temp_change = calculate_spell_power(40)
|
||||
var/temp_change = calculate_spell_power(80)
|
||||
var/temp_cap = calculate_spell_power(600)
|
||||
var/fire_power = calculate_spell_power(2)
|
||||
|
||||
if(check_for_scepter())
|
||||
temp_change = calculate_spell_power(80)
|
||||
temp_cap = calculate_spell_power(1000)
|
||||
fire_power = calculate_spell_power(4)
|
||||
temp_change *= 2
|
||||
temp_cap *= 2
|
||||
fire_power *= 2
|
||||
|
||||
for(var/mob/living/carbon/human/H in nearby_things)
|
||||
if(is_ally(H))
|
||||
|
||||
@@ -22,11 +22,11 @@
|
||||
qdel(src)
|
||||
var/list/nearby_mobs = range(calculate_spell_power(4),owner)
|
||||
|
||||
var/temp_change = calculate_spell_power(25)
|
||||
var/temp_change = calculate_spell_power(40)
|
||||
var/temp_cap = 260 // Just above the damage threshold, for humans. Unathi are less fortunate.
|
||||
|
||||
if(check_for_scepter())
|
||||
temp_change = calculate_spell_power(50)
|
||||
temp_change *= 2
|
||||
temp_cap = 200
|
||||
for(var/mob/living/carbon/human/H in nearby_mobs)
|
||||
if(is_ally(H))
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
glow_color = "#0000FF" //TODO
|
||||
|
||||
/obj/item/weapon/spell/aura/shock/process()
|
||||
if(!pay_energy(1000))
|
||||
if(!pay_energy(500))
|
||||
qdel(src)
|
||||
var/list/nearby_mobs = range(calculate_spell_power(4),owner)
|
||||
var/power = calculate_spell_power(7)
|
||||
@@ -38,7 +38,7 @@
|
||||
var/obj/item/organ/external/affected = H.get_organ(check_zone(BP_TORSO))
|
||||
H.electrocute_act(power, src, H.get_siemens_coefficient_organ(affected), affected)
|
||||
else
|
||||
L.electrocute_act(power, src, 1.0, BP_TORSO)
|
||||
L.electrocute_act(power, src, 0.75, BP_TORSO)
|
||||
|
||||
|
||||
adjust_instability(3)
|
||||
@@ -1,7 +1,8 @@
|
||||
/datum/technomancer/spell/blink
|
||||
name = "Blink"
|
||||
desc = "Force the target to teleport a short distance away. This target could be anything from something lying on the ground, to someone trying to \
|
||||
fight you, or even yourself. Using this on someone next to you makes their potential distance after teleportation greater."
|
||||
desc = "Force the target to teleport a short distance away. This target could be anything from something lying on the ground, \
|
||||
to someone trying to fight you, or even yourself. Using this on someone next to you makes their potential distance after \
|
||||
teleportation greater. Self casting has the greatest potential for distance, as well as the cheapest cost."
|
||||
enhancement_desc = "Blink distance is increased greatly."
|
||||
spell_power_desc = "Blink distance is scaled up with more spell power."
|
||||
cost = 50
|
||||
@@ -54,25 +55,37 @@
|
||||
if(!within_range(AM))
|
||||
user << "<span class='warning'>\The [AM] is too far away to blink.</span>"
|
||||
return
|
||||
if(check_for_scepter())
|
||||
safe_blink(AM, calculate_spell_power(6))
|
||||
if(pay_energy(400))
|
||||
if(check_for_scepter())
|
||||
safe_blink(AM, calculate_spell_power(6))
|
||||
else
|
||||
safe_blink(AM, calculate_spell_power(3))
|
||||
adjust_instability(3)
|
||||
log_and_message_admins("has blinked [AM] away.")
|
||||
else
|
||||
safe_blink(AM, calculate_spell_power(3))
|
||||
log_and_message_admins("has blinked [AM] away.")
|
||||
to_chat(user, "<span class='warning'>You need more energy to blink [AM] away!</span>")
|
||||
|
||||
/obj/item/weapon/spell/blink/on_use_cast(mob/user)
|
||||
if(check_for_scepter())
|
||||
safe_blink(user, calculate_spell_power(10))
|
||||
if(pay_energy(200))
|
||||
if(check_for_scepter())
|
||||
safe_blink(user, calculate_spell_power(10))
|
||||
else
|
||||
safe_blink(user, calculate_spell_power(6))
|
||||
adjust_instability(1)
|
||||
log_and_message_admins("has blinked themselves away.")
|
||||
else
|
||||
safe_blink(user, calculate_spell_power(6))
|
||||
log_and_message_admins("has blinked themselves away.")
|
||||
to_chat(user, "<span class='warning'>You need more energy to blink yourself away!</span>")
|
||||
|
||||
/obj/item/weapon/spell/blink/on_melee_cast(atom/hit_atom, mob/living/user, def_zone)
|
||||
if(istype(hit_atom, /atom/movable))
|
||||
var/atom/movable/AM = hit_atom
|
||||
visible_message("<span class='danger'>\The [user] reaches out towards \the [AM] with a glowing hand.</span>")
|
||||
if(check_for_scepter())
|
||||
safe_blink(AM, 10)
|
||||
if(pay_energy(300))
|
||||
visible_message("<span class='danger'>\The [user] reaches out towards \the [AM] with a glowing hand.</span>")
|
||||
if(check_for_scepter())
|
||||
safe_blink(AM, 10)
|
||||
else
|
||||
safe_blink(AM, 6)
|
||||
adjust_instability(2)
|
||||
log_and_message_admins("has blinked [AM] away.")
|
||||
else
|
||||
safe_blink(AM, 6)
|
||||
log_and_message_admins("has blinked [AM] away.")
|
||||
to_chat(user, "<span class='warning'>You need more energy to blink [AM] away!</span>")
|
||||
@@ -30,7 +30,7 @@
|
||||
W.set_color()
|
||||
W.set_up(desired_turf)
|
||||
flick(initial(icon_state),W) // Otherwise pooling causes the animation to stay stuck at the end.
|
||||
log_and_message_admins("has wetted the floor with [src] at [T.x],[T.y],[T.z].")
|
||||
log_and_message_admins("has wetted the floor with [src] at [T.x],[T.y],[T.z].")
|
||||
else if(hit_atom.reagents && !ismob(hit_atom))
|
||||
hit_atom.reagents.add_reagent(id = "water", amount = 60, data = null, safety = 0)
|
||||
adjust_instability(5)
|
||||
@@ -133,7 +133,7 @@
|
||||
if(L.client)
|
||||
user << "<span class='danger'>\The [L] seems to resist you!</span>"
|
||||
return 0
|
||||
if(pay_energy(1000))
|
||||
if(pay_energy(500))
|
||||
select(L)
|
||||
user << "<span class='notice'>\The [L] is now under your (limited) control.</span>"
|
||||
else //Deselect them
|
||||
@@ -144,7 +144,7 @@
|
||||
if(!controlled_mobs.len)
|
||||
user << "<span class='warning'>You have no entities under your control to command.</span>"
|
||||
return 0
|
||||
if(pay_energy(50 * controlled_mobs.len))
|
||||
if(pay_energy(25 * controlled_mobs.len))
|
||||
attack_all(L)
|
||||
log_and_message_admins("has commanded their army of [controlled_mobs.len] to attack [L].")
|
||||
user << "<span class='notice'>You command your [controlled_mobs.len > 1 ? "entities" : "[controlled_mobs[1]]"] to \
|
||||
@@ -158,7 +158,7 @@
|
||||
if(!controlled_mobs.len)
|
||||
user << "<span class='warning'>You have no entities under your control to command.</span>"
|
||||
return 0
|
||||
if(pay_energy(50 * controlled_mobs.len))
|
||||
if(pay_energy(10 * controlled_mobs.len))
|
||||
move_all(T)
|
||||
adjust_instability(controlled_mobs.len)
|
||||
user << "<span class='notice'>You command your [controlled_mobs.len > 1 ? "entities" : "[controlled_mobs[1]]"] to move \
|
||||
|
||||
@@ -193,9 +193,9 @@
|
||||
if(ishuman(target_mob)) // Otherwise someone else stood in the beam and is going to pay for it.
|
||||
var/mob/living/carbon/human/H = target_mob
|
||||
var/obj/item/organ/external/affected = H.get_organ(check_zone(BP_TORSO))
|
||||
H.electrocute_act(power, src, H.get_siemens_coefficient_organ(affected), affected)
|
||||
H.electrocute_act(power, src, H.get_siemens_coefficient_organ(affected), affected, 0)
|
||||
else
|
||||
target_mob.electrocute_act(power, src, 1.0, BP_TORSO)
|
||||
target_mob.electrocute_act(power, src, 0.75, BP_TORSO)
|
||||
return 0 // Since this is a continous beam, it needs to keep flying until it hits the Technomancer.
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/obj/item/weapon/spell/illusion/on_ranged_cast(atom/hit_atom, mob/user)
|
||||
if(istype(hit_atom, /atom/movable))
|
||||
var/atom/movable/AM = hit_atom
|
||||
if(pay_energy(500))
|
||||
if(pay_energy(100))
|
||||
copied = AM
|
||||
update_icon()
|
||||
user << "<span class='notice'>You've copied \the [AM]'s appearance.</span>"
|
||||
@@ -30,7 +30,7 @@
|
||||
if(!illusion)
|
||||
if(!copied)
|
||||
copied = user
|
||||
if(pay_energy(1000)) // 4
|
||||
if(pay_energy(500))
|
||||
illusion = new(T)
|
||||
illusion.copy_appearance(copied)
|
||||
if(ishuman(copied))
|
||||
@@ -41,7 +41,7 @@
|
||||
user << 'sound/effects/pop.ogg'
|
||||
return 1
|
||||
else
|
||||
if(pay_energy(300))
|
||||
if(pay_energy(100))
|
||||
spawn(1)
|
||||
illusion.walk_loop(T)
|
||||
|
||||
|
||||
@@ -50,5 +50,7 @@
|
||||
|
||||
H.restore_blood() // Fix bloodloss
|
||||
|
||||
H.adjustBruteLoss(-heal_power)
|
||||
|
||||
sleep(1 SECOND)
|
||||
on_expire()
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
/datum/technomancer/spell/phase_shift
|
||||
name = "Phase Shift"
|
||||
desc = "Hides you in the safest possible place, where no harm can come to you. Unfortunately you can only stay inside for a few moments before \
|
||||
draining your powercell."
|
||||
desc = "Hides you in the safest possible place, where no harm can come to you. Unfortunately, a prolonged stay inside the \
|
||||
rift you create will afflict you with instability."
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/phase_shift
|
||||
category = DEFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/phase_shift
|
||||
name = "phase shift"
|
||||
desc = "Allows you to dodge your untimely fate by shifting your location somewhere else, so long as you can sustain the energy to do so."
|
||||
desc = "Allows you to dodge your untimely fate by shifting your location somewhere else, so long as you can survive inside the \
|
||||
rift."
|
||||
cast_methods = CAST_USE
|
||||
aspect = ASPECT_TELE
|
||||
|
||||
|
||||
@@ -39,9 +39,9 @@
|
||||
if(ishuman(target_mob))
|
||||
var/mob/living/carbon/human/H = target_mob
|
||||
var/obj/item/organ/external/affected = H.get_organ(check_zone(BP_TORSO))
|
||||
H.electrocute_act(power, src, H.get_siemens_coefficient_organ(affected), affected)
|
||||
H.electrocute_act(power, src, H.get_siemens_coefficient_organ(affected), affected, 0)
|
||||
else
|
||||
target_mob.electrocute_act(power, src, 1.0, BP_TORSO)
|
||||
target_mob.electrocute_act(power, src, 0.75, BP_TORSO)
|
||||
hit_mobs |= target_mob
|
||||
|
||||
//Each bounce reduces the damage of the bolt.
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
/datum/technomancer/spell/ionic_bolt
|
||||
name = "Ionic Bolt"
|
||||
desc = "Shoots a bolt of ion energy at the target. If it hits something, it will generally drain energy, corrupt electronics, \
|
||||
or otherwise ruin complex machinery."
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/projectile/ionic_bolt
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/projectile/ionic_bolt
|
||||
name = "ionic bolt"
|
||||
icon_state = "ionic bolt"
|
||||
desc = "For those pesky security units."
|
||||
cast_methods = CAST_RANGED
|
||||
aspect = ASPECT_EMP
|
||||
spell_projectile = /obj/item/projectile/ion
|
||||
energy_cost_per_shot = 500
|
||||
instability_per_shot = 6
|
||||
cooldown = 10
|
||||
pre_shot_delay = 0
|
||||
fire_sound = 'sound/effects/supermatter.ogg'
|
||||
@@ -36,7 +36,7 @@
|
||||
if(ishuman(target_mob))
|
||||
var/mob/living/carbon/human/H = target_mob
|
||||
var/obj/item/organ/external/affected = H.get_organ(check_zone(BP_TORSO))
|
||||
H.electrocute_act(power, src, H.get_siemens_coefficient_organ(affected), affected)
|
||||
H.electrocute_act(power, src, H.get_siemens_coefficient_organ(affected), affected, 0)
|
||||
else
|
||||
target_mob.electrocute_act(power, src, 1.0, BP_TORSO)
|
||||
target_mob.electrocute_act(power, src, 0.75, BP_TORSO)
|
||||
return 1
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "Fires a bolt of highly unstable energy, that does damaged equal to 0.3% of the technomancer's current reserve of energy. \
|
||||
This energy pierces all known armor. Energy cost is equal to 10% of maximum core charge."
|
||||
enhancement_desc = "Will do damage equal to 0.4% of current energy."
|
||||
spell_power_desc = "Increases damage dealt, up to a cap of 80 damage per shot."
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/projectile/overload
|
||||
category = OFFENSIVE_SPELLS
|
||||
@@ -26,9 +27,19 @@
|
||||
damage_type = BURN
|
||||
armor_penetration = 100
|
||||
|
||||
/obj/item/weapon/spell/projectile/overload/make_projectile(obj/item/projectile/projectile_type, mob/living/user)
|
||||
var/obj/item/projectile/overload/P = new projectile_type(get_turf(user))
|
||||
var/energy_before_firing = core.energy
|
||||
if(check_for_scepter())
|
||||
P.damage = round(energy_before_firing * 0.004) // .4% of their current energy pool.
|
||||
else
|
||||
P.damage = round(energy_before_firing * 0.003) // .3% of their current energy pool.
|
||||
P.damage = min(calculate_spell_power(P.damage), 80)
|
||||
return P
|
||||
|
||||
/obj/item/weapon/spell/projectile/overload/on_ranged_cast(atom/hit_atom, mob/living/user)
|
||||
energy_cost_per_shot = round(core.max_energy * 0.10)
|
||||
var/energy_before_firing = core.energy
|
||||
/* var/energy_before_firing = core.energy
|
||||
if(set_up(hit_atom, user))
|
||||
var/obj/item/projectile/overload/P = new spell_projectile(get_turf(user))
|
||||
P.launch(hit_atom)
|
||||
@@ -38,3 +49,4 @@
|
||||
P.damage = round(energy_before_firing * 0.003) // .3% of their current energy pool.
|
||||
adjust_instability(instability_per_shot)
|
||||
return 1
|
||||
*/
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
|
||||
/obj/item/weapon/spell/projectile/on_ranged_cast(atom/hit_atom, mob/living/user)
|
||||
if(set_up(hit_atom, user))
|
||||
var/obj/item/projectile/new_projectile = new spell_projectile(get_turf(user))
|
||||
new_projectile.damage = calculate_spell_power(new_projectile.damage)
|
||||
var/obj/item/projectile/new_projectile = make_projectile(spell_projectile, user)
|
||||
new_projectile.launch(hit_atom)
|
||||
log_and_message_admins("has casted [src] at \the [hit_atom].")
|
||||
if(fire_sound)
|
||||
@@ -21,6 +20,11 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/spell/projectile/proc/make_projectile(obj/item/projectile/projectile_type, mob/living/user)
|
||||
var/obj/item/projectile/P = new projectile_type(get_turf(user))
|
||||
P.damage = calculate_spell_power(P.damage)
|
||||
return P
|
||||
|
||||
/obj/item/weapon/spell/projectile/proc/set_up(atom/hit_atom, mob/living/user)
|
||||
if(spell_projectile)
|
||||
if(pay_energy(energy_cost_per_shot))
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
dead_mob_list -= SM
|
||||
living_mob_list += SM
|
||||
SM.icon_state = SM.icon_living
|
||||
adjust_instability(30)
|
||||
adjust_instability(15)
|
||||
else if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
|
||||
@@ -49,6 +49,9 @@
|
||||
(Verbs -> Ghost -> Re-enter corpse)</font></font>"
|
||||
break
|
||||
|
||||
H.adjustBruteLoss(-40)
|
||||
H.adjustFireLoss(-40)
|
||||
|
||||
sleep(10 SECONDS)
|
||||
if(H.client)
|
||||
L.stat = CONSCIOUS //Note that if whatever killed them in the first place wasn't fixed, they're likely to die again.
|
||||
|
||||
@@ -50,6 +50,16 @@
|
||||
summoned.health = calculate_spell_power(summoned.health)
|
||||
summoned.melee_damage_lower = calculate_spell_power(summoned.melee_damage_lower)
|
||||
summoned.melee_damage_upper = calculate_spell_power(summoned.melee_damage_upper)
|
||||
// This makes the summon slower, so the crew has a chance to flee from massive monsters.
|
||||
summoned.move_to_delay = calculate_spell_power(round(summoned.move_to_delay))
|
||||
|
||||
var/new_size = calculate_spell_power(1)
|
||||
if(new_size != 1)
|
||||
var/matrix/M = matrix()
|
||||
M.Scale(new_size)
|
||||
M.Translate(0, 16*(new_size-1))
|
||||
summoned.transform = M
|
||||
|
||||
|
||||
// Now we hurt their new pal, because being forcefully abducted by teleportation can't be healthy.
|
||||
summoned.health = round(summoned.maxHealth * 0.7)
|
||||
@@ -38,7 +38,6 @@
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
|
||||
// H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(H), slot_s_store)
|
||||
if(H.backbag == 1)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_store)
|
||||
else
|
||||
|
||||
@@ -364,6 +364,10 @@ var/global/datum/controller/occupations/job_master
|
||||
H << "<span class='warning'>Your current species, job or whitelist status does not permit you to spawn with [thing]!</span>"
|
||||
continue
|
||||
|
||||
if(G.slot == "implant")
|
||||
H.implant_loadout(G)
|
||||
continue
|
||||
|
||||
if(G.slot && !(G.slot in custom_equip_slots))
|
||||
// This is a miserable way to fix the loadout overwrite bug, but the alternative requires
|
||||
// adding an arg to a bunch of different procs. Will look into it after this merge. ~ Z
|
||||
|
||||
@@ -20,9 +20,10 @@
|
||||
var/obj/machinery/sleeper/sleepernew = null
|
||||
for(dir in list(NORTH, EAST, SOUTH, WEST)) // Loop through every direction
|
||||
sleepernew = locate(/obj/machinery/sleeper, get_step(src, dir)) // Try to find a scanner in that direction
|
||||
if(sleepernew)
|
||||
sleeper = sleepernew
|
||||
sleepernew.console = src
|
||||
if(sleepernew)
|
||||
sleeper = sleepernew
|
||||
sleepernew.console = src
|
||||
return
|
||||
return
|
||||
|
||||
/obj/machinery/sleep_console/attack_ai(var/mob/user)
|
||||
|
||||
@@ -655,7 +655,8 @@
|
||||
"tox_scrub",
|
||||
"n2o_scrub",
|
||||
"panic_siphon",
|
||||
"scrubbing")
|
||||
"scrubbing",
|
||||
"direction")
|
||||
|
||||
send_signal(device_id, list(href_list["command"] = text2num(href_list["val"])))
|
||||
return 1
|
||||
|
||||
@@ -410,6 +410,13 @@
|
||||
preserve = 1
|
||||
break
|
||||
|
||||
if(istype(W,/obj/item/weapon/implant/health))
|
||||
for(var/obj/machinery/computer/cloning/com in world)
|
||||
for(var/datum/dna2/record/R in com.records)
|
||||
if(R.implant == W)
|
||||
qdel(R)
|
||||
qdel(W)
|
||||
|
||||
if(!preserve)
|
||||
qdel(W)
|
||||
else
|
||||
|
||||
@@ -357,7 +357,7 @@ About the new airlock wires panel:
|
||||
else /*if(src.justzap)*/
|
||||
return
|
||||
else if(user.hallucination > 50 && prob(10) && src.operating == 0)
|
||||
user << "<span class='danger'>You feel a powerful shock course through your body!</span>"
|
||||
to_chat(user,"<span class='danger'>You feel a powerful shock course through your body!</span>")
|
||||
user.halloss += 10
|
||||
user.stunned += 10
|
||||
return
|
||||
@@ -461,7 +461,7 @@ About the new airlock wires panel:
|
||||
src.electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration)
|
||||
|
||||
if(feedback && message)
|
||||
usr << message
|
||||
to_chat(usr,message)
|
||||
|
||||
/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0)
|
||||
var/message = ""
|
||||
@@ -475,7 +475,7 @@ About the new airlock wires panel:
|
||||
message = "IdScan feature has been disabled."
|
||||
|
||||
if(feedback && message)
|
||||
usr << message
|
||||
to_chat(usr,message)
|
||||
|
||||
/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0)
|
||||
var/message = ""
|
||||
@@ -488,7 +488,7 @@ About the new airlock wires panel:
|
||||
safe = 1
|
||||
|
||||
if(feedback && message)
|
||||
usr << message
|
||||
to_chat(usr,message)
|
||||
|
||||
// shock user with probability prb (if all connections & power are working)
|
||||
// returns 1 if shocked, 0 otherwise
|
||||
@@ -596,43 +596,43 @@ About the new airlock wires panel:
|
||||
src.aiHacking=1
|
||||
spawn(20)
|
||||
//TODO: Make this take a minute
|
||||
user << "Airlock AI control has been blocked. Beginning fault-detection."
|
||||
to_chat(user,"Airlock AI control has been blocked. Beginning fault-detection.")
|
||||
sleep(50)
|
||||
if(src.canAIControl())
|
||||
user << "Alert cancelled. Airlock control has been restored without our assistance."
|
||||
to_chat(user,"Alert cancelled. Airlock control has been restored without our assistance.")
|
||||
src.aiHacking=0
|
||||
return
|
||||
else if(!src.canAIHack(user))
|
||||
user << "We've lost our connection! Unable to hack airlock."
|
||||
to_chat(user,"We've lost our connection! Unable to hack airlock.")
|
||||
src.aiHacking=0
|
||||
return
|
||||
user << "Fault confirmed: airlock control wire disabled or cut."
|
||||
to_chat(user,"Fault confirmed: airlock control wire disabled or cut.")
|
||||
sleep(20)
|
||||
user << "Attempting to hack into airlock. This may take some time."
|
||||
to_chat(user,"Attempting to hack into airlock. This may take some time.")
|
||||
sleep(200)
|
||||
if(src.canAIControl())
|
||||
user << "Alert cancelled. Airlock control has been restored without our assistance."
|
||||
to_chat(user,"Alert cancelled. Airlock control has been restored without our assistance.")
|
||||
src.aiHacking=0
|
||||
return
|
||||
else if(!src.canAIHack(user))
|
||||
user << "We've lost our connection! Unable to hack airlock."
|
||||
to_chat(user,"We've lost our connection! Unable to hack airlock.")
|
||||
src.aiHacking=0
|
||||
return
|
||||
user << "Upload access confirmed. Loading control program into airlock software."
|
||||
to_chat(user,"Upload access confirmed. Loading control program into airlock software.")
|
||||
sleep(170)
|
||||
if(src.canAIControl())
|
||||
user << "Alert cancelled. Airlock control has been restored without our assistance."
|
||||
to_chat(user,"Alert cancelled. Airlock control has been restored without our assistance.")
|
||||
src.aiHacking=0
|
||||
return
|
||||
else if(!src.canAIHack(user))
|
||||
user << "We've lost our connection! Unable to hack airlock."
|
||||
to_chat(user,"We've lost our connection! Unable to hack airlock.")
|
||||
src.aiHacking=0
|
||||
return
|
||||
user << "Transfer complete. Forcing airlock to execute program."
|
||||
to_chat(user,"Transfer complete. Forcing airlock to execute program.")
|
||||
sleep(50)
|
||||
//disable blocked control
|
||||
src.aiControlDisabled = 2
|
||||
user << "Receiving control information from airlock."
|
||||
to_chat(user,"Receiving control information from airlock.")
|
||||
sleep(10)
|
||||
//bring up airlock dialog
|
||||
src.aiHacking = 0
|
||||
@@ -664,16 +664,16 @@ About the new airlock wires panel:
|
||||
|
||||
/obj/machinery/door/airlock/CanUseTopic(var/mob/user)
|
||||
if(operating < 0) //emagged
|
||||
user << "<span class='warning'>Unable to interface: Internal error.</span>"
|
||||
to_chat(user,"<span class='warning'>Unable to interface: Internal error.</span>")
|
||||
return STATUS_CLOSE
|
||||
if(issilicon(user) && !src.canAIControl())
|
||||
if(src.canAIHack(user))
|
||||
src.hack(user)
|
||||
else
|
||||
if (src.isAllPowerLoss()) //don't really like how this gets checked a second time, but not sure how else to do it.
|
||||
user << "<span class='warning'>Unable to interface: Connection timed out.</span>"
|
||||
to_chat(user,"<span class='warning'>Unable to interface: Connection timed out.</span>")
|
||||
else
|
||||
user << "<span class='warning'>Unable to interface: Connection refused.</span>"
|
||||
to_chat(user,"<span class='warning'>Unable to interface: Connection refused.</span>")
|
||||
return STATUS_CLOSE
|
||||
|
||||
return ..()
|
||||
@@ -694,20 +694,20 @@ About the new airlock wires panel:
|
||||
src.loseBackupPower()
|
||||
if("bolts")
|
||||
if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
|
||||
usr << "The door bolt control wire is cut - Door bolts permanently dropped."
|
||||
to_chat(usr,"The door bolt control wire is cut - Door bolts permanently dropped.")
|
||||
else if(activate && src.lock())
|
||||
usr << "The door bolts have been dropped."
|
||||
to_chat(usr,"The door bolts have been dropped.")
|
||||
else if(!activate && src.unlock())
|
||||
usr << "The door bolts have been raised."
|
||||
to_chat(usr,"The door bolts have been raised.")
|
||||
if("electrify_temporary")
|
||||
electrify(30 * activate, 1)
|
||||
if("electrify_permanently")
|
||||
electrify(-1 * activate, 1)
|
||||
if("open")
|
||||
if(src.welded)
|
||||
usr << text("The airlock has been welded shut!")
|
||||
to_chat(usr,text("The airlock has been welded shut!"))
|
||||
else if(src.locked)
|
||||
usr << text("The door bolts are down!")
|
||||
to_chat(usr,text("The door bolts are down!"))
|
||||
else if(activate && density)
|
||||
open()
|
||||
else if(!activate && !density)
|
||||
@@ -717,7 +717,7 @@ About the new airlock wires panel:
|
||||
if("timing")
|
||||
// Door speed control
|
||||
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
|
||||
usr << text("The timing wire is cut - Cannot alter timing.")
|
||||
to_chat(usr,text("The timing wire is cut - Cannot alter timing."))
|
||||
else if (activate && src.normalspeed)
|
||||
normalspeed = 0
|
||||
else if (!activate && !src.normalspeed)
|
||||
@@ -725,13 +725,13 @@ About the new airlock wires panel:
|
||||
if("lights")
|
||||
// Bolt lights
|
||||
if(src.isWireCut(AIRLOCK_WIRE_LIGHT))
|
||||
usr << "The bolt lights wire is cut - The door bolt lights are permanently disabled."
|
||||
to_chat(usr,"The bolt lights wire is cut - The door bolt lights are permanently disabled.")
|
||||
else if (!activate && src.lights)
|
||||
lights = 0
|
||||
usr << "The door bolt lights have been disabled."
|
||||
to_chat(usr,"The door bolt lights have been disabled.")
|
||||
else if (activate && !src.lights)
|
||||
lights = 1
|
||||
usr << "The door bolt lights have been enabled."
|
||||
to_chat(usr,"The door bolt lights have been enabled.")
|
||||
|
||||
update_icon()
|
||||
return 1
|
||||
@@ -764,7 +764,7 @@ About the new airlock wires panel:
|
||||
else if(istype(C, /obj/item/weapon/screwdriver))
|
||||
if (src.p_open)
|
||||
if (stat & BROKEN)
|
||||
usr << "<span class='warning'>The panel is broken and cannot be closed.</span>"
|
||||
to_chat(usr,"<span class='warning'>The panel is broken and cannot be closed.</span>")
|
||||
else
|
||||
src.p_open = 0
|
||||
else
|
||||
@@ -784,7 +784,7 @@ About the new airlock wires panel:
|
||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
|
||||
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
|
||||
if(do_after(user,40))
|
||||
user << "<span class='notice'>You removed the airlock electronics!</span>"
|
||||
to_chat(user,"<span class='notice'>You removed the airlock electronics!</span>")
|
||||
|
||||
var/obj/structure/door_assembly/da = new assembly_type(src.loc)
|
||||
if (istype(da, /obj/structure/door_assembly/multi_tile))
|
||||
@@ -812,9 +812,9 @@ About the new airlock wires panel:
|
||||
qdel(src)
|
||||
return
|
||||
else if(arePowerSystemsOn())
|
||||
user << "<span class='notice'>The airlock's motors resist your efforts to force it.</span>"
|
||||
to_chat(user,"<span class='notice'>The airlock's motors resist your efforts to force it.</span>")
|
||||
else if(locked)
|
||||
user << "<span class='notice'>The airlock's bolts prevent it from being forced.</span>"
|
||||
to_chat(user,"<span class='notice'>The airlock's bolts prevent it from being forced.</span>")
|
||||
else
|
||||
if(density)
|
||||
spawn(0) open(1)
|
||||
@@ -826,12 +826,12 @@ About the new airlock wires panel:
|
||||
var/obj/item/weapon/W = C
|
||||
if((W.pry == 1) && !arePowerSystemsOn())
|
||||
if(locked)
|
||||
user << "<span class='notice'>The airlock's bolts prevent it from being forced.</span>"
|
||||
to_chat(user,"<span class='notice'>The airlock's bolts prevent it from being forced.</span>")
|
||||
else if( !welded && !operating )
|
||||
if(istype(C, /obj/item/weapon/material/twohanded/fireaxe)) // If this is a fireaxe, make sure it's held in two hands.
|
||||
var/obj/item/weapon/material/twohanded/fireaxe/F = C
|
||||
if(!F.wielded)
|
||||
user << "<span class='warning'>You need to be wielding \the [F] to do that.</span>"
|
||||
to_chat(user,"<span class='warning'>You need to be wielding \the [F] to do that.</span>")
|
||||
return
|
||||
// At this point, it's an armblade or a fireaxe that passed the wielded test, let's try to open it.
|
||||
if(density)
|
||||
|
||||
@@ -95,14 +95,18 @@
|
||||
return 1
|
||||
|
||||
/obj/machinery/door/Bumped(atom/AM)
|
||||
if(p_open || operating) return
|
||||
if(p_open || operating)
|
||||
return
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(world.time - M.last_bumped <= 10) return //Can bump-open one airlock per second. This is to prevent shock spam.
|
||||
if(world.time - M.last_bumped <= 10)
|
||||
return //Can bump-open one airlock per second. This is to prevent shock spam.
|
||||
M.last_bumped = world.time
|
||||
if(!M.restrained())
|
||||
if(M.restrained() && !check_access(null))
|
||||
return
|
||||
else
|
||||
bumpopen(M)
|
||||
return
|
||||
|
||||
|
||||
if(istype(AM, /mob/living/bot))
|
||||
var/mob/living/bot/bot = AM
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
block_air_zones = 0
|
||||
|
||||
var/blocked = 0
|
||||
var/prying = 0
|
||||
var/lockdown = 0 // When the door has detected a problem, it locks.
|
||||
var/pdiff_alert = 0
|
||||
var/pdiff = 0
|
||||
@@ -189,6 +190,8 @@
|
||||
if(operating)
|
||||
return//Already doing something.
|
||||
if(istype(C, /obj/item/weapon/weldingtool) && !repairing)
|
||||
if(prying)
|
||||
to_chat(user,"<span class='notice'>Someone's busy prying that [density ? "open" : "closed"]!</span>")
|
||||
var/obj/item/weapon/weldingtool/W = C
|
||||
if(W.remove_fuel(0, user))
|
||||
blocked = !blocked
|
||||
@@ -250,9 +253,16 @@
|
||||
if(!F.wielded)
|
||||
return
|
||||
|
||||
if(prying)
|
||||
to_chat(user,"<span class='notice'>Someone's already prying that [density ? "open" : "closed"].</span>")
|
||||
return
|
||||
|
||||
user.visible_message("<span class='danger'>\The [user] starts to force \the [src] [density ? "open" : "closed"] with \a [C]!</span>",\
|
||||
"You start forcing \the [src] [density ? "open" : "closed"] with \the [C]!",\
|
||||
"You hear metal strain.")
|
||||
prying = 1
|
||||
update_icon()
|
||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
|
||||
if(do_after(user,30))
|
||||
if(istype(C, /obj/item/weapon/crowbar))
|
||||
if(stat & (BROKEN|NOPOWER) || !density)
|
||||
@@ -269,7 +279,9 @@
|
||||
else
|
||||
spawn(0)
|
||||
close()
|
||||
return
|
||||
prying = 0
|
||||
update_icon()
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -365,6 +377,8 @@
|
||||
overlays.Cut()
|
||||
if(density)
|
||||
icon_state = "door_closed"
|
||||
if(prying)
|
||||
icon_state = "prying_closed"
|
||||
if(hatch_open)
|
||||
overlays += "hatch"
|
||||
if(blocked)
|
||||
@@ -379,6 +393,8 @@
|
||||
overlays += new/icon(icon,"alert_[ALERT_STATES[i]]", dir=cdir)
|
||||
else
|
||||
icon_state = "door_open"
|
||||
if(prying)
|
||||
icon_state = "prying_open"
|
||||
if(blocked)
|
||||
overlays += "welded_open"
|
||||
return
|
||||
|
||||
@@ -189,43 +189,40 @@
|
||||
visible_message("<span class='warning'>The glass door was sliced open by [user]!</span>")
|
||||
return 1
|
||||
|
||||
//If it's emagged, crowbar can pry electronics out.
|
||||
if (src.operating == -1 && istype(I, /obj/item/weapon/crowbar))
|
||||
//If it's opened/emagged, crowbar can pry it out of its frame.
|
||||
if (!density && istype(I, /obj/item/weapon/crowbar))
|
||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
|
||||
user.visible_message("[user] removes the electronics from the windoor.", "You start to remove electronics from the windoor.")
|
||||
user.visible_message("[user] begins prying the windoor out of the frame.", "You start to pry the windoor out of the frame.")
|
||||
if (do_after(user,40))
|
||||
user << "<span class='notice'>You removed the windoor electronics!</span>"
|
||||
to_chat(user,"<span class='notice'>You pried the windoor out of the frame!</span>")
|
||||
|
||||
var/obj/structure/windoor_assembly/wa = new/obj/structure/windoor_assembly(src.loc)
|
||||
if (istype(src, /obj/machinery/door/window/brigdoor))
|
||||
wa.secure = "secure_"
|
||||
wa.name = "secure wired windoor assembly"
|
||||
else
|
||||
wa.name = "wired windoor assembly"
|
||||
if (src.base_state == "right" || src.base_state == "rightsecure")
|
||||
wa.facing = "r"
|
||||
wa.set_dir(src.dir)
|
||||
wa.anchored = 1
|
||||
wa.created_name = name
|
||||
wa.state = "02"
|
||||
wa.update_icon()
|
||||
wa.step = 2
|
||||
wa.update_state()
|
||||
|
||||
var/obj/item/weapon/airlock_electronics/ae
|
||||
if(!electronics)
|
||||
ae = new/obj/item/weapon/airlock_electronics( src.loc )
|
||||
if(!src.req_access)
|
||||
src.check_access()
|
||||
if(src.req_access.len)
|
||||
ae.conf_access = src.req_access
|
||||
else if (src.req_one_access.len)
|
||||
ae.conf_access = src.req_one_access
|
||||
ae.one_access = 1
|
||||
if(operating == -1)
|
||||
wa.electronics = new/obj/item/weapon/circuitboard/broken()
|
||||
else
|
||||
ae = electronics
|
||||
electronics = null
|
||||
ae.loc = src.loc
|
||||
ae.icon_state = "door_electronics_smoked"
|
||||
|
||||
if(!electronics)
|
||||
wa.electronics = new/obj/item/weapon/airlock_electronics()
|
||||
if(!src.req_access)
|
||||
src.check_access()
|
||||
if(src.req_access.len)
|
||||
wa.electronics.conf_access = src.req_access
|
||||
else if (src.req_one_access.len)
|
||||
wa.electronics.conf_access = src.req_one_access
|
||||
wa.electronics.one_access = 1
|
||||
else
|
||||
wa.electronics = electronics
|
||||
electronics = null
|
||||
operating = 0
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "flood00"
|
||||
density = 1
|
||||
var/on = 0
|
||||
var/obj/item/weapon/cell/high/cell = null
|
||||
var/obj/item/weapon/cell/cell = null
|
||||
var/use = 200 // 200W light
|
||||
var/unlocked = 0
|
||||
var/open = 0
|
||||
@@ -12,8 +12,6 @@
|
||||
|
||||
/obj/machinery/floodlight/New()
|
||||
cell = new(src)
|
||||
cell.maxcharge = 1000
|
||||
cell.charge = 1000 // 41minutes @ 200W
|
||||
..()
|
||||
|
||||
/obj/machinery/floodlight/update_icon()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "\improper IV drip"
|
||||
icon = 'icons/obj/iv_drip.dmi'
|
||||
anchored = 0
|
||||
density = 1
|
||||
density = 0
|
||||
|
||||
|
||||
/obj/machinery/iv_drip/var/mob/living/carbon/human/attached = null
|
||||
|
||||
@@ -136,7 +136,13 @@ Class Procs:
|
||||
component_parts -= A
|
||||
if(contents) // The same for contents.
|
||||
for(var/atom/A in contents)
|
||||
qdel(A)
|
||||
if(ishuman(A))
|
||||
var/mob/living/carbon/human/H = A
|
||||
H.client.eye = H.client.mob
|
||||
H.client.perspective = MOB_PERSPECTIVE
|
||||
H.loc = src.loc
|
||||
else
|
||||
qdel(A)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/process()//If you dont use process or power why are you here
|
||||
|
||||
@@ -50,6 +50,11 @@ Buildable meters
|
||||
#define PIPE_SCRUBBERS_CAP 42
|
||||
///// Mirrored T-valve ~ because I couldn't be bothered re-sorting all of the defines
|
||||
#define PIPE_MTVALVEM 43
|
||||
///// Digital Valves sit here because otherwise we're resorting every define.
|
||||
#define PIPE_DVALVE 44
|
||||
#define PIPE_DTVALVE 45
|
||||
#define PIPE_DTVALVEM 46
|
||||
|
||||
|
||||
/obj/item/pipe
|
||||
name = "pipe"
|
||||
@@ -70,6 +75,10 @@ Buildable meters
|
||||
if (make_from)
|
||||
src.set_dir(make_from.dir)
|
||||
src.pipename = make_from.name
|
||||
if(make_from.req_access)
|
||||
src.req_access = make_from.req_access
|
||||
if(make_from.req_one_access)
|
||||
src.req_one_access = make_from.req_one_access
|
||||
color = make_from.pipe_color
|
||||
var/is_bent
|
||||
if (make_from.initialize_directions in list(NORTH|SOUTH, WEST|EAST))
|
||||
@@ -111,6 +120,8 @@ Buildable meters
|
||||
src.pipe_type = PIPE_MANIFOLD
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/unary/vent_pump))
|
||||
src.pipe_type = PIPE_UVENT
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/valve/digital))
|
||||
src.pipe_type = PIPE_DVALVE
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/valve))
|
||||
src.pipe_type = PIPE_MVALVE
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/binary/pump/high_power))
|
||||
@@ -133,8 +144,12 @@ Buildable meters
|
||||
src.pipe_type = PIPE_PASSIVE_GATE
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/unary/heat_exchanger))
|
||||
src.pipe_type = PIPE_HEAT_EXCHANGE
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/tvalve/mirrored/digital))
|
||||
src.pipe_type = PIPE_DTVALVEM
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/tvalve/mirrored))
|
||||
src.pipe_type = PIPE_MTVALVEM
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/tvalve/digital))
|
||||
src.pipe_type = PIPE_DTVALVE
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/tvalve))
|
||||
src.pipe_type = PIPE_MTVALVE
|
||||
else if(istype(make_from, /obj/machinery/atmospherics/pipe/manifold4w/visible/supply) || istype(make_from, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply))
|
||||
@@ -254,6 +269,9 @@ Buildable meters
|
||||
"supply pipe cap", \
|
||||
"scrubbers pipe cap", \
|
||||
"t-valve m", \
|
||||
"dvalve", \
|
||||
"dt-valve", \
|
||||
"dt-valve m", \
|
||||
)
|
||||
name = nlist[pipe_type+1] + " fitting"
|
||||
var/list/islist = list( \
|
||||
@@ -304,6 +322,9 @@ Buildable meters
|
||||
"cap", \
|
||||
"cap", \
|
||||
"mtvalvem", \
|
||||
"dvalve", \
|
||||
"dtvalve", \
|
||||
"dtvalvem", \
|
||||
)
|
||||
icon_state = islist[pipe_type + 1]
|
||||
|
||||
@@ -370,6 +391,7 @@ Buildable meters
|
||||
PIPE_SUPPLY_STRAIGHT, \
|
||||
PIPE_SCRUBBERS_STRAIGHT, \
|
||||
PIPE_UNIVERSAL, \
|
||||
PIPE_DVALVE, \
|
||||
)
|
||||
return dir|flip
|
||||
if(PIPE_SIMPLE_BENT, PIPE_INSULATED_BENT, PIPE_HE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT)
|
||||
@@ -380,9 +402,9 @@ Buildable meters
|
||||
return dir|flip|cw|acw
|
||||
if(PIPE_MANIFOLD, PIPE_SUPPLY_MANIFOLD, PIPE_SCRUBBERS_MANIFOLD)
|
||||
return flip|cw|acw
|
||||
if(PIPE_GAS_FILTER, PIPE_GAS_MIXER, PIPE_MTVALVE)
|
||||
if(PIPE_GAS_FILTER, PIPE_GAS_MIXER, PIPE_MTVALVE, PIPE_DTVALVE)
|
||||
return dir|flip|cw
|
||||
if(PIPE_GAS_FILTER_M, PIPE_GAS_MIXER_M, PIPE_MTVALVEM)
|
||||
if(PIPE_GAS_FILTER_M, PIPE_GAS_MIXER_M, PIPE_MTVALVEM, PIPE_DTVALVEM)
|
||||
return dir|flip|acw
|
||||
if(PIPE_GAS_MIXER_T)
|
||||
return dir|cw|acw
|
||||
@@ -743,7 +765,6 @@ Buildable meters
|
||||
V.node.initialize()
|
||||
V.node.build_network()
|
||||
|
||||
|
||||
if(PIPE_MVALVE) //manual valve
|
||||
var/obj/machinery/atmospherics/valve/V = new( src.loc)
|
||||
V.set_dir(dir)
|
||||
@@ -1029,6 +1050,76 @@ Buildable meters
|
||||
if (C.node)
|
||||
C.node.initialize()
|
||||
C.node.build_network()
|
||||
|
||||
if(PIPE_DVALVE) //digital valve
|
||||
var/obj/machinery/atmospherics/valve/digital/V = new( src.loc)
|
||||
if(src.req_access)
|
||||
V.req_access = src.req_access
|
||||
if(src.req_one_access)
|
||||
V.req_one_access = src.req_one_access
|
||||
V.set_dir(dir)
|
||||
V.initialize_directions = pipe_dir
|
||||
if (pipename)
|
||||
V.name = pipename
|
||||
var/turf/T = V.loc
|
||||
V.level = !T.is_plating() ? 2 : 1
|
||||
V.initialize()
|
||||
V.build_network()
|
||||
if (V.node1)
|
||||
V.node1.initialize()
|
||||
V.node1.build_network()
|
||||
if (V.node2)
|
||||
V.node2.initialize()
|
||||
V.node2.build_network()
|
||||
|
||||
if(PIPE_DTVALVE) //digital t-valve
|
||||
var/obj/machinery/atmospherics/tvalve/digital/V = new(src.loc)
|
||||
if(src.req_access)
|
||||
V.req_access = src.req_access
|
||||
if(src.req_one_access)
|
||||
V.req_one_access = src.req_one_access
|
||||
V.set_dir(dir)
|
||||
V.initialize_directions = pipe_dir
|
||||
if (pipename)
|
||||
V.name = pipename
|
||||
var/turf/T = V.loc
|
||||
V.level = !T.is_plating() ? 2 : 1
|
||||
V.initialize()
|
||||
V.build_network()
|
||||
if (V.node1)
|
||||
V.node1.initialize()
|
||||
V.node1.build_network()
|
||||
if (V.node2)
|
||||
V.node2.initialize()
|
||||
V.node2.build_network()
|
||||
if (V.node3)
|
||||
V.node3.initialize()
|
||||
V.node3.build_network()
|
||||
|
||||
if(PIPE_DTVALVEM) //mirrored digital t-valve
|
||||
var/obj/machinery/atmospherics/tvalve/mirrored/digital/V = new(src.loc)
|
||||
if(src.req_access)
|
||||
V.req_access = src.req_access
|
||||
if(src.req_one_access)
|
||||
V.req_one_access = src.req_one_access
|
||||
V.set_dir(dir)
|
||||
V.initialize_directions = pipe_dir
|
||||
if (pipename)
|
||||
V.name = pipename
|
||||
var/turf/T = V.loc
|
||||
V.level = !T.is_plating() ? 2 : 1
|
||||
V.initialize()
|
||||
V.build_network()
|
||||
if (V.node1)
|
||||
V.node1.initialize()
|
||||
V.node1.build_network()
|
||||
if (V.node2)
|
||||
V.node2.initialize()
|
||||
V.node2.build_network()
|
||||
if (V.node3)
|
||||
V.node3.initialize()
|
||||
V.node3.build_network()
|
||||
|
||||
///// Z-Level stuff
|
||||
if(PIPE_UP)
|
||||
var/obj/machinery/atmospherics/pipe/zpipe/up/P = new(src.loc)
|
||||
|
||||
@@ -16,11 +16,14 @@
|
||||
<A href='?src=\ref[src];make=0;dir=1'>Pipe</A><BR>
|
||||
<A href='?src=\ref[src];make=1;dir=5'>Bent Pipe</A><BR>
|
||||
<A href='?src=\ref[src];make=5;dir=1'>Manifold</A><BR>
|
||||
<A href='?src=\ref[src];make=44;dir=1'>Digital Valve</A><BR>
|
||||
<A href='?src=\ref[src];make=8;dir=1'>Manual Valve</A><BR>
|
||||
<A href='?src=\ref[src];make=20;dir=1'>Pipe Cap</A><BR>
|
||||
<A href='?src=\ref[src];make=19;dir=1'>4-Way Manifold</A><BR>
|
||||
<A href='?src=\ref[src];make=18;dir=1'>Manual T-Valve</A><BR>
|
||||
<A href='?src=\ref[src];make=43;dir=1'>Manual T-Valve - Mirrored</A><BR>
|
||||
<A href='?src=\ref[src];make=45;dir=4'>Digital T-Valve</A><BR>
|
||||
<A href='?src=\ref[src];make=46;dir=8'>Digital T-Valve - Mirrored</A><BR>
|
||||
<A href='?src=\ref[src];make=18;dir=4'>Manual T-Valve</A><BR>
|
||||
<A href='?src=\ref[src];make=43;dir=8'>Manual T-Valve - Mirrored</A><BR>
|
||||
<A href='?src=\ref[src];make=21;dir=1'>Upward Pipe</A><BR>
|
||||
<A href='?src=\ref[src];make=22;dir=1'>Downward Pipe</A><BR>
|
||||
<b>Supply pipes:</b><BR>
|
||||
|
||||
@@ -8,7 +8,7 @@ obj/machinery/recharger
|
||||
idle_power_usage = 4
|
||||
active_power_usage = 40000 //40 kW
|
||||
var/obj/item/charging = null
|
||||
var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell)
|
||||
var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell, /obj/item/device/flashlight)
|
||||
var/icon_state_charged = "recharger2"
|
||||
var/icon_state_charging = "recharger1"
|
||||
var/icon_state_idle = "recharger0" //also when unpowered
|
||||
@@ -49,6 +49,12 @@ obj/machinery/recharger
|
||||
return
|
||||
if(istype(G, /obj/item/weapon/gun/energy/staff))
|
||||
return
|
||||
if(istype(G, /obj/item/device/flashlight))
|
||||
var/obj/item/device/flashlight/F = G
|
||||
if(!F.power_use)
|
||||
return
|
||||
if(!F.cell)
|
||||
return
|
||||
if(istype(G, /obj/item/device/laptop))
|
||||
var/obj/item/device/laptop/L = G
|
||||
if(!L.stored_computer.battery)
|
||||
@@ -129,6 +135,21 @@ obj/machinery/recharger
|
||||
update_use_power(1)
|
||||
return
|
||||
|
||||
if(istype(charging, /obj/item/device/flashlight))
|
||||
var/obj/item/device/flashlight/F = charging
|
||||
if(F.cell)
|
||||
if(!F.cell.fully_charged())
|
||||
icon_state = icon_state_charging
|
||||
F.cell.give(active_power_usage*CELLRATE)
|
||||
update_use_power(2)
|
||||
else
|
||||
icon_state = icon_state_charged
|
||||
update_use_power(1)
|
||||
else
|
||||
icon_state = icon_state_idle
|
||||
update_use_power(1)
|
||||
return
|
||||
|
||||
if(istype(charging, /obj/item/weapon/cell))
|
||||
var/obj/item/weapon/cell/C = charging
|
||||
if(!C.fully_charged())
|
||||
|
||||
@@ -657,6 +657,8 @@
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 5,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 5,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 5,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/lemonjuice = 5,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/milk = 5,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 5,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 5,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 5,
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
/obj/machinery/vending/hydroseeds
|
||||
products = list(/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/chantermycelium = 3,/obj/item/seeds/chiliseed = 3,
|
||||
/obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/replicapod = 3,/obj/item/seeds/soyaseed = 3,
|
||||
/obj/item/seeds/sunflowerseed = 3,/obj/item/seeds/tomatoseed = 3,/obj/item/seeds/towermycelium = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/appleseed = 3,
|
||||
/obj/item/seeds/poppyseed = 3,/obj/item/seeds/sugarcaneseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/peanutseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/lavenderseed = 3,/obj/item/seeds/limeseed = 3,
|
||||
/obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3,/obj/item/seeds/plumpmycelium = 2,
|
||||
/obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3,/obj/item/seeds/shrinkshroom = 3,/obj/item/seeds/megashroom = 3)
|
||||
@@ -256,10 +256,10 @@
|
||||
for(var/M in D.materials)
|
||||
materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency)
|
||||
if(D.build_path)
|
||||
var/obj/new_item = D.Fabricate(get_step(get_turf(src), src.dir), src)
|
||||
var/obj/new_item = D.Fabricate(get_step(get_turf(src), src.dir), src) // Sometimes returns a mob. Beware!
|
||||
visible_message("\The [src] pings, indicating that \the [D] is complete.", "You hear a ping.")
|
||||
if(mat_efficiency != 1)
|
||||
if(new_item.matter && new_item.matter.len > 0)
|
||||
if(istype(new_item, /obj/) && new_item.matter && new_item.matter.len > 0)
|
||||
for(var/i in new_item.matter)
|
||||
new_item.matter[i] = new_item.matter[i] * mat_efficiency
|
||||
remove_from_queue(1)
|
||||
|
||||
@@ -11,6 +11,11 @@
|
||||
if(can_buckle && buckled_mob)
|
||||
user_unbuckle_mob(user)
|
||||
|
||||
/obj/attack_robot(mob/living/user)
|
||||
if(Adjacent(user) && buckled_mob) //Checks if what we're touching is adjacent to us and has someone buckled to it. This should prevent interacting with anti-robot manual valves among other things.
|
||||
return attack_hand(user) //Process as if we're a normal person touching the object.
|
||||
return ..() //Otherwise, treat this as an AI click like usual.
|
||||
|
||||
/obj/MouseDrop_T(mob/living/M, mob/living/user)
|
||||
. = ..()
|
||||
if(can_buckle && istype(M))
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
//The case the paddles are kept in.
|
||||
/obj/item/device/defib_kit
|
||||
name = "defibrillator kit"
|
||||
desc = "This KHI-branded defib kit is a semi-automated model. Remove pads, slap on chest, wait."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "defib_kit"
|
||||
w_class = ITEMSIZE_LARGE
|
||||
|
||||
var/state //0 off, 1 open, 2 working, 3 dead
|
||||
var/uses = 2 //Calculates initial uses based on starting cell size
|
||||
var/chance = 75 //Percent chance of working
|
||||
var/charge_cost //Set in New() based on uses
|
||||
var/obj/item/weapon/cell/cell //The size is mostly irrelevant, see 'uses'
|
||||
var/mob/living/carbon/human/patient //The person the paddles are on
|
||||
|
||||
/obj/item/device/defib_kit/New()
|
||||
..()
|
||||
//Create cell and determine uses (futureproofing against cell size changes)
|
||||
cell = new(src)
|
||||
charge_cost = cell.maxcharge / uses
|
||||
statechange(0)
|
||||
|
||||
/obj/item/device/defib_kit/attack_self(mob/user as mob)
|
||||
..()
|
||||
if(patient)
|
||||
patient = null
|
||||
user.visible_message("<span class='notice'>[user] returns the pads to \the [src] and closes it.</span>",
|
||||
"<span class='notice'>You return the pads to \the [src] and close it.</span>")
|
||||
statechange(0)
|
||||
|
||||
/obj/item/device/defib_kit/MouseDrop(var/mob/living/carbon/human/onto)
|
||||
if(istype(onto) && Adjacent(usr) && !usr.restrained() && !usr.stat)
|
||||
var/mob/living/carbon/human/user = usr
|
||||
//<--Feel free to code clothing checks right here
|
||||
user.visible_message("<span class='warning'>[user] begins applying defib pads to [onto].</span>",
|
||||
"<span class='warning'>You begin applying defib pads to [onto].</span>")
|
||||
if(do_after(user, 100, onto))
|
||||
patient = onto
|
||||
statechange(1,patient)
|
||||
user.visible_message("<span class='warning'>[user] applies defib pads to [onto].</span>",
|
||||
"<span class='warning'>You finish applying defib pads to [onto].</span>")
|
||||
|
||||
/obj/item/device/defib_kit/attackby(var/obj/item/A as obj, mob/living/user as mob)
|
||||
..()
|
||||
|
||||
if(!cell && istype(A,/obj/item/weapon/cell))
|
||||
if(!user.unEquip(A)) return
|
||||
to_chat(user,"You jack \the [A] into \the [src]'s battery mount.")
|
||||
A.forceMove(src)
|
||||
src.cell = A
|
||||
|
||||
else if(istype(A,/obj/item/weapon/screwdriver))
|
||||
if(cell)
|
||||
to_chat(user,"<span class='notice'>You remove \the [cell] from \the [src].</span>")
|
||||
if(user.r_hand && user.l_hand)
|
||||
cell.forceMove(get_turf(user))
|
||||
else
|
||||
cell.forceMove(user.put_in_hands(cell))
|
||||
cell = null
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
else
|
||||
to_chat(user,"<span class='warning'>The power source has already been removed!</span>")
|
||||
|
||||
/obj/item/device/defib_kit/proc/statechange(var/new_state, var/pat)
|
||||
if(state == new_state) return //Let's just save ourselves some time
|
||||
state = new_state
|
||||
icon_state = "[initial(icon_state)][state]"
|
||||
var/turf/T = get_turf(src)
|
||||
var/state_words = ""
|
||||
switch(state)
|
||||
if(0)
|
||||
state_words = "It is currently closed."
|
||||
processing_objects -= src
|
||||
if(1)
|
||||
state_words = "A green light is lit; it has charge."
|
||||
processing_objects |= src
|
||||
if(2)
|
||||
state_words = "A yellow light is flashing: it's in the process of reviving a patient."
|
||||
T.visible_message("<span class='notice'>A yellow light starts flashing on \the [src].</span>")
|
||||
playsound(T, 'sound/machines/chime.ogg', 50, 0)
|
||||
if(3)
|
||||
state_words = "A red light is flashing: the battery needs to be recharged."
|
||||
T.visible_message("<span class='warning'>A red light starts flashing on \the [src].</span>")
|
||||
playsound(T, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
|
||||
desc = "[initial(desc)] [state_words][pat ? " The pads are attached to [pat]." : ""]"
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/defib_kit/process()
|
||||
if(!state) //0 or null
|
||||
statechange(0)
|
||||
processing_objects -= src
|
||||
return
|
||||
|
||||
//Patient moved too far
|
||||
if(patient && !(get_dist(src,patient) <= 1)) //You separated the kit and pads too far
|
||||
audible_message("<span class='warning'>There's a clatter as the defib pads are yanked off of [patient].</span>")
|
||||
statechange(0)
|
||||
patient = null
|
||||
return
|
||||
|
||||
//Battery died
|
||||
if(!cell || cell.charge < charge_cost)
|
||||
statechange(3,patient)
|
||||
return
|
||||
|
||||
//A patient isn't being worked on, but we have one, so start
|
||||
if(patient && patient.stat == DEAD && state != 2)
|
||||
statechange(2)
|
||||
if(attempt_shock()) //Try to shock them, has timer and such
|
||||
patient.visible_message("<span class='warning'>[patient] convulses!</span>")
|
||||
playsound(src.loc, 'sound/effects/sparks2.ogg', 75, 1)
|
||||
//Actual rezzing code
|
||||
if(prob(chance) && ((world.time - patient.timeofdeath) < (10 MINUTES))) //Can only revive within a few minutes
|
||||
if(!patient.client && patient.mind) //Don't force the dead person to come back if they don't want to.
|
||||
for(var/mob/observer/dead/ghost in player_list)
|
||||
if(ghost.mind == patient.mind)
|
||||
to_chat(ghost, "<b><font color = #330033><font size = 3>Someone is trying to \
|
||||
revive you. Return to your body if you want to be revived!</b> \
|
||||
(Verbs -> Ghost -> Re-enter corpse). You have 15 seconds to do this!</font></font>")
|
||||
sleep(15 SECONDS)
|
||||
break
|
||||
|
||||
if(patient.client)
|
||||
patient.adjustOxyLoss(-20) //Look, blood stays oxygenated for quite some time, but I'm not recoding the entire oxy system
|
||||
patient.stat = CONSCIOUS //Note that if whatever killed them in the first place wasn't fixed, they're likely to die again.
|
||||
dead_mob_list -= patient
|
||||
living_mob_list += patient
|
||||
patient.timeofdeath = null
|
||||
patient.visible_message("<span class='notice'>[patient]'s eyes open!</span>")
|
||||
log_and_message_admins("[patient] was revived.")
|
||||
cell.charge -= charge_cost //Always charge the cost after any attempt, failed or not
|
||||
sleep(20) //Wait 2 seconds before next attempt
|
||||
statechange(1,patient) //Back to ready
|
||||
|
||||
/obj/item/device/defib_kit/proc/attempt_shock()
|
||||
if(!patient || cell.charge < charge_cost)
|
||||
return
|
||||
|
||||
var/zap_time = world.time + (7 SECONDS)
|
||||
var/o_patient_loc = patient.loc
|
||||
. = 1
|
||||
|
||||
while(world.time < zap_time) //This is basically a custom do_after() call
|
||||
sleep(1)
|
||||
|
||||
//Failed: We lost something important
|
||||
if(!patient || !cell || cell.charge < charge_cost)
|
||||
. = 0
|
||||
break
|
||||
|
||||
//Failed: The locations aren't right
|
||||
if((o_patient_loc != patient.loc) || !(get_dist(src,patient) <= 1))
|
||||
. = 0
|
||||
break
|
||||
|
||||
return
|
||||
@@ -274,6 +274,8 @@ var/global/list/default_medbay_channels = list(
|
||||
// Fix for permacell radios, but kinda eh about actually fixing them.
|
||||
if(!M || !message) return 0
|
||||
|
||||
if(speaking && (speaking.flags & (SIGNLANG|NONVERBAL))) return 0
|
||||
|
||||
if(istype(M)) M.trigger_aiming(TARGET_CAN_RADIO)
|
||||
|
||||
// Uncommenting this. To the above comment:
|
||||
|
||||
@@ -69,7 +69,7 @@ REAGENT SCANNER
|
||||
user.show_message("<span class='notice'>Analyzing Results for [M]:</span>")
|
||||
user.show_message("<span class='notice'>Overall Status: dead</span>")
|
||||
else
|
||||
user.show_message("<span class='notice'>Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round(M.health/M.maxHealth)*100]% healthy"]</span>")
|
||||
user.show_message("<span class='notice'>Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round((M.health/M.maxHealth)*100) ]% healthy"]</span>")
|
||||
user.show_message("<span class='notice'> Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font></span>", 1)
|
||||
user.show_message("<span class='notice'> Damage Specifics: <font color='blue'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font></span>")
|
||||
user.show_message("<span class='notice'>Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)</span>", 1)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/device/taperecorder
|
||||
name = "universal recorder"
|
||||
desc = "A device that can record up to an hour of dialogue and play it back. It automatically translates the content in playback."
|
||||
icon_state = "taperecorderidle"
|
||||
desc = "A device that can record to cassette tapes, and play them. It automatically translates the content in playback."
|
||||
icon_state = "taperecorder_empty"
|
||||
item_state = "analyzer"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
@@ -10,33 +10,100 @@
|
||||
var/emagged = 0.0
|
||||
var/recording = 0.0
|
||||
var/playing = 0.0
|
||||
var/timerecorded = 0.0
|
||||
var/playsleepseconds = 0.0
|
||||
var/list/storedinfo = new/list()
|
||||
var/list/timestamp = new/list()
|
||||
var/obj/item/device/tape/mytape = /obj/item/device/tape/random
|
||||
var/canprint = 1
|
||||
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
throwforce = 2
|
||||
throw_speed = 4
|
||||
throw_range = 20
|
||||
show_messages = 1
|
||||
|
||||
/obj/item/device/taperecorder/New()
|
||||
..()
|
||||
if(ispath(mytape))
|
||||
mytape = new mytape(src)
|
||||
update_icon()
|
||||
listening_objects += src
|
||||
|
||||
/obj/item/device/taperecorder/empty
|
||||
mytape = null
|
||||
|
||||
/obj/item/device/taperecorder/Destroy()
|
||||
listening_objects -= src
|
||||
if(mytape)
|
||||
qdel(mytape)
|
||||
mytape = null
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/device/tape))
|
||||
if(mytape)
|
||||
to_chat(user, "<span class='notice'>There's already a tape inside.</span>")
|
||||
return
|
||||
if(!user.unEquip(I))
|
||||
return
|
||||
I.forceMove(src)
|
||||
mytape = I
|
||||
to_chat(user, "<span class='notice'>You insert [I] into [src].</span>")
|
||||
update_icon()
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/fire_act()
|
||||
if(mytape)
|
||||
mytape.ruin() //Fires destroy the tape
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/attack_hand(mob/user)
|
||||
if(user.get_inactive_hand() == src)
|
||||
if(mytape)
|
||||
eject()
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/verb/eject()
|
||||
set name = "Eject Tape"
|
||||
set category = "Object"
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
if(!mytape)
|
||||
to_chat(usr, "<span class='notice'>There's no tape in \the [src].</span>")
|
||||
return
|
||||
if(emagged)
|
||||
to_chat(usr, "<span class='notice'>The tape seems to be stuck inside.</span>")
|
||||
return
|
||||
|
||||
if(playing || recording)
|
||||
stop()
|
||||
to_chat(usr, "<span class='notice'>You remove [mytape] from [src].</span>")
|
||||
usr.put_in_hands(mytape)
|
||||
mytape = null
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/hear_talk(mob/living/M as mob, msg, var/verb="says", datum/language/speaking=null)
|
||||
if(recording)
|
||||
timestamp += timerecorded
|
||||
if(mytape && recording)
|
||||
|
||||
if(speaking)
|
||||
storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] [speaking.format_message_plain(msg, verb)]"
|
||||
if(!speaking.machine_understands)
|
||||
msg = speaking.scramble(msg)
|
||||
mytape.record_speech("[M.name] [speaking.format_message_plain(msg, verb)]")
|
||||
else
|
||||
storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] [verb], \"[msg]\""
|
||||
mytape.record_speech("[M.name] [verb], \"[msg]\"")
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/see_emote(mob/M as mob, text, var/emote_type)
|
||||
if(emote_type != 2) //only hearable emotes
|
||||
return
|
||||
if(recording)
|
||||
timestamp += timerecorded
|
||||
storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [strip_html_properly(text)]"
|
||||
if(mytape && recording)
|
||||
mytape.record_speech("[strip_html_properly(text)]")
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/show_message(msg, type, alt, alt_type)
|
||||
var/recordedtext
|
||||
@@ -46,25 +113,24 @@
|
||||
recordedtext = alt
|
||||
else
|
||||
return
|
||||
if(recording)
|
||||
timestamp += timerecorded
|
||||
storedinfo += "*\[[time2text(timerecorded*10,"mm:ss")]\] *[strip_html_properly(recordedtext)]*" //"*" at front as a marker
|
||||
if(mytape && recording)
|
||||
mytape.record_noise("[strip_html_properly(recordedtext)]")
|
||||
|
||||
/obj/item/device/taperecorder/emag_act(var/remaining_charges, var/mob/user)
|
||||
if(emagged == 0)
|
||||
emagged = 1
|
||||
recording = 0
|
||||
user << "<span class='warning'>PZZTTPFFFT</span>"
|
||||
icon_state = "taperecorderidle"
|
||||
to_chat(user, "<span class='warning'>PZZTTPFFFT</span>")
|
||||
update_icon()
|
||||
return 1
|
||||
else
|
||||
user << "<span class='warning'>It is already emagged!</span>"
|
||||
to_chat(user, "<span class='warning'>It is already emagged!</span>")
|
||||
|
||||
/obj/item/device/taperecorder/proc/explode()
|
||||
var/turf/T = get_turf(loc)
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M << "<span class='danger'>\The [src] explodes!</span>"
|
||||
to_chat(M, "<span class='danger'>\The [src] explodes!</span>")
|
||||
if(T)
|
||||
T.hotspot_expose(700,125)
|
||||
explosion(T, -1, -1, 0, 4)
|
||||
@@ -75,117 +141,152 @@
|
||||
set name = "Start Recording"
|
||||
set category = "Object"
|
||||
|
||||
if(usr.stat)
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
if(emagged == 1)
|
||||
usr << "<span class='warning'>The tape recorder makes a scratchy noise.</span>"
|
||||
if(!mytape)
|
||||
to_chat(usr, "<span class='notice'>There's no tape!</span>")
|
||||
return
|
||||
icon_state = "taperecorderrecording"
|
||||
if(timerecorded < 3600 && playing == 0)
|
||||
usr << "<span class='notice'>Recording started.</span>"
|
||||
if(mytape.ruined)
|
||||
to_chat(usr, "<span class='warning'>The tape recorder makes a scratchy noise.</span>")
|
||||
return
|
||||
if(recording)
|
||||
to_chat(usr, "<span class='notice'>You're already recording!</span>")
|
||||
return
|
||||
if(playing)
|
||||
to_chat(usr, "<span class='notice'>You can't record when playing!</span>")
|
||||
return
|
||||
if(emagged)
|
||||
to_chat(usr, "<span class='warning'>The tape recorder makes a scratchy noise.</span>")
|
||||
return
|
||||
if(mytape.used_capacity < mytape.max_capacity)
|
||||
to_chat(usr, "<span class='notice'>Recording started.</span>")
|
||||
recording = 1
|
||||
timestamp+= timerecorded
|
||||
storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] Recording started."
|
||||
for(timerecorded, timerecorded<3600)
|
||||
if(recording == 0)
|
||||
break
|
||||
timerecorded++
|
||||
update_icon()
|
||||
|
||||
mytape.record_speech("Recording started.")
|
||||
|
||||
//count seconds until full, or recording is stopped
|
||||
while(mytape && recording && mytape.used_capacity < mytape.max_capacity)
|
||||
sleep(10)
|
||||
recording = 0
|
||||
icon_state = "taperecorderidle"
|
||||
mytape.used_capacity++
|
||||
if(mytape.used_capacity >= mytape.max_capacity)
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
to_chat(M, "<span class='notice'>The tape is full.</span>")
|
||||
stop_recording()
|
||||
|
||||
|
||||
update_icon()
|
||||
return
|
||||
else
|
||||
usr << "<span class='notice'>Either your tape recorder's memory is full, or it is currently playing back its memory.</span>"
|
||||
to_chat(usr, "<span class='notice'>The tape is full.</span>")
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/proc/stop_recording()
|
||||
//Sanity checks skipped, should not be called unless actually recording
|
||||
recording = 0
|
||||
update_icon()
|
||||
mytape.record_speech("Recording stopped.")
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
to_chat(M, "<span class='notice'>Recording stopped.</span>")
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/verb/stop()
|
||||
set name = "Stop"
|
||||
set category = "Object"
|
||||
|
||||
if(usr.stat)
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
if(emagged == 1)
|
||||
usr << "<span class='warning'>The tape recorder makes a scratchy noise.</span>"
|
||||
if(recording)
|
||||
stop_recording()
|
||||
return
|
||||
if(recording == 1)
|
||||
recording = 0
|
||||
timestamp+= timerecorded
|
||||
storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] Recording stopped."
|
||||
usr << "<span class='notice'>Recording stopped.</span>"
|
||||
icon_state = "taperecorderidle"
|
||||
return
|
||||
else if(playing == 1)
|
||||
else if(playing)
|
||||
playing = 0
|
||||
var/turf/T = get_turf(src)
|
||||
T.audible_message("<font color=Maroon><B>Tape Recorder</B>: Playback stopped.</font>")
|
||||
icon_state = "taperecorderidle"
|
||||
return
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/verb/clear_memory()
|
||||
set name = "Clear Memory"
|
||||
set category = "Object"
|
||||
|
||||
if(usr.stat)
|
||||
return
|
||||
if(emagged == 1)
|
||||
usr << "<span class='warning'>The tape recorder makes a scratchy noise.</span>"
|
||||
return
|
||||
if(recording == 1 || playing == 1)
|
||||
usr << "<span class='notice'>You can't clear the memory while playing or recording!</span>"
|
||||
update_icon()
|
||||
to_chat(usr, "<span class='notice'>Playback stopped.</span>")
|
||||
return
|
||||
else
|
||||
if(storedinfo) storedinfo.Cut()
|
||||
if(timestamp) timestamp.Cut()
|
||||
timerecorded = 0
|
||||
usr << "<span class='notice'>Memory cleared.</span>"
|
||||
to_chat(usr, "<span class='notice'>Stop what?</span>")
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/verb/wipe_tape()
|
||||
set name = "Wipe Tape"
|
||||
set category = "Object"
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
if(emagged)
|
||||
to_chat(usr, "<span class='warning'>The tape recorder makes a scratchy noise.</span>")
|
||||
return
|
||||
if(mytape.ruined)
|
||||
to_chat(usr, "<span class='warning'>The tape recorder makes a scratchy noise.</span>")
|
||||
return
|
||||
if(recording || playing)
|
||||
to_chat(usr, "<span class='notice'>You can't wipe the tape while playing or recording!</span>")
|
||||
return
|
||||
else
|
||||
if(mytape.storedinfo) mytape.storedinfo.Cut()
|
||||
if(mytape.timestamp) mytape.timestamp.Cut()
|
||||
mytape.used_capacity = 0
|
||||
to_chat(usr, "<span class='notice'>You wipe the tape.</span>")
|
||||
return
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/verb/playback_memory()
|
||||
set name = "Playback Memory"
|
||||
set name = "Playback Tape"
|
||||
set category = "Object"
|
||||
|
||||
if(usr.stat)
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
if(emagged == 1)
|
||||
usr << "<span class='warning'>The tape recorder makes a scratchy noise.</span>"
|
||||
if(!mytape)
|
||||
to_chat(usr, "<span class='notice'>There's no tape!</span>")
|
||||
return
|
||||
if(recording == 1)
|
||||
usr << "<span class='notice'>You can't playback when recording!</span>"
|
||||
if(mytape.ruined)
|
||||
to_chat(usr, "<span class='warning'>The tape recorder makes a scratchy noise.</span>")
|
||||
return
|
||||
if(playing == 1)
|
||||
usr << "<span class='notice'>You're already playing!</span>"
|
||||
if(recording)
|
||||
to_chat(usr, "<span class='notice'>You can't playback when recording!</span>")
|
||||
return
|
||||
if(playing)
|
||||
to_chat(usr, "<span class='notice'>You're already playing!</span>")
|
||||
return
|
||||
playing = 1
|
||||
icon_state = "taperecorderplaying"
|
||||
usr << "<span class='notice'>Playing started.</span>"
|
||||
for(var/i=1,timerecorded<3600,sleep(10 * (playsleepseconds) ))
|
||||
if(playing == 0)
|
||||
update_icon()
|
||||
to_chat(usr, "<span class='notice'>Playing started.</span>")
|
||||
for(var/i=1 , i < mytape.max_capacity , i++)
|
||||
if(!mytape || !playing)
|
||||
break
|
||||
if(storedinfo.len < i)
|
||||
if(mytape.storedinfo.len < i)
|
||||
break
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
var/playedmessage = storedinfo[i]
|
||||
var/playedmessage = mytape.storedinfo[i]
|
||||
if (findtextEx(playedmessage,"*",1,2)) //remove marker for action sounds
|
||||
playedmessage = copytext(playedmessage,2)
|
||||
T.audible_message("<font color=Maroon><B>Tape Recorder</B>: [playedmessage]</font>")
|
||||
if(storedinfo.len < i+1)
|
||||
|
||||
if(mytape.storedinfo.len < i+1)
|
||||
playsleepseconds = 1
|
||||
sleep(10)
|
||||
T = get_turf(src)
|
||||
T.audible_message("<font color=Maroon><B>Tape Recorder</B>: End of recording.</font>")
|
||||
break
|
||||
else
|
||||
playsleepseconds = timestamp[i+1] - timestamp[i]
|
||||
playsleepseconds = mytape.timestamp[i+1] - mytape.timestamp[i]
|
||||
|
||||
if(playsleepseconds > 14)
|
||||
sleep(10)
|
||||
T = get_turf(src)
|
||||
T.audible_message("<font color=Maroon><B>Tape Recorder</B>: Skipping [playsleepseconds] seconds of silence</font>")
|
||||
playsleepseconds = 1
|
||||
i++
|
||||
icon_state = "taperecorderidle"
|
||||
sleep(10 * playsleepseconds)
|
||||
|
||||
|
||||
playing = 0
|
||||
if(emagged == 1.0)
|
||||
update_icon()
|
||||
|
||||
if(emagged)
|
||||
var/turf/T = get_turf(src)
|
||||
T.audible_message("<font color=Maroon><B>Tape Recorder</B>: This tape recorder will self-destruct in... Five.</font>")
|
||||
sleep(10)
|
||||
@@ -208,24 +309,31 @@
|
||||
set name = "Print Transcript"
|
||||
set category = "Object"
|
||||
|
||||
if(usr.stat)
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
if(emagged == 1)
|
||||
usr << "<span class='warning'>The tape recorder makes a scratchy noise.</span>"
|
||||
if(!mytape)
|
||||
to_chat(usr, "<span class='notice'>There's no tape!</span>")
|
||||
return
|
||||
if(mytape.ruined)
|
||||
to_chat(usr, "<span class='warning'>The tape recorder makes a scratchy noise.</span>")
|
||||
return
|
||||
if(emagged)
|
||||
to_chat(usr, "<span class='warning'>The tape recorder makes a scratchy noise.</span>")
|
||||
return
|
||||
if(!canprint)
|
||||
usr << "<span class='notice'>The recorder can't print that fast!</span>"
|
||||
to_chat(usr, "<span class='notice'>The recorder can't print that fast!</span>")
|
||||
return
|
||||
if(recording == 1 || playing == 1)
|
||||
usr << "<span class='notice'>You can't print the transcript while playing or recording!</span>"
|
||||
if(recording || playing)
|
||||
to_chat(usr, "<span class='notice'>You can't print the transcript while playing or recording!</span>")
|
||||
return
|
||||
usr << "<span class='notice'>Transcript printed.</span>"
|
||||
|
||||
to_chat(usr, "<span class='notice'>Transcript printed.</span>")
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src))
|
||||
var/t1 = "<B>Transcript:</B><BR><BR>"
|
||||
for(var/i=1,storedinfo.len >= i,i++)
|
||||
var/printedmessage = storedinfo[i]
|
||||
for(var/i=1,mytape.storedinfo.len >= i,i++)
|
||||
var/printedmessage = mytape.storedinfo[i]
|
||||
if (findtextEx(printedmessage,"*",1,2)) //replace action sounds
|
||||
printedmessage = "\[[time2text(timestamp[i]*10,"mm:ss")]\] (Unrecognized sound)"
|
||||
printedmessage = "\[[time2text(mytape.timestamp[i]*10,"mm:ss")]\] (Unrecognized sound)"
|
||||
t1 += "[printedmessage]<BR>"
|
||||
P.info = t1
|
||||
P.name = "Transcript"
|
||||
@@ -235,46 +343,98 @@
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/attack_self(mob/user)
|
||||
if(recording == 0 && playing == 0)
|
||||
if(usr.stat)
|
||||
return
|
||||
if(emagged == 1)
|
||||
usr << "<span class='warning'>The tape recorder makes a scratchy noise.</span>"
|
||||
return
|
||||
icon_state = "taperecorderrecording"
|
||||
if(timerecorded < 3600 && playing == 0)
|
||||
usr << "<span class='notice'>Recording started.</span>"
|
||||
recording = 1
|
||||
timestamp+= timerecorded
|
||||
storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] Recording started."
|
||||
for(timerecorded, timerecorded<3600)
|
||||
if(recording == 0)
|
||||
break
|
||||
timerecorded++
|
||||
sleep(10)
|
||||
recording = 0
|
||||
icon_state = "taperecorderidle"
|
||||
return
|
||||
else
|
||||
usr << "<span class='warning'>Either your tape recorder's memory is full, or it is currently playing back its memory.</span>"
|
||||
if(recording || playing)
|
||||
stop()
|
||||
else
|
||||
if(usr.stat)
|
||||
usr << "Not when you're incapacitated."
|
||||
return
|
||||
if(recording == 1)
|
||||
recording = 0
|
||||
timestamp+= timerecorded
|
||||
storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] Recording stopped."
|
||||
usr << "<span class='notice'>Recording stopped.</span>"
|
||||
icon_state = "taperecorderidle"
|
||||
return
|
||||
else if(playing == 1)
|
||||
playing = 0
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/mob/O in hearers(world.view-1, T))
|
||||
O.show_message("<font color=Maroon><B>Tape Recorder</B>: Playback stopped.</font>",2)
|
||||
icon_state = "taperecorderidle"
|
||||
return
|
||||
else
|
||||
usr << "<span class='warning'>Stop what?</span>"
|
||||
return
|
||||
record()
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/update_icon()
|
||||
if(!mytape)
|
||||
icon_state = "taperecorder_empty"
|
||||
else if(recording)
|
||||
icon_state = "taperecorder_recording"
|
||||
else if(playing)
|
||||
icon_state = "taperecorder_playing"
|
||||
else
|
||||
icon_state = "taperecorder_idle"
|
||||
|
||||
|
||||
|
||||
/obj/item/device/tape
|
||||
name = "tape"
|
||||
desc = "A magnetic tape that can hold up to ten minutes of content."
|
||||
icon_state = "tape_white"
|
||||
item_state = "analyzer"
|
||||
w_class = ITEMSIZE_TINY
|
||||
matter = list(DEFAULT_WALL_MATERIAL=20, "glass"=5)
|
||||
force = 1
|
||||
throwforce = 0
|
||||
var/max_capacity = 600
|
||||
var/used_capacity = 0
|
||||
var/list/storedinfo = new/list()
|
||||
var/list/timestamp = new/list()
|
||||
var/ruined = 0
|
||||
|
||||
|
||||
/obj/item/device/tape/update_icon()
|
||||
overlays.Cut()
|
||||
if(ruined)
|
||||
overlays += "ribbonoverlay"
|
||||
|
||||
|
||||
/obj/item/device/tape/fire_act()
|
||||
ruin()
|
||||
|
||||
/obj/item/device/tape/attack_self(mob/user)
|
||||
if(!ruined)
|
||||
to_chat(user, "<span class='notice'>You pull out all the tape!</span>")
|
||||
ruin()
|
||||
|
||||
|
||||
/obj/item/device/tape/proc/ruin()
|
||||
ruined = 1
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/device/tape/proc/fix()
|
||||
ruined = 0
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/device/tape/proc/record_speech(text)
|
||||
timestamp += used_capacity
|
||||
storedinfo += "\[[time2text(used_capacity*10,"mm:ss")]\] [text]"
|
||||
|
||||
|
||||
//shows up on the printed transcript as (Unrecognized sound)
|
||||
/obj/item/device/tape/proc/record_noise(text)
|
||||
timestamp += used_capacity
|
||||
storedinfo += "*\[[time2text(used_capacity*10,"mm:ss")]\] [text]"
|
||||
|
||||
|
||||
/obj/item/device/tape/attackby(obj/item/I, mob/user, params)
|
||||
if(ruined && istype(I, /obj/item/weapon/screwdriver))
|
||||
to_chat(user, "<span class='notice'>You start winding the tape back in...</span>")
|
||||
if(do_after(user, 120, target = src))
|
||||
to_chat(user, "<span class='notice'>You wound the tape back in.</span>")
|
||||
fix()
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/pen))
|
||||
if(loc == user && !user.incapacitated())
|
||||
var/new_name = input(user, "What would you like to label the tape?", "Tape labeling") as null|text
|
||||
if(isnull(new_name)) return
|
||||
new_name = sanitizeSafe(new_name)
|
||||
if(new_name)
|
||||
name = "tape - '[new_name]'"
|
||||
to_chat(user, "<span class='notice'>You label the tape '[new_name]'.</span>")
|
||||
else
|
||||
name = "tape"
|
||||
to_chat(user, "<span class='notice'>You scratch off the label.</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
//Random colour tapes
|
||||
/obj/item/device/tape/random/New()
|
||||
icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
|
||||
@@ -217,8 +217,9 @@
|
||||
// Includes normal radio uplink, multitool uplink,
|
||||
// implant uplink (not the implant tool) and a preset headset uplink.
|
||||
|
||||
/obj/item/device/radio/uplink/New()
|
||||
hidden_uplink = new(src, usr.mind, DEFAULT_TELECRYSTAL_AMOUNT)
|
||||
/obj/item/device/radio/uplink/New(atom/loc, datum/mind/target_mind, telecrystals)
|
||||
..(loc)
|
||||
hidden_uplink = new(src, target_mind, telecrystals)
|
||||
icon_state = "radio"
|
||||
|
||||
/obj/item/device/radio/uplink/attack_self(mob/user as mob)
|
||||
|
||||
@@ -160,7 +160,7 @@
|
||||
P.icon_state = "paper_words"
|
||||
|
||||
if(istype(usr,/mob/living/carbon))
|
||||
usr.put_in_hands(src)
|
||||
usr.put_in_hands(P)
|
||||
|
||||
/obj/item/weapon/autopsy_scanner/do_surgery(mob/living/carbon/human/M, mob/living/user)
|
||||
if(!istype(M))
|
||||
|
||||
@@ -278,3 +278,26 @@
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
icon_state = initial(icon_state) +"_locked"
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/teargas
|
||||
name = "tear gas grenade"
|
||||
desc = "Concentrated Capsaicin. Contents under pressure. Use with caution."
|
||||
stage = 2
|
||||
path = 1
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("phosphorus", 40)
|
||||
B1.reagents.add_reagent("potassium", 40)
|
||||
B1.reagents.add_reagent("condensedcapsaicin", 40)
|
||||
B2.reagents.add_reagent("sugar", 40)
|
||||
B2.reagents.add_reagent("condensedcapsaicin", 80)
|
||||
|
||||
detonator = new/obj/item/device/assembly_holder/timer_igniter(src)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
icon_state = initial(icon_state) +"_locked"
|
||||
@@ -159,3 +159,23 @@
|
||||
src.imp = new /obj/item/weapon/implant/health( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/language
|
||||
name = "glass case - 'GalCom'"
|
||||
desc = "A case containing a GalCom language implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/language/New()
|
||||
src.imp = new /obj/item/weapon/implant/language( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/language/eal
|
||||
name = "glass case - 'EAL'"
|
||||
desc = "A case containing an Encoded Audio Language implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/language/eal/New()
|
||||
src.imp = new /obj/item/weapon/implant/language/eal( src )
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
//These allow someone to speak a language they are otherwise physically incapable of speaking or hearing
|
||||
//They don't, at the moment, grant knowledge of the language
|
||||
//The can_speak_special checks should check for the presence of the implants.
|
||||
|
||||
/obj/item/weapon/implant/language
|
||||
name = "GalCom language implant"
|
||||
desc = "An implant allowing someone to speak and hear the range of frequencies used in Galactic Common, as well as produce any phonemes that they usually cannot. Only helps with hearing and producing sounds, not understanding them."
|
||||
|
||||
/obj/item/weapon/implant/language/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Vey-Med L-1 Galactic Common Implant<BR>
|
||||
<b>Life:</b> 5 years<BR>
|
||||
<b>Important Notes:</b> Affects hearing and speech.<BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b><BR>
|
||||
<b>Function:</b> Allows a being otherwise incapable to both hear the frequencies Galactic Common is generally spoken at, as well as to produce the phonemes of the language.<BR>
|
||||
<b>Special Features:</b> None.<BR>
|
||||
<b>Integrity:</b> Implant will function for expected life, barring physical damage."}
|
||||
return dat
|
||||
|
||||
/obj/item/weapon/implant/language/eal
|
||||
name = "EAL language implant"
|
||||
desc = "An implant allowing an organic to both hear and speak Encoded Audio Language accurately. Only helps with hearing and producing sounds, not understanding them."
|
||||
|
||||
/obj/item/weapon/implant/language/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Vey-Med L-2 Encoded Audio Language Implant<BR>
|
||||
<b>Life:</b> 5 years<BR>
|
||||
<b>Important Notes:</b> Affects hearing and speech.<BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b><BR>
|
||||
<b>Function:</b> Allows an organic to accurately process and speak Encoded Audio Language.<BR>
|
||||
<b>Special Features:</b> None.<BR>
|
||||
<b>Integrity:</b> Implant will function for expected life, barring physical damage."}
|
||||
return dat
|
||||
@@ -237,10 +237,13 @@ var/list/tape_roll_applications = list()
|
||||
|
||||
if (istype(A, /obj/machinery/door/airlock))
|
||||
var/turf/T = get_turf(A)
|
||||
var/obj/item/tape/P = new tape_type(T)
|
||||
P.update_icon()
|
||||
P.layer = 3.2
|
||||
user << "<span class='notice'>You finish placing \the [src].</span>"
|
||||
if(locate(/obj/item/tape, A.loc))
|
||||
user << "There's already tape over that door!"
|
||||
else
|
||||
var/obj/item/tape/P = new tape_type(T)
|
||||
P.update_icon()
|
||||
P.layer = 3.2
|
||||
user << "<span class='notice'>You finish placing \the [src].</span>"
|
||||
|
||||
if (istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor))
|
||||
var/turf/F = A
|
||||
@@ -277,7 +280,7 @@ var/list/tape_roll_applications = list()
|
||||
return ..(mover)
|
||||
|
||||
/obj/item/tape/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
breaktape(W, user)
|
||||
breaktape(user)
|
||||
|
||||
/obj/item/tape/attack_hand(mob/user as mob)
|
||||
if (user.a_intent == I_HELP && src.allowed(user))
|
||||
@@ -285,7 +288,7 @@ var/list/tape_roll_applications = list()
|
||||
for(var/obj/item/tape/T in gettapeline())
|
||||
T.lift(100) //~10 seconds
|
||||
else
|
||||
breaktape(null, user)
|
||||
breaktape(user)
|
||||
|
||||
/obj/item/tape/proc/lift(time)
|
||||
lifted = 1
|
||||
@@ -320,14 +323,11 @@ var/list/tape_roll_applications = list()
|
||||
cur = get_step(cur, dir)
|
||||
return tapeline
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user))))
|
||||
user << "You can't break \the [src] with that!"
|
||||
/obj/item/tape/proc/breaktape(mob/user)
|
||||
if(user.a_intent == I_HELP)
|
||||
to_chat(user, "<span class='warning'>You refrain from breaking \the [src].</span>")
|
||||
return
|
||||
user.show_viewers("<span class='notice'>\The [user] breaks \the [src]!</span>")
|
||||
user.visible_message("<span class='notice'>\The [user] breaks \the [src]!</span>","<span class='notice'>You break \the [src].</span>")
|
||||
|
||||
for (var/obj/item/tape/T in gettapeline())
|
||||
if(T == src)
|
||||
|
||||
@@ -339,6 +339,16 @@
|
||||
for(var/i = 1 to 7)
|
||||
new /obj/item/weapon/grenade/chem_grenade/metalfoam(src)
|
||||
|
||||
/obj/item/weapon/storage/box/teargas
|
||||
name = "box of teargas grenades"
|
||||
desc = "A box containing 7 teargas grenades."
|
||||
icon_state = "flashbang"
|
||||
|
||||
/obj/item/weapon/storage/box/teargas/New()
|
||||
..()
|
||||
for(var/i = 1 to 7)
|
||||
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
|
||||
|
||||
/obj/item/weapon/storage/box/trackimp
|
||||
name = "boxed tracking implant kit"
|
||||
desc = "Box full of scum-bag tracking utensils."
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
new /obj/item/clothing/gloves/yellow(src)
|
||||
new /obj/item/weapon/screwdriver(src)
|
||||
new /obj/item/weapon/wrench(src)
|
||||
new /obj/item/weapon/weldingtool(src)
|
||||
new /obj/item/weapon/weldingtool/experimental(src)
|
||||
new /obj/item/weapon/crowbar(src)
|
||||
new /obj/item/weapon/wirecutters(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
|
||||
@@ -390,16 +390,21 @@
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
origin_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120)
|
||||
var/last_gen = 0
|
||||
var/nextrefueltick = 0
|
||||
|
||||
/obj/item/weapon/weldingtool/experimental/New()
|
||||
processing_objects |= src
|
||||
..()
|
||||
|
||||
/obj/item/weapon/weldingtool/experimental/Destroy()
|
||||
processing_objects -= src
|
||||
..()
|
||||
|
||||
/obj/item/weapon/weldingtool/experimental/proc/fuel_gen()//Proc to make the experimental welder generate fuel, optimized as fuck -Sieve
|
||||
var/gen_amount = ((world.time-last_gen)/25)
|
||||
reagents += (gen_amount)
|
||||
if(reagents > max_fuel)
|
||||
reagents = max_fuel
|
||||
|
||||
/obj/item/weapon/weldingtool/experimental/process()
|
||||
..()
|
||||
if(get_fuel() < max_fuel && nextrefueltick < world.time)
|
||||
nextrefueltick = world.time + 10
|
||||
reagents.add_reagent("fuel", 1)
|
||||
/*
|
||||
* Crowbar
|
||||
*/
|
||||
|
||||
+709
-167
@@ -22,7 +22,11 @@
|
||||
// creates the random item
|
||||
/obj/random/proc/spawn_item()
|
||||
var/build_path = item_to_spawn()
|
||||
return (new build_path(src.loc))
|
||||
|
||||
var/atom/A = new build_path(src.loc)
|
||||
if(pixel_x || pixel_y)
|
||||
A.pixel_x = pixel_x
|
||||
A.pixel_y = pixel_y
|
||||
|
||||
|
||||
/obj/random/single
|
||||
@@ -30,8 +34,9 @@
|
||||
desc = "This item type is used to randomly spawn a given object at round-start"
|
||||
icon_state = "x3"
|
||||
var/spawn_object = null
|
||||
item_to_spawn()
|
||||
return ispath(spawn_object) ? spawn_object : text2path(spawn_object)
|
||||
|
||||
/obj/random/single/item_to_spawn()
|
||||
return ispath(spawn_object) ? spawn_object : text2path(spawn_object)
|
||||
|
||||
|
||||
/obj/random/tool
|
||||
@@ -39,39 +44,40 @@
|
||||
desc = "This is a random tool"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "welder"
|
||||
item_to_spawn()
|
||||
return pick(/obj/item/weapon/screwdriver,
|
||||
/obj/item/weapon/wirecutters,
|
||||
/obj/item/weapon/weldingtool,
|
||||
/obj/item/weapon/weldingtool/largetank,
|
||||
/obj/item/weapon/crowbar,
|
||||
/obj/item/weapon/wrench,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/device/multitool)
|
||||
|
||||
/obj/random/tool/item_to_spawn()
|
||||
return pick(/obj/item/weapon/screwdriver,
|
||||
/obj/item/weapon/wirecutters,
|
||||
/obj/item/weapon/weldingtool,
|
||||
/obj/item/weapon/weldingtool/largetank,
|
||||
/obj/item/weapon/crowbar,
|
||||
/obj/item/weapon/wrench,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/device/multitool)
|
||||
|
||||
/obj/random/technology_scanner
|
||||
name = "random scanner"
|
||||
desc = "This is a random technology scanner."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "atmos"
|
||||
item_to_spawn()
|
||||
return pick(prob(5);/obj/item/device/t_scanner,
|
||||
prob(2);/obj/item/device/radio,
|
||||
prob(5);/obj/item/device/analyzer)
|
||||
|
||||
/obj/random/technology_scanner/item_to_spawn()
|
||||
return pick(prob(5);/obj/item/device/t_scanner,
|
||||
prob(2);/obj/item/device/radio,
|
||||
prob(5);/obj/item/device/analyzer)
|
||||
|
||||
/obj/random/powercell
|
||||
name = "random powercell"
|
||||
desc = "This is a random powercell."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "cell"
|
||||
item_to_spawn()
|
||||
return pick(prob(40);/obj/item/weapon/cell,
|
||||
prob(25);/obj/item/weapon/cell/device,
|
||||
prob(25);/obj/item/weapon/cell/high,
|
||||
prob(9);/obj/item/weapon/cell/super,
|
||||
prob(1);/obj/item/weapon/cell/hyper)
|
||||
|
||||
/obj/random/powercell/item_to_spawn()
|
||||
return pick(prob(40);/obj/item/weapon/cell,
|
||||
prob(25);/obj/item/weapon/cell/device,
|
||||
prob(25);/obj/item/weapon/cell/high,
|
||||
prob(9);/obj/item/weapon/cell/super,
|
||||
prob(1);/obj/item/weapon/cell/hyper)
|
||||
|
||||
|
||||
/obj/random/bomb_supply
|
||||
@@ -79,12 +85,13 @@
|
||||
desc = "This is a random bomb supply."
|
||||
icon = 'icons/obj/assemblies/new_assemblies.dmi'
|
||||
icon_state = "signaller"
|
||||
item_to_spawn()
|
||||
return pick(/obj/item/device/assembly/igniter,
|
||||
/obj/item/device/assembly/prox_sensor,
|
||||
/obj/item/device/assembly/signaler,
|
||||
/obj/item/device/assembly/timer,
|
||||
/obj/item/device/multitool)
|
||||
|
||||
/obj/random/bomb_supply/item_to_spawn()
|
||||
return pick(/obj/item/device/assembly/igniter,
|
||||
/obj/item/device/assembly/prox_sensor,
|
||||
/obj/item/device/assembly/signaler,
|
||||
/obj/item/device/assembly/timer,
|
||||
/obj/item/device/multitool)
|
||||
|
||||
|
||||
/obj/random/toolbox
|
||||
@@ -92,11 +99,12 @@
|
||||
desc = "This is a random toolbox."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "red"
|
||||
item_to_spawn()
|
||||
return pick(prob(6);/obj/item/weapon/storage/toolbox/mechanical,
|
||||
prob(6);/obj/item/weapon/storage/toolbox/electrical,
|
||||
prob(2);/obj/item/weapon/storage/toolbox/emergency,
|
||||
prob(1);/obj/item/weapon/storage/toolbox/syndicate)
|
||||
|
||||
/obj/random/toolbox/item_to_spawn()
|
||||
return pick(prob(6);/obj/item/weapon/storage/toolbox/mechanical,
|
||||
prob(6);/obj/item/weapon/storage/toolbox/electrical,
|
||||
prob(2);/obj/item/weapon/storage/toolbox/emergency,
|
||||
prob(1);/obj/item/weapon/storage/toolbox/syndicate)
|
||||
|
||||
|
||||
/obj/random/tech_supply
|
||||
@@ -105,66 +113,78 @@
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "cell"
|
||||
spawn_nothing_percentage = 25
|
||||
item_to_spawn()
|
||||
return pick(prob(3);/obj/random/powercell,
|
||||
prob(2);/obj/random/technology_scanner,
|
||||
prob(1);/obj/item/weapon/packageWrap,
|
||||
prob(2);/obj/random/bomb_supply,
|
||||
prob(1);/obj/item/weapon/extinguisher,
|
||||
prob(1);/obj/item/clothing/gloves/fyellow,
|
||||
prob(3);/obj/item/stack/cable_coil/random,
|
||||
prob(2);/obj/random/toolbox,
|
||||
prob(2);/obj/item/weapon/storage/belt/utility,
|
||||
prob(1);/obj/item/weapon/storage/belt/utility/full,
|
||||
prob(5);/obj/random/tool,
|
||||
prob(2);/obj/item/weapon/tape_roll,
|
||||
prob(2);/obj/item/taperoll/engineering,
|
||||
prob(1);/obj/item/taperoll/atmos,
|
||||
prob(1);/obj/item/device/flashlight/maglight)
|
||||
|
||||
/obj/random/tech_supply/item_to_spawn()
|
||||
return pick(prob(3);/obj/random/powercell,
|
||||
prob(2);/obj/random/technology_scanner,
|
||||
prob(1);/obj/item/weapon/packageWrap,
|
||||
prob(2);/obj/random/bomb_supply,
|
||||
prob(1);/obj/item/weapon/extinguisher,
|
||||
prob(1);/obj/item/clothing/gloves/fyellow,
|
||||
prob(3);/obj/item/stack/cable_coil/random,
|
||||
prob(2);/obj/random/toolbox,
|
||||
prob(2);/obj/item/weapon/storage/belt/utility,
|
||||
prob(1);/obj/item/weapon/storage/belt/utility/full,
|
||||
prob(5);/obj/random/tool,
|
||||
prob(2);/obj/item/weapon/tape_roll,
|
||||
prob(2);/obj/item/taperoll/engineering,
|
||||
prob(1);/obj/item/taperoll/atmos,
|
||||
prob(1);/obj/item/device/flashlight/maglight)
|
||||
|
||||
/obj/random/medical
|
||||
name = "Random Medicine"
|
||||
desc = "This is a random medical item."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "brutepack"
|
||||
spawn_nothing_percentage = 12.5
|
||||
item_to_spawn()
|
||||
return pick(prob(8);/obj/item/stack/medical/bruise_pack,
|
||||
prob(8);/obj/item/stack/medical/ointment,
|
||||
prob(4);/obj/item/stack/medical/advanced/bruise_pack,
|
||||
prob(4);/obj/item/stack/medical/advanced/ointment,
|
||||
prob(2);/obj/item/stack/medical/splint,
|
||||
prob(4);/obj/item/bodybag,
|
||||
prob(2);/obj/item/bodybag/cryobag,
|
||||
prob(4);/obj/item/weapon/storage/pill_bottle/kelotane,
|
||||
prob(4);/obj/item/weapon/storage/pill_bottle/dylovene,
|
||||
prob(4);/obj/item/weapon/storage/pill_bottle/tramadol,
|
||||
prob(1);/obj/item/weapon/storage/pill_bottle/spaceacillin,
|
||||
prob(1);/obj/item/weapon/storage/pill_bottle/tramadol,
|
||||
prob(0.2);/obj/item/weapon/storage/pill_bottle/dermaline,
|
||||
prob(0.2);/obj/item/weapon/storage/pill_bottle/dexalin_plus,
|
||||
prob(0.2);/obj/item/weapon/storage/pill_bottle/bicaridine,
|
||||
prob(4);/obj/item/weapon/reagent_containers/syringe/antitoxin,
|
||||
prob(2);/obj/item/weapon/reagent_containers/syringe/antiviral,
|
||||
prob(4);/obj/item/weapon/reagent_containers/syringe/inaprovaline,
|
||||
prob(4);/obj/item/weapon/reagent_containers/hypospray/autoinjector,
|
||||
prob(0.1);/obj/item/weapon/reagent_containers/hypospray,
|
||||
prob(1);/obj/item/device/healthanalyzer,
|
||||
prob(2);/obj/item/stack/nanopaste)
|
||||
icon_state = "traumakit"
|
||||
|
||||
/obj/random/medical/item_to_spawn()
|
||||
return pick(prob(21);/obj/random/medical/lite,
|
||||
prob(4);/obj/item/bodybag,
|
||||
prob(4);/obj/item/weapon/storage/pill_bottle/tramadol,
|
||||
prob(1);/obj/item/weapon/storage/pill_bottle/spaceacillin,
|
||||
prob(1);/obj/item/weapon/storage/pill_bottle/tramadol,
|
||||
prob(1);/obj/item/weapon/storage/pill_bottle/dermaline,
|
||||
prob(1);/obj/item/weapon/storage/pill_bottle/dexalin_plus,
|
||||
prob(1);/obj/item/weapon/storage/pill_bottle/bicaridine,
|
||||
prob(6);/obj/item/weapon/reagent_containers/syringe/antitoxin,
|
||||
prob(1);/obj/item/weapon/reagent_containers/syringe/antiviral,
|
||||
prob(6);/obj/item/weapon/reagent_containers/syringe/inaprovaline,
|
||||
prob(1);/obj/item/weapon/reagent_containers/hypospray,
|
||||
prob(1);/obj/item/weapon/storage/box/freezer,
|
||||
prob(2);/obj/item/stack/nanopaste)
|
||||
|
||||
/obj/random/medical/lite
|
||||
name = "Random Medicine"
|
||||
desc = "This is a random simple medical item."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "brutepack"
|
||||
spawn_nothing_percentage = 25
|
||||
|
||||
/obj/random/medical/lite/item_to_spawn()
|
||||
return pick(prob(4);/obj/item/stack/medical/bruise_pack,
|
||||
prob(4);/obj/item/stack/medical/ointment,
|
||||
prob(2);/obj/item/stack/medical/advanced/bruise_pack,
|
||||
prob(2);/obj/item/stack/medical/advanced/ointment,
|
||||
prob(1);/obj/item/stack/medical/splint,
|
||||
prob(4);/obj/item/device/healthanalyzer,
|
||||
prob(1);/obj/item/bodybag/cryobag,
|
||||
prob(3);/obj/item/weapon/reagent_containers/hypospray/autoinjector,
|
||||
prob(2);/obj/item/weapon/storage/pill_bottle/kelotane,
|
||||
prob(2);/obj/item/weapon/storage/pill_bottle/antitox)
|
||||
|
||||
/obj/random/firstaid
|
||||
name = "Random First Aid Kit"
|
||||
desc = "This is a random first aid kit."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "firstaid"
|
||||
item_to_spawn()
|
||||
return pick(prob(3);/obj/item/weapon/storage/firstaid/regular,
|
||||
prob(2);/obj/item/weapon/storage/firstaid/toxin,
|
||||
prob(2);/obj/item/weapon/storage/firstaid/o2,
|
||||
prob(1);/obj/item/weapon/storage/firstaid/adv,
|
||||
prob(2);/obj/item/weapon/storage/firstaid/fire)
|
||||
|
||||
/obj/random/firstaid/item_to_spawn()
|
||||
return pick(prob(4);/obj/item/weapon/storage/firstaid/regular,
|
||||
prob(3);/obj/item/weapon/storage/firstaid/toxin,
|
||||
prob(3);/obj/item/weapon/storage/firstaid/o2,
|
||||
prob(2);/obj/item/weapon/storage/firstaid/adv,
|
||||
prob(3);/obj/item/weapon/storage/firstaid/fire,
|
||||
prob(1);/obj/item/weapon/storage/firstaid/combat)
|
||||
|
||||
/obj/random/contraband
|
||||
name = "Random Illegal Item"
|
||||
@@ -172,69 +192,104 @@
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "purplecomb"
|
||||
spawn_nothing_percentage = 50
|
||||
item_to_spawn()
|
||||
return pick(prob(6);/obj/item/weapon/storage/pill_bottle/tramadol,
|
||||
prob(8);/obj/item/weapon/haircomb,
|
||||
prob(4);/obj/item/weapon/storage/pill_bottle/happy,
|
||||
prob(4);/obj/item/weapon/storage/pill_bottle/zoom,
|
||||
prob(10);/obj/item/weapon/contraband/poster,
|
||||
prob(4);/obj/item/weapon/material/butterfly,
|
||||
prob(6);/obj/item/weapon/material/butterflyblade,
|
||||
prob(6);/obj/item/weapon/material/butterflyhandle,
|
||||
prob(6);/obj/item/weapon/material/wirerod,
|
||||
prob(2);/obj/item/weapon/material/butterfly/switchblade,
|
||||
prob(2);/obj/item/weapon/material/knuckledusters,
|
||||
prob(1);/obj/item/weapon/material/hatchet/tacknife,
|
||||
prob(0.5);/obj/item/weapon/beartrap,
|
||||
prob(1);/obj/item/weapon/handcuffs,
|
||||
prob(1);/obj/item/weapon/legcuffs,
|
||||
prob(2);/obj/item/weapon/reagent_containers/syringe/drugs)
|
||||
/obj/random/contraband/item_to_spawn()
|
||||
return pick(prob(6);/obj/item/weapon/storage/pill_bottle/tramadol,
|
||||
prob(8);/obj/item/weapon/haircomb,
|
||||
prob(4);/obj/item/weapon/storage/pill_bottle/happy,
|
||||
prob(4);/obj/item/weapon/storage/pill_bottle/zoom,
|
||||
prob(10);/obj/item/weapon/contraband/poster,
|
||||
prob(4);/obj/item/weapon/material/butterfly,
|
||||
prob(6);/obj/item/weapon/material/butterflyblade,
|
||||
prob(6);/obj/item/weapon/material/butterflyhandle,
|
||||
prob(6);/obj/item/weapon/material/wirerod,
|
||||
prob(2);/obj/item/weapon/material/butterfly/switchblade,
|
||||
prob(2);/obj/item/weapon/material/knuckledusters,
|
||||
prob(1);/obj/item/weapon/material/hatchet/tacknife,
|
||||
prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc,
|
||||
prob(1);/obj/item/weapon/beartrap,
|
||||
prob(1);/obj/item/weapon/handcuffs,
|
||||
prob(1);/obj/item/weapon/legcuffs,
|
||||
prob(2);/obj/item/weapon/reagent_containers/syringe/drugs,
|
||||
prob(1);/obj/item/weapon/reagent_containers/syringe/steroid)
|
||||
|
||||
/obj/random/soap
|
||||
name = "Random Soap"
|
||||
desc = "This is a random bar of soap."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "soap"
|
||||
|
||||
/obj/random/soap/item_to_spawn()
|
||||
return pick(prob(3);/obj/item/weapon/soap,
|
||||
prob(2);/obj/item/weapon/soap/nanotrasen,
|
||||
prob(2);/obj/item/weapon/soap/deluxe,
|
||||
prob(1);/obj/item/weapon/soap/syndie,)
|
||||
|
||||
|
||||
/obj/random/drinkbottle
|
||||
name = "random drink"
|
||||
desc = "This is a random drink."
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "whiskeybottle"
|
||||
|
||||
/obj/random/drinkbottle/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/patron)
|
||||
|
||||
/obj/random/energy
|
||||
name = "Random Energy Weapon"
|
||||
name = "Random Security Energy Weapon"
|
||||
desc = "This is a random security weapon."
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "energykill100"
|
||||
item_to_spawn()
|
||||
return pick(prob(2);/obj/item/weapon/gun/energy/laser,
|
||||
prob(2);/obj/item/weapon/gun/energy/gun)
|
||||
|
||||
/obj/random/energy/item_to_spawn()
|
||||
return pick(prob(2);/obj/item/weapon/gun/energy/laser,
|
||||
prob(2);/obj/item/weapon/gun/energy/gun)
|
||||
|
||||
/obj/random/projectile
|
||||
name = "Random Projectile Weapon"
|
||||
name = "Random Security Projectile Weapon"
|
||||
desc = "This is a random security weapon."
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "revolver"
|
||||
item_to_spawn()
|
||||
return pick(prob(3);/obj/item/weapon/gun/projectile/shotgun/pump,
|
||||
prob(2);/obj/item/weapon/gun/projectile/automatic/wt550,
|
||||
prob(1);/obj/item/weapon/gun/projectile/shotgun/pump/combat)
|
||||
|
||||
/obj/random/projectile/item_to_spawn()
|
||||
return pick(prob(3);/obj/item/weapon/gun/projectile/shotgun/pump,
|
||||
prob(2);/obj/item/weapon/gun/projectile/automatic/wt550,
|
||||
prob(1);/obj/item/weapon/gun/projectile/shotgun/pump/combat)
|
||||
|
||||
/obj/random/handgun
|
||||
name = "Random Handgun"
|
||||
desc = "This is a random security sidearm."
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "secgundark"
|
||||
item_to_spawn()
|
||||
return pick(prob(3);/obj/item/weapon/gun/projectile/sec,
|
||||
prob(1);/obj/item/weapon/gun/projectile/sec/wood)
|
||||
|
||||
/obj/random/handgun/item_to_spawn()
|
||||
return pick(prob(3);/obj/item/weapon/gun/projectile/sec,
|
||||
prob(1);/obj/item/weapon/gun/projectile/sec/wood)
|
||||
|
||||
/obj/random/ammo
|
||||
name = "Random Ammunition"
|
||||
desc = "This is random ammunition."
|
||||
icon = 'icons/obj/ammo.dmi'
|
||||
icon_state = "45-10"
|
||||
item_to_spawn()
|
||||
return pick(prob(6);/obj/item/weapon/storage/box/beanbags,
|
||||
prob(2);/obj/item/weapon/storage/box/shotgunammo,
|
||||
prob(4);/obj/item/weapon/storage/box/shotgunshells,
|
||||
prob(1);/obj/item/weapon/storage/box/stunshells,
|
||||
prob(2);/obj/item/ammo_magazine/c45m,
|
||||
prob(4);/obj/item/ammo_magazine/c45m/rubber,
|
||||
prob(4);/obj/item/ammo_magazine/c45m/flash,
|
||||
prob(2);/obj/item/ammo_magazine/mc9mmt,
|
||||
prob(6);/obj/item/ammo_magazine/mc9mmt/rubber)
|
||||
|
||||
/obj/random/ammo/item_to_spawn()
|
||||
return pick(prob(6);/obj/item/weapon/storage/box/beanbags,
|
||||
prob(2);/obj/item/weapon/storage/box/shotgunammo,
|
||||
prob(4);/obj/item/weapon/storage/box/shotgunshells,
|
||||
prob(1);/obj/item/weapon/storage/box/stunshells,
|
||||
prob(2);/obj/item/ammo_magazine/c45m,
|
||||
prob(4);/obj/item/ammo_magazine/c45m/rubber,
|
||||
prob(4);/obj/item/ammo_magazine/c45m/flash,
|
||||
prob(2);/obj/item/ammo_magazine/mc9mmt,
|
||||
prob(6);/obj/item/ammo_magazine/mc9mmt/rubber)
|
||||
|
||||
|
||||
/obj/random/action_figure
|
||||
@@ -242,59 +297,546 @@
|
||||
desc = "This is a random action figure."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "assistant"
|
||||
item_to_spawn()
|
||||
return pick(/obj/item/toy/figure/cmo,
|
||||
/obj/item/toy/figure/assistant,
|
||||
/obj/item/toy/figure/atmos,
|
||||
/obj/item/toy/figure/bartender,
|
||||
/obj/item/toy/figure/borg,
|
||||
/obj/item/toy/figure/gardener,
|
||||
/obj/item/toy/figure/captain,
|
||||
/obj/item/toy/figure/cargotech,
|
||||
/obj/item/toy/figure/ce,
|
||||
/obj/item/toy/figure/chaplain,
|
||||
/obj/item/toy/figure/chef,
|
||||
/obj/item/toy/figure/chemist,
|
||||
/obj/item/toy/figure/clown,
|
||||
/obj/item/toy/figure/corgi,
|
||||
/obj/item/toy/figure/detective,
|
||||
/obj/item/toy/figure/dsquad,
|
||||
/obj/item/toy/figure/engineer,
|
||||
/obj/item/toy/figure/geneticist,
|
||||
/obj/item/toy/figure/hop,
|
||||
/obj/item/toy/figure/hos,
|
||||
/obj/item/toy/figure/qm,
|
||||
/obj/item/toy/figure/janitor,
|
||||
/obj/item/toy/figure/agent,
|
||||
/obj/item/toy/figure/librarian,
|
||||
/obj/item/toy/figure/md,
|
||||
/obj/item/toy/figure/mime,
|
||||
/obj/item/toy/figure/miner,
|
||||
/obj/item/toy/figure/ninja,
|
||||
/obj/item/toy/figure/wizard,
|
||||
/obj/item/toy/figure/rd,
|
||||
/obj/item/toy/figure/roboticist,
|
||||
/obj/item/toy/figure/scientist,
|
||||
/obj/item/toy/figure/syndie,
|
||||
/obj/item/toy/figure/secofficer,
|
||||
/obj/item/toy/figure/warden,
|
||||
/obj/item/toy/figure/psychologist,
|
||||
/obj/item/toy/figure/paramedic,
|
||||
/obj/item/toy/figure/ert)
|
||||
|
||||
/obj/random/action_figure/item_to_spawn()
|
||||
return pick(/obj/item/toy/figure/cmo,
|
||||
/obj/item/toy/figure/assistant,
|
||||
/obj/item/toy/figure/atmos,
|
||||
/obj/item/toy/figure/bartender,
|
||||
/obj/item/toy/figure/borg,
|
||||
/obj/item/toy/figure/gardener,
|
||||
/obj/item/toy/figure/captain,
|
||||
/obj/item/toy/figure/cargotech,
|
||||
/obj/item/toy/figure/ce,
|
||||
/obj/item/toy/figure/chaplain,
|
||||
/obj/item/toy/figure/chef,
|
||||
/obj/item/toy/figure/chemist,
|
||||
/obj/item/toy/figure/clown,
|
||||
/obj/item/toy/figure/corgi,
|
||||
/obj/item/toy/figure/detective,
|
||||
/obj/item/toy/figure/dsquad,
|
||||
/obj/item/toy/figure/engineer,
|
||||
/obj/item/toy/figure/geneticist,
|
||||
/obj/item/toy/figure/hop,
|
||||
/obj/item/toy/figure/hos,
|
||||
/obj/item/toy/figure/qm,
|
||||
/obj/item/toy/figure/janitor,
|
||||
/obj/item/toy/figure/agent,
|
||||
/obj/item/toy/figure/librarian,
|
||||
/obj/item/toy/figure/md,
|
||||
/obj/item/toy/figure/mime,
|
||||
/obj/item/toy/figure/miner,
|
||||
/obj/item/toy/figure/ninja,
|
||||
/obj/item/toy/figure/wizard,
|
||||
/obj/item/toy/figure/rd,
|
||||
/obj/item/toy/figure/roboticist,
|
||||
/obj/item/toy/figure/scientist,
|
||||
/obj/item/toy/figure/syndie,
|
||||
/obj/item/toy/figure/secofficer,
|
||||
/obj/item/toy/figure/warden,
|
||||
/obj/item/toy/figure/psychologist,
|
||||
/obj/item/toy/figure/paramedic,
|
||||
/obj/item/toy/figure/ert)
|
||||
|
||||
/obj/random/plushie
|
||||
name = "random plushie"
|
||||
desc = "This is a random plushie."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "nymphplushie"
|
||||
item_to_spawn()
|
||||
return pick(/obj/structure/plushie/ian,
|
||||
/obj/structure/plushie/drone,
|
||||
/obj/structure/plushie/carp,
|
||||
/obj/structure/plushie/beepsky,
|
||||
/obj/item/toy/plushie/nymph,
|
||||
/obj/item/toy/plushie/mouse,
|
||||
/obj/item/toy/plushie/kitten,
|
||||
/obj/item/toy/plushie/lizard)
|
||||
|
||||
/obj/random/plushie/item_to_spawn()
|
||||
return pick(/obj/structure/plushie/ian,
|
||||
/obj/structure/plushie/drone,
|
||||
/obj/structure/plushie/carp,
|
||||
/obj/structure/plushie/beepsky,
|
||||
/obj/item/toy/plushie/nymph,
|
||||
/obj/item/toy/plushie/mouse,
|
||||
/obj/item/toy/plushie/kitten,
|
||||
/obj/item/toy/plushie/lizard)
|
||||
|
||||
/obj/random/junk //Broken items, or stuff that could be picked up
|
||||
name = "random junk"
|
||||
desc = "This is some random junk."
|
||||
icon = 'icons/obj/trash.dmi'
|
||||
icon_state = "trashbag3"
|
||||
|
||||
/obj/random/junk/item_to_spawn()
|
||||
return get_random_junk_type()
|
||||
|
||||
/obj/random/trash //Mostly remains and cleanable decals. Stuff a janitor could clean up
|
||||
name = "random trash"
|
||||
desc = "This is some random trash."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "greenglow"
|
||||
|
||||
/obj/random/trash/item_to_spawn()
|
||||
return pick(/obj/effect/decal/remains/lizard,
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot,
|
||||
/obj/effect/decal/cleanable/blood/oil,
|
||||
/obj/effect/decal/cleanable/blood/oil/streak,
|
||||
/obj/effect/decal/cleanable/spiderling_remains,
|
||||
/obj/effect/decal/remains/mouse,
|
||||
/obj/effect/decal/cleanable/vomit,
|
||||
/obj/effect/decal/cleanable/blood/splatter,
|
||||
/obj/effect/decal/cleanable/ash,
|
||||
/obj/effect/decal/cleanable/generic,
|
||||
/obj/effect/decal/cleanable/flour,
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/decal/remains/robot)
|
||||
|
||||
/obj/random/obstruction //Large objects to block things off in maintenance
|
||||
name = "random obstruction"
|
||||
desc = "This is a random obstruction."
|
||||
icon = 'icons/obj/cult.dmi'
|
||||
icon_state = "cultgirder"
|
||||
|
||||
/obj/random/obstruction/item_to_spawn()
|
||||
return pick(/obj/structure/barricade,
|
||||
/obj/structure/girder,
|
||||
/obj/structure/girder/displaced,
|
||||
/obj/structure/girder/reinforced,
|
||||
/obj/structure/grille,
|
||||
/obj/structure/grille/broken,
|
||||
/obj/structure/foamedmetal,
|
||||
/obj/structure/inflatable,
|
||||
/obj/structure/inflatable/door)
|
||||
|
||||
/obj/random/material //Random materials for building stuff
|
||||
name = "random material"
|
||||
desc = "This is a random material."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "sheet-metal"
|
||||
|
||||
/obj/random/material/item_to_spawn()
|
||||
return pick(/obj/item/stack/material/steel{amount = 10},
|
||||
/obj/item/stack/material/glass{amount = 10},
|
||||
/obj/item/stack/material/glass/reinforced{amount = 10},
|
||||
/obj/item/stack/material/plastic{amount = 10},
|
||||
/obj/item/stack/material/wood{amount = 10},
|
||||
/obj/item/stack/material/cardboard{amount = 10},
|
||||
/obj/item/stack/rods{amount = 10},
|
||||
/obj/item/stack/material/plasteel{amount = 10})
|
||||
|
||||
/obj/random/toy
|
||||
name = "random toy"
|
||||
desc = "This is a random toy."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "ship"
|
||||
|
||||
/obj/random/toy/item_to_spawn()
|
||||
return pick(/obj/item/toy/bosunwhistle,
|
||||
/obj/item/toy/therapy_red,
|
||||
/obj/item/toy/therapy_purple,
|
||||
/obj/item/toy/therapy_blue,
|
||||
/obj/item/toy/therapy_yellow,
|
||||
/obj/item/toy/therapy_orange,
|
||||
/obj/item/toy/therapy_green,
|
||||
/obj/item/toy/cultsword,
|
||||
/obj/item/toy/katana,
|
||||
/obj/item/toy/snappop,
|
||||
/obj/item/toy/sword,
|
||||
/obj/item/toy/balloon,
|
||||
/obj/item/toy/crossbow,
|
||||
/obj/item/toy/blink,
|
||||
/obj/item/toy/waterflower,
|
||||
/obj/item/toy/prize/ripley,
|
||||
/obj/item/toy/prize/fireripley,
|
||||
/obj/item/toy/prize/deathripley,
|
||||
/obj/item/toy/prize/gygax,
|
||||
/obj/item/toy/prize/durand,
|
||||
/obj/item/toy/prize/honk,
|
||||
/obj/item/toy/prize/marauder,
|
||||
/obj/item/toy/prize/seraph,
|
||||
/obj/item/toy/prize/mauler,
|
||||
/obj/item/toy/prize/odysseus,
|
||||
/obj/item/toy/prize/phazon)
|
||||
|
||||
/obj/random/tank
|
||||
name = "random tank"
|
||||
desc = "This is a tank."
|
||||
icon = 'icons/obj/tank.dmi'
|
||||
icon_state = "canister"
|
||||
|
||||
/obj/random/tank/item_to_spawn()
|
||||
return pick(prob(5);/obj/item/weapon/tank/oxygen,
|
||||
prob(4);/obj/item/weapon/tank/oxygen/yellow,
|
||||
prob(4);/obj/item/weapon/tank/oxygen/red,
|
||||
prob(3);/obj/item/weapon/tank/air,
|
||||
prob(4);/obj/item/weapon/tank/emergency_oxygen,
|
||||
prob(3);/obj/item/weapon/tank/emergency_oxygen/engi,
|
||||
prob(2);/obj/item/weapon/tank/emergency_oxygen/double,
|
||||
prob(1);/obj/item/device/suit_cooling_unit)
|
||||
|
||||
/obj/random/cigarettes
|
||||
name = "random cigarettes"
|
||||
desc = "This is a cigarette."
|
||||
icon = 'icons/obj/cigarettes.dmi'
|
||||
icon_state = "cigpacket"
|
||||
|
||||
/obj/random/cigarettes/item_to_spawn()
|
||||
return pick(prob(5);/obj/item/weapon/storage/fancy/cigarettes,
|
||||
prob(4);/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,
|
||||
prob(3);/obj/item/weapon/storage/fancy/cigarettes/killthroat,
|
||||
prob(3);/obj/item/weapon/storage/fancy/cigarettes/luckystars,
|
||||
prob(3);/obj/item/weapon/storage/fancy/cigarettes/jerichos,
|
||||
prob(3);/obj/item/weapon/storage/fancy/cigarettes/menthols,
|
||||
prob(3);/obj/item/weapon/storage/fancy/cigarettes/carcinomas,
|
||||
prob(3);/obj/item/weapon/storage/fancy/cigarettes/professionals,
|
||||
prob(1);/obj/item/weapon/storage/fancy/cigar,
|
||||
prob(1);/obj/item/clothing/mask/smokable/cigarette/cigar,
|
||||
prob(1);/obj/item/clothing/mask/smokable/cigarette/cigar/cohiba,
|
||||
prob(1);/obj/item/clothing/mask/smokable/cigarette/cigar/havana)
|
||||
|
||||
/obj/random/maintenance //Clutter and loot for maintenance and away missions
|
||||
name = "random maintenance item"
|
||||
desc = "This is a random maintenance item."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "gift1"
|
||||
|
||||
/obj/random/maintenance/item_to_spawn()
|
||||
return pick(prob(300);/obj/random/tech_supply,
|
||||
prob(200);/obj/random/medical,
|
||||
prob(100);/obj/random/firstaid,
|
||||
prob(10);/obj/random/contraband,
|
||||
prob(50);/obj/random/action_figure,
|
||||
prob(50);/obj/random/plushie,
|
||||
prob(200);/obj/random/junk,
|
||||
prob(200);/obj/random/material,
|
||||
prob(50);/obj/random/toy,
|
||||
prob(100);/obj/random/tank,
|
||||
prob(50);/obj/random/soap,
|
||||
prob(60);/obj/random/drinkbottle,
|
||||
prob(500);/obj/random/maintenance/clean)
|
||||
|
||||
/obj/random/maintenance/clean
|
||||
/*Maintenance loot lists without the trash, for use inside things.
|
||||
Individual items to add to the maintenance list should go here, if you add
|
||||
something, make sure it's not in one of the other lists.*/
|
||||
name = "random clean maintenance item"
|
||||
desc = "This is a random clean maintenance item."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "gift1"
|
||||
|
||||
/obj/random/maintenance/clean/item_to_spawn()
|
||||
return pick(prob(10);/obj/random/contraband,
|
||||
prob(2);/obj/item/device/flashlight/flare,
|
||||
prob(2);/obj/item/device/flashlight/glowstick,
|
||||
prob(2);/obj/item/device/flashlight/glowstick/blue,
|
||||
prob(1);/obj/item/device/flashlight/glowstick/orange,
|
||||
prob(1);/obj/item/device/flashlight/glowstick/red,
|
||||
prob(1);/obj/item/device/flashlight/glowstick/yellow,
|
||||
prob(1);/obj/item/device/flashlight/pen,
|
||||
prob(4);/obj/item/weapon/cell,
|
||||
prob(4);/obj/item/weapon/cell/device,
|
||||
prob(3);/obj/item/weapon/cell/high,
|
||||
prob(2);/obj/item/weapon/cell/super,
|
||||
prob(5);/obj/random/cigarettes,
|
||||
prob(3);/obj/item/clothing/mask/gas,
|
||||
prob(2);/obj/item/clothing/mask/gas/half,
|
||||
prob(4);/obj/item/clothing/mask/breath,
|
||||
prob(2);/obj/item/weapon/reagent_containers/glass/rag,
|
||||
prob(4);/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
|
||||
prob(2);/obj/item/weapon/storage/secure/briefcase,
|
||||
prob(4);/obj/item/weapon/storage/briefcase,
|
||||
prob(5);/obj/item/weapon/storage/backpack,
|
||||
prob(5);/obj/item/weapon/storage/backpack/satchel/norm,
|
||||
prob(4);/obj/item/weapon/storage/backpack/satchel,
|
||||
prob(3);/obj/item/weapon/storage/backpack/dufflebag,
|
||||
prob(1);/obj/item/weapon/storage/backpack/dufflebag/syndie,
|
||||
prob(5);/obj/item/weapon/storage/box,
|
||||
prob(3);/obj/item/weapon/storage/box/donkpockets,
|
||||
prob(2);/obj/item/weapon/storage/box/sinpockets,
|
||||
prob(1);/obj/item/weapon/storage/box/cups,
|
||||
prob(3);/obj/item/weapon/storage/box/mousetraps,
|
||||
prob(3);/obj/item/weapon/storage/box/engineer,
|
||||
prob(3);/obj/item/weapon/storage/wallet,
|
||||
prob(1);/obj/item/device/paicard,
|
||||
prob(2);/obj/item/clothing/shoes/galoshes,
|
||||
prob(1);/obj/item/clothing/shoes/syndigaloshes,
|
||||
prob(4);/obj/item/clothing/shoes/black,
|
||||
prob(4);/obj/item/clothing/shoes/laceup,
|
||||
prob(4);/obj/item/clothing/shoes/black,
|
||||
prob(4);/obj/item/clothing/shoes/leather,
|
||||
prob(1);/obj/item/clothing/gloves/yellow,
|
||||
prob(3);/obj/item/clothing/gloves/botanic_leather,
|
||||
prob(2);/obj/item/clothing/gloves/latex,
|
||||
prob(5);/obj/item/clothing/gloves/white,
|
||||
prob(5);/obj/item/clothing/gloves/rainbow,
|
||||
prob(2);/obj/item/clothing/gloves/fyellow,
|
||||
prob(1);/obj/item/clothing/glasses/sunglasses,
|
||||
prob(3);/obj/item/clothing/glasses/meson,
|
||||
prob(2);/obj/item/clothing/glasses/meson/prescription,
|
||||
prob(1);/obj/item/clothing/glasses/welding,
|
||||
prob(1);/obj/item/clothing/head/bio_hood/general,
|
||||
prob(4);/obj/item/clothing/head/hardhat,
|
||||
prob(3);/obj/item/clothing/head/hardhat/red,
|
||||
prob(1);/obj/item/clothing/head/ushanka,
|
||||
prob(2);/obj/item/clothing/head/welding,
|
||||
prob(4);/obj/item/clothing/suit/storage/hazardvest,
|
||||
prob(1);/obj/item/clothing/suit/space/emergency,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/bomber,
|
||||
prob(1);/obj/item/clothing/suit/bio_suit/general,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/black,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/blue,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/red,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/yellow,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/brown_jacket,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/leather_jacket,
|
||||
prob(1);/obj/item/clothing/suit/storage/vest/press,
|
||||
prob(3);/obj/item/clothing/suit/apron,
|
||||
prob(4);/obj/item/clothing/under/color/grey,
|
||||
prob(2);/obj/item/clothing/under/syndicate/tacticool,
|
||||
prob(2);/obj/item/clothing/under/pants/camo,
|
||||
prob(1);/obj/item/clothing/under/harness,
|
||||
prob(1);/obj/item/clothing/under/tactical,
|
||||
prob(3);/obj/item/clothing/accessory/storage/webbing,
|
||||
prob(4);/obj/item/weapon/spacecash/c1,
|
||||
prob(3);/obj/item/weapon/spacecash/c10,
|
||||
prob(3);/obj/item/weapon/spacecash/c20,
|
||||
prob(1);/obj/item/weapon/spacecash/c50,
|
||||
prob(1);/obj/item/weapon/spacecash/c100,
|
||||
prob(3);/obj/item/weapon/camera_assembly,
|
||||
prob(4);/obj/item/weapon/caution,
|
||||
prob(3);/obj/item/weapon/caution/cone,
|
||||
prob(1);/obj/item/weapon/card/emag_broken,
|
||||
prob(2);/obj/item/device/camera,
|
||||
prob(3);/obj/item/device/pda,
|
||||
prob(3);/obj/item/device/radio/headset)
|
||||
|
||||
/obj/random/maintenance/security
|
||||
/*Maintenance loot list. This one is for around security areas*/
|
||||
name = "random security maintenance item"
|
||||
desc = "This is a random security maintenance item."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "gift1"
|
||||
|
||||
/obj/random/maintenance/security/item_to_spawn()
|
||||
return pick(prob(320);/obj/random/maintenance/clean,
|
||||
prob(2);/obj/item/device/flashlight/maglight,
|
||||
prob(2);/obj/item/device/flash,
|
||||
prob(1);/obj/item/weapon/cell/device/weapon,
|
||||
prob(1);/obj/item/clothing/mask/gas/swat,
|
||||
prob(1);/obj/item/clothing/mask/gas/syndicate,
|
||||
prob(2);/obj/item/clothing/mask/balaclava,
|
||||
prob(1);/obj/item/clothing/mask/balaclava/tactical,
|
||||
prob(3);/obj/item/weapon/storage/backpack/security,
|
||||
prob(3);/obj/item/weapon/storage/backpack/satchel/sec,
|
||||
prob(2);/obj/item/weapon/storage/backpack/messenger/sec,
|
||||
prob(2);/obj/item/weapon/storage/backpack/dufflebag/sec,
|
||||
prob(1);/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,
|
||||
prob(1);/obj/item/weapon/storage/backpack/dufflebag/syndie/med,
|
||||
prob(2);/obj/item/weapon/storage/box/swabs,
|
||||
prob(2);/obj/item/weapon/storage/belt/security,
|
||||
prob(1);/obj/item/weapon/grenade/flashbang,
|
||||
prob(1);/obj/item/weapon/melee/baton,
|
||||
prob(1);/obj/item/weapon/reagent_containers/spray/pepper,
|
||||
prob(3);/obj/item/clothing/shoes/jackboots,
|
||||
prob(1);/obj/item/clothing/shoes/swat,
|
||||
prob(1);/obj/item/clothing/shoes/combat,
|
||||
prob(1);/obj/item/clothing/gloves/swat,
|
||||
prob(1);/obj/item/clothing/gloves/combat,
|
||||
prob(1);/obj/item/clothing/glasses/sunglasses/big,
|
||||
prob(2);/obj/item/clothing/glasses/hud/security,
|
||||
prob(1);/obj/item/clothing/glasses/sunglasses/sechud,
|
||||
prob(1);/obj/item/clothing/glasses/sunglasses/sechud/aviator,
|
||||
prob(1);/obj/item/clothing/glasses/sunglasses/sechud/tactical,
|
||||
prob(3);/obj/item/clothing/head/beret/sec,
|
||||
prob(3);/obj/item/clothing/head/beret/sec/corporate/officer,
|
||||
prob(3);/obj/item/clothing/head/beret/sec/navy/officer,
|
||||
prob(2);/obj/item/clothing/head/helmet,
|
||||
prob(4);/obj/item/clothing/head/soft/sec,
|
||||
prob(4);/obj/item/clothing/head/soft/sec/corp,
|
||||
prob(3);/obj/item/clothing/suit/armor/vest,
|
||||
prob(2);/obj/item/clothing/suit/armor/vest/security,
|
||||
prob(2);/obj/item/clothing/suit/storage/vest/officer,
|
||||
prob(1);/obj/item/clothing/suit/storage/vest/detective,
|
||||
prob(1);/obj/item/clothing/suit/storage/vest/press,
|
||||
prob(2);/obj/item/clothing/accessory/storage/black_vest,
|
||||
prob(2);/obj/item/clothing/accessory/storage/black_drop_pouches,
|
||||
prob(1);/obj/item/clothing/accessory/holster/leg,
|
||||
prob(1);/obj/item/clothing/accessory/holster/hip,
|
||||
prob(1);/obj/item/clothing/accessory/holster/waist,
|
||||
prob(1);/obj/item/clothing/accessory/holster/armpit,
|
||||
prob(2);/obj/item/clothing/ears/earmuffs,
|
||||
prob(2);/obj/item/weapon/handcuffs,)
|
||||
|
||||
/obj/random/maintenance/medical
|
||||
/*Maintenance loot list. This one is for around medical areas*/
|
||||
name = "random medical maintenance item"
|
||||
desc = "This is a random medical maintenance item."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "gift1"
|
||||
|
||||
/obj/random/maintenance/medical/item_to_spawn()
|
||||
return pick(prob(320);/obj/random/maintenance/clean,
|
||||
prob(25);/obj/random/medical/lite,
|
||||
prob(2);/obj/item/clothing/mask/breath/medical,
|
||||
prob(2);/obj/item/clothing/mask/surgical,
|
||||
prob(5);/obj/item/weapon/storage/backpack/medic,
|
||||
prob(5);/obj/item/weapon/storage/backpack/satchel/med,
|
||||
prob(5);/obj/item/weapon/storage/backpack/messenger/med,
|
||||
prob(3);/obj/item/weapon/storage/backpack/dufflebag/med,
|
||||
prob(1);/obj/item/weapon/storage/backpack/dufflebag/syndie/med,
|
||||
prob(2);/obj/item/weapon/storage/box/autoinjectors,
|
||||
prob(3);/obj/item/weapon/storage/box/beakers,
|
||||
prob(2);/obj/item/weapon/storage/box/bodybags,
|
||||
prob(3);/obj/item/weapon/storage/box/syringes,
|
||||
prob(3);/obj/item/weapon/storage/box/gloves,
|
||||
prob(2);/obj/item/weapon/storage/belt/medical/emt,
|
||||
prob(2);/obj/item/weapon/storage/belt/medical,
|
||||
prob(1);/obj/item/clothing/shoes/combat,
|
||||
prob(3);/obj/item/clothing/shoes/white,
|
||||
prob(2);/obj/item/clothing/gloves/latex,
|
||||
prob(5);/obj/item/clothing/gloves/white,
|
||||
prob(2);/obj/item/clothing/glasses/hud/health,
|
||||
prob(1);/obj/item/clothing/glasses/hud/health/prescription,
|
||||
prob(1);/obj/item/clothing/head/bio_hood/virology,
|
||||
prob(4);/obj/item/clothing/suit/storage/toggle/labcoat,
|
||||
prob(1);/obj/item/clothing/suit/bio_suit/general,
|
||||
prob(2);/obj/item/clothing/under/rank/medical/paramedic,
|
||||
prob(2);/obj/item/clothing/accessory/storage/black_vest,
|
||||
prob(2);/obj/item/clothing/accessory/storage/white_vest,
|
||||
prob(1);/obj/item/clothing/accessory/storage/white_drop_pouches,
|
||||
prob(1);/obj/item/clothing/accessory/storage/black_drop_pouches,
|
||||
prob(2);/obj/item/clothing/accessory/stethoscope)
|
||||
|
||||
/obj/random/maintenance/engineering
|
||||
/*Maintenance loot list. This one is for around medical areas*/
|
||||
name = "random engineering maintenance item"
|
||||
desc = "This is a random engineering maintenance item."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "gift1"
|
||||
|
||||
/obj/random/maintenance/engineering/item_to_spawn()
|
||||
return pick(prob(320);/obj/random/maintenance/clean,
|
||||
prob(2);/obj/item/device/flashlight/maglight,
|
||||
prob(3);/obj/item/clothing/mask/gas/half,
|
||||
prob(2);/obj/item/clothing/mask/balaclava,
|
||||
prob(2);/obj/item/weapon/storage/briefcase/inflatable,
|
||||
prob(5);/obj/item/weapon/storage/backpack/industrial,
|
||||
prob(5);/obj/item/weapon/storage/backpack/satchel/eng,
|
||||
prob(5);/obj/item/weapon/storage/backpack/messenger/engi,
|
||||
prob(3);/obj/item/weapon/storage/backpack/dufflebag/eng,
|
||||
prob(5);/obj/item/weapon/storage/box,
|
||||
prob(3);/obj/item/weapon/storage/box/engineer,
|
||||
prob(2);/obj/item/weapon/storage/belt/utility/full,
|
||||
prob(3);/obj/item/weapon/storage/belt/utility,
|
||||
prob(3);/obj/item/clothing/head/beret/engineering,
|
||||
prob(3);/obj/item/clothing/head/soft/yellow,
|
||||
prob(2);/obj/item/clothing/head/orangebandana,
|
||||
prob(2);/obj/item/clothing/head/hardhat/dblue,
|
||||
prob(2);/obj/item/clothing/head/hardhat/orange,
|
||||
prob(1);/obj/item/clothing/glasses/welding,
|
||||
prob(2);/obj/item/clothing/head/welding,
|
||||
prob(4);/obj/item/clothing/suit/storage/hazardvest,
|
||||
prob(2);/obj/item/clothing/under/overalls,
|
||||
prob(3);/obj/item/clothing/shoes/workboots,
|
||||
prob(1);/obj/item/clothing/shoes/magboots,
|
||||
prob(2);/obj/item/clothing/accessory/storage/black_vest,
|
||||
prob(2);/obj/item/clothing/accessory/storage/brown_vest,
|
||||
prob(1);/obj/item/clothing/accessory/storage/brown_drop_pouches,
|
||||
prob(3);/obj/item/clothing/ears/earmuffs,
|
||||
prob(1);/obj/item/weapon/beartrap,
|
||||
prob(2);/obj/item/weapon/handcuffs)
|
||||
|
||||
/obj/random/maintenance/research
|
||||
/*Maintenance loot list. This one is for around medical areas*/
|
||||
name = "random research maintenance item"
|
||||
desc = "This is a random research maintenance item."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "gift1"
|
||||
|
||||
/obj/random/maintenance/research/item_to_spawn()
|
||||
return pick(prob(320);/obj/random/maintenance/clean,
|
||||
prob(3);/obj/item/device/analyzer/plant_analyzer,
|
||||
prob(2);/obj/item/device/analyzer/xeno_analyzer,
|
||||
prob(1);/obj/item/device/flash/synthetic,
|
||||
prob(2);/obj/item/weapon/bucket_sensor,
|
||||
prob(1);/obj/item/weapon/cell/device/weapon,
|
||||
prob(5);/obj/item/weapon/storage/backpack/toxins,
|
||||
prob(5);/obj/item/weapon/storage/backpack/satchel/tox,
|
||||
prob(5);/obj/item/weapon/storage/backpack/messenger/tox,
|
||||
prob(2);/obj/item/weapon/storage/excavation,
|
||||
prob(1);/obj/item/weapon/storage/backpack/holding,
|
||||
prob(3);/obj/item/weapon/storage/box/beakers,
|
||||
prob(3);/obj/item/weapon/storage/box/syringes,
|
||||
prob(3);/obj/item/weapon/storage/box/gloves,
|
||||
prob(2);/obj/item/clothing/gloves/latex,
|
||||
prob(4);/obj/item/clothing/glasses/science,
|
||||
prob(3);/obj/item/clothing/glasses/material,
|
||||
prob(1);/obj/item/clothing/head/beret/purple,
|
||||
prob(1);/obj/item/clothing/head/bio_hood/scientist,
|
||||
prob(4);/obj/item/clothing/suit/storage/toggle/labcoat,
|
||||
prob(4);/obj/item/clothing/suit/storage/toggle/labcoat/science,
|
||||
prob(1);/obj/item/clothing/suit/bio_suit/scientist,
|
||||
prob(4);/obj/item/clothing/under/rank/scientist,
|
||||
prob(2);/obj/item/clothing/under/rank/scientist_new)
|
||||
|
||||
/obj/random/maintenance/cargo
|
||||
/*Maintenance loot list. This one is for around cargo areas*/
|
||||
name = "random cargo maintenance item"
|
||||
desc = "This is a random cargo maintenance item."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "gift1"
|
||||
|
||||
/obj/random/maintenance/cargo/item_to_spawn()
|
||||
return pick(prob(320);/obj/random/maintenance/clean,
|
||||
prob(3);/obj/item/device/flashlight/lantern,
|
||||
prob(4);/obj/item/weapon/pickaxe,
|
||||
prob(5);/obj/item/weapon/storage/backpack/industrial,
|
||||
prob(5);/obj/item/weapon/storage/backpack/satchel/norm,
|
||||
prob(3);/obj/item/weapon/storage/backpack/dufflebag,
|
||||
prob(1);/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,
|
||||
prob(1);/obj/item/weapon/storage/toolbox/syndicate,
|
||||
prob(1);/obj/item/weapon/storage/belt/utility/full,
|
||||
prob(2);/obj/item/weapon/storage/belt/utility,
|
||||
prob(4);/obj/item/device/toner,
|
||||
prob(1);/obj/item/device/destTagger,
|
||||
prob(3);/obj/item/clothing/glasses/material,
|
||||
prob(3);/obj/item/clothing/head/soft/yellow,
|
||||
prob(4);/obj/item/clothing/suit/storage/hazardvest,
|
||||
prob(3);/obj/item/clothing/suit/apron/overalls,
|
||||
prob(4);/obj/item/clothing/suit/apron,
|
||||
prob(2);/obj/item/clothing/under/syndicate/tacticool,
|
||||
prob(1);/obj/item/clothing/under/syndicate/combat,
|
||||
prob(2);/obj/item/clothing/accessory/storage/black_vest,
|
||||
prob(2);/obj/item/clothing/accessory/storage/brown_vest,
|
||||
prob(3);/obj/item/clothing/ears/earmuffs,
|
||||
prob(1);/obj/item/weapon/beartrap,
|
||||
prob(2);/obj/item/weapon/handcuffs,)
|
||||
|
||||
var/list/random_junk_
|
||||
var/list/random_useful_
|
||||
/proc/get_random_useful_type()
|
||||
if(!random_useful_)
|
||||
random_useful_ = subtypesof(/obj/item/weapon/pen/crayon)
|
||||
random_useful_ += /obj/item/weapon/pen
|
||||
random_useful_ += /obj/item/weapon/pen/blue
|
||||
random_useful_ += /obj/item/weapon/pen/red
|
||||
random_useful_ += /obj/item/weapon/pen/multi
|
||||
random_useful_ += /obj/item/weapon/storage/box/matches
|
||||
random_useful_ += /obj/item/stack/material/cardboard
|
||||
return pick(random_useful_)
|
||||
|
||||
/proc/get_random_junk_type()
|
||||
if(prob(20)) // Misc. clutter
|
||||
return /obj/effect/decal/cleanable/generic
|
||||
if(prob(70)) // Misc. junk
|
||||
if(!random_junk_)
|
||||
random_junk_ = subtypesof(/obj/item/trash)
|
||||
random_junk_ += typesof(/obj/item/weapon/cigbutt)
|
||||
random_junk_ += /obj/effect/decal/cleanable/spiderling_remains
|
||||
random_junk_ += /obj/effect/decal/remains/mouse
|
||||
random_junk_ += /obj/effect/decal/remains/robot
|
||||
random_junk_ += /obj/item/weapon/paper/crumpled
|
||||
random_junk_ += /obj/item/inflatable/torn
|
||||
random_junk_ += /obj/effect/decal/cleanable/molten_item
|
||||
random_junk_ += /obj/item/weapon/material/shard
|
||||
|
||||
random_junk_ -= /obj/item/trash/plate
|
||||
random_junk_ -= /obj/item/trash/snack_bowl
|
||||
random_junk_ -= /obj/item/trash/syndi_cakes
|
||||
random_junk_ -= /obj/item/trash/tray
|
||||
return pick(random_junk_)
|
||||
// Misc. actually useful stuff
|
||||
return get_random_useful_type()
|
||||
@@ -288,8 +288,8 @@
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
|
||||
/obj/structure/closet/attack_ai(mob/user)
|
||||
if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) // Robots can open/close it, but not the AI.
|
||||
/obj/structure/closet/attack_robot(mob/user)
|
||||
if(Adjacent(user))
|
||||
attack_hand(user)
|
||||
|
||||
/obj/structure/closet/relaymove(mob/user as mob)
|
||||
@@ -317,7 +317,7 @@
|
||||
if(!usr.canmove || usr.stat || usr.restrained())
|
||||
return
|
||||
|
||||
if(ishuman(usr))
|
||||
if(ishuman(usr) || isrobot(usr))
|
||||
src.add_fingerprint(usr)
|
||||
src.toggle(usr)
|
||||
else
|
||||
|
||||
@@ -118,4 +118,6 @@
|
||||
new /obj/item/clothing/glasses/sunglasses/big(src)
|
||||
new /obj/item/clothing/glasses/sunglasses/big(src)
|
||||
new /obj/item/clothing/under/lawyer/blue(src)
|
||||
new /obj/item/clothing/under/lawyer/blue(src)
|
||||
new /obj/item/clothing/under/lawyer/blue(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
@@ -32,6 +32,7 @@
|
||||
new /obj/item/clothing/suit/storage/hazardvest(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/weapon/weldingtool/experimental(src)
|
||||
new /obj/item/device/flash(src)
|
||||
new /obj/item/taperoll/engineering(src)
|
||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
|
||||
|
||||
@@ -236,6 +236,37 @@
|
||||
req_access = list(access_chemistry)
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/clothing/under/rank/psych(src)
|
||||
new /obj/item/clothing/under/rank/psych/turtleneck(src)
|
||||
new /obj/item/clothing/suit/straight_jacket(src)
|
||||
new /obj/item/weapon/reagent_containers/glass/bottle/stoxin(src)
|
||||
new /obj/item/weapon/reagent_containers/syringe(src)
|
||||
new /obj/item/weapon/storage/pill_bottle/citalopram(src)
|
||||
new /obj/item/weapon/reagent_containers/pill/methylphenidate(src)
|
||||
new /obj/item/weapon/clipboard(src)
|
||||
new /obj/item/weapon/folder/white(src)
|
||||
new /obj/item/device/taperecorder(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
new /obj/item/device/camera(src)
|
||||
new /obj/item/toy/therapy_blue(src)
|
||||
return
|
||||
|
||||
/obj/structure/closet/secure_closet/psych
|
||||
name = "psychiatric closet"
|
||||
desc = "Store psychology tools and medicines in here."
|
||||
icon_state = "medical1"
|
||||
icon_closed = "medical"
|
||||
icon_locked = "medical1"
|
||||
icon_opened = "medicalopen"
|
||||
icon_broken = "medicalbroken"
|
||||
icon_off = "medicaloff"
|
||||
req_access = list(access_psychiatrist)
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/storage/box/pillbottles(src)
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
if(!usr.canmove || usr.stat || usr.restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
|
||||
return
|
||||
|
||||
if(ishuman(usr))
|
||||
if(ishuman(usr) || isrobot(usr))
|
||||
src.add_fingerprint(usr)
|
||||
src.togglelock(usr)
|
||||
else
|
||||
|
||||
@@ -280,6 +280,10 @@
|
||||
new /obj/item/device/flashlight/maglight(src)
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/flask/detflask(src)
|
||||
new /obj/item/weapon/storage/briefcase/crimekit(src)
|
||||
new /obj/item/device/taperecorder(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
new /obj/item/device/tape/random(src)
|
||||
return
|
||||
|
||||
/obj/structure/closet/secure_closet/detective/update_icon()
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
if(!usr.canmove || usr.stat || usr.restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
|
||||
return
|
||||
|
||||
if(ishuman(usr))
|
||||
if(ishuman(usr) || isrobot(usr))
|
||||
src.add_fingerprint(usr)
|
||||
src.togglelock(usr)
|
||||
else
|
||||
|
||||
@@ -138,14 +138,20 @@
|
||||
bound_width = world.icon_size
|
||||
bound_height = width * world.icon_size
|
||||
|
||||
/obj/structure/door_assembly/proc/rename_door(mob/living/user)
|
||||
var/t = sanitizeSafe(input(user, "Enter the name for the windoor.", src.name, src.created_name), MAX_NAME_LEN)
|
||||
if(!in_range(src, user) && src.loc != user) return
|
||||
created_name = t
|
||||
update_state()
|
||||
|
||||
/obj/structure/door_assembly/attack_robot(mob/living/silicon/robot/user)
|
||||
if(Adjacent(user) && (user.module && (istype(user.module,/obj/item/weapon/robot_module/robot/engineering/general)) \
|
||||
|| istype(user.module,/obj/item/weapon/robot_module/drone))) //Only dron (and engiborg) needs this.
|
||||
rename_door(user)
|
||||
|
||||
/obj/structure/door_assembly/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/pen))
|
||||
var/t = sanitizeSafe(input(user, "Enter the name for the door.", src.name, src.created_name), MAX_NAME_LEN)
|
||||
if(!t) return
|
||||
if(!in_range(src, usr) && src.loc != usr) return
|
||||
created_name = t
|
||||
rename_door(user)
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/weldingtool) && ( (istext(glass)) || (glass == 1) || (!anchored) ))
|
||||
@@ -156,7 +162,7 @@
|
||||
user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly.")
|
||||
if(do_after(user, 40))
|
||||
if(!src || !WT.isOn()) return
|
||||
user << "<span class='notice'>You welded the [glass] plating off!</span>"
|
||||
to_chat(user, "<span class='notice'>You welded the [glass] plating off!</span>")
|
||||
var/M = text2path("/obj/item/stack/material/[glass]")
|
||||
new M(src.loc, 2)
|
||||
glass = 0
|
||||
@@ -164,18 +170,18 @@
|
||||
user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly.")
|
||||
if(do_after(user, 40))
|
||||
if(!src || !WT.isOn()) return
|
||||
user << "<span class='notice'>You welded the glass panel out!</span>"
|
||||
to_chat(user, "<span class='notice'>You welded the glass panel out!</span>")
|
||||
new /obj/item/stack/material/glass/reinforced(src.loc)
|
||||
glass = 0
|
||||
else if(!anchored)
|
||||
user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.")
|
||||
if(do_after(user, 40))
|
||||
if(!src || !WT.isOn()) return
|
||||
user << "<span class='notice'>You dissasembled the airlock assembly!</span>"
|
||||
to_chat(user, "<span class='notice'>You dissasembled the airlock assembly!</span>")
|
||||
new /obj/item/stack/material/steel(src.loc, 4)
|
||||
qdel (src)
|
||||
else
|
||||
user << "<span class='notice'>You need more welding fuel.</span>"
|
||||
to_chat(user, "<span class='notice'>You need more welding fuel.</span>")
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/weapon/wrench) && state == 0)
|
||||
@@ -187,19 +193,19 @@
|
||||
|
||||
if(do_after(user, 40))
|
||||
if(!src) return
|
||||
user << "<span class='notice'>You [anchored? "un" : ""]secured the airlock assembly!</span>"
|
||||
to_chat(user, "<span class='notice'>You [anchored? "un" : ""]secured the airlock assembly!</span>")
|
||||
anchored = !anchored
|
||||
|
||||
else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored)
|
||||
var/obj/item/stack/cable_coil/C = W
|
||||
if (C.get_amount() < 1)
|
||||
user << "<span class='warning'>You need one length of coil to wire the airlock assembly.</span>"
|
||||
to_chat(user, "<span class='warning'>You need one length of coil to wire the airlock assembly.</span>")
|
||||
return
|
||||
user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly.")
|
||||
if(do_after(user, 40) && state == 0 && anchored)
|
||||
if (C.use(1))
|
||||
src.state = 1
|
||||
user << "<span class='notice'>You wire the airlock.</span>"
|
||||
to_chat(user, "<span class='notice'>You wire the airlock.</span>")
|
||||
|
||||
else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 )
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
|
||||
@@ -207,7 +213,7 @@
|
||||
|
||||
if(do_after(user, 40))
|
||||
if(!src) return
|
||||
user << "<span class='notice'>You cut the airlock wires.!</span>"
|
||||
to_chat(user, "<span class='notice'>You cut the airlock wires.!</span>")
|
||||
new/obj/item/stack/cable_coil(src.loc, 1)
|
||||
src.state = 0
|
||||
|
||||
@@ -219,14 +225,14 @@
|
||||
if(!src) return
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
user << "<span class='notice'>You installed the airlock electronics!</span>"
|
||||
to_chat(user, "<span class='notice'>You installed the airlock electronics!</span>")
|
||||
src.state = 2
|
||||
src.electronics = W
|
||||
|
||||
else if(istype(W, /obj/item/weapon/crowbar) && state == 2 )
|
||||
//This should never happen, but just in case I guess
|
||||
if (!electronics)
|
||||
user << "<span class='notice'>There was nothing to remove.</span>"
|
||||
to_chat(user, "<span class='notice'>There was nothing to remove.</span>")
|
||||
src.state = 1
|
||||
return
|
||||
|
||||
@@ -235,7 +241,7 @@
|
||||
|
||||
if(do_after(user, 40))
|
||||
if(!src) return
|
||||
user << "<span class='notice'>You removed the airlock electronics!</span>"
|
||||
to_chat(user, "<span class='notice'>You removed the airlock electronics!</span>")
|
||||
src.state = 1
|
||||
electronics.loc = src.loc
|
||||
electronics = null
|
||||
@@ -250,28 +256,28 @@
|
||||
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
|
||||
if(do_after(user, 40) && !glass)
|
||||
if (S.use(1))
|
||||
user << "<span class='notice'>You installed reinforced glass windows into the airlock assembly.</span>"
|
||||
to_chat(user, "<span class='notice'>You installed reinforced glass windows into the airlock assembly.</span>")
|
||||
glass = 1
|
||||
else if(material_name)
|
||||
// Ugly hack, will suffice for now. Need to fix it upstream as well, may rewrite mineral walls. ~Z
|
||||
if(!(material_name in list("gold", "silver", "diamond", "uranium", "phoron", "sandstone")))
|
||||
user << "You cannot make an airlock out of that material."
|
||||
to_chat(user, "You cannot make an airlock out of that material.")
|
||||
return
|
||||
if(S.get_amount() >= 2)
|
||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
|
||||
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
|
||||
if(do_after(user, 40) && !glass)
|
||||
if (S.use(2))
|
||||
user << "<span class='notice'>You installed [material_display_name(material_name)] plating into the airlock assembly.</span>"
|
||||
to_chat(user, "<span class='notice'>You installed [material_display_name(material_name)] plating into the airlock assembly.</span>")
|
||||
glass = material_name
|
||||
|
||||
else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 )
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
|
||||
user << "<span class='notice'>Now finishing the airlock.</span>"
|
||||
to_chat(user, "<span class='notice'>Now finishing the airlock.</span>")
|
||||
|
||||
if(do_after(user, 40))
|
||||
if(!src) return
|
||||
user << "<span class='notice'>You finish the airlock!</span>"
|
||||
to_chat(user, "<span class='notice'>You finish the airlock!</span>")
|
||||
var/path
|
||||
if(istext(glass))
|
||||
path = text2path("/obj/machinery/door/airlock/[glass]")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user