merge master

This commit is contained in:
Contrabang
2022-10-08 01:22:19 -04:00
parent e7dc3aa266
commit c3ec73a0f8
115 changed files with 875 additions and 565 deletions
+1
View File
@@ -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
+1 -1
View File
@@ -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>")
+2
View File
@@ -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
+1 -1
View File
@@ -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"
+1
View File
@@ -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
+10
View File
@@ -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
+25 -21
View File
@@ -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,
+12 -10
View File
@@ -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)
+12 -11
View File
@@ -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
+6 -7
View File
@@ -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)
+18 -12
View File
@@ -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)
+10
View File
@@ -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()
-3
View File
@@ -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
+2 -2
View File
@@ -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
+11 -7
View File
@@ -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
+11 -7
View File
@@ -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
+12 -7
View File
@@ -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()
+15 -12
View File
@@ -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
+5
View File
@@ -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
+6 -3
View File
@@ -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
+17 -16
View File
@@ -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)
+19 -14
View File
@@ -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
+28 -26
View File
@@ -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"
+97 -18
View File
@@ -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
+1 -1
View File
@@ -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
+10 -6
View File
@@ -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
+29 -17
View File
@@ -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."
+5 -5
View File
@@ -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
+13 -9
View File
@@ -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" : ""]"
+25 -23
View File
@@ -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()
+7 -8
View File
@@ -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"
+1 -3
View File
@@ -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)
+4 -4
View File
@@ -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"
+4
View File
@@ -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
+43 -39
View File
@@ -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)
+10 -7
View File
@@ -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
+12 -7
View File
@@ -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)
+26 -19
View File
@@ -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"
+10 -16
View File
@@ -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
+4 -4
View File
@@ -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
+1
View File
@@ -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;}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 KiB

After

Width:  |  Height:  |  Size: 397 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 131 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

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

Some files were not shown because too many files have changed in this diff Show More