Merge remote-tracking branch 'origin' into hedges

This commit is contained in:
Citrus
2020-01-02 17:03:26 -05:00
268 changed files with 11444 additions and 76292 deletions
+5 -1
View File
@@ -61,7 +61,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
// you are refactoring shitty landmark code.
/obj/effect/landmark/start/assistant
name = "Assistant"
icon_state = "Assistant"
icon_state = "Assistant" //icon_state is case sensitive. why are all of these capitalized? because fuck you that's why
/obj/effect/landmark/start/assistant/override
jobspawn_override = TRUE
@@ -151,6 +151,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
name = "Medical Doctor"
icon_state = "Medical Doctor"
/obj/effect/landmark/start/paramedic
name = "Paramedic"
icon_state = "Paramedic"
/obj/effect/landmark/start/scientist
name = "Scientist"
icon_state = "Scientist"
+2
View File
@@ -71,6 +71,8 @@ AI MODULES
GLOB.lawchanges.Add("[time] <B>:</B> [user.name]([user.key]) used [src.name] on [ainame]([aikey]).[law2log ? " The law specified [law2log]" : ""]")
log_law("[user.key]/[user.name] used [src.name] on [aikey]/([ainame]) from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""]")
message_admins("[ADMIN_LOOKUPFLW(user)] used [src.name] on [ADMIN_LOOKUPFLW(law_datum.owner)] from [AREACOORD(user)].[law2log ? " The law specified [law2log]" : ""]")
if(law_datum.owner)
deadchat_broadcast("<b> changed <span class='name'>[ainame]</span>'s laws at [get_area_name(user, TRUE)].</b>", "<span class='name'>[user]</span>", follow_target=user, message_type=DEADCHAT_LAWCHANGE)
//The proc that actually changes the silicon's laws.
/obj/item/aiModule/proc/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow = FALSE)
+16 -4
View File
@@ -700,6 +700,7 @@ RLD
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
matter = 200
max_matter = 200
var/matter_divisor = 35
var/mode = LIGHT_MODE
slot_flags = ITEM_SLOT_BELT
actions_types = list(/datum/action/item_action/pick_color)
@@ -723,7 +724,7 @@ RLD
..()
/obj/item/construction/rld/update_icon()
icon_state = "rld-[round(matter/35)]"
icon_state = "rld-[round(matter/matter_divisor)]"
..()
@@ -759,7 +760,7 @@ RLD
if(istype(A, /obj/machinery/light/))
if(checkResource(deconcost, user))
to_chat(user, "<span class='notice'>You start deconstructing [A]...</span>")
user.Beam(A,icon_state="nzcrentrs_power",time=15)
user.Beam(A,icon_state="light_beam",time=15)
playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
if(do_after(user, decondelay, target = A))
if(!useResource(deconcost, user))
@@ -773,7 +774,7 @@ RLD
var/turf/closed/wall/W = A
if(checkResource(floorcost, user))
to_chat(user, "<span class='notice'>You start building a wall light...</span>")
user.Beam(A,icon_state="nzcrentrs_power",time=15)
user.Beam(A,icon_state="light_beam",time=15)
playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, FALSE)
if(do_after(user, floordelay, target = A))
@@ -819,7 +820,7 @@ RLD
var/turf/open/floor/F = A
if(checkResource(floorcost, user))
to_chat(user, "<span class='notice'>You start building a floor light...</span>")
user.Beam(A,icon_state="nzcrentrs_power",time=15)
user.Beam(A,icon_state="light_beam",time=15)
playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, TRUE)
if(do_after(user, floordelay, target = A))
@@ -848,6 +849,17 @@ RLD
return TRUE
return FALSE
/obj/item/construction/rld/mini
name = "mini-rapid-light-device (MRLD)"
desc = "A device used to rapidly provide lighting sources to an area. Reload with metal, plasteel, glass or compressed matter cartridges."
icon = 'icons/obj/tools.dmi'
icon_state = "rld-5"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
matter = 100
max_matter = 100
matter_divisor = 20
/obj/item/construction/plumbing
name = "Plumbing Constructor"
desc = "An expertly modified RCD outfitted to construct plumbing machinery."
+108
View File
@@ -125,3 +125,111 @@
user.put_in_hands(ink)
to_chat(user, "<span class='notice'>You remove [ink] from [src].</span>")
ink = null
/obj/item/airlock_painter/decal
name = "decal painter"
desc = "An airlock painter, reprogramed to use a different style of paint in order to apply decals for floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed. Alt-Click to change design."
icon = 'icons/obj/objects.dmi'
icon_state = "decal_sprayer"
item_state = "decalsprayer"
custom_materials = list(/datum/material/iron=2000, /datum/material/glass=500)
var/stored_dir = 2
var/stored_color = ""
var/stored_decal = "warningline"
var/stored_decal_total = "warningline"
var/color_list = list("","red","white")
var/dir_list = list(1,2,4,8)
var/decal_list = list(list("Warning Line","warningline"),
list("Warning Line Corner","warninglinecorner"),
list("Caution Label","caution"),
list("Directional Arrows","arrows"),
list("Stand Clear Label","stand_clear"),
list("Box","box"),
list("Box Corner","box_corners"),
list("Delivery Marker","delivery"),
list("Warning Box","warn_full"))
/obj/item/airlock_painter/decal/afterattack(atom/target, mob/user, proximity)
. = ..()
var/turf/open/floor/F = target
if(!proximity)
to_chat(user, "<span class='notice'>You need to get closer!</span>")
return
if(use_paint(user) && isturf(F))
F.AddComponent(/datum/component/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, CLEAN_STRONG, color, null, null, alpha)
/obj/item/airlock_painter/decal/attack_self(mob/user)
if((ink) && (ink.charges >= 1))
to_chat(user, "<span class='notice'>[src] beeps to prevent you from removing the toner until out of charges.</span>")
return
. = ..()
/obj/item/airlock_painter/decal/AltClick(mob/user)
. = ..()
ui_interact(user)
/obj/item/airlock_painter/decal/Initialize()
. = ..()
ink = new /obj/item/toner/large(src)
/obj/item/airlock_painter/decal/proc/update_decal_path()
var/yellow_fix = "" //This will have to do until someone refactor's markings.dm
if (stored_color)
yellow_fix = "_"
stored_decal_total = "[stored_decal][yellow_fix][stored_color]"
return
/obj/item/airlock_painter/decal/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, 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)
ui = new(user, src, ui_key, "decal_painter", name, 500, 400, master_ui, state)
ui.open()
/obj/item/airlock_painter/decal/ui_data(mob/user)
var/list/data = list()
data["decal_direction"] = stored_dir
data["decal_color"] = stored_color
data["decal_style"] = stored_decal
data["decal_list"] = list()
data["color_list"] = list()
data["dir_list"] = list()
for(var/i in decal_list)
data["decal_list"] += list(list(
"name" = i[1],
"decal" = i[2]
))
for(var/j in color_list)
data["color_list"] += list(list(
"colors" = j
))
for(var/k in dir_list)
data["dir_list"] += list(list(
"dirs" = k
))
return data
/obj/item/airlock_painter/decal/ui_act(action,list/params)
if(..())
return
switch(action)
//Lists of decals and designs
if("select decal")
var/selected_decal = params["decals"]
stored_decal = selected_decal
if("select color")
var/selected_color = params["colors"]
stored_color = selected_color
if("selected direction")
var/selected_direction = text2num(params["dirs"])
stored_dir = selected_direction
update_decal_path()
. = TRUE
/obj/item/airlock_painter/decal/debug
name = "extreme decal painter"
icon_state = "decal_sprayer_ex"
/obj/item/airlock_painter/decal/debug/Initialize()
. = ..()
ink = new /obj/item/toner/extreme(src)
+3 -3
View File
@@ -182,7 +182,7 @@
else
to_chat(user, "<span class='notice'>You insert [I] into [src], adding [cash_money] credits to the linked account.</span>")
to_chat(user, "<span class='notice'>The linked account now reports a balance of $[registered_account.account_balance].</span>")
to_chat(user, "<span class='notice'>The linked account now reports a balance of [registered_account.account_balance] cr.</span>")
qdel(I)
/obj/item/card/id/proc/mass_insert_money(list/money, mob/user)
@@ -276,11 +276,11 @@
if(mining_points)
. += "There's [mining_points] mining equipment redemption point\s loaded onto this card."
if(registered_account)
. += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of $[registered_account.account_balance]."
. += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr."
if(registered_account.account_job)
var/datum/bank_account/D = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department)
if(D)
. += "The [D.account_holder] reports a balance of $[D.account_balance]."
. += "The [D.account_holder] reports a balance of [D.account_balance] cr."
. += "<span class='info'>Alt-Click the ID to pull money from the linked account in the form of holochips.</span>"
. += "<span class='info'>You can insert credits into the linked account by pressing holochips, cash, or coins against the ID.</span>"
if(registered_account.account_holder == user.real_name)
@@ -934,6 +934,17 @@
/obj/item/stack/sheet/glass = 1)
def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial)
/obj/item/circuitboard/machine/bepis
name = "BEPIS Chamber (Machine Board)"
icon_state = "science"
build_path = /obj/machinery/rnd/bepis
req_components = list(
/obj/item/stack/cable_coil = 5,
/obj/item/stock_parts/capacitor = 1,
/obj/item/stock_parts/manipulator = 1,
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stock_parts/scanning_module = 1)
//Security
/obj/item/circuitboard/machine/protolathe/department/security
+75
View File
@@ -23,3 +23,78 @@
..()
var/choice = input("Select a species", "Human Spawner", null) in GLOB.species_list
selected_species = GLOB.species_list[choice]
/obj/item/debug/omnitool
name = "omnitool"
desc = "The original hypertool, born before them all. Use it in hand to unleash it's true power."
icon = 'icons/obj/device.dmi'
icon_state = "hypertool"
item_state = "hypertool"
toolspeed = 0.1
tool_behaviour = null
/obj/item/debug/omnitool/examine()
. = ..()
. += " The mode is: [tool_behaviour]"
/obj/item/debug/omnitool/proc/check_menu(mob/user)
if(!istype(user))
return FALSE
if(user.incapacitated() || !user.Adjacent(src))
return FALSE
return TRUE
/obj/item/debug/omnitool/attack_self(mob/user)
if(!user)
return
var/list/tool_list = list(
"Crowbar" = image(icon = 'icons/obj/tools.dmi', icon_state = "crowbar"),
"Multitool" = image(icon = 'icons/obj/device.dmi', icon_state = "multitool"),
"Screwdriver" = image(icon = 'icons/obj/tools.dmi', icon_state = "screwdriver_map"),
"Wirecutters" = image(icon = 'icons/obj/tools.dmi', icon_state = "cutters_map"),
"Wrench" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench"),
"Welding Tool" = image(icon = 'icons/obj/tools.dmi', icon_state = "miniwelder"),
"Analyzer" = image(icon = 'icons/obj/device.dmi', icon_state = "analyzer"),
"Mining Tool" = image(icon = 'icons/obj/mining.dmi', icon_state = "minipick"),
"Shovel" = image(icon = 'icons/obj/mining.dmi', icon_state = "spade"),
"Retractor" = image(icon = 'icons/obj/surgery.dmi', icon_state = "retractor"),
"Hemostat" = image(icon = 'icons/obj/surgery.dmi', icon_state = "hemostat"),
"Cautery" = image(icon = 'icons/obj/surgery.dmi', icon_state = "cautery"),
"Drill" = image(icon = 'icons/obj/surgery.dmi', icon_state = "drill"),
"Scalpel" = image(icon = 'icons/obj/surgery.dmi', icon_state = "scalpel"),
"Saw" = image(icon = 'icons/obj/surgery.dmi', icon_state = "saw")
)
var/tool_result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
if(!check_menu(user))
return
switch(tool_result)
if("Crowbar")
tool_behaviour = TOOL_CROWBAR
if("Multitool")
tool_behaviour = TOOL_MULTITOOL
if("Screwdriver")
tool_behaviour = TOOL_SCREWDRIVER
if("Wirecutters")
tool_behaviour = TOOL_WIRECUTTER
if("Wrench")
tool_behaviour = TOOL_WRENCH
if("Welding Tool")
tool_behaviour = TOOL_WELDER
if("Analyzer")
tool_behaviour = TOOL_ANALYZER
if("Mining Tool")
tool_behaviour = TOOL_MINING
if("Shovel")
tool_behaviour = TOOL_SHOVEL
if("Retractor")
tool_behaviour = TOOL_RETRACTOR
if("Hemostat")
tool_behaviour = TOOL_HEMOSTAT
if("Cautery")
tool_behaviour = TOOL_CAUTERY
if("Drill")
tool_behaviour = TOOL_DRILL
if("Scalpel")
tool_behaviour = TOOL_SCALPEL
if("Saw")
tool_behaviour = TOOL_SAW
+51 -23
View File
@@ -22,6 +22,7 @@ GLOBAL_LIST_EMPTY(PDAs)
item_flags = NOBLUDGEON
w_class = WEIGHT_CLASS_TINY
slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT
actions_types = list(/datum/action/item_action/toggle_light)
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
@@ -94,10 +95,13 @@ GLOBAL_LIST_EMPTY(PDAs)
return
if(id)
. += "<span class='notice'>Alt-click to remove the id.</span>"
. += "<span class='notice'>Alt-click to remove the ID.</span>" //won't name ID on examine in case it's stolen
if(inserted_item && (!isturf(loc)))
. += "<span class='notice'>Ctrl-click to remove [inserted_item].</span>"
. += "<span class='notice'>Ctrl-click to remove [inserted_item].</span>" //traitor pens are disguised so we're fine naming them on examine
if((!isnull(cartridge)))
. += "<span class='notice'>Ctrl+Shift-click to remove the cartridge.</span>" //won't name cart on examine in case it's Detomatix
/obj/item/pda/Initialize()
. = ..()
@@ -448,13 +452,7 @@ GLOBAL_LIST_EMPTY(PDAs)
owner = id.registered_name
update_label()
if("Eject")//Ejects the cart, only done from hub.
if (!isnull(cartridge))
U.put_in_hands(cartridge)
to_chat(U, "<span class='notice'>You remove [cartridge] from [src].</span>")
scanmode = PDA_SCANNER_NONE
cartridge.host_pda = null
cartridge = null
update_icon()
eject_cart(U)
//MENU FUNCTIONS===================================
@@ -475,7 +473,7 @@ GLOBAL_LIST_EMPTY(PDAs)
//MAIN FUNCTIONS===================================
if("Light")
toggle_light()
toggle_light(U)
if("Medical Scan")
if(scanmode == PDA_SCANNER_MEDICAL)
scanmode = PDA_SCANNER_NONE
@@ -624,6 +622,7 @@ GLOBAL_LIST_EMPTY(PDAs)
. = id
id = null
updateSelfDialog()
update_icon()
if(ishuman(loc))
@@ -752,19 +751,24 @@ GLOBAL_LIST_EMPTY(PDAs)
else
remove_pen()
/obj/item/pda/CtrlClick()
/obj/item/pda/CtrlClick(mob/user)
..()
if(isturf(loc)) //stops the user from dragging the PDA by ctrl-clicking it.
return
remove_pen()
remove_pen(user)
/obj/item/pda/CtrlShiftClick(mob/user)
..()
eject_cart(user)
/obj/item/pda/verb/verb_toggle_light()
set name = "Toggle light"
set category = "Object"
set name = "Toggle Flashlight"
set src in oview(1)
toggle_light()
toggle_light(usr)
/obj/item/pda/verb/verb_remove_id()
set category = "Object"
@@ -781,10 +785,17 @@ GLOBAL_LIST_EMPTY(PDAs)
set name = "Remove Pen"
set src in usr
remove_pen()
remove_pen(usr)
/obj/item/pda/proc/toggle_light()
if(issilicon(usr) || !usr.canUseTopic(src, BE_CLOSE))
/obj/item/pda/verb/verb_eject_cart()
set category = "Object"
set name = "Eject Cartridge"
set src in usr
eject_cart(usr)
/obj/item/pda/proc/toggle_light(mob/user)
if(issilicon(user) || !user.canUseTopic(src, BE_CLOSE))
return
if(fon)
fon = FALSE
@@ -793,19 +804,34 @@ GLOBAL_LIST_EMPTY(PDAs)
fon = TRUE
set_light(f_lum)
update_icon()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/pda/proc/remove_pen()
/obj/item/pda/proc/remove_pen(mob/user)
if(issilicon(usr) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
if(issilicon(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) //TK doesn't work even with this removed but here for readability
return
if(inserted_item)
usr.put_in_hands(inserted_item)
to_chat(usr, "<span class='notice'>You remove [inserted_item] from [src].</span>")
user.put_in_hands(inserted_item)
to_chat(user, "<span class='notice'>You remove [inserted_item] from [src].</span>")
inserted_item = null
update_icon()
else
to_chat(usr, "<span class='warning'>This PDA does not have a pen in it!</span>")
to_chat(user, "<span class='warning'>This PDA does not have a pen in it!</span>")
/obj/item/pda/proc/eject_cart(mob/user)
if(issilicon(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) //TK disabled to stop cartridge teleporting into hand
return
if (!isnull(cartridge))
user.put_in_hands(cartridge)
to_chat(user, "<span class='notice'>You eject [cartridge] from [src].</span>")
scanmode = PDA_SCANNER_NONE
cartridge.host_pda = null
cartridge = null
updateSelfDialog()
update_icon()
//trying to insert or remove an id
/obj/item/pda/proc/id_check(mob/user, obj/item/card/id/I)
@@ -842,12 +868,14 @@ GLOBAL_LIST_EMPTY(PDAs)
// access to status display signals
/obj/item/pda/attackby(obj/item/C, mob/user, params)
if(istype(C, /obj/item/cartridge) && !cartridge)
if(istype(C, /obj/item/cartridge))
if(!user.transferItemToLoc(C, src))
return
eject_cart(user)
cartridge = C
cartridge.host_pda = src
to_chat(user, "<span class='notice'>You insert [cartridge] into [src].</span>")
updateSelfDialog()
update_icon()
else if(istype(C, /obj/item/card/id))
@@ -14,6 +14,7 @@
var/last_use = 0
var/next_use = 0
var/obj/effect/abstract/sync_holder/sync_holder
var/resync_timer
/obj/item/desynchronizer/attack_self(mob/living/user)
if(world.time < next_use)
@@ -54,16 +55,20 @@
SEND_SIGNAL(AM, COMSIG_MOVABLE_SECLUDED_LOCATION)
last_use = world.time
icon_state = "desynchronizer-on"
addtimer(CALLBACK(src, .proc/resync), duration)
resync_timer = addtimer(CALLBACK(src, .proc/resync), duration , TIMER_STOPPABLE)
/obj/item/desynchronizer/proc/resync()
new /obj/effect/temp_visual/desynchronizer(sync_holder.drop_location())
QDEL_NULL(sync_holder)
if(resync_timer)
deltimer(resync_timer)
resync_timer = null
icon_state = initial(icon_state)
next_use = world.time + (world.time - last_use) // Could be 2*world.time-last_use but that would just be confusing
/obj/item/desynchronizer/Destroy()
resync()
if(sync_holder)
resync()
return ..()
/obj/effect/abstract/sync_holder
@@ -0,0 +1,52 @@
/obj/item/stack/circuit_stack
name = "polycircuit aggregate"
desc = "A dense, overdesigned cluster of electronics which attempted to function as a multipurpose circuit electronic. Circuits can be removed from it... if you don't bleed out in the process."
icon_state = "circuit_mess"
item_state = "rods"
w_class = WEIGHT_CLASS_TINY
max_amount = 8
var/circuit_type = /obj/item/electronics/airlock
var/chosen_circuit = "airlock"
/obj/item/stack/circuit_stack/attack_self(mob/user)// Prevents the crafting menu, and tells you how to use it.
to_chat(user, "<span class='warning'>You can't use [src] by itself, you'll have to try and remove one of these circuits by hand... carefully.</span>")
/obj/item/stack/circuit_stack/attack_hand(mob/user)
var/mob/living/carbon/human/H = user
if(!user.get_inactive_held_item() == src)
return ..()
else
if(zero_amount())
return
chosen_circuit = input("What type of circuit would you like to remove?", "Choose a Circuit Type", chosen_circuit) in list("airlock","firelock","fire alarm","air alarm","APC")
if(zero_amount())
return
switch(chosen_circuit)
if("airlock")
circuit_type = /obj/item/electronics/airlock
if("firelock")
circuit_type = /obj/item/electronics/firelock
if("fire alarm")
circuit_type = /obj/item/electronics/firealarm
if("air alarm")
circuit_type = /obj/item/electronics/airalarm
if("APC")
circuit_type = /obj/item/electronics/apc
to_chat(user, "<span class='notice'>You spot your circuit, and carefully attempt to remove it from [src], hold still!</span>")
if(do_after(user, 30, target = user))
if(!src || QDELETED(src))//Sanity Check.
return
var/returned_circuit = new circuit_type(src)
user.put_in_hands(returned_circuit)
use(1)
if(!amount)
to_chat(user, "<span class='notice'>You navigate the sharp edges of circuitry and remove the last board.</span>")
else
to_chat(user, "<span class='notice'>You navigate the sharp edges of circuitry and remove a single board from [src]</span>")
else
H.apply_damage(15, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
to_chat(user, "<span class='warning'>You give yourself a wicked cut on [src]'s many sharp corners and edges!</span>")
..()
/obj/item/stack/circuit_stack/full
amount = 8
@@ -2,16 +2,16 @@
name = "antigravity grenade"
icon_state = "emp"
item_state = "emp"
var/range = 7
var/forced_value = 0
var/duration = 300
/obj/item/grenade/antigravity/prime()
update_mob()
for(var/turf/T in view(range,src))
var/datum/component/C = T.AddComponent(/datum/component/forced_gravity,forced_value)
QDEL_IN(C,duration)
T.AddElement(/datum/element/forced_gravity, forced_value)
addtimer(CALLBACK(T, /datum/.proc/RemoveElement, forced_value), duration)
qdel(src)
+117
View File
@@ -0,0 +1,117 @@
//~*~*~*~*SPARKLER*~*~*~*~*~*~
/obj/item/sparkler
name = "sparkler"
desc = "A little stick coated with metal power and barium nitrate, burns with a pleasing sparkle."
icon = 'icons/obj/holiday_misc.dmi'
icon_state = "sparkler"
w_class = WEIGHT_CLASS_TINY
heat = 1000
var/burntime = 60
var/lit = FALSE
/obj/item/sparkler/fire_act(exposed_temperature, exposed_volume)
light()
/obj/item/sparkler/attackby(obj/item/W, mob/user, params)
var/ignition_msg = W.ignition_effect(src, user)
if(ignition_msg)
light(user, ignition_msg)
else
return ..()
/obj/item/sparkler/proc/light(mob/user, message)
if(lit)
return
if(user && message)
user.visible_message(message)
lit = TRUE
icon_state = "sparkler_on"
force = 6
hitsound = 'sound/items/welder.ogg'
name = "lit [initial(name)]"
attack_verb = list("burnt")
set_light(l_range = 2, l_power = 2)
damtype = "fire"
START_PROCESSING(SSobj, src)
playsound(src, 'sound/effects/fuse.ogg', 20, TRUE)
update_icon()
/obj/item/sparkler/process()
burntime--
if(burntime < 1)
new /obj/item/stack/rods(drop_location())
qdel(src)
else
open_flame(heat)
/obj/item/sparkler/Destroy()
STOP_PROCESSING(SSobj, src)
..()
/obj/item/sparkler/ignition_effect(atom/A, mob/user)
. = "<span class='notice'>[user] gracefully lights [A] with [src].</span>"
/obj/item/sparkler/get_temperature()
return lit * heat
//~*~*~*~*FIRECRACKER*~*~*~*~*~*~
/obj/item/grenade/firecracker
name = "large firecracker"
desc = "Outlawed in most of the sector. Doubles as an excellent finger remover."
icon = 'icons/obj/holiday_misc.dmi'
icon_state = "firecracker"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
item_state = "flare"
throw_speed = 3
throw_range = 7
det_time = 30
/obj/item/grenade/firecracker/attack_self(mob/user) // You need to light it manually.
return
/obj/item/grenade/firecracker/attackby(obj/item/W, mob/user, params)
var/ignition_msg = W.ignition_effect(src, user)
if(ignition_msg && !active)
visible_message(ignition_msg)
preprime(user)
else
return ..()
/obj/item/grenade/firecracker/fire_act(exposed_temperature, exposed_volume)
prime()
obj/item/grenade/firecracker/wirecutter_act(mob/living/user, obj/item/I)
if(active)
return
if(det_time)
det_time -= 10
to_chat(user, "<span class='notice'>You shorten the fuse of [src] with [I].")
playsound(src, 'sound/items/wirecutter.ogg', 20, TRUE)
icon_state = initial(icon_state) + "_[det_time]"
update_icon()
else
to_chat(user, "<span class='danger'>You've already removed all of the fuse!")
obj/item/grenade/firecracker/preprime(mob/user, delayoverride, msg = TRUE, volume = 80)
var/turf/T = get_turf(src)
log_grenade(user, T)
if(user)
add_fingerprint(user)
if(msg)
to_chat(user, "<span class='warning'>You prime [src]! [capitalize(DisplayTimeText(det_time))]!</span>")
playsound(src, 'sound/effects/fuse.ogg', volume, TRUE)
active = TRUE
icon_state = initial(icon_state) + "_active"
addtimer(CALLBACK(src, .proc/prime), isnull(delayoverride)? det_time : delayoverride)
/obj/item/grenade/firecracker/prime()
update_mob()
var/explosion_loc = get_turf(src)
qdel(src)
explosion(explosion_loc,-1,-1,2)
@@ -316,6 +316,7 @@
checktank = FALSE
range_multiplier = 3
throw_amount = 1
pressureSetting = 2
maxWeightClass = 2 //a single magspear
spin_item = FALSE
var/static/list/magspear_typecache = typecacheof(/obj/item/throwing_star/magspear)
+2 -2
View File
@@ -102,7 +102,7 @@
item_state = "banner_medical"
lefthand_file = 'icons/mob/inhands/equipment/banners_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/banners_righthand.dmi'
job_loyalties = list("Medical Doctor", "Chemist", "Geneticist", "Virologist", "Chief Medical Officer")
job_loyalties = list("Medical Doctor", "Chemist", "Virologist", "Chief Medical Officer")
warcry = "No wounds cannot be healed!"
/obj/item/banner/medical/mundane
@@ -131,7 +131,7 @@
item_state = "banner_science"
lefthand_file = 'icons/mob/inhands/equipment/banners_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/banners_righthand.dmi'
job_loyalties = list("Scientist", "Roboticist", "Research Director")
job_loyalties = list("Scientist", "Roboticist", "Research Director", "Geneticist",)
warcry = "For Cuban Pete!"
/obj/item/banner/science/mundane
+5
View File
@@ -72,3 +72,8 @@
icon_state = "spacecash1000"
singular_name = "one thousand credit bill"
value = 1000
/obj/item/stack/spacecash/c10000
icon_state = "spacecash10000"
singular_name = "ten thousand credit bill"
value = 10000
@@ -114,6 +114,9 @@
grind_results = list(/datum/reagent/cellulose = 2)
custom_price = 100
/obj/item/stack/medical/gauze/twelve
amount = 12
/obj/item/stack/medical/gauze/heal(mob/living/M, mob/user)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -282,6 +282,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("mining satchel", /obj/item/storage/bag/ore, 4), \
new/datum/stack_recipe("chemistry bag", /obj/item/storage/bag/chemistry, 4), \
new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4), \
new/datum/stack_recipe("construction bag", /obj/item/storage/bag/construction, 4), \
null, \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \
new/datum/stack_recipe("rag", /obj/item/reagent_containers/glass/rag, 1), \
+10
View File
@@ -175,6 +175,16 @@
/obj/item/plunger
))
/obj/item/storage/belt/medical/paramedic/PopulateContents()
new /obj/item/sensor_device(src)
new /obj/item/flashlight/pen(src)
new /obj/item/stack/medical/gauze/twelve(src)
new /obj/item/reagent_containers/syringe(src)
new /obj/item/reagent_containers/glass/bottle/epinephrine(src)
new /obj/item/reagent_containers/glass/bottle/calomel(src)
new /obj/item/reagent_containers/glass/bottle/formaldehyde(src)
update_icon()
/obj/item/storage/belt/security
name = "security belt"
desc = "Can hold security gear like handcuffs and flashes."
+41 -2
View File
@@ -451,7 +451,7 @@
name = "box of teriyaki-flavoured donk-pockets"
icon_state = "donkpocketboxteriyaki"
donktype = /obj/item/reagent_containers/food/snacks/donkpocket/teriyaki
/obj/item/storage/box/donkpockets/donkpocketpizza
name = "box of pizza-flavoured donk-pockets"
icon_state = "donkpocketboxpizza"
@@ -466,7 +466,7 @@
name = "box of berry-flavoured donk-pockets"
icon_state = "donkpocketboxberry"
donktype = /obj/item/reagent_containers/food/snacks/donkpocket/berry
/obj/item/storage/box/donkpockets/donkpockethonk
name = "box of banana-flavoured donk-pockets"
icon_state = "donkpocketboxbanana"
@@ -1201,3 +1201,42 @@
/obj/item/storage/box/material=1
)
generate_items_inside(items_inside,src)
/obj/item/storage/box/fireworks
name = "box of fireworks"
desc = "Contains an assortment of fireworks."
illustration = "flashbang"
/obj/item/storage/box/fireworks/PopulateContents()
for(var/i in 1 to 3)
new/obj/item/sparkler(src)
new/obj/item/grenade/firecracker(src)
new /obj/item/toy/snappop(src)
/obj/item/storage/box/fireworks/dangerous
/obj/item/storage/box/fireworks/dangerous/PopulateContents()
for(var/i in 1 to 3)
new/obj/item/sparkler(src)
new/obj/item/grenade/firecracker(src)
if(prob(20))
new /obj/item/grenade/syndieminibomb/concussion/frag(src)
else
new /obj/item/toy/snappop(src)
/obj/item/storage/box/firecrackers
name = "box of firecrackers"
desc = "A box filled with illegal firecracker. You wonder who still makes these."
icon_state = "syndiebox"
/obj/item/storage/box/firecrackers/PopulateContents()
for(var/i in 1 to 7)
new/obj/item/grenade/firecracker(src)
/obj/item/storage/box/sparklers
name = "box of sparklers"
desc = "A box of NT brand sparklers, burns hot even in the cold of space-winter."
/obj/item/storage/box/sparklers/PopulateContents()
for(var/i in 1 to 7)
new/obj/item/sparkler(src)
+5
View File
@@ -1376,6 +1376,11 @@
icon_state = "md"
toysay = "The patient is already dead!"
/obj/item/toy/figure/paramedic
name = "Paramedic action figure"
icon_state = "paramedic"
toysay = "And the best part? I'm not even a real doctor!"
/obj/item/toy/figure/mime
name = "Mime action figure"
icon_state = "mime"
+3 -2
View File
@@ -843,8 +843,9 @@
/obj/item/twohanded/binoculars/unwield(mob/user)
. = ..()
UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED)
listeningTo = null
if(listeningTo)
UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED)
listeningTo = null
user.visible_message("<span class='notice'>[user] lowers [src].</span>", "<span class='notice'>You lower [src].</span>")
item_state = "binoculars"
user.regenerate_icons()
+1
View File
@@ -246,6 +246,7 @@
if(brain.force_replace_ai_name)
A.fully_replace_character_name(A.name, brain.replacement_ai_name())
SSblackbox.record_feedback("amount", "ais_created", 1)
deadchat_broadcast(" has been brought online at <b>[get_area_name(A, TRUE)]</b>.", "<span class='name'>[A]</span>", follow_target=A)
qdel(src)
else
state = AI_READY_CORE
@@ -195,9 +195,9 @@
/obj/item/clothing/under/rank/medical/doctor/purple = 1,
/obj/item/clothing/under/rank/medical/doctor = 3,
/obj/item/clothing/suit/toggle/labcoat = 3,
/obj/item/clothing/suit/toggle/labcoat/emt = 3,
/obj/item/clothing/suit/toggle/labcoat/paramedic = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/head/soft/emt = 3)
/obj/item/clothing/head/soft/paramedic = 3)
generate_items_inside(items_inside,src)
return
@@ -243,7 +243,7 @@
/obj/structure/closet/wardrobe/genetics_white/PopulateContents()
var/static/items_inside = list(
/obj/item/clothing/under/rank/medical/geneticist = 2,
/obj/item/clothing/under/rank/rnd/geneticist = 2,
/obj/item/clothing/shoes/sneakers/white = 2,
/obj/item/clothing/suit/toggle/labcoat/genetics = 2,
/obj/item/storage/backpack/genetics = 2,
+1 -2
View File
@@ -22,8 +22,6 @@
user.visible_message("<span class='notice'>[user] fells [src] with the [W].</span>","<span class='notice'>You fell [src] with the [W].</span>", "<span class='hear'>You hear the sound of a tree falling.</span>")
playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 100 , FALSE, FALSE)
user.log_message("cut down [src] at [AREACOORD(src)]", LOG_ATTACK)
if(istype(src, /obj/structure/flora/tree/pine/xmas))
message_admins("[ADMIN_LOOKUPFLW(user)][ADMIN_SMITE(user)] cut down [src] at [ADMIN_COORDJMP(src)]")
for(var/i=1 to log_amount)
new /obj/item/grown/log/tree(get_turf(src))
var/obj/structure/flora/stump/S = new(loc)
@@ -58,6 +56,7 @@
desc = "A wondrous decorated Christmas tree."
icon_state = "pine_c"
icon_states = null
flags_1 = NODECONSTRUCT_1 //protected by the christmas spirit
/obj/structure/flora/tree/pine/xmas/presents
icon_state = "pinepresents"
+14 -2
View File
@@ -2,8 +2,8 @@
#define STAIR_TERMINATOR_NO 1
#define STAIR_TERMINATOR_YES 2
// dir determines the direction of travel to go upwards (due to lack of sprites, currently only 1 and 2 make sense)
// stairs require /turf/open/openspace as the tile above them to work
// dir determines the direction of travel to go upwards
// stairs require /turf/open/openspace as the tile above them to work, unless your stairs have 'force_open_above' set to TRUE
// multiple stair objects can be chained together; the Z level transition will happen on the final stair object in the chain
/obj/structure/stairs
@@ -16,6 +16,18 @@
var/terminator_mode = STAIR_TERMINATOR_AUTOMATIC
var/turf/listeningTo
/obj/structure/stairs/north
dir = NORTH
/obj/structure/stairs/south
dir = SOUTH
/obj/structure/stairs/east
dir = EAST
/obj/structure/stairs/west
dir = WEST
/obj/structure/stairs/Initialize(mapload)
if(force_open_above)
force_open_above()
@@ -160,5 +160,6 @@
name = "unattached transit tube pod"
icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
icon_state = "pod"
desc = "Could probably be <b>dragged</b> into an open Transit Tube."
anchored = FALSE
density = FALSE