merge master
@@ -112,6 +112,7 @@ DEFINE_BITFIELD(smoothing_flags, list(
|
||||
#define SMOOTH_GROUP_BRASS_TABLES S_OBJ(53) ///obj/structure/table/brass
|
||||
#define SMOOTH_GROUP_ABDUCTOR_TABLES S_OBJ(54) ///obj/structure/table/abductor
|
||||
#define SMOOTH_GROUP_GLASS_TABLES S_OBJ(55) ///obj/structure/table/glass
|
||||
#define SMOOTH_GROUP_REINFORCED_TABLES S_OBJ(56) ///obj/structure/table/reinforced, /obj/structure/table/glass/reinforced
|
||||
|
||||
#define SMOOTH_GROUP_ALIEN_RESIN S_OBJ(60) ///obj/structure/alien/resin
|
||||
#define SMOOTH_GROUP_ALIEN_WALLS S_OBJ(61) ///obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
clothes_req = TRUE
|
||||
cooldown_min = 200 //100 deciseconds reduction per rank
|
||||
|
||||
action_icon_state = "clown"
|
||||
action_icon_state = "cluwne"
|
||||
|
||||
/mob/living/carbon/human/proc/makeCluwne()
|
||||
to_chat(src, "<span class='danger'>You feel funny.</span>")
|
||||
|
||||
@@ -49,6 +49,8 @@
|
||||
cooldown_min = 200
|
||||
var/used = FALSE
|
||||
|
||||
action_icon_state = "greater_knock"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/knock/greater/create_new_targeting()
|
||||
var/datum/spell_targeting/aoe/turf/T = new()
|
||||
return T
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
base_cooldown = 300
|
||||
clothes_req = TRUE
|
||||
cooldown_min = 100 //50 deciseconds reduction per rank
|
||||
action_icon_state = "mime"
|
||||
action_icon_state = "mime_curse"
|
||||
|
||||
/obj/item/melee/touch_attack/mime_malaise
|
||||
name = "mime hand"
|
||||
|
||||
@@ -228,6 +228,7 @@
|
||||
invocation = "TARCOL GRANDI ZHERI"
|
||||
invocation_type = "shout"
|
||||
large = TRUE
|
||||
action_icon_state = "shield_greater"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop
|
||||
name = "Stop Time"
|
||||
|
||||
@@ -717,7 +717,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
/obj/structure/table/abductor
|
||||
name = "alien table"
|
||||
desc = "Advanced flat surface technology at work!"
|
||||
icon = 'icons/obj/smooth_structures/alien_table.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/alien_table.dmi'
|
||||
icon_state = "alien_table-0"
|
||||
base_icon_state = "alien_table"
|
||||
buildstack = /obj/item/stack/sheet/mineral/abductor
|
||||
|
||||
@@ -110,3 +110,13 @@ GLOBAL_LIST_EMPTY(ai_displays)
|
||||
|
||||
. += new_display
|
||||
underlays += emissive_appearance(icon, "lightmask")
|
||||
|
||||
/obj/machinery/ai_status_display/wrench_act(mob/living/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(!I.use_tool(src, user, 0))
|
||||
return
|
||||
TOOL_ATTEMPT_DISMANTLE_MESSAGE
|
||||
if(I.use_tool(src, user, 20, volume = I.tool_volume))
|
||||
TOOL_DISMANTLE_SUCCESS_MESSAGE
|
||||
new /obj/item/stack/sheet/metal(drop_location(), 1)
|
||||
deconstruct()
|
||||
|
||||
@@ -390,7 +390,7 @@
|
||||
/obj/structure/table/holotable/wood
|
||||
name = "wooden table"
|
||||
desc = "A square piece of wood standing on four wooden legs. It can not move."
|
||||
icon = 'icons/obj/smooth_structures/wood_table.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/wood_table.dmi'
|
||||
icon_state = "wood_table-0"
|
||||
base_icon_state = "wood_table"
|
||||
smoothing_groups = list(SMOOTH_GROUP_WOOD_TABLES) //Don't smooth with SMOOTH_GROUP_TABLES
|
||||
@@ -408,8 +408,8 @@
|
||||
|
||||
/obj/structure/holowindow
|
||||
name = "reinforced window"
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "rwindow"
|
||||
icon = 'icons/obj/smooth_structures/reinforced_window.dmi'
|
||||
icon_state = "reinforced_window-0"
|
||||
desc = "A window."
|
||||
density = TRUE
|
||||
layer = 3.2//Just above doors
|
||||
|
||||
@@ -144,27 +144,6 @@
|
||||
icon_state = "box_1"
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/screwdriver))
|
||||
var/component_check = 1
|
||||
for(var/R in req_components)
|
||||
if(req_components[R] > 0)
|
||||
component_check = 0
|
||||
break
|
||||
if(component_check)
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc)
|
||||
new_machine.on_construction()
|
||||
for(var/obj/O in new_machine.component_parts)
|
||||
qdel(O)
|
||||
new_machine.component_parts = list()
|
||||
for(var/obj/O in src)
|
||||
O.loc = null
|
||||
new_machine.component_parts += O
|
||||
circuit.loc = null
|
||||
new_machine.RefreshParts()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/storage/part_replacer) && P.contents.len && get_req_components_amt())
|
||||
var/obj/item/storage/part_replacer/replacer = P
|
||||
var/list/added_components = list()
|
||||
@@ -220,6 +199,31 @@
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/constructable_frame/machine_frame/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(state != 3)
|
||||
return
|
||||
|
||||
var/component_check = 1
|
||||
for(var/R in req_components)
|
||||
if(req_components[R] > 0)
|
||||
component_check = 0
|
||||
break
|
||||
if(!component_check)
|
||||
return TRUE
|
||||
I.play_tool_sound(src)
|
||||
var/obj/machinery/new_machine = new circuit.build_path(loc)
|
||||
new_machine.on_construction()
|
||||
for(var/obj/O in new_machine.component_parts)
|
||||
qdel(O)
|
||||
new_machine.component_parts = list()
|
||||
for(var/obj/O in src)
|
||||
O.loc = null
|
||||
new_machine.component_parts += O
|
||||
circuit.loc = null
|
||||
new_machine.RefreshParts()
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
|
||||
//Machine Frame Circuit Boards
|
||||
/*Common Parts: Parts List: Ignitor, Timer, Infra-red laser, Infra-red sensor, t_scanner, Capacitor, Valve, sensor unit,
|
||||
|
||||
@@ -109,16 +109,6 @@
|
||||
anchored = FALSE
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
return
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(!open)
|
||||
if(unlocked)
|
||||
unlocked = FALSE
|
||||
to_chat(user, "You screw the battery panel in place.")
|
||||
else
|
||||
unlocked = TRUE
|
||||
to_chat(user, "You unscrew the battery panel.")
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
return
|
||||
if(istype(W, /obj/item/crowbar))
|
||||
if(unlocked)
|
||||
if(open)
|
||||
@@ -143,6 +133,18 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/floodlight/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(open)
|
||||
return
|
||||
|
||||
if(unlocked)
|
||||
to_chat(user, "You screw the battery panel in place.")
|
||||
else
|
||||
to_chat(user, "You unscrew the battery panel.")
|
||||
unlocked = !unlocked
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/floodlight/extinguish_light()
|
||||
on = FALSE
|
||||
set_light(0)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
return
|
||||
|
||||
var/obj/machinery/mass_driver_frame/F = new (get_turf(src))
|
||||
F.dir = src.dir
|
||||
F.dir = dir
|
||||
F.anchored = TRUE
|
||||
F.build = 4
|
||||
F.update_icon()
|
||||
@@ -150,20 +150,21 @@
|
||||
new /obj/item/stack/rods(loc,2)
|
||||
build--
|
||||
return TRUE
|
||||
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
to_chat(user, "You finalize the Mass Driver...")
|
||||
playsound(get_turf(src), W.usesound, 50, 1)
|
||||
var/obj/machinery/mass_driver/M = new(get_turf(src))
|
||||
M.dir = src.dir
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/mass_driver_frame/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(build != 4)
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You finalize the Mass Driver.</span>")
|
||||
I.play_tool_sound(src)
|
||||
var/obj/machinery/mass_driver/M = new(get_turf(src))
|
||||
M.dir = dir
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/mass_driver_frame/welder_act(mob/user, obj/item/I)
|
||||
if(build != 0 && build != 1 && build != 2)
|
||||
return
|
||||
|
||||
@@ -87,13 +87,6 @@
|
||||
if(T.intact)
|
||||
return // prevent intraction when T-scanner revealed
|
||||
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
open = !open
|
||||
|
||||
user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "<span class='notice'>You [open ? "open" : "close"] the beacon's cover.</span>")
|
||||
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
|
||||
else if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda))
|
||||
if(open)
|
||||
if(allowed(user))
|
||||
@@ -107,6 +100,12 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/navbeacon/screwdriver_act(mob/living/user, obj/item/I)
|
||||
open = !open
|
||||
user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "<span class='notice'>You [open ? "open" : "close"] the beacon's cover.</span>")
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/navbeacon/attack_ai(mob/user)
|
||||
interact(user, 1)
|
||||
|
||||
|
||||
@@ -900,12 +900,8 @@ GLOBAL_LIST_EMPTY(turret_icons)
|
||||
//attack_hand() removes the gun
|
||||
|
||||
if(5)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
playsound(loc, I.usesound, 100, 1)
|
||||
build_step = 6
|
||||
to_chat(user, "<span class='notice'>You close the internal access hatch.</span>")
|
||||
return
|
||||
|
||||
return
|
||||
//screwdriver_act() handles screwing the panel closed
|
||||
//attack_hand() removes the prox sensor
|
||||
|
||||
if(6)
|
||||
@@ -918,12 +914,8 @@ GLOBAL_LIST_EMPTY(turret_icons)
|
||||
to_chat(user, "<span class='warning'>You need two sheets of metal to continue construction.</span>")
|
||||
return
|
||||
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
playsound(loc, I.usesound, 100, 1)
|
||||
build_step = 5
|
||||
to_chat(user, "<span class='notice'>You open the internal access hatch.</span>")
|
||||
return
|
||||
else if(istype(I, /obj/item/crowbar))
|
||||
if(7)
|
||||
if(istype(I, /obj/item/crowbar))
|
||||
playsound(loc, I.usesound, 75, 1)
|
||||
to_chat(user, "<span class='notice'>You pry off the turret's exterior armor.</span>")
|
||||
new /obj/item/stack/sheet/metal(loc, 2)
|
||||
@@ -942,6 +934,20 @@ GLOBAL_LIST_EMPTY(turret_icons)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/porta_turret_construct/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(build_step != 6 && build_step != 5)
|
||||
return
|
||||
|
||||
if(build_step == 5)
|
||||
build_step = 6
|
||||
to_chat(user, "<span class='notice'>You close the internal access hatch.</span>")
|
||||
else
|
||||
build_step = 5
|
||||
to_chat(user, "<span class='notice'>You open the internal access hatch.</span>")
|
||||
|
||||
I.play_tool_sound(src)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/porta_turret_construct/welder_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(build_step == 2)
|
||||
|
||||
@@ -214,3 +214,13 @@ GLOBAL_LIST_EMPTY(status_displays)
|
||||
SD.set_picture(data1)
|
||||
|
||||
SD.update()
|
||||
|
||||
/obj/machinery/status_display/wrench_act(mob/living/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(!I.use_tool(src, user, 0))
|
||||
return
|
||||
TOOL_ATTEMPT_DISMANTLE_MESSAGE
|
||||
if(I.use_tool(src, user, 20, volume = I.tool_volume))
|
||||
TOOL_DISMANTLE_SUCCESS_MESSAGE
|
||||
new /obj/item/stack/sheet/metal(drop_location(), 1)
|
||||
deconstruct()
|
||||
|
||||
@@ -204,9 +204,6 @@
|
||||
icon_state = "wm_[state][panel]"
|
||||
|
||||
/obj/machinery/washing_machine/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
/*if(istype(W,/obj/item/screwdriver))
|
||||
panel = !panel
|
||||
to_chat(user, "<span class='notice'>you [panel ? </span>"open" : "close"] the [src]'s maintenance panel")*/
|
||||
if(default_unfasten_wrench(user, W))
|
||||
power_change()
|
||||
return
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
text_verb = "clean the ooze off"
|
||||
cleanspeed = CMAG_CLEANTIME
|
||||
|
||||
user.visible_message("<span class='warning'>[user] begins to [text_verb] \the [text_targetname][text_description]</span>")
|
||||
user.visible_message("<span class='warning'>[user] begins to [text_verb] \the [text_targetname][text_description]</span>", "<span class='warning'>You begin to [text_verb] \the [text_targetname][text_description]</span>")
|
||||
if(!do_after(user, cleanspeed, target = src))
|
||||
return FALSE
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
if(!cleaner.can_clean())
|
||||
return FALSE
|
||||
|
||||
user.visible_message("<span class='notice'>You [text_verb] \the [text_targetname][text_description]</span>")
|
||||
to_chat(user, "<span class='notice'>You [text_verb] \the [text_targetname][text_description]</span>")
|
||||
|
||||
if(is_cmagged) //If we've cleaned a cmagged object
|
||||
REMOVE_TRAIT(src, TRAIT_CMAGGED, "clown_emag")
|
||||
|
||||
@@ -56,6 +56,12 @@
|
||||
/obj/effect/decal/cleanable/blood/oil/dry()
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil/cooking
|
||||
name = "cooking oil"
|
||||
desc = "It's yellow and greasy. You should dump this down the sink while it's still hot."
|
||||
basecolor = "#fbba16"
|
||||
bloodiness = 0
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil/streak
|
||||
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
|
||||
amount = 2
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
var/max_butts = 0
|
||||
var/icon_half = ""
|
||||
var/icon_full = ""
|
||||
var/material = /obj/item/stack/sheet/metal
|
||||
|
||||
/obj/item/ashtray/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -51,10 +52,6 @@
|
||||
else
|
||||
desc = initial(desc)
|
||||
|
||||
/obj/item/ashtray/deconstruct()
|
||||
empty_tray()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/ashtray/proc/empty_tray()
|
||||
for(var/obj/item/I in contents)
|
||||
I.forceMove(loc)
|
||||
@@ -66,6 +63,14 @@
|
||||
empty_tray()
|
||||
return ..()
|
||||
|
||||
/obj/item/ashtray/wrench_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(!I.use_tool(src, user, volume = I.tool_volume))
|
||||
return
|
||||
empty_tray()
|
||||
new material(drop_location(), 1)
|
||||
deconstruct()
|
||||
|
||||
/obj/item/ashtray/plastic
|
||||
name = "plastic ashtray"
|
||||
desc = "Cheap plastic ashtray."
|
||||
@@ -74,7 +79,7 @@
|
||||
icon_full = "ashtray_full_bl"
|
||||
max_butts = 8
|
||||
max_integrity = 8
|
||||
materials = list(MAT_METAL=30, MAT_GLASS=30)
|
||||
material = /obj/item/stack/sheet/plastic
|
||||
throwforce = 3
|
||||
|
||||
/obj/item/ashtray/bronze
|
||||
@@ -85,7 +90,6 @@
|
||||
icon_full = "ashtray_full_br"
|
||||
max_butts = 16
|
||||
max_integrity = 16
|
||||
materials = list(MAT_METAL=80)
|
||||
throwforce = 10
|
||||
|
||||
/obj/item/ashtray/glass
|
||||
@@ -96,5 +100,5 @@
|
||||
icon_full = "ashtray_full_gl"
|
||||
max_butts = 12
|
||||
max_integrity = 12
|
||||
materials = list(MAT_GLASS=60)
|
||||
material = /obj/item/stack/sheet/glass
|
||||
throwforce = 6
|
||||
|
||||
@@ -33,13 +33,6 @@
|
||||
|
||||
/obj/item/flash/attackby(obj/item/I, mob/user, params)
|
||||
if(can_overcharge)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(battery_panel)
|
||||
to_chat(user, "<span class='notice'>You close the battery compartment on [src].</span>")
|
||||
battery_panel = FALSE
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You open the battery compartment on [src].</span>")
|
||||
battery_panel = TRUE
|
||||
if(battery_panel && !overcharged)
|
||||
if(istype(I, /obj/item/stock_parts/cell))
|
||||
to_chat(user, "<span class='notice'>You jam [I] into the battery compartment on [src].</span>")
|
||||
@@ -47,6 +40,17 @@
|
||||
overcharged = TRUE
|
||||
add_overlay("overcharge")
|
||||
|
||||
/obj/item/flash/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!can_overcharge)
|
||||
return
|
||||
|
||||
if(battery_panel)
|
||||
to_chat(user, "<span class='notice'>You close the battery compartment on [src].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You open the battery compartment on [src].</span>")
|
||||
battery_panel = !battery_panel
|
||||
return TRUE
|
||||
|
||||
/obj/item/flash/random/New()
|
||||
..()
|
||||
if(prob(25))
|
||||
|
||||
@@ -56,14 +56,14 @@
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] already has a cell.</span>")
|
||||
|
||||
else if(istype(W, /obj/item/screwdriver))
|
||||
if(diode)
|
||||
to_chat(user, "<span class='notice'>You remove [diode] from [src].</span>")
|
||||
diode.loc = get_turf(src.loc)
|
||||
diode = null
|
||||
return
|
||||
..()
|
||||
return
|
||||
/obj/item/laser_pointer/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!diode)
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You remove [diode] from [src].</span>")
|
||||
diode.forceMove(get_turf(loc))
|
||||
diode = null
|
||||
return TRUE
|
||||
|
||||
/obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params)
|
||||
if(flag) //we're placing the object on a table or in backpack
|
||||
|
||||
@@ -98,16 +98,21 @@
|
||||
cell = W
|
||||
to_chat(user, "<span class='notice'>You install a cell in [src].</span>")
|
||||
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(cell)
|
||||
cell.update_icon()
|
||||
cell.loc = get_turf(loc)
|
||||
cell = null
|
||||
to_chat(user, "<span class='notice'>You remove the cell from [src].</span>")
|
||||
|
||||
update_icon(UPDATE_OVERLAYS)
|
||||
return
|
||||
|
||||
/obj/item/defibrillator/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!cell)
|
||||
to_chat(user, "<span class='notice'>[src] doesn't have a cell.</span>")
|
||||
return
|
||||
|
||||
cell.update_icon()
|
||||
cell.forceMove(get_turf(loc))
|
||||
cell = null
|
||||
to_chat(user, "<span class='notice'>You remove the cell from [src].</span>")
|
||||
update_icon(UPDATE_OVERLAYS)
|
||||
return TRUE
|
||||
|
||||
/obj/item/defibrillator/emag_act(user as mob)
|
||||
if(safety)
|
||||
safety = FALSE
|
||||
|
||||
@@ -25,8 +25,6 @@
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(x, pick(NORTH,SOUTH,EAST,WEST))
|
||||
|
||||
|
||||
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -34,26 +32,38 @@
|
||||
name = "bananium casing"
|
||||
desc = "A grenade casing made of bananium."
|
||||
icon_state = "banana_casing"
|
||||
var/fillamt = 0
|
||||
deliveryamt = 0
|
||||
|
||||
/obj/item/grenade/bananade/casing/attack_hand()
|
||||
return // No activating an empty grenade
|
||||
|
||||
/obj/item/grenade/bananade/casing/attackby(obj/item/I, mob/user as mob, params)
|
||||
/obj/item/grenade/bananade/casing/attack_self()
|
||||
return // Stop trying to break stuff
|
||||
|
||||
/obj/item/grenade/bananade/casing/prime()
|
||||
return // The grenade isnt completed yet, dont even try to blow it up
|
||||
|
||||
/obj/item/grenade/bananade/casing/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/grown/bananapeel))
|
||||
if(fillamt < 9)
|
||||
to_chat(usr, "<span class='notice'>You add another banana peel to the assembly.</span>")
|
||||
fillamt += 1
|
||||
if(deliveryamt < 9)
|
||||
to_chat(user, "<span class='notice'>You add another banana peel to the assembly.</span>")
|
||||
deliveryamt += 1
|
||||
qdel(I)
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>The bananade is full, screwdriver it shut to lock it down.</span>")
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(fillamt)
|
||||
var/obj/item/grenade/bananade/G = new /obj/item/grenade/bananade
|
||||
user.unEquip(src)
|
||||
user.put_in_hands(G)
|
||||
G.deliveryamt = src.fillamt
|
||||
to_chat(user, "<span class='notice'>You lock the assembly shut, readying it for HONK.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You need to add banana peels before you can ready the grenade!.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>Only banana peels fit in this assembly, up to 9.</span>")
|
||||
to_chat(user, "<span class='notice'>The bananade is full, screwdriver it shut to ready it.</span>")
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/grenade/bananade/casing/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!deliveryamt)
|
||||
to_chat(user, "<span class='notice'>You need to add banana peels before you can ready the grenade!</span>")
|
||||
return TRUE
|
||||
|
||||
var/obj/item/grenade/bananade/G = new /obj/item/grenade/bananade
|
||||
user.unEquip(src)
|
||||
user.put_in_hands(G)
|
||||
G.deliveryamt = deliveryamt
|
||||
to_chat(user, "<span class='notice'>You lock the assembly shut, readying it for HONK.</span>")
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
else
|
||||
icon_state += "_locked"
|
||||
name = payload_name + "grenade" + label
|
||||
|
||||
|
||||
underlays.Cut()
|
||||
if(nadeassembly)
|
||||
underlays += "[nadeassembly.a_left.icon_state]_left"
|
||||
@@ -133,38 +133,6 @@
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
to_chat(user, "You remove the label from [src].")
|
||||
return 1
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(stage == WIRED)
|
||||
if(beakers.len)
|
||||
to_chat(user, "<span class='notice'>You lock the assembly.</span>")
|
||||
playsound(loc, prime_sound, 25, -3)
|
||||
stage = READY
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
contained = ""
|
||||
cores = "" // clear them out so no recursive logging by accidentally
|
||||
for(var/obj/O in beakers)
|
||||
if(!O.reagents) continue
|
||||
if(istype(O,/obj/item/slime_extract))
|
||||
cores += " [O]"
|
||||
for(var/R in O.reagents.reagent_list)
|
||||
var/datum/reagent/reagent = R
|
||||
contained += "[reagent.volume] [reagent], "
|
||||
if(contained)
|
||||
if(cores)
|
||||
contained = "\[[cores]; [contained]\]"
|
||||
else
|
||||
contained = "\[ [contained]\]"
|
||||
var/turf/bombturf = get_turf(loc)
|
||||
add_attack_logs(user, src, "has completed with [contained]", ATKLOG_MOST)
|
||||
log_game("[key_name(usr)] has completed [name] at [bombturf.x], [bombturf.y], [bombturf.z]. [contained]")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You need to add at least one beaker before locking the assembly.</span>")
|
||||
else if(stage == READY && !nadeassembly)
|
||||
det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50
|
||||
to_chat(user, "<span class='notice'>You modify the time delay. It's set for [det_time / 10] second\s.</span>")
|
||||
else if(stage == EMPTY)
|
||||
to_chat(user, "<span class='notice'>You need to add an activation mechanism.</span>")
|
||||
|
||||
else if(stage == WIRED && is_type_in_list(I, allowed_containers))
|
||||
if(beakers.len == 2)
|
||||
to_chat(user, "<span class='notice'>[src] can not hold more containers.</span>")
|
||||
@@ -222,6 +190,44 @@
|
||||
beakers = list()
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
|
||||
/obj/item/grenade/chem_grenade/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(stage == WIRED)
|
||||
if(!length(beakers))
|
||||
to_chat(user, "<span class='notice'>You need to add at least one beaker before locking the assembly.</span>")
|
||||
return TRUE
|
||||
|
||||
to_chat(user, "<span class='notice'>You lock the assembly.</span>")
|
||||
playsound(loc, prime_sound, 25, -3)
|
||||
stage = READY
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
contained = ""
|
||||
cores = "" // clear them out so no recursive logging by accidentally
|
||||
for(var/obj/O in beakers)
|
||||
if(!O.reagents)
|
||||
continue
|
||||
if(istype(O, /obj/item/slime_extract))
|
||||
cores += " [O]"
|
||||
for(var/R in O.reagents.reagent_list)
|
||||
var/datum/reagent/reagent = R
|
||||
contained += "[reagent.volume] [reagent], "
|
||||
if(contained)
|
||||
if(cores)
|
||||
contained = "\[[cores]; [contained]\]"
|
||||
else
|
||||
contained = "\[ [contained]\]"
|
||||
var/turf/bombturf = get_turf(loc)
|
||||
add_attack_logs(user, src, "has completed with [contained]", ATKLOG_MOST)
|
||||
log_game("[key_name(usr)] has completed [name] at [bombturf.x], [bombturf.y], [bombturf.z]. [contained]")
|
||||
return TRUE
|
||||
|
||||
else if(stage == READY && !nadeassembly)
|
||||
det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50
|
||||
to_chat(user, "<span class='notice'>You modify the time delay. It's set for [det_time / 10] second\s.</span>")
|
||||
return TRUE
|
||||
|
||||
else if(stage == EMPTY)
|
||||
to_chat(user, "<span class='notice'>You need to add an activation mechanism.</span>")
|
||||
return TRUE
|
||||
|
||||
//assembly stuff
|
||||
/obj/item/grenade/chem_grenade/receive_signal()
|
||||
|
||||
@@ -88,24 +88,22 @@
|
||||
var/mob/M = loc
|
||||
M.unEquip(src)
|
||||
|
||||
|
||||
/obj/item/grenade/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
switch(det_time)
|
||||
if("1")
|
||||
det_time = 10
|
||||
to_chat(user, "<span class='notice'>You set [src] for 1 second detonation time.</span>")
|
||||
if("10")
|
||||
det_time = 30
|
||||
to_chat(user, "<span class='notice'>You set [src] for 3 second detonation time.</span>")
|
||||
if("30")
|
||||
det_time = 50
|
||||
to_chat(user, "<span class='notice'>You set [src] for 5 second detonation time.</span>")
|
||||
if("50")
|
||||
det_time = 1
|
||||
to_chat(user, "<span class='notice'>You set [src] for instant detonation.</span>")
|
||||
add_fingerprint(user)
|
||||
..()
|
||||
/obj/item/grenade/screwdriver_act(mob/living/user, obj/item/I)
|
||||
switch(det_time)
|
||||
if(1)
|
||||
det_time = 10
|
||||
to_chat(user, "<span class='notice'>You set [src] for 1 second detonation time.</span>")
|
||||
if(10)
|
||||
det_time = 30
|
||||
to_chat(user, "<span class='notice'>You set [src] for 3 second detonation time.</span>")
|
||||
if(30)
|
||||
det_time = 50
|
||||
to_chat(user, "<span class='notice'>You set [src] for 5 second detonation time.</span>")
|
||||
if(50)
|
||||
det_time = 1
|
||||
to_chat(user, "<span class='notice'>You set [src] for instant detonation.</span>")
|
||||
add_fingerprint(user)
|
||||
return TRUE
|
||||
|
||||
/obj/item/grenade/attack_hand()
|
||||
walk(src, null, null)
|
||||
|
||||
@@ -62,6 +62,8 @@
|
||||
implant_data = new implant_data
|
||||
|
||||
/obj/item/implant/Destroy()
|
||||
if(imp_in)
|
||||
removed(imp_in)
|
||||
QDEL_NULL(implant_data)
|
||||
return ..()
|
||||
|
||||
@@ -222,11 +224,6 @@
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/item/implant/Destroy()
|
||||
if(imp_in)
|
||||
removed(imp_in)
|
||||
return ..()
|
||||
|
||||
/obj/item/implant/dropped(mob/user)
|
||||
. = TRUE
|
||||
..()
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
/obj/item/implant/dust
|
||||
name = "duster bio-chip"
|
||||
desc = "A remote controlled bio-chip that will dust the user upon activation (or death of user)."
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "remains"
|
||||
icon = 'icons/obj/implants.dmi'
|
||||
icon_state = "dust"
|
||||
actions_types = list(/datum/action/item_action/hands_free/activate/always)
|
||||
trigger_causes = BIOCHIP_TRIGGER_DEATH_ONCE | BIOCHIP_TRIGGER_NOT_WHEN_GIBBED
|
||||
implant_data = /datum/implant_fluff/dust
|
||||
|
||||
@@ -12,10 +12,12 @@
|
||||
materials = list(MAT_GLASS = 500)
|
||||
|
||||
var/obj/item/implant/imp
|
||||
var/implant_type = /obj/item/implant
|
||||
var/obj/item/implant/implant_type
|
||||
|
||||
/obj/item/implantcase/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!implant_type)
|
||||
return
|
||||
imp = new implant_type(src)
|
||||
update_state()
|
||||
|
||||
|
||||
@@ -67,26 +67,29 @@
|
||||
return
|
||||
sig = I
|
||||
if(sig.secured)
|
||||
to_chat(user, "<span class='notice'>The signaler is secured.</span>")
|
||||
to_chat(user, "<span class='warning'>The signaler is secured.</span>")
|
||||
sig = null
|
||||
return
|
||||
user.drop_item()
|
||||
I.forceMove(src)
|
||||
to_chat(user, "<span class='notice'>You sneak [sig] underneath the pressure plate and connect the trigger wire.</span>")
|
||||
desc = "A trap used to catch bears and other legged creatures. <span class='warning'>There is a remote signaler hooked up to it.</span>"
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(IED)
|
||||
IED.forceMove(get_turf(src))
|
||||
IED = null
|
||||
to_chat(user, "<span class='notice'>You remove the IED from [src].</span>")
|
||||
return
|
||||
if(sig)
|
||||
sig.forceMove(get_turf(src))
|
||||
sig = null
|
||||
to_chat(user, "<span class='notice'>You remove the signaler from [src].</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!IED && !sig)
|
||||
return
|
||||
|
||||
if(IED)
|
||||
IED.forceMove(get_turf(src))
|
||||
IED = null
|
||||
to_chat(user, "<span class='notice'>You remove the IED from [src].</span>")
|
||||
if(sig)
|
||||
sig.forceMove(get_turf(src))
|
||||
sig = null
|
||||
to_chat(user, "<span class='notice'>You remove the signaler from [src].</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/Crossed(AM as mob|obj, oldloc)
|
||||
if(armed && isturf(src.loc))
|
||||
if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/hostile/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
|
||||
|
||||
@@ -53,9 +53,6 @@
|
||||
pressureSetting = 1
|
||||
to_chat(user, "<span class='notice'>You tweak \the [src]'s pressure output to [pressureSetting].</span>")
|
||||
return
|
||||
if(istype(W, /obj/item/screwdriver) && tank)
|
||||
updateTank(tank, 1, user)
|
||||
return
|
||||
if(loadedWeightClass >= maxWeightClass)
|
||||
to_chat(user, "<span class='warning'>\The [src] can't hold any more items!</span>")
|
||||
return
|
||||
@@ -78,6 +75,12 @@
|
||||
IW.loc = src
|
||||
return
|
||||
|
||||
/obj/item/pneumatic_cannon/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!tank)
|
||||
return
|
||||
|
||||
updateTank(tank, 1, user)
|
||||
return TRUE
|
||||
|
||||
/obj/item/pneumatic_cannon/afterattack(atom/target, mob/living/carbon/human/user, flag, params)
|
||||
if(istype(target, /obj/item/storage)) //So you can store it in backpacks
|
||||
|
||||
@@ -288,6 +288,11 @@
|
||||
|
||||
T.rpd_act(user, src)
|
||||
|
||||
/obj/item/rpd/attack_obj(obj/O, mob/living/user)
|
||||
if(istype(O, /obj/machinery/atmospherics/pipe) && user.a_intent != INTENT_HARM)
|
||||
return
|
||||
return ..()
|
||||
|
||||
#undef RPD_COOLDOWN_TIME
|
||||
#undef RPD_WALLBUILD_TIME
|
||||
#undef RPD_MENU_ROTATE
|
||||
|
||||
@@ -25,9 +25,7 @@
|
||||
"<span class='danger'>[user] is slitting [user.p_their()] throat with [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>"))
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/shard/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/caltrop, force)
|
||||
/obj/item/shard/proc/set_initial_icon_state()
|
||||
icon_state = pick("large", "medium", "small")
|
||||
switch(icon_state)
|
||||
if("small")
|
||||
@@ -42,6 +40,11 @@
|
||||
if(icon_prefix)
|
||||
icon_state = "[icon_prefix][icon_state]"
|
||||
|
||||
/obj/item/shard/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/caltrop, force)
|
||||
set_initial_icon_state()
|
||||
|
||||
/obj/item/shard/afterattack(atom/movable/AM, mob/user, proximity)
|
||||
if(!proximity || !(src in user))
|
||||
return
|
||||
|
||||
@@ -40,12 +40,6 @@
|
||||
if((istype(W, /obj/item/melee/energy/blade)) && (!emagged))
|
||||
emag_act(user, W)
|
||||
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(do_after(user, 20 * W.toolspeed, target = src))
|
||||
open = !open
|
||||
user.show_message("<span class='notice'>You [open ? "open" : "close"] the service panel.</span>", 1)
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/multitool) && open && !l_hacking)
|
||||
user.show_message("<span class='danger'>Now attempting to reset internal memory, please hold.</span>", 1)
|
||||
l_hacking = TRUE
|
||||
@@ -69,6 +63,12 @@
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/secure/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(do_after(user, 20 * I.toolspeed, target = src))
|
||||
open = !open
|
||||
user.visible_message("<span class='notice'>[user] [open ? "opens" : "closes"] the service panel on [src].</span>", "<span class='notice'>You [open ? "open" : "close"] the service panel.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/storage/secure/emag_act(user as mob, weapon as obj)
|
||||
if(!emagged)
|
||||
emagged = TRUE
|
||||
|
||||
@@ -89,22 +89,6 @@
|
||||
pick_sign()
|
||||
|
||||
/obj/structure/sign/barsign/attackby(obj/item/I, mob/user)
|
||||
if( istype(I, /obj/item/screwdriver))
|
||||
if(!panel_open)
|
||||
to_chat(user, "<span class='notice'>You open the maintenance panel.</span>")
|
||||
set_sign(new /datum/barsign/hiddensigns/signoff)
|
||||
panel_open = TRUE
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You close the maintenance panel.</span>")
|
||||
if(!broken && !emagged)
|
||||
set_sign(prev_sign)
|
||||
set_light(1, LIGHTING_MINIMUM_POWER)
|
||||
else if(emagged)
|
||||
set_sign(new /datum/barsign/hiddensigns/syndibarsign)
|
||||
else
|
||||
set_sign(new /datum/barsign/hiddensigns/empbarsign)
|
||||
panel_open = FALSE
|
||||
|
||||
if(istype(I, /obj/item/stack/cable_coil) && panel_open)
|
||||
var/obj/item/stack/cable_coil/C = I
|
||||
if(emagged) //Emagged, not broken by EMP
|
||||
@@ -122,6 +106,23 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/sign/barsign/screwdriver_act(mob/user, obj/item/I)
|
||||
if(!panel_open)
|
||||
to_chat(user, "<span class='notice'>You open the maintenance panel.</span>")
|
||||
prev_sign = current_sign
|
||||
set_sign(new /datum/barsign/hiddensigns/signoff)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You close the maintenance panel.</span>")
|
||||
if(!broken && !emagged)
|
||||
set_sign(prev_sign)
|
||||
set_light(1, LIGHTING_MINIMUM_POWER)
|
||||
else if(emagged)
|
||||
set_sign(new /datum/barsign/hiddensigns/syndibarsign)
|
||||
else
|
||||
set_sign(new /datum/barsign/hiddensigns/empbarsign)
|
||||
panel_open = !panel_open
|
||||
return TRUE
|
||||
|
||||
/obj/structure/sign/barsign/emp_act(severity)
|
||||
set_sign(new /datum/barsign/hiddensigns/empbarsign)
|
||||
broken = TRUE
|
||||
|
||||
@@ -305,6 +305,11 @@ LINEN BINS
|
||||
extinguish()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/bedsheetbin/wrench_act(mob/user, obj/item/I)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
default_unfasten_wrench(user, I, time = 20)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/bedsheetbin/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/bedsheet))
|
||||
if(!user.drop_item())
|
||||
|
||||
@@ -282,8 +282,7 @@
|
||||
// tk grab then use on self
|
||||
/obj/structure/closet/attack_self_tk(mob/user)
|
||||
add_fingerprint(user)
|
||||
if(!toggle())
|
||||
to_chat(usr, "<span class='notice'>It won't budge!</span>")
|
||||
toggle(user)
|
||||
|
||||
/obj/structure/closet/verb/verb_toggleopen()
|
||||
set src in oview(1)
|
||||
|
||||
@@ -113,23 +113,28 @@
|
||||
to_chat(user, "<span class='warning'>You must wait until the door has stopped moving.</span>")
|
||||
return
|
||||
|
||||
if(density)
|
||||
var/turf/T = get_turf(src)
|
||||
if(T.density)
|
||||
to_chat(user, "<span class='warning'>[src] is blocked!</span>")
|
||||
return
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(!istype(T, /turf/simulated/floor))
|
||||
to_chat(user, "<span class='warning'>[src] bolts must be tightened on the floor!</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] tightens some bolts on the wall.</span>", "<span class='warning'>You tighten the bolts on the wall.</span>")
|
||||
ChangeToWall()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't reach, close it first!</span>")
|
||||
|
||||
if(istype(W, /obj/item/gun/energy/plasmacutter) || istype(W, /obj/item/pickaxe/drill/diamonddrill) || istype(W, /obj/item/pickaxe/drill/jackhammer) || istype(W, /obj/item/melee/energy/blade) || istype(W, /obj/item/twohanded/required/pyro_claws))
|
||||
dismantle(user, TRUE)
|
||||
|
||||
/obj/structure/falsewall/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(opening)
|
||||
to_chat(user, "<span class='warning'>You must wait until the door has stopped moving.</span>")
|
||||
return TRUE
|
||||
if(!density)
|
||||
to_chat(user, "<span class='warning'>You can't reach, close it first!</span>")
|
||||
return TRUE
|
||||
var/turf/T = get_turf(src)
|
||||
if(T.density)
|
||||
to_chat(user, "<span class='warning'>[src] is blocked!</span>")
|
||||
return TRUE
|
||||
|
||||
if(!istype(T, /turf/simulated/floor))
|
||||
to_chat(user, "<span class='warning'>[src] bolts must be tightened on the floor!</span>")
|
||||
return TRUE
|
||||
user.visible_message("<span class='notice'>[user] tightens some bolts on the wall.</span>", "<span class='warning'>You tighten the bolts on the wall.</span>")
|
||||
ChangeToWall()
|
||||
return TRUE
|
||||
|
||||
/obj/structure/falsewall/welder_act(mob/user, obj/item/I)
|
||||
if(!density)
|
||||
return
|
||||
|
||||
@@ -59,32 +59,34 @@
|
||||
resistance_flags = FLAMMABLE
|
||||
var/sign_state = ""
|
||||
|
||||
/obj/item/sign/attackby(obj/item/tool as obj, mob/user as mob) //construction
|
||||
if(istype(tool, /obj/item/screwdriver) && isturf(user.loc))
|
||||
var/direction = input("In which direction?", "Select direction.") in list("North", "East", "South", "West", "Cancel")
|
||||
if(direction == "Cancel")
|
||||
return
|
||||
if(QDELETED(src))
|
||||
return
|
||||
var/obj/structure/sign/S = new(user.loc)
|
||||
switch(direction)
|
||||
if("North")
|
||||
S.pixel_y = 32
|
||||
if("East")
|
||||
S.pixel_x = 32
|
||||
if("South")
|
||||
S.pixel_y = -32
|
||||
if("West")
|
||||
S.pixel_x = -32
|
||||
else
|
||||
return
|
||||
S.name = name
|
||||
S.desc = desc
|
||||
S.icon_state = sign_state
|
||||
to_chat(user, "You fasten \the [S] with your [tool].")
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
/obj/item/sign/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!isturf(user.loc)) // Why does this use user? This should just be loc.
|
||||
return
|
||||
|
||||
var/direction = input("In which direction?", "Select direction.") in list("North", "East", "South", "West", "Cancel")
|
||||
if(direction == "Cancel")
|
||||
return TRUE // These gotta be true or we stab the sign
|
||||
if(QDELETED(src))
|
||||
return TRUE // Unsure about this, but stabbing something that doesnt exist seems like a bad idea
|
||||
|
||||
var/obj/structure/sign/S = new(user.loc) //This is really awkward to use user.loc
|
||||
switch(direction)
|
||||
if("North")
|
||||
S.pixel_y = 32
|
||||
if("East")
|
||||
S.pixel_x = 32
|
||||
if("South")
|
||||
S.pixel_y = -32
|
||||
if("West")
|
||||
S.pixel_x = -32
|
||||
else
|
||||
return TRUE // We dont want to stab it or place it, so we return
|
||||
S.name = name
|
||||
S.desc = desc
|
||||
S.icon_state = sign_state
|
||||
to_chat(user, "<span class='notice'>You fasten [S] with your [I].</span>")
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/sign/double/map
|
||||
name = "station map"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
/obj/structure/table
|
||||
name = "table"
|
||||
desc = "A square piece of metal standing on four metal legs. It can not move."
|
||||
icon = 'icons/obj/smooth_structures/table.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/table.dmi'
|
||||
icon_state = "table-0"
|
||||
base_icon_state = "table"
|
||||
density = TRUE
|
||||
@@ -399,7 +399,7 @@
|
||||
/obj/structure/table/glass
|
||||
name = "glass table"
|
||||
desc = "Looks fragile. You should totally flip it. It is begging for it."
|
||||
icon = 'icons/obj/smooth_structures/glass_table.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/glass_table.dmi'
|
||||
icon_state = "glass_table-0"
|
||||
base_icon_state = "glass_table"
|
||||
buildstack = /obj/item/stack/sheet/glass
|
||||
@@ -409,11 +409,12 @@
|
||||
resistance_flags = ACID_PROOF
|
||||
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100)
|
||||
var/list/debris = list()
|
||||
var/shardtype = /obj/item/shard
|
||||
|
||||
/obj/structure/table/glass/Initialize(mapload)
|
||||
. = ..()
|
||||
debris += new frame
|
||||
debris += new /obj/item/shard
|
||||
debris += new shardtype
|
||||
|
||||
/obj/structure/table/glass/Destroy()
|
||||
for(var/i in debris)
|
||||
@@ -490,13 +491,90 @@
|
||||
for(var/obj/item/shard/S in debris)
|
||||
S.color = NARSIE_WINDOW_COLOUR
|
||||
|
||||
/obj/structure/table/glass/plasma
|
||||
name = "plasma glass table"
|
||||
desc = "A table made from the blood, sweat, and tears of miners."
|
||||
icon = 'icons/obj/smooth_structures/tables/plasmaglass_table.dmi'
|
||||
icon_state = "plasmaglass_table-0"
|
||||
base_icon_state = "plasmaglass_table"
|
||||
buildstack = /obj/item/stack/sheet/plasmaglass
|
||||
max_integrity = 140
|
||||
shardtype = /obj/item/shard/plasma
|
||||
|
||||
/obj/structure/table/glass/reinforced
|
||||
name = "reinforced glass table"
|
||||
desc = "Looks robust. You should totally flip it. It is begging for it."
|
||||
icon = 'icons/obj/smooth_structures/tables/rglass_table.dmi'
|
||||
icon_state = "rglass_table-0"
|
||||
base_icon_state = "rglass_table"
|
||||
buildstack = /obj/item/stack/sheet/rglass
|
||||
max_integrity = 100
|
||||
integrity_failure = 50
|
||||
deconstruction_ready = FALSE
|
||||
armor = list(MELEE = 10, BULLET = 30, LASER = 30, ENERGY = 100, BOMB = 20, BIO = 0, RAD = 0, FIRE = 80, ACID = 70)
|
||||
smoothing_groups = list(SMOOTH_GROUP_REINFORCED_TABLES)
|
||||
canSmoothWith = list(SMOOTH_GROUP_REINFORCED_TABLES)
|
||||
|
||||
/obj/structure/table/reinforced/deconstruction_hints(mob/user) //look, it was either copy paste these 3 procs, or copy paste all of the glass stuff
|
||||
if(deconstruction_ready)
|
||||
to_chat(user, "<span class='notice'>The top cover has been <i>welded</i> loose and the main frame's <b>bolts</b> are exposed.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The top cover is firmly <b>welded</b> on.</span>")
|
||||
|
||||
/obj/structure/table/reinforced/flip(direction)
|
||||
if(!deconstruction_ready)
|
||||
return FALSE
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/table/reinforced/welder_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(!I.tool_use_check(user, 0))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start [deconstruction_ready ? "strengthening" : "weakening"] the reinforced table...</span>")
|
||||
if(I.use_tool(src, user, 50, volume = I.tool_volume))
|
||||
to_chat(user, "<span class='notice'>You [deconstruction_ready ? "strengthen" : "weaken"] the table.</span>")
|
||||
deconstruction_ready = !deconstruction_ready
|
||||
|
||||
/obj/structure/table/glass/reinforced/check_break(mob/living/M)
|
||||
if(has_gravity(M) && M.mob_size > MOB_SIZE_SMALL && (obj_integrity < (max_integrity / 2))) //big tables for big boys, only breaks under 50% hp
|
||||
table_shatter(M)
|
||||
|
||||
/obj/structure/table/glass/reinforced/plasma
|
||||
name = "reinforced plasma glass table"
|
||||
desc = "Seems a bit overkill for a table."
|
||||
icon = 'icons/obj/smooth_structures/tables/rplasmaglass_table.dmi'
|
||||
icon_state = "rplasmaglass_table-0"
|
||||
base_icon_state = "rplasmaglass_table"
|
||||
buildstack = /obj/item/stack/sheet/plasmarglass
|
||||
max_integrity = 180
|
||||
shardtype = /obj/item/shard/plasma
|
||||
|
||||
/obj/structure/table/glass/reinforced/titanium
|
||||
name = "reinforced titanium glass table"
|
||||
desc = "A very sleek looking glass table, neat!"
|
||||
icon = 'icons/obj/smooth_structures/tables/titaniumglass_table.dmi'
|
||||
icon_state = "titaniumglass_table-0"
|
||||
base_icon_state = "titaniumglass_table"
|
||||
buildstack = /obj/item/stack/sheet/titaniumglass
|
||||
max_integrity = 180
|
||||
|
||||
/obj/structure/table/glass/reinforced/plastitanium
|
||||
name = "reinforced plastitanium glass table"
|
||||
desc = "The mother of all glass tables."
|
||||
icon = 'icons/obj/smooth_structures/tables/plastitaniumglass_table.dmi'
|
||||
icon_state = "plastitaniumglass_table-0"
|
||||
base_icon_state = "plastitaniumglass_table"
|
||||
buildstack = /obj/item/stack/sheet/plastitaniumglass
|
||||
max_integrity = 200
|
||||
|
||||
/*
|
||||
* Wooden tables
|
||||
*/
|
||||
/obj/structure/table/wood
|
||||
name = "wooden table"
|
||||
desc = "Do not apply fire to this. Rumour says it burns easily."
|
||||
icon = 'icons/obj/smooth_structures/wood_table.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/wood_table.dmi'
|
||||
icon_state = "wood_table-0"
|
||||
base_icon_state = "wood_table"
|
||||
frame = /obj/structure/table_frame/wood
|
||||
@@ -514,7 +592,7 @@
|
||||
/obj/structure/table/wood/poker //No specialties, Just a mapping object.
|
||||
name = "gambling table"
|
||||
desc = "A seedy table for seedy dealings in seedy places."
|
||||
icon = 'icons/obj/smooth_structures/poker_table.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/poker_table.dmi'
|
||||
icon_state = "poker_table-0"
|
||||
base_icon_state = "poker_table"
|
||||
buildstack = /obj/item/stack/tile/carpet
|
||||
@@ -529,7 +607,7 @@
|
||||
/obj/structure/table/wood/fancy
|
||||
name = "fancy table"
|
||||
desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth."
|
||||
icon = 'icons/obj/smooth_structures/fancy_table.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/fancy/fancy_table.dmi'
|
||||
icon_state = "fancy_table-0"
|
||||
base_icon_state = "fancy_table"
|
||||
frame = /obj/structure/table_frame
|
||||
@@ -549,57 +627,57 @@
|
||||
icon_state = "fancy_table_black-0"
|
||||
base_icon_state = "fancy_table_black"
|
||||
buildstack = /obj/item/stack/tile/carpet/black
|
||||
icon = 'icons/obj/smooth_structures/fancy_table_black.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/fancy/fancy_table_black.dmi'
|
||||
|
||||
|
||||
/obj/structure/table/wood/fancy/blue
|
||||
icon_state = "fancy_table_blue-0"
|
||||
base_icon_state = "fancy_table_blue"
|
||||
buildstack = /obj/item/stack/tile/carpet/blue
|
||||
icon = 'icons/obj/smooth_structures/fancy_table_blue.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/fancy/fancy_table_blue.dmi'
|
||||
|
||||
/obj/structure/table/wood/fancy/cyan
|
||||
icon_state = "fancy_table_cyan-0"
|
||||
base_icon_state = "fancy_table_cyan"
|
||||
buildstack = /obj/item/stack/tile/carpet/cyan
|
||||
icon = 'icons/obj/smooth_structures/fancy_table_cyan.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/fancy/fancy_table_cyan.dmi'
|
||||
|
||||
/obj/structure/table/wood/fancy/green
|
||||
icon_state = "fancy_table_green-0"
|
||||
base_icon_state = "fancy_table_green"
|
||||
buildstack = /obj/item/stack/tile/carpet/green
|
||||
icon = 'icons/obj/smooth_structures/fancy_table_green.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/fancy/fancy_table_green.dmi'
|
||||
|
||||
/obj/structure/table/wood/fancy/orange
|
||||
icon_state = "fancy_table_orange-0"
|
||||
base_icon_state = "fancy_table_orange"
|
||||
buildstack = /obj/item/stack/tile/carpet/orange
|
||||
icon = 'icons/obj/smooth_structures/fancy_table_orange.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/fancy/fancy_table_orange.dmi'
|
||||
|
||||
/obj/structure/table/wood/fancy/purple
|
||||
icon_state = "fancy_table_purple-0"
|
||||
base_icon_state = "fancy_table_purple"
|
||||
buildstack = /obj/item/stack/tile/carpet/purple
|
||||
icon = 'icons/obj/smooth_structures/fancy_table_purple.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/fancy/fancy_table_purple.dmi'
|
||||
|
||||
/obj/structure/table/wood/fancy/red
|
||||
icon_state = "fancy_table_red-0"
|
||||
base_icon_state = "fancy_table_red"
|
||||
buildstack = /obj/item/stack/tile/carpet/red
|
||||
icon = 'icons/obj/smooth_structures/fancy_table_red.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/fancy/fancy_table_red.dmi'
|
||||
|
||||
/obj/structure/table/wood/fancy/royalblack
|
||||
icon_state = "fancy_table_royalblack-0"
|
||||
base_icon_state = "fancy_table_royalblack"
|
||||
buildstack = /obj/item/stack/tile/carpet/royalblack
|
||||
icon = 'icons/obj/smooth_structures/fancy_table_royalblack.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/fancy/fancy_table_royalblack.dmi'
|
||||
|
||||
|
||||
/obj/structure/table/wood/fancy/royalblue
|
||||
icon_state = "fancy_table_royalblue-0"
|
||||
base_icon_state = "fancy_table_royalblue"
|
||||
buildstack = /obj/item/stack/tile/carpet/royalblue
|
||||
icon = 'icons/obj/smooth_structures/fancy_table_royalblue.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/fancy/fancy_table_royalblue.dmi'
|
||||
|
||||
/*
|
||||
* Reinforced tables
|
||||
@@ -607,12 +685,13 @@
|
||||
/obj/structure/table/reinforced
|
||||
name = "reinforced table"
|
||||
desc = "A reinforced version of the four legged table."
|
||||
icon = 'icons/obj/smooth_structures/reinforced_table.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/reinforced_table.dmi'
|
||||
icon_state = "reinforced_table-0"
|
||||
base_icon_state = "reinforced_table"
|
||||
deconstruction_ready = FALSE
|
||||
buildstack = /obj/item/stack/sheet/plasteel
|
||||
canSmoothWith = list(SMOOTH_GROUP_TABLES)
|
||||
smoothing_groups = list(SMOOTH_GROUP_REINFORCED_TABLES)
|
||||
canSmoothWith = list(SMOOTH_GROUP_REINFORCED_TABLES)
|
||||
max_integrity = 200
|
||||
integrity_failure = 50
|
||||
armor = list(MELEE = 10, BULLET = 30, LASER = 30, ENERGY = 100, BOMB = 20, BIO = 0, RAD = 0, FIRE = 80, ACID = 70)
|
||||
@@ -641,7 +720,7 @@
|
||||
/obj/structure/table/reinforced/brass
|
||||
name = "brass table"
|
||||
desc = "A solid, slightly beveled brass table."
|
||||
icon = 'icons/obj/smooth_structures/brass_table.dmi'
|
||||
icon = 'icons/obj/smooth_structures/tables/brass_table.dmi'
|
||||
icon_state = "brass_table-0"
|
||||
base_icon_state = "brass_table"
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
@@ -504,7 +504,7 @@
|
||||
/obj/structure/window/reinforced/tinted/frosted
|
||||
name = "frosted window"
|
||||
desc = "It looks rather strong and frosted over. Looks like it might take a few less hits then a normal reinforced window."
|
||||
icon_state = "fwindow"
|
||||
icon_state = "twindow"
|
||||
max_integrity = 30
|
||||
|
||||
/obj/structure/window/reinforced/polarized
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Swap Forms"
|
||||
desc = "We force ourselves into the body of another form, pushing their consciousness into the form we left behind. Costs 40 chemicals."
|
||||
helptext = "We will bring all our abilities with us, but we will lose our old form DNA in exchange for the new one. The process will seem suspicious to any observers."
|
||||
button_icon_state = "mindswap"
|
||||
button_icon_state = "cling_mindswap"
|
||||
chemical_cost = 40
|
||||
dna_cost = 1
|
||||
req_human = TRUE //Monkeys can't grab
|
||||
|
||||
@@ -39,12 +39,6 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>\The [T] seems stuck to your hand!</span>")
|
||||
return
|
||||
if(istype(O, /obj/item/screwdriver) && anchored)
|
||||
playsound(src.loc, O.usesound, 50, 1)
|
||||
panel_open = !panel_open
|
||||
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
return
|
||||
if(panel_open)
|
||||
if(istype(O, /obj/item/wrench))
|
||||
default_unfasten_wrench(user, O)
|
||||
@@ -53,8 +47,18 @@
|
||||
print_tickets()
|
||||
default_deconstruction_crowbar(user, O)
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/prize_counter/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!anchored)
|
||||
return
|
||||
I.play_tool_sound(src)
|
||||
panel_open = !panel_open
|
||||
to_chat(user, "<span class='notice'>You [panel_open ? "open" : "close"] the maintenance panel.</span>")
|
||||
update_icon(UPDATE_ICON_STATE)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/prize_counter/attack_hand(mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
|
||||
@@ -111,11 +111,11 @@ GLOBAL_DATUM_INIT(global_prizes, /datum/prizes, new())
|
||||
typepath = /obj/item/deck/cards/tiny
|
||||
cost = 25
|
||||
|
||||
/datum/prize_item/double_tiny_cards
|
||||
name = "Double Deck of Tiny Cards"
|
||||
desc = "Anyone fancy a tiny game of 108-card Pickup?"
|
||||
typepath = /obj/item/deck/cards/tiny/doublecards
|
||||
cost = 50
|
||||
/datum/prize_item/capgunammo
|
||||
name = "Capgun Revolver Cylinder"
|
||||
desc = "Reload your toy revolver with style."
|
||||
typepath = /obj/item/ammo_box/caps
|
||||
cost = 30
|
||||
|
||||
/datum/prize_item/crayons
|
||||
name = "Box of Crayons"
|
||||
@@ -135,6 +135,12 @@ GLOBAL_DATUM_INIT(global_prizes, /datum/prizes, new())
|
||||
typepath = /obj/item/clothing/gloves/ring/shadow
|
||||
cost = 40
|
||||
|
||||
/datum/prize_item/double_tiny_cards
|
||||
name = "Double Deck of Tiny Cards"
|
||||
desc = "Anyone fancy a tiny game of 108-card Pickup?"
|
||||
typepath = /obj/item/deck/cards/tiny/doublecards
|
||||
cost = 50
|
||||
|
||||
/datum/prize_item/wallet
|
||||
name = "Colored Wallet"
|
||||
desc = "Brightly colored and big enough for standard issue ID cards."
|
||||
@@ -173,6 +179,12 @@ GLOBAL_DATUM_INIT(global_prizes, /datum/prizes, new())
|
||||
typepath = /obj/item/toy/flash
|
||||
cost = 50
|
||||
|
||||
/datum/prize_item/toycuffs
|
||||
name = "Toy Handcuffs"
|
||||
desc = "Plastic and extremely cheaply made."
|
||||
typepath = /obj/item/restraints/handcuffs/toy
|
||||
cost = 50
|
||||
|
||||
/datum/prize_item/minimeteor
|
||||
name = "Mini-Meteor"
|
||||
desc = "Meteors have been detected on a collision course with your fun times!"
|
||||
@@ -233,6 +245,12 @@ GLOBAL_DATUM_INIT(global_prizes, /datum/prizes, new())
|
||||
typepath = /obj/item/gun/projectile/revolver/capgun
|
||||
cost = 75
|
||||
|
||||
/datum/prize_item/codex_gigas
|
||||
name = "Toy Codex Gigas"
|
||||
desc = "For helping you come up with writing ideas for your diabolical adventures."
|
||||
typepath = /obj/item/toy/codex_gigas
|
||||
cost = 75
|
||||
|
||||
/datum/prize_item/pet_rock
|
||||
name = "Pet Rock"
|
||||
desc = "A pet of your very own!"
|
||||
@@ -329,12 +347,6 @@ GLOBAL_DATUM_INIT(global_prizes, /datum/prizes, new())
|
||||
typepath = /obj/item/toy/figure/griffin
|
||||
cost = 125
|
||||
|
||||
/datum/prize_item/codex_gigas
|
||||
name = "Toy Codex Gigas"
|
||||
desc = "For helping you come up with writing ideas for your diabolical adventures."
|
||||
typepath = /obj/item/toy/codex_gigas/
|
||||
cost = 75
|
||||
|
||||
/datum/prize_item/esword
|
||||
name = "Toy Energy Sword"
|
||||
desc = "A plastic replica of an energy blade."
|
||||
@@ -353,6 +365,12 @@ GLOBAL_DATUM_INIT(global_prizes, /datum/prizes, new())
|
||||
typepath = /obj/item/stack/tile/arcade_carpet/loaded
|
||||
cost = 150
|
||||
|
||||
/datum/prize_item/headpat
|
||||
name = "Gloves of Headpats"
|
||||
desc = "Gloves that fill you with an irresistable urge to give headpats."
|
||||
typepath = /obj/item/clothing/gloves/fingerless/rapid/headpat
|
||||
cost = 150
|
||||
|
||||
/datum/prize_item/tommygun
|
||||
name = "Tommy Gun"
|
||||
desc = "A replica tommy gun that fires foam darts."
|
||||
@@ -371,12 +389,6 @@ GLOBAL_DATUM_INIT(global_prizes, /datum/prizes, new())
|
||||
typepath = /obj/item/twohanded/toy/chainsaw
|
||||
cost = 200
|
||||
|
||||
/datum/prize_item/headpat
|
||||
name = "Gloves of Headpats"
|
||||
desc = "Gloves that fill you with an irresistable urge to give headpats."
|
||||
typepath = /obj/item/clothing/gloves/fingerless/rapid/headpat
|
||||
cost = 150
|
||||
|
||||
/datum/prize_item/bike
|
||||
name = "Awesome Bike!"
|
||||
desc = "WOAH."
|
||||
|
||||
@@ -26,12 +26,12 @@
|
||||
part1 = null
|
||||
part2 = null
|
||||
qdel(src)
|
||||
return
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
status = !status
|
||||
to_chat(user, "<span class='notice'>[src] is now [status ? "secured" : "unsecured"]!</span>")
|
||||
|
||||
/obj/item/assembly/shock_kit/screwdriver_act(mob/user, obj/item/I)
|
||||
status = !status
|
||||
to_chat(user, "<span class='notice'>[src] is now [status ? "secured" : "unsecured"]!</span>")
|
||||
add_fingerprint(user)
|
||||
return
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/shock_kit/attack_self(mob/user as mob)
|
||||
part1.attack_self(user, status)
|
||||
|
||||
@@ -300,21 +300,6 @@
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 100, TRUE)
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(!welded)
|
||||
if(open)
|
||||
to_chat(user, "<span class='notice'>Now closing the vent.</span>")
|
||||
if(do_after(user, 20 * W.toolspeed, target = src))
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
open = FALSE
|
||||
user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Now opening the vent.</span>")
|
||||
if(do_after(user, 20 * W.toolspeed, target = src))
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
open = TRUE
|
||||
user.visible_message("[user] screwdrivers the vent open.", "You screwdriver the vent open.", "You hear a screwdriver.")
|
||||
return
|
||||
if(istype(W, /obj/item/paper))
|
||||
if(!welded)
|
||||
if(open)
|
||||
@@ -335,6 +320,16 @@
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(welded)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start screwing the vent [open ? "shut" : "open"].</span>")
|
||||
if(do_after(user, 20 * I.toolspeed, target = src))
|
||||
I.play_tool_sound(src)
|
||||
user.visible_message("<span class='notice'>[user] screws the vent [open ? "shut" : "open"].</span>", "<span class='notice'>You screw the vent [open ? "shut" : "open"].</span>", "You hear a screwdriver.")
|
||||
open = !open
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/welder_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(!I.tool_use_check(user, 0))
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
if(!ishuman(user))
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
|
||||
var/obj/item/stack/O = I
|
||||
var/species = golem_shell_species_types[O.merge_type]
|
||||
if(species)
|
||||
@@ -72,8 +72,8 @@
|
||||
var/has_owner = FALSE
|
||||
var/can_transfer = TRUE //if golems can switch bodies to this new shell
|
||||
var/mob/living/owner = null //golem's owner if it has one
|
||||
important_info = "You are not an antag. Do not mess with the station or create AIs."
|
||||
description = "As a Free Golem on lavaland, you are unable to use most weapons, but you can mine, research and make more of your kind. Earn enough mining points and you can even move your shuttle out of there."
|
||||
important_info = "You are not an antagonist. Do not create AIs without explicit admin permission. Do not involve yourself with the main station, boarding the main station requires explicit admin permission."
|
||||
description = "As a Free Golem on lavaland, you are unable to use most weapons, but you can mine, research and make more of your kind. Earn enough mining points and you can even move your shuttle out of there. Your goal is to survive on lavaland with your kin, not to become crew on the primary station."
|
||||
flavour_text = "You are a Free Golem. Your family worships The Liberator. In his infinite and divine wisdom, he set your clan free to \
|
||||
travel the stars with a single declaration: \"Yeah go do whatever.\" Though you are bound to the one who created you, it is customary in your society to repeat those same words to newborn \
|
||||
golems, so that no golem may ever be forced to serve again."
|
||||
@@ -97,12 +97,12 @@
|
||||
var/datum/species/golem/X = mob_species
|
||||
to_chat(new_spawn, "[initial(X.info_text)]")
|
||||
if(!owner)
|
||||
to_chat(new_spawn, "<big><span class='warning'>You are not an antagonist, do not build an AI without explicit admin permission. Do not board the station without explicit admin permission.</span><big>")
|
||||
to_chat(new_spawn, "<span class='notice'>It is common in free golem societies to respect Adamantine golems as elders, however you do not have to obey them. \
|
||||
Adamantine golems are the only golems that can resonate to all golems.</span>")
|
||||
to_chat(new_spawn, "Build golem shells in the autolathe, and feed refined mineral sheets to the shells to bring them to life! You are generally a peaceful group unless provoked.")
|
||||
to_chat(new_spawn, "<span class='warning'>You are not an antagonist, but you are not a crewmember either. \
|
||||
You may interact or trade with crew you come across, aswell as defend yourself and your ship \
|
||||
but avoid actively interfering with the station unless you have a valid roleplay reason to do so, such as an invitation by crewmembers.</span>")
|
||||
to_chat(new_spawn, "<span class='warning'>You may interact or trade with crew you come across, aswell as defend yourself and your ship \
|
||||
but avoid actively interfering with the station, you are required to adminhelp and request permission to board the main station.</span>")
|
||||
else
|
||||
new_spawn.mind.store_memory("<b>Serve [owner.real_name], your creator.</b>")
|
||||
log_game("[key_name(new_spawn)] possessed a golem shell enslaved to [key_name(owner)].")
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
to_chat(user, "<span class='warning'>[initial(object.name)] does not have a var called '[varholder]'</span>")
|
||||
if(right_click)
|
||||
if(object.vars.Find(varholder))
|
||||
var/reset_value = object.vars[varholder] // Can't use initial() on a list index so just hope for the best I guess
|
||||
var/reset_value = initial(object.vars[varholder])
|
||||
if(!object.vv_edit_var(varholder, reset_value))
|
||||
to_chat(user, "<span class='warning'>Your edit was rejected by [object].</span>")
|
||||
return
|
||||
|
||||
@@ -21,17 +21,21 @@
|
||||
name = "prescription [initial(name)]"
|
||||
|
||||
// Removing prescription glasses
|
||||
else if(prescription && istype(I, /obj/item/screwdriver))
|
||||
var/obj/item/clothing/glasses/regular/G = locate() in src
|
||||
if(!G)
|
||||
G = new(src)
|
||||
to_chat(H, "<span class='notice'>You salvage the prescription lenses from [src].</span>")
|
||||
prescription = FALSE
|
||||
name = initial(name)
|
||||
H.put_in_hands(G)
|
||||
|
||||
H.update_nearsighted_effects()
|
||||
|
||||
/obj/item/clothing/glasses/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!prescription)
|
||||
return
|
||||
var/obj/item/clothing/glasses/regular/G = locate() in src
|
||||
if(!G)
|
||||
G = new(src)
|
||||
to_chat(user, "<span class='notice'>You salvage the prescription lenses from [src].</span>")
|
||||
prescription = FALSE
|
||||
name = initial(name)
|
||||
user.put_in_hands(G)
|
||||
user.update_nearsighted_effects()
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/glasses/update_icon_state()
|
||||
if(..())
|
||||
item_state = "[replacetext("[item_state]", "_up", "")][up ? "_up" : ""]"
|
||||
|
||||
@@ -327,32 +327,34 @@
|
||||
to_chat(user, "<span class='notice'>It's broken.</span>")
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
switch(aggressiveness)
|
||||
if(1)
|
||||
to_chat(user, "<span class='notice'>You set the aggressiveness restrictor to the second position.</span>")
|
||||
aggressiveness = 2
|
||||
phrase = 7
|
||||
if(2)
|
||||
to_chat(user, "<span class='notice'>You set the aggressiveness restrictor to the third position.</span>")
|
||||
aggressiveness = 3
|
||||
phrase = 13
|
||||
if(3)
|
||||
to_chat(user, "<span class='notice'>You set the aggressiveness restrictor to the fourth position.</span>")
|
||||
aggressiveness = 4
|
||||
phrase = 1
|
||||
if(4)
|
||||
to_chat(user, "<span class='notice'>You set the aggressiveness restrictor to the first position.</span>")
|
||||
aggressiveness = 1
|
||||
phrase = 1
|
||||
if(5)
|
||||
to_chat(user, "<span class='warning'>You adjust the restrictor but nothing happens, probably because its broken.</span>")
|
||||
else if(istype(W, /obj/item/wirecutters))
|
||||
if(istype(W, /obj/item/wirecutters))
|
||||
if(aggressiveness != 5)
|
||||
to_chat(user, "<span class='warning'>You broke it!</span>")
|
||||
aggressiveness = 5
|
||||
else
|
||||
..()
|
||||
return
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/screwdriver_act(mob/living/user, obj/item/I)
|
||||
switch(aggressiveness)
|
||||
if(1)
|
||||
to_chat(user, "<span class='notice'>You set the aggressiveness restrictor to the second position.</span>")
|
||||
aggressiveness = 2
|
||||
phrase = 7
|
||||
if(2)
|
||||
to_chat(user, "<span class='notice'>You set the aggressiveness restrictor to the third position.</span>")
|
||||
aggressiveness = 3
|
||||
phrase = 13
|
||||
if(3)
|
||||
to_chat(user, "<span class='notice'>You set the aggressiveness restrictor to the fourth position.</span>")
|
||||
aggressiveness = 4
|
||||
phrase = 1
|
||||
if(4)
|
||||
to_chat(user, "<span class='notice'>You set the aggressiveness restrictor to the first position.</span>")
|
||||
aggressiveness = 1
|
||||
phrase = 1
|
||||
if(5)
|
||||
to_chat(user, "<span class='warning'>You adjust the restrictor but nothing happens, probably because its broken.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/attack_self()
|
||||
halt()
|
||||
|
||||
@@ -95,14 +95,13 @@
|
||||
icon = 'icons/obj/improvised.dmi'
|
||||
icon_state = "ishotgunstep1"
|
||||
|
||||
/obj/item/weaponcrafting/ishotgunconstruction/attackby(obj/item/I, mob/user as mob, params)
|
||||
..()
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
var/obj/item/weaponcrafting/ishotgunconstruction2/C = new /obj/item/weaponcrafting/ishotgunconstruction2
|
||||
user.unEquip(src)
|
||||
user.put_in_hands(C)
|
||||
to_chat(user, "<span class='notice'>You screw the pins into place, securing the pipe to the receiver.</span>")
|
||||
qdel(src)
|
||||
/obj/item/weaponcrafting/ishotgunconstruction/screwdriver_act(mob/living/user, obj/item/I)
|
||||
var/obj/item/weaponcrafting/ishotgunconstruction2/C = new /obj/item/weaponcrafting/ishotgunconstruction2
|
||||
user.unEquip(src)
|
||||
user.put_in_hands(C)
|
||||
to_chat(user, "<span class='notice'>You screw the pins into place, securing the pipe to the receiver.</span>")
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/item/weaponcrafting/ishotgunconstruction2
|
||||
name = "very conspicuous metal construction"
|
||||
|
||||
@@ -89,7 +89,6 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
clong.ex_act(EXPLODE_HEAVY)
|
||||
|
||||
/obj/effect/immovablerod/event
|
||||
var/tiles_moved = 0
|
||||
// The base chance to "damage" the floor when passing. This is not guaranteed to cause a full on hull breach.
|
||||
// Chance to expose the tile to space is like 60% of this value.
|
||||
var/floor_rip_chance = 40
|
||||
@@ -97,10 +96,9 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
/obj/effect/immovablerod/event/Move()
|
||||
var/atom/oldloc = loc
|
||||
. = ..()
|
||||
tiles_moved++
|
||||
if(prob(floor_rip_chance))
|
||||
var/turf/simulated/floor/T = get_turf(oldloc)
|
||||
if(istype(T))
|
||||
T.ex_act(EXPLODE_HEAVY)
|
||||
if(get_dist(oldloc, loc) > 2 && tiles_moved > 10) // We went on a journey, commit sudoku
|
||||
if(loc == destination)
|
||||
qdel(src)
|
||||
|
||||
@@ -157,10 +157,10 @@
|
||||
throwforce = 5.0
|
||||
materials = list()
|
||||
|
||||
/obj/item/shard/shark_teeth/Initialize(mapload)
|
||||
. = ..()
|
||||
src.pixel_x = rand(-5,5)
|
||||
src.pixel_y = rand(-5,5)
|
||||
/obj/item/shard/shark_teeth/set_initial_icon_state()
|
||||
icon_state = "teeth"
|
||||
pixel_x = rand(-5,5)
|
||||
pixel_y = rand(-5,5)
|
||||
|
||||
/obj/item/fish/catfish
|
||||
name = "catfish"
|
||||
|
||||
@@ -43,6 +43,35 @@
|
||||
var/obj/item/reagent_containers/food/snacks/deepfryholder/type = new(get_turf(src))
|
||||
return type
|
||||
|
||||
/obj/machinery/cooker/deepfryer/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks/ice))
|
||||
var/ice_amount = I.reagents.get_reagent_amount("ice")
|
||||
if(ice_amount)
|
||||
I.reagents.remove_all(I.reagents.total_volume)
|
||||
add_attack_logs(user, src, "poured [ice_amount]u ice into")
|
||||
user.visible_message(
|
||||
"<span class='warning'>[user] pours [I] into [src], and it seems to fizz a bit.</span>",
|
||||
"<span class='warning'>You pour [I] into [src], and it seems to fizz a bit.</span>",
|
||||
"You hear a splash, and a sizzle."
|
||||
)
|
||||
|
||||
playsound(src, 'sound/goonstation/misc/drinkfizz.ogg', 25)
|
||||
addtimer(CALLBACK(src, .proc/boil_leadup, user), 4 SECONDS)
|
||||
addtimer(CALLBACK(src, .proc/make_foam, ice_amount), 5 SECONDS)
|
||||
|
||||
return TRUE
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/cooker/deepfryer/proc/boil_leadup(mob/user)
|
||||
visible_message(
|
||||
"<span class='danger'>[src] starts to bubble and froth unnervingly!</span>",
|
||||
"<span class='danger'>You hear a growling and intimidating bubbling!</span>"
|
||||
)
|
||||
|
||||
playsound(src, 'sound/machines/fryer/deep_fryer_emerge.ogg', 75)
|
||||
to_chat(user, "<span class='userdanger'>Are you sure that was such a good idea?</span>")
|
||||
|
||||
/obj/machinery/cooker/deepfryer/examine(mob/user)
|
||||
. = ..()
|
||||
if(emagged)
|
||||
@@ -76,6 +105,18 @@
|
||||
return 0
|
||||
return 0
|
||||
|
||||
/// Make foam consisting of burning oil.
|
||||
/obj/machinery/cooker/deepfryer/proc/make_foam(ice_amount)
|
||||
if(!reagents)
|
||||
create_reagents()
|
||||
// the cooking oil should spread through the foam.
|
||||
// when it gets added, it's at 1000 degrees so it quickly fireflashes and reacts to form inert cooking oil.
|
||||
reagents.add_reagent("cooking_oil", ice_amount * 2, reagtemp = 1000)
|
||||
reagents.chem_temp = 1000
|
||||
var/datum/effect_system/foam_spread/S = new()
|
||||
S.set_up(ice_amount * 2, loc, reagents, FALSE)
|
||||
S.start()
|
||||
|
||||
|
||||
/obj/machinery/cooker/deepfryer/checkSpecials(obj/item/I)
|
||||
if(!I)
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
occupant = victim
|
||||
|
||||
update_icon(UPDATE_OVERLAYS)
|
||||
feedinTopanim()
|
||||
INVOKE_ASYNC(src, .proc/feedinTopanim)
|
||||
|
||||
/obj/machinery/gibber/verb/eject()
|
||||
set category = "Object"
|
||||
|
||||
@@ -276,6 +276,13 @@
|
||||
if(missing_health > 0)
|
||||
target.adjustBruteLoss(missing_health) //and do that much damage
|
||||
|
||||
|
||||
/obj/item/crusher_trophy/goliath_tentacle/ancient
|
||||
name = "ancient goliath tentacle"
|
||||
desc = "A HUGE sliced-off goliath tentacle. Suitable as a trophy for a kinetic crusher."
|
||||
icon_state = "ancient_goliath_tentacle"
|
||||
bonus_value = 4
|
||||
|
||||
//watcher
|
||||
/obj/item/crusher_trophy/watcher_wing
|
||||
name = "watcher wing"
|
||||
|
||||
@@ -18,6 +18,10 @@
|
||||
. = ..()
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_DIAMOND, MAT_BANANIUM, MAT_TRANQUILLITE), MINERAL_MATERIAL_AMOUNT * 50, FALSE, /obj/item/stack)
|
||||
|
||||
/obj/machinery/mineral/mint/wrench_act(mob/user, obj/item/I)
|
||||
default_unfasten_wrench(user, I, time = 4 SECONDS)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/mineral/mint/process()
|
||||
var/turf/T = get_step(src, input_dir)
|
||||
if(!T)
|
||||
|
||||
@@ -77,6 +77,9 @@
|
||||
. = ..()
|
||||
H.clear_alert("nolight")
|
||||
|
||||
for(var/mob/living/simple_animal/diona/N in H.contents) // Let nymphs wiggle out
|
||||
N.split()
|
||||
|
||||
/datum/species/diona/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
|
||||
if(R.id == "glyphosate" || R.id == "atrazine")
|
||||
H.adjustToxLoss(3) //Deal aditional damage
|
||||
|
||||
@@ -118,7 +118,6 @@
|
||||
prefix = "Plasma"
|
||||
special_names = list("Flood", "Fire", "Bar", "Man")
|
||||
var/boom_warning = FALSE
|
||||
var/datum/action/innate/ignite/ignite
|
||||
|
||||
/datum/species/golem/plasma/handle_life(mob/living/carbon/human/H)
|
||||
if(H.bodytemperature > 750)
|
||||
@@ -143,11 +142,11 @@
|
||||
/datum/species/golem/plasma/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
..()
|
||||
if(ishuman(C))
|
||||
ignite = new
|
||||
var/datum/action/innate/ignite/ignite = new()
|
||||
ignite.Grant(C)
|
||||
|
||||
/datum/species/golem/plasma/on_species_loss(mob/living/carbon/C)
|
||||
if(ignite)
|
||||
for(var/datum/action/innate/ignite/ignite in C.actions)
|
||||
ignite.Remove(C)
|
||||
..()
|
||||
|
||||
@@ -434,7 +433,6 @@
|
||||
special_names = list("Crystal", "Polycrystal")
|
||||
unarmed_type = /datum/unarmed_attack/golem/bluespace
|
||||
|
||||
var/datum/action/innate/unstable_teleport/unstable_teleport
|
||||
var/teleport_cooldown = 100
|
||||
var/last_teleport = 0
|
||||
var/tele_range = 6
|
||||
@@ -488,12 +486,12 @@
|
||||
/datum/species/golem/bluespace/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
..()
|
||||
if(ishuman(C))
|
||||
unstable_teleport = new
|
||||
var/datum/action/innate/unstable_teleport/unstable_teleport = new()
|
||||
unstable_teleport.Grant(C)
|
||||
last_teleport = world.time
|
||||
|
||||
/datum/species/golem/bluespace/on_species_loss(mob/living/carbon/C)
|
||||
if(unstable_teleport)
|
||||
for(var/datum/action/innate/unstable_teleport/unstable_teleport in C.actions)
|
||||
unstable_teleport.Remove(C)
|
||||
..()
|
||||
|
||||
|
||||
@@ -77,11 +77,10 @@
|
||||
"is frying their own circuits!",
|
||||
"is blocking their ventilation port!")
|
||||
|
||||
var/datum/action/innate/change_monitor/monitor
|
||||
|
||||
/datum/species/machine/on_species_gain(mob/living/carbon/human/H)
|
||||
..()
|
||||
monitor = new()
|
||||
var/datum/action/innate/change_monitor/monitor = new()
|
||||
monitor.Grant(H)
|
||||
for(var/datum/atom_hud/data/human/medical/medhud in GLOB.huds)
|
||||
medhud.remove_from_hud(H)
|
||||
@@ -92,7 +91,7 @@
|
||||
|
||||
/datum/species/machine/on_species_loss(mob/living/carbon/human/H)
|
||||
..()
|
||||
if(monitor)
|
||||
for(var/datum/action/innate/change_monitor/monitor in H.actions)
|
||||
monitor.Remove(H)
|
||||
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
|
||||
diag_hud.remove_from_hud(H)
|
||||
|
||||
@@ -40,8 +40,6 @@
|
||||
|
||||
optional_body_accessory = FALSE
|
||||
|
||||
var/datum/action/innate/cocoon/cocoon
|
||||
|
||||
suicide_messages = list(
|
||||
"is attempting to nibble their antenna off!",
|
||||
"is twisting their own abdomen!",
|
||||
@@ -53,7 +51,7 @@
|
||||
|
||||
/datum/species/moth/on_species_gain(mob/living/carbon/human/H)
|
||||
..()
|
||||
cocoon = new()
|
||||
var/datum/action/innate/cocoon/cocoon = new()
|
||||
cocoon.Grant(H)
|
||||
RegisterSignal(H, COMSIG_LIVING_FIRE_TICK, .proc/check_burn_wings)
|
||||
RegisterSignal(H, COMSIG_LIVING_AHEAL, .proc/on_aheal)
|
||||
@@ -62,7 +60,8 @@
|
||||
|
||||
/datum/species/moth/on_species_loss(mob/living/carbon/human/H)
|
||||
..()
|
||||
cocoon.Remove(H)
|
||||
for(var/datum/action/innate/cocoon/cocoon in H.actions)
|
||||
cocoon.Remove(H)
|
||||
UnregisterSignal(H, COMSIG_LIVING_FIRE_TICK)
|
||||
UnregisterSignal(H, COMSIG_LIVING_AHEAL)
|
||||
UnregisterSignal(H, COMSIG_HUMAN_CHANGE_BODY_ACCESSORY)
|
||||
|
||||
@@ -56,17 +56,15 @@
|
||||
"is twisting their own neck!",
|
||||
"is holding their breath!")
|
||||
|
||||
var/datum/action/innate/tail_lash/lash
|
||||
|
||||
|
||||
/datum/species/unathi/on_species_gain(mob/living/carbon/human/H)
|
||||
..()
|
||||
lash = new
|
||||
var/datum/action/innate/tail_lash/lash = new()
|
||||
lash.Grant(H)
|
||||
|
||||
/datum/species/unathi/on_species_loss(mob/living/carbon/human/H)
|
||||
..()
|
||||
if(lash)
|
||||
for(var/datum/action/innate/tail_lash/lash in H.actions)
|
||||
lash.Remove(H)
|
||||
|
||||
/datum/action/innate/tail_lash
|
||||
|
||||
@@ -29,7 +29,10 @@ GLOBAL_LIST_EMPTY(empty_playable_ai_cores)
|
||||
current_mode.possible_traitors.Remove(src)
|
||||
|
||||
// Ghost the current player and disallow them to return to the body
|
||||
ghostize()
|
||||
if(TOO_EARLY_TO_GHOST)
|
||||
ghostize(FALSE)
|
||||
else
|
||||
ghostize(TRUE)
|
||||
// Delete the old AI shell
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -307,13 +307,7 @@
|
||||
show_controls(user)
|
||||
|
||||
/mob/living/simple_animal/bot/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(!locked)
|
||||
open = !open
|
||||
to_chat(user, "<span class='notice'>The maintenance panel is now [open ? "opened" : "closed"].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The maintenance panel is locked.</span>")
|
||||
else if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda))
|
||||
if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda))
|
||||
if(allowed(user) && !open && !emagged)
|
||||
locked = !locked
|
||||
to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]")
|
||||
@@ -363,6 +357,19 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
if(locked)
|
||||
to_chat(user, "<span class='warning'>The maintenance panel is locked.</span>")
|
||||
return TRUE // must be true or we attempt to stab the bot
|
||||
|
||||
open = !open
|
||||
I.play_tool_sound(src)
|
||||
to_chat(user, "<span class='notice'>The maintenance panel is now [open ? "opened" : "closed"].</span>")
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/welder_act(mob/user, obj/item/I)
|
||||
if(user.a_intent != INTENT_HELP)
|
||||
return
|
||||
|
||||
@@ -157,13 +157,8 @@
|
||||
qdel(W)
|
||||
|
||||
if(8)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>You start attaching the gun to the frame...</span>")
|
||||
if(do_after(user, 40 * W.toolspeed, target = src))
|
||||
build_step++
|
||||
update_appearance(UPDATE_NAME)
|
||||
to_chat(user, "<span class='notice'>Taser gun attached.</span>")
|
||||
return
|
||||
// Handled by screwdriver act, return here to prevent errors being thrown for no switch(build_step) = 8 (might not be needed?)
|
||||
|
||||
if(9)
|
||||
if(istype(W, /obj/item/stock_parts/cell))
|
||||
@@ -177,6 +172,17 @@
|
||||
user.unEquip(src, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/ed209_assembly/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(build_step != 8)
|
||||
return
|
||||
I.play_tool_sound(src)
|
||||
to_chat(user, "<span class='notice'>You start attaching the gun to the frame...</span>")
|
||||
if(do_after(user, 40 * I.toolspeed, target = src))
|
||||
build_step++
|
||||
update_appearance(UPDATE_NAME)
|
||||
to_chat(user, "<span class='notice'>You attach the gun to the frame.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/ed209_assembly/update_name()
|
||||
. = ..()
|
||||
switch(build_step)
|
||||
@@ -439,15 +445,16 @@
|
||||
..()
|
||||
return
|
||||
|
||||
if(!S.secured)
|
||||
qdel(S)
|
||||
var/obj/item/secbot_assembly/A = new /obj/item/secbot_assembly
|
||||
user.put_in_hands(A)
|
||||
to_chat(user, "<span class='notice'>You add the signaler to the helmet.</span>")
|
||||
user.unEquip(src, 1)
|
||||
qdel(src)
|
||||
else
|
||||
if(S.secured)
|
||||
to_chat(user, "<span class='notice'>[S] is secured.</span>")
|
||||
return
|
||||
qdel(S)
|
||||
var/obj/item/secbot_assembly/A = new /obj/item/secbot_assembly
|
||||
user.put_in_hands(A)
|
||||
to_chat(user, "<span class='notice'>You add the signaler to the helmet.</span>")
|
||||
user.unEquip(src, 1)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/secbot_assembly/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
@@ -491,34 +498,40 @@
|
||||
created_name = t
|
||||
log_game("[key_name(user)] has renamed a robot to [t]")
|
||||
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
if(!build_step)
|
||||
new /obj/item/assembly/signaler(get_turf(src))
|
||||
new /obj/item/clothing/head/helmet(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You disconnect the signaler from the helmet.</span>")
|
||||
qdel(src)
|
||||
|
||||
else if(build_step == 2)
|
||||
new /obj/item/assembly/prox_sensor(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You detach the proximity sensor from [src].</span>")
|
||||
build_step--
|
||||
|
||||
else if(build_step == 3)
|
||||
new /obj/item/robot_parts/l_arm(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You remove the robot arm from [src].</span>")
|
||||
build_step--
|
||||
|
||||
//General Griefsky
|
||||
|
||||
else if((istype(I, /obj/item/wrench)) && (build_step == 3))
|
||||
else if(istype(I, /obj/item/wrench) && build_step == 3)
|
||||
var/obj/item/griefsky_assembly/A = new /obj/item/griefsky_assembly(get_turf(src))
|
||||
user.put_in_hands(A)
|
||||
to_chat(user, "<span class='notice'>You adjust the arm slots for extra weapons!.</span>")
|
||||
to_chat(user, "<span class='notice'>You adjust the arm slots for extra weapons!</span>")
|
||||
user.unEquip(src, 1)
|
||||
qdel(src)
|
||||
|
||||
update_appearance(UPDATE_NAME|UPDATE_OVERLAYS)
|
||||
|
||||
/obj/item/secbot_assembly/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(build_step != 0 && build_step != 2 && build_step != 3)
|
||||
return
|
||||
|
||||
switch(build_step)
|
||||
if(0)
|
||||
new /obj/item/assembly/signaler(get_turf(src))
|
||||
new /obj/item/clothing/head/helmet(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You disconnect the signaler from the helmet.</span>")
|
||||
qdel(src)
|
||||
if(2)
|
||||
new /obj/item/assembly/prox_sensor(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You detach the proximity sensor from [src].</span>")
|
||||
build_step--
|
||||
if(3)
|
||||
new /obj/item/robot_parts/l_arm(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You remove the robot arm from [src].</span>")
|
||||
build_step--
|
||||
|
||||
I.play_tool_sound(src)
|
||||
update_appearance(UPDATE_NAME|UPDATE_OVERLAYS)
|
||||
return TRUE
|
||||
|
||||
/obj/item/secbot_assembly/update_name()
|
||||
. = ..()
|
||||
switch(build_step)
|
||||
@@ -578,15 +591,20 @@
|
||||
qdel(I)
|
||||
qdel(src)
|
||||
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
if((build_step == 1) || (build_step == 2) || (build_step == 3) || (build_step == 4))
|
||||
new /obj/item/melee/energy/sword(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You detach the energy sword from [src].</span>")
|
||||
build_step--
|
||||
else if((toy_step == 1) || (toy_step == 2) || (toy_step == 3) || (toy_step == 4))
|
||||
new /obj/item/toy/sword(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You detach the toy sword from [src].</span>")
|
||||
toy_step--
|
||||
/obj/item/griefsky_assembly/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!build_step && !toy_step)
|
||||
return
|
||||
|
||||
if(build_step)
|
||||
new /obj/item/melee/energy/sword(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You detach the energy sword from [src].</span>")
|
||||
build_step--
|
||||
else if(toy_step)
|
||||
new /obj/item/toy/sword(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You detach the toy sword from [src].</span>")
|
||||
toy_step--
|
||||
I.play_tool_sound(src)
|
||||
return TRUE
|
||||
|
||||
//Honkbot Assembly
|
||||
/obj/item/storage/box/clown/attackby(obj/item/W, mob/user, params)
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
..()
|
||||
if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
|
||||
return
|
||||
if(!istype(W, /obj/item/screwdriver) && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
|
||||
if(!isscrewdriver(W) && !locked && (!target)) //If the target is locked, they are recieving damage from the screwdriver
|
||||
if(W.force && W.damtype != STAMINA)//If force is non-zero and damage type isn't stamina.
|
||||
retaliate(user)
|
||||
if(lasercolor)//To make up for the fact that lasertag bots don't hunt
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
..()
|
||||
if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
|
||||
return
|
||||
if(!istype(W, /obj/item/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
|
||||
if(!isscrewdriver(W) && !locked && (W.force) && (!target) && (W.damtype != STAMINA))//If the target is locked, they are recieving damage from the screwdriver
|
||||
retaliate(user)
|
||||
addtimer(CALLBACK(src, .proc/react_buzz), 5)
|
||||
|
||||
|
||||
@@ -95,12 +95,7 @@
|
||||
reached_target = 0
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
..()
|
||||
if(open)
|
||||
on = FALSE
|
||||
update_controls()
|
||||
else if(istype(I,/obj/item/stock_parts/cell) && open && !cell)
|
||||
if(istype(I,/obj/item/stock_parts/cell) && open && !cell)
|
||||
if(!user.drop_item())
|
||||
return
|
||||
var/obj/item/stock_parts/cell/C = I
|
||||
@@ -141,6 +136,13 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(open)
|
||||
on = FALSE
|
||||
update_controls()
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/emag_act(mob/user)
|
||||
if(emagged < 1)
|
||||
emagged = 1
|
||||
|
||||
@@ -197,7 +197,7 @@
|
||||
..()
|
||||
if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
|
||||
return
|
||||
if(!istype(W, /obj/item/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
|
||||
if(!isscrewdriver(W) && !locked && (W.force) && (!target) && (W.damtype != STAMINA))//If the target is locked, they are recieving damage from the screwdriver
|
||||
retaliate(user)
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/emag_act(mob/user)
|
||||
|
||||
@@ -116,6 +116,7 @@
|
||||
throw_message = "does nothing to the rocky hide of the"
|
||||
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/goliath= 2, /obj/item/stack/sheet/bone = 2)
|
||||
crusher_loot = /obj/item/crusher_trophy/goliath_tentacle/ancient
|
||||
crusher_drop_mod = 30
|
||||
wander = FALSE
|
||||
var/list/cached_tentacle_turfs
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/picture_frame
|
||||
/obj/item/picture_frame // This seems somewhat broken and not used anywhere
|
||||
name = "picture frame"
|
||||
desc = "Its patented design allows it to be folded larger or smaller to accommodate standard paper, photo, and poster, and canvas sizes."
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
@@ -55,24 +55,9 @@
|
||||
qdel(D)
|
||||
|
||||
/obj/item/picture_frame/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(displayed)
|
||||
playsound(src, I.usesound, 100, 1)
|
||||
user.visible_message("<span class='warning'>[user] unfastens \the [displayed] out of \the [src].</span>", "<span class='warning'>You unfasten \the [displayed] out of \the [src].</span>")
|
||||
|
||||
if(istype(displayed, /obj/structure/sign/poster))
|
||||
var/obj/structure/sign/poster/P = displayed
|
||||
P.roll_and_drop(user.loc)
|
||||
else
|
||||
displayed.forceMove(user.loc)
|
||||
displayed = null
|
||||
name = initial(name)
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There is nothing to remove from \the [src].</span>")
|
||||
else if(istype(I, /obj/item/crowbar))
|
||||
if(istype(I, /obj/item/crowbar))
|
||||
playsound(src, I.usesound, 100, 1)
|
||||
user.visible_message("<span class='warning'>[user] breaks down \the [src].</span>", "<span class='warning'>You break down \the [src].</span>")
|
||||
user.visible_message("<span class='warning'>[user] breaks down [src].</span>", "<span class='warning'>You break down [src].</span>")
|
||||
for(var/A in contents)
|
||||
if(istype(A, /obj/structure/sign/poster))
|
||||
var/obj/structure/sign/poster/P = A
|
||||
@@ -88,10 +73,28 @@
|
||||
insert(I)
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [src] already contains \a [displayed].</span>")
|
||||
to_chat(user, "<span class='notice'>[src] already contains \a [displayed].</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/picture_frame/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(!displayed)
|
||||
to_chat(user, "<span class='notice'>There is nothing to remove from [src].</span>")
|
||||
return
|
||||
|
||||
I.play_tool_sound(src)
|
||||
user.visible_message("<span class='warning'>[user] unfastens [displayed] out of [src].</span>", "<span class='warning'>You unfasten [displayed] out of [src].</span>")
|
||||
|
||||
if(istype(displayed, /obj/structure/sign/poster))
|
||||
var/obj/structure/sign/poster/P = displayed
|
||||
P.roll_and_drop(user.loc)
|
||||
else
|
||||
displayed.forceMove(user.loc)
|
||||
displayed = null
|
||||
name = initial(name)
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
/obj/item/picture_frame/afterattack(atom/target, mob/user, proximity_flag)
|
||||
if(proximity_flag && istype(target, /turf/simulated/wall))
|
||||
place(target, user)
|
||||
@@ -102,14 +105,14 @@
|
||||
var/stuff_on_wall = 0
|
||||
for(var/obj/O in user.loc.contents) //Let's see if it already has a poster on it or too much stuff
|
||||
if(istype(O, /obj/structure/sign))
|
||||
to_chat(user, "<span class='notice'>\The [T] is far too cluttered to place \a [src]!</span>")
|
||||
to_chat(user, "<span class='notice'>[T] is far too cluttered to place \a [src]!</span>")
|
||||
return
|
||||
stuff_on_wall++
|
||||
if(stuff_on_wall >= 4)
|
||||
to_chat(user, "<span class='notice'>\The [T] is far too cluttered to place \a [src]!</span>")
|
||||
to_chat(user, "<span class='notice'>[T] is far too cluttered to place \a [src]!</span>")
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You start place \the [src] on \the [T].</span>")
|
||||
to_chat(user, "<span class='notice'>You start place [src] on [T].</span>")
|
||||
|
||||
var/px = 0
|
||||
var/py = 0
|
||||
@@ -125,7 +128,7 @@
|
||||
if(WEST)
|
||||
px = -32
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You cannot reach \the [T] from here!</span>")
|
||||
to_chat(user, "<span class='notice'>You cannot reach [T] from here!</span>")
|
||||
return
|
||||
|
||||
user.unEquip(src)
|
||||
@@ -212,26 +215,14 @@
|
||||
overlays |= getFlatIcon(frame)
|
||||
|
||||
/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
playsound(src, I.usesound, 100, 1)
|
||||
user.visible_message("<span class='warning'>[user] begins to unfasten \the [src] from the wall.</span>", "<span class='warning'>You begin to unfasten \the [src] from the wall.</span>")
|
||||
if(do_after(user, 100 * I.toolspeed, target = src))
|
||||
playsound(src, I.usesound, 100, 1)
|
||||
user.visible_message("<span class='warning'>[user] unfastens \the [src] from the wall.</span>", "<span class='warning'>You unfasten \the [src] from the wall.</span>")
|
||||
frame.forceMove(user.loc)
|
||||
frame = null
|
||||
if(explosive)
|
||||
explosive.forceMove(user.loc)
|
||||
explosive = null
|
||||
qdel(src)
|
||||
if(istype(I, /obj/item/grenade) || istype(I, /obj/item/grenade/plastic/c4))
|
||||
if(explosive)
|
||||
to_chat(user, "<span class='warning'>There is already a device attached behind \the [src], remove it first.</span>")
|
||||
to_chat(user, "<span class='warning'>There is already a device attached behind [src], remove it first.</span>")
|
||||
return 1
|
||||
if(!tilted)
|
||||
to_chat(user, "<span class='warning'>\The [src] needs to be already tilted before being rigged with \the [I].</span>")
|
||||
to_chat(user, "<span class='warning'>[src] needs to be already tilted before being rigged with [I].</span>")
|
||||
return 1
|
||||
user.visible_message("<span class='warning'>[user] is fiddling around behind \the [src].</span>", "<span class='warning'>You begin to secure \the [I] behind \the [src].</span>")
|
||||
user.visible_message("<span class='warning'>[user] is fiddling around behind [src].</span>", "<span class='warning'>You begin to secure [I] behind [src].</span>")
|
||||
if(do_after(user, 150, target = src))
|
||||
if(explosive || !tilted)
|
||||
return
|
||||
@@ -239,7 +230,7 @@
|
||||
user.unEquip(I)
|
||||
explosive = I
|
||||
I.forceMove(src)
|
||||
user.visible_message("<span class='notice'>[user] fiddles with the back of \the [src].</span>", "<span class='notice'>You secure \the [I] behind \the [src].</span>")
|
||||
user.visible_message("<span class='notice'>[user] fiddles with the back of [src].</span>", "<span class='notice'>You secure [I] behind [src].</span>")
|
||||
|
||||
message_admins("[key_name_admin(user)] attached [I] to a picture frame.")
|
||||
log_game("[key_name_admin(user)] attached [I] to a picture frame.")
|
||||
@@ -247,6 +238,19 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/sign/picture_frame/screwdriver_act(mob/user, obj/item/I)
|
||||
I.play_tool_sound(src)
|
||||
user.visible_message("<span class='warning'>[user] begins to unfasten [src] from the wall.</span>", "<span class='warning'>You begin to unfasten [src] from the wall.</span>")
|
||||
if(do_after(user, 100 * I.toolspeed, target = src))
|
||||
user.visible_message("<span class='warning'>[user] unfastens [src] from the wall.</span>", "<span class='warning'>You unfasten [src] from the wall.</span>")
|
||||
frame.forceMove(user.loc)
|
||||
frame = null
|
||||
if(explosive)
|
||||
explosive.forceMove(user.loc)
|
||||
explosive = null
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/sign/picture_frame/examine(mob/user, infix = "", suffix = "")
|
||||
if(frame)
|
||||
. += frame.examine(user, infix, suffix)
|
||||
|
||||
@@ -489,13 +489,6 @@
|
||||
|
||||
// attempt to stick weapon into light socket
|
||||
if(status == LIGHT_EMPTY)
|
||||
if(istype(W, /obj/item/screwdriver)) //If it's a screwdriver open it.
|
||||
playsound(loc, W.usesound, W.tool_volume, 1)
|
||||
user.visible_message("<span class='notice'>[user] opens [src]'s casing.</span>", \
|
||||
"<span class='notice'>You open [src]'s casing.</span>", "<span class='notice'>You hear a screwdriver.</span>")
|
||||
deconstruct()
|
||||
return
|
||||
|
||||
if(has_power() && (W.flags & CONDUCT))
|
||||
do_sparks(3, 1, src)
|
||||
if(prob(75)) // If electrocuted
|
||||
@@ -507,6 +500,16 @@
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/light/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(status != LIGHT_EMPTY)
|
||||
return
|
||||
|
||||
I.play_tool_sound(src)
|
||||
user.visible_message("<span class='notice'>[user] opens [src]'s casing.</span>", \
|
||||
"<span class='notice'>You open [src]'s casing.</span>", "<span class='notice'>You hear a screwdriver.</span>")
|
||||
deconstruct()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/light/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
var/obj/machinery/light_construct/newlight = null
|
||||
|
||||
@@ -295,13 +295,6 @@
|
||||
playsound(src.loc, O.usesound, 50, 1)
|
||||
anchored = !anchored
|
||||
|
||||
else if(istype(O, /obj/item/screwdriver))
|
||||
panel_open = !panel_open
|
||||
playsound(src.loc, O.usesound, 50, 1)
|
||||
if(panel_open)
|
||||
to_chat(user, "<span class='notice'>You open the access panel.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You close the access panel.</span>")
|
||||
else if(istype(O, /obj/item/storage/part_replacer) && panel_open)
|
||||
exchange_parts(user, O)
|
||||
return
|
||||
@@ -310,6 +303,18 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(active)
|
||||
return
|
||||
|
||||
panel_open = !panel_open
|
||||
I.play_tool_sound(src)
|
||||
if(panel_open)
|
||||
to_chat(user, "<span class='notice'>You open the access panel.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You close the access panel.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob)
|
||||
..()
|
||||
ui_interact(user)
|
||||
|
||||
@@ -69,27 +69,34 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You fail to collect anything!</span>")
|
||||
else
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(BB)
|
||||
if(initial(BB.name) == "bullet")
|
||||
var/tmp_label = ""
|
||||
var/label_text = sanitize(input(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label))
|
||||
if(length(label_text) > 20)
|
||||
to_chat(user, "<span class='warning''>The inscription can be at most 20 characters long.</span>")
|
||||
else
|
||||
if(label_text == "")
|
||||
to_chat(user, "<span class='notice'>You scratch the inscription off of [initial(BB)].</span>")
|
||||
BB.name = initial(BB.name)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You inscribe \"[label_text]\" into \the [initial(BB.name)].</span>")
|
||||
BB.name = "[initial(BB.name)] \"[label_text]\""
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can only inscribe a metal bullet.</span>")//because inscribing beanbags is silly
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There is no bullet in the casing to inscribe anything into.</span>")
|
||||
..()
|
||||
|
||||
/obj/item/ammo_casing/screwdriver_act(mob/living/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(!BB)
|
||||
to_chat(user, "<span class='notice'>There is no bullet in the casing to inscribe anything into.</span>")
|
||||
return
|
||||
if(!initial(BB.name) == "bullet")
|
||||
to_chat(user, "<span class='notice'>You can only inscribe a metal bullet.</span>")//because inscribing beanbags is silly
|
||||
return
|
||||
|
||||
var/tmp_label = ""
|
||||
var/label_text = sanitize(input(user, "Inscribe some text into \the [initial(BB.name)]", "Inscription", tmp_label))
|
||||
|
||||
if(length(label_text) > 20)
|
||||
to_chat(user, "<span class='warning'>The inscription can be at most 20 characters long.</span>")
|
||||
return
|
||||
|
||||
if(label_text == "")
|
||||
to_chat(user, "<span class='notice'>You scratch the inscription off of [initial(BB)].</span>")
|
||||
BB.name = initial(BB.name)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You inscribe \"[label_text]\" into \the [initial(BB.name)].</span>")
|
||||
BB.name = "[initial(BB.name)] \"[label_text]\""
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/item/ammo_casing/decompile_act(obj/item/matter_decompiler/C, mob/user)
|
||||
if(!BB)
|
||||
C.stored_comms["metal"] += 1
|
||||
|
||||
@@ -356,7 +356,7 @@
|
||||
caliber = "foam_force"
|
||||
icon = 'icons/obj/guns/toy.dmi'
|
||||
icon_state = "foamdart"
|
||||
var/modified = 0
|
||||
var/modified = FALSE
|
||||
harmful = FALSE
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/update_desc()
|
||||
@@ -377,16 +377,22 @@
|
||||
/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
|
||||
if(istype(A, /obj/item/screwdriver) && !modified)
|
||||
modified = 1
|
||||
FD.damage_type = BRUTE
|
||||
update_icon()
|
||||
else if((istype(A, /obj/item/pen)) && modified && !FD.pen)
|
||||
if((istype(A, /obj/item/pen)) && modified && !FD.pen)
|
||||
if(!user.unEquip(A))
|
||||
return
|
||||
add_pen(A)
|
||||
to_chat(user, "<span class='notice'>You insert [A] into [src].</span>")
|
||||
return
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/screwdriver_act(mob/living/user, obj/item/I)
|
||||
if(modified)
|
||||
return
|
||||
|
||||
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
|
||||
I.play_tool_sound(src)
|
||||
modified = TRUE
|
||||
FD.damage_type = BRUTE
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/proc/add_pen(obj/item/pen/P)
|
||||
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
|
||||
|
||||
@@ -338,9 +338,11 @@
|
||||
to_chat(user, "<span class='notice'>You add the beaker to the machine.</span>")
|
||||
updateUsrDialog()
|
||||
icon_state = "pandemic1"
|
||||
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
if(beaker)
|
||||
beaker.forceMove(get_turf(src))
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/pandemic/screwdriver_act(mob/user, obj/item/I)
|
||||
if(beaker)
|
||||
eject_beaker()
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
@@ -205,6 +205,8 @@
|
||||
color = "#3C3C3C"
|
||||
taste_description = "motor oil"
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
/// What this becomes after burning.
|
||||
var/reagent_after_burning = "ash"
|
||||
|
||||
/datum/reagent/oil/reaction_temperature(exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > T0C + 600)
|
||||
@@ -219,13 +221,35 @@
|
||||
var/datum/effect_system/smoke_spread/bad/BS = new
|
||||
BS.set_up(1, 0, T)
|
||||
BS.start()
|
||||
if(!QDELETED(old_holder))
|
||||
old_holder.add_reagent("ash", round(volume * 0.5))
|
||||
if(!QDELETED(old_holder) && reagent_after_burning)
|
||||
old_holder.add_reagent(reagent_after_burning, round(volume * 0.5))
|
||||
|
||||
/datum/reagent/oil/reaction_turf(turf/T, volume)
|
||||
if(volume >= 3 && !isspaceturf(T) && !locate(/obj/effect/decal/cleanable/blood/oil) in T)
|
||||
if(volume >= 3 && !isspaceturf(T) && !(locate(/obj/effect/decal/cleanable/blood/oil) in T))
|
||||
new /obj/effect/decal/cleanable/blood/oil(T)
|
||||
|
||||
/datum/reagent/oil/cooking
|
||||
name = "Cooking Oil"
|
||||
id = "cooking_oil"
|
||||
description = "You should probably pour this down the sink, where it belongs."
|
||||
color = "#fbba16"
|
||||
taste_description = "old french fries"
|
||||
reagent_after_burning = "cooking_oil_inert"
|
||||
|
||||
/datum/reagent/oil/cooking/reaction_turf(turf/T, volume)
|
||||
if(volume >= 3 && !isspaceturf(T) && !(locate(/obj/effect/decal/cleanable/blood/oil/cooking) in T))
|
||||
new /obj/effect/decal/cleanable/blood/oil/cooking(T)
|
||||
|
||||
/datum/reagent/oil/cooking/inert
|
||||
name = "Burned Cooking Oil"
|
||||
description = "It's full of char and mixed with so much crud it's probably useless."
|
||||
id = "cooking_oil_inert"
|
||||
reagent_after_burning = null
|
||||
|
||||
/datum/reagent/oil/cooking/inert/reaction_temperature(exposed_temperature, exposed_volume)
|
||||
// don't do anything
|
||||
return
|
||||
|
||||
/datum/reagent/iodine
|
||||
name = "Iodine"
|
||||
id = "iodine"
|
||||
|
||||
@@ -1289,7 +1289,7 @@
|
||||
var/active = FALSE
|
||||
var/turf/target // this will be where the output objects are 'thrown' to.
|
||||
var/obj/structure/disposalpipe/trunk/linkedtrunk
|
||||
var/mode = 0
|
||||
var/mode = FALSE // Is the maintenance panel open? Different than normal disposal's mode
|
||||
|
||||
/obj/structure/disposaloutlet/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -1326,22 +1326,16 @@
|
||||
return
|
||||
AM.throw_at(target, 3, 1)
|
||||
|
||||
/obj/structure/disposaloutlet/screwdriver_act(mob/living/user, obj/item/I)
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/structure/disposaloutlet/attackby(obj/item/I, mob/user, params)
|
||||
if(!I || !user)
|
||||
return
|
||||
src.add_fingerprint(user)
|
||||
if(istype(I, /obj/item/screwdriver))
|
||||
if(mode==0)
|
||||
mode=1
|
||||
playsound(src.loc, I.usesound, 50, 1)
|
||||
to_chat(user, "You remove the screws around the power connection.")
|
||||
return
|
||||
else if(mode==1)
|
||||
mode=0
|
||||
playsound(src.loc, I.usesound, 50, 1)
|
||||
to_chat(user, "You attach the screws around the power connection.")
|
||||
return
|
||||
if(mode == FALSE)
|
||||
to_chat(user, "<span class='notice'>You remove the screws around the power connection</span>.")
|
||||
else if(mode == TRUE)
|
||||
to_chat(user, "<span class='notice'>You attach the screws around the power connection.</span>")
|
||||
I.play_tool_sound(src)
|
||||
mode = !mode
|
||||
return TRUE
|
||||
|
||||
/obj/structure/disposaloutlet/welder_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
|
||||
@@ -140,10 +140,6 @@
|
||||
air_update_turf()
|
||||
|
||||
/obj/machinery/r_n_d/server/attackby(obj/item/O as obj, mob/user as mob, params)
|
||||
if(istype(O, /obj/item/screwdriver))
|
||||
default_deconstruction_screwdriver(user, "RD-server-on_t", "RD-server-on", O)
|
||||
return 1
|
||||
|
||||
if(exchange_parts(user, O))
|
||||
return 1
|
||||
|
||||
@@ -155,6 +151,10 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/r_n_d/server/screwdriver_act(mob/living/user, obj/item/I)
|
||||
default_deconstruction_screwdriver(user, "RD-server-on_t", "RD-server-on", I)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/r_n_d/server/centcom
|
||||
name = "CentComm. Central R&D Database"
|
||||
server_id = -1
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "core removal"
|
||||
steps = list(/datum/surgery_step/slime/cut_flesh, /datum/surgery_step/slime/extract_core)
|
||||
target_mobtypes = list(/mob/living/simple_animal/slime)
|
||||
requires_bodypart = FALSE
|
||||
possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_R_ARM, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_R_LEG, BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_L_FOOT, BODY_ZONE_PRECISE_GROIN)
|
||||
|
||||
/datum/surgery/core_removal/can_start(mob/user, mob/living/carbon/target)
|
||||
|
||||
@@ -283,7 +283,7 @@ em {font-style: normal;font-weight: bold;}
|
||||
.supradio {color: #b88646;}
|
||||
.srvradio {color: #bbd164;}
|
||||
.proradio {color: #b84f92;}
|
||||
.admin_channel {color: #fcba03;font-weight: bold;}
|
||||
.admin_channel {color: #03fc9d;font-weight: bold;}
|
||||
.mentor_channel {color: #775BFF;font-weight: bold;}
|
||||
.mentor_channel_admin {color: #A35CFF;font-weight: bold;}
|
||||
.djradio {color: #996600;}
|
||||
|
||||
|
Before Width: | Height: | Size: 392 KiB After Width: | Height: | Size: 397 KiB |
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 194 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |