mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 00:29:02 +01:00
Merge branch 'master' into spellcheck
This commit is contained in:
@@ -11,8 +11,8 @@
|
||||
|
||||
var/static/list/AllTeleporters
|
||||
|
||||
/obj/effect/bump_teleporter/New()
|
||||
..()
|
||||
/obj/effect/bump_teleporter/Initialize()
|
||||
. = ..()
|
||||
LAZYADD(AllTeleporters, src)
|
||||
|
||||
/obj/effect/bump_teleporter/Destroy()
|
||||
|
||||
@@ -14,9 +14,9 @@
|
||||
var/displayed_text
|
||||
var/atom/attached_to
|
||||
|
||||
/obj/effect/countdown/New(atom/A)
|
||||
/obj/effect/countdown/Initialize()
|
||||
. = ..()
|
||||
attach(A)
|
||||
attach(loc)
|
||||
|
||||
/obj/effect/countdown/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -12,13 +12,13 @@ would spawn and follow the beaker, even if it is carried or thrown.
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/particle_effect/New()
|
||||
..()
|
||||
/obj/effect/particle_effect/Initialize()
|
||||
. = ..()
|
||||
GLOB.cameranet.updateVisibility(src)
|
||||
|
||||
/obj/effect/particle_effect/Destroy()
|
||||
GLOB.cameranet.updateVisibility(src)
|
||||
. = ..()
|
||||
return ..()
|
||||
|
||||
/datum/effect_system
|
||||
var/number = 3
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
opacity = 1
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/particle_effect/expl_particles/New()
|
||||
..()
|
||||
/obj/effect/particle_effect/expl_particles/Initialize()
|
||||
. = ..()
|
||||
QDEL_IN(src, 15)
|
||||
|
||||
/datum/effect_system/expl_particles
|
||||
@@ -29,8 +29,8 @@
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/explosion/New()
|
||||
..()
|
||||
/obj/effect/explosion/Initialize()
|
||||
. = ..()
|
||||
QDEL_IN(src, 10)
|
||||
|
||||
/datum/effect_system/explosion
|
||||
|
||||
@@ -270,8 +270,8 @@
|
||||
max_integrity = 20
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
|
||||
/obj/structure/foamedmetal/New()
|
||||
..()
|
||||
/obj/structure/foamedmetal/Initialize()
|
||||
. = ..()
|
||||
air_update_turf(1)
|
||||
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
set_opacity(0) //if we were blocking view, we aren't now because we're fading out
|
||||
stoplag()
|
||||
|
||||
/obj/effect/particle_effect/smoke/New()
|
||||
..()
|
||||
/obj/effect/particle_effect/smoke/Initialize()
|
||||
. = ..()
|
||||
create_reagents(500)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
anchored = TRUE
|
||||
light_range = 1
|
||||
|
||||
/obj/effect/particle_effect/sparks/New()
|
||||
..()
|
||||
/obj/effect/particle_effect/sparks/Initialize()
|
||||
. = ..()
|
||||
flick("sparks", src) // replay the animation
|
||||
playsound(src.loc, "sparks", 100, 1)
|
||||
var/turf/T = loc
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
|
||||
/obj/effect/particle_effect/water/New()
|
||||
..()
|
||||
/obj/effect/particle_effect/water/Initialize()
|
||||
. = ..()
|
||||
QDEL_IN(src, 70)
|
||||
|
||||
/obj/effect/particle_effect/water/Move(turf/newloc)
|
||||
@@ -45,8 +45,8 @@ steam.start() -- spawns the effect
|
||||
icon_state = "extinguish"
|
||||
density = FALSE
|
||||
|
||||
/obj/effect/particle_effect/steam/New()
|
||||
..()
|
||||
/obj/effect/particle_effect/steam/Initialize()
|
||||
. = ..()
|
||||
QDEL_IN(src, 20)
|
||||
|
||||
/datum/effect_system/steam_spread
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
var/timeleft = 300 //Set to 0 for permanent forcefields (ugh)
|
||||
|
||||
/obj/effect/forcefield/New()
|
||||
..()
|
||||
/obj/effect/forcefield/Initialize()
|
||||
. = ..()
|
||||
if(timeleft)
|
||||
QDEL_IN(src, timeleft)
|
||||
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
/obj/effect/manifest
|
||||
name = "manifest"
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
icon_state = "x"
|
||||
|
||||
/obj/effect/manifest/New()
|
||||
src.invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
/obj/effect/manifest/proc/manifest()
|
||||
var/dat = "<B>Crew Manifest</B>:<BR>"
|
||||
for(var/mob/living/carbon/human/M in GLOB.carbon_list)
|
||||
dat += text(" <B>[]</B> - []<BR>", M.name, M.get_assignment())
|
||||
var/obj/item/paper/P = new /obj/item/paper( src.loc )
|
||||
P.info = dat
|
||||
P.name = "paper- 'Crew Manifest'"
|
||||
//SN src = null
|
||||
qdel(src)
|
||||
@@ -98,8 +98,8 @@
|
||||
density = FALSE
|
||||
var/duration = 0
|
||||
|
||||
/obj/effect/mine/pickup/New()
|
||||
..()
|
||||
/obj/effect/mine/pickup/Initialize()
|
||||
. = ..()
|
||||
animate(src, pixel_y = 4, time = 20, loop = -1)
|
||||
|
||||
/obj/effect/mine/pickup/triggermine(mob/victim)
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
icon_state="b_beam"
|
||||
var/atom/BeamSource
|
||||
|
||||
/obj/effect/overlay/beam/New()
|
||||
..()
|
||||
/obj/effect/overlay/beam/Initialize()
|
||||
. = ..()
|
||||
QDEL_IN(src, 10)
|
||||
|
||||
/obj/effect/overlay/palmtree_r
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
|
||||
var/obj/item/toner/ink = null
|
||||
|
||||
/obj/item/airlock_painter/New()
|
||||
..()
|
||||
/obj/item/airlock_painter/Initialize()
|
||||
. = ..()
|
||||
ink = new /obj/item/toner(src)
|
||||
|
||||
//This proc doesn't just check if the painter can be used, but also uses it.
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
var/start_lit = FALSE
|
||||
heat = 1000
|
||||
|
||||
/obj/item/candle/New()
|
||||
..()
|
||||
/obj/item/candle/Initialize()
|
||||
. = ..()
|
||||
if(start_lit)
|
||||
// No visible message
|
||||
light(show_message = FALSE)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
|
||||
/*
|
||||
* DATA CARDS - Used for the teleporter
|
||||
* DATA CARDS - Used for the IC data card reader
|
||||
*/
|
||||
/obj/item/card
|
||||
name = "card"
|
||||
@@ -24,30 +24,49 @@
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/card/data
|
||||
name = "data disk"
|
||||
desc = "A disk of data."
|
||||
icon_state = "data"
|
||||
name = "data card"
|
||||
desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has a stripe running down the middle."
|
||||
icon_state = "data_1"
|
||||
obj_flags = UNIQUE_RENAME
|
||||
var/function = "storage"
|
||||
var/data = "null"
|
||||
var/special = null
|
||||
item_state = "card-id"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
|
||||
var/detail_color = COLOR_ASSEMBLY_ORANGE
|
||||
|
||||
/obj/item/card/data/verb/label(t as text)
|
||||
set name = "Label Disk"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
/obj/item/card/data/Initialize()
|
||||
.=..()
|
||||
update_icon()
|
||||
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
/obj/item/card/data/update_icon()
|
||||
cut_overlays()
|
||||
if(detail_color == COLOR_FLOORTILE_GRAY)
|
||||
return
|
||||
var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/card.dmi', "[icon_state]-color")
|
||||
detail_overlay.color = detail_color
|
||||
add_overlay(detail_overlay)
|
||||
|
||||
if (t)
|
||||
src.name = "data disk- '[t]'"
|
||||
else
|
||||
src.name = "data disk"
|
||||
src.add_fingerprint(usr)
|
||||
return
|
||||
/obj/item/card/data/attackby(obj/item/I, mob/living/user)
|
||||
if(istype(I, /obj/item/integrated_electronics/detailer))
|
||||
var/obj/item/integrated_electronics/detailer/D = I
|
||||
detail_color = D.detail_color
|
||||
update_icon()
|
||||
return ..()
|
||||
|
||||
/obj/item/proc/GetCard()
|
||||
|
||||
/obj/item/card/data/GetCard()
|
||||
return src
|
||||
|
||||
/obj/item/card/data/full_color
|
||||
desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has the entire card colored."
|
||||
icon_state = "data_2"
|
||||
|
||||
/obj/item/card/data/disk
|
||||
desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one inexplicibly looks like a floppy disk."
|
||||
icon_state = "data_3"
|
||||
|
||||
/*
|
||||
* ID CARDS
|
||||
|
||||
@@ -215,37 +215,36 @@
|
||||
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)
|
||||
req_components = list(/obj/item/vending_refill/boozeomat = 1)
|
||||
|
||||
var/static/list/vending_names_paths = list(/obj/machinery/vending/boozeomat = "Booze-O-Mat",
|
||||
/obj/machinery/vending/coffee = "Solar's Best Hot Drinks",
|
||||
/obj/machinery/vending/snack = "Getmore Chocolate Corp",
|
||||
/obj/machinery/vending/cola = "Robust Softdrinks",
|
||||
/obj/machinery/vending/cigarette = "ShadyCigs Deluxe",
|
||||
/obj/machinery/vending/games = "\improper Good Clean Fun",
|
||||
/obj/machinery/vending/autodrobe = "AutoDrobe",
|
||||
/obj/machinery/vending/wardrobe/sec_wardrobe = "SecDrobe",
|
||||
/obj/machinery/vending/wardrobe/medi_wardrobe = "MediDrobe",
|
||||
/obj/machinery/vending/wardrobe/engi_wardrobe = "EngiDrobe",
|
||||
/obj/machinery/vending/wardrobe/atmos_wardrobe = "AtmosDrobe",
|
||||
/obj/machinery/vending/wardrobe/cargo_wardrobe = "CargoDrobe",
|
||||
/obj/machinery/vending/wardrobe/robo_wardrobe = "RoboDrobe",
|
||||
/obj/machinery/vending/wardrobe/science_wardrobe = "SciDrobe",
|
||||
/obj/machinery/vending/wardrobe/hydro_wardrobe = "HyDrobe",
|
||||
/obj/machinery/vending/wardrobe/curator_wardrobe = "CuraDrobe",
|
||||
/obj/machinery/vending/wardrobe/bar_wardrobe = "BarDrobe",
|
||||
/obj/machinery/vending/wardrobe/chef_wardrobe = "ChefDrobe",
|
||||
/obj/machinery/vending/wardrobe/jani_wardrobe = "JaniDrobe",
|
||||
/obj/machinery/vending/wardrobe/law_wardrobe = "LawDrobe",
|
||||
/obj/machinery/vending/wardrobe/chap_wardrobe = "ChapDrobe",
|
||||
/obj/machinery/vending/wardrobe/chem_wardrobe = "ChemDrobe",
|
||||
/obj/machinery/vending/wardrobe/gene_wardrobe = "GeneDrobe",
|
||||
/obj/machinery/vending/wardrobe/viro_wardrobe = "ViroDrobe",
|
||||
/obj/machinery/vending/clothing = "ClothesMate",
|
||||
/obj/machinery/vending/medical = "NanoMed Plus",
|
||||
/obj/machinery/vending/wallmed = "NanoMed")
|
||||
needs_anchored = FALSE
|
||||
var/static/list/vending_names_paths = list(
|
||||
/obj/machinery/vending/boozeomat = "Booze-O-Mat",
|
||||
/obj/machinery/vending/coffee = "Solar's Best Hot Drinks",
|
||||
/obj/machinery/vending/snack = "Getmore Chocolate Corp",
|
||||
/obj/machinery/vending/cola = "Robust Softdrinks",
|
||||
/obj/machinery/vending/cigarette = "ShadyCigs Deluxe",
|
||||
/obj/machinery/vending/games = "\improper Good Clean Fun",
|
||||
/obj/machinery/vending/autodrobe = "AutoDrobe",
|
||||
/obj/machinery/vending/wardrobe/sec_wardrobe = "SecDrobe",
|
||||
/obj/machinery/vending/wardrobe/medi_wardrobe = "MediDrobe",
|
||||
/obj/machinery/vending/wardrobe/engi_wardrobe = "EngiDrobe",
|
||||
/obj/machinery/vending/wardrobe/atmos_wardrobe = "AtmosDrobe",
|
||||
/obj/machinery/vending/wardrobe/cargo_wardrobe = "CargoDrobe",
|
||||
/obj/machinery/vending/wardrobe/robo_wardrobe = "RoboDrobe",
|
||||
/obj/machinery/vending/wardrobe/science_wardrobe = "SciDrobe",
|
||||
/obj/machinery/vending/wardrobe/hydro_wardrobe = "HyDrobe",
|
||||
/obj/machinery/vending/wardrobe/curator_wardrobe = "CuraDrobe",
|
||||
/obj/machinery/vending/wardrobe/bar_wardrobe = "BarDrobe",
|
||||
/obj/machinery/vending/wardrobe/chef_wardrobe = "ChefDrobe",
|
||||
/obj/machinery/vending/wardrobe/jani_wardrobe = "JaniDrobe",
|
||||
/obj/machinery/vending/wardrobe/law_wardrobe = "LawDrobe",
|
||||
/obj/machinery/vending/wardrobe/chap_wardrobe = "ChapDrobe",
|
||||
/obj/machinery/vending/wardrobe/chem_wardrobe = "ChemDrobe",
|
||||
/obj/machinery/vending/wardrobe/gene_wardrobe = "GeneDrobe",
|
||||
/obj/machinery/vending/wardrobe/viro_wardrobe = "ViroDrobe",
|
||||
/obj/machinery/vending/clothing = "ClothesMate",
|
||||
/obj/machinery/vending/medical = "NanoMed Plus",
|
||||
/obj/machinery/vending/wallmed = "NanoMed")
|
||||
|
||||
/obj/item/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
@@ -261,7 +260,7 @@
|
||||
/obj/item/circuitboard/machine/vendor/proc/set_type(obj/machinery/vending/typepath)
|
||||
build_path = typepath
|
||||
name = "[vending_names_paths[build_path]] Vendor (Machine Board)"
|
||||
req_components = list(initial(typepath.refill_canister) = initial(typepath.refill_count))
|
||||
req_components = list(initial(typepath.refill_canister) = 1)
|
||||
|
||||
/obj/item/circuitboard/machine/vendor/apply_default_parts(obj/machinery/M)
|
||||
for(var/typepath in vending_names_paths)
|
||||
@@ -865,14 +864,14 @@
|
||||
build_path = /obj/machinery/vending/donksofttoyvendor
|
||||
req_components = list(
|
||||
/obj/item/stack/sheet/glass = 1,
|
||||
/obj/item/vending_refill/donksoft = 3)
|
||||
/obj/item/vending_refill/donksoft = 1)
|
||||
|
||||
/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/vending_refill/donksoft = 1)
|
||||
|
||||
/obj/item/circuitboard/machine/dish_drive
|
||||
name = "Dish Drive (Machine Board)"
|
||||
|
||||
@@ -92,8 +92,12 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
..()
|
||||
if(!id && !inserted_item)
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Alt-click to remove contents.</span>")
|
||||
|
||||
if(id)
|
||||
to_chat(user, "<span class='notice'>Alt-click to remove the id.</span>")
|
||||
|
||||
if(inserted_item && (!isturf(loc)))
|
||||
to_chat(user, "<span class='notice'>Ctrl-click to remove [inserted_item].</span>")
|
||||
|
||||
/obj/item/pda/Initialize()
|
||||
. = ..()
|
||||
@@ -712,6 +716,15 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
else
|
||||
remove_pen()
|
||||
|
||||
/obj/item/pda/CtrlClick()
|
||||
..()
|
||||
|
||||
if(issilicon(usr))
|
||||
return
|
||||
|
||||
if(usr.canUseTopic(src) && !isturf(loc))
|
||||
remove_pen()
|
||||
|
||||
/obj/item/pda/verb/verb_remove_id()
|
||||
set category = "Object"
|
||||
set name = "Eject ID"
|
||||
|
||||
@@ -129,18 +129,18 @@
|
||||
detect_state = PROXIMITY_ON_SCREEN
|
||||
break
|
||||
|
||||
if(!detect_state && GLOB.cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z))
|
||||
var/datum/camerachunk/chunk = GLOB.cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z)
|
||||
if(chunk)
|
||||
if(chunk.seenby.len)
|
||||
for(var/mob/camera/aiEye/A in chunk.seenby)
|
||||
var/turf/detect_turf = get_turf(A)
|
||||
if(get_dist(our_turf, detect_turf) < rangealert)
|
||||
detect_state = PROXIMITY_ON_SCREEN
|
||||
break
|
||||
if(get_dist(our_turf, detect_turf) < rangewarning)
|
||||
detect_state = PROXIMITY_NEAR
|
||||
break
|
||||
if(detect_state)
|
||||
return
|
||||
var/datum/camerachunk/chunk = GLOB.cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z)
|
||||
if(chunk && chunk.seenby.len)
|
||||
for(var/mob/camera/aiEye/A in chunk.seenby)
|
||||
var/turf/detect_turf = get_turf(A)
|
||||
if(get_dist(our_turf, detect_turf) < rangealert)
|
||||
detect_state = PROXIMITY_ON_SCREEN
|
||||
break
|
||||
if(get_dist(our_turf, detect_turf) < rangewarning)
|
||||
detect_state = PROXIMITY_NEAR
|
||||
break
|
||||
|
||||
/obj/item/multitool/cyborg
|
||||
name = "multitool"
|
||||
|
||||
@@ -160,11 +160,22 @@
|
||||
if(sensor.on && sensor.visible)
|
||||
add_overlay("proxy_beam")
|
||||
|
||||
/obj/item/transfer_valve/proc/merge_gases()
|
||||
tank_two.air_contents.volume += tank_one.air_contents.volume
|
||||
/obj/item/transfer_valve/proc/merge_gases(datum/gas_mixture/target, change_volume = TRUE)
|
||||
var/target_self = FALSE
|
||||
if(!target || (target == tank_one.air_contents))
|
||||
target = tank_two.air_contents
|
||||
if(target == tank_two.air_contents)
|
||||
target_self = TRUE
|
||||
if(change_volume)
|
||||
if(!target_self)
|
||||
target.volume += tank_two.volume
|
||||
target.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)
|
||||
target.merge(temp)
|
||||
if(!target_self)
|
||||
temp = tank_two.air_contents.remove_ratio(1)
|
||||
target.merge(temp)
|
||||
|
||||
/obj/item/transfer_valve/proc/split_gases()
|
||||
if (!valve_open || !tank_one || !tank_two)
|
||||
|
||||
@@ -165,15 +165,17 @@
|
||||
|
||||
/obj/item/grenade/chem_grenade/log_grenade(mob/user, turf/T)
|
||||
..()
|
||||
var/reagent_string = ""
|
||||
var/beaker_number = 1
|
||||
for(var/obj/exploded_beaker in beakers)
|
||||
if(!exploded_beaker.reagents)
|
||||
continue
|
||||
var/reagent_list = pretty_string_from_reagent_list(exploded_beaker.reagents)
|
||||
var/message = "[src] primed by [user] at [ADMIN_VERBOSEJMP(T)] contained [reagent_list]."
|
||||
GLOB.bombers += message
|
||||
message_admins(message)
|
||||
log_game("[src] primed by [user] at [AREACOORD(T)] contained [reagent_list].")
|
||||
add_logs(user, src, "primed", addition = "[reagent_list] inside.")
|
||||
reagent_string += "[exploded_beaker] [beaker_number++] : " + pretty_string_from_reagent_list(exploded_beaker.reagents.reagent_list) + ";"
|
||||
var/message = "[src] primed by [user] at [ADMIN_VERBOSEJMP(T)] contained [reagent_string]."
|
||||
GLOB.bombers += message
|
||||
message_admins(message)
|
||||
log_game("[src] primed by [user] at [AREACOORD(T)] contained [reagent_string].")
|
||||
add_logs(user, src, "primed", addition = "[reagent_string] inside.")
|
||||
|
||||
/obj/item/grenade/chem_grenade/prime()
|
||||
if(stage != READY)
|
||||
|
||||
@@ -88,6 +88,51 @@
|
||||
if(istype(B))
|
||||
playsound(B, 'sound/items/sheath.ogg', 25, 1)
|
||||
|
||||
/obj/item/melee/sabre/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] is trying to cut off all [user.p_their()] limbs with [src]! it looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
var/i = 0
|
||||
var/originally_nodropped = item_flags & NODROP
|
||||
item_flags |= NODROP
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/Cuser = user
|
||||
var/obj/item/bodypart/holding_bodypart = Cuser.get_holding_bodypart_of_item(src)
|
||||
var/list/limbs_to_dismember
|
||||
var/list/arms = list()
|
||||
var/list/legs = list()
|
||||
var/obj/item/bodypart/bodypart
|
||||
|
||||
for(bodypart in Cuser.bodyparts)
|
||||
if(bodypart == holding_bodypart)
|
||||
continue
|
||||
if(bodypart.body_part & ARMS)
|
||||
arms += bodypart
|
||||
else if (bodypart.body_part & LEGS)
|
||||
legs += bodypart
|
||||
|
||||
limbs_to_dismember = arms + legs
|
||||
if(holding_bodypart)
|
||||
limbs_to_dismember += holding_bodypart
|
||||
|
||||
var/speedbase = abs((4 SECONDS) / limbs_to_dismember.len)
|
||||
for(bodypart in limbs_to_dismember)
|
||||
i++
|
||||
addtimer(CALLBACK(src, .proc/suicide_dismember, user, bodypart), speedbase * i)
|
||||
addtimer(CALLBACK(src, .proc/manual_suicide, user, originally_nodropped), (5 SECONDS) * i)
|
||||
return MANUAL_SUICIDE
|
||||
|
||||
/obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting)
|
||||
if(!QDELETED(affecting) && affecting.dismemberable && affecting.owner == user && !QDELETED(user))
|
||||
playsound(user, hitsound, 25, 1)
|
||||
affecting.dismember(BRUTE)
|
||||
user.adjustBruteLoss(20)
|
||||
|
||||
/obj/item/melee/sabre/proc/manual_suicide(mob/living/user, originally_nodropped)
|
||||
if(!QDELETED(user))
|
||||
user.adjustBruteLoss(200)
|
||||
user.death(FALSE)
|
||||
if(!originally_nodropped)
|
||||
item_flags &= ~NODROP
|
||||
|
||||
/obj/item/melee/classic_baton
|
||||
name = "police baton"
|
||||
desc = "A wooden truncheon for beating criminal scum."
|
||||
|
||||
@@ -510,3 +510,13 @@
|
||||
attack_verb = list("blorbled", "slimed", "absorbed")
|
||||
squeak_override = list('sound/effects/blobattack.ogg' = 1)
|
||||
gender = FEMALE //given all the jokes and drawings, I'm not sure the xenobiologists would make a slimeboy
|
||||
|
||||
/obj/item/toy/plush/awakenedplushie
|
||||
name = "awakened plushie"
|
||||
desc = "An ancient plushie that has grown enlightened to the true nature of reality."
|
||||
icon_state = "plushie_awake"
|
||||
item_state = "plushie_awake"
|
||||
|
||||
/obj/item/toy/plush/awakenedplushie/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/edit_complainer)
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed")
|
||||
novariants = TRUE
|
||||
grind_results = list("bluespace" = 20)
|
||||
point_value = 30
|
||||
var/crystal_type = /obj/item/stack/ore/bluespace_crystal/refined
|
||||
|
||||
/obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening
|
||||
|
||||
@@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
|
||||
resistance_flags = ACID_PROOF
|
||||
merge_type = /obj/item/stack/sheet/glass
|
||||
grind_results = list("silicon" = 20)
|
||||
point_value = 1
|
||||
|
||||
/obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins to slice [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
@@ -138,6 +139,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
|
||||
resistance_flags = ACID_PROOF
|
||||
merge_type = /obj/item/stack/sheet/rglass
|
||||
grind_results = list("silicon" = 20, "iron" = 10)
|
||||
point_value = 4
|
||||
|
||||
/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params)
|
||||
add_fingerprint(user)
|
||||
@@ -180,6 +182,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
|
||||
resistance_flags = ACID_PROOF
|
||||
merge_type = /obj/item/stack/sheet/plasmarglass
|
||||
grind_results = list("silicon" = 20, "plasma" = 10, "iron" = 10)
|
||||
point_value = 23
|
||||
|
||||
/obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE)
|
||||
recipes = GLOB.prglass_recipes
|
||||
|
||||
@@ -104,6 +104,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
|
||||
materials = list(MAT_DIAMOND=MINERAL_MATERIAL_AMOUNT)
|
||||
novariants = TRUE
|
||||
grind_results = list("carbon" = 20)
|
||||
point_value = 25
|
||||
|
||||
GLOBAL_LIST_INIT(diamond_recipes, list ( \
|
||||
new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \
|
||||
@@ -129,6 +130,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \
|
||||
materials = list(MAT_URANIUM=MINERAL_MATERIAL_AMOUNT)
|
||||
novariants = TRUE
|
||||
grind_results = list("uranium" = 20)
|
||||
point_value = 20
|
||||
|
||||
GLOBAL_LIST_INIT(uranium_recipes, list ( \
|
||||
new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \
|
||||
@@ -154,6 +156,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \
|
||||
max_integrity = 100
|
||||
materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT)
|
||||
grind_results = list("plasma" = 20)
|
||||
point_value = 20
|
||||
|
||||
/obj/item/stack/sheet/mineral/plasma/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins licking \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
@@ -193,6 +196,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \
|
||||
sheettype = "gold"
|
||||
materials = list(MAT_GOLD=MINERAL_MATERIAL_AMOUNT)
|
||||
grind_results = list("gold" = 20)
|
||||
point_value = 20
|
||||
|
||||
GLOBAL_LIST_INIT(gold_recipes, list ( \
|
||||
new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \
|
||||
@@ -220,6 +224,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \
|
||||
sheettype = "silver"
|
||||
materials = list(MAT_SILVER=MINERAL_MATERIAL_AMOUNT)
|
||||
grind_results = list("silver" = 20)
|
||||
point_value = 20
|
||||
|
||||
GLOBAL_LIST_INIT(silver_recipes, list ( \
|
||||
new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \
|
||||
@@ -247,6 +252,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \
|
||||
materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT)
|
||||
novariants = TRUE
|
||||
grind_results = list("banana" = 20)
|
||||
point_value = 50
|
||||
|
||||
GLOBAL_LIST_INIT(bananium_recipes, list ( \
|
||||
new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \
|
||||
@@ -272,6 +278,7 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \
|
||||
throw_range = 3
|
||||
sheettype = "titanium"
|
||||
materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT)
|
||||
point_value = 20
|
||||
|
||||
GLOBAL_LIST_INIT(titanium_recipes, list ( \
|
||||
new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), \
|
||||
@@ -300,6 +307,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \
|
||||
throw_range = 3
|
||||
sheettype = "plastitanium"
|
||||
materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT)
|
||||
point_value = 45
|
||||
|
||||
GLOBAL_LIST_INIT(plastitanium_recipes, list ( \
|
||||
new/datum/stack_recipe("plastitanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), \
|
||||
|
||||
@@ -98,6 +98,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
|
||||
resistance_flags = FIRE_PROOF
|
||||
merge_type = /obj/item/stack/sheet/metal
|
||||
grind_results = list("iron" = 20)
|
||||
point_value = 2
|
||||
|
||||
/obj/item/stack/sheet/metal/ratvar_act()
|
||||
new /obj/item/stack/tile/brass(loc, amount)
|
||||
@@ -158,6 +159,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
|
||||
resistance_flags = FIRE_PROOF
|
||||
merge_type = /obj/item/stack/sheet/plasteel
|
||||
grind_results = list("iron" = 20, "plasma" = 20)
|
||||
point_value = 23
|
||||
|
||||
/obj/item/stack/sheet/plasteel/Initialize(mapload, new_amount, merge = TRUE)
|
||||
recipes = GLOB.plasteel_recipes
|
||||
|
||||
@@ -11,4 +11,5 @@
|
||||
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
|
||||
novariants = FALSE
|
||||
var/perunit = MINERAL_MATERIAL_AMOUNT
|
||||
var/sheettype = null //this is used for girders in the creation of walls/false walls
|
||||
var/sheettype = null //this is used for girders in the creation of walls/false walls
|
||||
var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity.
|
||||
@@ -231,3 +231,35 @@
|
||||
new /obj/item/reagent_containers/pill/patch/silver_sulf(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/reagent_containers/pill/patch/styptic(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/zoom
|
||||
name = "suspicious pill bottle"
|
||||
desc = "The label is pretty old and almost unreadable, you recognize some chemical compounds."
|
||||
|
||||
/obj/item/storage/pill_bottle/zoom/PopulateContents()
|
||||
for(var/i in 1 to 5)
|
||||
new /obj/item/reagent_containers/pill/zoom(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/happy
|
||||
name = "suspicious pill bottle"
|
||||
desc = "There is a smiley on the top."
|
||||
|
||||
/obj/item/storage/pill_bottle/happy/PopulateContents()
|
||||
for(var/i in 1 to 5)
|
||||
new /obj/item/reagent_containers/pill/happy(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/lsd
|
||||
name = "suspicious pill bottle"
|
||||
desc = "There is a badly drawn thing with the shape of a mushroom."
|
||||
|
||||
/obj/item/storage/pill_bottle/lsd/PopulateContents()
|
||||
for(var/i in 1 to 5)
|
||||
new /obj/item/reagent_containers/pill/lsd(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/aranesp
|
||||
name = "suspicious pill bottle"
|
||||
desc = "The label says 'gotta go fast'."
|
||||
|
||||
/obj/item/storage/pill_bottle/aranesp/PopulateContents()
|
||||
for(var/i in 1 to 5)
|
||||
new /obj/item/reagent_containers/pill/aranesp(src)
|
||||
|
||||
@@ -226,7 +226,6 @@
|
||||
air_contents.react()
|
||||
check_status()
|
||||
|
||||
|
||||
/obj/item/tank/proc/check_status()
|
||||
//Handle exploding, leaking, and rupturing of the tank
|
||||
|
||||
|
||||
@@ -18,19 +18,34 @@
|
||||
throw_range = 7
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 30)
|
||||
var/charges = list(0, 0, 0) //how many restocking "charges" the refill has for standard/contraband/coin products
|
||||
var/init_charges = list(0, 0, 0)
|
||||
|
||||
// Built automatically from the corresponding vending machine.
|
||||
// If null, considered to be full. Otherwise, is list(/typepath = amount).
|
||||
var/list/products
|
||||
var/list/contraband
|
||||
var/list/premium
|
||||
|
||||
/obj/item/vending_refill/New(amt = -1)
|
||||
..()
|
||||
/obj/item/vending_refill/Initialize(mapload)
|
||||
. = ..()
|
||||
name = "\improper [machine_name] restocking unit"
|
||||
if(isnum(amt) && amt > -1)
|
||||
charges[1] = amt
|
||||
|
||||
/obj/item/vending_refill/examine(mob/user)
|
||||
..()
|
||||
if(charges[1] > 0)
|
||||
to_chat(user, "It can restock [charges[1]+charges[2]+charges[3]] item(s).")
|
||||
var/num = get_part_rating()
|
||||
if (num == INFINITY)
|
||||
to_chat(user, "It's sealed tight, completely full of supplies.")
|
||||
else if (num == 0)
|
||||
to_chat(user, "It's empty!")
|
||||
else
|
||||
to_chat(user, "It's empty!")
|
||||
to_chat(user, "It can restock [num] item\s.")
|
||||
|
||||
/obj/item/vending_refill/get_part_rating()
|
||||
if (!products || !contraband || !premium)
|
||||
return INFINITY
|
||||
. = 0
|
||||
for(var/key in products)
|
||||
. += products[key]
|
||||
for(var/key in contraband)
|
||||
. += contraband[key]
|
||||
for(var/key in premium)
|
||||
. += premium[key]
|
||||
|
||||
@@ -48,13 +48,7 @@
|
||||
|
||||
/obj/hitby(atom/movable/AM)
|
||||
..()
|
||||
var/tforce = 0
|
||||
if(ismob(AM))
|
||||
tforce = 10
|
||||
else if(isobj(AM))
|
||||
var/obj/O = AM
|
||||
tforce = O.throwforce
|
||||
take_damage(tforce, BRUTE, "melee", 1, get_dir(src, AM))
|
||||
take_damage(AM.throwforce, BRUTE, "melee", 1, get_dir(src, AM))
|
||||
|
||||
/obj/ex_act(severity, target)
|
||||
if(resistance_flags & INDESTRUCTIBLE)
|
||||
|
||||
+13
-11
@@ -2,7 +2,6 @@
|
||||
/obj
|
||||
var/crit_fail = FALSE
|
||||
animate_movement = 2
|
||||
var/throwforce = 0
|
||||
var/obj_flags = CAN_BE_HIT
|
||||
var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT.
|
||||
|
||||
@@ -138,19 +137,22 @@
|
||||
else
|
||||
obj_flags &= ~IN_USE
|
||||
|
||||
/obj/proc/updateDialog()
|
||||
/obj/proc/updateDialog(update_viewers = TRUE,update_ais = TRUE)
|
||||
// Check that people are actually using the machine. If not, don't update anymore.
|
||||
if(obj_flags & IN_USE)
|
||||
var/list/nearby = viewers(1, src)
|
||||
var/is_in_use = 0
|
||||
for(var/mob/M in nearby)
|
||||
if ((M.client && M.machine == src))
|
||||
is_in_use = 1
|
||||
src.interact(M)
|
||||
var/ai_in_use = AutoUpdateAI(src)
|
||||
var/is_in_use = FALSE
|
||||
if(update_viewers)
|
||||
for(var/mob/M in viewers(1, src))
|
||||
if ((M.client && M.machine == src))
|
||||
is_in_use = TRUE
|
||||
src.interact(M)
|
||||
var/ai_in_use = FALSE
|
||||
if(update_ais)
|
||||
ai_in_use = AutoUpdateAI(src)
|
||||
|
||||
if(!ai_in_use && !is_in_use)
|
||||
obj_flags &= ~IN_USE
|
||||
if(update_viewers && update_ais) //State change is sure only if we check both
|
||||
if(!ai_in_use && !is_in_use)
|
||||
obj_flags &= ~IN_USE
|
||||
|
||||
|
||||
/obj/attack_ghost(mob/user)
|
||||
|
||||
@@ -148,14 +148,17 @@
|
||||
resistance_flags = FLAMMABLE
|
||||
max_integrity = 70
|
||||
buildstackamount = 2
|
||||
var/mutable_appearance/armrest
|
||||
item_chair = null
|
||||
var/mutable_appearance/armrest
|
||||
|
||||
/obj/structure/chair/comfy/Initialize()
|
||||
armrest = mutable_appearance('icons/obj/chairs.dmi', "comfychair_armrest")
|
||||
armrest = GetArmrest()
|
||||
armrest.layer = ABOVE_MOB_LAYER
|
||||
return ..()
|
||||
|
||||
/obj/structure/chair/comfy/proc/GetArmrest()
|
||||
return mutable_appearance('icons/obj/chairs.dmi', "comfychair_armrest")
|
||||
|
||||
/obj/structure/chair/comfy/Destroy()
|
||||
QDEL_NULL(armrest)
|
||||
return ..()
|
||||
@@ -194,7 +197,6 @@
|
||||
buildstackamount = 5
|
||||
item_chair = null
|
||||
|
||||
|
||||
/obj/structure/chair/office/Moved()
|
||||
. = ..()
|
||||
if(has_gravity())
|
||||
@@ -411,12 +413,6 @@
|
||||
/obj/structure/chair/shuttle
|
||||
name = "shuttle seat"
|
||||
desc = "A comfortable, secure seat. It has a more sturdy looking buckling system, for smoother flights."
|
||||
icon_state = "shuttle_chair"
|
||||
buildstackamount = 2
|
||||
var/mutable_appearance/armrest
|
||||
item_chair = null
|
||||
icon = 'goon/icons/obj/chairs.dmi'
|
||||
icon_state = "shuttle_chair" //thanks gannets!
|
||||
|
||||
/obj/structure/chair/shuttle/Initialize()
|
||||
armrest = mutable_appearance('icons/obj/chairs.dmi', "shuttle_chair_armrest")
|
||||
armrest.layer = ABOVE_MOB_LAYER
|
||||
return ..()
|
||||
@@ -8,23 +8,23 @@
|
||||
max_integrity = 200
|
||||
integrity_failure = 50
|
||||
var/obj/item/extinguisher/stored_extinguisher
|
||||
var/opened = 0
|
||||
var/opened = FALSE
|
||||
|
||||
/obj/structure/extinguisher_cabinet/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to [opened ? "close":"open"] it.</span>")
|
||||
|
||||
/obj/structure/extinguisher_cabinet/New(loc, ndir, building)
|
||||
..()
|
||||
/obj/structure/extinguisher_cabinet/Initialize(mapload, ndir, building)
|
||||
. = ..()
|
||||
if(building)
|
||||
setDir(ndir)
|
||||
pixel_x = (dir & 3)? 0 : (dir == 4 ? -27 : 27)
|
||||
pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0
|
||||
opened = 1
|
||||
opened = TRUE
|
||||
icon_state = "extinguisher_empty"
|
||||
else
|
||||
stored_extinguisher = new /obj/item/extinguisher(src)
|
||||
|
||||
/obj/structure/extinguisher_cabinet/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to [opened ? "close":"open"] it.</span>")
|
||||
|
||||
/obj/structure/extinguisher_cabinet/Destroy()
|
||||
if(stored_extinguisher)
|
||||
qdel(stored_extinguisher)
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
/obj/structure/fireaxecabinet
|
||||
name = "fire axe cabinet"
|
||||
desc = "There is a small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if."
|
||||
var/obj/item/twohanded/fireaxe/fireaxe = new/obj/item/twohanded/fireaxe
|
||||
icon = 'icons/obj/wallmounts.dmi'
|
||||
icon_state = "fireaxe"
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
armor = list("melee" = 50, "bullet" = 20, "laser" = 0, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50)
|
||||
var/locked = TRUE
|
||||
var/open = FALSE
|
||||
max_integrity = 150
|
||||
integrity_failure = 50
|
||||
var/locked = TRUE
|
||||
var/open = FALSE
|
||||
var/obj/item/twohanded/fireaxe/fireaxe
|
||||
|
||||
/obj/structure/fireaxecabinet/Initialize()
|
||||
. = ..()
|
||||
fireaxe = new
|
||||
update_icon()
|
||||
|
||||
/obj/structure/fireaxecabinet/Destroy()
|
||||
|
||||
Reference in New Issue
Block a user