Merge branch 'master' into upstream-merge-37529
This commit is contained in:
@@ -568,3 +568,9 @@ AI MODULES
|
||||
laws += generate_ion_law()
|
||||
..()
|
||||
laws = list()
|
||||
|
||||
/******************H.O.G.A.N.***************/
|
||||
|
||||
/obj/item/aiModule/core/full/hulkamania
|
||||
name = "'H.O.G.A.N.' Core AI Module"
|
||||
law_id = "hulkamania"
|
||||
|
||||
@@ -636,7 +636,7 @@ RLD
|
||||
if(useResource(launchcost, user))
|
||||
activate()
|
||||
to_chat(user, "<span class='notice'>You fire a glowstick!</span>")
|
||||
var/obj/item/device/flashlight/glowstick/G = new /obj/item/device/flashlight/glowstick(start)
|
||||
var/obj/item/flashlight/glowstick/G = new /obj/item/flashlight/glowstick(start)
|
||||
G.color = color_choice
|
||||
G.light_color = G.color
|
||||
G.throw_at(A, 9, 3, user)
|
||||
|
||||
@@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
||||
return "makepipe=[id]&type=[dirtype]"
|
||||
|
||||
/datum/pipe_info/meter
|
||||
icon_state = "meterX"
|
||||
icon_state = "meter"
|
||||
dirtype = PIPE_ONEDIR
|
||||
|
||||
/datum/pipe_info/meter/New(label)
|
||||
@@ -228,7 +228,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
var/datum/asset/assets = get_asset_datum(/datum/asset/simple/icon_states/multiple_icons/pipes)
|
||||
var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/pipes)
|
||||
assets.send(user)
|
||||
|
||||
ui = new(user, src, ui_key, "rpd", name, 300, 550, master_ui, state)
|
||||
|
||||
@@ -10,14 +10,14 @@
|
||||
materials = list(MAT_METAL=50, MAT_GLASS=50)
|
||||
|
||||
flags_1 = CONDUCT_1 | NOBLUDGEON_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
usesound = 'sound/effects/spray2.ogg'
|
||||
|
||||
var/obj/item/device/toner/ink = null
|
||||
var/obj/item/toner/ink = null
|
||||
|
||||
/obj/item/airlock_painter/New()
|
||||
..()
|
||||
ink = new /obj/item/device/toner(src)
|
||||
ink = new /obj/item/toner(src)
|
||||
|
||||
//This proc doesn't just check if the painter can be used, but also uses it.
|
||||
//Only call this if you are certain that the painter will be used right after this check!
|
||||
@@ -105,7 +105,7 @@
|
||||
|
||||
|
||||
/obj/item/airlock_painter/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/device/toner))
|
||||
if(istype(W, /obj/item/toner))
|
||||
if(ink)
|
||||
to_chat(user, "<span class='notice'>[src] already contains \a [ink].</span>")
|
||||
return
|
||||
|
||||
@@ -104,8 +104,7 @@
|
||||
to_chat(user, "<span class='warning'>There is another network terminal here!</span>")
|
||||
return
|
||||
else
|
||||
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(T)
|
||||
C.amount = 10
|
||||
new /obj/item/stack/cable_coil(T, 10)
|
||||
to_chat(user, "<span class='notice'>You cut the cables and disassemble the unused power terminal.</span>")
|
||||
qdel(E)
|
||||
return TRUE
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
item_state = "card-id"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
|
||||
slot_flags = SLOT_ID
|
||||
slot_flags = ITEM_SLOT_ID
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
var/mining_points = 0 //For redeeming at mining equipment vendors
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
slowdown = 1
|
||||
actions_types = list(/datum/action/item_action/equip_unequip_TED_Gun)
|
||||
var/obj/item/gun/energy/chrono_gun/PA = null
|
||||
@@ -38,7 +38,7 @@
|
||||
user.put_in_hands(PA)
|
||||
|
||||
/obj/item/chrono_eraser/item_action_slot_check(slot, mob/user)
|
||||
if(slot == slot_back)
|
||||
if(slot == SLOT_BACK)
|
||||
return 1
|
||||
|
||||
/obj/item/gun/energy/chrono_gun
|
||||
|
||||
@@ -86,7 +86,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
..()
|
||||
|
||||
/obj/item/proc/help_light_cig(mob/living/M)
|
||||
var/mask_item = M.get_item_by_slot(slot_wear_mask)
|
||||
var/mask_item = M.get_item_by_slot(SLOT_WEAR_MASK)
|
||||
if(istype(mask_item, /obj/item/clothing/mask/cigarette))
|
||||
return mask_item
|
||||
|
||||
@@ -129,7 +129,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
reagents.add_reagent_list(list_reagents)
|
||||
if(starts_lit)
|
||||
light()
|
||||
AddComponent(/datum/component/knockoff,90,list(BODY_ZONE_PRECISE_MOUTH),list(slot_wear_mask))//90% to knock off when wearing a mask
|
||||
AddComponent(/datum/component/knockoff,90,list(BODY_ZONE_PRECISE_MOUTH),list(SLOT_WEAR_MASK))//90% to knock off when wearing a mask
|
||||
|
||||
/obj/item/clothing/mask/cigarette/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
@@ -314,6 +314,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
src.pixel_x = rand(-5, 5)
|
||||
src.pixel_y = rand(-5, 5)
|
||||
|
||||
/obj/item/clothing/mask/cigarette/rollie/nicotine
|
||||
list_reagents = list("nicotine" = 15)
|
||||
|
||||
/obj/item/clothing/mask/cigarette/rollie/trippy
|
||||
list_reagents = list("nicotine" = 15, "mushroomhallucinogen" = 35)
|
||||
starts_lit = TRUE
|
||||
@@ -486,7 +489,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
item_state = "zippo"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
var/lit = 0
|
||||
var/fancy = TRUE
|
||||
heat = 1500
|
||||
@@ -706,7 +709,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
to_chat(user, "<span class='notice'>You close the cap on [src].</span>")
|
||||
cut_overlays()
|
||||
|
||||
if(istype(O, /obj/item/device/multitool))
|
||||
if(istype(O, /obj/item/multitool))
|
||||
if(screw && !(obj_flags & EMAGGED))//also kinky
|
||||
if(!super)
|
||||
cut_overlays()
|
||||
@@ -746,7 +749,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
return
|
||||
|
||||
/obj/item/clothing/mask/vape/equipped(mob/user, slot)
|
||||
if(slot == slot_wear_mask)
|
||||
if(slot == SLOT_WEAR_MASK)
|
||||
if(!screw)
|
||||
to_chat(user, "<span class='notice'>You start puffing on the vape.</span>")
|
||||
reagents.set_reacting(TRUE)
|
||||
@@ -756,7 +759,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
|
||||
/obj/item/clothing/mask/vape/dropped(mob/user)
|
||||
var/mob/living/carbon/C = user
|
||||
if(C.get_item_by_slot(slot_wear_mask) == src)
|
||||
if(C.get_item_by_slot(SLOT_WEAR_MASK) == src)
|
||||
reagents.set_reacting(FALSE)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
|
||||
@@ -154,6 +154,10 @@
|
||||
name = "Labor Camp teleporter console (Computer Board)"
|
||||
build_path = /obj/machinery/computer/gulag_teleporter_computer
|
||||
|
||||
/obj/item/circuitboard/computer/rdconsole/production
|
||||
name = "R&D Console Production Only (Computer Board)"
|
||||
build_path = /obj/machinery/computer/rdconsole/production
|
||||
|
||||
/obj/item/circuitboard/computer/rdconsole
|
||||
name = "R&D Console (Computer Board)"
|
||||
build_path = /obj/machinery/computer/rdconsole/core
|
||||
@@ -224,10 +228,6 @@
|
||||
name = "Supply Request Console (Computer Board)"
|
||||
build_path = /obj/machinery/computer/cargo/request
|
||||
|
||||
/obj/item/circuitboard/computer/stockexchange
|
||||
name = "circuit board (Stock Exchange Console)"
|
||||
build_path = /obj/machinery/computer/stockexchange
|
||||
|
||||
/obj/item/circuitboard/computer/operating
|
||||
name = "Operating Computer (Computer Board)"
|
||||
build_path = /obj/machinery/computer/operating
|
||||
|
||||
@@ -204,6 +204,7 @@
|
||||
|
||||
/obj/item/circuitboard/machine/vendor
|
||||
name = "Booze-O-Mat Vendor (Machine Board)"
|
||||
desc = "You can turn the \"brand selection\" dial using a screwdriver."
|
||||
build_path = /obj/machinery/vending/boozeomat
|
||||
req_components = list(
|
||||
/obj/item/vending_refill/boozeomat = 3)
|
||||
@@ -449,7 +450,7 @@
|
||||
/obj/item/stock_parts/matter_bin = 1,
|
||||
/obj/item/stock_parts/micro_laser = 1,
|
||||
/obj/item/stock_parts/manipulator = 1,
|
||||
/obj/item/device/assembly/igniter = 1)
|
||||
/obj/item/assembly/igniter = 1)
|
||||
needs_anchored = FALSE
|
||||
|
||||
/obj/item/circuitboard/machine/mining_equipment_vendor
|
||||
@@ -650,6 +651,7 @@
|
||||
/obj/item/circuitboard/machine/chem_master
|
||||
name = "ChemMaster 3000 (Machine Board)"
|
||||
build_path = /obj/machinery/chem_master
|
||||
desc = "You can turn the \"mode selection\" dial using a screwdriver."
|
||||
req_components = list(
|
||||
/obj/item/reagent_containers/glass/beaker = 2,
|
||||
/obj/item/stock_parts/manipulator = 1,
|
||||
@@ -839,6 +841,13 @@
|
||||
/obj/item/stack/sheet/glass = 1,
|
||||
/obj/item/vending_refill/donksoft = 3)
|
||||
|
||||
/obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor
|
||||
name = "Syndicate Donksoft Toy Vendor (Machine Board)"
|
||||
build_path = /obj/machinery/vending/toyliberationstation
|
||||
req_components = list(
|
||||
/obj/item/stack/sheet/glass = 1,
|
||||
/obj/item/vending_refill/donksoft = 3)
|
||||
|
||||
/obj/item/circuitboard/machine/dish_drive
|
||||
name = "Dish Drive (Machine Board)"
|
||||
build_path = /obj/machinery/dish_drive
|
||||
@@ -864,3 +873,17 @@
|
||||
return
|
||||
transmit = !transmit
|
||||
to_chat(user, "<span class='notice'>You [transmit ? "enable" : "disable"] the board's automatic disposal transmission.</span>")
|
||||
|
||||
/obj/item/circuitboard/machine/stacking_unit_console
|
||||
name = "Stacking Machine Console (Machine Board)"
|
||||
build_path = /obj/machinery/mineral/stacking_unit_console
|
||||
req_components = list(
|
||||
/obj/item/stack/sheet/glass = 2,
|
||||
/obj/item/stack/cable_coil = 5)
|
||||
|
||||
/obj/item/circuitboard/machine/stacking_machine
|
||||
name = "Stacking Machine (Machine Board)"
|
||||
build_path = /obj/machinery/mineral/stacking_machine
|
||||
req_components = list(
|
||||
/obj/item/stock_parts/manipulator = 2,
|
||||
/obj/item/stock_parts/matter_bin = 2)
|
||||
|
||||
@@ -116,8 +116,9 @@
|
||||
. = ..()
|
||||
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50)
|
||||
|
||||
/obj/item/weapon/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user)
|
||||
/obj/item/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user)
|
||||
M.SendSignal(COMSIG_ADD_MOOD_EVENT, "honk", /datum/mood_event/honk)
|
||||
return ..()
|
||||
|
||||
/obj/item/bikehorn/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] solemnly points the horn at [user.p_their()] temple! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
|
||||
@@ -43,13 +43,13 @@
|
||||
|
||||
switch(mode)
|
||||
if(WAND_OPEN)
|
||||
data.plaintext_data = "open"
|
||||
data.data["data"] = "open"
|
||||
if(WAND_BOLT)
|
||||
data.plaintext_data = "bolt"
|
||||
data.data["data"] = "bolt"
|
||||
if(WAND_EMERGENCY)
|
||||
data.plaintext_data = "emergency"
|
||||
data.data["data"] = "emergency"
|
||||
|
||||
data.plaintext_data_secondary = "toggle"
|
||||
data.data["data_secondary"] = "toggle"
|
||||
data.passkey = access_list
|
||||
|
||||
ntnet_send(data)
|
||||
|
||||
@@ -247,6 +247,8 @@
|
||||
var/cost = 1
|
||||
if(paint_mode == PAINT_LARGE_HORIZONTAL)
|
||||
cost = 5
|
||||
if(istype(target, /obj/item/canvas))
|
||||
cost = 0
|
||||
var/charges_used = use_charges(user, cost)
|
||||
if(!charges_used)
|
||||
return
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
item_state = "defibunit"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
force = 5
|
||||
throwforce = 6
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
@@ -46,11 +46,11 @@
|
||||
update_charge()
|
||||
|
||||
/obj/item/defibrillator/proc/update_power()
|
||||
if(cell)
|
||||
if(cell.charge < paddles.revivecost)
|
||||
if(!QDELETED(cell))
|
||||
if(QDELETED(paddles) || cell.charge < paddles.revivecost)
|
||||
powered = FALSE
|
||||
else
|
||||
powered = 1
|
||||
powered = TRUE
|
||||
else
|
||||
powered = FALSE
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
|
||||
/obj/item/defibrillator/proc/update_charge()
|
||||
if(powered) //so it doesn't show charge if it's unpowered
|
||||
if(cell)
|
||||
if(!QDELETED(cell))
|
||||
var/ratio = cell.charge / cell.maxcharge
|
||||
ratio = CEILING(ratio*4, 1) * 25
|
||||
add_overlay("[initial(icon_state)]-charge[ratio]")
|
||||
@@ -83,14 +83,14 @@
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/defibrillator/attack_hand(mob/user)
|
||||
if(loc == user)
|
||||
if(slot_flags == SLOT_BACK)
|
||||
if(user.get_item_by_slot(slot_back) == src)
|
||||
if(slot_flags == ITEM_SLOT_BACK)
|
||||
if(user.get_item_by_slot(SLOT_BACK) == src)
|
||||
ui_action_click()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Put the defibrillator on your back first!</span>")
|
||||
|
||||
else if(slot_flags == SLOT_BELT)
|
||||
if(user.get_item_by_slot(slot_belt) == src)
|
||||
else if(slot_flags == ITEM_SLOT_BELT)
|
||||
if(user.get_item_by_slot(SLOT_BELT) == src)
|
||||
ui_action_click()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Strap the defibrillator's belt on first!</span>")
|
||||
@@ -170,7 +170,6 @@
|
||||
to_chat(user, "<span class='warning'>You need a free hand to hold the paddles!</span>")
|
||||
update_icon()
|
||||
return
|
||||
paddles.forceMove(user)
|
||||
else
|
||||
//Remove from their hands and back onto the defib unit
|
||||
paddles.unwield()
|
||||
@@ -186,7 +185,7 @@
|
||||
|
||||
/obj/item/defibrillator/equipped(mob/user, slot)
|
||||
..()
|
||||
if((slot_flags == SLOT_BACK && slot != slot_back) || (slot_flags == SLOT_BELT && slot != slot_belt))
|
||||
if((slot_flags == ITEM_SLOT_BACK && slot != SLOT_BACK) || (slot_flags == ITEM_SLOT_BELT && slot != SLOT_BELT))
|
||||
remove_paddles(user)
|
||||
update_icon()
|
||||
|
||||
@@ -239,7 +238,7 @@
|
||||
icon_state = "defibcompact"
|
||||
item_state = "defibcompact"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
|
||||
/obj/item/defibrillator/compact/item_action_slot_check(slot, mob/user)
|
||||
if(slot == user.getBeltSlot())
|
||||
@@ -276,8 +275,8 @@
|
||||
name = "defibrillator paddles"
|
||||
desc = "A pair of plastic-gripped paddles with flat metal surfaces that are used to deliver powerful electric shocks."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "defibpaddles"
|
||||
item_state = "defibpaddles"
|
||||
icon_state = "defibpaddles0"
|
||||
item_state = "defibpaddles0"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
|
||||
|
||||
@@ -9,8 +9,9 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
#define PDA_SCANNER_REAGENT 3
|
||||
#define PDA_SCANNER_HALOGEN 4
|
||||
#define PDA_SCANNER_GAS 5
|
||||
#define PDA_SPAM_DELAY 2 MINUTES
|
||||
|
||||
/obj/item/device/pda
|
||||
/obj/item/pda
|
||||
name = "\improper PDA"
|
||||
desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge."
|
||||
icon = 'icons/obj/pda.dmi'
|
||||
@@ -20,7 +21,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
flags_1 = NOBLUDGEON_1
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
slot_flags = SLOT_ID | SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
@@ -52,6 +53,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
var/toff = FALSE //If TRUE, messenger disabled
|
||||
var/tnote = null //Current Texts
|
||||
var/last_text //No text spamming
|
||||
var/last_everyone //No text for everyone spamming
|
||||
var/last_noise //Also no honk spamming that's bad too
|
||||
var/ttone = "beep" //The ringtone!
|
||||
var/lock_code = "" // Lockcode to unlock uplink
|
||||
@@ -68,17 +70,17 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
var/obj/item/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both.
|
||||
var/ownjob = null //related to above
|
||||
|
||||
var/obj/item/device/paicard/pai = null // A slot for a personal AI device
|
||||
var/obj/item/paicard/pai = null // A slot for a personal AI device
|
||||
|
||||
var/icon/photo //Scanned photo
|
||||
|
||||
var/list/contained_item = list(/obj/item/pen, /obj/item/toy/crayon, /obj/item/lipstick, /obj/item/device/flashlight/pen, /obj/item/clothing/mask/cigarette)
|
||||
var/list/contained_item = list(/obj/item/pen, /obj/item/toy/crayon, /obj/item/lipstick, /obj/item/flashlight/pen, /obj/item/clothing/mask/cigarette)
|
||||
var/obj/item/inserted_item //Used for pen, crayon, and lipstick insertion or removal. Same as above.
|
||||
var/overlays_x_offset = 0 //x offset to use for certain overlays
|
||||
|
||||
var/underline_flag = TRUE //flag for underline
|
||||
|
||||
/obj/item/device/pda/suicide_act(mob/living/carbon/user)
|
||||
/obj/item/pda/suicide_act(mob/living/carbon/user)
|
||||
var/deathMessage = msg_input(user)
|
||||
if (!deathMessage)
|
||||
deathMessage = "i ded"
|
||||
@@ -86,14 +88,14 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
tnote += "<i><b>→ To The Grim Reaper:</b></i><br>[deathMessage]<br>"//records a message in their PDA as being sent to the grim reaper
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/device/pda/examine(mob/user)
|
||||
/obj/item/pda/examine(mob/user)
|
||||
..()
|
||||
if(!id && !inserted_item)
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Alt-click to remove contents.</span>")
|
||||
|
||||
/obj/item/device/pda/Initialize()
|
||||
/obj/item/pda/Initialize()
|
||||
. = ..()
|
||||
if(fon)
|
||||
set_light(f_lum)
|
||||
@@ -107,7 +109,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
inserted_item = new /obj/item/pen(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/pda/equipped(mob/user, slot)
|
||||
/obj/item/pda/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(!equipped)
|
||||
if(user.client)
|
||||
@@ -130,19 +132,19 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
font_mode = FONT_MONO
|
||||
equipped = TRUE
|
||||
|
||||
/obj/item/device/pda/proc/update_label()
|
||||
/obj/item/pda/proc/update_label()
|
||||
name = "PDA-[owner] ([ownjob])" //Name generalisation
|
||||
|
||||
/obj/item/device/pda/GetAccess()
|
||||
/obj/item/pda/GetAccess()
|
||||
if(id)
|
||||
return id.GetAccess()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/pda/GetID()
|
||||
/obj/item/pda/GetID()
|
||||
return id
|
||||
|
||||
/obj/item/device/pda/update_icon()
|
||||
/obj/item/pda/update_icon()
|
||||
cut_overlays()
|
||||
var/mutable_appearance/overlay = new()
|
||||
overlay.pixel_x = overlays_x_offset
|
||||
@@ -163,33 +165,33 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
overlay.icon_state = "pai_off_overlay"
|
||||
add_overlay(new /mutable_appearance(overlay))
|
||||
|
||||
/obj/item/device/pda/MouseDrop(obj/over_object, src_location, over_location)
|
||||
/obj/item/pda/MouseDrop(obj/over_object, src_location, over_location)
|
||||
var/mob/M = usr
|
||||
if((!istype(over_object, /obj/screen)) && usr.canUseTopic(src))
|
||||
return attack_self(M)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/pda/attack_self(mob/user)
|
||||
/obj/item/pda/attack_self(mob/user)
|
||||
if(!user.IsAdvancedToolUser())
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
. = ..()
|
||||
|
||||
var/datum/asset/assets = get_asset_datum(/datum/asset/simple/pda)
|
||||
var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/simple/pda)
|
||||
assets.send(user)
|
||||
|
||||
user.set_machine(src)
|
||||
|
||||
var/dat = "<!DOCTYPE html><html><head><title>Personal Data Assistant</title><link href=\"https://fonts.googleapis.com/css?family=Orbitron|Share+Tech+Mono|VT323\" rel=\"stylesheet\"></head><body bgcolor=\"" + background_color + "\"><style>body{" + font_mode + "}ul,ol{list-style-type: none;}a, a:link, a:visited, a:active, a:hover { color: #000000;text-decoration:none; }img {border-style:none;}a img{padding-right: 9px;}</style>"
|
||||
dat += assets.css_tag()
|
||||
|
||||
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Refresh'><img src=pda_refresh.png>Refresh</a>"
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Refresh'>[PDAIMG(refresh)]Refresh</a>"
|
||||
|
||||
if ((!isnull(cartridge)) && (mode == 0))
|
||||
dat += " | <a href='byond://?src=[REF(src)];choice=Eject'><img src=pda_eject.png>Eject [cartridge]</a>"
|
||||
dat += " | <a href='byond://?src=[REF(src)];choice=Eject'>[PDAIMG(eject)]Eject [cartridge]</a>"
|
||||
if (mode)
|
||||
dat += " | <a href='byond://?src=[REF(src)];choice=Return'><img src=pda_menu.png>Return</a>"
|
||||
dat += " | <a href='byond://?src=[REF(src)];choice=Return'>[PDAIMG(menu)]Return</a>"
|
||||
|
||||
if (mode == 0)
|
||||
dat += "<div align=\"center\">"
|
||||
@@ -203,7 +205,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
|
||||
if (!owner)
|
||||
dat += "Warning: No owner information entered. Please swipe card.<br><br>"
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Refresh'><img src=pda_refresh.png>Retry</a>"
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Refresh'>[PDAIMG(refresh)]Retry</a>"
|
||||
else
|
||||
switch (mode)
|
||||
if (0)
|
||||
@@ -219,38 +221,38 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
|
||||
dat += "<h4>General Functions</h4>"
|
||||
dat += "<ul>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=1'><img src=pda_notes.png>Notekeeper</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=2'><img src=pda_mail.png>Messenger</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=1'>[PDAIMG(notes)]Notekeeper</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=2'>[PDAIMG(mail)]Messenger</a></li>"
|
||||
|
||||
if (cartridge)
|
||||
if (cartridge.access & CART_CLOWN)
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Honk'><img src=pda_honk.png>Honk Synthesizer</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Trombone'><img src=pda_honk.png>Sad Trombone</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Honk'>[PDAIMG(honk)]Honk Synthesizer</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Trombone'>[PDAIMG(honk)]Sad Trombone</a></li>"
|
||||
if (cartridge.access & CART_MANIFEST)
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=41'><img src=pda_notes.png>View Crew Manifest</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=41'>[PDAIMG(notes)]View Crew Manifest</a></li>"
|
||||
if(cartridge.access & CART_STATUS_DISPLAY)
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=42'><img src=pda_status.png>Set Status Display</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=42'>[PDAIMG(status)]Set Status Display</a></li>"
|
||||
dat += "</ul>"
|
||||
if (cartridge.access & CART_ENGINE)
|
||||
dat += "<h4>Engineering Functions</h4>"
|
||||
dat += "<ul>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=43'><img src=pda_power.png>Power Monitor</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=43'>[PDAIMG(power)]Power Monitor</a></li>"
|
||||
dat += "</ul>"
|
||||
if (cartridge.access & CART_MEDICAL)
|
||||
dat += "<h4>Medical Functions</h4>"
|
||||
dat += "<ul>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=44'><img src=pda_medical.png>Medical Records</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Medical Scan'><img src=pda_scanner.png>[scanmode == 1 ? "Disable" : "Enable"] Medical Scanner</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=44'>[PDAIMG(medical)]Medical Records</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Medical Scan'>[PDAIMG(scanner)][scanmode == 1 ? "Disable" : "Enable"] Medical Scanner</a></li>"
|
||||
dat += "</ul>"
|
||||
if (cartridge.access & CART_SECURITY)
|
||||
dat += "<h4>Security Functions</h4>"
|
||||
dat += "<ul>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=45'><img src=pda_cuffs.png>Security Records</A></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=45'>[PDAIMG(cuffs)]Security Records</A></li>"
|
||||
dat += "</ul>"
|
||||
if(cartridge.access & CART_QUARTERMASTER)
|
||||
dat += "<h4>Quartermaster Functions:</h4>"
|
||||
dat += "<ul>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=47'><img src=pda_crate.png>Supply Records</A></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=47'>[PDAIMG(crate)]Supply Records</A></li>"
|
||||
dat += "</ul>"
|
||||
dat += "</ul>"
|
||||
|
||||
@@ -258,25 +260,25 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
dat += "<ul>"
|
||||
if (cartridge)
|
||||
if(cartridge.bot_access_flags)
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=54'><img src=pda_medbot.png>Bots Access</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=54'>[PDAIMG(medbot)]Bots Access</a></li>"
|
||||
if (cartridge.access & CART_JANITOR)
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=49'><img src=pda_bucket.png>Custodial Locator</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=49'>[PDAIMG(bucket)]Custodial Locator</a></li>"
|
||||
if (istype(cartridge.radio))
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=40'><img src=pda_signaler.png>Signaler System</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=40'>[PDAIMG(signaler)]Signaler System</a></li>"
|
||||
if (cartridge.access & CART_NEWSCASTER)
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=53'><img src=pda_notes.png>Newscaster Access </a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=53'>[PDAIMG(notes)]Newscaster Access </a></li>"
|
||||
if (cartridge.access & CART_REAGENT_SCANNER)
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Reagent Scan'><img src=pda_reagent.png>[scanmode == 3 ? "Disable" : "Enable"] Reagent Scanner</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Reagent Scan'>[PDAIMG(reagent)][scanmode == 3 ? "Disable" : "Enable"] Reagent Scanner</a></li>"
|
||||
if (cartridge.access & CART_ENGINE)
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Halogen Counter'><img src=pda_reagent.png>[scanmode == 4 ? "Disable" : "Enable"] Halogen Counter</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Halogen Counter'>[PDAIMG(reagent)][scanmode == 4 ? "Disable" : "Enable"] Halogen Counter</a></li>"
|
||||
if (cartridge.access & CART_ATMOS)
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Gas Scan'><img src=pda_reagent.png>[scanmode == 5 ? "Disable" : "Enable"] Gas Scanner</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Gas Scan'>[PDAIMG(reagent)][scanmode == 5 ? "Disable" : "Enable"] Gas Scanner</a></li>"
|
||||
if (cartridge.access & CART_REMOTE_DOOR)
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Toggle Door'><img src=pda_rdoor.png>Toggle Remote Door</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Toggle Door'>[PDAIMG(rdoor)]Toggle Remote Door</a></li>"
|
||||
if (cartridge.access & CART_DRONEPHONE)
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Drone Phone'><img src=pda_dronephone.png>Drone Phone</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=3'><img src=pda_atmos.png>Atmospheric Scan</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Light'><img src=pda_flashlight.png>[fon ? "Disable" : "Enable"] Flashlight</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Drone Phone'>[PDAIMG(dronephone)]Drone Phone</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=3'>[PDAIMG(atmos)]Atmospheric Scan</a></li>"
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Light'>[PDAIMG(flashlight)][fon ? "Disable" : "Enable"] Flashlight</a></li>"
|
||||
if (pai)
|
||||
if(pai.loc != src)
|
||||
pai = null
|
||||
@@ -287,29 +289,29 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
dat += "</ul>"
|
||||
|
||||
if (1)
|
||||
dat += "<h4><img src=pda_notes.png> Notekeeper V2.2</h4>"
|
||||
dat += "<h4>[PDAIMG(notes)] Notekeeper V2.2</h4>"
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Edit'>Edit</a><br>"
|
||||
if(notescanned)
|
||||
dat += "(This is a scanned image, editing it may cause some text formatting to change.)<br>"
|
||||
dat += "<HR><font face=\"[PEN_FONT]\">[(!notehtml ? note : notehtml)]</font>"
|
||||
|
||||
if (2)
|
||||
dat += "<h4><img src=pda_mail.png> SpaceMessenger V3.9.6</h4>"
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Toggle Ringer'><img src=pda_bell.png>Ringer: [silent == 1 ? "Off" : "On"]</a> | "
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Toggle Messenger'><img src=pda_mail.png>Send / Receive: [toff == 1 ? "Off" : "On"]</a> | "
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Ringtone'><img src=pda_bell.png>Set Ringtone</a> | "
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=21'><img src=pda_mail.png>Messages</a><br>"
|
||||
dat += "<h4>[PDAIMG(mail)] SpaceMessenger V3.9.6</h4>"
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Toggle Ringer'>[PDAIMG(bell)]Ringer: [silent == 1 ? "Off" : "On"]</a> | "
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Toggle Messenger'>[PDAIMG(mail)]Send / Receive: [toff == 1 ? "Off" : "On"]</a> | "
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Ringtone'>[PDAIMG(bell)]Set Ringtone</a> | "
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=21'>[PDAIMG(mail)]Messages</a><br>"
|
||||
|
||||
if(cartridge)
|
||||
dat += cartridge.message_header()
|
||||
|
||||
dat += "<h4><img src=pda_menu.png> Detected PDAs</h4>"
|
||||
dat += "<h4>[PDAIMG(menu)] Detected PDAs</h4>"
|
||||
|
||||
dat += "<ul>"
|
||||
var/count = 0
|
||||
|
||||
if (!toff)
|
||||
for (var/obj/item/device/pda/P in sortNames(get_viewable_pdas()))
|
||||
for (var/obj/item/pda/P in sortNames(get_viewable_pdas()))
|
||||
if (P == src)
|
||||
continue
|
||||
dat += "<li><a href='byond://?src=[REF(src)];choice=Message;target=[REF(P)]'>[P]</a>"
|
||||
@@ -324,16 +326,16 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=MessageAll'>Send To All</a>"
|
||||
|
||||
if(21)
|
||||
dat += "<h4><img src=pda_mail.png> SpaceMessenger V3.9.6</h4>"
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Clear'><img src=pda_blank.png>Clear Messages</a>"
|
||||
dat += "<h4>[PDAIMG(mail)] SpaceMessenger V3.9.6</h4>"
|
||||
dat += "<a href='byond://?src=[REF(src)];choice=Clear'>[PDAIMG(blank)]Clear Messages</a>"
|
||||
|
||||
dat += "<h4><img src=pda_mail.png> Messages</h4>"
|
||||
dat += "<h4>[PDAIMG(mail)] Messages</h4>"
|
||||
|
||||
dat += tnote
|
||||
dat += "<br>"
|
||||
|
||||
if (3)
|
||||
dat += "<h4><img src=pda_atmos.png> Atmospheric Readings</h4>"
|
||||
dat += "<h4>[PDAIMG(atmos)] Atmospheric Readings</h4>"
|
||||
|
||||
var/turf/T = user.loc
|
||||
if (isnull(T))
|
||||
@@ -368,7 +370,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
user << browse(dat, "window=pda;size=400x450;border=1;can_resize=1;can_minimize=0")
|
||||
onclose(user, "pda", src)
|
||||
|
||||
/obj/item/device/pda/Topic(href, href_list)
|
||||
/obj/item/pda/Topic(href, href_list)
|
||||
..()
|
||||
var/mob/living/U = usr
|
||||
//Looking for master was kind of pointless since PDAs don't appear to have one.
|
||||
@@ -586,7 +588,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
U << browse(null, "window=pda")
|
||||
return
|
||||
|
||||
/obj/item/device/pda/proc/remove_id()
|
||||
/obj/item/pda/proc/remove_id()
|
||||
if (id)
|
||||
if (ismob(loc))
|
||||
var/mob/M = loc
|
||||
@@ -597,7 +599,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
id = null
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/pda/proc/msg_input(mob/living/U = usr)
|
||||
/obj/item/pda/proc/msg_input(mob/living/U = usr)
|
||||
var/t = stripped_input(U, "Please enter message", name)
|
||||
if (!t || toff)
|
||||
return
|
||||
@@ -609,16 +611,17 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
t = Gibberish(t, 100)
|
||||
return t
|
||||
|
||||
/obj/item/device/pda/proc/send_message(mob/living/user, list/obj/item/device/pda/targets)
|
||||
/obj/item/pda/proc/send_message(mob/living/user, list/obj/item/pda/targets, everyone)
|
||||
var/message = msg_input(user)
|
||||
if(!message || !targets.len)
|
||||
return
|
||||
if(last_text && world.time < last_text + 5)
|
||||
if((last_text && world.time < last_text + 10) || (everyone && last_everyone && world.time < last_everyone + PDA_SPAM_DELAY))
|
||||
return
|
||||
|
||||
if(prob(1))
|
||||
message += "\nSent from my PDA"
|
||||
// Send the signal
|
||||
var/list/string_targets = list()
|
||||
for (var/obj/item/device/pda/P in targets)
|
||||
for (var/obj/item/pda/P in targets)
|
||||
if (P.owner && P.ownjob) // != src is checked by the UI
|
||||
string_targets += "[P.owner] ([P.ownjob])"
|
||||
for (var/obj/machinery/computer/message_monitor/M in targets)
|
||||
@@ -658,8 +661,11 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
to_chat(user, "<span class='info'>Message sent to [target_text]: \"[message]\"</span>")
|
||||
// Reset the photo
|
||||
photo = null
|
||||
last_text = world.time
|
||||
if (everyone)
|
||||
last_everyone = world.time
|
||||
|
||||
/obj/item/device/pda/proc/receive_message(datum/signal/subspace/pda/signal)
|
||||
/obj/item/pda/proc/receive_message(datum/signal/subspace/pda/signal)
|
||||
tnote += "<i><b>← From <a href='byond://?src=[REF(src)];choice=Message;target=[REF(signal.source)]'>[signal.data["name"]]</a> ([signal.data["job"]]):</b></i><br>[signal.format_message()]<br>"
|
||||
|
||||
if (!silent)
|
||||
@@ -685,13 +691,16 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
update_icon()
|
||||
add_overlay(icon_alert)
|
||||
|
||||
/obj/item/device/pda/proc/send_to_all(mob/living/U)
|
||||
send_message(U,get_viewable_pdas())
|
||||
/obj/item/pda/proc/send_to_all(mob/living/U)
|
||||
if (last_everyone && world.time < last_everyone + PDA_SPAM_DELAY)
|
||||
to_chat(U,"<span class='warning'>Send To All function is still on cooldown.")
|
||||
return
|
||||
send_message(U,get_viewable_pdas(), TRUE)
|
||||
|
||||
/obj/item/device/pda/proc/create_message(mob/living/U, obj/item/device/pda/P)
|
||||
/obj/item/pda/proc/create_message(mob/living/U, obj/item/pda/P)
|
||||
send_message(U,list(P))
|
||||
|
||||
/obj/item/device/pda/AltClick()
|
||||
/obj/item/pda/AltClick()
|
||||
..()
|
||||
|
||||
if(issilicon(usr))
|
||||
@@ -703,7 +712,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
else
|
||||
remove_pen()
|
||||
|
||||
/obj/item/device/pda/verb/verb_remove_id()
|
||||
/obj/item/pda/verb/verb_remove_id()
|
||||
set category = "Object"
|
||||
set name = "Eject ID"
|
||||
set src in usr
|
||||
@@ -717,7 +726,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>This PDA does not have an ID in it!</span>")
|
||||
|
||||
/obj/item/device/pda/verb/verb_remove_pen()
|
||||
/obj/item/pda/verb/verb_remove_pen()
|
||||
set category = "Object"
|
||||
set name = "Remove Pen"
|
||||
set src in usr
|
||||
@@ -728,13 +737,13 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
if (usr.canUseTopic(src))
|
||||
remove_pen()
|
||||
|
||||
/obj/item/device/pda/proc/remove_pen()
|
||||
/obj/item/pda/proc/remove_pen()
|
||||
if(inserted_item)
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.put_in_hands(inserted_item)
|
||||
else
|
||||
inserted_item.forceMove(get_turf(src))
|
||||
inserted_item.forceMove(drop_location())
|
||||
to_chat(usr, "<span class='notice'>You remove \the [inserted_item] from \the [src].</span>")
|
||||
inserted_item = null
|
||||
update_icon()
|
||||
@@ -742,7 +751,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
to_chat(usr, "<span class='warning'>This PDA does not have a pen in it!</span>")
|
||||
|
||||
//trying to insert or remove an id
|
||||
/obj/item/device/pda/proc/id_check(mob/user, obj/item/card/id/I)
|
||||
/obj/item/pda/proc/id_check(mob/user, obj/item/card/id/I)
|
||||
if(!I)
|
||||
if(id)
|
||||
remove_id()
|
||||
@@ -763,7 +772,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
return 1
|
||||
|
||||
// access to status display signals
|
||||
/obj/item/device/pda/attackby(obj/item/C, mob/user, params)
|
||||
/obj/item/pda/attackby(obj/item/C, mob/user, params)
|
||||
if(istype(C, /obj/item/cartridge) && !cartridge)
|
||||
if(!user.transferItemToLoc(C, src))
|
||||
return
|
||||
@@ -791,7 +800,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
updateSelfDialog()//Update self dialog on success.
|
||||
return //Return in case of failed check or when successful.
|
||||
updateSelfDialog()//For the non-input related code.
|
||||
else if(istype(C, /obj/item/device/paicard) && !src.pai)
|
||||
else if(istype(C, /obj/item/paicard) && !src.pai)
|
||||
if(!user.transferItemToLoc(C, src))
|
||||
return
|
||||
pai = C
|
||||
@@ -814,7 +823,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/pda/attack(mob/living/carbon/C, mob/living/user)
|
||||
/obj/item/pda/attack(mob/living/carbon/C, mob/living/user)
|
||||
if(istype(C))
|
||||
switch(scanmode)
|
||||
|
||||
@@ -832,7 +841,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
else
|
||||
user.show_message("<span class='notice'>No radiation detected.</span>")
|
||||
|
||||
/obj/item/device/pda/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
|
||||
/obj/item/pda/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
switch(scanmode)
|
||||
@@ -886,7 +895,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
to_chat(user, "<span class='notice'>Paper scanned. Saved to PDA's notekeeper.</span>" )
|
||||
|
||||
|
||||
/obj/item/device/pda/proc/explode() //This needs tuning.
|
||||
/obj/item/pda/proc/explode() //This needs tuning.
|
||||
if(!detonatable)
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -906,7 +915,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/device/pda/Destroy()
|
||||
/obj/item/pda/Destroy()
|
||||
GLOB.PDAs -= src
|
||||
if(istype(id))
|
||||
QDEL_NULL(id)
|
||||
@@ -928,7 +937,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
to_chat(user, "Turn on your receiver in order to send messages.")
|
||||
return
|
||||
|
||||
for (var/obj/item/device/pda/P in get_viewable_pdas())
|
||||
for (var/obj/item/pda/P in get_viewable_pdas())
|
||||
if (P == src)
|
||||
continue
|
||||
else if (P == src.aiPDA)
|
||||
@@ -989,7 +998,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
|
||||
|
||||
// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
|
||||
/obj/item/device/pda/emp_act(severity)
|
||||
/obj/item/pda/emp_act(severity)
|
||||
for(var/atom/A in src)
|
||||
A.emp_act(severity)
|
||||
emped += 1
|
||||
@@ -999,7 +1008,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
/proc/get_viewable_pdas()
|
||||
. = list()
|
||||
// Returns a list of PDAs which can be viewed from another PDA/message monitor.
|
||||
for(var/obj/item/device/pda/P in GLOB.PDAs)
|
||||
for(var/obj/item/pda/P in GLOB.PDAs)
|
||||
if(!P.owner || P.toff || P.hidden)
|
||||
continue
|
||||
. += P
|
||||
@@ -1009,3 +1018,4 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
#undef PDA_SCANNER_REAGENT
|
||||
#undef PDA_SCANNER_HALOGEN
|
||||
#undef PDA_SCANNER_GAS
|
||||
#undef PDA_SPAM_DELAY
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//Clown PDA is slippery.
|
||||
/obj/item/device/pda/clown
|
||||
/obj/item/pda/clown
|
||||
name = "clown PDA"
|
||||
default_cartridge = /obj/item/cartridge/virus/clown
|
||||
inserted_item = /obj/item/toy/crayon/rainbow
|
||||
@@ -8,11 +8,11 @@
|
||||
ttone = "honk"
|
||||
var/slipvictims = list() //CIT CHANGE - makes clown PDAs track unique people slipped
|
||||
|
||||
/obj/item/device/pda/clown/Initialize()
|
||||
/obj/item/pda/clown/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING, CALLBACK(src, .proc/AfterSlip))
|
||||
|
||||
/obj/item/device/pda/clown/proc/AfterSlip(mob/living/carbon/human/M)
|
||||
/obj/item/pda/clown/proc/AfterSlip(mob/living/carbon/human/M)
|
||||
if (istype(M) && (M.real_name != owner))
|
||||
slipvictims |= M //CIT CHANGE - makes clown PDAs track unique people slipped
|
||||
var/obj/item/cartridge/virus/clown/cart = cartridge
|
||||
@@ -20,66 +20,66 @@
|
||||
cart.charges++
|
||||
|
||||
// Special AI/pAI PDAs that cannot explode.
|
||||
/obj/item/device/pda/ai
|
||||
icon_state = "NONE"
|
||||
/obj/item/pda/ai
|
||||
icon = null
|
||||
ttone = "data"
|
||||
fon = FALSE
|
||||
detonatable = FALSE
|
||||
|
||||
/obj/item/device/pda/ai/attack_self(mob/user)
|
||||
/obj/item/pda/ai/attack_self(mob/user)
|
||||
if ((honkamt > 0) && (prob(60)))//For clown virus.
|
||||
honkamt--
|
||||
playsound(loc, 'sound/items/bikehorn.ogg', 30, 1)
|
||||
return
|
||||
|
||||
/obj/item/device/pda/ai/pai
|
||||
/obj/item/pda/ai/pai
|
||||
ttone = "assist"
|
||||
|
||||
|
||||
|
||||
/obj/item/device/pda/medical
|
||||
/obj/item/pda/medical
|
||||
name = "medical PDA"
|
||||
default_cartridge = /obj/item/cartridge/medical
|
||||
icon_state = "pda-medical"
|
||||
|
||||
/obj/item/device/pda/viro
|
||||
/obj/item/pda/viro
|
||||
name = "virology PDA"
|
||||
default_cartridge = /obj/item/cartridge/medical
|
||||
icon_state = "pda-virology"
|
||||
|
||||
/obj/item/device/pda/engineering
|
||||
/obj/item/pda/engineering
|
||||
name = "engineering PDA"
|
||||
default_cartridge = /obj/item/cartridge/engineering
|
||||
icon_state = "pda-engineer"
|
||||
|
||||
/obj/item/device/pda/security
|
||||
/obj/item/pda/security
|
||||
name = "security PDA"
|
||||
default_cartridge = /obj/item/cartridge/security
|
||||
icon_state = "pda-security"
|
||||
|
||||
/obj/item/device/pda/detective
|
||||
/obj/item/pda/detective
|
||||
name = "detective PDA"
|
||||
default_cartridge = /obj/item/cartridge/detective
|
||||
icon_state = "pda-detective"
|
||||
|
||||
/obj/item/device/pda/warden
|
||||
/obj/item/pda/warden
|
||||
name = "warden PDA"
|
||||
default_cartridge = /obj/item/cartridge/security
|
||||
icon_state = "pda-warden"
|
||||
|
||||
/obj/item/device/pda/janitor
|
||||
/obj/item/pda/janitor
|
||||
name = "janitor PDA"
|
||||
default_cartridge = /obj/item/cartridge/janitor
|
||||
icon_state = "pda-janitor"
|
||||
ttone = "slip"
|
||||
|
||||
/obj/item/device/pda/toxins
|
||||
/obj/item/pda/toxins
|
||||
name = "scientist PDA"
|
||||
default_cartridge = /obj/item/cartridge/signal/toxins
|
||||
icon_state = "pda-science"
|
||||
ttone = "boom"
|
||||
|
||||
/obj/item/device/pda/mime
|
||||
/obj/item/pda/mime
|
||||
name = "mime PDA"
|
||||
default_cartridge = /obj/item/cartridge/virus/mime
|
||||
inserted_item = /obj/item/toy/crayon/mime
|
||||
@@ -87,88 +87,88 @@
|
||||
silent = TRUE
|
||||
ttone = "silence"
|
||||
|
||||
/obj/item/device/pda/heads
|
||||
/obj/item/pda/heads
|
||||
default_cartridge = /obj/item/cartridge/head
|
||||
icon_state = "pda-hop"
|
||||
|
||||
/obj/item/device/pda/heads/hop
|
||||
/obj/item/pda/heads/hop
|
||||
name = "head of personnel PDA"
|
||||
default_cartridge = /obj/item/cartridge/hop
|
||||
icon_state = "pda-hop"
|
||||
|
||||
/obj/item/device/pda/heads/hos
|
||||
/obj/item/pda/heads/hos
|
||||
name = "head of security PDA"
|
||||
default_cartridge = /obj/item/cartridge/hos
|
||||
icon_state = "pda-hos"
|
||||
|
||||
/obj/item/device/pda/heads/ce
|
||||
/obj/item/pda/heads/ce
|
||||
name = "chief engineer PDA"
|
||||
default_cartridge = /obj/item/cartridge/ce
|
||||
icon_state = "pda-ce"
|
||||
|
||||
/obj/item/device/pda/heads/cmo
|
||||
/obj/item/pda/heads/cmo
|
||||
name = "chief medical officer PDA"
|
||||
default_cartridge = /obj/item/cartridge/cmo
|
||||
icon_state = "pda-cmo"
|
||||
|
||||
/obj/item/device/pda/heads/rd
|
||||
/obj/item/pda/heads/rd
|
||||
name = "research director PDA"
|
||||
default_cartridge = /obj/item/cartridge/rd
|
||||
inserted_item = /obj/item/pen/fountain
|
||||
icon_state = "pda-rd"
|
||||
|
||||
/obj/item/device/pda/captain
|
||||
/obj/item/pda/captain
|
||||
name = "captain PDA"
|
||||
default_cartridge = /obj/item/cartridge/captain
|
||||
inserted_item = /obj/item/pen/fountain/captain
|
||||
icon_state = "pda-captain"
|
||||
detonatable = FALSE
|
||||
|
||||
/obj/item/device/pda/cargo
|
||||
/obj/item/pda/cargo
|
||||
name = "cargo technician PDA"
|
||||
default_cartridge = /obj/item/cartridge/quartermaster
|
||||
icon_state = "pda-cargo"
|
||||
|
||||
/obj/item/device/pda/quartermaster
|
||||
/obj/item/pda/quartermaster
|
||||
name = "quartermaster PDA"
|
||||
default_cartridge = /obj/item/cartridge/quartermaster
|
||||
inserted_item = /obj/item/pen/fountain
|
||||
icon_state = "pda-qm"
|
||||
|
||||
/obj/item/device/pda/shaftminer
|
||||
/obj/item/pda/shaftminer
|
||||
name = "shaft miner PDA"
|
||||
icon_state = "pda-miner"
|
||||
|
||||
/obj/item/device/pda/syndicate
|
||||
/obj/item/pda/syndicate
|
||||
default_cartridge = /obj/item/cartridge/virus/syndicate
|
||||
icon_state = "pda-syndi"
|
||||
name = "military PDA"
|
||||
owner = "John Doe"
|
||||
hidden = 1
|
||||
|
||||
/obj/item/device/pda/chaplain
|
||||
/obj/item/pda/chaplain
|
||||
name = "chaplain PDA"
|
||||
icon_state = "pda-chaplain"
|
||||
ttone = "holy"
|
||||
|
||||
/obj/item/device/pda/lawyer
|
||||
/obj/item/pda/lawyer
|
||||
name = "lawyer PDA"
|
||||
default_cartridge = /obj/item/cartridge/lawyer
|
||||
inserted_item = /obj/item/pen/fountain
|
||||
icon_state = "pda-lawyer"
|
||||
ttone = "objection"
|
||||
|
||||
/obj/item/device/pda/botanist
|
||||
/obj/item/pda/botanist
|
||||
name = "botanist PDA"
|
||||
//default_cartridge = /obj/item/cartridge/botanist
|
||||
icon_state = "pda-hydro"
|
||||
|
||||
/obj/item/device/pda/roboticist
|
||||
/obj/item/pda/roboticist
|
||||
name = "roboticist PDA"
|
||||
icon_state = "pda-roboticist"
|
||||
default_cartridge = /obj/item/cartridge/roboticist
|
||||
|
||||
/obj/item/device/pda/curator
|
||||
/obj/item/pda/curator
|
||||
name = "curator PDA"
|
||||
icon_state = "pda-library"
|
||||
icon_alert = "pda-r-library"
|
||||
@@ -179,32 +179,32 @@
|
||||
silent = TRUE //Quiet in the library!
|
||||
overlays_x_offset = -3
|
||||
|
||||
/obj/item/device/pda/clear
|
||||
/obj/item/pda/clear
|
||||
name = "clear PDA"
|
||||
icon_state = "pda-clear"
|
||||
desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a special edition with a transparent case."
|
||||
note = "Congratulations, you have chosen the Thinktronic 5230 Personal Data Assistant Deluxe Special Max Turbo Limited Edition!"
|
||||
|
||||
/obj/item/device/pda/cook
|
||||
/obj/item/pda/cook
|
||||
name = "cook PDA"
|
||||
icon_state = "pda-cook"
|
||||
|
||||
/obj/item/device/pda/bar
|
||||
/obj/item/pda/bar
|
||||
name = "bartender PDA"
|
||||
icon_state = "pda-bartender"
|
||||
inserted_item = /obj/item/pen/fountain
|
||||
|
||||
/obj/item/device/pda/atmos
|
||||
/obj/item/pda/atmos
|
||||
name = "atmospherics PDA"
|
||||
default_cartridge = /obj/item/cartridge/atmos
|
||||
icon_state = "pda-atmos"
|
||||
|
||||
/obj/item/device/pda/chemist
|
||||
/obj/item/pda/chemist
|
||||
name = "chemist PDA"
|
||||
default_cartridge = /obj/item/cartridge/chemistry
|
||||
icon_state = "pda-chemistry"
|
||||
|
||||
/obj/item/device/pda/geneticist
|
||||
/obj/item/pda/geneticist
|
||||
name = "geneticist PDA"
|
||||
default_cartridge = /obj/item/cartridge/medical
|
||||
icon_state = "pda-genetics"
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
var/bot_access_flags = 0 //Bit flags. Selection: SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT
|
||||
var/spam_enabled = 0 //Enables "Send to All" Option
|
||||
|
||||
var/obj/item/device/pda/host_pda = null
|
||||
var/obj/item/pda/host_pda = null
|
||||
var/menu
|
||||
var/datum/data/record/active1 = null //General
|
||||
var/datum/data/record/active2 = null //Medical
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
/obj/item/cartridge/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/device/pda/pda = loc
|
||||
var/obj/item/pda/pda = loc
|
||||
if(istype(pda))
|
||||
host_pda = pda
|
||||
|
||||
@@ -207,13 +207,12 @@
|
||||
|
||||
frequency.post_signal(src, status_signal)
|
||||
|
||||
|
||||
/obj/item/cartridge/proc/generate_menu(mob/user)
|
||||
if(!host_pda)
|
||||
return
|
||||
switch(host_pda.mode)
|
||||
if(40) //signaller
|
||||
menu = "<h4><img src=pda_signaler.png> Remote Signaling System</h4>"
|
||||
menu = "<h4>[PDAIMG(signaler)] Remote Signaling System</h4>"
|
||||
|
||||
menu += {"
|
||||
<a href='byond://?src=[REF(src)];choice=Send Signal'>Send Signal</A><BR>
|
||||
@@ -232,7 +231,7 @@ Code:
|
||||
<a href='byond://?src=[REF(src)];choice=Signal Code;scode=5'>+</a><br>"}
|
||||
if (41) //crew manifest
|
||||
|
||||
menu = "<h4><img src=pda_notes.png> Crew Manifest</h4>"
|
||||
menu = "<h4>[PDAIMG(notes)] Crew Manifest</h4>"
|
||||
menu += "Entries cannot be modified from this terminal.<br><br>"
|
||||
if(GLOB.data_core.general)
|
||||
for (var/datum/data/record/t in sortRecord(GLOB.data_core.general))
|
||||
@@ -241,7 +240,7 @@ Code:
|
||||
|
||||
|
||||
if (42) //status displays
|
||||
menu = "<h4><img src=pda_status.png> Station Status Display Interlink</h4>"
|
||||
menu = "<h4>[PDAIMG(status)] Station Status Display Interlink</h4>"
|
||||
|
||||
menu += "\[ <A HREF='?src=[REF(src)];choice=Status;statdisp=blank'>Clear</A> \]<BR>"
|
||||
menu += "\[ <A HREF='?src=[REF(src)];choice=Status;statdisp=shuttle'>Shuttle ETA</A> \]<BR>"
|
||||
@@ -254,7 +253,7 @@ Code:
|
||||
menu += " <A HREF='?src=[REF(src)];choice=Status;statdisp=alert;alert=biohazard'>Biohazard</A> \]<BR>"
|
||||
|
||||
if (43)
|
||||
menu = "<h4><img src=pda_power.png> Power Monitors - Please select one</h4><BR>"
|
||||
menu = "<h4>[PDAIMG(power)] Power Monitors - Please select one</h4><BR>"
|
||||
powmonitor = null
|
||||
powermonitors = list()
|
||||
var/powercount = 0
|
||||
@@ -280,7 +279,7 @@ Code:
|
||||
menu += "</FONT>"
|
||||
|
||||
if (433)
|
||||
menu = "<h4><img src=pda_power.png> Power Monitor </h4><BR>"
|
||||
menu = "<h4>[PDAIMG(power)] Power Monitor </h4><BR>"
|
||||
if(!powmonitor)
|
||||
menu += "<span class='danger'>No connection<BR></span>"
|
||||
else
|
||||
@@ -307,13 +306,13 @@ Code:
|
||||
menu += "</FONT></PRE>"
|
||||
|
||||
if (44) //medical records //This thing only displays a single screen so it's hard to really get the sub-menu stuff working.
|
||||
menu = "<h4><img src=pda_medical.png> Medical Record List</h4>"
|
||||
menu = "<h4>[PDAIMG(medical)] Medical Record List</h4>"
|
||||
if(GLOB.data_core.general)
|
||||
for(var/datum/data/record/R in sortRecord(GLOB.data_core.general))
|
||||
menu += "<a href='byond://?src=[REF(src)];choice=Medical Records;target=[R.fields["id"]]'>[R.fields["id"]]: [R.fields["name"]]<br>"
|
||||
menu += "<br>"
|
||||
if(441)
|
||||
menu = "<h4><img src=pda_medical.png> Medical Record</h4>"
|
||||
menu = "<h4>[PDAIMG(medical)] Medical Record</h4>"
|
||||
|
||||
if(active1 in GLOB.data_core.general)
|
||||
menu += "Name: [active1.fields["name"]] ID: [active1.fields["id"]]<br>"
|
||||
@@ -328,7 +327,7 @@ Code:
|
||||
|
||||
menu += "<br>"
|
||||
|
||||
menu += "<h4><img src=pda_medical.png> Medical Data</h4>"
|
||||
menu += "<h4>[PDAIMG(medical)] Medical Data</h4>"
|
||||
if(active2 in GLOB.data_core.medical)
|
||||
menu += "Blood Type: [active2.fields["blood_type"]]<br><br>"
|
||||
|
||||
@@ -350,14 +349,14 @@ Code:
|
||||
|
||||
menu += "<br>"
|
||||
if (45) //security records
|
||||
menu = "<h4><img src=pda_cuffs.png> Security Record List</h4>"
|
||||
menu = "<h4>[PDAIMG(cuffs)] Security Record List</h4>"
|
||||
if(GLOB.data_core.general)
|
||||
for (var/datum/data/record/R in sortRecord(GLOB.data_core.general))
|
||||
menu += "<a href='byond://?src=[REF(src)];choice=Security Records;target=[R.fields["id"]]'>[R.fields["id"]]: [R.fields["name"]]<br>"
|
||||
|
||||
menu += "<br>"
|
||||
if(451)
|
||||
menu = "<h4><img src=pda_cuffs.png> Security Record</h4>"
|
||||
menu = "<h4>[PDAIMG(cuffs)] Security Record</h4>"
|
||||
|
||||
if(active1 in GLOB.data_core.general)
|
||||
menu += "Name: [active1.fields["name"]] ID: [active1.fields["id"]]<br>"
|
||||
@@ -372,7 +371,7 @@ Code:
|
||||
|
||||
menu += "<br>"
|
||||
|
||||
menu += "<h4><img src=pda_cuffs.png> Security Data</h4>"
|
||||
menu += "<h4>[PDAIMG(cuffs)] Security Data</h4>"
|
||||
if(active3 in GLOB.data_core.security)
|
||||
menu += "Criminal Status: [active3.fields["criminal"]]<br>"
|
||||
|
||||
@@ -418,7 +417,7 @@ Code:
|
||||
menu += "<br>"
|
||||
|
||||
if (47) //quartermaster order records
|
||||
menu = "<h4><img src=pda_crate.png> Supply Record Interlink</h4>"
|
||||
menu = "<h4>[PDAIMG(crate)] Supply Record Interlink</h4>"
|
||||
|
||||
menu += "<BR><B>Supply shuttle</B><BR>"
|
||||
menu += "Location: "
|
||||
@@ -449,7 +448,7 @@ Code:
|
||||
menu += "</ol><font size=\"-3\">Upgrade NOW to Space Parts & Space Vendors PLUS for full remote order control and inventory management."
|
||||
|
||||
if (49) //janitorial locator
|
||||
menu = "<h4><img src=pda_bucket.png> Persistent Custodial Object Locator</h4>"
|
||||
menu = "<h4>[PDAIMG(bucket)] Persistent Custodial Object Locator</h4>"
|
||||
|
||||
var/turf/cl = get_turf(src)
|
||||
if (cl)
|
||||
@@ -511,7 +510,7 @@ Code:
|
||||
menu += "<br><br><A href='byond://?src=[REF(src)];choice=49'>Refresh GPS Locator</a>"
|
||||
|
||||
if (53) // Newscaster
|
||||
menu = "<h4><img src=pda_notes.png> Newscaster Access</h4>"
|
||||
menu = "<h4>[PDAIMG(notes)] Newscaster Access</h4>"
|
||||
menu += "<br> Current Newsfeed: <A href='byond://?src=[REF(src)];choice=Newscaster Switch Channel'>[current_channel ? current_channel : "None"]</a> <br>"
|
||||
var/datum/newscaster/feed_channel/current
|
||||
for(var/datum/newscaster/feed_channel/chan in GLOB.news_network.network_channels)
|
||||
@@ -533,7 +532,7 @@ Code:
|
||||
menu += "<br> <A href='byond://?src=[REF(src)];choice=Newscaster Message'>Post Message</a>"
|
||||
|
||||
if (54) // Beepsky, Medibot, Floorbot, and Cleanbot access
|
||||
menu = "<h4><img src=pda_medbot.png> Bots Interlink</h4>"
|
||||
menu = "<h4>[PDAIMG(medbot)] Bots Interlink</h4>"
|
||||
bot_control()
|
||||
if (99) //Newscaster message permission error
|
||||
menu = "<h5> ERROR : NOT AUTHORIZED [host_pda.id ? "" : "- ID SLOT EMPTY"] </h5>"
|
||||
@@ -652,7 +651,7 @@ Code:
|
||||
var/mob/living/simple_animal/bot/Bot
|
||||
|
||||
if(active_bot)
|
||||
menu += "<B>[active_bot]</B><BR> Status: (<A href='byond://?src=[REF(src)];op=control;bot=[REF(active_bot)]'><img src=pda_refresh.png><i>refresh</i></A>)<BR>"
|
||||
menu += "<B>[active_bot]</B><BR> Status: (<A href='byond://?src=[REF(src)];op=control;bot=[REF(active_bot)]'>[PDAIMG(refresh)]<i>refresh</i></A>)<BR>"
|
||||
menu += "Model: [active_bot.model]<BR>"
|
||||
menu += "Location: [get_area(active_bot)]<BR>"
|
||||
menu += "Mode: [active_bot.get_mode()]"
|
||||
@@ -688,9 +687,9 @@ Code:
|
||||
menu += "\[<A href='byond://?src=[REF(src)];op=summon'>Summon Bot</A>\]<BR>" //summon
|
||||
menu += "Keep an ID inserted to upload access codes upon summoning."
|
||||
|
||||
menu += "<HR><A href='byond://?src=[REF(src)];op=botlist'><img src=pda_back.png>Return to bot list</A>"
|
||||
menu += "<HR><A href='byond://?src=[REF(src)];op=botlist'>[PDAIMG(back)]Return to bot list</A>"
|
||||
else
|
||||
menu += "<BR><A href='byond://?src=[REF(src)];op=botlist'><img src=pda_refresh.png>Scan for active bots</A><BR><BR>"
|
||||
menu += "<BR><A href='byond://?src=[REF(src)];op=botlist'>[PDAIMG(refresh)]Scan for active bots</A><BR><BR>"
|
||||
var/turf/current_turf = get_turf(src)
|
||||
var/zlevel = current_turf.z
|
||||
var/botcount = 0
|
||||
@@ -710,7 +709,7 @@ Code:
|
||||
return ""
|
||||
|
||||
//If the cartridge adds something to each potetial messaging target
|
||||
/obj/item/cartridge/proc/message_special(obj/item/device/pda/target)
|
||||
/obj/item/cartridge/proc/message_special(obj/item/pda/target)
|
||||
return ""
|
||||
|
||||
//This is called for special abilities of cartridges
|
||||
|
||||
@@ -2,19 +2,19 @@
|
||||
name = "Generic Virus PDA cart"
|
||||
var/charges = 5
|
||||
|
||||
/obj/item/cartridge/virus/proc/send_virus(obj/item/device/pda/target, mob/living/U)
|
||||
/obj/item/cartridge/virus/proc/send_virus(obj/item/pda/target, mob/living/U)
|
||||
return
|
||||
|
||||
/obj/item/cartridge/virus/message_header()
|
||||
return "<b>[charges] viral files left.</b><HR>"
|
||||
|
||||
/obj/item/cartridge/virus/message_special(obj/item/device/pda/target)
|
||||
if (!istype(loc, /obj/item/device/pda))
|
||||
/obj/item/cartridge/virus/message_special(obj/item/pda/target)
|
||||
if (!istype(loc, /obj/item/pda))
|
||||
return "" //Sanity check, this shouldn't be possible.
|
||||
return " (<a href='byond://?src=[REF(loc)];choice=cart;special=virus;target=[REF(target)]'>*Send Virus*</a>)"
|
||||
|
||||
/obj/item/cartridge/virus/special(mob/living/user, list/params)
|
||||
var/obj/item/device/pda/P = locate(params["target"])//Leaving it alone in case it may do something useful, I guess.
|
||||
var/obj/item/pda/P = locate(params["target"])//Leaving it alone in case it may do something useful, I guess.
|
||||
send_virus(P,user)
|
||||
|
||||
/obj/item/cartridge/virus/clown
|
||||
@@ -23,7 +23,7 @@
|
||||
desc = "A data cartridge for portable microcomputers. It smells vaguely of bananas."
|
||||
access = CART_CLOWN
|
||||
|
||||
/obj/item/cartridge/virus/clown/send_virus(obj/item/device/pda/target, mob/living/U)
|
||||
/obj/item/cartridge/virus/clown/send_virus(obj/item/pda/target, mob/living/U)
|
||||
if(charges <= 0)
|
||||
to_chat(U, "<span class='notice'>Out of charges.</span>")
|
||||
return
|
||||
@@ -39,7 +39,7 @@
|
||||
icon_state = "cart-mi"
|
||||
access = CART_MIME
|
||||
|
||||
/obj/item/cartridge/virus/mime/send_virus(obj/item/device/pda/target, mob/living/U)
|
||||
/obj/item/cartridge/virus/mime/send_virus(obj/item/pda/target, mob/living/U)
|
||||
if(charges <= 0)
|
||||
to_chat(U, "<span class='notice'>Out of charges.</span>")
|
||||
return
|
||||
@@ -58,7 +58,7 @@
|
||||
remote_door_id = "smindicate" //Make sure this matches the syndicate shuttle's shield/door id!! //don't ask about the name, testing.
|
||||
charges = 4
|
||||
|
||||
/obj/item/cartridge/virus/syndicate/send_virus(obj/item/device/pda/target, mob/living/U)
|
||||
/obj/item/cartridge/virus/syndicate/send_virus(obj/item/pda/target, mob/living/U)
|
||||
if(charges <= 0)
|
||||
to_chat(U, "<span class='notice'>Out of charges.</span>")
|
||||
return
|
||||
@@ -92,7 +92,7 @@
|
||||
icon_state = "cart"
|
||||
var/telecrystals = 0
|
||||
|
||||
/obj/item/cartridge/virus/frame/send_virus(obj/item/device/pda/target, mob/living/U)
|
||||
/obj/item/cartridge/virus/frame/send_virus(obj/item/pda/target, mob/living/U)
|
||||
if(charges <= 0)
|
||||
to_chat(U, "<span class='notice'>Out of charges.</span>")
|
||||
return
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/aicard
|
||||
/obj/item/aicard
|
||||
name = "intelliCard"
|
||||
desc = "A storage device for AIs. Patent pending."
|
||||
icon = 'icons/obj/aicards.dmi'
|
||||
@@ -7,16 +7,16 @@
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
flags_1 = NOBLUDGEON_1
|
||||
var/flush = FALSE
|
||||
var/mob/living/silicon/ai/AI
|
||||
|
||||
/obj/item/device/aicard/suicide_act(mob/living/user)
|
||||
/obj/item/aicard/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] is trying to upload themselves into [src]! That's not going to work out well!</span>")
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/device/aicard/afterattack(atom/target, mob/user, proximity)
|
||||
/obj/item/aicard/afterattack(atom/target, mob/user, proximity)
|
||||
..()
|
||||
if(!proximity || !target)
|
||||
return
|
||||
@@ -27,7 +27,7 @@
|
||||
target.transfer_ai(AI_TRANS_TO_CARD, user, null, src)
|
||||
update_icon() //Whatever happened, update the card's state (icon, name) to match.
|
||||
|
||||
/obj/item/device/aicard/update_icon()
|
||||
/obj/item/aicard/update_icon()
|
||||
cut_overlays()
|
||||
if(AI)
|
||||
name = "[initial(name)]- [AI.name]"
|
||||
@@ -42,14 +42,14 @@
|
||||
name = initial(name)
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/item/device/aicard/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
/obj/item/aicard/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "intellicard", name, 500, 500, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
/obj/item/device/aicard/ui_data()
|
||||
/obj/item/aicard/ui_data()
|
||||
var/list/data = list()
|
||||
if(AI)
|
||||
data["name"] = AI.name
|
||||
@@ -62,7 +62,7 @@
|
||||
data["wiping"] = flush
|
||||
return data
|
||||
|
||||
/obj/item/device/aicard/ui_act(action,params)
|
||||
/obj/item/aicard/ui_act(action,params)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/beacon
|
||||
/obj/item/beacon
|
||||
name = "\improper tracking beacon"
|
||||
desc = "A beacon used by a teleporter."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
@@ -9,18 +9,18 @@
|
||||
var/enabled = TRUE
|
||||
var/renamed = FALSE
|
||||
|
||||
/obj/item/device/beacon/Initialize()
|
||||
/obj/item/beacon/Initialize()
|
||||
. = ..()
|
||||
if (enabled)
|
||||
GLOB.teleportbeacons += src
|
||||
else
|
||||
icon_state = "beacon-off"
|
||||
|
||||
/obj/item/device/beacon/Destroy()
|
||||
/obj/item/beacon/Destroy()
|
||||
GLOB.teleportbeacons.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/beacon/attack_self(mob/user)
|
||||
/obj/item/beacon/attack_self(mob/user)
|
||||
enabled = !enabled
|
||||
if (enabled)
|
||||
icon_state = "beacon"
|
||||
@@ -31,7 +31,7 @@
|
||||
to_chat(user, "<span class='notice'>You [enabled ? "enable" : "disable"] the beacon.</span>")
|
||||
return
|
||||
|
||||
/obj/item/device/beacon/attackby(obj/item/W, mob/user)
|
||||
/obj/item/beacon/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/pen)) // needed for things that use custom names like the locator
|
||||
var/new_name = stripped_input(user, "What would you like the name to be?")
|
||||
if(!user.canUseTopic(src, BE_CLOSE))
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
|
||||
|
||||
/obj/item/device/camera_bug
|
||||
/obj/item/camera_bug
|
||||
name = "camera bug"
|
||||
desc = "For illicit snooping through the camera network."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
@@ -31,11 +31,11 @@
|
||||
var/last_found = null
|
||||
var/last_seen = null
|
||||
|
||||
/obj/item/device/camera_bug/New()
|
||||
/obj/item/camera_bug/New()
|
||||
..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/device/camera_bug/Destroy()
|
||||
/obj/item/camera_bug/Destroy()
|
||||
get_cameras()
|
||||
for(var/cam_tag in bugged_cameras)
|
||||
var/obj/machinery/camera/camera = bugged_cameras[cam_tag]
|
||||
@@ -46,20 +46,20 @@
|
||||
tracking = null
|
||||
return ..()
|
||||
|
||||
/obj/item/device/camera_bug/interact(mob/user)
|
||||
/obj/item/camera_bug/interact(mob/user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/device/camera_bug/ui_interact(mob/user = usr)
|
||||
/obj/item/camera_bug/ui_interact(mob/user = usr)
|
||||
. = ..()
|
||||
var/datum/browser/popup = new(user, "camerabug","Camera Bug",nref=src)
|
||||
popup.set_content(menu(get_cameras()))
|
||||
popup.open()
|
||||
|
||||
/obj/item/device/camera_bug/attack_self(mob/user)
|
||||
/obj/item/camera_bug/attack_self(mob/user)
|
||||
user.set_machine(src)
|
||||
interact(user)
|
||||
|
||||
/obj/item/device/camera_bug/check_eye(mob/user)
|
||||
/obj/item/camera_bug/check_eye(mob/user)
|
||||
if ( loc != user || user.incapacitated() || user.eye_blind || !current )
|
||||
user.unset_machine()
|
||||
return 0
|
||||
@@ -70,10 +70,10 @@
|
||||
user.unset_machine()
|
||||
return 0
|
||||
return 1
|
||||
/obj/item/device/camera_bug/on_unset_machine(mob/user)
|
||||
/obj/item/camera_bug/on_unset_machine(mob/user)
|
||||
user.reset_perspective(null)
|
||||
|
||||
/obj/item/device/camera_bug/proc/get_cameras()
|
||||
/obj/item/camera_bug/proc/get_cameras()
|
||||
if( world.time > (last_net_update + 100))
|
||||
bugged_cameras = list()
|
||||
for(var/obj/machinery/camera/camera in GLOB.cameranet.cameras)
|
||||
@@ -85,7 +85,7 @@
|
||||
return bugged_cameras
|
||||
|
||||
|
||||
/obj/item/device/camera_bug/proc/menu(list/cameras)
|
||||
/obj/item/camera_bug/proc/menu(list/cameras)
|
||||
if(!cameras || !cameras.len)
|
||||
return "No bugged cameras found."
|
||||
|
||||
@@ -139,12 +139,12 @@
|
||||
return .(cameras)
|
||||
return html
|
||||
|
||||
/obj/item/device/camera_bug/proc/get_seens()
|
||||
/obj/item/camera_bug/proc/get_seens()
|
||||
if(current && current.can_use())
|
||||
var/list/seen = current.can_see()
|
||||
return seen
|
||||
|
||||
/obj/item/device/camera_bug/proc/camera_report()
|
||||
/obj/item/camera_bug/proc/camera_report()
|
||||
// this should only be called if current exists
|
||||
var/dat = ""
|
||||
var/list/seen = get_seens()
|
||||
@@ -189,7 +189,7 @@
|
||||
else
|
||||
return "Camera Offline<br>"
|
||||
|
||||
/obj/item/device/camera_bug/Topic(href,list/href_list)
|
||||
/obj/item/camera_bug/Topic(href,list/href_list)
|
||||
if(usr != loc)
|
||||
usr.unset_machine()
|
||||
usr << browse(null, "window=camerabug")
|
||||
@@ -256,7 +256,7 @@
|
||||
|
||||
interact()
|
||||
|
||||
/obj/item/device/camera_bug/process()
|
||||
/obj/item/camera_bug/process()
|
||||
if(track_mode == BUGMODE_LIST || (world.time < (last_tracked + refresh_interval)))
|
||||
return
|
||||
last_tracked = world.time
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
/obj/item/device/chameleon
|
||||
/obj/item/chameleon
|
||||
name = "chameleon-projector"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "shield0"
|
||||
flags_1 = CONDUCT_1 | NOBLUDGEON_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
item_state = "electronic"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
@@ -14,26 +15,26 @@
|
||||
var/obj/effect/dummy/chameleon/active_dummy = null
|
||||
var/saved_appearance = null
|
||||
|
||||
/obj/item/device/chameleon/New()
|
||||
/obj/item/chameleon/New()
|
||||
..()
|
||||
var/obj/item/cigbutt/butt = /obj/item/cigbutt
|
||||
saved_appearance = initial(butt.appearance)
|
||||
|
||||
/obj/item/device/chameleon/dropped()
|
||||
/obj/item/chameleon/dropped()
|
||||
..()
|
||||
disrupt()
|
||||
|
||||
/obj/item/device/chameleon/equipped()
|
||||
/obj/item/chameleon/equipped()
|
||||
..()
|
||||
disrupt()
|
||||
|
||||
/obj/item/device/chameleon/attack_self(mob/user)
|
||||
/obj/item/chameleon/attack_self(mob/user)
|
||||
if (isturf(user.loc) || istype(user.loc, /obj/structure) || active_dummy)
|
||||
toggle(user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't use [src] while inside something!</span>")
|
||||
|
||||
/obj/item/device/chameleon/afterattack(atom/target, mob/user , proximity)
|
||||
/obj/item/chameleon/afterattack(atom/target, mob/user , proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(!check_sprite(target))
|
||||
@@ -48,12 +49,12 @@
|
||||
temp.plane = initial(target.plane)
|
||||
saved_appearance = temp.appearance
|
||||
|
||||
/obj/item/device/chameleon/proc/check_sprite(atom/target)
|
||||
/obj/item/chameleon/proc/check_sprite(atom/target)
|
||||
if(target.icon_state in icon_states(target.icon))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/device/chameleon/proc/toggle(mob/user)
|
||||
/obj/item/chameleon/proc/toggle(mob/user)
|
||||
if(!can_use || !saved_appearance)
|
||||
return
|
||||
if(active_dummy)
|
||||
@@ -71,7 +72,7 @@
|
||||
new /obj/effect/temp_visual/emp/pulse(get_turf(src))
|
||||
user.cancel_camera()
|
||||
|
||||
/obj/item/device/chameleon/proc/disrupt(delete_dummy = 1)
|
||||
/obj/item/chameleon/proc/disrupt(delete_dummy = 1)
|
||||
if(active_dummy)
|
||||
for(var/mob/M in active_dummy)
|
||||
to_chat(M, "<span class='danger'>Your chameleon-projector deactivates.</span>")
|
||||
@@ -86,7 +87,7 @@
|
||||
can_use = 0
|
||||
spawn(50) can_use = 1
|
||||
|
||||
/obj/item/device/chameleon/proc/eject_all()
|
||||
/obj/item/chameleon/proc/eject_all()
|
||||
for(var/atom/movable/A in active_dummy)
|
||||
A.forceMove(active_dummy.loc)
|
||||
if(ismob(A))
|
||||
@@ -98,9 +99,9 @@
|
||||
desc = ""
|
||||
density = FALSE
|
||||
var/can_move = 0
|
||||
var/obj/item/device/chameleon/master = null
|
||||
var/obj/item/chameleon/master = null
|
||||
|
||||
/obj/effect/dummy/chameleon/proc/activate(mob/M, saved_appearance, obj/item/device/chameleon/C)
|
||||
/obj/effect/dummy/chameleon/proc/activate(mob/M, saved_appearance, obj/item/chameleon/C)
|
||||
appearance = saved_appearance
|
||||
if(istype(M.buckled, /obj/vehicle))
|
||||
var/obj/vehicle/V = M.buckled
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Dogborg Sleeper units
|
||||
|
||||
/obj/item/device/dogborg/sleeper
|
||||
/obj/item/dogborg/sleeper
|
||||
name = "hound sleeper"
|
||||
desc = "nothing should see this."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
@@ -22,7 +22,7 @@
|
||||
var/static/list/important_items = typecacheof(list(
|
||||
/obj/item/hand_tele,
|
||||
/obj/item/card/id,
|
||||
/obj/item/device/aicard,
|
||||
/obj/item/aicard,
|
||||
/obj/item/gun,
|
||||
/obj/item/pinpointer,
|
||||
/obj/item/clothing/shoes/magboots,
|
||||
@@ -45,15 +45,15 @@
|
||||
|
||||
// Bags are prohibited from this due to the potential explotation of objects, same with brought
|
||||
|
||||
/obj/item/device/dogborg/sleeper/New()
|
||||
/obj/item/dogborg/sleeper/New()
|
||||
..()
|
||||
update_icon()
|
||||
flags_1 |= NOBLUDGEON_1 //No more attack messages
|
||||
|
||||
/obj/item/device/dogborg/sleeper/Exit(atom/movable/O)
|
||||
/obj/item/dogborg/sleeper/Exit(atom/movable/O)
|
||||
return 0
|
||||
|
||||
/obj/item/device/dogborg/sleeper/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity)
|
||||
/obj/item/dogborg/sleeper/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity)
|
||||
hound = loc
|
||||
if(!proximity)
|
||||
return
|
||||
@@ -91,7 +91,7 @@
|
||||
message_admins("[key_name(hound)] has sleeper'd [key_name(patient)] as a dogborg. [ADMIN_JMP(src)]")
|
||||
playsound(hound, 'sound/effects/bin_close.ogg', 100, 1)
|
||||
|
||||
/obj/item/device/dogborg/sleeper/container_resist(mob/living/user)
|
||||
/obj/item/dogborg/sleeper/container_resist(mob/living/user)
|
||||
hound = loc
|
||||
user.changeNext_move(CLICK_CD_BREAKOUT)
|
||||
user.last_special = world.time + CLICK_CD_BREAKOUT
|
||||
@@ -107,7 +107,7 @@
|
||||
"<span class='notice'>You successfully break out of [hound.name]!</span>")
|
||||
go_out()
|
||||
|
||||
/obj/item/device/dogborg/sleeper/proc/go_out(var/target)
|
||||
/obj/item/dogborg/sleeper/proc/go_out(var/target)
|
||||
hound = loc
|
||||
hound.setClickCooldown(50)
|
||||
if(length(contents) > 0)
|
||||
@@ -139,12 +139,12 @@
|
||||
cleaning = FALSE
|
||||
update_gut()
|
||||
|
||||
/obj/item/device/dogborg/sleeper/attack_self(mob/user)
|
||||
/obj/item/dogborg/sleeper/attack_self(mob/user)
|
||||
if(..())
|
||||
return
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/device/dogborg/sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
/obj/item/dogborg/sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
|
||||
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
@@ -152,7 +152,7 @@
|
||||
ui = new(user, src, ui_key, "dogborg_sleeper", name, 375, 550, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
/obj/item/device/dogborg/sleeper/ui_data()
|
||||
/obj/item/dogborg/sleeper/ui_data()
|
||||
var/list/data = list()
|
||||
data["occupied"] = patient ? 1 : 0
|
||||
|
||||
@@ -197,7 +197,7 @@
|
||||
data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume))
|
||||
return data
|
||||
|
||||
/obj/item/device/dogborg/sleeper/ui_act(action, params)
|
||||
/obj/item/dogborg/sleeper/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
@@ -221,7 +221,7 @@
|
||||
clean_cycle()
|
||||
. = TRUE
|
||||
|
||||
/obj/item/device/dogborg/sleeper/proc/update_gut()
|
||||
/obj/item/dogborg/sleeper/proc/update_gut()
|
||||
//Well, we HAD one, what happened to them?
|
||||
if(patient in contents)
|
||||
if(patient_laststat != patient.stat)
|
||||
@@ -268,7 +268,7 @@
|
||||
return
|
||||
|
||||
//Gurgleborg process
|
||||
/obj/item/device/dogborg/sleeper/proc/clean_cycle()
|
||||
/obj/item/dogborg/sleeper/proc/clean_cycle()
|
||||
//Sanity
|
||||
for(var/I in items_preserved)
|
||||
if(!(I in contents))
|
||||
@@ -341,10 +341,10 @@
|
||||
if(cleaning)
|
||||
addtimer(CALLBACK(src, .proc/clean_cycle), 50)
|
||||
|
||||
/obj/item/device/dogborg/sleeper/proc/CheckAccepted(obj/item/I)
|
||||
/obj/item/dogborg/sleeper/proc/CheckAccepted(obj/item/I)
|
||||
return is_type_in_typecache(I, important_items)
|
||||
|
||||
/obj/item/device/dogborg/sleeper/proc/inject_chem(chem)
|
||||
/obj/item/dogborg/sleeper/proc/inject_chem(chem)
|
||||
if(hound.cell.charge <= 800) //This is so borgs don't kill themselves with it. Remember, 750 charge used every injection.
|
||||
to_chat(hound, "<span class='notice'>You don't have enough power to synthesize fluids.</span>")
|
||||
return
|
||||
@@ -356,13 +356,13 @@
|
||||
var/units = round(patient.reagents.get_reagent_amount(chem))
|
||||
to_chat(hound, "<span class='notice'>Injecting [units] unit\s of [chem] into occupant.</span>") //If they were immersed, the reagents wouldn't leave with them.
|
||||
|
||||
/obj/item/device/dogborg/sleeper/medihound //Medihound sleeper
|
||||
/obj/item/dogborg/sleeper/medihound //Medihound sleeper
|
||||
name = "Mobile Sleeper"
|
||||
desc = "Equipment for medical hound. A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "sleeper"
|
||||
|
||||
/obj/item/device/dogborg/sleeper/K9 //The K9 portabrig
|
||||
/obj/item/dogborg/sleeper/K9 //The K9 portabrig
|
||||
name = "Mobile Brig"
|
||||
desc = "Equipment for a K9 unit. A mounted portable-brig that holds criminals."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
@@ -371,13 +371,13 @@
|
||||
min_health = -100
|
||||
injection_chems = null //So they don't have all the same chems as the medihound!
|
||||
|
||||
/obj/item/storage/attackby(obj/item/device/dogborg/sleeper/K9, mob/user, proximity)
|
||||
/obj/item/storage/attackby(obj/item/dogborg/sleeper/K9, mob/user, proximity)
|
||||
if(istype(K9))
|
||||
K9.afterattack(src, user ,1)
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/obj/item/device/dogborg/sleeper/K9/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)
|
||||
/obj/item/dogborg/sleeper/K9/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)
|
||||
hound = loc
|
||||
|
||||
if(!istype(target))
|
||||
@@ -413,7 +413,7 @@
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/device/dogborg/sleeper/compactor //Janihound gut.
|
||||
/obj/item/dogborg/sleeper/compactor //Janihound gut.
|
||||
name = "garbage processor"
|
||||
desc = "A mounted garbage compactor unit with fuel processor."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
@@ -423,13 +423,13 @@
|
||||
injection_chems = null //So they don't have all the same chems as the medihound!
|
||||
var/max_item_count = 30
|
||||
|
||||
/obj/item/storage/attackby(obj/item/device/dogborg/sleeper/compactor, mob/user, proximity) //GIT CIRCUMVENTED YO!
|
||||
/obj/item/storage/attackby(obj/item/dogborg/sleeper/compactor, mob/user, proximity) //GIT CIRCUMVENTED YO!
|
||||
if(istype(compactor))
|
||||
compactor.afterattack(src, user ,1)
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/obj/item/device/dogborg/sleeper/compactor/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)//GARBO NOMS
|
||||
/obj/item/dogborg/sleeper/compactor/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)//GARBO NOMS
|
||||
hound = loc
|
||||
var/obj/item/target_obj = target
|
||||
if(!istype(target))
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/item/device/doorCharge
|
||||
/obj/item/doorCharge
|
||||
name = "airlock charge"
|
||||
desc = null //Different examine for traitors
|
||||
icon = 'icons/obj/device.dmi'
|
||||
item_state = "electronic"
|
||||
icon_state = "doorCharge"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
@@ -13,7 +14,7 @@
|
||||
attack_verb = list("blown up", "exploded", "detonated")
|
||||
materials = list(MAT_METAL=50, MAT_GLASS=30)
|
||||
|
||||
/obj/item/device/doorCharge/ex_act(severity, target)
|
||||
/obj/item/doorCharge/ex_act(severity, target)
|
||||
switch(severity)
|
||||
if(1)
|
||||
visible_message("<span class='warning'>[src] detonates!</span>")
|
||||
@@ -26,14 +27,14 @@
|
||||
if(prob(25))
|
||||
ex_act(EXPLODE_DEVASTATE)
|
||||
|
||||
/obj/item/device/doorCharge/Destroy()
|
||||
/obj/item/doorCharge/Destroy()
|
||||
if(istype(loc, /obj/machinery/door/airlock))
|
||||
var/obj/machinery/door/airlock/A = loc
|
||||
if(A.charge == src)
|
||||
A.charge = null
|
||||
return ..()
|
||||
|
||||
/obj/item/device/doorCharge/examine(mob/user)
|
||||
/obj/item/doorCharge/examine(mob/user)
|
||||
..()
|
||||
if(user.mind && user.mind.has_antag_datum(/datum/antagonist/traitor)) //No nuke ops because the device is excluded from nuclear
|
||||
to_chat(user, "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within.")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//Used by engineering cyborgs in place of generic circuits.
|
||||
/obj/item/device/electroadaptive_pseudocircuit
|
||||
/obj/item/electroadaptive_pseudocircuit
|
||||
name = "electroadaptive pseudocircuit"
|
||||
desc = "An all-in-one circuit imprinter, designer, synthesizer, outfitter, creator, and chef. It can be used in place of any generic circuit board during construction."
|
||||
icon = 'icons/obj/module.dmi'
|
||||
@@ -11,18 +11,18 @@
|
||||
var/static/recycleable_circuits = typecacheof(list(/obj/item/electronics/firelock, /obj/item/electronics/airalarm, /obj/item/electronics/firealarm, \
|
||||
/obj/item/electronics/apc))//A typecache of circuits consumable for material
|
||||
|
||||
/obj/item/device/electroadaptive_pseudocircuit/Initialize()
|
||||
/obj/item/electroadaptive_pseudocircuit/Initialize()
|
||||
. = ..()
|
||||
maptext = "[circuits]"
|
||||
|
||||
/obj/item/device/electroadaptive_pseudocircuit/examine(mob/user)
|
||||
/obj/item/electroadaptive_pseudocircuit/examine(mob/user)
|
||||
..()
|
||||
if(iscyborg(user))
|
||||
to_chat(user, "<span class='notice'>It has material for <b>[circuits]</b> circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.</span>")
|
||||
to_chat(user, "<span class='notice'>Serves as a substitute for <b>fire/air alarm</b>, <b>firelock</b>, and <b>APC</b> electronics.</span>")
|
||||
to_chat(user, "<span class='notice'>It can also be used on an APC with no power cell to <b>fabricate a low-capacity cell</b> at a high power cost.</span>")
|
||||
|
||||
/obj/item/device/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0)
|
||||
/obj/item/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0)
|
||||
if(QDELETED(R) || !istype(R))
|
||||
return
|
||||
if(!R.cell)
|
||||
@@ -46,7 +46,7 @@
|
||||
addtimer(CALLBACK(src, .proc/recharge), recharge_time)
|
||||
return TRUE //The actual circuit magic itself is done on a per-object basis
|
||||
|
||||
/obj/item/device/electroadaptive_pseudocircuit/afterattack(atom/target, mob/living/user, proximity)
|
||||
/obj/item/electroadaptive_pseudocircuit/afterattack(atom/target, mob/living/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(!is_type_in_typecache(target, recycleable_circuits))
|
||||
@@ -58,7 +58,7 @@
|
||||
playsound(user, 'sound/items/deconstruct.ogg', 50, TRUE)
|
||||
qdel(target)
|
||||
|
||||
/obj/item/device/electroadaptive_pseudocircuit/proc/recharge()
|
||||
/obj/item/electroadaptive_pseudocircuit/proc/recharge()
|
||||
playsound(src, 'sound/machines/chime.ogg', 25, TRUE)
|
||||
recharging = FALSE
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/flashlight
|
||||
/obj/item/flashlight
|
||||
name = "flashlight"
|
||||
desc = "A hand-held emergency light."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
@@ -8,18 +8,18 @@
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
materials = list(MAT_METAL=50, MAT_GLASS=20)
|
||||
actions_types = list(/datum/action/item_action/toggle_light)
|
||||
var/on = FALSE
|
||||
var/brightness_on = 4 //range of light when on
|
||||
var/flashlight_power = 1 //strength of the light when on
|
||||
|
||||
/obj/item/device/flashlight/Initialize()
|
||||
/obj/item/flashlight/Initialize()
|
||||
. = ..()
|
||||
update_brightness()
|
||||
|
||||
/obj/item/device/flashlight/proc/update_brightness(mob/user = null)
|
||||
/obj/item/flashlight/proc/update_brightness(mob/user = null)
|
||||
if(on)
|
||||
icon_state = "[initial(icon_state)]-on"
|
||||
if(flashlight_power)
|
||||
@@ -30,7 +30,7 @@
|
||||
icon_state = initial(icon_state)
|
||||
set_light(0)
|
||||
|
||||
/obj/item/device/flashlight/attack_self(mob/user)
|
||||
/obj/item/flashlight/attack_self(mob/user)
|
||||
on = !on
|
||||
update_brightness(user)
|
||||
for(var/X in actions)
|
||||
@@ -38,14 +38,14 @@
|
||||
A.UpdateButtonIcon()
|
||||
return 1
|
||||
|
||||
/obj/item/device/flashlight/suicide_act(mob/living/carbon/human/user)
|
||||
/obj/item/flashlight/suicide_act(mob/living/carbon/human/user)
|
||||
if (user.eye_blind)
|
||||
user.visible_message("<span class='suicide'>[user] is putting [src] close to [user.p_their()] eyes and turning it on ... but [user.p_theyre()] blind!</span>")
|
||||
return SHAME
|
||||
user.visible_message("<span class='suicide'>[user] is putting [src] close to [user.p_their()] eyes and turning it on! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (FIRELOSS)
|
||||
|
||||
/obj/item/device/flashlight/attack(mob/living/carbon/M, mob/living/carbon/human/user)
|
||||
/obj/item/flashlight/attack(mob/living/carbon/M, mob/living/carbon/human/user)
|
||||
add_fingerprint(user)
|
||||
if(istype(M) && on && user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH))
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/flashlight/pen
|
||||
/obj/item/flashlight/pen
|
||||
name = "penlight"
|
||||
desc = "A pen-sized light, used by medical staff. It can also be used to create a hologram to alert people of incoming medical assistance."
|
||||
icon_state = "penlight"
|
||||
@@ -167,7 +167,7 @@
|
||||
brightness_on = 2
|
||||
var/holo_cooldown = 0
|
||||
|
||||
/obj/item/device/flashlight/pen/afterattack(atom/target, mob/user, proximity_flag)
|
||||
/obj/item/flashlight/pen/afterattack(atom/target, mob/user, proximity_flag)
|
||||
if(!proximity_flag)
|
||||
if(holo_cooldown > world.time)
|
||||
to_chat(user, "<span class='warning'>[src] is not ready yet!</span>")
|
||||
@@ -192,7 +192,7 @@
|
||||
visible_message("<span class='danger'>[creator] created a medical hologram!</span>")
|
||||
|
||||
|
||||
/obj/item/device/flashlight/seclite
|
||||
/obj/item/flashlight/seclite
|
||||
name = "seclite"
|
||||
desc = "A robust flashlight used by security."
|
||||
icon_state = "seclite"
|
||||
@@ -204,7 +204,7 @@
|
||||
hitsound = 'sound/weapons/genhit1.ogg'
|
||||
|
||||
// the desk lamps are a bit special
|
||||
/obj/item/device/flashlight/lamp
|
||||
/obj/item/flashlight/lamp
|
||||
name = "desk lamp"
|
||||
desc = "A desk lamp with an adjustable mount."
|
||||
icon_state = "lamp"
|
||||
@@ -220,14 +220,14 @@
|
||||
|
||||
|
||||
// green-shaded desk lamp
|
||||
/obj/item/device/flashlight/lamp/green
|
||||
/obj/item/flashlight/lamp/green
|
||||
desc = "A classic green-shaded desk lamp."
|
||||
icon_state = "lampgreen"
|
||||
item_state = "lampgreen"
|
||||
|
||||
|
||||
|
||||
/obj/item/device/flashlight/lamp/verb/toggle_light()
|
||||
/obj/item/flashlight/lamp/verb/toggle_light()
|
||||
set name = "Toggle light"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
@@ -236,7 +236,7 @@
|
||||
attack_self(usr)
|
||||
|
||||
//Bananalamp
|
||||
/obj/item/device/flashlight/lamp/bananalamp
|
||||
/obj/item/flashlight/lamp/bananalamp
|
||||
name = "banana lamp"
|
||||
desc = "Only a clown would think to make a ghetto banana-shaped lamp. Even has a goofy pullstring."
|
||||
icon_state = "bananalamp"
|
||||
@@ -244,7 +244,7 @@
|
||||
|
||||
// FLARES
|
||||
|
||||
/obj/item/device/flashlight/flare
|
||||
/obj/item/flashlight/flare
|
||||
name = "flare"
|
||||
desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
@@ -259,11 +259,11 @@
|
||||
light_color = LIGHT_COLOR_FLARE
|
||||
grind_results = list("sulfur" = 15)
|
||||
|
||||
/obj/item/device/flashlight/flare/New()
|
||||
/obj/item/flashlight/flare/New()
|
||||
fuel = rand(800, 1000) // Sorry for changing this so much but I keep under-estimating how long X number of ticks last in seconds.
|
||||
..()
|
||||
|
||||
/obj/item/device/flashlight/flare/process()
|
||||
/obj/item/flashlight/flare/process()
|
||||
open_flame(heat)
|
||||
fuel = max(fuel - 1, 0)
|
||||
if(!fuel || !on)
|
||||
@@ -272,14 +272,14 @@
|
||||
icon_state = "[initial(icon_state)]-empty"
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/device/flashlight/flare/ignition_effect(atom/A, mob/user)
|
||||
/obj/item/flashlight/flare/ignition_effect(atom/A, mob/user)
|
||||
if(fuel && on)
|
||||
. = "<span class='notice'>[user] lights [A] with [src] like a real \
|
||||
badass.</span>"
|
||||
else
|
||||
. = ""
|
||||
|
||||
/obj/item/device/flashlight/flare/proc/turn_off()
|
||||
/obj/item/flashlight/flare/proc/turn_off()
|
||||
on = FALSE
|
||||
force = initial(src.force)
|
||||
damtype = initial(src.damtype)
|
||||
@@ -289,14 +289,14 @@
|
||||
else
|
||||
update_brightness(null)
|
||||
|
||||
/obj/item/device/flashlight/flare/update_brightness(mob/user = null)
|
||||
/obj/item/flashlight/flare/update_brightness(mob/user = null)
|
||||
..()
|
||||
if(on)
|
||||
item_state = "[initial(item_state)]-on"
|
||||
else
|
||||
item_state = "[initial(item_state)]"
|
||||
|
||||
/obj/item/device/flashlight/flare/attack_self(mob/user)
|
||||
/obj/item/flashlight/flare/attack_self(mob/user)
|
||||
|
||||
// Usual checks
|
||||
if(!fuel)
|
||||
@@ -314,10 +314,10 @@
|
||||
damtype = "fire"
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/device/flashlight/flare/is_hot()
|
||||
/obj/item/flashlight/flare/is_hot()
|
||||
return on * heat
|
||||
|
||||
/obj/item/device/flashlight/flare/torch
|
||||
/obj/item/flashlight/flare/torch
|
||||
name = "torch"
|
||||
desc = "A torch fashioned from some leaves and a log."
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
@@ -330,7 +330,7 @@
|
||||
on_damage = 10
|
||||
slot_flags = null
|
||||
|
||||
/obj/item/device/flashlight/lantern
|
||||
/obj/item/flashlight/lantern
|
||||
name = "lantern"
|
||||
icon_state = "lantern"
|
||||
item_state = "lantern"
|
||||
@@ -340,7 +340,7 @@
|
||||
brightness_on = 6 // luminosity when on
|
||||
|
||||
|
||||
/obj/item/device/flashlight/slime
|
||||
/obj/item/flashlight/slime
|
||||
gender = PLURAL
|
||||
name = "glowing slime extract"
|
||||
desc = "Extract from a yellow slime. It emits a strong light when squeezed."
|
||||
@@ -348,25 +348,25 @@
|
||||
icon_state = "slime"
|
||||
item_state = "slime"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
materials = list()
|
||||
brightness_on = 6 //luminosity when on
|
||||
|
||||
/obj/item/device/flashlight/emp
|
||||
/obj/item/flashlight/emp
|
||||
var/emp_max_charges = 4
|
||||
var/emp_cur_charges = 4
|
||||
var/charge_tick = 0
|
||||
|
||||
|
||||
/obj/item/device/flashlight/emp/New()
|
||||
/obj/item/flashlight/emp/New()
|
||||
..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/device/flashlight/emp/Destroy()
|
||||
/obj/item/flashlight/emp/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/device/flashlight/emp/process()
|
||||
/obj/item/flashlight/emp/process()
|
||||
charge_tick++
|
||||
if(charge_tick < 10)
|
||||
return FALSE
|
||||
@@ -374,12 +374,12 @@
|
||||
emp_cur_charges = min(emp_cur_charges+1, emp_max_charges)
|
||||
return TRUE
|
||||
|
||||
/obj/item/device/flashlight/emp/attack(mob/living/M, mob/living/user)
|
||||
/obj/item/flashlight/emp/attack(mob/living/M, mob/living/user)
|
||||
if(on && user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH)) // call original attack when examining organs
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/device/flashlight/emp/afterattack(atom/movable/A, mob/user, proximity)
|
||||
/obj/item/flashlight/emp/afterattack(atom/movable/A, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
@@ -401,7 +401,7 @@
|
||||
|
||||
// Glowsticks, in the uncomfortable range of similar to flares,
|
||||
// but not similar enough to make it worth a refactor
|
||||
/obj/item/device/flashlight/glowstick
|
||||
/obj/item/flashlight/glowstick
|
||||
name = "glowstick"
|
||||
desc = "A military-grade glowstick."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
@@ -412,27 +412,27 @@
|
||||
grind_results = list("phenol" = 15, "hydrogen" = 10, "oxygen" = 5) //Meth-in-a-stick
|
||||
var/fuel = 0
|
||||
|
||||
/obj/item/device/flashlight/glowstick/Initialize()
|
||||
/obj/item/flashlight/glowstick/Initialize()
|
||||
fuel = rand(1600, 2000)
|
||||
light_color = color
|
||||
. = ..()
|
||||
|
||||
/obj/item/device/flashlight/glowstick/Destroy()
|
||||
/obj/item/flashlight/glowstick/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/device/flashlight/glowstick/process()
|
||||
/obj/item/flashlight/glowstick/process()
|
||||
fuel = max(fuel - 1, 0)
|
||||
if(!fuel)
|
||||
turn_off()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/flashlight/glowstick/proc/turn_off()
|
||||
/obj/item/flashlight/glowstick/proc/turn_off()
|
||||
on = FALSE
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/flashlight/glowstick/update_icon()
|
||||
/obj/item/flashlight/glowstick/update_icon()
|
||||
item_state = "glowstick"
|
||||
cut_overlays()
|
||||
if(!fuel)
|
||||
@@ -449,7 +449,7 @@
|
||||
icon_state = "glowstick"
|
||||
cut_overlays()
|
||||
|
||||
/obj/item/device/flashlight/glowstick/attack_self(mob/user)
|
||||
/obj/item/flashlight/glowstick/attack_self(mob/user)
|
||||
if(!fuel)
|
||||
to_chat(user, "<span class='notice'>[src] is spent.</span>")
|
||||
return
|
||||
@@ -462,47 +462,47 @@
|
||||
user.visible_message("<span class='notice'>[user] cracks and shakes [src].</span>", "<span class='notice'>You crack and shake [src], turning it on!</span>")
|
||||
activate()
|
||||
|
||||
/obj/item/device/flashlight/glowstick/proc/activate()
|
||||
/obj/item/flashlight/glowstick/proc/activate()
|
||||
if(!on)
|
||||
on = TRUE
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/device/flashlight/glowstick/red
|
||||
/obj/item/flashlight/glowstick/red
|
||||
name = "red glowstick"
|
||||
color = LIGHT_COLOR_RED
|
||||
|
||||
/obj/item/device/flashlight/glowstick/blue
|
||||
/obj/item/flashlight/glowstick/blue
|
||||
name = "blue glowstick"
|
||||
color = LIGHT_COLOR_BLUE
|
||||
|
||||
/obj/item/device/flashlight/glowstick/cyan
|
||||
/obj/item/flashlight/glowstick/cyan
|
||||
name = "cyan glowstick"
|
||||
color = LIGHT_COLOR_CYAN
|
||||
|
||||
/obj/item/device/flashlight/glowstick/orange
|
||||
/obj/item/flashlight/glowstick/orange
|
||||
name = "orange glowstick"
|
||||
color = LIGHT_COLOR_ORANGE
|
||||
|
||||
/obj/item/device/flashlight/glowstick/yellow
|
||||
/obj/item/flashlight/glowstick/yellow
|
||||
name = "yellow glowstick"
|
||||
color = LIGHT_COLOR_YELLOW
|
||||
|
||||
/obj/item/device/flashlight/glowstick/pink
|
||||
/obj/item/flashlight/glowstick/pink
|
||||
name = "pink glowstick"
|
||||
color = LIGHT_COLOR_PINK
|
||||
|
||||
/obj/item/device/flashlight/glowstick/random
|
||||
/obj/item/flashlight/glowstick/random
|
||||
name = "random colored glowstick"
|
||||
icon_state = "random_glowstick"
|
||||
color = null
|
||||
|
||||
/obj/item/device/flashlight/glowstick/random/Initialize()
|
||||
/obj/item/flashlight/glowstick/random/Initialize()
|
||||
..()
|
||||
var/T = pick(typesof(/obj/item/device/flashlight/glowstick) - /obj/item/device/flashlight/glowstick/random)
|
||||
var/T = pick(typesof(/obj/item/flashlight/glowstick) - /obj/item/flashlight/glowstick/random)
|
||||
new T(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/device/flashlight/spotlight //invisible lighting source
|
||||
/obj/item/flashlight/spotlight //invisible lighting source
|
||||
name = "disco light"
|
||||
desc = "Groovy..."
|
||||
icon_state = null
|
||||
@@ -517,7 +517,7 @@
|
||||
var/range = null
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
|
||||
/obj/item/device/flashlight/flashdark
|
||||
/obj/item/flashlight/flashdark
|
||||
name = "flashdark"
|
||||
desc = "A strange device manufactured with mysterious elements that somehow emits darkness. Or maybe it just sucks in light? Nobody knows for sure."
|
||||
icon_state = "flashdark"
|
||||
@@ -525,7 +525,7 @@
|
||||
brightness_on = 2.5
|
||||
flashlight_power = -3
|
||||
|
||||
/obj/item/device/flashlight/eyelight
|
||||
/obj/item/flashlight/eyelight
|
||||
name = "eyelight"
|
||||
desc = "This shouldn't exist outside of someone's head, how are you seeing this?"
|
||||
brightness_on = 15
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
/obj/item/device/forcefield
|
||||
/obj/item/forcefield
|
||||
name = "forcefield projector"
|
||||
desc = "An experimental device that can create several forcefields at a distance."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "signmaker_engi"
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
flags_1 = NOBLUDGEON_1
|
||||
item_state = "electronic"
|
||||
@@ -15,7 +16,7 @@
|
||||
var/list/current_fields
|
||||
var/field_distance_limit = 7
|
||||
|
||||
/obj/item/device/forcefield/afterattack(atom/target, mob/user, proximity_flag)
|
||||
/obj/item/forcefield/afterattack(atom/target, mob/user, proximity_flag)
|
||||
if(!check_allowed_items(target, 1))
|
||||
return
|
||||
if(istype(target, /obj/structure/projected_forcefield))
|
||||
@@ -39,27 +40,27 @@
|
||||
current_fields += F
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
|
||||
/obj/item/device/forcefield/attack_self(mob/user)
|
||||
/obj/item/forcefield/attack_self(mob/user)
|
||||
if(LAZYLEN(current_fields))
|
||||
to_chat(user, "<span class='notice'>You deactivate [src], disabling all active forcefields.</span>")
|
||||
for(var/obj/structure/projected_forcefield/F in current_fields)
|
||||
qdel(F)
|
||||
|
||||
/obj/item/device/forcefield/examine(mob/user)
|
||||
/obj/item/forcefield/examine(mob/user)
|
||||
..()
|
||||
var/percent_charge = round((shield_integrity/max_shield_integrity)*100)
|
||||
to_chat(user, "<span class='notice'>It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [percent_charge]% charged.</span>")
|
||||
|
||||
/obj/item/device/forcefield/Initialize(mapload)
|
||||
/obj/item/forcefield/Initialize(mapload)
|
||||
..()
|
||||
current_fields = list()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/device/forcefield/Destroy()
|
||||
/obj/item/forcefield/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/forcefield/process()
|
||||
/obj/item/forcefield/process()
|
||||
if(!LAZYLEN(current_fields))
|
||||
shield_integrity = min(shield_integrity + 4, max_shield_integrity)
|
||||
else
|
||||
@@ -80,9 +81,9 @@
|
||||
resistance_flags = INDESTRUCTIBLE
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
armor = list("melee" = 0, "bullet" = 25, "laser" = 50, "energy" = 50, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
var/obj/item/device/forcefield/generator
|
||||
var/obj/item/forcefield/generator
|
||||
|
||||
/obj/structure/projected_forcefield/Initialize(mapload, obj/item/device/forcefield/origin)
|
||||
/obj/structure/projected_forcefield/Initialize(mapload, obj/item/forcefield/origin)
|
||||
. = ..()
|
||||
generator = origin
|
||||
|
||||
|
||||
@@ -8,15 +8,16 @@
|
||||
|
||||
#define RAD_GRACE_PERIOD 2
|
||||
|
||||
/obj/item/device/geiger_counter //DISCLAIMER: I know nothing about how real-life Geiger counters work. This will not be realistic. ~Xhuis
|
||||
/obj/item/geiger_counter //DISCLAIMER: I know nothing about how real-life Geiger counters work. This will not be realistic. ~Xhuis
|
||||
name = "geiger counter"
|
||||
desc = "A handheld device used for detecting and measuring radiation pulses."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "geiger_off"
|
||||
item_state = "multitool"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
materials = list(MAT_METAL = 150, MAT_GLASS = 150)
|
||||
|
||||
var/grace = RAD_GRACE_PERIOD
|
||||
@@ -29,17 +30,17 @@
|
||||
var/fail_to_receive = 0
|
||||
var/current_warning = 1
|
||||
|
||||
/obj/item/device/geiger_counter/Initialize()
|
||||
/obj/item/geiger_counter/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
soundloop = new(list(src), FALSE)
|
||||
|
||||
/obj/item/device/geiger_counter/Destroy()
|
||||
/obj/item/geiger_counter/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/geiger_counter/process()
|
||||
/obj/item/geiger_counter/process()
|
||||
update_icon()
|
||||
update_sound()
|
||||
|
||||
@@ -61,7 +62,7 @@
|
||||
|
||||
current_tick_amount = 0
|
||||
|
||||
/obj/item/device/geiger_counter/examine(mob/user)
|
||||
/obj/item/geiger_counter/examine(mob/user)
|
||||
..()
|
||||
if(!scanning)
|
||||
return 1
|
||||
@@ -85,7 +86,7 @@
|
||||
|
||||
to_chat(user, "<span class='notice'>The last radiation amount detected was [last_tick_amount]</span>")
|
||||
|
||||
/obj/item/device/geiger_counter/update_icon()
|
||||
/obj/item/geiger_counter/update_icon()
|
||||
if(!scanning)
|
||||
icon_state = "geiger_off"
|
||||
return 1
|
||||
@@ -107,7 +108,7 @@
|
||||
icon_state = "geiger_on_5"
|
||||
..()
|
||||
|
||||
/obj/item/device/geiger_counter/proc/update_sound()
|
||||
/obj/item/geiger_counter/proc/update_sound()
|
||||
var/datum/looping_sound/geiger/loop = soundloop
|
||||
if(!scanning)
|
||||
loop.stop()
|
||||
@@ -118,31 +119,31 @@
|
||||
loop.last_radiation = radiation_count
|
||||
loop.start()
|
||||
|
||||
/obj/item/device/geiger_counter/rad_act(amount)
|
||||
/obj/item/geiger_counter/rad_act(amount)
|
||||
. = ..()
|
||||
if(amount <= RAD_BACKGROUND_RADIATION || !scanning)
|
||||
return
|
||||
current_tick_amount += amount
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/geiger_counter/attack_self(mob/user)
|
||||
/obj/item/geiger_counter/attack_self(mob/user)
|
||||
scanning = !scanning
|
||||
update_icon()
|
||||
to_chat(user, "<span class='notice'>[icon2html(src, user)] You switch [scanning ? "on" : "off"] [src].</span>")
|
||||
|
||||
/obj/item/device/geiger_counter/attack(mob/living/M, mob/user)
|
||||
/obj/item/geiger_counter/afterattack(atom/target, mob/user)
|
||||
if(user.a_intent == INTENT_HELP)
|
||||
if(!(obj_flags & EMAGGED))
|
||||
user.visible_message("<span class='notice'>[user] scans [M] with [src].</span>", "<span class='notice'>You scan [M]'s radiation levels with [src]...</span>")
|
||||
addtimer(CALLBACK(src, .proc/scan, M, user), 20, TIMER_UNIQUE) // Let's not have spamming GetAllContents
|
||||
user.visible_message("<span class='notice'>[user] scans [target] with [src].</span>", "<span class='notice'>You scan [target]'s radiation levels with [src]...</span>")
|
||||
addtimer(CALLBACK(src, .proc/scan, target, user), 20, TIMER_UNIQUE) // Let's not have spamming GetAllContents
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] scans [M] with [src].</span>", "<span class='danger'>You project [src]'s stored radiation into [M]'s body!</span>")
|
||||
M.rad_act(radiation_count)
|
||||
user.visible_message("<span class='notice'>[user] scans [target] with [src].</span>", "<span class='danger'>You project [src]'s stored radiation into [target]!</span>")
|
||||
target.rad_act(radiation_count)
|
||||
radiation_count = 0
|
||||
return 1
|
||||
..()
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/obj/item/device/geiger_counter/proc/scan(atom/A, mob/user)
|
||||
/obj/item/geiger_counter/proc/scan(atom/A, mob/user)
|
||||
var/rad_strength = 0
|
||||
for(var/i in get_rad_contents(A)) // Yes it's intentional that you can't detect radioactive things under rad protection. Gives traitors a way to hide their glowing green rocks.
|
||||
var/atom/thing = i
|
||||
@@ -160,11 +161,11 @@
|
||||
to_chat(user, "<span class='boldannounce'>[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation].</span>")
|
||||
|
||||
if(rad_strength)
|
||||
to_chat(user, "<span class='boldannounce'>[icon2html(src, user)] Subject has irradiated objects on them. Radioactive strength: [rad_strength]</span>")
|
||||
to_chat(user, "<span class='boldannounce'>[icon2html(src, user)] Target contains radioactive contamination. Radioactive strength: [rad_strength]</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[icon2html(src, user)] Subject is free of radioactive contamination.</span>")
|
||||
to_chat(user, "<span class='notice'>[icon2html(src, user)] Target is free of radioactive contamination.</span>")
|
||||
|
||||
/obj/item/device/geiger_counter/attackby(obj/item/I, mob/user, params)
|
||||
/obj/item/geiger_counter/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/screwdriver) && (obj_flags & EMAGGED))
|
||||
if(scanning)
|
||||
to_chat(user, "<span class='warning'>Turn off [src] before you perform this action!</span>")
|
||||
@@ -180,7 +181,7 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/geiger_counter/AltClick(mob/living/user)
|
||||
/obj/item/geiger_counter/AltClick(mob/living/user)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
|
||||
return ..()
|
||||
if(!scanning)
|
||||
@@ -190,7 +191,7 @@
|
||||
to_chat(usr, "<span class='notice'>You flush [src]'s radiation counts, resetting it to normal.</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/geiger_counter/emag_act(mob/user)
|
||||
/obj/item/geiger_counter/emag_act(mob/user)
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
if(scanning)
|
||||
@@ -199,17 +200,17 @@
|
||||
to_chat(user, "<span class='warning'>You override [src]'s radiation storing protocols. It will now generate small doses of radiation, and stored rads are now projected into creatures you scan.</span>")
|
||||
obj_flags |= EMAGGED
|
||||
|
||||
/obj/item/device/geiger_counter/cyborg
|
||||
/obj/item/geiger_counter/cyborg
|
||||
var/datum/component/mobhook
|
||||
|
||||
/obj/item/device/geiger_counter/cyborg/equipped(mob/user)
|
||||
/obj/item/geiger_counter/cyborg/equipped(mob/user)
|
||||
. = ..()
|
||||
if (mobhook && mobhook.parent != user)
|
||||
QDEL_NULL(mobhook)
|
||||
if (!mobhook)
|
||||
mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_ATOM_RAD_ACT), CALLBACK(src, /atom.proc/rad_act))
|
||||
|
||||
/obj/item/device/geiger_counter/cyborg/dropped()
|
||||
/obj/item/geiger_counter/cyborg/dropped()
|
||||
. = ..()
|
||||
QDEL_NULL(mobhook)
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
GLOBAL_LIST_EMPTY(GPS_list)
|
||||
/obj/item/device/gps
|
||||
/obj/item/gps
|
||||
name = "global positioning system"
|
||||
desc = "Helping lost spacemen find their way through the planets since 2016."
|
||||
icon = 'icons/obj/telescience.dmi'
|
||||
icon_state = "gps-c"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
obj_flags = UNIQUE_RENAME
|
||||
var/gpstag = "COM0"
|
||||
var/emped = FALSE
|
||||
@@ -14,38 +14,38 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user.
|
||||
var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown
|
||||
|
||||
/obj/item/device/gps/examine(mob/user)
|
||||
/obj/item/gps/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to switch it [tracking ? "off":"on"].</span>")
|
||||
|
||||
/obj/item/device/gps/Initialize()
|
||||
/obj/item/gps/Initialize()
|
||||
. = ..()
|
||||
GLOB.GPS_list += src
|
||||
name = "global positioning system ([gpstag])"
|
||||
add_overlay("working")
|
||||
|
||||
/obj/item/device/gps/Destroy()
|
||||
/obj/item/gps/Destroy()
|
||||
GLOB.GPS_list -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/device/gps/emp_act(severity)
|
||||
/obj/item/gps/emp_act(severity)
|
||||
emped = TRUE
|
||||
cut_overlay("working")
|
||||
add_overlay("emp")
|
||||
addtimer(CALLBACK(src, .proc/reboot), 300, TIMER_OVERRIDE) //if a new EMP happens, remove the old timer so it doesn't reactivate early
|
||||
SStgui.close_uis(src) //Close the UI control if it is open.
|
||||
|
||||
/obj/item/device/gps/proc/reboot()
|
||||
/obj/item/gps/proc/reboot()
|
||||
emped = FALSE
|
||||
cut_overlay("emp")
|
||||
add_overlay("working")
|
||||
|
||||
/obj/item/device/gps/AltClick(mob/user)
|
||||
/obj/item/gps/AltClick(mob/user)
|
||||
if(!user.canUseTopic(src, BE_CLOSE))
|
||||
return
|
||||
toggletracking(user)
|
||||
|
||||
/obj/item/device/gps/proc/toggletracking(mob/user)
|
||||
/obj/item/gps/proc/toggletracking(mob/user)
|
||||
if(!user.canUseTopic(src, BE_CLOSE))
|
||||
return //user not valid to use gps
|
||||
if(emped)
|
||||
@@ -61,7 +61,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
tracking = TRUE
|
||||
|
||||
|
||||
/obj/item/device/gps/ui_interact(mob/user, ui_key = "gps", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state.
|
||||
/obj/item/gps/ui_interact(mob/user, ui_key = "gps", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state.
|
||||
if(emped)
|
||||
to_chat(user, "[src] fizzles weakly.")
|
||||
return
|
||||
@@ -74,7 +74,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
ui.set_autoupdate(state = updating)
|
||||
|
||||
|
||||
/obj/item/device/gps/ui_data(mob/user)
|
||||
/obj/item/gps/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["power"] = tracking
|
||||
data["tag"] = gpstag
|
||||
@@ -90,7 +90,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
data["signals"] = list()
|
||||
|
||||
for(var/gps in GLOB.GPS_list)
|
||||
var/obj/item/device/gps/G = gps
|
||||
var/obj/item/gps/G = gps
|
||||
if(G.emped || !G.tracking || G == src)
|
||||
continue
|
||||
var/turf/pos = get_turf(G)
|
||||
@@ -115,7 +115,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
|
||||
|
||||
|
||||
/obj/item/device/gps/ui_act(action, params)
|
||||
/obj/item/gps/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
@@ -137,42 +137,42 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
. = TRUE
|
||||
|
||||
|
||||
/obj/item/device/gps/science
|
||||
/obj/item/gps/science
|
||||
icon_state = "gps-s"
|
||||
gpstag = "SCI0"
|
||||
|
||||
/obj/item/device/gps/engineering
|
||||
/obj/item/gps/engineering
|
||||
icon_state = "gps-e"
|
||||
gpstag = "ENG0"
|
||||
|
||||
/obj/item/device/gps/mining
|
||||
/obj/item/gps/mining
|
||||
icon_state = "gps-m"
|
||||
gpstag = "MINE0"
|
||||
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
|
||||
|
||||
/obj/item/device/gps/cyborg
|
||||
/obj/item/gps/cyborg
|
||||
icon_state = "gps-b"
|
||||
gpstag = "BORG0"
|
||||
desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams."
|
||||
flags_1 = NODROP_1
|
||||
|
||||
/obj/item/device/gps/internal
|
||||
/obj/item/gps/internal
|
||||
icon_state = null
|
||||
flags_1 = ABSTRACT_1
|
||||
gpstag = "Eerie Signal"
|
||||
desc = "Report to a coder immediately."
|
||||
invisibility = INVISIBILITY_MAXIMUM
|
||||
|
||||
/obj/item/device/gps/mining/internal
|
||||
/obj/item/gps/mining/internal
|
||||
icon_state = "gps-m"
|
||||
gpstag = "MINER"
|
||||
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
|
||||
|
||||
/obj/item/device/gps/internal/base
|
||||
/obj/item/gps/internal/base
|
||||
gpstag = "NT_AUX"
|
||||
desc = "A homing signal from Nanotrasen's mining base."
|
||||
|
||||
/obj/item/device/gps/visible_debug
|
||||
/obj/item/gps/visible_debug
|
||||
name = "visible GPS"
|
||||
gpstag = "ADMIN"
|
||||
desc = "This admin-spawn GPS unit leaves the coordinates visible \
|
||||
@@ -180,12 +180,12 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
for marking the area around the transition edges."
|
||||
var/list/turf/tagged
|
||||
|
||||
/obj/item/device/gps/visible_debug/Initialize()
|
||||
/obj/item/gps/visible_debug/Initialize()
|
||||
. = ..()
|
||||
tagged = list()
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
|
||||
/obj/item/device/gps/visible_debug/process()
|
||||
/obj/item/gps/visible_debug/process()
|
||||
var/turf/T = get_turf(src)
|
||||
if(T)
|
||||
// I assume it's faster to color,tag and OR the turf in, rather
|
||||
@@ -194,13 +194,13 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
T.maptext = "[T.x],[T.y],[T.z]"
|
||||
tagged |= T
|
||||
|
||||
/obj/item/device/gps/visible_debug/proc/clear()
|
||||
/obj/item/gps/visible_debug/proc/clear()
|
||||
while(tagged.len)
|
||||
var/turf/T = pop(tagged)
|
||||
T.color = initial(T.color)
|
||||
T.maptext = initial(T.maptext)
|
||||
|
||||
/obj/item/device/gps/visible_debug/Destroy()
|
||||
/obj/item/gps/visible_debug/Destroy()
|
||||
if(tagged)
|
||||
clear()
|
||||
tagged = null
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//copy pasta of the space piano, don't hurt me -Pete
|
||||
/obj/item/device/instrument
|
||||
/obj/item/instrument
|
||||
name = "generic instrument"
|
||||
resistance_flags = FLAMMABLE
|
||||
force = 10
|
||||
@@ -11,34 +11,34 @@
|
||||
var/instrumentId = "generic"
|
||||
var/instrumentExt = "mid"
|
||||
|
||||
/obj/item/device/instrument/Initialize()
|
||||
/obj/item/instrument/Initialize()
|
||||
. = ..()
|
||||
song = new(instrumentId, src, instrumentExt)
|
||||
|
||||
/obj/item/device/instrument/Destroy()
|
||||
/obj/item/instrument/Destroy()
|
||||
qdel(song)
|
||||
song = null
|
||||
return ..()
|
||||
|
||||
/obj/item/device/instrument/suicide_act(mob/user)
|
||||
/obj/item/instrument/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins to play 'Gloomy Sunday'! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (BRUTELOSS)
|
||||
|
||||
/obj/item/device/instrument/Initialize(mapload)
|
||||
/obj/item/instrument/Initialize(mapload)
|
||||
. = ..()
|
||||
if(mapload)
|
||||
song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded
|
||||
|
||||
/obj/item/device/instrument/attack_self(mob/user)
|
||||
/obj/item/instrument/attack_self(mob/user)
|
||||
if(!user.IsAdvancedToolUser())
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return 1
|
||||
interact(user)
|
||||
|
||||
/obj/item/device/instrument/interact(mob/user)
|
||||
/obj/item/instrument/interact(mob/user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/device/instrument/ui_interact(mob/user)
|
||||
/obj/item/instrument/ui_interact(mob/user)
|
||||
if(!user)
|
||||
return
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
user.set_machine(src)
|
||||
song.interact(user)
|
||||
|
||||
/obj/item/device/instrument/violin
|
||||
/obj/item/instrument/violin
|
||||
name = "space violin"
|
||||
desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\""
|
||||
icon_state = "violin"
|
||||
@@ -56,14 +56,14 @@
|
||||
hitsound = "swing_hit"
|
||||
instrumentId = "violin"
|
||||
|
||||
/obj/item/device/instrument/violin/golden
|
||||
/obj/item/instrument/violin/golden
|
||||
name = "golden violin"
|
||||
desc = "A golden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\""
|
||||
icon_state = "golden_violin"
|
||||
item_state = "golden_violin"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/device/instrument/piano_synth
|
||||
/obj/item/instrument/piano_synth
|
||||
name = "synthesizer"
|
||||
desc = "An advanced electronic synthesizer that can be used as various instruments."
|
||||
icon_state = "synth"
|
||||
@@ -73,11 +73,11 @@
|
||||
var/static/list/insTypes = list("accordion" = "mid", "bikehorn" = "ogg", "glockenspiel" = "mid", "guitar" = "ogg", "harmonica" = "mid", "piano" = "ogg", "recorder" = "mid", "saxophone" = "mid", "trombone" = "mid", "violin" = "mid", "xylophone" = "mid") //No eguitar you ear-rapey fuckers.
|
||||
actions_types = list(/datum/action/item_action/synthswitch)
|
||||
|
||||
/obj/item/device/instrument/piano_synth/proc/changeInstrument(name = "piano")
|
||||
/obj/item/instrument/piano_synth/proc/changeInstrument(name = "piano")
|
||||
song.instrumentDir = name
|
||||
song.instrumentExt = insTypes[name]
|
||||
|
||||
/obj/item/device/instrument/guitar
|
||||
/obj/item/instrument/guitar
|
||||
name = "guitar"
|
||||
desc = "It's made of wood and has bronze strings."
|
||||
icon_state = "guitar"
|
||||
@@ -87,7 +87,7 @@
|
||||
hitsound = 'sound/weapons/stringsmash.ogg'
|
||||
instrumentId = "guitar"
|
||||
|
||||
/obj/item/device/instrument/eguitar
|
||||
/obj/item/instrument/eguitar
|
||||
name = "electric guitar"
|
||||
desc = "Makes all your shredding needs possible."
|
||||
icon_state = "eguitar"
|
||||
@@ -98,28 +98,28 @@
|
||||
instrumentId = "eguitar"
|
||||
instrumentExt = "ogg"
|
||||
|
||||
/obj/item/device/instrument/glockenspiel
|
||||
/obj/item/instrument/glockenspiel
|
||||
name = "glockenspiel"
|
||||
desc = "Smooth metal bars perfect for any marching band."
|
||||
icon_state = "glockenspiel"
|
||||
item_state = "glockenspiel"
|
||||
instrumentId = "glockenspiel"
|
||||
|
||||
/obj/item/device/instrument/accordion
|
||||
/obj/item/instrument/accordion
|
||||
name = "accordion"
|
||||
desc = "Pun-Pun not included."
|
||||
icon_state = "accordion"
|
||||
item_state = "accordion"
|
||||
instrumentId = "accordion"
|
||||
|
||||
/obj/item/device/instrument/trumpet
|
||||
/obj/item/instrument/trumpet
|
||||
name = "trumpet"
|
||||
desc = "To announce the arrival of the king!"
|
||||
icon_state = "trumpet"
|
||||
item_state = "trombone"
|
||||
instrumentId = "trombone"
|
||||
|
||||
/obj/item/device/instrument/trumpet/spectral
|
||||
/obj/item/instrument/trumpet/spectral
|
||||
name = "spectral trumpet"
|
||||
desc = "Things are about to get spooky!"
|
||||
icon_state = "trumpet"
|
||||
@@ -128,22 +128,22 @@
|
||||
instrumentId = "trombone"
|
||||
attack_verb = list("played","jazzed","trumpeted","mourned","dooted","spooked")
|
||||
|
||||
/obj/item/device/instrument/trumpet/spectral/Initialize()
|
||||
/obj/item/instrument/trumpet/spectral/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/spooky)
|
||||
|
||||
/obj/item/device/instrument/trumpet/spectral/attack(mob/living/carbon/C, mob/user)
|
||||
/obj/item/instrument/trumpet/spectral/attack(mob/living/carbon/C, mob/user)
|
||||
playsound (loc, 'sound/instruments/trombone/En4.mid', 100,1,-1)
|
||||
..()
|
||||
|
||||
/obj/item/device/instrument/saxophone
|
||||
/obj/item/instrument/saxophone
|
||||
name = "saxophone"
|
||||
desc = "This soothing sound will be sure to leave your audience in tears."
|
||||
icon_state = "saxophone"
|
||||
item_state = "saxophone"
|
||||
instrumentId = "saxophone"
|
||||
|
||||
/obj/item/device/instrument/saxophone/spectral
|
||||
/obj/item/instrument/saxophone/spectral
|
||||
name = "spectral saxophone"
|
||||
desc = "This spooky sound will be sure to leave mortals in bones."
|
||||
icon_state = "saxophone"
|
||||
@@ -152,22 +152,22 @@
|
||||
force = 0
|
||||
attack_verb = list("played","jazzed","saxxed","mourned","dooted","spooked")
|
||||
|
||||
/obj/item/device/instrument/saxophone/spectral/Initialize()
|
||||
/obj/item/instrument/saxophone/spectral/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/spooky)
|
||||
|
||||
/obj/item/device/instrument/saxophone/spectral/attack(mob/living/carbon/C, mob/user)
|
||||
/obj/item/instrument/saxophone/spectral/attack(mob/living/carbon/C, mob/user)
|
||||
playsound (loc, 'sound/instruments/saxophone/En4.mid', 100,1,-1)
|
||||
..()
|
||||
|
||||
/obj/item/device/instrument/trombone
|
||||
/obj/item/instrument/trombone
|
||||
name = "trombone"
|
||||
desc = "How can any pool table ever hope to compete?"
|
||||
icon_state = "trombone"
|
||||
item_state = "trombone"
|
||||
instrumentId = "trombone"
|
||||
|
||||
/obj/item/device/instrument/trombone/spectral
|
||||
/obj/item/instrument/trombone/spectral
|
||||
name = "spectral trombone"
|
||||
desc = "A skeleton's favorite instrument. Apply directly on the mortals."
|
||||
instrumentId = "trombone"
|
||||
@@ -176,15 +176,15 @@
|
||||
force = 0
|
||||
attack_verb = list("played","jazzed","tromboned","mourned","dooted","spooked")
|
||||
|
||||
/obj/item/device/instrument/trombone/spectral/Initialize()
|
||||
/obj/item/instrument/trombone/spectral/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/spooky)
|
||||
|
||||
/obj/item/device/instrument/trombone/spectral/attack(mob/living/carbon/C, mob/user)
|
||||
/obj/item/instrument/trombone/spectral/attack(mob/living/carbon/C, mob/user)
|
||||
playsound (loc, 'sound/instruments/trombone/Cn4.mid', 100,1,-1)
|
||||
..()
|
||||
|
||||
/obj/item/device/instrument/recorder
|
||||
/obj/item/instrument/recorder
|
||||
name = "recorder"
|
||||
desc = "Just like in school, playing ability and all."
|
||||
force = 5
|
||||
@@ -192,24 +192,24 @@
|
||||
item_state = "recorder"
|
||||
instrumentId = "recorder"
|
||||
|
||||
/obj/item/device/instrument/harmonica
|
||||
/obj/item/instrument/harmonica
|
||||
name = "harmonica"
|
||||
desc = "For when you get a bad case of the space blues."
|
||||
icon_state = "harmonica"
|
||||
item_state = "harmonica"
|
||||
instrumentId = "harmonica"
|
||||
slot_flags = SLOT_MASK
|
||||
slot_flags = ITEM_SLOT_MASK
|
||||
force = 5
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
actions_types = list(/datum/action/item_action/instrument)
|
||||
|
||||
/obj/item/device/instrument/harmonica/speechModification(message)
|
||||
/obj/item/instrument/harmonica/speechModification(message)
|
||||
if(song.playing && ismob(loc))
|
||||
to_chat(loc, "<span class='warning'>You stop playing the harmonica to talk...</span>")
|
||||
song.playing = FALSE
|
||||
return message
|
||||
|
||||
/obj/item/device/instrument/bikehorn
|
||||
/obj/item/instrument/bikehorn
|
||||
name = "gilded bike horn"
|
||||
desc = "An exquisitely decorated bike horn, capable of honking in a variety of notes."
|
||||
icon_state = "bike_horn"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/laser_pointer
|
||||
/obj/item/laser_pointer
|
||||
name = "laser pointer"
|
||||
desc = "Don't shine it in your eyes!"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
@@ -6,7 +6,7 @@
|
||||
item_state = "pen"
|
||||
var/pointer_icon_state
|
||||
flags_1 = CONDUCT_1 | NOBLUDGEON_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
materials = list(MAT_METAL=500, MAT_GLASS=500)
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/turf/pointer_loc
|
||||
@@ -18,26 +18,26 @@
|
||||
var/obj/item/stock_parts/micro_laser/diode //used for upgrading!
|
||||
|
||||
|
||||
/obj/item/device/laser_pointer/red
|
||||
/obj/item/laser_pointer/red
|
||||
pointer_icon_state = "red_laser"
|
||||
/obj/item/device/laser_pointer/green
|
||||
/obj/item/laser_pointer/green
|
||||
pointer_icon_state = "green_laser"
|
||||
/obj/item/device/laser_pointer/blue
|
||||
/obj/item/laser_pointer/blue
|
||||
pointer_icon_state = "blue_laser"
|
||||
/obj/item/device/laser_pointer/purple
|
||||
/obj/item/laser_pointer/purple
|
||||
pointer_icon_state = "purple_laser"
|
||||
|
||||
/obj/item/device/laser_pointer/New()
|
||||
/obj/item/laser_pointer/New()
|
||||
..()
|
||||
diode = new(src)
|
||||
if(!pointer_icon_state)
|
||||
pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
|
||||
|
||||
/obj/item/device/laser_pointer/upgraded/New()
|
||||
/obj/item/laser_pointer/upgraded/New()
|
||||
..()
|
||||
diode = new /obj/item/stock_parts/micro_laser/ultra
|
||||
|
||||
/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user, params)
|
||||
/obj/item/laser_pointer/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/stock_parts/micro_laser))
|
||||
if(!diode)
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
@@ -55,10 +55,10 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/laser_pointer/afterattack(atom/target, mob/living/user, flag, params)
|
||||
/obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params)
|
||||
laser_act(target, user, params)
|
||||
|
||||
/obj/item/device/laser_pointer/proc/laser_act(atom/target, mob/living/user, params)
|
||||
/obj/item/laser_pointer/proc/laser_act(atom/target, mob/living/user, params)
|
||||
if( !(user in (viewers(7,target))) )
|
||||
return
|
||||
if (!diode)
|
||||
@@ -182,7 +182,7 @@
|
||||
flick_overlay_view(I, targloc, 10)
|
||||
icon_state = "pointer"
|
||||
|
||||
/obj/item/device/laser_pointer/process()
|
||||
/obj/item/laser_pointer/process()
|
||||
if(prob(20 - recharge_locked*5))
|
||||
energy += 1
|
||||
if(energy >= max_energy)
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
#define LIGHT_BURNED 3
|
||||
|
||||
|
||||
/obj/item/device/lightreplacer
|
||||
/obj/item/lightreplacer
|
||||
|
||||
name = "light replacer"
|
||||
desc = "A device to automatically replace lights. Refill with broken or working lightbulbs, or sheets of glass."
|
||||
@@ -50,7 +50,7 @@
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 8
|
||||
|
||||
var/max_uses = 20
|
||||
@@ -67,16 +67,16 @@
|
||||
// when we get this many shards, we get a free bulb.
|
||||
var/shards_required = 4
|
||||
|
||||
/obj/item/device/lightreplacer/New()
|
||||
/obj/item/lightreplacer/New()
|
||||
uses = max_uses / 2
|
||||
failmsg = "The [name]'s refill light blinks red."
|
||||
..()
|
||||
|
||||
/obj/item/device/lightreplacer/examine(mob/user)
|
||||
/obj/item/lightreplacer/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, status_string())
|
||||
|
||||
/obj/item/device/lightreplacer/attackby(obj/item/W, mob/user, params)
|
||||
/obj/item/lightreplacer/attackby(obj/item/W, mob/user, params)
|
||||
|
||||
if(istype(W, /obj/item/stack/sheet/glass))
|
||||
var/obj/item/stack/sheet/glass/G = W
|
||||
@@ -148,30 +148,30 @@
|
||||
|
||||
to_chat(user, "<span class='notice'>You fill \the [src] with lights from \the [S]. " + status_string() + "</span>")
|
||||
|
||||
/obj/item/device/lightreplacer/emag_act()
|
||||
/obj/item/lightreplacer/emag_act()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
Emag()
|
||||
|
||||
/obj/item/device/lightreplacer/attack_self(mob/user)
|
||||
/obj/item/lightreplacer/attack_self(mob/user)
|
||||
to_chat(user, status_string())
|
||||
|
||||
/obj/item/device/lightreplacer/update_icon()
|
||||
/obj/item/lightreplacer/update_icon()
|
||||
icon_state = "lightreplacer[(obj_flags & EMAGGED ? 1 : 0)]"
|
||||
|
||||
/obj/item/device/lightreplacer/proc/status_string()
|
||||
/obj/item/lightreplacer/proc/status_string()
|
||||
return "It has [uses] light\s remaining (plus [bulb_shards] fragment\s)."
|
||||
|
||||
/obj/item/device/lightreplacer/proc/Use(mob/user)
|
||||
/obj/item/lightreplacer/proc/Use(mob/user)
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
|
||||
AddUses(-1)
|
||||
return 1
|
||||
|
||||
// Negative numbers will subtract
|
||||
/obj/item/device/lightreplacer/proc/AddUses(amount = 1)
|
||||
/obj/item/lightreplacer/proc/AddUses(amount = 1)
|
||||
uses = CLAMP(uses + amount, 0, max_uses)
|
||||
|
||||
/obj/item/device/lightreplacer/proc/AddShards(amount = 1, user)
|
||||
/obj/item/lightreplacer/proc/AddShards(amount = 1, user)
|
||||
bulb_shards += amount
|
||||
var/new_bulbs = round(bulb_shards / shards_required)
|
||||
if(new_bulbs > 0)
|
||||
@@ -182,13 +182,13 @@
|
||||
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
|
||||
return new_bulbs
|
||||
|
||||
/obj/item/device/lightreplacer/proc/Charge(var/mob/user)
|
||||
/obj/item/lightreplacer/proc/Charge(var/mob/user)
|
||||
charge += 1
|
||||
if(charge > 3)
|
||||
AddUses(1)
|
||||
charge = 1
|
||||
|
||||
/obj/item/device/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U)
|
||||
/obj/item/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U)
|
||||
|
||||
if(target.status != LIGHT_OK)
|
||||
if(CanUse(U))
|
||||
@@ -222,7 +222,7 @@
|
||||
to_chat(U, "<span class='warning'>There is a working [target.fitting] already inserted!</span>")
|
||||
return
|
||||
|
||||
/obj/item/device/lightreplacer/proc/Emag()
|
||||
/obj/item/lightreplacer/proc/Emag()
|
||||
obj_flags ^= EMAGGED
|
||||
playsound(src.loc, "sparks", 100, 1)
|
||||
if(obj_flags & EMAGGED)
|
||||
@@ -231,14 +231,14 @@
|
||||
name = initial(name)
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/lightreplacer/proc/CanUse(mob/living/user)
|
||||
/obj/item/lightreplacer/proc/CanUse(mob/living/user)
|
||||
src.add_fingerprint(user)
|
||||
if(uses > 0)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/device/lightreplacer/afterattack(atom/T, mob/U, proximity)
|
||||
/obj/item/lightreplacer/afterattack(atom/T, mob/U, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(!isturf(T))
|
||||
@@ -255,12 +255,12 @@
|
||||
if(!used)
|
||||
to_chat(U, failmsg)
|
||||
|
||||
/obj/item/device/lightreplacer/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J)
|
||||
/obj/item/lightreplacer/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J)
|
||||
J.put_in_cart(src, user)
|
||||
J.myreplacer = src
|
||||
J.update_icon()
|
||||
|
||||
/obj/item/device/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
|
||||
/obj/item/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
|
||||
return
|
||||
|
||||
#undef LIGHT_OK
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/item/device/megaphone
|
||||
/obj/item/megaphone
|
||||
name = "megaphone"
|
||||
desc = "A device used to project your voice. Loudly."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "megaphone"
|
||||
item_state = "radio"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
@@ -10,13 +11,13 @@
|
||||
var/spamcheck = 0
|
||||
var/list/voicespan = list(SPAN_COMMAND)
|
||||
|
||||
/obj/item/device/megaphone/suicide_act(mob/living/carbon/user)
|
||||
/obj/item/megaphone/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] is uttering [user.p_their()] last words into \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
spamcheck = 0//so they dont have to worry about recharging
|
||||
user.say("AAAAAAAAAAAARGHHHHH")//he must have died while coding this
|
||||
return OXYLOSS
|
||||
|
||||
/obj/item/device/megaphone/get_held_item_speechspans(mob/living/carbon/user)
|
||||
/obj/item/megaphone/get_held_item_speechspans(mob/living/carbon/user)
|
||||
if(spamcheck > world.time)
|
||||
to_chat(user, "<span class='warning'>\The [src] needs to recharge!</span>")
|
||||
else
|
||||
@@ -24,26 +25,26 @@
|
||||
spamcheck = world.time + 50
|
||||
return voicespan
|
||||
|
||||
/obj/item/device/megaphone/emag_act(mob/user)
|
||||
/obj/item/megaphone/emag_act(mob/user)
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You overload \the [src]'s voice synthesizer.</span>")
|
||||
obj_flags |= EMAGGED
|
||||
voicespan = list(SPAN_REALLYBIG, "userdanger")
|
||||
|
||||
/obj/item/device/megaphone/sec
|
||||
/obj/item/megaphone/sec
|
||||
name = "security megaphone"
|
||||
icon_state = "megaphone-sec"
|
||||
|
||||
/obj/item/device/megaphone/command
|
||||
/obj/item/megaphone/command
|
||||
name = "command megaphone"
|
||||
icon_state = "megaphone-command"
|
||||
|
||||
/obj/item/device/megaphone/cargo
|
||||
/obj/item/megaphone/cargo
|
||||
name = "supply megaphone"
|
||||
icon_state = "megaphone-cargo"
|
||||
|
||||
/obj/item/device/megaphone/clown
|
||||
/obj/item/megaphone/clown
|
||||
name = "clown's megaphone"
|
||||
desc = "Something that should not exist."
|
||||
icon_state = "megaphone-clown"
|
||||
|
||||
@@ -10,9 +10,10 @@
|
||||
|
||||
|
||||
|
||||
/obj/item/device/multitool
|
||||
/obj/item/multitool
|
||||
name = "multitool"
|
||||
desc = "Used for pulsing wires to test which to cut. Not recommended by doctors."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "multitool"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
@@ -31,11 +32,11 @@
|
||||
var/datum/integrated_io/selected_io = null //functional for integrated circuits.
|
||||
var/mode = 0
|
||||
|
||||
/obj/item/device/multitool/suicide_act(mob/living/carbon/user)
|
||||
/obj/item/multitool/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] puts the [src] to [user.p_their()] chest. It looks like [user.p_theyre()] trying to pulse [user.p_their()] heart off!</span>")
|
||||
return OXYLOSS//theres a reason it wasnt recommended by doctors
|
||||
|
||||
/obj/item/device/multitool/attack_self(mob/user)
|
||||
/obj/item/multitool/attack_self(mob/user)
|
||||
if(selected_io)
|
||||
selected_io = null
|
||||
to_chat(user, "<span class='notice'>You clear the wired connection from the multitool.</span>")
|
||||
@@ -43,13 +44,13 @@
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/multitool/update_icon()
|
||||
/obj/item/multitool/update_icon()
|
||||
if(selected_io)
|
||||
icon_state = "multitool_red"
|
||||
else
|
||||
icon_state = "multitool"
|
||||
|
||||
/obj/item/device/multitool/proc/wire(var/datum/integrated_io/io, mob/user)
|
||||
/obj/item/multitool/proc/wire(var/datum/integrated_io/io, mob/user)
|
||||
if(!io.holder.assembly)
|
||||
to_chat(user, "<span class='warning'>\The [io.holder] needs to be secured inside an assembly first.</span>")
|
||||
return
|
||||
@@ -78,7 +79,7 @@
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/device/multitool/proc/unwire(var/datum/integrated_io/io1, var/datum/integrated_io/io2, mob/user)
|
||||
/obj/item/multitool/proc/unwire(var/datum/integrated_io/io1, var/datum/integrated_io/io2, mob/user)
|
||||
if(!io1.linked.len || !io2.linked.len)
|
||||
to_chat(user, "<span class='warning'>There is nothing connected to the data channel.</span>")
|
||||
return
|
||||
@@ -98,22 +99,22 @@
|
||||
// Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby.
|
||||
|
||||
|
||||
/obj/item/device/multitool/ai_detect
|
||||
/obj/item/multitool/ai_detect
|
||||
var/track_cooldown = 0
|
||||
var/track_delay = 10 //How often it checks for proximity
|
||||
var/detect_state = PROXIMITY_NONE
|
||||
var/rangealert = 8 //Glows red when inside
|
||||
var/rangewarning = 20 //Glows yellow when inside
|
||||
|
||||
/obj/item/device/multitool/ai_detect/New()
|
||||
/obj/item/multitool/ai_detect/New()
|
||||
..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/device/multitool/ai_detect/Destroy()
|
||||
/obj/item/multitool/ai_detect/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/multitool/ai_detect/process()
|
||||
/obj/item/multitool/ai_detect/process()
|
||||
if(track_cooldown > world.time)
|
||||
return
|
||||
detect_state = PROXIMITY_NONE
|
||||
@@ -121,7 +122,7 @@
|
||||
icon_state = "[initial(icon_state)][detect_state]"
|
||||
track_cooldown = world.time + track_delay
|
||||
|
||||
/obj/item/device/multitool/ai_detect/proc/multitool_detect()
|
||||
/obj/item/multitool/ai_detect/proc/multitool_detect()
|
||||
var/turf/our_turf = get_turf(src)
|
||||
for(var/mob/living/silicon/ai/AI in GLOB.ai_list)
|
||||
if(AI.cameraFollow == src)
|
||||
@@ -141,11 +142,11 @@
|
||||
detect_state = PROXIMITY_NEAR
|
||||
break
|
||||
|
||||
/obj/item/device/multitool/ai_detect/admin
|
||||
/obj/item/multitool/ai_detect/admin
|
||||
desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'." //What else should I say for a meme item?
|
||||
track_delay = 5
|
||||
|
||||
/obj/item/device/multitool/ai_detect/admin/multitool_detect()
|
||||
/obj/item/multitool/ai_detect/admin/multitool_detect()
|
||||
var/turf/our_turf = get_turf(src)
|
||||
for(var/mob/J in urange(rangewarning,our_turf))
|
||||
if(GLOB.admin_datums[J.ckey])
|
||||
@@ -155,12 +156,12 @@
|
||||
detect_state = PROXIMITY_ON_SCREEN
|
||||
break
|
||||
|
||||
/obj/item/device/multitool/cyborg
|
||||
/obj/item/multitool/cyborg
|
||||
name = "multitool"
|
||||
desc = "Optimised and stripped-down version of a regular multitool."
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/device/multitool/abductor
|
||||
/obj/item/multitool/abductor
|
||||
name = "alien multitool"
|
||||
desc = "An omni-technological interface."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/paicard
|
||||
/obj/item/paicard
|
||||
name = "personal AI device"
|
||||
icon = 'icons/obj/aicards.dmi'
|
||||
icon_state = "pai"
|
||||
@@ -6,26 +6,26 @@
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
var/mob/living/silicon/pai/pai
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE
|
||||
|
||||
/obj/item/device/paicard/suicide_act(mob/living/user)
|
||||
/obj/item/paicard/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] is staring sadly at [src]! [user.p_they()] can't keep living without real human intimacy!</span>")
|
||||
return OXYLOSS
|
||||
|
||||
/obj/item/device/paicard/Initialize()
|
||||
/obj/item/paicard/Initialize()
|
||||
SSpai.pai_card_list += src
|
||||
add_overlay("pai-off")
|
||||
return ..()
|
||||
|
||||
/obj/item/device/paicard/Destroy()
|
||||
/obj/item/paicard/Destroy()
|
||||
//Will stop people throwing friend pAIs into the singularity so they can respawn
|
||||
SSpai.pai_card_list -= src
|
||||
QDEL_NULL(pai)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/paicard/attack_self(mob/user)
|
||||
/obj/item/paicard/attack_self(mob/user)
|
||||
if (!in_range(src, user))
|
||||
return
|
||||
user.set_machine(src)
|
||||
@@ -60,7 +60,7 @@
|
||||
onclose(user, "paicard")
|
||||
return
|
||||
|
||||
/obj/item/device/paicard/Topic(href, href_list)
|
||||
/obj/item/paicard/Topic(href, href_list)
|
||||
|
||||
if(!usr || usr.stat)
|
||||
return
|
||||
@@ -115,19 +115,19 @@
|
||||
// WIRE_RECEIVE = 2
|
||||
// WIRE_TRANSMIT = 4
|
||||
|
||||
/obj/item/device/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
|
||||
/obj/item/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
|
||||
src.pai = personality
|
||||
src.add_overlay("pai-null")
|
||||
|
||||
playsound(loc, 'sound/effects/pai_boot.ogg', 50, 1, -1)
|
||||
audible_message("\The [src] plays a cheerful startup noise!")
|
||||
|
||||
/obj/item/device/paicard/proc/removePersonality()
|
||||
/obj/item/paicard/proc/removePersonality()
|
||||
QDEL_NULL(pai)
|
||||
cut_overlays()
|
||||
add_overlay("pai-off")
|
||||
|
||||
/obj/item/device/paicard/proc/setEmotion(emotion)
|
||||
/obj/item/paicard/proc/setEmotion(emotion)
|
||||
if(pai)
|
||||
src.cut_overlays()
|
||||
switch(emotion)
|
||||
@@ -152,10 +152,10 @@
|
||||
if(10)
|
||||
src.add_overlay("pai-null")
|
||||
|
||||
/obj/item/device/paicard/proc/alertUpdate()
|
||||
/obj/item/paicard/proc/alertUpdate()
|
||||
visible_message("<span class ='info'>[src] flashes a message across its screen, \"Additional personalities available for download.\"", "<span class='notice'>[src] bleeps electronically.</span>")
|
||||
|
||||
/obj/item/device/paicard/emp_act(severity)
|
||||
/obj/item/paicard/emp_act(severity)
|
||||
if(pai)
|
||||
pai.emp_act(severity)
|
||||
..()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/pipe_painter
|
||||
/obj/item/pipe_painter
|
||||
name = "pipe painter"
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "labeler1"
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
materials = list(MAT_METAL=5000, MAT_GLASS=2000)
|
||||
|
||||
/obj/item/device/pipe_painter/afterattack(atom/A, mob/user, proximity_flag)
|
||||
/obj/item/pipe_painter/afterattack(atom/A, mob/user, proximity_flag)
|
||||
//Make sure we only paint adjacent items
|
||||
if(!proximity_flag)
|
||||
return
|
||||
@@ -21,9 +21,9 @@
|
||||
playsound(src, 'sound/machines/click.ogg', 50, 1)
|
||||
user.visible_message("<span class='notice'>[user] paints \the [P] [paint_color].</span>","<span class='notice'>You paint \the [P] [paint_color].</span>")
|
||||
|
||||
/obj/item/device/pipe_painter/attack_self(mob/user)
|
||||
/obj/item/pipe_painter/attack_self(mob/user)
|
||||
paint_color = input("Which colour do you want to use?","Pipe painter") in GLOB.pipe_paint_colors
|
||||
|
||||
/obj/item/device/pipe_painter/examine(mob/user)
|
||||
/obj/item/pipe_painter/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>It is set to [paint_color].</span>")
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
// Powersink - used to drain station power
|
||||
|
||||
/obj/item/device/powersink
|
||||
/obj/item/powersink
|
||||
desc = "A nulling power sink which drains energy from electrical systems."
|
||||
name = "power sink"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "powersink0"
|
||||
item_state = "electronic"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
@@ -25,10 +26,10 @@
|
||||
|
||||
var/obj/structure/cable/attached // the attached cable
|
||||
|
||||
/obj/item/device/powersink/update_icon()
|
||||
/obj/item/powersink/update_icon()
|
||||
icon_state = "powersink[mode == OPERATING]"
|
||||
|
||||
/obj/item/device/powersink/proc/set_mode(value)
|
||||
/obj/item/powersink/proc/set_mode(value)
|
||||
if(value == mode)
|
||||
return
|
||||
switch(value)
|
||||
@@ -55,7 +56,7 @@
|
||||
update_icon()
|
||||
set_light(0)
|
||||
|
||||
/obj/item/device/powersink/attackby(obj/item/I, mob/user, params)
|
||||
/obj/item/powersink/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(mode == DISCONNECTED)
|
||||
var/turf/T = loc
|
||||
@@ -80,13 +81,13 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/powersink/attack_paw()
|
||||
/obj/item/powersink/attack_paw()
|
||||
return
|
||||
|
||||
/obj/item/device/powersink/attack_ai()
|
||||
/obj/item/powersink/attack_ai()
|
||||
return
|
||||
|
||||
/obj/item/device/powersink/attack_hand(mob/user)
|
||||
/obj/item/powersink/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
@@ -110,7 +111,7 @@
|
||||
"<span class='italics'>You hear a click.</span>")
|
||||
set_mode(CLAMPED_OFF)
|
||||
|
||||
/obj/item/device/powersink/process()
|
||||
/obj/item/powersink/process()
|
||||
if(!attached)
|
||||
set_mode(DISCONNECTED)
|
||||
return
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
|
||||
/obj/item/device/pressure_plate
|
||||
/obj/item/pressure_plate
|
||||
name = "pressure plate"
|
||||
desc = "An electronic device that triggers when stepped on."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
item_state = "flash"
|
||||
icon_state = "pressureplate"
|
||||
level = 1
|
||||
@@ -9,7 +10,7 @@
|
||||
var/trigger_item = FALSE
|
||||
var/trigger_silent = FALSE
|
||||
var/sound/trigger_sound = 'sound/effects/pressureplate.ogg'
|
||||
var/obj/item/device/assembly/signaler/sigdev = null
|
||||
var/obj/item/assembly/signaler/sigdev = null
|
||||
var/roundstart_signaller = FALSE
|
||||
var/roundstart_signaller_freq = FREQ_PRESSURE_PLATE
|
||||
var/roundstart_signaller_code = 30
|
||||
@@ -20,7 +21,7 @@
|
||||
var/can_trigger = TRUE
|
||||
var/trigger_delay = 10
|
||||
|
||||
/obj/item/device/pressure_plate/Initialize()
|
||||
/obj/item/pressure_plate/Initialize()
|
||||
. = ..()
|
||||
tile_overlay = image(icon = 'icons/turf/floors.dmi', icon_state = "pp_overlay")
|
||||
if(roundstart_signaller)
|
||||
@@ -30,7 +31,7 @@
|
||||
if(isopenturf(loc))
|
||||
hide(TRUE)
|
||||
|
||||
/obj/item/device/pressure_plate/Crossed(atom/movable/AM)
|
||||
/obj/item/pressure_plate/Crossed(atom/movable/AM)
|
||||
. = ..()
|
||||
if(!can_trigger || !active)
|
||||
return
|
||||
@@ -42,18 +43,18 @@
|
||||
can_trigger = FALSE
|
||||
addtimer(CALLBACK(src, .proc/trigger), trigger_delay)
|
||||
|
||||
/obj/item/device/pressure_plate/proc/trigger()
|
||||
/obj/item/pressure_plate/proc/trigger()
|
||||
can_trigger = TRUE
|
||||
if(istype(sigdev))
|
||||
sigdev.signal()
|
||||
|
||||
/obj/item/device/pressure_plate/attackby(obj/item/I, mob/living/L)
|
||||
if(istype(I, /obj/item/device/assembly/signaler) && !istype(sigdev) && removable_signaller && L.transferItemToLoc(I, src))
|
||||
/obj/item/pressure_plate/attackby(obj/item/I, mob/living/L)
|
||||
if(istype(I, /obj/item/assembly/signaler) && !istype(sigdev) && removable_signaller && L.transferItemToLoc(I, src))
|
||||
sigdev = I
|
||||
to_chat(L, "<span class='notice'>You attach [I] to [src]!</span>")
|
||||
return ..()
|
||||
|
||||
/obj/item/device/pressure_plate/attack_self(mob/living/L)
|
||||
/obj/item/pressure_plate/attack_self(mob/living/L)
|
||||
if(removable_signaller && istype(sigdev))
|
||||
to_chat(L, "<span class='notice'>You remove [sigdev] from [src]</span>")
|
||||
if(!L.put_in_hands(sigdev))
|
||||
@@ -61,7 +62,7 @@
|
||||
sigdev = null
|
||||
return ..()
|
||||
|
||||
/obj/item/device/pressure_plate/hide(yes)
|
||||
/obj/item/pressure_plate/hide(yes)
|
||||
if(yes)
|
||||
invisibility = INVISIBILITY_MAXIMUM
|
||||
anchored = TRUE
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/electropack
|
||||
/obj/item/electropack
|
||||
name = "electropack"
|
||||
desc = "Dance my monkeys! DANCE!!!"
|
||||
icon = 'icons/obj/radio.dmi'
|
||||
@@ -7,7 +7,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
materials = list(MAT_METAL=10000, MAT_GLASS=2500)
|
||||
var/on = TRUE
|
||||
@@ -15,20 +15,20 @@
|
||||
var/frequency = FREQ_ELECTROPACK
|
||||
var/shock_cooldown = 0
|
||||
|
||||
/obj/item/device/electropack/suicide_act(mob/user)
|
||||
/obj/item/electropack/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] hooks [user.p_them()]self to the electropack and spams the trigger! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (FIRELOSS)
|
||||
|
||||
/obj/item/device/electropack/Initialize()
|
||||
/obj/item/electropack/Initialize()
|
||||
. = ..()
|
||||
SSradio.add_object(src, frequency, RADIO_SIGNALER)
|
||||
|
||||
/obj/item/device/electropack/Destroy()
|
||||
/obj/item/electropack/Destroy()
|
||||
SSradio.remove_object(src, frequency)
|
||||
return ..()
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/device/electropack/attack_hand(mob/user)
|
||||
/obj/item/electropack/attack_hand(mob/user)
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
if(src == C.back)
|
||||
@@ -36,7 +36,7 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/device/electropack/attackby(obj/item/W, mob/user, params)
|
||||
/obj/item/electropack/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/clothing/head/helmet))
|
||||
var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit( user )
|
||||
A.icon = 'icons/obj/assemblies.dmi'
|
||||
@@ -58,7 +58,7 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/electropack/Topic(href, href_list)
|
||||
/obj/item/electropack/Topic(href, href_list)
|
||||
//..()
|
||||
var/mob/living/carbon/C = usr
|
||||
if(usr.stat || usr.restrained() || C.back == src)
|
||||
@@ -98,7 +98,7 @@
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/device/electropack/receive_signal(datum/signal/signal)
|
||||
/obj/item/electropack/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.data["code"] != code)
|
||||
return
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
master.receive_signal()
|
||||
return
|
||||
|
||||
/obj/item/device/electropack/attack_self(mob/user)
|
||||
/obj/item/electropack/attack_self(mob/user)
|
||||
|
||||
if(!ishuman(user))
|
||||
return
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/encryptionkey
|
||||
/obj/item/encryptionkey
|
||||
name = "standard encryption key"
|
||||
desc = "An encryption key for a radio headset. Has no special codes in it. WHY DOES IT EXIST? ASK NANOTRASEN."
|
||||
icon = 'icons/obj/radio.dmi'
|
||||
@@ -9,124 +9,124 @@
|
||||
var/independent = FALSE
|
||||
var/list/channels = list()
|
||||
|
||||
/obj/item/device/encryptionkey/syndicate
|
||||
/obj/item/encryptionkey/syndicate
|
||||
name = "syndicate encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the syndicate channel, use :t."
|
||||
icon_state = "syn_cypherkey"
|
||||
channels = list("Syndicate" = 1)
|
||||
syndie = 1//Signifies that it de-crypts Syndicate transmissions
|
||||
|
||||
/obj/item/device/encryptionkey/binary
|
||||
/obj/item/encryptionkey/binary
|
||||
name = "binary translator key"
|
||||
desc = "An encryption key for a radio headset. To access the binary channel, use :b."
|
||||
icon_state = "bin_cypherkey"
|
||||
translate_binary = TRUE
|
||||
|
||||
/obj/item/device/encryptionkey/headset_sec
|
||||
/obj/item/encryptionkey/headset_sec
|
||||
name = "security radio encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the security channel, use :s."
|
||||
icon_state = "sec_cypherkey"
|
||||
channels = list("Security" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_eng
|
||||
/obj/item/encryptionkey/headset_eng
|
||||
name = "engineering radio encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the engineering channel, use :e."
|
||||
icon_state = "eng_cypherkey"
|
||||
channels = list("Engineering" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_rob
|
||||
/obj/item/encryptionkey/headset_rob
|
||||
name = "robotics radio encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the engineering channel, use :e. For research, use :n."
|
||||
icon_state = "rob_cypherkey"
|
||||
channels = list("Science" = 1, "Engineering" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_med
|
||||
/obj/item/encryptionkey/headset_med
|
||||
name = "medical radio encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the medical channel, use :m."
|
||||
icon_state = "med_cypherkey"
|
||||
channels = list("Medical" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_sci
|
||||
/obj/item/encryptionkey/headset_sci
|
||||
name = "science radio encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the science channel, use :n."
|
||||
icon_state = "sci_cypherkey"
|
||||
channels = list("Science" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_medsci
|
||||
/obj/item/encryptionkey/headset_medsci
|
||||
name = "medical research radio encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the medical channel, use :m. For science, use :n."
|
||||
icon_state = "medsci_cypherkey"
|
||||
channels = list("Science" = 1, "Medical" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_com
|
||||
/obj/item/encryptionkey/headset_com
|
||||
name = "command radio encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the command channel, use :c."
|
||||
icon_state = "com_cypherkey"
|
||||
channels = list("Command" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/heads/captain
|
||||
/obj/item/encryptionkey/heads/captain
|
||||
name = "\proper the captain's encryption key"
|
||||
desc = "An encryption key for a radio headset. Channels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
|
||||
icon_state = "cap_cypherkey"
|
||||
channels = list("Command" = 1, "Security" = 1, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0)
|
||||
|
||||
/obj/item/device/encryptionkey/heads/rd
|
||||
/obj/item/encryptionkey/heads/rd
|
||||
name = "\proper the research director's encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the science channel, use :n. For command, use :c."
|
||||
icon_state = "rd_cypherkey"
|
||||
channels = list("Science" = 1, "Command" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/heads/hos
|
||||
/obj/item/encryptionkey/heads/hos
|
||||
name = "\proper the head of security's encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the security channel, use :s. For command, use :c."
|
||||
icon_state = "hos_cypherkey"
|
||||
channels = list("Security" = 1, "Command" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/heads/ce
|
||||
/obj/item/encryptionkey/heads/ce
|
||||
name = "\proper the chief engineer's encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the engineering channel, use :e. For command, use :c."
|
||||
icon_state = "ce_cypherkey"
|
||||
channels = list("Engineering" = 1, "Command" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/heads/cmo
|
||||
/obj/item/encryptionkey/heads/cmo
|
||||
name = "\proper the chief medical officer's encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the medical channel, use :m. For command, use :c."
|
||||
icon_state = "cmo_cypherkey"
|
||||
channels = list("Medical" = 1, "Command" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/heads/hop
|
||||
/obj/item/encryptionkey/heads/hop
|
||||
name = "\proper the head of personnel's encryption key"
|
||||
desc = "An encryption key for a radio headset. Channels are as follows: :u - supply, :v - service, :c - command."
|
||||
icon_state = "hop_cypherkey"
|
||||
channels = list("Supply" = 1, "Service" = 1, "Command" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_cargo
|
||||
/obj/item/encryptionkey/headset_cargo
|
||||
name = "supply radio encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the supply channel, use :u."
|
||||
icon_state = "cargo_cypherkey"
|
||||
channels = list("Supply" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_mining
|
||||
/obj/item/encryptionkey/headset_mining
|
||||
name = "mining radio encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the supply channel, use :u. For science, use :n."
|
||||
icon_state = "cargo_cypherkey"
|
||||
channels = list("Supply" = 1, "Science" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_service
|
||||
/obj/item/encryptionkey/headset_service
|
||||
name = "service radio encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the service channel, use :v."
|
||||
icon_state = "srv_cypherkey"
|
||||
channels = list("Service" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_cent
|
||||
/obj/item/encryptionkey/headset_cent
|
||||
name = "\improper CentCom radio encryption key"
|
||||
desc = "An encryption key for a radio headset. To access the CentCom channel, use :y."
|
||||
icon_state = "cent_cypherkey"
|
||||
independent = TRUE
|
||||
channels = list("CentCom" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/ai //ported from NT, this goes 'inside' the AI.
|
||||
/obj/item/encryptionkey/ai //ported from NT, this goes 'inside' the AI.
|
||||
channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/secbot
|
||||
/obj/item/encryptionkey/secbot
|
||||
channels = list("AI Private"=1,"Security"=1)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/radio/headset
|
||||
/obj/item/radio/headset
|
||||
name = "radio headset"
|
||||
desc = "An updated, modular intercom that fits over the head. Takes encryption keys."
|
||||
icon_state = "headset"
|
||||
@@ -7,34 +7,34 @@
|
||||
subspace_transmission = TRUE
|
||||
canhear_range = 0 // can't hear headsets from very far away
|
||||
|
||||
slot_flags = SLOT_EARS
|
||||
var/obj/item/device/encryptionkey/keyslot2 = null
|
||||
slot_flags = ITEM_SLOT_EARS
|
||||
var/obj/item/encryptionkey/keyslot2 = null
|
||||
dog_fashion = null
|
||||
|
||||
/obj/item/device/radio/headset/suicide_act(mob/living/carbon/user)
|
||||
/obj/item/radio/headset/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins putting \the [src]'s antenna up [user.p_their()] nose! It looks like [user.p_theyre()] trying to give [user.p_them()]self cancer!</span>")
|
||||
return TOXLOSS
|
||||
|
||||
/obj/item/device/radio/headset/examine(mob/user)
|
||||
/obj/item/radio/headset/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>To speak on the general radio frequency, use ; before speaking.</span>")
|
||||
if (command)
|
||||
to_chat(user, "<span class='notice'>Alt-click to toggle the high-volume mode.</span>")
|
||||
|
||||
/obj/item/device/radio/headset/Initialize()
|
||||
/obj/item/radio/headset/Initialize()
|
||||
. = ..()
|
||||
recalculateChannels()
|
||||
|
||||
/obj/item/device/radio/headset/Destroy()
|
||||
/obj/item/radio/headset/Destroy()
|
||||
QDEL_NULL(keyslot2)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/headset/talk_into(mob/living/M, message, channel, list/spans,datum/language/language)
|
||||
/obj/item/radio/headset/talk_into(mob/living/M, message, channel, list/spans,datum/language/language)
|
||||
if (!listening)
|
||||
return ITALICS | REDUCE_RANGE
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/headset/can_receive(freq, level, AIuser)
|
||||
/obj/item/radio/headset/can_receive(freq, level, AIuser)
|
||||
if(ishuman(src.loc))
|
||||
var/mob/living/carbon/human/H = src.loc
|
||||
if(H.ears == src)
|
||||
@@ -43,165 +43,165 @@
|
||||
return ..(freq, level)
|
||||
return FALSE
|
||||
|
||||
/obj/item/device/radio/headset/syndicate //disguised to look like a normal headset for stealth ops
|
||||
/obj/item/radio/headset/syndicate //disguised to look like a normal headset for stealth ops
|
||||
|
||||
/obj/item/device/radio/headset/syndicate/alt //undisguised bowman with flash protection
|
||||
/obj/item/radio/headset/syndicate/alt //undisguised bowman with flash protection
|
||||
name = "syndicate headset"
|
||||
desc = "A syndicate headset that can be used to hear all radio frequencies. Protects ears from flashbangs. \nTo access the syndicate channel, use ; before speaking."
|
||||
icon_state = "syndie_headset"
|
||||
item_state = "syndie_headset"
|
||||
flags_2 = BANG_PROTECT_2 | NO_EMP_WIRES_2
|
||||
|
||||
/obj/item/device/radio/headset/syndicate/alt/leader
|
||||
/obj/item/radio/headset/syndicate/alt/leader
|
||||
name = "team leader headset"
|
||||
command = TRUE
|
||||
|
||||
/obj/item/device/radio/headset/syndicate/Initialize()
|
||||
/obj/item/radio/headset/syndicate/Initialize()
|
||||
. = ..()
|
||||
make_syndie()
|
||||
|
||||
/obj/item/device/radio/headset/binary
|
||||
/obj/item/device/radio/headset/binary/Initialize()
|
||||
/obj/item/radio/headset/binary
|
||||
/obj/item/radio/headset/binary/Initialize()
|
||||
. = ..()
|
||||
qdel(keyslot)
|
||||
keyslot = new /obj/item/device/encryptionkey/binary
|
||||
keyslot = new /obj/item/encryptionkey/binary
|
||||
recalculateChannels()
|
||||
|
||||
/obj/item/device/radio/headset/headset_sec
|
||||
/obj/item/radio/headset/headset_sec
|
||||
name = "security radio headset"
|
||||
desc = "This is used by your elite security force.\nTo access the security channel, use :s."
|
||||
icon_state = "sec_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/headset_sec
|
||||
keyslot = new /obj/item/encryptionkey/headset_sec
|
||||
|
||||
/obj/item/device/radio/headset/headset_sec/alt
|
||||
/obj/item/radio/headset/headset_sec/alt
|
||||
name = "security bowman headset"
|
||||
desc = "This is used by your elite security force. Protects ears from flashbangs.\nTo access the security channel, use :s."
|
||||
icon_state = "sec_headset_alt"
|
||||
item_state = "sec_headset_alt"
|
||||
flags_2 = BANG_PROTECT_2 | NO_EMP_WIRES_2
|
||||
|
||||
/obj/item/device/radio/headset/headset_eng
|
||||
/obj/item/radio/headset/headset_eng
|
||||
name = "engineering radio headset"
|
||||
desc = "When the engineers wish to chat like girls.\nTo access the engineering channel, use :e."
|
||||
icon_state = "eng_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/headset_eng
|
||||
keyslot = new /obj/item/encryptionkey/headset_eng
|
||||
|
||||
/obj/item/device/radio/headset/headset_rob
|
||||
/obj/item/radio/headset/headset_rob
|
||||
name = "robotics radio headset"
|
||||
desc = "Made specifically for the roboticists, who cannot decide between departments.\nTo access the engineering channel, use :e. For research, use :n."
|
||||
icon_state = "rob_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/headset_rob
|
||||
keyslot = new /obj/item/encryptionkey/headset_rob
|
||||
|
||||
/obj/item/device/radio/headset/headset_med
|
||||
/obj/item/radio/headset/headset_med
|
||||
name = "medical radio headset"
|
||||
desc = "A headset for the trained staff of the medbay.\nTo access the medical channel, use :m."
|
||||
icon_state = "med_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/headset_med
|
||||
keyslot = new /obj/item/encryptionkey/headset_med
|
||||
|
||||
/obj/item/device/radio/headset/headset_sci
|
||||
/obj/item/radio/headset/headset_sci
|
||||
name = "science radio headset"
|
||||
desc = "A sciency headset. Like usual.\nTo access the science channel, use :n."
|
||||
icon_state = "sci_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/headset_sci
|
||||
keyslot = new /obj/item/encryptionkey/headset_sci
|
||||
|
||||
/obj/item/device/radio/headset/headset_medsci
|
||||
/obj/item/radio/headset/headset_medsci
|
||||
name = "medical research radio headset"
|
||||
desc = "A headset that is a result of the mating between medical and science.\nTo access the medical channel, use :m. For science, use :n."
|
||||
icon_state = "medsci_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/headset_medsci
|
||||
keyslot = new /obj/item/encryptionkey/headset_medsci
|
||||
|
||||
/obj/item/device/radio/headset/headset_com
|
||||
/obj/item/radio/headset/headset_com
|
||||
name = "command radio headset"
|
||||
desc = "A headset with a commanding channel.\nTo access the command channel, use :c."
|
||||
icon_state = "com_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/headset_com
|
||||
keyslot = new /obj/item/encryptionkey/headset_com
|
||||
|
||||
/obj/item/device/radio/headset/heads
|
||||
/obj/item/radio/headset/heads
|
||||
command = TRUE
|
||||
|
||||
/obj/item/device/radio/headset/heads/captain
|
||||
/obj/item/radio/headset/heads/captain
|
||||
name = "\proper the captain's headset"
|
||||
desc = "The headset of the king.\nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
|
||||
icon_state = "com_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/heads/captain
|
||||
keyslot = new /obj/item/encryptionkey/heads/captain
|
||||
|
||||
/obj/item/device/radio/headset/heads/captain/alt
|
||||
/obj/item/radio/headset/heads/captain/alt
|
||||
name = "\proper the captain's bowman headset"
|
||||
desc = "The headset of the boss. Protects ears from flashbangs.\nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
|
||||
icon_state = "com_headset_alt"
|
||||
item_state = "com_headset_alt"
|
||||
flags_2 = BANG_PROTECT_2 | NO_EMP_WIRES_2
|
||||
|
||||
/obj/item/device/radio/headset/heads/rd
|
||||
/obj/item/radio/headset/heads/rd
|
||||
name = "\proper the research director's headset"
|
||||
desc = "Headset of the fellow who keeps society marching towards technological singularity.\nTo access the science channel, use :n. For command, use :c."
|
||||
icon_state = "com_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/heads/rd
|
||||
keyslot = new /obj/item/encryptionkey/heads/rd
|
||||
|
||||
/obj/item/device/radio/headset/heads/hos
|
||||
/obj/item/radio/headset/heads/hos
|
||||
name = "\proper the head of security's headset"
|
||||
desc = "The headset of the man in charge of keeping order and protecting the station.\nTo access the security channel, use :s. For command, use :c."
|
||||
icon_state = "com_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/heads/hos
|
||||
keyslot = new /obj/item/encryptionkey/heads/hos
|
||||
|
||||
/obj/item/device/radio/headset/heads/hos/alt
|
||||
/obj/item/radio/headset/heads/hos/alt
|
||||
name = "\proper the head of security's bowman headset"
|
||||
desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs.\nTo access the security channel, use :s. For command, use :c."
|
||||
icon_state = "com_headset_alt"
|
||||
item_state = "com_headset_alt"
|
||||
flags_2 = BANG_PROTECT_2 | NO_EMP_WIRES_2
|
||||
|
||||
/obj/item/device/radio/headset/heads/ce
|
||||
/obj/item/radio/headset/heads/ce
|
||||
name = "\proper the chief engineer's headset"
|
||||
desc = "The headset of the guy in charge of keeping the station powered and undamaged.\nTo access the engineering channel, use :e. For command, use :c."
|
||||
icon_state = "com_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/heads/ce
|
||||
keyslot = new /obj/item/encryptionkey/heads/ce
|
||||
|
||||
/obj/item/device/radio/headset/heads/cmo
|
||||
/obj/item/radio/headset/heads/cmo
|
||||
name = "\proper the chief medical officer's headset"
|
||||
desc = "The headset of the highly trained medical chief.\nTo access the medical channel, use :m. For command, use :c."
|
||||
icon_state = "com_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/heads/cmo
|
||||
keyslot = new /obj/item/encryptionkey/heads/cmo
|
||||
|
||||
/obj/item/device/radio/headset/heads/hop
|
||||
/obj/item/radio/headset/heads/hop
|
||||
name = "\proper the head of personnel's headset"
|
||||
desc = "The headset of the guy who will one day be captain.\nChannels are as follows: :u - supply, :v - service, :c - command."
|
||||
icon_state = "com_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/heads/hop
|
||||
keyslot = new /obj/item/encryptionkey/heads/hop
|
||||
|
||||
/obj/item/device/radio/headset/headset_cargo
|
||||
/obj/item/radio/headset/headset_cargo
|
||||
name = "supply radio headset"
|
||||
desc = "A headset used by the QM and his slaves.\nTo access the supply channel, use :u."
|
||||
icon_state = "cargo_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/headset_cargo
|
||||
keyslot = new /obj/item/encryptionkey/headset_cargo
|
||||
|
||||
/obj/item/device/radio/headset/headset_cargo/mining
|
||||
/obj/item/radio/headset/headset_cargo/mining
|
||||
name = "mining radio headset"
|
||||
desc = "Headset used by shaft miners.\nTo access the supply channel, use :u. For science, use :n."
|
||||
icon_state = "mine_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/headset_mining
|
||||
keyslot = new /obj/item/encryptionkey/headset_mining
|
||||
|
||||
/obj/item/device/radio/headset/headset_srv
|
||||
/obj/item/radio/headset/headset_srv
|
||||
name = "service radio headset"
|
||||
desc = "Headset used by the service staff, tasked with keeping the station full, happy and clean.\nTo access the service channel, use :v."
|
||||
icon_state = "srv_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/headset_service
|
||||
keyslot = new /obj/item/encryptionkey/headset_service
|
||||
|
||||
/obj/item/device/radio/headset/headset_cent
|
||||
/obj/item/radio/headset/headset_cent
|
||||
name = "\improper CentCom headset"
|
||||
desc = "A headset used by the upper echelons of Nanotrasen.\nTo access the CentCom channel, use :y."
|
||||
icon_state = "cent_headset"
|
||||
keyslot = new /obj/item/device/encryptionkey/headset_com
|
||||
keyslot2 = new /obj/item/device/encryptionkey/headset_cent
|
||||
keyslot = new /obj/item/encryptionkey/headset_com
|
||||
keyslot2 = new /obj/item/encryptionkey/headset_cent
|
||||
|
||||
/obj/item/device/radio/headset/headset_cent/empty
|
||||
/obj/item/radio/headset/headset_cent/empty
|
||||
keyslot = null
|
||||
keyslot2 = null
|
||||
|
||||
/obj/item/device/radio/headset/headset_cent/commander
|
||||
keyslot = new /obj/item/device/encryptionkey/heads/captain
|
||||
/obj/item/radio/headset/headset_cent/commander
|
||||
keyslot = new /obj/item/encryptionkey/heads/captain
|
||||
|
||||
/obj/item/device/radio/headset/headset_cent/alt
|
||||
/obj/item/radio/headset/headset_cent/alt
|
||||
name = "\improper CentCom bowman headset"
|
||||
desc = "A headset especially for emergency response personnel. Protects ears from flashbangs.\nTo access the CentCom channel, use :y."
|
||||
icon_state = "cent_headset_alt"
|
||||
@@ -209,15 +209,15 @@
|
||||
keyslot = null
|
||||
flags_2 = BANG_PROTECT_2 | NO_EMP_WIRES_2
|
||||
|
||||
/obj/item/device/radio/headset/ai
|
||||
/obj/item/radio/headset/ai
|
||||
name = "\proper Integrated Subspace Transceiver "
|
||||
keyslot2 = new /obj/item/device/encryptionkey/ai
|
||||
keyslot2 = new /obj/item/encryptionkey/ai
|
||||
command = TRUE
|
||||
|
||||
/obj/item/device/radio/headset/ai/can_receive(freq, level)
|
||||
/obj/item/radio/headset/ai/can_receive(freq, level)
|
||||
return ..(freq, level, TRUE)
|
||||
|
||||
/obj/item/device/radio/headset/attackby(obj/item/W, mob/user, params)
|
||||
/obj/item/radio/headset/attackby(obj/item/W, mob/user, params)
|
||||
user.set_machine(src)
|
||||
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
@@ -241,7 +241,7 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>This headset doesn't have any unique encryption keys! How useless...</span>")
|
||||
|
||||
else if(istype(W, /obj/item/device/encryptionkey))
|
||||
else if(istype(W, /obj/item/encryptionkey))
|
||||
if(keyslot && keyslot2)
|
||||
to_chat(user, "<span class='warning'>The headset can't hold another key!</span>")
|
||||
return
|
||||
@@ -262,7 +262,7 @@
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/device/radio/headset/recalculateChannels()
|
||||
/obj/item/radio/headset/recalculateChannels()
|
||||
..()
|
||||
if(keyslot2)
|
||||
for(var/ch_name in keyslot2.channels)
|
||||
@@ -279,7 +279,7 @@
|
||||
for(var/ch_name in channels)
|
||||
secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name])
|
||||
|
||||
/obj/item/device/radio/headset/AltClick(mob/living/user)
|
||||
/obj/item/radio/headset/AltClick(mob/living/user)
|
||||
if(!istype(user) || !Adjacent(user) || user.incapacitated())
|
||||
return
|
||||
if (command)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/radio/intercom
|
||||
/obj/item/radio/intercom
|
||||
name = "station intercom"
|
||||
desc = "Talk through this."
|
||||
icon_state = "intercom"
|
||||
@@ -12,22 +12,22 @@
|
||||
dog_fashion = null
|
||||
var/unfastened = FALSE
|
||||
|
||||
/obj/item/device/radio/intercom/unscrewed
|
||||
/obj/item/radio/intercom/unscrewed
|
||||
unfastened = TRUE
|
||||
|
||||
/obj/item/device/radio/intercom/ratvar
|
||||
/obj/item/radio/intercom/ratvar
|
||||
name = "hierophant intercom"
|
||||
desc = "A modified intercom that uses the Hierophant network instead of subspace tech. Can listen to and broadcast on any frequency."
|
||||
icon_state = "intercom_ratvar"
|
||||
freerange = TRUE
|
||||
|
||||
/obj/item/device/radio/intercom/ratvar/attackby(obj/item/I, mob/living/user, params)
|
||||
/obj/item/radio/intercom/ratvar/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
to_chat(user, "<span class='danger'>[src] is fastened to the wall with [is_servant_of_ratvar(user) ? "replicant alloy" : "some material you've never seen"], and can't be removed.</span>")
|
||||
return //no unfastening!
|
||||
. = ..()
|
||||
|
||||
/obj/item/device/radio/intercom/ratvar/process()
|
||||
/obj/item/radio/intercom/ratvar/process()
|
||||
if(!istype(SSticker.mode, /datum/game_mode/clockwork_cult))
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
alpha = 125
|
||||
@@ -38,24 +38,24 @@
|
||||
emped = FALSE
|
||||
..()
|
||||
|
||||
/obj/item/device/radio/intercom/Initialize(mapload, ndir, building)
|
||||
/obj/item/radio/intercom/Initialize(mapload, ndir, building)
|
||||
. = ..()
|
||||
if(building)
|
||||
setDir(ndir)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/device/radio/intercom/Destroy()
|
||||
/obj/item/radio/intercom/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/intercom/examine(mob/user)
|
||||
/obj/item/radio/intercom/examine(mob/user)
|
||||
..()
|
||||
if(!unfastened)
|
||||
to_chat(user, "<span class='notice'>It's <b>screwed</b> and secured to the wall.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>It's <i>unscrewed</i> from the wall, and can be <b>detached</b>.</span>")
|
||||
|
||||
/obj/item/device/radio/intercom/attackby(obj/item/I, mob/living/user, params)
|
||||
/obj/item/radio/intercom/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(unfastened)
|
||||
user.visible_message("<span class='notice'>[user] starts tightening [src]'s screws...</span>", "<span class='notice'>You start screwing in [src]...</span>")
|
||||
@@ -82,20 +82,20 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/intercom/attack_ai(mob/user)
|
||||
/obj/item/radio/intercom/attack_ai(mob/user)
|
||||
interact(user)
|
||||
|
||||
/obj/item/device/radio/intercom/attack_hand(mob/user)
|
||||
/obj/item/radio/intercom/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
interact(user)
|
||||
|
||||
/obj/item/device/radio/intercom/interact(mob/user)
|
||||
/obj/item/radio/intercom/interact(mob/user)
|
||||
..()
|
||||
ui_interact(user, state = GLOB.default_state)
|
||||
|
||||
/obj/item/device/radio/intercom/can_receive(freq, level)
|
||||
/obj/item/radio/intercom/can_receive(freq, level)
|
||||
if(!on)
|
||||
return FALSE
|
||||
if(wires.is_cut(WIRE_RX))
|
||||
@@ -113,14 +113,14 @@
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/item/device/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode)
|
||||
/obj/item/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode)
|
||||
if (message_mode == MODE_INTERCOM)
|
||||
return // Avoid hearing the same thing twice
|
||||
if(!anyai && !(speaker in ai))
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/device/radio/intercom/process()
|
||||
/obj/item/radio/intercom/process()
|
||||
if(((world.timeofday - last_tick) > 30) || ((world.timeofday - last_tick) < 0))
|
||||
last_tick = world.timeofday
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/item/device/radio/intercom/add_blood_DNA(list/blood_dna)
|
||||
/obj/item/radio/intercom/add_blood_DNA(list/blood_dna)
|
||||
return FALSE
|
||||
|
||||
//Created through the autolathe or through deconstructing intercoms. Can be applied to wall to make a new intercom on it!
|
||||
@@ -143,7 +143,7 @@
|
||||
name = "intercom frame"
|
||||
desc = "A ready-to-go intercom. Just slap it on a wall and screw it in!"
|
||||
icon_state = "intercom"
|
||||
result_path = /obj/item/device/radio/intercom/unscrewed
|
||||
result_path = /obj/item/radio/intercom/unscrewed
|
||||
pixel_shift = 29
|
||||
inverse = TRUE
|
||||
materials = list(MAT_METAL = 75, MAT_GLASS = 25)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/radio
|
||||
/obj/item/radio
|
||||
icon = 'icons/obj/radio.dmi'
|
||||
name = "station bounced radio"
|
||||
icon_state = "walkietalkie"
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
flags_1 = CONDUCT_1 | HEAR_1
|
||||
flags_2 = NO_EMP_WIRES_2
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
@@ -33,7 +33,7 @@
|
||||
var/command = FALSE // If true, use_command can be toggled at will.
|
||||
|
||||
// Encryption key handling
|
||||
var/obj/item/device/encryptionkey/keyslot
|
||||
var/obj/item/encryptionkey/keyslot
|
||||
var/translate_binary = FALSE // If true, can hear the special binary channel.
|
||||
var/independent = FALSE // If true, can say/hear on the special CentCom channel.
|
||||
var/syndie = FALSE // If true, hears all well-known channels automatically, and can say/hear on the Syndicate channel.
|
||||
@@ -43,15 +43,15 @@
|
||||
var/const/FREQ_LISTENING = 1
|
||||
//FREQ_BROADCASTING = 2
|
||||
|
||||
/obj/item/device/radio/suicide_act(mob/living/user)
|
||||
/obj/item/radio/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] starts bouncing [src] off their head! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/device/radio/proc/set_frequency(new_frequency)
|
||||
/obj/item/radio/proc/set_frequency(new_frequency)
|
||||
remove_radio(src, frequency)
|
||||
frequency = add_radio(src, new_frequency)
|
||||
|
||||
/obj/item/device/radio/proc/recalculateChannels()
|
||||
/obj/item/radio/proc/recalculateChannels()
|
||||
channels = list()
|
||||
translate_binary = FALSE
|
||||
syndie = FALSE
|
||||
@@ -72,19 +72,19 @@
|
||||
for(var/ch_name in channels)
|
||||
secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name])
|
||||
|
||||
/obj/item/device/radio/proc/make_syndie() // Turns normal radios into Syndicate radios!
|
||||
/obj/item/radio/proc/make_syndie() // Turns normal radios into Syndicate radios!
|
||||
qdel(keyslot)
|
||||
keyslot = new /obj/item/device/encryptionkey/syndicate
|
||||
keyslot = new /obj/item/encryptionkey/syndicate
|
||||
syndie = 1
|
||||
recalculateChannels()
|
||||
|
||||
/obj/item/device/radio/Destroy()
|
||||
/obj/item/radio/Destroy()
|
||||
remove_radio_all(src) //Just to be sure
|
||||
QDEL_NULL(wires)
|
||||
QDEL_NULL(keyslot)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/Initialize()
|
||||
/obj/item/radio/Initialize()
|
||||
wires = new /datum/wires/radio(src)
|
||||
if(prison_radio)
|
||||
wires.cut(WIRE_TX) // OH GOD WHY
|
||||
@@ -96,7 +96,7 @@
|
||||
for(var/ch_name in channels)
|
||||
secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name])
|
||||
|
||||
/obj/item/device/radio/interact(mob/user)
|
||||
/obj/item/radio/interact(mob/user)
|
||||
if (..())
|
||||
return
|
||||
if(unscrewed && !isAI(user))
|
||||
@@ -104,7 +104,7 @@
|
||||
else
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/device/radio/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
/obj/item/radio/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state)
|
||||
. = ..()
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
@@ -112,7 +112,7 @@
|
||||
ui = new(user, src, ui_key, "radio", name, 370, 220 + channels.len * 22, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
/obj/item/device/radio/ui_data(mob/user)
|
||||
/obj/item/radio/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
data["broadcasting"] = broadcasting
|
||||
@@ -128,11 +128,11 @@
|
||||
data["useCommand"] = use_command
|
||||
data["subspace"] = subspace_transmission
|
||||
data["subspaceSwitchable"] = subspace_switchable
|
||||
data["headset"] = istype(src, /obj/item/device/radio/headset)
|
||||
data["headset"] = istype(src, /obj/item/radio/headset)
|
||||
|
||||
return data
|
||||
|
||||
/obj/item/device/radio/ui_act(action, params, datum/tgui/ui)
|
||||
/obj/item/radio/ui_act(action, params, datum/tgui/ui)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
@@ -191,7 +191,7 @@
|
||||
recalculateChannels()
|
||||
. = TRUE
|
||||
|
||||
/obj/item/device/radio/talk_into(atom/movable/M, message, channel, list/spans, datum/language/language)
|
||||
/obj/item/radio/talk_into(atom/movable/M, message, channel, list/spans, datum/language/language)
|
||||
if(!spans)
|
||||
spans = M.get_spans()
|
||||
if(!language)
|
||||
@@ -199,7 +199,7 @@
|
||||
INVOKE_ASYNC(src, .proc/talk_into_impl, M, message, channel, spans.Copy(), language)
|
||||
return ITALICS | REDUCE_RANGE
|
||||
|
||||
/obj/item/device/radio/proc/talk_into_impl(atom/movable/M, message, channel, list/spans, datum/language/language)
|
||||
/obj/item/radio/proc/talk_into_impl(atom/movable/M, message, channel, list/spans, datum/language/language)
|
||||
if(!on)
|
||||
return // the device has to be on
|
||||
if(!M || !message)
|
||||
@@ -236,7 +236,7 @@
|
||||
|
||||
// Nearby active jammers severely gibberish the message
|
||||
var/turf/position = get_turf(src)
|
||||
for(var/obj/item/device/jammer/jammer in GLOB.active_jammers)
|
||||
for(var/obj/item/jammer/jammer in GLOB.active_jammers)
|
||||
var/turf/jammer_turf = get_turf(jammer)
|
||||
if(position.z == jammer_turf.z && (get_dist(position, jammer_turf) < jammer.range))
|
||||
message = Gibberish(message,100)
|
||||
@@ -267,7 +267,7 @@
|
||||
// was never received, send a mundane broadcast (no headsets).
|
||||
addtimer(CALLBACK(src, .proc/backup_transmission, signal), 20)
|
||||
|
||||
/obj/item/device/radio/proc/backup_transmission(datum/signal/subspace/vocal/signal)
|
||||
/obj/item/radio/proc/backup_transmission(datum/signal/subspace/vocal/signal)
|
||||
var/turf/T = get_turf(src)
|
||||
if (signal.data["done"] && (T.z in signal.levels))
|
||||
return
|
||||
@@ -278,7 +278,7 @@
|
||||
signal.levels = list(T.z)
|
||||
signal.broadcast()
|
||||
|
||||
/obj/item/device/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
|
||||
/obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
|
||||
if(radio_freq || !broadcasting || get_dist(src, speaker) > canhear_range)
|
||||
return
|
||||
|
||||
@@ -297,7 +297,7 @@
|
||||
talk_into(speaker, raw_message, , spans, language=message_language)
|
||||
|
||||
// Checks if this radio can receive on the given frequency.
|
||||
/obj/item/device/radio/proc/can_receive(freq, level)
|
||||
/obj/item/radio/proc/can_receive(freq, level)
|
||||
// deny checks
|
||||
if (!on || !listening || wires.is_cut(WIRE_RX))
|
||||
return FALSE
|
||||
@@ -321,14 +321,14 @@
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/item/device/radio/examine(mob/user)
|
||||
/obj/item/radio/examine(mob/user)
|
||||
..()
|
||||
if (unscrewed)
|
||||
to_chat(user, "<span class='notice'>It can be attached and modified.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>It cannot be modified or attached.</span>")
|
||||
|
||||
/obj/item/device/radio/attackby(obj/item/W, mob/user, params)
|
||||
/obj/item/radio/attackby(obj/item/W, mob/user, params)
|
||||
add_fingerprint(user)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
unscrewed = !unscrewed
|
||||
@@ -339,7 +339,7 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/radio/emp_act(severity)
|
||||
/obj/item/radio/emp_act(severity)
|
||||
emped++ //There's been an EMP; better count it
|
||||
var/curremp = emped //Remember which EMP this was
|
||||
if (listening && ismob(loc)) // if the radio is turned on and on someone's person they notice
|
||||
@@ -352,7 +352,7 @@
|
||||
spawn(200)
|
||||
if(emped == curremp) //Don't fix it if it's been EMP'd again
|
||||
emped = 0
|
||||
if (!istype(src, /obj/item/device/radio/intercom)) // intercoms will turn back on on their own
|
||||
if (!istype(src, /obj/item/radio/intercom)) // intercoms will turn back on on their own
|
||||
on = TRUE
|
||||
..()
|
||||
|
||||
@@ -361,24 +361,24 @@
|
||||
///////////////////////////////
|
||||
//Giving borgs their own radio to have some more room to work with -Sieve
|
||||
|
||||
/obj/item/device/radio/borg
|
||||
/obj/item/radio/borg
|
||||
name = "cyborg radio"
|
||||
subspace_switchable = TRUE
|
||||
dog_fashion = null
|
||||
flags_2 = NO_EMP_WIRES_2
|
||||
|
||||
/obj/item/device/radio/borg/Initialize(mapload)
|
||||
/obj/item/radio/borg/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
/obj/item/device/radio/borg/syndicate
|
||||
/obj/item/radio/borg/syndicate
|
||||
syndie = 1
|
||||
keyslot = new /obj/item/device/encryptionkey/syndicate
|
||||
keyslot = new /obj/item/encryptionkey/syndicate
|
||||
|
||||
/obj/item/device/radio/borg/syndicate/Initialize()
|
||||
/obj/item/radio/borg/syndicate/Initialize()
|
||||
. = ..()
|
||||
set_frequency(FREQ_SYNDICATE)
|
||||
|
||||
/obj/item/device/radio/borg/attackby(obj/item/W, mob/user, params)
|
||||
/obj/item/radio/borg/attackby(obj/item/W, mob/user, params)
|
||||
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(keyslot)
|
||||
@@ -399,7 +399,7 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>This radio doesn't have any encryption keys!</span>")
|
||||
|
||||
else if(istype(W, /obj/item/device/encryptionkey/))
|
||||
else if(istype(W, /obj/item/encryptionkey/))
|
||||
if(keyslot)
|
||||
to_chat(user, "<span class='warning'>The radio can't hold another key!</span>")
|
||||
return
|
||||
@@ -412,6 +412,6 @@
|
||||
recalculateChannels()
|
||||
|
||||
|
||||
/obj/item/device/radio/off // Station bounced radios, their only difference is spawning with the speakers off, this was made to help the lag.
|
||||
/obj/item/radio/off // Station bounced radios, their only difference is spawning with the speakers off, this was made to help the lag.
|
||||
listening = 0 // And it's nice to have a subtype too for future features.
|
||||
dog_fashion = /datum/dog_fashion/back
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
/obj/item/device/reverse_bear_trap
|
||||
/obj/item/reverse_bear_trap
|
||||
name = "reverse bear trap"
|
||||
desc = "A horrifying set of shut metal jaws, rigged to a kitchen timer and secured by padlock to a head-mounted clamp. To apply, hit someone with it."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "reverse_bear_trap"
|
||||
slot_flags = SLOT_HEAD
|
||||
slot_flags = ITEM_SLOT_HEAD
|
||||
flags_1 = CONDUCT_1
|
||||
resistance_flags = FIRE_PROOF | UNACIDABLE
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
@@ -21,18 +22,18 @@
|
||||
var/datum/looping_sound/reverse_bear_trap/soundloop
|
||||
var/datum/looping_sound/reverse_bear_trap_beep/soundloop2
|
||||
|
||||
/obj/item/device/reverse_bear_trap/Initialize()
|
||||
/obj/item/reverse_bear_trap/Initialize()
|
||||
. = ..()
|
||||
soundloop = new(list(src))
|
||||
soundloop2 = new(list(src))
|
||||
|
||||
/obj/item/device/reverse_bear_trap/Destroy()
|
||||
/obj/item/reverse_bear_trap/Destroy()
|
||||
QDEL_NULL(soundloop)
|
||||
QDEL_NULL(soundloop2)
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/reverse_bear_trap/process()
|
||||
/obj/item/reverse_bear_trap/process()
|
||||
if(!ticking)
|
||||
return
|
||||
time_left--
|
||||
@@ -44,10 +45,10 @@
|
||||
to_chat(loc, "<span class='userdanger'>*ding*</span>")
|
||||
addtimer(CALLBACK(src, .proc/snap), 2)
|
||||
|
||||
/obj/item/device/reverse_bear_trap/attack_hand(mob/user)
|
||||
/obj/item/reverse_bear_trap/attack_hand(mob/user)
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
if(C.get_item_by_slot(slot_head) == src)
|
||||
if(C.get_item_by_slot(SLOT_HEAD) == src)
|
||||
if(flags_1 & NODROP_1 && !struggling)
|
||||
struggling = TRUE
|
||||
var/fear_string
|
||||
@@ -80,27 +81,27 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/device/reverse_bear_trap/attack(mob/living/target, mob/living/user)
|
||||
if(target.get_item_by_slot(slot_head))
|
||||
/obj/item/reverse_bear_trap/attack(mob/living/target, mob/living/user)
|
||||
if(target.get_item_by_slot(SLOT_HEAD))
|
||||
to_chat(user, "<span class='warning'>Remove their headgear first!</span>")
|
||||
return
|
||||
target.visible_message("<span class='warning'>[user] starts forcing [src] onto [target]'s head!</span>", \
|
||||
"<span class='userdanger'>[target] starts forcing [src] onto your head!</span>", "<i>You hear clanking.</i>")
|
||||
to_chat(user, "<span class='danger'>You start forcing [src] onto [target]'s head...</span>")
|
||||
if(!do_after(user, 30, target = target) || target.get_item_by_slot(slot_head))
|
||||
if(!do_after(user, 30, target = target) || target.get_item_by_slot(SLOT_HEAD))
|
||||
return
|
||||
target.visible_message("<span class='warning'>[user] forces and locks [src] onto [target]'s head!</span>", \
|
||||
"<span class='userdanger'>[target] locks [src] onto your head!</span>", "<i>You hear a click, and then a timer ticking down.</i>")
|
||||
to_chat(user, "<span class='danger'>You force [src] onto [target]'s head and click the padlock shut.</span>")
|
||||
user.dropItemToGround(src)
|
||||
target.equip_to_slot_if_possible(src, slot_head)
|
||||
target.equip_to_slot_if_possible(src, SLOT_HEAD)
|
||||
arm()
|
||||
notify_ghosts("[user] put a reverse bear trap on [target]!", source = src, action = NOTIFY_ORBIT, ghost_sound = 'sound/machines/beep.ogg')
|
||||
|
||||
/obj/item/device/reverse_bear_trap/proc/snap()
|
||||
/obj/item/reverse_bear_trap/proc/snap()
|
||||
reset()
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(!istype(H) || H.get_item_by_slot(slot_head) != src)
|
||||
if(!istype(H) || H.get_item_by_slot(SLOT_HEAD) != src)
|
||||
visible_message("<span class='warning'>[src]'s jaws snap open with an ear-piercing crack!</span>")
|
||||
playsound(src, 'sound/effects/snap.ogg', 75, TRUE)
|
||||
else
|
||||
@@ -113,14 +114,14 @@
|
||||
jill.death() //just in case, for some reason, they're still alive
|
||||
flash_color(jill, flash_color = "#FF0000", flash_time = 100)
|
||||
|
||||
/obj/item/device/reverse_bear_trap/proc/reset()
|
||||
/obj/item/reverse_bear_trap/proc/reset()
|
||||
ticking = FALSE
|
||||
flags_1 &= ~NODROP_1
|
||||
soundloop.stop()
|
||||
soundloop2.stop()
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
|
||||
/obj/item/device/reverse_bear_trap/proc/arm() //hulen
|
||||
/obj/item/reverse_bear_trap/proc/arm() //hulen
|
||||
ticking = TRUE
|
||||
escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes
|
||||
time_left = initial(time_left)
|
||||
|
||||
@@ -6,23 +6,24 @@ HEALTH ANALYZER
|
||||
GAS ANALYZER
|
||||
|
||||
*/
|
||||
/obj/item/device/t_scanner
|
||||
/obj/item/t_scanner
|
||||
name = "\improper T-ray scanner"
|
||||
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "t-ray0"
|
||||
var/on = FALSE
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
item_state = "electronic"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
materials = list(MAT_METAL=150)
|
||||
|
||||
/obj/item/device/t_scanner/suicide_act(mob/living/carbon/user)
|
||||
/obj/item/t_scanner/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins to emit terahertz-rays into [user.p_their()] brain with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return TOXLOSS
|
||||
|
||||
/obj/item/device/t_scanner/attack_self(mob/user)
|
||||
/obj/item/t_scanner/attack_self(mob/user)
|
||||
|
||||
on = !on
|
||||
icon_state = copytext(icon_state, 1, length(icon_state))+"[on]"
|
||||
@@ -30,13 +31,13 @@ GAS ANALYZER
|
||||
if(on)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/device/t_scanner/process()
|
||||
/obj/item/t_scanner/process()
|
||||
if(!on)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return null
|
||||
scan()
|
||||
|
||||
/obj/item/device/t_scanner/proc/scan()
|
||||
/obj/item/t_scanner/proc/scan()
|
||||
t_ray_scan(loc)
|
||||
|
||||
/proc/t_ray_scan(mob/viewer, flick_time = 8, distance = 2)
|
||||
@@ -57,15 +58,16 @@ GAS ANALYZER
|
||||
if(t_ray_images.len)
|
||||
flick_overlay(t_ray_images, list(viewer.client), flick_time)
|
||||
|
||||
/obj/item/device/healthanalyzer
|
||||
/obj/item/healthanalyzer
|
||||
name = "health analyzer"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "health"
|
||||
item_state = "healthanalyzer"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
desc = "A hand-held body scanner able to distinguish vital signs of the subject."
|
||||
flags_1 = CONDUCT_1 | NOBLUDGEON_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
throwforce = 3
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throw_speed = 3
|
||||
@@ -75,11 +77,11 @@ GAS ANALYZER
|
||||
var/scanmode = 0
|
||||
var/advanced = FALSE
|
||||
|
||||
/obj/item/device/healthanalyzer/suicide_act(mob/living/carbon/user)
|
||||
/obj/item/healthanalyzer/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins to analyze [user.p_them()]self with [src]! The display shows that [user.p_theyre()] dead!</span>")
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/device/healthanalyzer/attack_self(mob/user)
|
||||
/obj/item/healthanalyzer/attack_self(mob/user)
|
||||
if(!scanmode)
|
||||
to_chat(user, "<span class='notice'>You switch the health analyzer to scan chemical contents.</span>")
|
||||
scanmode = 1
|
||||
@@ -87,7 +89,7 @@ GAS ANALYZER
|
||||
to_chat(user, "<span class='notice'>You switch the health analyzer to check physical health.</span>")
|
||||
scanmode = 0
|
||||
|
||||
/obj/item/device/healthanalyzer/attack(mob/living/M, mob/living/carbon/human/user)
|
||||
/obj/item/healthanalyzer/attack(mob/living/M, mob/living/carbon/human/user)
|
||||
|
||||
// Clumsiness/brain damage check
|
||||
if ((user.has_trait(TRAIT_CLUMSY) || user.has_trait(TRAIT_DUMB)) && prob(50))
|
||||
@@ -172,7 +174,7 @@ GAS ANALYZER
|
||||
trauma_desc += B.scan_desc
|
||||
trauma_text += trauma_desc
|
||||
to_chat(user, "\t<span class='alert'>Cerebral traumas detected: subjects appears to be suffering from [english_list(trauma_text)].</span>")
|
||||
if(C.roundstart_traits.len)
|
||||
if(C.roundstart_quirks.len)
|
||||
to_chat(user, "\t<span class='info'>Subject has the following physiological traits: [C.get_trait_string()].</span>")
|
||||
if(advanced)
|
||||
to_chat(user, "\t<span class='info'>Brain Activity Level: [(200 - M.getBrainLoss())/2]%.</span>")
|
||||
@@ -315,7 +317,7 @@ GAS ANALYZER
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Subject is not addicted to any reagents.</span>")
|
||||
|
||||
/obj/item/device/healthanalyzer/verb/toggle_mode()
|
||||
/obj/item/healthanalyzer/verb/toggle_mode()
|
||||
set name = "Switch Verbosity"
|
||||
set category = "Object"
|
||||
|
||||
@@ -329,22 +331,23 @@ GAS ANALYZER
|
||||
if(0)
|
||||
to_chat(usr, "The scanner no longer shows limb damage.")
|
||||
|
||||
/obj/item/device/healthanalyzer/advanced
|
||||
/obj/item/healthanalyzer/advanced
|
||||
name = "advanced health analyzer"
|
||||
icon_state = "health_adv"
|
||||
desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy."
|
||||
advanced = TRUE
|
||||
|
||||
/obj/item/device/analyzer
|
||||
/obj/item/analyzer
|
||||
desc = "A hand-held environmental scanner which reports current gas levels. Alt-Click to use the built in barometer function."
|
||||
name = "analyzer"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "atmos"
|
||||
item_state = "analyzer"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
flags_1 = CONDUCT_1 | NOBLUDGEON_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
throwforce = 0
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
@@ -354,11 +357,11 @@ GAS ANALYZER
|
||||
var/cooldown_time = 250
|
||||
var/accuracy // 0 is the best accuracy.
|
||||
|
||||
/obj/item/device/analyzer/suicide_act(mob/living/carbon/user)
|
||||
/obj/item/analyzer/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins to analyze [user.p_them()]self with [src]! The display shows that [user.p_theyre()] dead!</span>")
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/device/analyzer/attack_self(mob/user)
|
||||
/obj/item/analyzer/attack_self(mob/user)
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -417,7 +420,7 @@ GAS ANALYZER
|
||||
to_chat(user, "<span class='alert'>[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %</span>")
|
||||
to_chat(user, "<span class='info'>Temperature: [round(environment.temperature-T0C)] °C ([round(environment.temperature)]K)</span>")
|
||||
|
||||
/obj/item/device/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens
|
||||
/obj/item/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens
|
||||
..()
|
||||
|
||||
if(user.canUseTopic(src))
|
||||
@@ -460,17 +463,17 @@ GAS ANALYZER
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src]'s barometer function says a storm will land in approximately [butchertime(fixed)].</span>")
|
||||
cooldown = TRUE
|
||||
addtimer(CALLBACK(src,/obj/item/device/analyzer/proc/ping), cooldown_time)
|
||||
addtimer(CALLBACK(src,/obj/item/analyzer/proc/ping), cooldown_time)
|
||||
|
||||
|
||||
/obj/item/device/analyzer/proc/ping()
|
||||
/obj/item/analyzer/proc/ping()
|
||||
if(isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
to_chat(L, "<span class='notice'>[src]'s barometer function is ready!</span>")
|
||||
playsound(src, 'sound/machines/click.ogg', 100)
|
||||
cooldown = FALSE
|
||||
|
||||
/obj/item/device/analyzer/proc/butchertime(amount)
|
||||
/obj/item/analyzer/proc/butchertime(amount)
|
||||
if(!amount)
|
||||
return
|
||||
if(accuracy)
|
||||
@@ -481,9 +484,10 @@ GAS ANALYZER
|
||||
amount += inaccurate
|
||||
return DisplayTimeText(max(1,amount))
|
||||
|
||||
/obj/item/device/slime_scanner
|
||||
/obj/item/slime_scanner
|
||||
name = "slime scanner"
|
||||
desc = "A device that analyzes a slime's internal composition and measures its stats."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "adv_spectrometer"
|
||||
item_state = "analyzer"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
@@ -495,7 +499,7 @@ GAS ANALYZER
|
||||
throw_range = 7
|
||||
materials = list(MAT_METAL=30, MAT_GLASS=20)
|
||||
|
||||
/obj/item/device/slime_scanner/attack(mob/living/M, mob/living/user)
|
||||
/obj/item/slime_scanner/attack(mob/living/M, mob/living/user)
|
||||
if(user.stat || user.eye_blind)
|
||||
return
|
||||
if (!isslime(M))
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/obj/item/device/sensor_device
|
||||
/obj/item/sensor_device
|
||||
name = "handheld crew monitor" //Thanks to Gun Hog for the name!
|
||||
desc = "A miniature machine that tracks suit sensors across the station."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "scanner"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
|
||||
/obj/item/device/sensor_device/attack_self(mob/user)
|
||||
/obj/item/sensor_device/attack_self(mob/user)
|
||||
GLOB.crewmonitor.show(user,src) //Proc already exists, just had to call it
|
||||
|
||||
@@ -1,39 +1,40 @@
|
||||
/obj/item/device/taperecorder
|
||||
/obj/item/taperecorder
|
||||
name = "universal recorder"
|
||||
desc = "A device that can record to cassette tapes, and play them. It automatically translates the content in playback."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "taperecorder_empty"
|
||||
item_state = "analyzer"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
flags_1 = HEAR_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
materials = list(MAT_METAL=60, MAT_GLASS=30)
|
||||
force = 2
|
||||
throwforce = 0
|
||||
var/recording = 0
|
||||
var/playing = 0
|
||||
var/playsleepseconds = 0
|
||||
var/obj/item/device/tape/mytape
|
||||
var/starting_tape_type = /obj/item/device/tape/random
|
||||
var/obj/item/tape/mytape
|
||||
var/starting_tape_type = /obj/item/tape/random
|
||||
var/open_panel = 0
|
||||
var/canprint = 1
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/Initialize(mapload)
|
||||
/obj/item/taperecorder/Initialize(mapload)
|
||||
. = ..()
|
||||
if(starting_tape_type)
|
||||
mytape = new starting_tape_type(src)
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/examine(mob/user)
|
||||
/obj/item/taperecorder/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].")
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/attackby(obj/item/I, mob/user, params)
|
||||
if(!mytape && istype(I, /obj/item/device/tape))
|
||||
/obj/item/taperecorder/attackby(obj/item/I, mob/user, params)
|
||||
if(!mytape && istype(I, /obj/item/tape))
|
||||
if(!user.transferItemToLoc(I,src))
|
||||
return
|
||||
mytape = I
|
||||
@@ -41,7 +42,7 @@
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/proc/eject(mob/user)
|
||||
/obj/item/taperecorder/proc/eject(mob/user)
|
||||
if(mytape)
|
||||
to_chat(user, "<span class='notice'>You remove [mytape] from [src].</span>")
|
||||
stop()
|
||||
@@ -49,12 +50,12 @@
|
||||
mytape = null
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/taperecorder/fire_act(exposed_temperature, exposed_volume)
|
||||
/obj/item/taperecorder/fire_act(exposed_temperature, exposed_volume)
|
||||
mytape.ruin() //Fires destroy the tape
|
||||
..()
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/device/taperecorder/attack_hand(mob/user)
|
||||
/obj/item/taperecorder/attack_hand(mob/user)
|
||||
if(loc == user)
|
||||
if(mytape)
|
||||
if(!user.is_holding(src))
|
||||
@@ -63,14 +64,14 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/taperecorder/proc/can_use(mob/user)
|
||||
/obj/item/taperecorder/proc/can_use(mob/user)
|
||||
if(user && ismob(user))
|
||||
if(!user.incapacitated())
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/verb/ejectverb()
|
||||
/obj/item/taperecorder/verb/ejectverb()
|
||||
set name = "Eject Tape"
|
||||
set category = "Object"
|
||||
|
||||
@@ -82,7 +83,7 @@
|
||||
eject(usr)
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/update_icon()
|
||||
/obj/item/taperecorder/update_icon()
|
||||
if(!mytape)
|
||||
icon_state = "taperecorder_empty"
|
||||
else if(recording)
|
||||
@@ -93,12 +94,12 @@
|
||||
icon_state = "taperecorder_idle"
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
|
||||
/obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
|
||||
if(mytape && recording)
|
||||
mytape.timestamp += mytape.used_capacity
|
||||
mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [message]"
|
||||
|
||||
/obj/item/device/taperecorder/verb/record()
|
||||
/obj/item/taperecorder/verb/record()
|
||||
set name = "Start Recording"
|
||||
set category = "Object"
|
||||
|
||||
@@ -131,7 +132,7 @@
|
||||
to_chat(usr, "<span class='notice'>The tape is full.</span>")
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/verb/stop()
|
||||
/obj/item/taperecorder/verb/stop()
|
||||
set name = "Stop"
|
||||
set category = "Object"
|
||||
|
||||
@@ -151,7 +152,7 @@
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/verb/play()
|
||||
/obj/item/taperecorder/verb/play()
|
||||
set name = "Play Tape"
|
||||
set category = "Object"
|
||||
|
||||
@@ -193,7 +194,7 @@
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/attack_self(mob/user)
|
||||
/obj/item/taperecorder/attack_self(mob/user)
|
||||
if(!mytape || mytape.ruined)
|
||||
return
|
||||
if(recording)
|
||||
@@ -202,7 +203,7 @@
|
||||
record()
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/verb/print_transcript()
|
||||
/obj/item/taperecorder/verb/print_transcript()
|
||||
set name = "Print Transcript"
|
||||
set category = "Object"
|
||||
|
||||
@@ -230,14 +231,15 @@
|
||||
|
||||
|
||||
//empty tape recorders
|
||||
/obj/item/device/taperecorder/empty
|
||||
/obj/item/taperecorder/empty
|
||||
starting_tape_type = null
|
||||
|
||||
|
||||
/obj/item/device/tape
|
||||
/obj/item/tape
|
||||
name = "tape"
|
||||
desc = "A magnetic tape that can hold up to ten minutes of content."
|
||||
icon_state = "tape_white"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
item_state = "analyzer"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
@@ -251,17 +253,17 @@
|
||||
var/list/timestamp = list()
|
||||
var/ruined = 0
|
||||
|
||||
/obj/item/device/tape/fire_act(exposed_temperature, exposed_volume)
|
||||
/obj/item/tape/fire_act(exposed_temperature, exposed_volume)
|
||||
ruin()
|
||||
..()
|
||||
|
||||
/obj/item/device/tape/attack_self(mob/user)
|
||||
/obj/item/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()
|
||||
/obj/item/tape/proc/ruin()
|
||||
//Lets not add infinite amounts of overlays when our fireact is called
|
||||
//repeatedly
|
||||
if(!ruined)
|
||||
@@ -269,12 +271,12 @@
|
||||
ruined = 1
|
||||
|
||||
|
||||
/obj/item/device/tape/proc/fix()
|
||||
/obj/item/tape/proc/fix()
|
||||
cut_overlay("ribbonoverlay")
|
||||
ruined = 0
|
||||
|
||||
|
||||
/obj/item/device/tape/attackby(obj/item/I, mob/user, params)
|
||||
/obj/item/tape/attackby(obj/item/I, mob/user, params)
|
||||
if(ruined && istype(I, /obj/item/screwdriver) || istype(I, /obj/item/pen))
|
||||
to_chat(user, "<span class='notice'>You start winding the tape back in...</span>")
|
||||
if(I.use_tool(src, user, 120))
|
||||
@@ -282,9 +284,9 @@
|
||||
fix()
|
||||
|
||||
//Random colour tapes
|
||||
/obj/item/device/tape/random
|
||||
/obj/item/tape/random
|
||||
icon_state = "random_tape"
|
||||
|
||||
/obj/item/device/tape/random/New()
|
||||
/obj/item/tape/random/New()
|
||||
icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
|
||||
..()
|
||||
|
||||
@@ -15,9 +15,10 @@ effective or pretty fucking useless.
|
||||
|
||||
*/
|
||||
|
||||
/obj/item/device/batterer
|
||||
/obj/item/batterer
|
||||
name = "mind batterer"
|
||||
desc = "A strange device with twin antennas."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "batterer"
|
||||
throwforce = 5
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
@@ -32,7 +33,7 @@ effective or pretty fucking useless.
|
||||
var/max_uses = 2
|
||||
|
||||
|
||||
/obj/item/device/batterer/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
|
||||
/obj/item/batterer/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
|
||||
if(!user) return
|
||||
if(times_used >= max_uses)
|
||||
to_chat(user, "<span class='danger'>The mind batterer has been burnt out!</span>")
|
||||
@@ -67,7 +68,7 @@ effective or pretty fucking useless.
|
||||
Wavelength is also slightly increased by the intensity as well.
|
||||
*/
|
||||
|
||||
/obj/item/device/healthanalyzer/rad_laser
|
||||
/obj/item/healthanalyzer/rad_laser
|
||||
materials = list(MAT_METAL=400)
|
||||
var/irradiate = 1
|
||||
var/intensity = 10 // how much damage the radiation does
|
||||
@@ -75,7 +76,7 @@ effective or pretty fucking useless.
|
||||
var/used = 0 // is it cooling down?
|
||||
var/stealth = FALSE
|
||||
|
||||
/obj/item/device/healthanalyzer/rad_laser/attack(mob/living/M, mob/living/user)
|
||||
/obj/item/healthanalyzer/rad_laser/attack(mob/living/M, mob/living/user)
|
||||
if(!stealth || !irradiate)
|
||||
..()
|
||||
if(!irradiate)
|
||||
@@ -95,21 +96,21 @@ effective or pretty fucking useless.
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The radioactive microlaser is still recharging.</span>")
|
||||
|
||||
/obj/item/device/healthanalyzer/rad_laser/proc/handle_cooldown(cooldown)
|
||||
/obj/item/healthanalyzer/rad_laser/proc/handle_cooldown(cooldown)
|
||||
spawn(cooldown)
|
||||
used = 0
|
||||
icon_state = "health"
|
||||
|
||||
/obj/item/device/healthanalyzer/rad_laser/attack_self(mob/user)
|
||||
/obj/item/healthanalyzer/rad_laser/attack_self(mob/user)
|
||||
interact(user)
|
||||
|
||||
/obj/item/device/healthanalyzer/rad_laser/proc/GetCooldown()
|
||||
/obj/item/healthanalyzer/rad_laser/proc/GetCooldown()
|
||||
return round(max(10, (stealth*30 + intensity*5 - wavelength/4)))
|
||||
|
||||
/obj/item/device/healthanalyzer/rad_laser/interact(mob/user)
|
||||
/obj/item/healthanalyzer/rad_laser/interact(mob/user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/device/healthanalyzer/rad_laser/ui_interact(mob/user)
|
||||
/obj/item/healthanalyzer/rad_laser/ui_interact(mob/user)
|
||||
. = ..()
|
||||
|
||||
var/dat = "Irradiation: <A href='?src=[REF(src)];rad=1'>[irradiate ? "On" : "Off"]</A><br>"
|
||||
@@ -140,7 +141,7 @@ effective or pretty fucking useless.
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/item/device/healthanalyzer/rad_laser/Topic(href, href_list)
|
||||
/obj/item/healthanalyzer/rad_laser/Topic(href, href_list)
|
||||
if(!usr.canUseTopic(src))
|
||||
return 1
|
||||
|
||||
@@ -170,13 +171,13 @@ effective or pretty fucking useless.
|
||||
add_fingerprint(usr)
|
||||
return
|
||||
|
||||
/obj/item/device/shadowcloak
|
||||
/obj/item/shadowcloak
|
||||
name = "cloaker belt"
|
||||
desc = "Makes you invisible for short periods of time. Recharges in darkness."
|
||||
icon = 'icons/obj/clothing/belts.dmi'
|
||||
icon_state = "utilitybelt"
|
||||
item_state = "utility"
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
attack_verb = list("whipped", "lashed", "disciplined")
|
||||
|
||||
var/mob/living/carbon/human/user = null
|
||||
@@ -186,19 +187,19 @@ effective or pretty fucking useless.
|
||||
var/old_alpha = 0
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
|
||||
/obj/item/device/shadowcloak/ui_action_click(mob/user)
|
||||
if(user.get_item_by_slot(slot_belt) == src)
|
||||
/obj/item/shadowcloak/ui_action_click(mob/user)
|
||||
if(user.get_item_by_slot(SLOT_BELT) == src)
|
||||
if(!on)
|
||||
Activate(usr)
|
||||
else
|
||||
Deactivate()
|
||||
return
|
||||
|
||||
/obj/item/device/shadowcloak/item_action_slot_check(slot, mob/user)
|
||||
if(slot == slot_belt)
|
||||
/obj/item/shadowcloak/item_action_slot_check(slot, mob/user)
|
||||
if(slot == SLOT_BELT)
|
||||
return 1
|
||||
|
||||
/obj/item/device/shadowcloak/proc/Activate(mob/living/carbon/human/user)
|
||||
/obj/item/shadowcloak/proc/Activate(mob/living/carbon/human/user)
|
||||
if(!user)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You activate [src].</span>")
|
||||
@@ -207,7 +208,7 @@ effective or pretty fucking useless.
|
||||
old_alpha = user.alpha
|
||||
on = TRUE
|
||||
|
||||
/obj/item/device/shadowcloak/proc/Deactivate()
|
||||
/obj/item/shadowcloak/proc/Deactivate()
|
||||
to_chat(user, "<span class='notice'>You deactivate [src].</span>")
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
if(user)
|
||||
@@ -215,13 +216,13 @@ effective or pretty fucking useless.
|
||||
on = FALSE
|
||||
user = null
|
||||
|
||||
/obj/item/device/shadowcloak/dropped(mob/user)
|
||||
/obj/item/shadowcloak/dropped(mob/user)
|
||||
..()
|
||||
if(user && user.get_item_by_slot(slot_belt) != src)
|
||||
if(user && user.get_item_by_slot(SLOT_BELT) != src)
|
||||
Deactivate()
|
||||
|
||||
/obj/item/device/shadowcloak/process()
|
||||
if(user.get_item_by_slot(slot_belt) != src)
|
||||
/obj/item/shadowcloak/process()
|
||||
if(user.get_item_by_slot(SLOT_BELT) != src)
|
||||
Deactivate()
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -234,14 +235,15 @@ effective or pretty fucking useless.
|
||||
animate(user,alpha = CLAMP(255 - charge,0,255),time = 10)
|
||||
|
||||
|
||||
/obj/item/device/jammer
|
||||
/obj/item/jammer
|
||||
name = "radio jammer"
|
||||
desc = "Device used to disrupt nearby radio communication."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "jammer"
|
||||
var/active = FALSE
|
||||
var/range = 12
|
||||
|
||||
/obj/item/device/jammer/attack_self(mob/user)
|
||||
/obj/item/jammer/attack_self(mob/user)
|
||||
to_chat(user,"<span class='notice'>You [active ? "deactivate" : "activate"] [src].</span>")
|
||||
active = !active
|
||||
if(active)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/item/device/transfer_valve
|
||||
/obj/item/transfer_valve
|
||||
icon = 'icons/obj/assemblies.dmi'
|
||||
name = "tank transfer valve"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "valve_1"
|
||||
item_state = "ttv"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi'
|
||||
@@ -9,15 +10,15 @@
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
var/obj/item/tank/tank_one
|
||||
var/obj/item/tank/tank_two
|
||||
var/obj/item/device/assembly/attached_device
|
||||
var/obj/item/assembly/attached_device
|
||||
var/mob/attacher = null
|
||||
var/valve_open = FALSE
|
||||
var/toggle = 1
|
||||
|
||||
/obj/item/device/transfer_valve/IsAssemblyHolder()
|
||||
/obj/item/transfer_valve/IsAssemblyHolder()
|
||||
return TRUE
|
||||
|
||||
/obj/item/device/transfer_valve/attackby(obj/item/item, mob/user, params)
|
||||
/obj/item/transfer_valve/attackby(obj/item/item, mob/user, params)
|
||||
if(istype(item, /obj/item/tank))
|
||||
if(tank_one && tank_two)
|
||||
to_chat(user, "<span class='warning'>There are already two tanks attached, remove one first!</span>")
|
||||
@@ -37,7 +38,7 @@
|
||||
update_icon()
|
||||
//TODO: Have this take an assemblyholder
|
||||
else if(isassembly(item))
|
||||
var/obj/item/device/assembly/A = item
|
||||
var/obj/item/assembly/A = item
|
||||
if(A.secured)
|
||||
to_chat(user, "<span class='notice'>The device is secured.</span>")
|
||||
return
|
||||
@@ -57,7 +58,37 @@
|
||||
attacher = user
|
||||
return
|
||||
|
||||
/obj/item/device/transfer_valve/attack_self(mob/user)
|
||||
//Attached device memes
|
||||
/obj/item/transfer_valve/Move()
|
||||
. = ..()
|
||||
if(attached_device)
|
||||
attached_device.holder_movement()
|
||||
|
||||
/obj/item/transfer_valve/dropped()
|
||||
. = ..()
|
||||
if(attached_device)
|
||||
attached_device.dropped()
|
||||
|
||||
/obj/item/transfer_valve/on_found(mob/finder)
|
||||
if(attached_device)
|
||||
attached_device.on_found(finder)
|
||||
|
||||
/obj/item/transfer_valve/Crossed(atom/movable/AM as mob|obj)
|
||||
. = ..()
|
||||
if(attached_device)
|
||||
attached_device.Crossed(AM)
|
||||
|
||||
/obj/item/transfer_valve/attack_hand()//Triggers mousetraps
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(attached_device)
|
||||
attached_device.attack_hand()
|
||||
|
||||
//These keep attached devices synced up, for example a TTV with a mouse trap being found in a bag so it's triggered, or moving the TTV with an infrared beam sensor to update the beam's direction.
|
||||
|
||||
|
||||
/obj/item/transfer_valve/attack_self(mob/user)
|
||||
user.set_machine(src)
|
||||
var/dat = {"<B> Valve properties: </B>
|
||||
<BR> <B> Attachment one:</B> [tank_one] [tank_one ? "<A href='?src=[REF(src)];tankone=1'>Remove</A>" : ""]
|
||||
@@ -70,7 +101,7 @@
|
||||
popup.open()
|
||||
return
|
||||
|
||||
/obj/item/device/transfer_valve/Topic(href, href_list)
|
||||
/obj/item/transfer_valve/Topic(href, href_list)
|
||||
..()
|
||||
if(!usr.canUseTopic(src))
|
||||
return
|
||||
@@ -90,8 +121,7 @@
|
||||
toggle_valve()
|
||||
else if(attached_device)
|
||||
if(href_list["rem_device"])
|
||||
attached_device.forceMove(drop_location())
|
||||
attached_device.holder = null
|
||||
attached_device.on_detach()
|
||||
attached_device = null
|
||||
update_icon()
|
||||
if(href_list["device"])
|
||||
@@ -100,16 +130,16 @@
|
||||
attack_self(usr)
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/item/device/transfer_valve/proc/process_activation(obj/item/device/D)
|
||||
/obj/item/transfer_valve/proc/process_activation(obj/item/D)
|
||||
if(toggle)
|
||||
toggle = FALSE
|
||||
toggle_valve()
|
||||
addtimer(CALLBACK(src, .proc/toggle_off), 5) //To stop a signal being spammed from a proxy sensor constantly going off or whatever
|
||||
|
||||
/obj/item/device/transfer_valve/proc/toggle_off()
|
||||
/obj/item/transfer_valve/proc/toggle_off()
|
||||
toggle = TRUE
|
||||
|
||||
/obj/item/device/transfer_valve/update_icon()
|
||||
/obj/item/transfer_valve/update_icon()
|
||||
cut_overlays()
|
||||
underlays = null
|
||||
|
||||
@@ -126,14 +156,18 @@
|
||||
underlays += J
|
||||
if(attached_device)
|
||||
add_overlay("device")
|
||||
if(istype(attached_device, /obj/item/assembly/infra))
|
||||
var/obj/item/assembly/infra/sensor = attached_device
|
||||
if(sensor.on && sensor.visible)
|
||||
add_overlay("proxy_beam")
|
||||
|
||||
/obj/item/device/transfer_valve/proc/merge_gases()
|
||||
/obj/item/transfer_valve/proc/merge_gases()
|
||||
tank_two.air_contents.volume += tank_one.air_contents.volume
|
||||
var/datum/gas_mixture/temp
|
||||
temp = tank_one.air_contents.remove_ratio(1)
|
||||
tank_two.air_contents.merge(temp)
|
||||
|
||||
/obj/item/device/transfer_valve/proc/split_gases()
|
||||
/obj/item/transfer_valve/proc/split_gases()
|
||||
if (!valve_open || !tank_one || !tank_two)
|
||||
return
|
||||
var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume
|
||||
@@ -147,7 +181,7 @@
|
||||
it explodes properly when it gets a signal (and it does).
|
||||
*/
|
||||
|
||||
/obj/item/device/transfer_valve/proc/toggle_valve()
|
||||
/obj/item/transfer_valve/proc/toggle_valve()
|
||||
if(!valve_open && tank_one && tank_two)
|
||||
valve_open = TRUE
|
||||
var/turf/bombturf = get_turf(src)
|
||||
@@ -155,7 +189,7 @@
|
||||
|
||||
var/attachment = "no device"
|
||||
if(attached_device)
|
||||
if(istype(attached_device, /obj/item/device/assembly/signaler))
|
||||
if(istype(attached_device, /obj/item/assembly/signaler))
|
||||
attachment = "<A HREF='?_src_=holder;[HrefToken()];secrets=list_signalers'>[attached_device]</A>"
|
||||
else
|
||||
attachment = attached_device
|
||||
@@ -197,5 +231,5 @@
|
||||
|
||||
// this doesn't do anything but the timer etc. expects it to be here
|
||||
// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs
|
||||
/obj/item/device/transfer_valve/proc/c_state()
|
||||
/obj/item/transfer_valve/proc/c_state()
|
||||
return
|
||||
|
||||
@@ -18,13 +18,13 @@
|
||||
var/lit = FALSE //on or off
|
||||
var/operating = FALSE//cooldown
|
||||
var/obj/item/weldingtool/weldtool = null
|
||||
var/obj/item/device/assembly/igniter/igniter = null
|
||||
var/obj/item/assembly/igniter/igniter = null
|
||||
var/obj/item/tank/internals/plasma/ptank = null
|
||||
var/warned_admins = FALSE //for the message_admins() when lit
|
||||
//variables for prebuilt flamethrowers
|
||||
var/create_full = FALSE
|
||||
var/create_with_tank = FALSE
|
||||
var/igniter_type = /obj/item/device/assembly/igniter
|
||||
var/igniter_type = /obj/item/assembly/igniter
|
||||
trigger_guard = TRIGGER_GUARD_NORMAL
|
||||
|
||||
/obj/item/flamethrower/Destroy()
|
||||
@@ -101,7 +101,7 @@
|
||||
return
|
||||
|
||||
else if(isigniter(W))
|
||||
var/obj/item/device/assembly/igniter/I = W
|
||||
var/obj/item/assembly/igniter/I = W
|
||||
if(I.secured)
|
||||
return
|
||||
if(igniter)
|
||||
@@ -125,7 +125,7 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/device/analyzer) && ptank)
|
||||
else if(istype(W, /obj/item/analyzer) && ptank)
|
||||
atmosanalyzer_scan(ptank.air_contents, user)
|
||||
else
|
||||
return ..()
|
||||
@@ -167,7 +167,7 @@
|
||||
/obj/item/flamethrower/CheckParts(list/parts_list)
|
||||
..()
|
||||
weldtool = locate(/obj/item/weldingtool) in contents
|
||||
igniter = locate(/obj/item/device/assembly/igniter) in contents
|
||||
igniter = locate(/obj/item/assembly/igniter) in contents
|
||||
weldtool.status = FALSE
|
||||
igniter.secured = FALSE
|
||||
status = TRUE
|
||||
@@ -240,11 +240,11 @@
|
||||
return 1 //It hit the flamethrower, not them
|
||||
|
||||
|
||||
/obj/item/device/assembly/igniter/proc/flamethrower_process(turf/open/location)
|
||||
/obj/item/assembly/igniter/proc/flamethrower_process(turf/open/location)
|
||||
location.hotspot_expose(700,2)
|
||||
|
||||
/obj/item/device/assembly/igniter/cold/flamethrower_process(turf/open/location)
|
||||
/obj/item/assembly/igniter/cold/flamethrower_process(turf/open/location)
|
||||
return
|
||||
|
||||
/obj/item/device/assembly/igniter/proc/ignite_turf(obj/item/flamethrower/F,turf/open/location,release_amount = 0.05)
|
||||
/obj/item/assembly/igniter/proc/ignite_turf(obj/item/flamethrower/F,turf/open/location,release_amount = 0.05)
|
||||
F.default_ignite(location,release_amount)
|
||||
|
||||
@@ -64,9 +64,9 @@ GLOBAL_LIST_EMPTY(possible_gifts)
|
||||
/obj/item/banhammer,
|
||||
/obj/item/reagent_containers/food/snacks/grown/ambrosia/deus,
|
||||
/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
|
||||
/obj/item/device/paicard,
|
||||
/obj/item/device/instrument/violin,
|
||||
/obj/item/device/instrument/guitar,
|
||||
/obj/item/paicard,
|
||||
/obj/item/instrument/violin,
|
||||
/obj/item/instrument/guitar,
|
||||
/obj/item/storage/belt/utility/full,
|
||||
/obj/item/clothing/neck/tie/horrible,
|
||||
/obj/item/clothing/suit/jacket/leather,
|
||||
|
||||
@@ -208,12 +208,13 @@
|
||||
if(stored_swap == user)
|
||||
to_chat(user,"<span class='notice'>You stare at the book some more, but there doesn't seem to be anything else to learn...</span>")
|
||||
return
|
||||
|
||||
var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new
|
||||
swapper.cast(user, stored_swap, TRUE)
|
||||
if(swapper.cast(list(stored_swap), user, TRUE, TRUE))
|
||||
to_chat(user,"<span class='warning'>You're suddenly somewhere else... and someone else?!</span>")
|
||||
to_chat(stored_swap,"<span class='warning'>Suddenly you're staring at [src] again... where are you, who are you?!</span>")
|
||||
else
|
||||
user.visible_message("<span class='warning'>[src] fizzles slightly as it stops glowing!</span>") //if the mind_transfer failed to transfer mobs, likely due to the target being catatonic.
|
||||
|
||||
to_chat(stored_swap,"<span class='warning'>You're suddenly somewhere else... and someone else?!</span>")
|
||||
to_chat(user,"<span class='warning'>Suddenly you're staring at [src] again... where are you, who are you?!</span>")
|
||||
stored_swap = null
|
||||
|
||||
/obj/item/book/granter/spell/forcewall
|
||||
@@ -257,7 +258,7 @@
|
||||
magichead.voicechange = TRUE //NEEEEIIGHH
|
||||
if(!user.dropItemToGround(user.wear_mask))
|
||||
qdel(user.wear_mask)
|
||||
user.equip_to_slot_if_possible(magichead, slot_wear_mask, TRUE, TRUE)
|
||||
user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE)
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user,"<span class='notice'>I say thee neigh</span>") //It still lives here
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
var/list/beakers = list()
|
||||
var/list/allowed_containers = list(/obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle)
|
||||
var/affected_area = 3
|
||||
var/obj/item/device/assembly_holder/nadeassembly = null
|
||||
var/obj/item/assembly_holder/nadeassembly = null
|
||||
var/assemblyattacher
|
||||
var/ignition_temp = 10 // The amount of heat added to the reagents when this grenade goes off.
|
||||
var/threatscale = 1 // Used by advanced grenades to make them slightly more worthy.
|
||||
@@ -78,9 +78,9 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[I] is empty!</span>")
|
||||
|
||||
else if(stage == EMPTY && istype(I, /obj/item/device/assembly_holder))
|
||||
else if(stage == EMPTY && istype(I, /obj/item/assembly_holder))
|
||||
. = 1 // no afterattack
|
||||
var/obj/item/device/assembly_holder/A = I
|
||||
var/obj/item/assembly_holder/A = I
|
||||
if(isigniter(A.a_left) == isigniter(A.a_right)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it
|
||||
return
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
@@ -163,8 +163,10 @@
|
||||
for(var/obj/item/reagent_containers/glass/G in beakers)
|
||||
reactants += G.reagents
|
||||
|
||||
if(!chem_splash(get_turf(src), affected_area, reactants, ignition_temp, threatscale) && !no_splash)
|
||||
playsound(loc, 'sound/items/screwdriver2.ogg', 50, 1)
|
||||
var/turf/detonation_turf = get_turf(src)
|
||||
|
||||
if(!chem_splash(detonation_turf, affected_area, reactants, ignition_temp, threatscale) && !no_splash)
|
||||
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
|
||||
if(beakers.len)
|
||||
for(var/obj/O in beakers)
|
||||
O.forceMove(drop_location())
|
||||
@@ -172,17 +174,15 @@
|
||||
stage_change(EMPTY)
|
||||
return
|
||||
|
||||
var/areas_name = get_area_name(src, TRUE)
|
||||
|
||||
if(nadeassembly)
|
||||
var/mob/M = get_mob_by_ckey(assemblyattacher)
|
||||
var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast)
|
||||
var/turf/T = get_turf(src)
|
||||
var/area/A = get_area(T)
|
||||
message_admins("grenade primed by an assembly, attached by [ADMIN_LOOKUPFLW(M)] and last touched by [ADMIN_LOOKUPFLW(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [ADMIN_JMP(T)]</a>.")
|
||||
log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] [COORD(T)]")
|
||||
message_admins("grenade primed by an assembly, attached by [ADMIN_LOOKUPFLW(M)] and last touched by [ADMIN_LOOKUPFLW(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [areas_name] [ADMIN_JMP(detonation_turf)]</a>.")
|
||||
log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [areas_name] [COORD(detonation_turf)]")
|
||||
|
||||
var/turf/DT = get_turf(src)
|
||||
var/area/DA = get_area(DT)
|
||||
log_game("A grenade detonated at [DA.name] [COORD(DT)]")
|
||||
log_game("A grenade detonated at [areas_name] [COORD(detonation_turf)]")
|
||||
|
||||
update_mob()
|
||||
|
||||
@@ -254,7 +254,7 @@
|
||||
var/unit_spread = 10 // Amount of units per repeat. Can be altered with a multitool.
|
||||
|
||||
/obj/item/grenade/chem_grenade/adv_release/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/device/multitool))
|
||||
if(istype(I, /obj/item/multitool))
|
||||
switch(unit_spread)
|
||||
if(0 to 24)
|
||||
unit_spread += 5
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
active = 0
|
||||
det_time = 50
|
||||
display_timer = 0
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
resistance_flags = FLAMMABLE
|
||||
max_integrity = 40
|
||||
var/active = 0
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/atom/target = null
|
||||
var/mutable_appearance/plastic_overlay
|
||||
var/obj/item/device/assembly_holder/nadeassembly = null
|
||||
var/obj/item/assembly_holder/nadeassembly = null
|
||||
var/assemblyattacher
|
||||
var/directional = FALSE
|
||||
var/aim_dir = NORTH
|
||||
@@ -31,8 +31,8 @@
|
||||
..()
|
||||
|
||||
/obj/item/grenade/plastic/attackby(obj/item/I, mob/user, params)
|
||||
if(!nadeassembly && istype(I, /obj/item/device/assembly_holder))
|
||||
var/obj/item/device/assembly_holder/A = I
|
||||
if(!nadeassembly && istype(I, /obj/item/assembly_holder))
|
||||
var/obj/item/assembly_holder/A = I
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return ..()
|
||||
nadeassembly = A
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
/obj/item/grenade/smokebomb
|
||||
name = "smoke grenade"
|
||||
desc = "The word 'Dank' is scribbled on it in crayon."
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "smokewhite"
|
||||
det_time = 20
|
||||
item_state = "flashbang"
|
||||
slot_flags = SLOT_BELT
|
||||
var/datum/effect_system/smoke_spread/bad/smoke
|
||||
|
||||
/obj/item/grenade/smokebomb/New()
|
||||
..()
|
||||
src.smoke = new /datum/effect_system/smoke_spread/bad
|
||||
src.smoke.attach(src)
|
||||
|
||||
/obj/item/grenade/smokebomb/Destroy()
|
||||
qdel(smoke)
|
||||
return ..()
|
||||
|
||||
/obj/item/grenade/smokebomb/prime()
|
||||
update_mob()
|
||||
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
|
||||
smoke.set_up(4, src)
|
||||
smoke.start()
|
||||
|
||||
|
||||
for(var/obj/structure/blob/B in view(8,src))
|
||||
var/damage = round(30/(get_dist(B,src)+1))
|
||||
B.take_damage(damage, BURN, "melee", 0)
|
||||
sleep(80)
|
||||
qdel(src)
|
||||
/obj/item/grenade/smokebomb
|
||||
name = "smoke grenade"
|
||||
desc = "The word 'Dank' is scribbled on it in crayon."
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "smokewhite"
|
||||
det_time = 20
|
||||
item_state = "flashbang"
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
var/datum/effect_system/smoke_spread/bad/smoke
|
||||
|
||||
/obj/item/grenade/smokebomb/New()
|
||||
..()
|
||||
src.smoke = new /datum/effect_system/smoke_spread/bad
|
||||
src.smoke.attach(src)
|
||||
|
||||
/obj/item/grenade/smokebomb/Destroy()
|
||||
qdel(smoke)
|
||||
return ..()
|
||||
|
||||
/obj/item/grenade/smokebomb/prime()
|
||||
update_mob()
|
||||
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
|
||||
smoke.set_up(4, src)
|
||||
smoke.start()
|
||||
|
||||
|
||||
for(var/obj/structure/blob/B in view(8,src))
|
||||
var/damage = round(30/(get_dist(B,src)+1))
|
||||
B.take_damage(damage, BURN, "melee", 0)
|
||||
sleep(80)
|
||||
qdel(src)
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
throw_speed = 3
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
desc = "It has a mysterious, protective aura."
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
force = 5
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
block_chance = 50
|
||||
var/shield_icon = "shield-red"
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
name = "holy claymore"
|
||||
desc = "A weapon fit for a crusade!"
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
slot_flags = SLOT_BACK|SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT
|
||||
block_chance = 30
|
||||
sharpness = IS_SHARP
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
@@ -118,7 +118,7 @@
|
||||
inhand_y_dimension = 64
|
||||
name = "dark blade"
|
||||
desc = "Spread the glory of the dark gods!"
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
hitsound = 'sound/hallucinations/growl1.ogg'
|
||||
|
||||
/obj/item/nullrod/claymore/chainsaw_sword
|
||||
@@ -126,7 +126,7 @@
|
||||
item_state = "chainswordon"
|
||||
name = "sacred chainsaw sword"
|
||||
desc = "Suffer not a heretic to live."
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
|
||||
hitsound = 'sound/weapons/chainsawhit.ogg'
|
||||
|
||||
@@ -135,21 +135,21 @@
|
||||
item_state = "swordon"
|
||||
name = "force weapon"
|
||||
desc = "The blade glows with the power of faith. Or possibly a battery."
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
|
||||
/obj/item/nullrod/claymore/katana
|
||||
name = "hanzo steel"
|
||||
desc = "Capable of cutting clean through a holy claymore."
|
||||
icon_state = "katana"
|
||||
item_state = "katana"
|
||||
slot_flags = SLOT_BELT | SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
|
||||
|
||||
/obj/item/nullrod/claymore/multiverse
|
||||
name = "extradimensional blade"
|
||||
desc = "Once the harbinger of an interdimensional war, its sharpness fluctuates wildly."
|
||||
icon_state = "multiverse"
|
||||
item_state = "multiverse"
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
|
||||
/obj/item/nullrod/claymore/multiverse/attack(mob/living/carbon/M, mob/living/carbon/user)
|
||||
force = rand(1, 30)
|
||||
@@ -161,7 +161,7 @@
|
||||
icon_state = "swordblue"
|
||||
item_state = "swordblue"
|
||||
desc = "If you strike me down, I shall become more robust than you can possibly imagine."
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
|
||||
/obj/item/nullrod/claymore/saber/red
|
||||
name = "dark energy sword"
|
||||
@@ -182,7 +182,7 @@
|
||||
item_state = "sord"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 4.13
|
||||
throwforce = 1
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
@@ -197,7 +197,7 @@
|
||||
desc = "Ask not for whom the bell tolls..."
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
armour_penetration = 35
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
sharpness = IS_SHARP
|
||||
attack_verb = list("chopped", "sliced", "cut", "reaped")
|
||||
|
||||
@@ -279,7 +279,7 @@
|
||||
item_state = "chainswordon"
|
||||
name = "possessed chainsaw sword"
|
||||
desc = "Suffer not a heretic to live."
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 30
|
||||
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
|
||||
hitsound = 'sound/weapons/chainsawhit.ogg'
|
||||
@@ -292,7 +292,7 @@
|
||||
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
|
||||
name = "relic war hammer"
|
||||
desc = "This war hammer cost the chaplain forty thousand space dollars."
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
attack_verb = list("smashed", "bashed", "hammered", "crunched")
|
||||
|
||||
@@ -330,7 +330,7 @@
|
||||
force = 16
|
||||
throwforce = 15
|
||||
w_class = 4
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
attack_verb = list("attacked", "smashed", "crushed", "splattered", "cracked")
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
|
||||
@@ -350,7 +350,7 @@
|
||||
item_state = "chain"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
attack_verb = list("whipped", "lashed")
|
||||
hitsound = 'sound/weapons/chainhit.ogg'
|
||||
|
||||
@@ -359,7 +359,7 @@
|
||||
desc = "The brim of the hat is as sharp as your wit. The edge would hurt almost as much as disproving the existence of God."
|
||||
icon_state = "fedora"
|
||||
item_state = "fedora"
|
||||
slot_flags = SLOT_HEAD
|
||||
slot_flags = ITEM_SLOT_HEAD
|
||||
icon = 'icons/obj/clothing/hats.dmi'
|
||||
force = 0
|
||||
throw_speed = 4
|
||||
@@ -414,7 +414,7 @@
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force = 15
|
||||
block_chance = 40
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
sharpness = IS_BLUNT
|
||||
hitsound = "swing_hit"
|
||||
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
/obj/item/implant/radio
|
||||
name = "internal radio implant"
|
||||
activated = TRUE
|
||||
var/obj/item/device/radio/radio
|
||||
var/obj/item/radio/radio
|
||||
var/radio_key
|
||||
var/subspace_transmission = FALSE
|
||||
icon = 'icons/obj/radio.dmi'
|
||||
@@ -105,18 +105,18 @@
|
||||
radio.recalculateChannels()
|
||||
|
||||
/obj/item/implant/radio/mining
|
||||
radio_key = /obj/item/device/encryptionkey/headset_cargo
|
||||
radio_key = /obj/item/encryptionkey/headset_cargo
|
||||
|
||||
/obj/item/implant/radio/syndicate
|
||||
desc = "Are you there God? It's me, Syndicate Comms Agent."
|
||||
radio_key = /obj/item/device/encryptionkey/syndicate
|
||||
radio_key = /obj/item/encryptionkey/syndicate
|
||||
subspace_transmission = TRUE
|
||||
|
||||
/obj/item/implant/radio/slime
|
||||
name = "slime radio"
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "adamantine_resonator"
|
||||
radio_key = /obj/item/device/encryptionkey/headset_sci
|
||||
radio_key = /obj/item/encryptionkey/headset_sci
|
||||
subspace_transmission = TRUE
|
||||
|
||||
/obj/item/implant/radio/get_data()
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
imp_type = /obj/item/implant/tracking
|
||||
|
||||
/obj/item/implanter/tracking/gps
|
||||
imp_type = /obj/item/device/gps/mining/internal
|
||||
imp_type = /obj/item/gps/mining/internal
|
||||
|
||||
/obj/item/implant/tracking/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
possible_colors = list("purple" = LIGHT_COLOR_LAVENDER)
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/saber/attackby(obj/item/W, mob/living/user, params)
|
||||
if(istype(W, /obj/item/device/multitool))
|
||||
if(istype(W, /obj/item/multitool))
|
||||
if(!hacked)
|
||||
hacked = TRUE
|
||||
item_color = "rainbow"
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 10
|
||||
throwforce = 7
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
@@ -96,7 +96,7 @@
|
||||
item_state = "classic_baton"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 12 //9 hit crit
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
var/cooldown = 0
|
||||
@@ -159,7 +159,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
||||
item_state = null
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
item_flags = NONE
|
||||
force = 0
|
||||
@@ -196,7 +196,7 @@
|
||||
to_chat(user, "<span class ='notice'>You collapse the baton.</span>")
|
||||
icon_state = "telebaton_0"
|
||||
item_state = null //no sprite for concealment even when in hand
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
force = 0 //not so robust now
|
||||
attack_verb = list("hit", "poked")
|
||||
@@ -308,7 +308,7 @@
|
||||
item_state = "chain"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 15
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
|
||||
@@ -326,7 +326,7 @@
|
||||
desc = "A telescopic roasting stick with a miniature shield generator designed to ensure entry into various high-tech shielded cooking ovens and firepits."
|
||||
icon_state = "roastingstick_0"
|
||||
item_state = "null"
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
item_flags = NONE
|
||||
force = 0
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "pinpointer"
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
item_state = "electronic"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
@@ -87,7 +87,7 @@
|
||||
return FALSE
|
||||
|
||||
var/turf/there = get_turf(H)
|
||||
return (H.z != 0 || (there && there.z == H.z))
|
||||
return (H.z != 0 || (there && there.z == here.z))
|
||||
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -325,7 +325,7 @@
|
||||
icon_state = "crusader"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //does this even do anything on boots?
|
||||
flags_1 = NOSLIP_1
|
||||
clothing_flags = NOSLIP
|
||||
cold_protection = FEET
|
||||
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
|
||||
heat_protection = FEET
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
|
||||
|
||||
//Malf Picker
|
||||
/obj/item/device/malf_upgrade
|
||||
/obj/item/malf_upgrade
|
||||
name = "combat software upgrade"
|
||||
desc = "A highly illegal, highly dangerous upgrade for artificial intelligence units, granting them a variety of powers as well as the ability to hack APCs."
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "datadisk3"
|
||||
|
||||
|
||||
/obj/item/device/malf_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
|
||||
/obj/item/malf_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
|
||||
if(!istype(AI))
|
||||
return
|
||||
if(AI.malf_picker)
|
||||
@@ -23,13 +23,13 @@
|
||||
|
||||
|
||||
//Lipreading
|
||||
/obj/item/device/surveillance_upgrade
|
||||
/obj/item/surveillance_upgrade
|
||||
name = "surveillance software upgrade"
|
||||
desc = "A software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading."
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "datadisk3"
|
||||
|
||||
/obj/item/device/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
|
||||
/obj/item/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
|
||||
if(!istype(AI))
|
||||
return
|
||||
if(AI.eyeobj)
|
||||
|
||||
@@ -273,20 +273,20 @@
|
||||
|
||||
to_chat(user, "<span class='notice'>You stop charging [target].</span>")
|
||||
|
||||
/obj/item/device/harmalarm
|
||||
/obj/item/harmalarm
|
||||
name = "\improper Sonic Harm Prevention Tool"
|
||||
desc = "Releases a harmless blast that confuses most organics. For when the harm is JUST TOO MUCH."
|
||||
icon_state = "megaphone"
|
||||
var/cooldown = 0
|
||||
|
||||
/obj/item/device/harmalarm/emag_act(mob/user)
|
||||
/obj/item/harmalarm/emag_act(mob/user)
|
||||
obj_flags ^= EMAGGED
|
||||
if(obj_flags & EMAGGED)
|
||||
to_chat(user, "<font color='red'>You short out the safeties on [src]!</font>")
|
||||
else
|
||||
to_chat(user, "<font color='red'>You reset the safeties on [src]!</font>")
|
||||
|
||||
/obj/item/device/harmalarm/attack_self(mob/user)
|
||||
/obj/item/harmalarm/attack_self(mob/user)
|
||||
var/safety = !(obj_flags & EMAGGED)
|
||||
if(cooldown > world.time)
|
||||
to_chat(user, "<font color='red'>The device is still recharging!</font>")
|
||||
|
||||
@@ -152,14 +152,14 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to attach a flash to it first!</span>")
|
||||
|
||||
else if (istype(W, /obj/item/device/multitool))
|
||||
else if (istype(W, /obj/item/multitool))
|
||||
if(check_completion())
|
||||
Interact(user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The endoskeleton must be assembled before debugging can begin!</span>")
|
||||
|
||||
else if(istype(W, /obj/item/device/mmi))
|
||||
var/obj/item/device/mmi/M = W
|
||||
else if(istype(W, /obj/item/mmi))
|
||||
var/obj/item/mmi/M = W
|
||||
if(check_completion())
|
||||
if(!isturf(loc))
|
||||
to_chat(user, "<span class='warning'>You can't put [M] in, the frame has to be standing on the ground to be perfectly precise!</span>")
|
||||
@@ -304,7 +304,7 @@
|
||||
|
||||
var/mob/living/living_user = usr
|
||||
var/obj/item/item_in_hand = living_user.get_active_held_item()
|
||||
if(!istype(item_in_hand, /obj/item/device/multitool))
|
||||
if(!istype(item_in_hand, /obj/item/multitool))
|
||||
to_chat(living_user, "<span class='warning'>You need a multitool!</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
icon_state = "riot"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
force = 10
|
||||
throwforce = 5
|
||||
throw_speed = 2
|
||||
@@ -45,6 +45,11 @@
|
||||
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
|
||||
|
||||
/obj/item/shield/riot/roman/fake
|
||||
desc = "Bears an inscription on the inside: <i>\"Romanes venio domus\"</i>. It appears to be a bit flimsy."
|
||||
block_chance = 0
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/shield/riot/buckler
|
||||
name = "wooden buckler"
|
||||
desc = "A medieval wooden buckler."
|
||||
@@ -138,7 +143,7 @@
|
||||
throwforce = 5
|
||||
throw_speed = 2
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
to_chat(user, "<span class='notice'>You extend \the [src].</span>")
|
||||
else
|
||||
force = 3
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
force = 5
|
||||
force_unwielded = 5
|
||||
force_wielded = 20
|
||||
@@ -76,7 +76,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
force = 5
|
||||
force_unwielded = 5
|
||||
force_wielded = 25
|
||||
|
||||
@@ -127,6 +127,18 @@
|
||||
self_delay = 20
|
||||
max_amount = 12
|
||||
|
||||
/obj/item/stack/medical/gauze/wirecutter_act(mob/living/user, obj/item/I)
|
||||
if(get_amount() < 2)
|
||||
to_chat(user, "<span class='warning'>You need at least two gauze to do this!</span>")
|
||||
return
|
||||
new /obj/item/stack/sheet/cloth(user.drop_location())
|
||||
user.visible_message("[user] cuts [src] into pieces of cloth with [I].", \
|
||||
"<span class='notice'>You cut [src] into pieces of cloth with [I].</span>", \
|
||||
"<span class='italics'>You hear cutting.</span>")
|
||||
var/obj/item/stack/medical/gauze/R = src
|
||||
src = null
|
||||
R.use(2)
|
||||
|
||||
/obj/item/stack/medical/gauze/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins tightening \the [src] around [user.p_their()] neck! It looks like [user.p_they()] forgot how to use medical supplies!</span>")
|
||||
return OXYLOSS
|
||||
@@ -155,5 +167,5 @@
|
||||
grind_results = list("silver_sulfadiazine" = 10)
|
||||
|
||||
/obj/item/stack/medical/ointment/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] is squeezing \the [src] into [user.p_their()] mouth! Don't they know that stuff is toxic?</span>")
|
||||
return TOXLOSS
|
||||
user.visible_message("<span class='suicide'>[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?</span>")
|
||||
return TOXLOSS
|
||||
|
||||
@@ -82,7 +82,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
|
||||
singular_name = "plasma glass sheet"
|
||||
icon_state = "sheet-pglass"
|
||||
item_state = "sheet-pglass"
|
||||
materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100)
|
||||
resistance_flags = ACID_PROOF
|
||||
merge_type = /obj/item/stack/sheet/plasmaglass
|
||||
@@ -133,7 +133,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
|
||||
singular_name = "reinforced glass sheet"
|
||||
icon_state = "sheet-rglass"
|
||||
item_state = "sheet-rglass"
|
||||
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
|
||||
resistance_flags = ACID_PROOF
|
||||
merge_type = /obj/item/stack/sheet/rglass
|
||||
@@ -175,7 +175,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
|
||||
singular_name = "reinforced plasma glass sheet"
|
||||
icon_state = "sheet-prglass"
|
||||
item_state = "sheet-prglass"
|
||||
materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT, MAT_METAL = MINERAL_MATERIAL_AMOUNT * 0.5,)
|
||||
armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
|
||||
resistance_flags = ACID_PROOF
|
||||
merge_type = /obj/item/stack/sheet/plasmarglass
|
||||
@@ -195,7 +195,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list(
|
||||
singular_name = "titanium glass sheet"
|
||||
icon_state = "sheet-titaniumglass"
|
||||
item_state = "sheet-titaniumglass"
|
||||
materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
|
||||
resistance_flags = ACID_PROOF
|
||||
merge_type = /obj/item/stack/sheet/titaniumglass
|
||||
@@ -214,7 +214,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
|
||||
singular_name = "plastitanium glass sheet"
|
||||
icon_state = "sheet-plastitaniumglass"
|
||||
item_state = "sheet-plastitaniumglass"
|
||||
materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
|
||||
resistance_flags = ACID_PROOF
|
||||
merge_type = /obj/item/stack/sheet/plastitaniumglass
|
||||
@@ -285,7 +285,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
|
||||
|
||||
|
||||
/obj/item/shard/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/device/lightreplacer))
|
||||
if(istype(I, /obj/item/lightreplacer))
|
||||
I.attackby(src, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -211,10 +211,9 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
|
||||
if(W.is_sharp())
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
|
||||
user.visible_message("[user] starts cutting hair off \the [src].", "<span class='notice'>You start cutting the hair off \the [src]...</span>", "<span class='italics'>You hear the sound of a knife rubbing against flesh.</span>")
|
||||
if(do_after(user,50, target = src))
|
||||
if(do_after(user, 50, target = src))
|
||||
to_chat(user, "<span class='notice'>You cut the hair from this [src.singular_name].</span>")
|
||||
var/obj/item/stack/sheet/hairlesshide/HS = new(user.loc)
|
||||
HS.amount = 1
|
||||
new /obj/item/stack/sheet/hairlesshide(user.drop_location(), 1)
|
||||
use(1)
|
||||
else
|
||||
return ..()
|
||||
@@ -228,21 +227,11 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
|
||||
if(exposed_temperature >= drying_threshold_temperature)
|
||||
wetness--
|
||||
if(wetness == 0)
|
||||
//Try locating an exisitng stack on the tile and add to there if possible
|
||||
for(var/obj/item/stack/sheet/leather/HS in src.loc)
|
||||
if(HS.amount < 50)
|
||||
HS.amount++
|
||||
src.use(1)
|
||||
wetness = initial(wetness)
|
||||
break
|
||||
//If it gets to here it means it did not find a suitable stack on the tile.
|
||||
var/obj/item/stack/sheet/leather/HS = new(src.loc)
|
||||
HS.amount = 1
|
||||
new /obj/item/stack/sheet/leather(drop_location(), 1)
|
||||
wetness = initial(wetness)
|
||||
src.use(1)
|
||||
use(1)
|
||||
|
||||
/obj/item/stack/sheet/wetleather/microwave_act(obj/machinery/microwave/MW)
|
||||
..()
|
||||
var/obj/item/stack/sheet/leather/L = new(loc)
|
||||
L.amount = amount
|
||||
new /obj/item/stack/sheet/leather(drop_location(), amount)
|
||||
qdel(src)
|
||||
|
||||
@@ -14,13 +14,12 @@
|
||||
grind_results = list("silicon" = 20, "copper" = 5)
|
||||
|
||||
/obj/item/stack/light_w/attackby(obj/item/O, mob/user, params)
|
||||
|
||||
var/atom/Tsec = user.drop_location()
|
||||
if(istype(O, /obj/item/wirecutters))
|
||||
var/obj/item/stack/cable_coil/CC = new (user.loc)
|
||||
CC.amount = 5
|
||||
var/obj/item/stack/cable_coil/CC = new (Tsec, 5)
|
||||
CC.add_fingerprint(user)
|
||||
amount--
|
||||
var/obj/item/stack/sheet/glass/G = new (user.loc)
|
||||
var/obj/item/stack/sheet/glass/G = new (Tsec)
|
||||
G.add_fingerprint(user)
|
||||
if(amount <= 0)
|
||||
qdel(src)
|
||||
@@ -28,7 +27,6 @@
|
||||
else if(istype(O, /obj/item/stack/sheet/metal))
|
||||
var/obj/item/stack/sheet/metal/M = O
|
||||
if (M.use(1))
|
||||
use(1)
|
||||
var/obj/item/L = new /obj/item/stack/tile/light(user.loc)
|
||||
to_chat(user, "<span class='notice'>You make a light tile.</span>")
|
||||
L.add_fingerprint(user)
|
||||
|
||||
@@ -19,9 +19,6 @@ Mineral Sheets
|
||||
- Abductor
|
||||
*/
|
||||
|
||||
/obj/item/stack/sheet/mineral
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
|
||||
/obj/item/stack/sheet/mineral/Initialize(mapload)
|
||||
pixel_x = rand(-4, 4)
|
||||
pixel_y = rand(-4, 4)
|
||||
@@ -63,7 +60,6 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \
|
||||
|
||||
/obj/item/stack/sheet/mineral/sandbags
|
||||
name = "sandbags"
|
||||
icon = 'icons/obj/stack_objects.dmi'
|
||||
icon_state = "sandbags"
|
||||
singular_name = "sandbag"
|
||||
layer = LOW_ITEM_LAYER
|
||||
@@ -337,16 +333,6 @@ GLOBAL_LIST_INIT(snow_recipes, list ( \
|
||||
|
||||
/****************************** Others ****************************/
|
||||
|
||||
/*
|
||||
* Enriched Uranium
|
||||
*/
|
||||
/obj/item/stack/sheet/mineral/enruranium
|
||||
name = "enriched uranium"
|
||||
icon_state = "sheet-enruranium"
|
||||
item_state = "sheet-enruranium"
|
||||
singular_name = "enriched uranium sheet"
|
||||
materials = list(MAT_URANIUM=3000)
|
||||
|
||||
/*
|
||||
* Adamantine
|
||||
*/
|
||||
|
||||
@@ -121,6 +121,9 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
|
||||
/obj/item/stack/sheet/metal/twenty
|
||||
amount = 20
|
||||
|
||||
/obj/item/stack/sheet/metal/ten
|
||||
amount = 10
|
||||
|
||||
/obj/item/stack/sheet/metal/five
|
||||
amount = 5
|
||||
|
||||
@@ -349,6 +352,11 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "<span class='warning'>Only one with forbidden knowledge could hope to work this metal...</span>")
|
||||
return
|
||||
var/turf/T = get_turf(user) //we may have moved. adjust as needed...
|
||||
var/area/A = get_area(user)
|
||||
if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !A.blob_allowed))
|
||||
to_chat(user, "<span class='warning'>The veil is not weak enough here.</span>")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/sheet/runed_metal/Initialize(mapload, new_amount, merge = TRUE)
|
||||
|
||||
@@ -33,10 +33,13 @@
|
||||
return
|
||||
return TRUE
|
||||
|
||||
/obj/item/stack/Initialize(mapload, new_amount=null , merge = TRUE)
|
||||
/obj/item/stack/Initialize(mapload, new_amount, merge = TRUE)
|
||||
. = ..()
|
||||
if(new_amount)
|
||||
if(new_amount != null)
|
||||
amount = new_amount
|
||||
while(amount > max_amount)
|
||||
amount -= max_amount
|
||||
new type(loc, max_amount, FALSE)
|
||||
if(!merge_type)
|
||||
merge_type = type
|
||||
if(merge)
|
||||
@@ -227,26 +230,36 @@
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You haven't got enough [src] to build \the [R.title]!</span>")
|
||||
return FALSE
|
||||
if(R.window_checks && !valid_window_location(usr.loc, usr.dir))
|
||||
var/turf/T = get_turf(usr)
|
||||
if(R.window_checks && !valid_window_location(T, usr.dir))
|
||||
to_chat(usr, "<span class='warning'>The [R.title] won't fit here!</span>")
|
||||
return FALSE
|
||||
if(R.one_per_turf && (locate(R.result_type) in usr.loc))
|
||||
if(R.one_per_turf && (locate(R.result_type) in T))
|
||||
to_chat(usr, "<span class='warning'>There is another [R.title] here!</span>")
|
||||
return FALSE
|
||||
if(R.on_floor && !isfloorturf(usr.loc))
|
||||
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed on the floor!</span>")
|
||||
return FALSE
|
||||
if(R.on_floor)
|
||||
if(!isfloorturf(T))
|
||||
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed on the floor!</span>")
|
||||
return FALSE
|
||||
for(var/obj/AM in T)
|
||||
if(istype(AM,/obj/structure/grille))
|
||||
continue
|
||||
if(istype(AM,/obj/structure/table))
|
||||
continue
|
||||
if(AM.density)
|
||||
to_chat(usr, "<span class='warning'>Theres a [AM.name] here. You cant make a [R.title] here!</span>")
|
||||
return FALSE
|
||||
if(R.placement_checks)
|
||||
switch(R.placement_checks)
|
||||
if(STACK_CHECK_CARDINALS)
|
||||
var/turf/step
|
||||
for(var/direction in GLOB.cardinals)
|
||||
step = get_step(usr, direction)
|
||||
step = get_step(T, direction)
|
||||
if(locate(R.result_type) in step)
|
||||
to_chat(usr, "<span class='warning'>\The [R.title] must not be built directly adjacent to another!</span>")
|
||||
return FALSE
|
||||
if(STACK_CHECK_ADJACENT)
|
||||
if(locate(R.result_type) in range(1, usr))
|
||||
if(locate(R.result_type) in range(1, T))
|
||||
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed at least one tile away from others of its type!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
@@ -395,7 +408,9 @@
|
||||
var/window_checks = FALSE
|
||||
var/placement_checks = FALSE
|
||||
|
||||
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = FALSE, on_floor = FALSE, window_checks = FALSE, placement_checks = FALSE)
|
||||
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1,time = 0, one_per_turf = FALSE, on_floor = FALSE, window_checks = FALSE, placement_checks = FALSE )
|
||||
|
||||
|
||||
src.title = title
|
||||
src.result_type = result_type
|
||||
src.req_amount = req_amount
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = SLOT_BACK //ERROOOOO
|
||||
slot_flags = ITEM_SLOT_BACK //ERROOOOO
|
||||
resistance_flags = NONE
|
||||
max_integrity = 300
|
||||
|
||||
@@ -379,7 +379,7 @@
|
||||
new /obj/item/crowbar(src)
|
||||
new /obj/item/stack/cable_coil/random(src)
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/multitool(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/clown
|
||||
name = "clown's duffel bag"
|
||||
@@ -439,7 +439,7 @@
|
||||
new /obj/item/surgical_drapes(src)
|
||||
new /obj/item/clothing/suit/straight_jacket(src)
|
||||
new /obj/item/clothing/mask/muzzle(src)
|
||||
new /obj/item/device/mmi/syndie(src)
|
||||
new /obj/item/mmi/syndie(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/ammo
|
||||
name = "ammunition duffel bag"
|
||||
@@ -453,7 +453,7 @@
|
||||
/obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun/PopulateContents()
|
||||
for(var/i in 1 to 6)
|
||||
new /obj/item/ammo_box/magazine/m12g(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/buckshot(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/stun(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/slug(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/dragon(src)
|
||||
|
||||
@@ -479,7 +479,7 @@
|
||||
/obj/item/storage/backpack/duffelbag/syndie/bulldogbundle/PopulateContents()
|
||||
new /obj/item/ammo_box/magazine/m12g(src)
|
||||
new /obj/item/gun/ballistic/automatic/shotgun/bulldog(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/buckshot(src)
|
||||
new /obj/item/ammo_box/magazine/m12g/stun(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle
|
||||
@@ -511,6 +511,8 @@
|
||||
new /obj/item/storage/box/syringes(src)
|
||||
new /obj/item/ammo_box/foambox/riot(src)
|
||||
new /obj/item/grenade/chem_grenade/bioterrorfoam(src)
|
||||
if(prob(5))
|
||||
new /obj/item/reagent_containers/food/snacks/pizza/pineapple(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/syndie/c4/PopulateContents()
|
||||
for(var/i in 1 to 10)
|
||||
@@ -542,7 +544,7 @@
|
||||
STR.silent = TRUE
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/clown/syndie/PopulateContents()
|
||||
new /obj/item/device/pda/clown(src)
|
||||
new /obj/item/pda/clown(src)
|
||||
new /obj/item/clothing/under/rank/clown(src)
|
||||
new /obj/item/clothing/shoes/clown_shoes(src)
|
||||
new /obj/item/clothing/mask/gas/clown_hat(src)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
// Generic non-item
|
||||
/obj/item/storage/bag
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
|
||||
/obj/item/storage/bag/ComponentInitialize()
|
||||
. = ..()
|
||||
@@ -94,7 +94,7 @@
|
||||
desc = "This little bugger can be used to store and transport ores."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "satchel"
|
||||
slot_flags = SLOT_BELT | SLOT_POCKET
|
||||
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
component_type = /datum/component/storage/concrete/stack
|
||||
var/spam_protection = FALSE //If this is TRUE, the holder won't receive any messages when they fail to pick up ore through crossing it
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
item_state = "utility"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/belt_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/belt_righthand.dmi'
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
attack_verb = list("whipped", "lashed", "disciplined")
|
||||
max_integrity = 300
|
||||
var/content_overlays = FALSE //If this is true, the belt will gain overlays based on what it's holding
|
||||
@@ -34,27 +34,28 @@
|
||||
item_state = "utility"
|
||||
content_overlays = TRUE
|
||||
|
||||
/obj/item/storage/belt/ulility/ComponentInitialize()
|
||||
/obj/item/storage/belt/utility/ComponentInitialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.can_hold = typecacheof(list(
|
||||
var/static/list/can_hold = typecacheof(list(
|
||||
/obj/item/crowbar,
|
||||
/obj/item/screwdriver,
|
||||
/obj/item/weldingtool,
|
||||
/obj/item/wirecutters,
|
||||
/obj/item/wrench,
|
||||
/obj/item/device/multitool,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/multitool,
|
||||
/obj/item/flashlight,
|
||||
/obj/item/stack/cable_coil,
|
||||
/obj/item/device/t_scanner,
|
||||
/obj/item/device/analyzer,
|
||||
/obj/item/device/geiger_counter,
|
||||
/obj/item/t_scanner,
|
||||
/obj/item/analyzer,
|
||||
/obj/item/geiger_counter,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/device/radio,
|
||||
/obj/item/radio,
|
||||
/obj/item/clothing/gloves,
|
||||
/obj/item/holosign_creator,
|
||||
/obj/item/device/assembly/signaler
|
||||
/obj/item/assembly/signaler
|
||||
))
|
||||
STR.can_hold = can_hold
|
||||
|
||||
/obj/item/storage/belt/utility/chief
|
||||
name = "\improper Chief Engineer's toolbelt" //"the Chief Engineer's toolbelt", because "Chief Engineer's toolbelt" is not a proper noun
|
||||
@@ -66,10 +67,10 @@
|
||||
new /obj/item/screwdriver/power(src)
|
||||
new /obj/item/crowbar/power(src)
|
||||
new /obj/item/weldingtool/experimental(src)//This can be changed if this is too much
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
|
||||
new /obj/item/extinguisher/mini(src)
|
||||
new /obj/item/device/analyzer(src)
|
||||
new /obj/item/analyzer(src)
|
||||
//much roomier now that we've managed to remove two tools
|
||||
|
||||
/obj/item/storage/belt/utility/full/PopulateContents()
|
||||
@@ -78,7 +79,7 @@
|
||||
new /obj/item/weldingtool(src)
|
||||
new /obj/item/crowbar(src)
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
|
||||
|
||||
/obj/item/storage/belt/utility/full/engi/PopulateContents()
|
||||
@@ -87,7 +88,7 @@
|
||||
new /obj/item/weldingtool/largetank(src)
|
||||
new /obj/item/crowbar(src)
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
|
||||
|
||||
|
||||
@@ -97,7 +98,7 @@
|
||||
new /obj/item/weldingtool(src)
|
||||
new /obj/item/crowbar(src)
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/device/t_scanner(src)
|
||||
new /obj/item/t_scanner(src)
|
||||
new /obj/item/extinguisher/mini(src)
|
||||
|
||||
/obj/item/storage/belt/utility/servant/PopulateContents()
|
||||
@@ -106,7 +107,7 @@
|
||||
new /obj/item/wrench/brass(src)
|
||||
new /obj/item/crowbar/brass(src)
|
||||
new /obj/item/weldingtool/experimental/brass(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src, 30, "yellow")
|
||||
|
||||
/obj/item/storage/belt/medical
|
||||
@@ -120,7 +121,7 @@
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.max_w_class = WEIGHT_CLASS_BULKY
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/device/healthanalyzer,
|
||||
/obj/item/healthanalyzer,
|
||||
/obj/item/dnainjector,
|
||||
/obj/item/reagent_containers/dropper,
|
||||
/obj/item/reagent_containers/glass/beaker,
|
||||
@@ -132,11 +133,11 @@
|
||||
/obj/item/storage/fancy/cigarettes,
|
||||
/obj/item/storage/pill_bottle,
|
||||
/obj/item/stack/medical,
|
||||
/obj/item/device/flashlight/pen,
|
||||
/obj/item/flashlight/pen,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/reagent_containers/hypospray,
|
||||
/obj/item/device/sensor_device,
|
||||
/obj/item/device/radio,
|
||||
/obj/item/sensor_device,
|
||||
/obj/item/radio,
|
||||
/obj/item/clothing/gloves/,
|
||||
/obj/item/lazarus_injector,
|
||||
/obj/item/bikehorn/rubberducky,
|
||||
@@ -150,7 +151,7 @@
|
||||
/obj/item/retractor,
|
||||
/obj/item/cautery,
|
||||
/obj/item/hemostat,
|
||||
/obj/item/device/geiger_counter,
|
||||
/obj/item/geiger_counter,
|
||||
/obj/item/clothing/neck/stethoscope,
|
||||
/obj/item/stamp,
|
||||
/obj/item/clothing/glasses,
|
||||
@@ -185,15 +186,15 @@
|
||||
/obj/item/grenade,
|
||||
/obj/item/reagent_containers/spray/pepper,
|
||||
/obj/item/restraints/handcuffs,
|
||||
/obj/item/device/assembly/flash/handheld,
|
||||
/obj/item/assembly/flash/handheld,
|
||||
/obj/item/clothing/glasses,
|
||||
/obj/item/ammo_casing/shotgun,
|
||||
/obj/item/ammo_box,
|
||||
/obj/item/reagent_containers/food/snacks/donut,
|
||||
/obj/item/kitchen/knife/combat,
|
||||
/obj/item/device/flashlight/seclite,
|
||||
/obj/item/flashlight/seclite,
|
||||
/obj/item/melee/classic_baton/telescopic,
|
||||
/obj/item/device/radio,
|
||||
/obj/item/radio,
|
||||
/obj/item/clothing/gloves,
|
||||
/obj/item/restraints/legcuffs/bola
|
||||
))
|
||||
@@ -202,7 +203,7 @@
|
||||
new /obj/item/reagent_containers/spray/pepper(src)
|
||||
new /obj/item/restraints/handcuffs(src)
|
||||
new /obj/item/grenade/flashbang(src)
|
||||
new /obj/item/device/assembly/flash/handheld(src)
|
||||
new /obj/item/assembly/flash/handheld(src)
|
||||
new /obj/item/melee/baton/loaded(src)
|
||||
update_icon()
|
||||
|
||||
@@ -225,15 +226,15 @@
|
||||
/obj/item/weldingtool,
|
||||
/obj/item/wirecutters,
|
||||
/obj/item/wrench,
|
||||
/obj/item/device/multitool,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/multitool,
|
||||
/obj/item/flashlight,
|
||||
/obj/item/stack/cable_coil,
|
||||
/obj/item/device/analyzer,
|
||||
/obj/item/analyzer,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/device/radio,
|
||||
/obj/item/radio,
|
||||
/obj/item/clothing/gloves,
|
||||
/obj/item/resonator,
|
||||
/obj/item/device/mining_scanner,
|
||||
/obj/item/mining_scanner,
|
||||
/obj/item/pickaxe,
|
||||
/obj/item/stack/sheet/animalhide,
|
||||
/obj/item/stack/sheet/sinew,
|
||||
@@ -244,16 +245,16 @@
|
||||
/obj/item/stack/medical,
|
||||
/obj/item/kitchen/knife,
|
||||
/obj/item/reagent_containers/hypospray,
|
||||
/obj/item/device/gps,
|
||||
/obj/item/gps,
|
||||
/obj/item/storage/bag/ore,
|
||||
/obj/item/survivalcapsule,
|
||||
/obj/item/device/t_scanner/adv_mining_scanner,
|
||||
/obj/item/t_scanner/adv_mining_scanner,
|
||||
/obj/item/reagent_containers/pill,
|
||||
/obj/item/storage/pill_bottle,
|
||||
/obj/item/stack/ore,
|
||||
/obj/item/reagent_containers/food/drinks,
|
||||
/obj/item/organ/regenerative_core,
|
||||
/obj/item/device/wormhole_jaunter,
|
||||
/obj/item/wormhole_jaunter,
|
||||
/obj/item/storage/bag/plants,
|
||||
/obj/item/stack/marker_beacon
|
||||
))
|
||||
@@ -288,16 +289,16 @@
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.max_items = 6
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/device/soulstone
|
||||
/obj/item/soulstone
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/soulstone/full/PopulateContents()
|
||||
for(var/i in 1 to 6)
|
||||
new /obj/item/device/soulstone(src)
|
||||
new /obj/item/soulstone(src)
|
||||
|
||||
/obj/item/storage/belt/soulstone/full/chappy/PopulateContents()
|
||||
for(var/i in 1 to 6)
|
||||
new /obj/item/device/soulstone/anybody/chaplain(src)
|
||||
new /obj/item/soulstone/anybody/chaplain(src)
|
||||
|
||||
/obj/item/storage/belt/champion
|
||||
name = "championship belt"
|
||||
@@ -338,7 +339,7 @@
|
||||
new /obj/item/weldingtool/abductor(src)
|
||||
new /obj/item/crowbar/abductor(src)
|
||||
new /obj/item/wirecutters/abductor(src)
|
||||
new /obj/item/device/multitool/abductor(src)
|
||||
new /obj/item/multitool/abductor(src)
|
||||
new /obj/item/stack/cable_coil(src,30,"white")
|
||||
|
||||
/obj/item/storage/belt/military/army
|
||||
@@ -375,7 +376,7 @@
|
||||
/obj/item/grenade,
|
||||
/obj/item/screwdriver,
|
||||
/obj/item/lighter,
|
||||
/obj/item/device/multitool,
|
||||
/obj/item/multitool,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/molotov,
|
||||
/obj/item/grenade/plastic/c4,
|
||||
))
|
||||
@@ -408,7 +409,7 @@
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
new /obj/item/screwdriver(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/multitool(src)
|
||||
|
||||
/obj/item/storage/belt/wands
|
||||
name = "wand belt"
|
||||
@@ -449,15 +450,15 @@
|
||||
STR.max_w_class = WEIGHT_CLASS_BULKY // Set to this so the light replacer can fit.
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/grenade/chem_grenade,
|
||||
/obj/item/device/lightreplacer,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/lightreplacer,
|
||||
/obj/item/flashlight,
|
||||
/obj/item/reagent_containers/spray,
|
||||
/obj/item/soap,
|
||||
/obj/item/holosign_creator,
|
||||
/obj/item/key/janitor,
|
||||
/obj/item/clothing/gloves,
|
||||
/obj/item/melee/flyswatter,
|
||||
/obj/item/device/assembly/mousetrap
|
||||
/obj/item/assembly/mousetrap
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/bandolier
|
||||
@@ -606,4 +607,4 @@
|
||||
|
||||
/obj/item/storage/belt/sabre/PopulateContents()
|
||||
new /obj/item/melee/sabre(src)
|
||||
update_icon()
|
||||
update_icon()
|
||||
@@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
|
||||
if(B.icon_state == "honk1" || B.icon_state == "honk2")
|
||||
var/mob/living/carbon/human/H = usr
|
||||
H.dna.add_mutation(CLOWNMUT)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), SLOT_WEAR_MASK)
|
||||
|
||||
SSreligion.bible_icon_state = B.icon_state
|
||||
SSreligion.bible_item_state = B.item_state
|
||||
@@ -177,7 +177,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
|
||||
playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,1)
|
||||
if(do_after(user, 40, target = sword))
|
||||
playsound(src,'sound/effects/pray_chaplain.ogg',60,1)
|
||||
for(var/obj/item/device/soulstone/SS in sword.contents)
|
||||
for(var/obj/item/soulstone/SS in sword.contents)
|
||||
SS.usability = TRUE
|
||||
for(var/mob/living/simple_animal/shade/EX in SS)
|
||||
SSticker.mode.remove_cultist(EX.mind, 1, 0)
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
|
||||
/obj/item/storage/box/survival/radio/PopulateContents()
|
||||
..() // we want the survival stuff too.
|
||||
new /obj/item/device/radio/off(src)
|
||||
new /obj/item/radio/off(src)
|
||||
|
||||
/obj/item/storage/box/survival_mining/PopulateContents()
|
||||
new /obj/item/clothing/mask/gas/explorer(src)
|
||||
@@ -118,7 +118,7 @@
|
||||
|
||||
/obj/item/storage/box/engineer/radio/PopulateContents()
|
||||
..() // we want the regular items too.
|
||||
new /obj/item/device/radio/off(src)
|
||||
new /obj/item/radio/off(src)
|
||||
|
||||
// Syndie survival box
|
||||
/obj/item/storage/box/syndie/PopulateContents()
|
||||
@@ -133,7 +133,7 @@
|
||||
|
||||
/obj/item/storage/box/security/radio/PopulateContents()
|
||||
..() // we want the regular stuff too
|
||||
new /obj/item/device/radio/off(src)
|
||||
new /obj/item/radio/off(src)
|
||||
|
||||
/obj/item/storage/box/gloves
|
||||
name = "box of latex gloves"
|
||||
@@ -225,7 +225,7 @@
|
||||
|
||||
/obj/item/storage/box/flashes/PopulateContents()
|
||||
for(var/i in 1 to 6)
|
||||
new /obj/item/device/assembly/flash/handheld(src)
|
||||
new /obj/item/assembly/flash/handheld(src)
|
||||
|
||||
/obj/item/storage/box/wall_flash
|
||||
name = "wall-mounted flash kit"
|
||||
@@ -238,11 +238,11 @@
|
||||
|
||||
new /obj/item/wallframe/button(src)
|
||||
new /obj/item/electronics/airlock(src)
|
||||
var/obj/item/device/assembly/control/flasher/remote = new(src)
|
||||
var/obj/item/assembly/control/flasher/remote = new(src)
|
||||
remote.id = id
|
||||
var/obj/item/wallframe/flasher/frame = new(src)
|
||||
frame.id = id
|
||||
new /obj/item/device/assembly/flash/handheld(src)
|
||||
new /obj/item/assembly/flash/handheld(src)
|
||||
new /obj/item/screwdriver(src)
|
||||
|
||||
|
||||
@@ -399,10 +399,10 @@
|
||||
illustration = "pda"
|
||||
|
||||
/obj/item/storage/box/PDAs/PopulateContents()
|
||||
new /obj/item/device/pda(src)
|
||||
new /obj/item/device/pda(src)
|
||||
new /obj/item/device/pda(src)
|
||||
new /obj/item/device/pda(src)
|
||||
new /obj/item/pda(src)
|
||||
new /obj/item/pda(src)
|
||||
new /obj/item/pda(src)
|
||||
new /obj/item/pda(src)
|
||||
new /obj/item/cartridge/head(src)
|
||||
|
||||
var/newcart = pick( /obj/item/cartridge/engineering,
|
||||
@@ -453,7 +453,7 @@
|
||||
|
||||
/obj/item/storage/box/firingpins/PopulateContents()
|
||||
for(var/i in 1 to 5)
|
||||
new /obj/item/device/firing_pin(src)
|
||||
new /obj/item/firing_pin(src)
|
||||
|
||||
/obj/item/storage/box/lasertagpins
|
||||
name = "box of laser tag firing pins"
|
||||
@@ -462,8 +462,8 @@
|
||||
|
||||
/obj/item/storage/box/lasertagpins/PopulateContents()
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/device/firing_pin/tag/red(src)
|
||||
new /obj/item/device/firing_pin/tag/blue(src)
|
||||
new /obj/item/firing_pin/tag/red(src)
|
||||
new /obj/item/firing_pin/tag/blue(src)
|
||||
|
||||
/obj/item/storage/box/handcuffs
|
||||
name = "box of spare handcuffs"
|
||||
@@ -511,7 +511,7 @@
|
||||
|
||||
/obj/item/storage/box/mousetraps/PopulateContents()
|
||||
for(var/i in 1 to 6)
|
||||
new /obj/item/device/assembly/mousetrap(src)
|
||||
new /obj/item/assembly/mousetrap(src)
|
||||
|
||||
/obj/item/storage/box/pillbottles
|
||||
name = "box of pill bottles"
|
||||
@@ -544,7 +544,7 @@
|
||||
icon_state = "matchbox"
|
||||
item_state = "zippo"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
|
||||
/obj/item/storage/box/matches/ComponentInitialize()
|
||||
. = ..()
|
||||
@@ -966,3 +966,45 @@ obj/item/storage/box/clown
|
||||
/obj/item/storage/box/holy_grenades/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new/obj/item/grenade/chem_grenade/holy(src)
|
||||
|
||||
/obj/item/storage/box/stockparts/basic //for ruins where it's a bad idea to give access to an autolathe/protolathe, but still want to make stock parts accessible
|
||||
name = "box of stock parts"
|
||||
desc = "Contains a variety of basic stock parts."
|
||||
|
||||
/obj/item/storage/box/stockparts/basic/PopulateContents()
|
||||
new /obj/item/stock_parts/capacitor(src)
|
||||
new /obj/item/stock_parts/capacitor(src)
|
||||
new /obj/item/stock_parts/capacitor(src)
|
||||
new /obj/item/stock_parts/scanning_module(src)
|
||||
new /obj/item/stock_parts/scanning_module(src)
|
||||
new /obj/item/stock_parts/scanning_module(src)
|
||||
new /obj/item/stock_parts/manipulator(src)
|
||||
new /obj/item/stock_parts/manipulator(src)
|
||||
new /obj/item/stock_parts/manipulator(src)
|
||||
new /obj/item/stock_parts/micro_laser(src)
|
||||
new /obj/item/stock_parts/micro_laser(src)
|
||||
new /obj/item/stock_parts/micro_laser(src)
|
||||
new /obj/item/stock_parts/matter_bin(src)
|
||||
new /obj/item/stock_parts/matter_bin(src)
|
||||
new /obj/item/stock_parts/matter_bin(src)
|
||||
|
||||
/obj/item/storage/box/stockparts/deluxe
|
||||
name = "box of deluxe stock parts"
|
||||
desc = "Contains a variety of deluxe stock parts."
|
||||
|
||||
/obj/item/storage/box/stockparts/deluxe/PopulateContents()
|
||||
new /obj/item/stock_parts/capacitor/quadratic(src)
|
||||
new /obj/item/stock_parts/capacitor/quadratic(src)
|
||||
new /obj/item/stock_parts/capacitor/quadratic(src)
|
||||
new /obj/item/stock_parts/scanning_module/triphasic(src)
|
||||
new /obj/item/stock_parts/scanning_module/triphasic(src)
|
||||
new /obj/item/stock_parts/scanning_module/triphasic(src)
|
||||
new /obj/item/stock_parts/manipulator/femto(src)
|
||||
new /obj/item/stock_parts/manipulator/femto(src)
|
||||
new /obj/item/stock_parts/manipulator/femto(src)
|
||||
new /obj/item/stock_parts/micro_laser/quadultra(src)
|
||||
new /obj/item/stock_parts/micro_laser/quadultra(src)
|
||||
new /obj/item/stock_parts/micro_laser/quadultra(src)
|
||||
new /obj/item/stock_parts/matter_bin/bluespace(src)
|
||||
new /obj/item/stock_parts/matter_bin/bluespace(src)
|
||||
new /obj/item/stock_parts/matter_bin/bluespace(src)
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
icon_type = "candle"
|
||||
item_state = "candlebox5"
|
||||
throwforce = 2
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
spawn_type = /obj/item/candle
|
||||
fancy_open = TRUE
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
item_state = "cigpacket"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throwforce = 0
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
icon_type = "cigarette"
|
||||
spawn_type = /obj/item/clothing/mask/cigarette/space_cigarette
|
||||
|
||||
@@ -189,7 +189,7 @@
|
||||
if(M == user && contents.len > 0 && !user.wear_mask)
|
||||
var/obj/item/clothing/mask/cigarette/W = cig
|
||||
SendSignal(COMSIG_TRY_STORAGE_TAKE, W, M)
|
||||
M.equip_to_slot_if_possible(W, slot_wear_mask)
|
||||
M.equip_to_slot_if_possible(W, SLOT_WEAR_MASK)
|
||||
contents -= W
|
||||
to_chat(user, "<span class='notice'>You take a [icon_type] out of the pack.</span>")
|
||||
else
|
||||
@@ -237,7 +237,7 @@
|
||||
name = "\improper Midori Tabako packet"
|
||||
desc = "You can't understand the runes, but the packet smells funny."
|
||||
icon_state = "midori"
|
||||
spawn_type = /obj/item/clothing/mask/cigarette/rollie
|
||||
spawn_type = /obj/item/clothing/mask/cigarette/rollie/nicotine
|
||||
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_shadyjims
|
||||
name = "\improper Shady Jim's Super Slims packet"
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
new /obj/item/stack/medical/ointment(src)
|
||||
new /obj/item/stack/medical/ointment(src)
|
||||
new /obj/item/reagent_containers/hypospray/medipen(src)
|
||||
new /obj/item/device/healthanalyzer(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
|
||||
/obj/item/storage/firstaid/ancient
|
||||
icon_state = "firstaid"
|
||||
@@ -74,7 +74,7 @@
|
||||
new /obj/item/reagent_containers/pill/oxandrolone(src)
|
||||
new /obj/item/reagent_containers/pill/oxandrolone(src)
|
||||
new /obj/item/reagent_containers/hypospray/medipen(src)
|
||||
new /obj/item/device/healthanalyzer(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
|
||||
/obj/item/storage/firstaid/toxin
|
||||
name = "toxin treatment kit"
|
||||
@@ -97,7 +97,7 @@
|
||||
new /obj/item/reagent_containers/syringe/charcoal(src)
|
||||
for(var/i in 1 to 2)
|
||||
new /obj/item/storage/pill_bottle/charcoal(src)
|
||||
new /obj/item/device/healthanalyzer(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
|
||||
/obj/item/storage/firstaid/o2
|
||||
name = "oxygen deprivation treatment kit"
|
||||
@@ -116,7 +116,7 @@
|
||||
new /obj/item/reagent_containers/pill/salbutamol(src)
|
||||
new /obj/item/reagent_containers/hypospray/medipen(src)
|
||||
new /obj/item/reagent_containers/hypospray/medipen(src)
|
||||
new /obj/item/device/healthanalyzer(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
|
||||
/obj/item/storage/firstaid/brute
|
||||
name = "brute trauma treatment kit"
|
||||
@@ -135,7 +135,7 @@
|
||||
new /obj/item/reagent_containers/pill/patch/styptic(src)
|
||||
new /obj/item/stack/medical/gauze(src)
|
||||
new /obj/item/stack/medical/gauze(src)
|
||||
new /obj/item/device/healthanalyzer(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
|
||||
/obj/item/storage/firstaid/tactical
|
||||
name = "combat medical kit"
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
return
|
||||
if (istype(W, /obj/item/wirecutters))
|
||||
to_chat(user, "<span class='danger'>[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be <b>pulsed</b>.</span>")
|
||||
if ((istype(W, /obj/item/device/multitool)) && (!l_hacking))
|
||||
if ((istype(W, /obj/item/multitool)) && (!l_hacking))
|
||||
if(open == 1)
|
||||
to_chat(user, "<span class='danger'>Now attempting to reset internal memory, please hold.</span>")
|
||||
l_hacking = 1
|
||||
|
||||
@@ -48,12 +48,12 @@
|
||||
new /obj/item/extinguisher/mini(src)
|
||||
switch(rand(1,3))
|
||||
if(1)
|
||||
new /obj/item/device/flashlight(src)
|
||||
new /obj/item/flashlight(src)
|
||||
if(2)
|
||||
new /obj/item/device/flashlight/glowstick(src)
|
||||
new /obj/item/flashlight/glowstick(src)
|
||||
if(3)
|
||||
new /obj/item/device/flashlight/flare(src)
|
||||
new /obj/item/device/radio/off(src)
|
||||
new /obj/item/flashlight/flare(src)
|
||||
new /obj/item/radio/off(src)
|
||||
|
||||
/obj/item/storage/toolbox/emergency/old
|
||||
name = "rusty red toolbox"
|
||||
@@ -70,7 +70,7 @@
|
||||
new /obj/item/wrench(src)
|
||||
new /obj/item/weldingtool(src)
|
||||
new /obj/item/crowbar(src)
|
||||
new /obj/item/device/analyzer(src)
|
||||
new /obj/item/analyzer(src)
|
||||
new /obj/item/wirecutters(src)
|
||||
|
||||
/obj/item/storage/toolbox/mechanical/old
|
||||
@@ -96,7 +96,7 @@
|
||||
var/pickedcolor = pick("red","yellow","green","blue","pink","orange","cyan","white")
|
||||
new /obj/item/screwdriver(src)
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/device/t_scanner(src)
|
||||
new /obj/item/t_scanner(src)
|
||||
new /obj/item/crowbar(src)
|
||||
new /obj/item/stack/cable_coil(src,30,pickedcolor)
|
||||
new /obj/item/stack/cable_coil(src,30,pickedcolor)
|
||||
@@ -123,7 +123,7 @@
|
||||
new /obj/item/weldingtool/largetank(src)
|
||||
new /obj/item/crowbar/red(src)
|
||||
new /obj/item/wirecutters(src, "red")
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/clothing/gloves/combat(src)
|
||||
|
||||
/obj/item/storage/toolbox/drone
|
||||
@@ -139,7 +139,7 @@
|
||||
new /obj/item/crowbar(src)
|
||||
new /obj/item/stack/cable_coil(src,30,pickedcolor)
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/multitool(src)
|
||||
|
||||
/obj/item/storage/toolbox/brass
|
||||
name = "brass box"
|
||||
@@ -168,7 +168,7 @@
|
||||
new /obj/item/weldingtool/experimental/brass(src)
|
||||
|
||||
/obj/item/storage/toolbox/brass/prefilled/servant
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
fabricator_type = null
|
||||
|
||||
/obj/item/storage/toolbox/brass/prefilled/ratvar
|
||||
|
||||
@@ -7,20 +7,20 @@
|
||||
new /obj/item/clothing/mask/chameleon(src) // Goes with above
|
||||
new /obj/item/card/id/syndicate(src) // 2 tc
|
||||
new /obj/item/clothing/shoes/chameleon/noslip(src) // 2 tc
|
||||
new /obj/item/device/camera_bug(src) // 1 tc
|
||||
new /obj/item/device/multitool/ai_detect(src) // 1 tc
|
||||
new /obj/item/device/encryptionkey/syndicate(src) // 2 tc
|
||||
new /obj/item/camera_bug(src) // 1 tc
|
||||
new /obj/item/multitool/ai_detect(src) // 1 tc
|
||||
new /obj/item/encryptionkey/syndicate(src) // 2 tc
|
||||
new /obj/item/reagent_containers/syringe/mulligan(src) // 4 tc
|
||||
new /obj/item/switchblade(src) //I'll count this as 2 tc
|
||||
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate (src) // 2 tc this shit heals
|
||||
new /obj/item/device/flashlight/emp(src) // 2 tc
|
||||
new /obj/item/device/chameleon(src) // 7 tc
|
||||
new /obj/item/flashlight/emp(src) // 2 tc
|
||||
new /obj/item/chameleon(src) // 7 tc
|
||||
|
||||
if("stealth") // 31 tc
|
||||
new /obj/item/gun/energy/kinetic_accelerator/crossbow(src)
|
||||
new /obj/item/pen/sleepy(src)
|
||||
new /obj/item/device/healthanalyzer/rad_laser(src)
|
||||
new /obj/item/device/chameleon(src)
|
||||
new /obj/item/healthanalyzer/rad_laser(src)
|
||||
new /obj/item/chameleon(src)
|
||||
new /obj/item/soap/syndie(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
|
||||
@@ -34,12 +34,12 @@
|
||||
new /obj/item/reagent_containers/syringe/stimulants(src)
|
||||
|
||||
if("screwed") // 29 tc
|
||||
new /obj/item/device/sbeacondrop/bomb(src)
|
||||
new /obj/item/sbeacondrop/bomb(src)
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
new /obj/item/device/sbeacondrop/powersink(src)
|
||||
new /obj/item/sbeacondrop/powersink(src)
|
||||
new /obj/item/clothing/suit/space/syndicate/black/red(src)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
new /obj/item/device/encryptionkey/syndicate(src)
|
||||
new /obj/item/encryptionkey/syndicate(src)
|
||||
|
||||
if("guns") // 28 tc now
|
||||
new /obj/item/gun/ballistic/revolver(src)
|
||||
@@ -56,7 +56,7 @@
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/clothing/shoes/chameleon/noslip(src)
|
||||
new /obj/item/device/encryptionkey/syndicate(src)
|
||||
new /obj/item/encryptionkey/syndicate(src)
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
|
||||
if("implant") // 55+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it?
|
||||
@@ -70,12 +70,12 @@
|
||||
if("hacker") // 26 tc
|
||||
new /obj/item/aiModule/syndicate(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/device/encryptionkey/binary(src)
|
||||
new /obj/item/encryptionkey/binary(src)
|
||||
new /obj/item/aiModule/toyAI(src)
|
||||
new /obj/item/device/multitool/ai_detect(src)
|
||||
new /obj/item/multitool/ai_detect(src)
|
||||
|
||||
if("lordsingulo") // 24 tc
|
||||
new /obj/item/device/sbeacondrop(src)
|
||||
new /obj/item/sbeacondrop(src)
|
||||
new /obj/item/clothing/suit/space/syndicate/black/red(src)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
new /obj/item/card/emag(src)
|
||||
@@ -83,10 +83,10 @@
|
||||
if("sabotage") // 26 tc now
|
||||
new /obj/item/grenade/plastic/c4 (src)
|
||||
new /obj/item/grenade/plastic/c4 (src)
|
||||
new /obj/item/device/doorCharge(src)
|
||||
new /obj/item/device/doorCharge(src)
|
||||
new /obj/item/device/camera_bug(src)
|
||||
new /obj/item/device/sbeacondrop/powersink(src)
|
||||
new /obj/item/doorCharge(src)
|
||||
new /obj/item/doorCharge(src)
|
||||
new /obj/item/camera_bug(src)
|
||||
new /obj/item/sbeacondrop/powersink(src)
|
||||
new /obj/item/cartridge/virus/syndicate(src)
|
||||
new /obj/item/storage/toolbox/syndicate(src) //To actually get to those places
|
||||
new /obj/item/pizzabox/bomb
|
||||
@@ -111,8 +111,8 @@
|
||||
new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc
|
||||
new /obj/item/gun/ballistic/automatic/shotgun/bulldog/unrestricted(src) // 8 tc
|
||||
new /obj/item/implanter/explosive(src) // 2 tc
|
||||
new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc
|
||||
new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc
|
||||
new /obj/item/ammo_box/magazine/m12g(src) // 2 tc
|
||||
new /obj/item/ammo_box/magazine/m12g(src) // 2 tc
|
||||
new /obj/item/grenade/plastic/c4 (src) // 1 tc
|
||||
new /obj/item/grenade/plastic/c4 (src) // 1 tc
|
||||
new /obj/item/card/emag(src) // 6 tc
|
||||
@@ -128,7 +128,7 @@
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/storage/belt/chameleon(src) // Unique but worth at least 2 tc
|
||||
new /obj/item/card/id/syndicate(src) // 2 tc
|
||||
new /obj/item/device/chameleon(src) // 7 tc
|
||||
new /obj/item/chameleon(src) // 7 tc
|
||||
|
||||
/obj/item/storage/box/syndie_kit
|
||||
name = "box"
|
||||
@@ -277,10 +277,10 @@
|
||||
new /obj/item/clothing/head/chameleon(src)
|
||||
new /obj/item/clothing/mask/chameleon(src)
|
||||
new /obj/item/storage/backpack/chameleon(src)
|
||||
new /obj/item/device/radio/headset/chameleon(src)
|
||||
new /obj/item/radio/headset/chameleon(src)
|
||||
new /obj/item/stamp/chameleon(src)
|
||||
new /obj/item/device/pda/chameleon(src)
|
||||
new /obj/item/gun/energy/laser/chameleon(src)
|
||||
new /obj/item/pda/chameleon(src)
|
||||
//new /obj/item/gun/energy/laser/chameleon(src) //crashes the server right now. please fix it!
|
||||
|
||||
//5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars.
|
||||
//Not counting the damage it will do while embedded (2*4 = 8, at 15% chance)
|
||||
@@ -321,10 +321,10 @@
|
||||
new /obj/item/clothing/under/rank/centcom_officer(src)
|
||||
new /obj/item/clothing/shoes/sneakers/black(src)
|
||||
new /obj/item/clothing/gloves/color/black(src)
|
||||
new /obj/item/device/radio/headset/headset_cent/empty(src)
|
||||
new /obj/item/radio/headset/headset_cent/empty(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/storage/backpack/satchel(src)
|
||||
new /obj/item/device/pda/heads(src)
|
||||
new /obj/item/pda/heads(src)
|
||||
new /obj/item/clipboard(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/chameleon/broken/PopulateContents()
|
||||
@@ -336,7 +336,7 @@
|
||||
new /obj/item/clothing/head/chameleon/broken(src)
|
||||
new /obj/item/clothing/mask/chameleon/broken(src)
|
||||
new /obj/item/storage/backpack/chameleon/broken(src)
|
||||
new /obj/item/device/radio/headset/chameleon/broken(src)
|
||||
new /obj/item/radio/headset/chameleon/broken(src)
|
||||
new /obj/item/stamp/chameleon/broken(src)
|
||||
new /obj/item/device/pda/chameleon/broken(src)
|
||||
new /obj/item/pda/chameleon/broken(src)
|
||||
// No chameleon laser, they can't randomise for //REASONS//
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "wallet"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
resistance_flags = FLAMMABLE
|
||||
slot_flags = SLOT_ID
|
||||
slot_flags = ITEM_SLOT_ID
|
||||
|
||||
var/obj/item/card/id/front_id = null
|
||||
var/list/combined_access
|
||||
@@ -17,7 +17,7 @@
|
||||
/obj/item/stack/spacecash,
|
||||
/obj/item/card,
|
||||
/obj/item/clothing/mask/cigarette,
|
||||
/obj/item/device/flashlight/pen,
|
||||
/obj/item/flashlight/pen,
|
||||
/obj/item/seeds,
|
||||
/obj/item/stack/medical,
|
||||
/obj/item/toy/crayon,
|
||||
@@ -38,16 +38,20 @@
|
||||
|
||||
/obj/item/storage/wallet/Exited(atom/movable/AM)
|
||||
. = ..()
|
||||
refreshID()
|
||||
// The loc has not actually changed yet when this proc is called, so call
|
||||
// refreshID and have it ignore the outgoing atom.
|
||||
refreshID(AM)
|
||||
|
||||
/obj/item/storage/wallet/proc/refreshID()
|
||||
if(!(front_id in src))
|
||||
/obj/item/storage/wallet/proc/refreshID(atom/movable/removed)
|
||||
LAZYCLEARLIST(combined_access)
|
||||
if(!(front_id in src) || front_id == removed)
|
||||
front_id = null
|
||||
for(var/obj/item/card/id/I in contents)
|
||||
LAZYINITLIST(combined_access)
|
||||
LAZYCLEARLIST(combined_access)
|
||||
if(I == removed)
|
||||
continue
|
||||
if(!front_id)
|
||||
front_id = I
|
||||
LAZYINITLIST(combined_access)
|
||||
combined_access |= I.access
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
item_state = "baton"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 10
|
||||
throwforce = 7
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
@@ -195,8 +195,8 @@
|
||||
stunforce = 100
|
||||
hitcost = 2000
|
||||
throw_hit_chance = 10
|
||||
slot_flags = SLOT_BACK
|
||||
var/obj/item/device/assembly/igniter/sparkler = 0
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
var/obj/item/assembly/igniter/sparkler = 0
|
||||
|
||||
/obj/item/melee/baton/cattleprod/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -137,7 +137,7 @@
|
||||
/obj/item/tank/internals/plasmaman/belt
|
||||
icon_state = "plasmaman_tank_belt"
|
||||
item_state = "plasmaman_tank_belt"
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 5
|
||||
volume = 6
|
||||
w_class = WEIGHT_CLASS_SMALL //thanks i forgot this
|
||||
@@ -157,7 +157,7 @@
|
||||
desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it."
|
||||
icon_state = "emergency"
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
force = 4
|
||||
distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tanks_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tanks_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
hitsound = 'sound/weapons/smash.ogg'
|
||||
pressure_resistance = ONE_ATMOSPHERE * 5
|
||||
force = 5
|
||||
@@ -38,7 +38,7 @@
|
||||
return
|
||||
if(H.wear_mask.mask_adjusted)
|
||||
H.wear_mask.adjustmask(H)
|
||||
if(!(H.wear_mask.flags_1 & MASKINTERNALS_1))
|
||||
if(!(H.wear_mask.clothing_flags & MASKINTERNALS))
|
||||
to_chat(H, "<span class='warning'>[H.wear_mask] can't use [src]!</span>")
|
||||
return
|
||||
|
||||
@@ -138,10 +138,10 @@
|
||||
|
||||
/obj/item/tank/attackby(obj/item/W, mob/user, params)
|
||||
add_fingerprint(user)
|
||||
if((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
|
||||
if((istype(W, /obj/item/analyzer)) && get_dist(user, src) <= 1)
|
||||
atmosanalyzer_scan(air_contents, user)
|
||||
|
||||
else if(istype(W, /obj/item/device/assembly_holder))
|
||||
else if(istype(W, /obj/item/assembly_holder))
|
||||
bomb_assemble(W,user)
|
||||
else
|
||||
. = ..()
|
||||
@@ -237,7 +237,7 @@
|
||||
var/temperature = air_contents.return_pressure()
|
||||
|
||||
if(pressure > TANK_FRAGMENT_PRESSURE)
|
||||
if(!istype(src.loc, /obj/item/device/transfer_valve))
|
||||
if(!istype(src.loc, /obj/item/transfer_valve))
|
||||
message_admins("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].")
|
||||
log_game("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].")
|
||||
//Give the gas a chance to build up more pressure through reacting
|
||||
@@ -250,7 +250,7 @@
|
||||
|
||||
|
||||
explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5))
|
||||
if(istype(src.loc, /obj/item/device/transfer_valve))
|
||||
if(istype(src.loc, /obj/item/transfer_valve))
|
||||
qdel(src.loc)
|
||||
else
|
||||
qdel(src)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_state = "waterbackpack"
|
||||
item_state = "waterbackpack"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
slowdown = 1
|
||||
actions_types = list(/datum/action/item_action/toggle_mister)
|
||||
max_integrity = 200
|
||||
@@ -49,7 +49,6 @@
|
||||
on = FALSE
|
||||
to_chat(user, "<span class='warning'>You need a free hand to hold the mister!</span>")
|
||||
return
|
||||
noz.forceMove(user)
|
||||
else
|
||||
//Remove from their hands and put back "into" the tank
|
||||
remove_noz()
|
||||
@@ -60,7 +59,7 @@
|
||||
|
||||
/obj/item/watertank/equipped(mob/user, slot)
|
||||
..()
|
||||
if(slot != slot_back)
|
||||
if(slot != SLOT_BACK)
|
||||
remove_noz()
|
||||
|
||||
/obj/item/watertank/proc/remove_noz()
|
||||
@@ -344,7 +343,7 @@
|
||||
icon_state = "waterbackpackatmos"
|
||||
item_state = "waterbackpackatmos"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
slowdown = 1
|
||||
actions_types = list(/datum/action/item_action/activate_injector)
|
||||
|
||||
@@ -361,14 +360,14 @@
|
||||
toggle_injection()
|
||||
|
||||
/obj/item/reagent_containers/chemtank/item_action_slot_check(slot, mob/user)
|
||||
if(slot == slot_back)
|
||||
if(slot == SLOT_BACK)
|
||||
return 1
|
||||
|
||||
/obj/item/reagent_containers/chemtank/proc/toggle_injection()
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if(!istype(user))
|
||||
return
|
||||
if (user.get_item_by_slot(slot_back) != src)
|
||||
if (user.get_item_by_slot(SLOT_BACK) != src)
|
||||
to_chat(user, "<span class='warning'>The chemtank needs to be on your back before you can activate it!</span>")
|
||||
return
|
||||
if(on)
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
if (sr)
|
||||
temp += "<B>Beacon Signals:</B><BR>"
|
||||
for(var/obj/item/device/beacon/W in GLOB.teleportbeacons)
|
||||
for(var/obj/item/beacon/W in GLOB.teleportbeacons)
|
||||
if (!W.renamed)
|
||||
continue
|
||||
var/turf/tr = get_turf(W)
|
||||
@@ -219,3 +219,17 @@
|
||||
if(active_portal_pairs[i] == P)
|
||||
return DESTINATION_PORTAL
|
||||
return FALSE
|
||||
|
||||
/obj/item/hand_tele/suicide_act(mob/user)
|
||||
if(iscarbon(user))
|
||||
user.visible_message("<span class='suicide'>[user] is creating a weak portal and sticking [user.p_their()] head through! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
var/mob/living/carbon/itemUser = user
|
||||
var/obj/item/bodypart/head/head = itemUser.get_bodypart(BODY_ZONE_HEAD)
|
||||
if(head)
|
||||
head.drop_limb()
|
||||
var/list/safeLevels = SSmapping.levels_by_any_trait(list(ZTRAIT_SPACE_RUINS, ZTRAIT_LAVA_RUINS, ZTRAIT_STATION, ZTRAIT_MINING))
|
||||
head.forceMove(locate(rand(1, world.maxx), rand(1, world.maxy), pick(safeLevels)))
|
||||
itemUser.visible_message("<span class='suicide'>The portal snaps closed taking [user]'s head with it!</span>")
|
||||
else
|
||||
itemUser.visible_message("<span class='suicide'>[user] looks even further depressed as they realize they do not have a head...and suddenly dies of shame!</span>")
|
||||
return (BRUTELOSS)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
usesound = 'sound/items/crowbar.ogg'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 5
|
||||
throwforce = 7
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 5
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throwforce = 5
|
||||
|
||||
@@ -1,372 +1,372 @@
|
||||
#define WELDER_FUEL_BURN_INTERVAL 13
|
||||
/obj/item/weldingtool
|
||||
name = "welding tool"
|
||||
desc = "A standard edition welder provided by Nanotrasen."
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "welder"
|
||||
item_state = "welder"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
force = 3
|
||||
throwforce = 5
|
||||
hitsound = "swing_hit"
|
||||
usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg')
|
||||
var/acti_sound = 'sound/items/welderactivate.ogg'
|
||||
var/deac_sound = 'sound/items/welderdeactivate.ogg'
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=30)
|
||||
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
|
||||
var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
|
||||
var/max_fuel = 20 //The max amount of fuel the welder can hold
|
||||
var/change_icons = 1
|
||||
var/can_off_process = 0
|
||||
var/light_intensity = 2 //how powerful the emitted light is when used.
|
||||
var/progress_flash_divisor = 10
|
||||
var/burned_fuel_for = 0 //when fuel was last removed
|
||||
heat = 3800
|
||||
tool_behaviour = TOOL_WELDER
|
||||
toolspeed = 1
|
||||
|
||||
/obj/item/weldingtool/Initialize()
|
||||
. = ..()
|
||||
create_reagents(max_fuel)
|
||||
reagents.add_reagent("welding_fuel", max_fuel)
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/weldingtool/proc/update_torch()
|
||||
if(welding)
|
||||
add_overlay("[initial(icon_state)]-on")
|
||||
item_state = "[initial(item_state)]1"
|
||||
else
|
||||
item_state = "[initial(item_state)]"
|
||||
|
||||
|
||||
/obj/item/weldingtool/update_icon()
|
||||
cut_overlays()
|
||||
if(change_icons)
|
||||
var/ratio = get_fuel() / max_fuel
|
||||
ratio = CEILING(ratio*4, 1) * 25
|
||||
add_overlay("[initial(icon_state)][ratio]")
|
||||
update_torch()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weldingtool/process()
|
||||
switch(welding)
|
||||
if(0)
|
||||
force = 3
|
||||
damtype = "brute"
|
||||
update_icon()
|
||||
if(!can_off_process)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return
|
||||
//Welders left on now use up fuel, but lets not have them run out quite that fast
|
||||
if(1)
|
||||
force = 15
|
||||
damtype = "fire"
|
||||
++burned_fuel_for
|
||||
if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL)
|
||||
use(1)
|
||||
update_icon()
|
||||
|
||||
//This is to start fires. process() is only called if the welder is on.
|
||||
open_flame()
|
||||
|
||||
|
||||
/obj/item/weldingtool/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (FIRELOSS)
|
||||
|
||||
|
||||
/obj/item/weldingtool/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
flamethrower_screwdriver(I, user)
|
||||
else if(istype(I, /obj/item/stack/rods))
|
||||
flamethrower_rods(I, user)
|
||||
else
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/weldingtool/proc/explode()
|
||||
var/turf/T = get_turf(loc)
|
||||
var/plasmaAmount = reagents.get_reagent_amount("plasma")
|
||||
dyn_explosion(T, plasmaAmount/5)//20 plasma in a standard welder has a 4 power explosion. no breaches, but enough to kill/dismember holder
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weldingtool/attack(mob/living/carbon/human/H, mob/user)
|
||||
if(!istype(H))
|
||||
return ..()
|
||||
|
||||
var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected))
|
||||
|
||||
if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM)
|
||||
if(src.use_tool(H, user, 0, volume=50, amount=1))
|
||||
if(user == H)
|
||||
user.visible_message("<span class='notice'>[user] starts to fix some of the dents on [H]'s [affecting.name].</span>",
|
||||
"<span class='notice'>You start fixing some of the dents on [H]'s [affecting.name].</span>")
|
||||
if(!do_mob(user, H, 50))
|
||||
return
|
||||
item_heal_robotic(H, user, 15, 0)
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(!status && O.is_refillable())
|
||||
reagents.trans_to(O, reagents.total_volume)
|
||||
to_chat(user, "<span class='notice'>You empty [src]'s fuel tank into [O].</span>")
|
||||
update_icon()
|
||||
if(isOn())
|
||||
use(1)
|
||||
var/turf/location = get_turf(user)
|
||||
location.hotspot_expose(700, 50, 1)
|
||||
if(get_fuel() <= 0)
|
||||
set_light(0)
|
||||
|
||||
if(isliving(O))
|
||||
var/mob/living/L = O
|
||||
if(L.IgniteMob())
|
||||
message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire")
|
||||
log_game("[key_name(user)] set [key_name(L)] on fire")
|
||||
|
||||
|
||||
/obj/item/weldingtool/attack_self(mob/user)
|
||||
if(src.reagents.has_reagent("plasma"))
|
||||
message_admins("[key_name_admin(user)] activated a rigged welder.")
|
||||
explode()
|
||||
switched_on(user)
|
||||
if(welding)
|
||||
set_light(light_intensity)
|
||||
|
||||
update_icon()
|
||||
|
||||
|
||||
// Returns the amount of fuel in the welder
|
||||
/obj/item/weldingtool/proc/get_fuel()
|
||||
return reagents.get_reagent_amount("welding_fuel")
|
||||
|
||||
|
||||
// Uses fuel from the welding tool.
|
||||
/obj/item/weldingtool/use(used = 0)
|
||||
if(!isOn() || !check_fuel())
|
||||
return FALSE
|
||||
|
||||
if(used)
|
||||
burned_fuel_for = 0
|
||||
if(get_fuel() >= used)
|
||||
reagents.remove_reagent("welding_fuel", used)
|
||||
check_fuel()
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
|
||||
//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
|
||||
/obj/item/weldingtool/proc/check_fuel(mob/user)
|
||||
if(get_fuel() <= 0 && welding)
|
||||
switched_on(user)
|
||||
update_icon()
|
||||
//mob icon update
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.update_inv_hands(0)
|
||||
|
||||
return 0
|
||||
return 1
|
||||
|
||||
//Switches the welder on
|
||||
/obj/item/weldingtool/proc/switched_on(mob/user)
|
||||
if(!status)
|
||||
to_chat(user, "<span class='warning'>[src] can't be turned on while unsecured!</span>")
|
||||
return
|
||||
welding = !welding
|
||||
if(welding)
|
||||
if(get_fuel() >= 1)
|
||||
to_chat(user, "<span class='notice'>You switch [src] on.</span>")
|
||||
playsound(loc, acti_sound, 50, 1)
|
||||
force = 15
|
||||
damtype = "fire"
|
||||
hitsound = 'sound/items/welder.ogg'
|
||||
update_icon()
|
||||
START_PROCESSING(SSobj, src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need more fuel!</span>")
|
||||
switched_off(user)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You switch [src] off.</span>")
|
||||
playsound(loc, deac_sound, 50, 1)
|
||||
switched_off(user)
|
||||
|
||||
//Switches the welder off
|
||||
/obj/item/weldingtool/proc/switched_off(mob/user)
|
||||
welding = 0
|
||||
set_light(0)
|
||||
|
||||
force = 3
|
||||
damtype = "brute"
|
||||
hitsound = "swing_hit"
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/weldingtool/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].")
|
||||
|
||||
/obj/item/weldingtool/is_hot()
|
||||
return welding * heat
|
||||
|
||||
//Returns whether or not the welding tool is currently on.
|
||||
/obj/item/weldingtool/proc/isOn()
|
||||
return welding
|
||||
|
||||
// When welding is about to start, run a normal tool_use_check, then flash a mob if it succeeds.
|
||||
/obj/item/weldingtool/tool_start_check(mob/living/user, amount=0)
|
||||
. = tool_use_check(user, amount)
|
||||
if(. && user)
|
||||
user.flash_act(light_intensity)
|
||||
|
||||
// Flash the user during welding progress
|
||||
/obj/item/weldingtool/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks)
|
||||
. = ..()
|
||||
if(. && user)
|
||||
if (progress_flash_divisor == 0)
|
||||
user.flash_act(min(light_intensity,1))
|
||||
progress_flash_divisor = initial(progress_flash_divisor)
|
||||
else
|
||||
progress_flash_divisor--
|
||||
|
||||
// If welding tool ran out of fuel during a construction task, construction fails.
|
||||
/obj/item/weldingtool/tool_use_check(mob/living/user, amount)
|
||||
if(!isOn() || !check_fuel())
|
||||
to_chat(user, "<span class='warning'>[src] has to be on to complete this task!</span>")
|
||||
return FALSE
|
||||
|
||||
if(get_fuel() >= amount)
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need more welding fuel to complete this task!</span>")
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
|
||||
if(welding)
|
||||
to_chat(user, "<span class='warning'>Turn it off first!</span>")
|
||||
return
|
||||
status = !status
|
||||
if(status)
|
||||
to_chat(user, "<span class='notice'>You resecure [src] and close the fuel tank.</span>")
|
||||
container_type = NONE
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] can now be attached, modified, and refuelled.</span>")
|
||||
container_type = OPENCONTAINER
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user)
|
||||
if(!status)
|
||||
var/obj/item/stack/rods/R = I
|
||||
if (R.use(1))
|
||||
var/obj/item/flamethrower/F = new /obj/item/flamethrower(user.loc)
|
||||
if(!remove_item_from_storage(F))
|
||||
user.transferItemToLoc(src, F, TRUE)
|
||||
F.weldtool = src
|
||||
add_fingerprint(user)
|
||||
to_chat(user, "<span class='notice'>You add a rod to a welder, starting to build a flamethrower.</span>")
|
||||
user.put_in_hands(F)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need one rod to start building a flamethrower!</span>")
|
||||
|
||||
/obj/item/weldingtool/ignition_effect(atom/A, mob/user)
|
||||
if(use_tool(A, user, 0, amount=1))
|
||||
return "<span class='notice'>[user] casually lights [A] with [src], what a badass.</span>"
|
||||
else
|
||||
return ""
|
||||
|
||||
/obj/item/weldingtool/largetank
|
||||
name = "industrial welding tool"
|
||||
desc = "A slightly larger welder with a larger tank."
|
||||
icon_state = "indwelder"
|
||||
max_fuel = 40
|
||||
materials = list(MAT_GLASS=60)
|
||||
|
||||
/obj/item/weldingtool/largetank/cyborg
|
||||
name = "integrated welding tool"
|
||||
desc = "An advanced welder designed to be used in robotic systems."
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/weldingtool/largetank/flamethrower_screwdriver()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weldingtool/mini
|
||||
name = "emergency welding tool"
|
||||
desc = "A miniature welder used during emergencies."
|
||||
icon_state = "miniwelder"
|
||||
max_fuel = 10
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
materials = list(MAT_METAL=30, MAT_GLASS=10)
|
||||
change_icons = 0
|
||||
|
||||
/obj/item/weldingtool/mini/flamethrower_screwdriver()
|
||||
return
|
||||
|
||||
/obj/item/weldingtool/abductor
|
||||
name = "alien welding tool"
|
||||
desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "welder"
|
||||
toolspeed = 0.1
|
||||
light_intensity = 0
|
||||
change_icons = 0
|
||||
|
||||
/obj/item/weldingtool/abductor/process()
|
||||
if(get_fuel() <= max_fuel)
|
||||
reagents.add_reagent("welding_fuel", 1)
|
||||
..()
|
||||
|
||||
/obj/item/weldingtool/hugetank
|
||||
name = "upgraded industrial welding tool"
|
||||
desc = "An upgraded welder based of the industrial welder."
|
||||
icon_state = "upindwelder"
|
||||
item_state = "upindwelder"
|
||||
max_fuel = 80
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=120)
|
||||
|
||||
/obj/item/weldingtool/experimental
|
||||
name = "experimental welding tool"
|
||||
desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
|
||||
icon_state = "exwelder"
|
||||
item_state = "exwelder"
|
||||
max_fuel = 40
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=120)
|
||||
var/last_gen = 0
|
||||
change_icons = 0
|
||||
can_off_process = 1
|
||||
light_intensity = 1
|
||||
toolspeed = 0.5
|
||||
var/nextrefueltick = 0
|
||||
|
||||
/obj/item/weldingtool/experimental/brass
|
||||
name = "brass welding tool"
|
||||
desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
icon_state = "brasswelder"
|
||||
item_state = "brasswelder"
|
||||
|
||||
|
||||
/obj/item/weldingtool/experimental/process()
|
||||
..()
|
||||
if(get_fuel() < max_fuel && nextrefueltick < world.time)
|
||||
nextrefueltick = world.time + 10
|
||||
reagents.add_reagent("welding_fuel", 1)
|
||||
|
||||
#undef WELDER_FUEL_BURN_INTERVAL
|
||||
#define WELDER_FUEL_BURN_INTERVAL 13
|
||||
/obj/item/weldingtool
|
||||
name = "welding tool"
|
||||
desc = "A standard edition welder provided by Nanotrasen."
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "welder"
|
||||
item_state = "welder"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 3
|
||||
throwforce = 5
|
||||
hitsound = "swing_hit"
|
||||
usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg')
|
||||
var/acti_sound = 'sound/items/welderactivate.ogg'
|
||||
var/deac_sound = 'sound/items/welderdeactivate.ogg'
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=30)
|
||||
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
|
||||
var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
|
||||
var/max_fuel = 20 //The max amount of fuel the welder can hold
|
||||
var/change_icons = 1
|
||||
var/can_off_process = 0
|
||||
var/light_intensity = 2 //how powerful the emitted light is when used.
|
||||
var/progress_flash_divisor = 10
|
||||
var/burned_fuel_for = 0 //when fuel was last removed
|
||||
heat = 3800
|
||||
tool_behaviour = TOOL_WELDER
|
||||
toolspeed = 1
|
||||
|
||||
/obj/item/weldingtool/Initialize()
|
||||
. = ..()
|
||||
create_reagents(max_fuel)
|
||||
reagents.add_reagent("welding_fuel", max_fuel)
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/weldingtool/proc/update_torch()
|
||||
if(welding)
|
||||
add_overlay("[initial(icon_state)]-on")
|
||||
item_state = "[initial(item_state)]1"
|
||||
else
|
||||
item_state = "[initial(item_state)]"
|
||||
|
||||
|
||||
/obj/item/weldingtool/update_icon()
|
||||
cut_overlays()
|
||||
if(change_icons)
|
||||
var/ratio = get_fuel() / max_fuel
|
||||
ratio = CEILING(ratio*4, 1) * 25
|
||||
add_overlay("[initial(icon_state)][ratio]")
|
||||
update_torch()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weldingtool/process()
|
||||
switch(welding)
|
||||
if(0)
|
||||
force = 3
|
||||
damtype = "brute"
|
||||
update_icon()
|
||||
if(!can_off_process)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return
|
||||
//Welders left on now use up fuel, but lets not have them run out quite that fast
|
||||
if(1)
|
||||
force = 15
|
||||
damtype = "fire"
|
||||
++burned_fuel_for
|
||||
if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL)
|
||||
use(1)
|
||||
update_icon()
|
||||
|
||||
//This is to start fires. process() is only called if the welder is on.
|
||||
open_flame()
|
||||
|
||||
|
||||
/obj/item/weldingtool/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (FIRELOSS)
|
||||
|
||||
|
||||
/obj/item/weldingtool/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
flamethrower_screwdriver(I, user)
|
||||
else if(istype(I, /obj/item/stack/rods))
|
||||
flamethrower_rods(I, user)
|
||||
else
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/weldingtool/proc/explode()
|
||||
var/turf/T = get_turf(loc)
|
||||
var/plasmaAmount = reagents.get_reagent_amount("plasma")
|
||||
dyn_explosion(T, plasmaAmount/5)//20 plasma in a standard welder has a 4 power explosion. no breaches, but enough to kill/dismember holder
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weldingtool/attack(mob/living/carbon/human/H, mob/user)
|
||||
if(!istype(H))
|
||||
return ..()
|
||||
|
||||
var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected))
|
||||
|
||||
if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM)
|
||||
if(src.use_tool(H, user, 0, volume=50, amount=1))
|
||||
if(user == H)
|
||||
user.visible_message("<span class='notice'>[user] starts to fix some of the dents on [H]'s [affecting.name].</span>",
|
||||
"<span class='notice'>You start fixing some of the dents on [H]'s [affecting.name].</span>")
|
||||
if(!do_mob(user, H, 50))
|
||||
return
|
||||
item_heal_robotic(H, user, 15, 0)
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(!status && O.is_refillable())
|
||||
reagents.trans_to(O, reagents.total_volume)
|
||||
to_chat(user, "<span class='notice'>You empty [src]'s fuel tank into [O].</span>")
|
||||
update_icon()
|
||||
if(isOn())
|
||||
use(1)
|
||||
var/turf/location = get_turf(user)
|
||||
location.hotspot_expose(700, 50, 1)
|
||||
if(get_fuel() <= 0)
|
||||
set_light(0)
|
||||
|
||||
if(isliving(O))
|
||||
var/mob/living/L = O
|
||||
if(L.IgniteMob())
|
||||
message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire")
|
||||
log_game("[key_name(user)] set [key_name(L)] on fire")
|
||||
|
||||
|
||||
/obj/item/weldingtool/attack_self(mob/user)
|
||||
if(src.reagents.has_reagent("plasma"))
|
||||
message_admins("[key_name_admin(user)] activated a rigged welder.")
|
||||
explode()
|
||||
switched_on(user)
|
||||
if(welding)
|
||||
set_light(light_intensity)
|
||||
|
||||
update_icon()
|
||||
|
||||
|
||||
// Returns the amount of fuel in the welder
|
||||
/obj/item/weldingtool/proc/get_fuel()
|
||||
return reagents.get_reagent_amount("welding_fuel")
|
||||
|
||||
|
||||
// Uses fuel from the welding tool.
|
||||
/obj/item/weldingtool/use(used = 0)
|
||||
if(!isOn() || !check_fuel())
|
||||
return FALSE
|
||||
|
||||
if(used)
|
||||
burned_fuel_for = 0
|
||||
if(get_fuel() >= used)
|
||||
reagents.remove_reagent("welding_fuel", used)
|
||||
check_fuel()
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
|
||||
//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
|
||||
/obj/item/weldingtool/proc/check_fuel(mob/user)
|
||||
if(get_fuel() <= 0 && welding)
|
||||
switched_on(user)
|
||||
update_icon()
|
||||
//mob icon update
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.update_inv_hands(0)
|
||||
|
||||
return 0
|
||||
return 1
|
||||
|
||||
//Switches the welder on
|
||||
/obj/item/weldingtool/proc/switched_on(mob/user)
|
||||
if(!status)
|
||||
to_chat(user, "<span class='warning'>[src] can't be turned on while unsecured!</span>")
|
||||
return
|
||||
welding = !welding
|
||||
if(welding)
|
||||
if(get_fuel() >= 1)
|
||||
to_chat(user, "<span class='notice'>You switch [src] on.</span>")
|
||||
playsound(loc, acti_sound, 50, 1)
|
||||
force = 15
|
||||
damtype = "fire"
|
||||
hitsound = 'sound/items/welder.ogg'
|
||||
update_icon()
|
||||
START_PROCESSING(SSobj, src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need more fuel!</span>")
|
||||
switched_off(user)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You switch [src] off.</span>")
|
||||
playsound(loc, deac_sound, 50, 1)
|
||||
switched_off(user)
|
||||
|
||||
//Switches the welder off
|
||||
/obj/item/weldingtool/proc/switched_off(mob/user)
|
||||
welding = 0
|
||||
set_light(0)
|
||||
|
||||
force = 3
|
||||
damtype = "brute"
|
||||
hitsound = "swing_hit"
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/weldingtool/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].")
|
||||
|
||||
/obj/item/weldingtool/is_hot()
|
||||
return welding * heat
|
||||
|
||||
//Returns whether or not the welding tool is currently on.
|
||||
/obj/item/weldingtool/proc/isOn()
|
||||
return welding
|
||||
|
||||
// When welding is about to start, run a normal tool_use_check, then flash a mob if it succeeds.
|
||||
/obj/item/weldingtool/tool_start_check(mob/living/user, amount=0)
|
||||
. = tool_use_check(user, amount)
|
||||
if(. && user)
|
||||
user.flash_act(light_intensity)
|
||||
|
||||
// Flash the user during welding progress
|
||||
/obj/item/weldingtool/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks)
|
||||
. = ..()
|
||||
if(. && user)
|
||||
if (progress_flash_divisor == 0)
|
||||
user.flash_act(min(light_intensity,1))
|
||||
progress_flash_divisor = initial(progress_flash_divisor)
|
||||
else
|
||||
progress_flash_divisor--
|
||||
|
||||
// If welding tool ran out of fuel during a construction task, construction fails.
|
||||
/obj/item/weldingtool/tool_use_check(mob/living/user, amount)
|
||||
if(!isOn() || !check_fuel())
|
||||
to_chat(user, "<span class='warning'>[src] has to be on to complete this task!</span>")
|
||||
return FALSE
|
||||
|
||||
if(get_fuel() >= amount)
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need more welding fuel to complete this task!</span>")
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
|
||||
if(welding)
|
||||
to_chat(user, "<span class='warning'>Turn it off first!</span>")
|
||||
return
|
||||
status = !status
|
||||
if(status)
|
||||
to_chat(user, "<span class='notice'>You resecure [src] and close the fuel tank.</span>")
|
||||
container_type = NONE
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] can now be attached, modified, and refuelled.</span>")
|
||||
container_type = OPENCONTAINER
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user)
|
||||
if(!status)
|
||||
var/obj/item/stack/rods/R = I
|
||||
if (R.use(1))
|
||||
var/obj/item/flamethrower/F = new /obj/item/flamethrower(user.loc)
|
||||
if(!remove_item_from_storage(F))
|
||||
user.transferItemToLoc(src, F, TRUE)
|
||||
F.weldtool = src
|
||||
add_fingerprint(user)
|
||||
to_chat(user, "<span class='notice'>You add a rod to a welder, starting to build a flamethrower.</span>")
|
||||
user.put_in_hands(F)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need one rod to start building a flamethrower!</span>")
|
||||
|
||||
/obj/item/weldingtool/ignition_effect(atom/A, mob/user)
|
||||
if(use_tool(A, user, 0, amount=1))
|
||||
return "<span class='notice'>[user] casually lights [A] with [src], what a badass.</span>"
|
||||
else
|
||||
return ""
|
||||
|
||||
/obj/item/weldingtool/largetank
|
||||
name = "industrial welding tool"
|
||||
desc = "A slightly larger welder with a larger tank."
|
||||
icon_state = "indwelder"
|
||||
max_fuel = 40
|
||||
materials = list(MAT_GLASS=60)
|
||||
|
||||
/obj/item/weldingtool/largetank/cyborg
|
||||
name = "integrated welding tool"
|
||||
desc = "An advanced welder designed to be used in robotic systems."
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/weldingtool/largetank/flamethrower_screwdriver()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weldingtool/mini
|
||||
name = "emergency welding tool"
|
||||
desc = "A miniature welder used during emergencies."
|
||||
icon_state = "miniwelder"
|
||||
max_fuel = 10
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
materials = list(MAT_METAL=30, MAT_GLASS=10)
|
||||
change_icons = 0
|
||||
|
||||
/obj/item/weldingtool/mini/flamethrower_screwdriver()
|
||||
return
|
||||
|
||||
/obj/item/weldingtool/abductor
|
||||
name = "alien welding tool"
|
||||
desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "welder"
|
||||
toolspeed = 0.1
|
||||
light_intensity = 0
|
||||
change_icons = 0
|
||||
|
||||
/obj/item/weldingtool/abductor/process()
|
||||
if(get_fuel() <= max_fuel)
|
||||
reagents.add_reagent("welding_fuel", 1)
|
||||
..()
|
||||
|
||||
/obj/item/weldingtool/hugetank
|
||||
name = "upgraded industrial welding tool"
|
||||
desc = "An upgraded welder based of the industrial welder."
|
||||
icon_state = "upindwelder"
|
||||
item_state = "upindwelder"
|
||||
max_fuel = 80
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=120)
|
||||
|
||||
/obj/item/weldingtool/experimental
|
||||
name = "experimental welding tool"
|
||||
desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
|
||||
icon_state = "exwelder"
|
||||
item_state = "exwelder"
|
||||
max_fuel = 40
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=120)
|
||||
var/last_gen = 0
|
||||
change_icons = 0
|
||||
can_off_process = 1
|
||||
light_intensity = 1
|
||||
toolspeed = 0.5
|
||||
var/nextrefueltick = 0
|
||||
|
||||
/obj/item/weldingtool/experimental/brass
|
||||
name = "brass welding tool"
|
||||
desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
icon_state = "brasswelder"
|
||||
item_state = "brasswelder"
|
||||
|
||||
|
||||
/obj/item/weldingtool/experimental/process()
|
||||
..()
|
||||
if(get_fuel() < max_fuel && nextrefueltick < world.time)
|
||||
nextrefueltick = world.time + 10
|
||||
reagents.add_reagent("welding_fuel", 1)
|
||||
|
||||
#undef WELDER_FUEL_BURN_INTERVAL
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 6
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 5
|
||||
throwforce = 7
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
materials = list(MAT_METAL=10, MAT_GLASS=10)
|
||||
attack_verb = list("struck", "pistol whipped", "hit", "bashed")
|
||||
@@ -258,7 +258,7 @@
|
||||
newSaber.item_color = "rainbow"
|
||||
qdel(W)
|
||||
qdel(src)
|
||||
else if(istype(W, /obj/item/device/multitool))
|
||||
else if(istype(W, /obj/item/multitool))
|
||||
if(!hacked)
|
||||
hacked = TRUE
|
||||
item_color = "rainbow"
|
||||
@@ -341,7 +341,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT | SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
|
||||
force = 5
|
||||
throwforce = 5
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
@@ -840,7 +840,7 @@
|
||||
name = "card"
|
||||
desc = "a card"
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "singlecard_nanotrasen_down"
|
||||
icon_state = "singlecard_down_nanotrasen"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/cardname = null
|
||||
var/flipped = 0
|
||||
@@ -1064,7 +1064,7 @@
|
||||
desc = "A stylish steampunk watch made out of thousands of tiny cogwheels."
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "dread_ipad"
|
||||
slot_flags = SLOT_BELT
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/cooldown = 0
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
else //something wrong
|
||||
name = "[initial(name)]"
|
||||
update_icon()
|
||||
if(user.get_item_by_slot(slot_back) == src)
|
||||
if(user.get_item_by_slot(SLOT_BACK) == src)
|
||||
user.update_inv_back()
|
||||
else
|
||||
user.update_inv_hands()
|
||||
@@ -191,7 +191,7 @@
|
||||
return
|
||||
qdel(O)
|
||||
return
|
||||
if(slot == slot_hands)
|
||||
if(slot == SLOT_HANDS)
|
||||
wield(user)
|
||||
else
|
||||
unwield(user)
|
||||
@@ -224,7 +224,7 @@
|
||||
force = 5
|
||||
throwforce = 15
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
force_unwielded = 5
|
||||
force_wielded = 24
|
||||
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
|
||||
@@ -236,7 +236,7 @@
|
||||
|
||||
/obj/item/twohanded/fireaxe/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/butchering, 100, 80, hitsound) //axes are not known for being precision butchering tools
|
||||
AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools
|
||||
|
||||
/obj/item/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "fireaxe[wielded]"
|
||||
@@ -438,7 +438,7 @@
|
||||
possible_colors = list("purple")
|
||||
|
||||
/obj/item/twohanded/dualsaber/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/device/multitool))
|
||||
if(istype(W, /obj/item/multitool))
|
||||
if(!hacked)
|
||||
hacked = TRUE
|
||||
to_chat(user, "<span class='warning'>2XRNBW_ENGAGE</span>")
|
||||
@@ -458,7 +458,7 @@
|
||||
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
|
||||
force = 10
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
force_unwielded = 10
|
||||
force_wielded = 18
|
||||
throwforce = 20
|
||||
@@ -744,7 +744,7 @@
|
||||
sharpness = IS_SHARP
|
||||
attack_verb = list("cut", "sliced", "diced")
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/twohanded/vibro_weapon/Initialize()
|
||||
@@ -791,7 +791,7 @@
|
||||
desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology."
|
||||
force = 11
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
force_unwielded = 11
|
||||
force_wielded = 20 //I have no idea how to balance
|
||||
throwforce = 22
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user