Merge branch 'master' into hair-gradients

This commit is contained in:
dearmochi
2021-07-27 18:28:46 +02:00
812 changed files with 31957 additions and 47236 deletions
+4
View File
@@ -122,6 +122,10 @@
if(!in_range(user, src) || !isturf(user.loc) || user.incapacitated() || M.anchored)
return FALSE
if (isguardian(user))
if (M.loc == user.loc || user.alpha == 60) //Alpha is for detecting ranged guardians in scout mode
return //unmanifested guardians shouldn't be able to buckle mobs
add_fingerprint(user)
. = buckle_mob(M, check_loc = check_loc)
if(.)
@@ -222,7 +222,7 @@
anchored = TRUE
/obj/effect/decal/cleanable/insectguts
name = "cockroach guts"
name = "bug guts"
desc = "One bug squashed. Four more will rise in its place."
icon = 'icons/effects/blood.dmi'
icon_state = "xfloor1"
@@ -53,6 +53,9 @@
/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
return FALSE
/obj/effect/decal/cleanable/is_cleanable()
return TRUE
/obj/effect/decal/cleanable/Initialize(mapload)
. = ..()
if(loc && isturf(loc))
@@ -45,15 +45,15 @@
var/light = -1
var/flash = -1
// Clamp all values to MAX_EXPLOSION_RANGE
// We dont need to clamp here. It gets clamped inside explosion()
if(round(amount/12) > 0)
devastation = min (GLOB.max_ex_devastation_range, devastation + round(amount/12))
devastation += round(amount/12)
if(round(amount/6) > 0)
heavy = min (GLOB.max_ex_heavy_range, heavy + round(amount/6))
heavy += round(amount/6)
if(round(amount/3) > 0)
light = min (GLOB.max_ex_light_range, light + round(amount/3))
light += round(amount/3)
if(flashing && flashing_factor)
flash += (round(amount/4) * flashing_factor)
+3
View File
@@ -25,6 +25,9 @@
/obj/effect/acid_act()
return
/obj/effect/proc/is_cleanable() //Called when you want to clean something, and usualy delete it after
return FALSE
/obj/effect/mech_melee_attack(obj/mecha/M)
return 0
+1 -2
View File
@@ -135,8 +135,7 @@
var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0)
var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0)
spawn(0)
new /obj/effect/hallucination/delusion(victim.loc, victim, force_kind = "demon", duration = duration, skip_nearby = 0)
new /obj/effect/hallucination/delusion(get_turf(victim), victim, 'icons/mob/mob.dmi', "daemon")
var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
chainsaw.flags |= NODROP | DROPDEL
+6 -2
View File
@@ -14,6 +14,7 @@
var/precision = TRUE // how close to the portal you will teleport. FALSE = on the portal, TRUE = adjacent
var/can_multitool_to_remove = FALSE
var/ignore_tele_proof_area_setting = FALSE
var/one_use = FALSE // Does this portal go away after one teleport?
/obj/effect/portal/New(loc, turf/target, creator = null, lifespan = 300)
..()
@@ -101,14 +102,17 @@
if(prob(failchance))
icon_state = fail_icon
if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space.
var/list/target_z = levels_by_trait(SPAWN_RUINS)
target_z -= M.z
if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), pick(target_z)), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space.
invalid_teleport()
return FALSE
else
if(!do_teleport(M, target, precision, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to a turf adjacent to target.
invalid_teleport()
return FALSE
if(one_use)
qdel(src)
return TRUE
/obj/effect/portal/proc/invalid_teleport()
@@ -354,3 +354,12 @@
/obj/effect/temp_visual/impact_effect/ion
icon_state = "shieldsparkles"
duration = 6
/obj/effect/temp_visual/bsg_kaboom
name = "bluespace explosion"
icon = 'icons/effects/96x96.dmi'
icon_state = "explosionfast"
color = "blue"
pixel_x = -32
pixel_y = -32
duration = 42
+7 -7
View File
@@ -24,11 +24,11 @@
if(!ignorecap)
// Clamp all values to MAX_EXPLOSION_RANGE
devastation_range = min (GLOB.max_ex_devastation_range, devastation_range)
heavy_impact_range = min (GLOB.max_ex_heavy_range, heavy_impact_range)
light_impact_range = min (GLOB.max_ex_light_range, light_impact_range)
flash_range = min (GLOB.max_ex_flash_range, flash_range)
flame_range = min (GLOB.max_ex_flame_range, flame_range)
devastation_range = min(GLOB.configuration.general.bomb_cap / 4, devastation_range)
heavy_impact_range = min(GLOB.configuration.general.bomb_cap / 2, heavy_impact_range)
light_impact_range = min(GLOB.configuration.general.bomb_cap, light_impact_range)
flash_range = min(GLOB.configuration.general.bomb_cap, flash_range)
flame_range = min(GLOB.configuration.general.bomb_cap, flame_range)
var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range)
@@ -118,7 +118,7 @@
var/list/affected_turfs = spiral_range_turfs(max_range, epicenter)
if(config.reactionary_explosions)
if(GLOB.configuration.general.reactionary_explosions)
for(var/A in affected_turfs) // we cache the explosion block rating of every turf in the explosion area
var/turf/T = A
cached_exp_block[T] = 0
@@ -136,7 +136,7 @@
continue
var/dist = HYPOTENUSE(T.x, T.y, x0, y0)
if(config.reactionary_explosions)
if(GLOB.configuration.general.reactionary_explosions)
var/turf/Trajectory = T
while(Trajectory != epicenter)
Trajectory = get_step_towards(Trajectory, epicenter)
+11
View File
@@ -424,6 +424,17 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
/obj/item/proc/on_enter_storage(obj/item/storage/S as obj)
return
/**
* Called to check if this item can be put into a storage item.
*
* Return `FALSE` if `src` can't be inserted, and `TRUE` if it can.
* Arguments:
* * S - The [/obj/item/storage] that `src` is being inserted into.
* * user - The mob trying to insert the item.
*/
/obj/item/proc/can_enter_storage(obj/item/storage/S, mob/user)
return TRUE
// called when "found" in pockets and storage items. Returns 1 if the search should end.
/obj/item/proc/on_found(mob/finder as mob)
return
+5 -5
View File
@@ -28,10 +28,10 @@
<small>[fluffnotice]</small><hr>"
switch(get_area_type())
if(AREA_SPACE)
text += "<p>According to the [src.name], you are now in <b>outer space</b>. Hold your breath.</p> \
text += "<p>According to [src], you are now in <b>outer space</b>. Hold your breath.</p> \
<p><a href='?src=[UID()];create_area=1'>Mark this place as new area.</a></p>"
if(AREA_SPECIAL)
text += "<p>This place is not noted on the [src.name].</p>"
text += "<p>This place is not noted on [src].</p>"
return text
@@ -57,7 +57,7 @@
. = ..()
var/area/A = get_area()
if(get_area_type() == AREA_STATION)
. += "<p>According to the [src], you are now in <b>\"[sanitize(A.name)]\"</b>.</p>"
. += "<p>According to [src], you are now in <b>\"[sanitize(A.name)]\"</b>.</p>"
var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
popup.set_content(.)
popup.open()
@@ -79,7 +79,7 @@
. = ..()
var/area/A = get_area()
if(get_area_type() == AREA_STATION)
. += "<p>According to the [src], you are now in <b>\"[sanitize(A.name)]\"</b>.</p>"
. += "<p>According to [src], you are now in <b>\"[sanitize(A.name)]\"</b>.</p>"
var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
popup.set_content(.)
popup.open()
@@ -106,7 +106,7 @@
. = ..()
var/area/A = get_area()
if(get_area_type() == AREA_STATION)
. += "<p>According to the [src], you are now in <b>\"[sanitize(A.name)]\"</b>.</p>"
. += "<p>According to [src], you are now in <b>\"[sanitize(A.name)]\"</b>.</p>"
. += "<p>You may <a href='?src=[UID()];edit_area=1'> move an amendment</a> to the drawing.</p>"
if(!viewing)
. += "<p><a href='?src=[UID()];view_blueprints=1'>View structural data</a></p>"
+1 -1
View File
@@ -59,7 +59,7 @@
if(over_object == usr && (in_range(src, usr) || usr.contents.Find(src)))
if(!ishuman(usr) || opened || length(contents))
return FALSE
visible_message("[usr] folds up the [name]")
visible_message("<span class='notice'>[usr] folds up [src].</span>")
new item_path(get_turf(src))
qdel(src)
+7 -1
View File
@@ -30,6 +30,12 @@
else i = 3
icon_state = "candle[i][lit ? "_lit" : ""]"
/obj/item/candle/can_enter_storage(obj/item/storage/S, mob/user)
if(lit)
to_chat(user, "<span class='warning'>[S] can't hold [src] while it's lit!</span>")
return FALSE
else
return TRUE
/obj/item/candle/attackby(obj/item/W, mob/user, params)
if(is_hot(W))
@@ -40,7 +46,7 @@
/obj/item/candle/welder_act(mob/user, obj/item/I)
. = TRUE
if(I.tool_use_check(user, 0)) //Don't need to flash eyes because you are a badass
light("<span class='notice'>[user] casually lights the [name] with [I], what a badass.</span>")
light("<span class='notice'>[user] casually lights [src] with [I], what a badass.</span>")
/obj/item/candle/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
if(!lit)
-23
View File
@@ -1,23 +0,0 @@
/obj/item/changestone
name = "An uncut ruby"
desc = "The ruby shines and catches the light, despite being uncut"
icon = 'icons/obj/artifacts.dmi'
icon_state = "changerock"
/obj/item/changestone/attack_hand(mob/user as mob)
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
if(!H.gloves)
if(H.gender == FEMALE)
H.change_gender(MALE)
else
H.change_gender(FEMALE)
H.dna.ready_dna(H)
H.update_body()
..()
+4 -4
View File
@@ -237,23 +237,23 @@
//Spraycan stuff
/obj/item/toy/crayon/spraycan
icon_state = "spraycan_cap"
name = "\improper Nanotrasen-brand Rapid Paint Applicator"
desc = "A metallic container containing tasty paint."
icon_state = "spraycan_cap"
var/capped = 1
instant = 1
validSurfaces = list(/turf/simulated/floor,/turf/simulated/wall)
/obj/item/toy/crayon/spraycan/New()
..()
name = "Nanotrasen-brand Rapid Paint Applicator"
update_icon()
/obj/item/toy/crayon/spraycan/attack_self(mob/living/user as mob)
var/choice = input(user,"Spraycan options") in list("Toggle Cap","Change Drawing","Change Color")
switch(choice)
if("Toggle Cap")
to_chat(user, "<span class='notice'>You [capped ? "Remove" : "Replace"] the cap of the [src]</span>")
capped = capped ? 0 : 1
to_chat(user, "<span class='notice'>You [capped ? "remove" : "replace"] the cap of [src].</span>")
capped = !capped
icon_state = "spraycan[capped ? "_cap" : ""]"
update_icon()
if("Change Drawing")
@@ -1,81 +0,0 @@
// Airlock painter
/obj/item/airlock_painter
name = "airlock painter"
desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on a completed airlock to change its paintjob."
icon = 'icons/obj/device.dmi'
icon_state = "airlock_painter"
item_state = "airlock_painter"
flags = CONDUCT | NOBLUDGEON
usesound = 'sound/effects/spray2.ogg'
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
materials = list(MAT_METAL = 3000, MAT_GLASS = 1000)
var/paint_setting
// All the different paint jobs that an airlock painter can apply.
// If the airlock you're using it on is glass, the new paint job will also be glass
var/list/available_paint_jobs = list(
"Atmospherics" = /obj/machinery/door/airlock/atmos,
"Command" = /obj/machinery/door/airlock/command,
"Engineering" = /obj/machinery/door/airlock/engineering,
"External" = /obj/machinery/door/airlock/external,
"External Maintenance"= /obj/machinery/door/airlock/maintenance/external,
"Freezer" = /obj/machinery/door/airlock/freezer,
"Maintenance" = /obj/machinery/door/airlock/maintenance,
"Medical" = /obj/machinery/door/airlock/medical,
"Mining" = /obj/machinery/door/airlock/mining,
"Public" = /obj/machinery/door/airlock/public,
"Research" = /obj/machinery/door/airlock/research,
"Science" = /obj/machinery/door/airlock/science,
"Security" = /obj/machinery/door/airlock/security,
"Standard" = /obj/machinery/door/airlock,
)
//Only call this if you are certain that the painter will be used right after this check!
/obj/item/airlock_painter/proc/paint(mob/user)
playsound(loc, usesound, 30, TRUE)
return TRUE
/obj/item/airlock_painter/attack_self(mob/user)
paint_setting = input(user, "Please select a paintjob for this airlock.") as null|anything in available_paint_jobs
if(!paint_setting)
return
to_chat(user, "<span class='notice'>The [paint_setting] paint setting has been selected.</span>")
/obj/item/airlock_painter/suicide_act(mob/user)
var/obj/item/organ/internal/lungs/L = user.get_organ_slot("lungs")
var/lungs_name = "\improper[L.name]"
if(L)
user.visible_message("<span class='suicide'>[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
// Once you've inhaled the toner, you throw up your lungs
// and then die.
// they managed to lose their lungs between then and now. Good job.
if(!L)
return FALSE
L.remove(user)
// make some colorful reagent, and apply it to the lungs
L.create_reagents(10)
L.reagents.add_reagent("colorful_reagent", 10)
L.reagents.reaction(L, REAGENT_TOUCH, 1)
user.emote("scream")
user.visible_message("<span class='suicide'>[user] vomits out [user.p_their()] [lungs_name]!</span>")
playsound(user.loc, 'sound/effects/splat.ogg', 50, TRUE)
// make some vomit under the player, and apply colorful reagent
var/obj/effect/decal/cleanable/vomit/V = new(get_turf(user))
V.create_reagents(10)
V.reagents.add_reagent("colorful_reagent", 10)
V.reagents.reaction(V, REAGENT_TOUCH, 1)
L.forceMove(get_turf(user))
return OXYLOSS
else
return SHAME
+1 -1
View File
@@ -169,7 +169,7 @@
if(!S)
to_chat(user, "<span class='warning'>You can't scan this body part.</span>")
return
M.visible_message("<span class='warning'>[user] scans the wounds on [M]'s [S] with [src]</span>")
M.visible_message("<span class='warning'>[user] scans the wounds on [M]'s [S.name] with [src]</span>")
add_data(S)
return 1
+12 -12
View File
@@ -26,19 +26,19 @@
return 0
return 1
/obj/item/flash/attackby(obj/item/W, mob/user, params)
/obj/item/flash/attackby(obj/item/I, mob/user, params)
if(can_overcharge)
if(istype(W, /obj/item/screwdriver))
if(istype(I, /obj/item/screwdriver))
if(battery_panel)
to_chat(user, "<span class='notice'>You close the battery compartment on the [src].</span>")
to_chat(user, "<span class='notice'>You close the battery compartment on [src].</span>")
battery_panel = 0
else
to_chat(user, "<span class='notice'>You open the battery compartment on the [src].</span>")
to_chat(user, "<span class='notice'>You open the battery compartment on [src].</span>")
battery_panel = 1
if(battery_panel && !overcharged)
if(istype(W, /obj/item/stock_parts/cell))
to_chat(user, "<span class='notice'>You jam the cell into battery compartment on the [src].</span>")
qdel(W)
if(istype(I, /obj/item/stock_parts/cell))
to_chat(user, "<span class='notice'>You jam [I] into the battery compartment on [src].</span>")
qdel(I)
overcharged = 1
overlays += "overcharge"
@@ -51,7 +51,7 @@
/obj/item/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something.
broken = 1
icon_state = "[initial(icon_state)]burnt"
visible_message("<span class='notice'>The [src.name] burns out!</span>")
visible_message("<span class='notice'>[src] burns out!</span>")
/obj/item/flash/proc/flash_recharge(mob/user)
@@ -119,15 +119,15 @@
add_attack_logs(user, M, "Flashed with [src]")
if(M.flash_eyes(affect_silicon = 1))
M.Weaken(rand(5,10))
user.visible_message("<span class='disarm'>[user] overloads [M]'s sensors with the [src.name]!</span>", "<span class='danger'>You overload [M]'s sensors with the [src.name]!</span>")
user.visible_message("<span class='disarm'>[user] overloads [M]'s sensors with [src]!</span>", "<span class='danger'>You overload [M]'s sensors with [src]!</span>")
return 1
user.visible_message("<span class='disarm'>[user] fails to blind [M] with the [src.name]!</span>", "<span class='warning'>You fail to blind [M] with the [src.name]!</span>")
user.visible_message("<span class='disarm'>[user] fails to blind [M] with [src]!</span>", "<span class='warning'>You fail to blind [M] with [src]!</span>")
/obj/item/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
if(!try_use_flash(user))
return 0
user.visible_message("<span class='disarm'>[user]'s [src.name] emits a blinding light!</span>", "<span class='danger'>Your [src.name] emits a blinding light!</span>")
user.visible_message("<span class='disarm'>[user]'s [src] emits a blinding light!</span>", "<span class='danger'>Your [src] emits a blinding light!</span>")
for(var/mob/living/carbon/M in oviewers(3, null))
flash_carbon(M, user, 3, 0)
@@ -158,7 +158,7 @@
resisted = 1
if(resisted)
to_chat(user, "<span class='warning'>This mind seems resistant to the [name]!</span>")
to_chat(user, "<span class='warning'>This mind seems resistant to [src]!</span>")
else
to_chat(user, "<span class='warning'>They must be conscious before you can convert [M.p_them()]!</span>")
else
@@ -52,13 +52,13 @@
user.drop_item()
W.loc = src
diode = W
to_chat(user, "<span class='notice'>You install a [diode.name] in [src].</span>")
to_chat(user, "<span class='notice'>You install [diode] in [src].</span>")
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 the [diode.name] from the [src].</span>")
to_chat(user, "<span class='notice'>You remove [diode] from [src].</span>")
diode.loc = get_turf(src.loc)
diode = null
return
@@ -0,0 +1,61 @@
/datum/painter/airlock
module_name = "airlock painter"
module_desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on a completed airlock to change its paintjob."
module_state = "airlock_painter"
// All the different paint jobs that an airlock painter can apply.
// If the airlock you're using it on is glass, the new paint job will also be glass
var/list/available_paint_jobs = list(
"Atmospherics" = /obj/machinery/door/airlock/atmos,
"Command" = /obj/machinery/door/airlock/command,
"Engineering" = /obj/machinery/door/airlock/engineering,
"External" = /obj/machinery/door/airlock/external,
"External Maintenance"= /obj/machinery/door/airlock/maintenance/external,
"Freezer" = /obj/machinery/door/airlock/freezer,
"Maintenance" = /obj/machinery/door/airlock/maintenance,
"Medical" = /obj/machinery/door/airlock/medical,
"Mining" = /obj/machinery/door/airlock/mining,
"Public" = /obj/machinery/door/airlock/public,
"Research" = /obj/machinery/door/airlock/research,
"Science" = /obj/machinery/door/airlock/science,
"Security" = /obj/machinery/door/airlock/security,
"Standard" = /obj/machinery/door/airlock)
/datum/painter/airlock/pick_color(mob/user)
var/choice = input(user, "Please select a paintjob.") as null|anything in available_paint_jobs
if(!choice)
return
paint_setting = choice
to_chat(user, "<span class='notice'>The [paint_setting] paint setting has been selected.</span>")
/datum/painter/airlock/paint_atom(atom/target, mob/user)
if(!istype(target, /obj/machinery/door/airlock))
return
var/obj/machinery/door/airlock/A = target
if(!paint_setting)
to_chat(user, "<span class='warning'>You need to select a paintjob first.</span>")
return
if(!A.paintable)
to_chat(user, "<span class='warning'>This type of airlock cannot be painted.</span>")
return
var/obj/machinery/door/airlock/airlock = available_paint_jobs["[paint_setting]"] // get the airlock type path associated with the airlock name the user just chose
var/obj/structure/door_assembly/assembly = initial(airlock.assemblytype)
if(A.assemblytype == assembly)
to_chat(user, "<span class='notice'>This airlock is already painted with the \"[paint_setting]\" color scheme!</span>")
return
if(A.airlock_material == "glass" && initial(assembly.noglass)) // prevents painting glass airlocks with a paint job that doesn't have a glass version, such as the freezer
to_chat(user, "<span class='warning'>This paint job can only be applied to non-glass airlocks.</span>")
return
if(do_after(user, 2 SECONDS, FALSE, A))
// applies the user-chosen airlock's icon, overlays and assemblytype to the target airlock
A.icon = initial(airlock.icon)
A.overlays_file = initial(airlock.overlays_file)
A.assemblytype = initial(airlock.assemblytype)
A.update_icon()
return TRUE
@@ -1,20 +1,13 @@
// Floor painter
/obj/item/floor_painter
name = "floor painter"
icon = 'icons/obj/device.dmi'
icon_state = "floor_painter"
item_state = "floor_painter"
usesound = 'sound/effects/spray2.ogg'
/datum/painter/floor
module_name = "floor painter"
module_state = "floor_painter"
var/floor_icon
var/floor_state = "floor"
var/floor_dir = SOUTH
w_class = WEIGHT_CLASS_TINY
flags = CONDUCT
slot_flags = SLOT_BELT
var/static/list/allowed_states = list("arrival", "arrivalcorner", "bar", "barber", "bcircuit", "blackcorner", "blue", "bluecorner",
"bluefull", "bluered", "blueyellow", "blueyellowfull", "bot", "brown", "browncorner", "browncornerold", "brownold",
"cafeteria", "caution", "cautioncorner", "chapel", "cmo", "dark", "delivery", "escape", "escapecorner", "floor",
@@ -27,43 +20,37 @@
"whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow",
"yellowcorner", "yellowcornersiding", "yellowsiding")
/obj/item/floor_painter/afterattack(atom/A, mob/user, proximity, params)
if(!proximity)
/datum/painter/floor/paint_atom(atom/target, mob/user)
if(!istype(target, /turf/simulated/floor/plasteel))
to_chat(user, "<span class='warning'>[holder] can only be used on station flooring.</span>")
return
var/turf/simulated/floor/plasteel/F = A
var/turf/simulated/floor/plasteel/F = target
if(F.icon_state == floor_state && F.dir == floor_dir)
to_chat(user, "<span class='notice'>This is already painted [floor_state] [dir2text(floor_dir)]!</span>")
return
if(!istype(F))
to_chat(user, "<span class='warning'>\The [src] can only be used on station flooring.</span>")
return
playsound(loc, usesound, 30, TRUE)
F.icon_state = floor_state
F.icon_regular_floor = floor_state
F.dir = floor_dir
return TRUE
/obj/item/floor_painter/attack_self(mob/user)
/datum/painter/floor/pick_color(mob/user)
if(!user)
return 0
user.set_machine(src)
return
ui_interact(user)
return 1
/obj/item/floor_painter/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state)
/datum/painter/floor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "FloorPainter", name, 405, 470, master_ui, state)
ui = new(user, src, ui_key, "FloorPainter", module_name, 405, 470, master_ui, state)
// Disable automatic updates, because:
// 1) we are the only user of the item, and don't expect to observe external changes
// 2) generating and sending the icon each tick is a bit expensive, and creates small but noticeable lag
ui.set_autoupdate(FALSE)
ui.open()
/obj/item/floor_painter/ui_data(mob/user)
/datum/painter/floor/ui_data(mob/user)
var/list/data = list()
data["availableStyles"] = allowed_states
data["selectedStyle"] = floor_state
@@ -77,23 +64,22 @@
return data
/obj/item/floor_painter/ui_static_data(mob/user)
/datum/painter/floor/ui_static_data(mob/user)
var/list/data = list()
data["allStylesPreview"] = list()
for (var/style in allowed_states)
for(var/style in allowed_states)
var/icon/floor_icon = icon('icons/turf/floors.dmi', style, SOUTH)
data["allStylesPreview"][style] = icon2base64(floor_icon)
return data
/obj/item/floor_painter/ui_act(action, params)
/datum/painter/floor/ui_act(action, params)
if(..())
return
if(action == "select_style")
var/new_style = params["style"]
if (allowed_states.Find(new_style) != 0)
if(allowed_states.Find(new_style) != 0)
floor_state = new_style
if(action == "cycle_style")
@@ -107,7 +93,7 @@
if(action == "select_direction")
var/dir = text2dir(params["direction"])
if (dir != 0)
if(dir != 0)
floor_dir = dir
SStgui.update_uis(src)
@@ -0,0 +1,188 @@
/obj/item/painter
name = "modular painter"
icon = 'icons/obj/painting.dmi'
usesound = 'sound/effects/spray2.ogg'
flags = CONDUCT | NOBLUDGEON
w_class = WEIGHT_CLASS_SMALL
slot_flags = SLOT_BELT
materials = list(MAT_METAL = 5000, MAT_GLASS = 2000)
/// Associative list of painter types, with the value being the datum. (For use in the radial menu)
var/static/list/painter_type_list = list(
"Floor Painter" = /datum/painter/floor,
"Pipe Painter" = /datum/painter/pipe,
"Window Painter" = /datum/painter/pipe/window,
"Airlock Painter" = /datum/painter/airlock)
/// Associative list of painter types, with the value being the icon. (For use in the radial menu)
var/static/list/painter_icon_list = list(
"Floor Painter" = image(icon = 'icons/obj/painting.dmi', icon_state = "floor_painter"),
"Pipe Painter" = image(icon = 'icons/obj/painting.dmi', icon_state = "pipe_painter"),
"Window Painter" = image(icon = 'icons/obj/painting.dmi', icon_state = "window_painter"),
"Airlock Painter" = image(icon = 'icons/obj/painting.dmi', icon_state = "airlock_painter"))
/// The [/datum/painter] which is currently active.
var/datum/painter/selected_module = null
/// List of any instanced [/datum/painter]'s, to avoid spawning more than one of each.
var/list/module_list = list()
/obj/item/painter/Initialize(mapload, datum/painter/default_module = /datum/painter/floor) // Defaults to a floor painter
. = ..()
change_module(default_module)
/obj/item/painter/Destroy()
selected_module = null
for(var/I in module_list)
qdel(I)
module_list = list()
return ..()
/obj/item/painter/examine(mob/user)
. = ..()
. += "<span class='notice'>Ctrl+click it in your hand to change the type!</span>"
/**
* Changes the `selected_module` variable to `new_module`, and updates the painter to reflect the new type.
*
* If `new_module` is already present in `module_list`, then that will be used instead.
* Otherwise a new datum will be spawned and added to `module_list`.
* The Name, Description, Icon State, and Item State of the painter will be updated using variables from the `new_module` datum.
*
* Arguments:
* * datum/painter/new_module - The new painter datum which will be used.
* * mob/user - The user interacting with the painter.
*/
/obj/item/painter/proc/change_module(datum/painter/new_module, mob/user)
if(!new_module)
return
selected_module = null
for(var/I in module_list)
var/datum/painter/P = I
if(P.type == new_module)
selected_module = I
break
if(!selected_module)
var/datum/painter/P = new new_module(src, src)
module_list += P
selected_module = P
name = selected_module.module_name
desc = selected_module.module_desc
icon_state = selected_module.module_state
item_state = selected_module.module_state
if(user)
user.update_inv_l_hand()
user.update_inv_r_hand()
/**
* Calls `pick_color()` on the `selected_module`.
*/
/obj/item/painter/attack_self(mob/user)
selected_module.pick_color(user)
/**
* If adjacent, calls `paint_atom()` on the `selected_module`, then plays the `usesound`.
*/
/obj/item/painter/afterattack(atom/target, mob/user, proximity, params)
if(!proximity)
return
if(selected_module.paint_atom(target, user))
playsound(src, usesound, 30, TRUE)
/**
* Displays a radial menu for choosing a new painter module.
*/
/obj/item/painter/CtrlClick(mob/user)
. = ..()
if(!ishuman(user)) // Only want human players doing this
return
if(loc != user) // Not being held
return
playsound(src, 'sound/effects/pop.ogg', 50, TRUE)
var/choice = show_radial_menu(user, src, painter_icon_list, require_near = TRUE)
var/choice_path = painter_type_list[choice]
if(!choice_path || (selected_module.type == choice_path))
return
playsound(src, 'sound/machines/click.ogg', 50, TRUE)
do_sparks(1, FALSE, src)
change_module(choice_path, user)
/obj/item/painter/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
playsound(src, usesound, 50, TRUE)
var/obj/item/organ/internal/lungs/L = user.get_organ_slot("lungs")
var/turf/T = get_turf(user)
if(!do_mob(user, user, 3 SECONDS) || !L)
return SHAME
// Once you've inhaled the toner, you throw up your lungs
// and then die.
L.remove(user)
L.create_reagents(10)
L.reagents.add_reagent("colorful_reagent", 10)
L.reagents.reaction(L, REAGENT_TOUCH, 1)
L.forceMove(T)
user.emote("scream")
user.visible_message("<span class='suicide'>[user] vomits out [user.p_their()] [L.name]!</span>")
playsound(T, 'sound/effects/splat.ogg', 50, TRUE)
// make some vomit under the player, and apply colorful reagent
var/obj/effect/decal/cleanable/vomit/V = new(T)
V.create_reagents(10)
V.reagents.add_reagent("colorful_reagent", 10)
V.reagents.reaction(V, REAGENT_TOUCH, 1)
return OXYLOSS
/**
* # Painter Datum
*
* Contains variables for updating `holder`, as well as procs for choosing a colour and painting an atom.
*
* The `parent_painter` argument is REQUIRED when spawning this in order to link the datum to an [/obj/item/painter].
*/
/datum/painter
/// Name of the `holder` when using this module.
var/module_name = null
/// Desc of the `holder` when using this module.
var/module_desc = null
/// Icon and Item state of the `holder` when using this module.
var/module_state = null
/// The parent [/obj/item/painter] which this datum is linked to.
var/obj/item/painter/holder
/// The current colour or icon state setting.
var/paint_setting = null
/datum/painter/New(obj/item/painter/parent_painter)
..()
ASSERT(parent_painter)
holder = parent_painter
/datum/painter/ui_host() // For TGUI things.
return holder
/**
* Contains code to choose a new colour or icon state for the `paint_setting` variable.
*
* Called by `attack_self()` on the `holder` object.
*/
/datum/painter/proc/pick_color(mob/user)
return
/**
* Contains code to apply the `paint_setting` variable onto the target atom.
*
* Called by `afterattack()` on the `holder` object.
*/
/datum/painter/proc/paint_atom(atom/target, mob/user)
return
@@ -0,0 +1,35 @@
/datum/painter/pipe
module_name = "pipe painter"
module_state = "pipe_painter"
var/static/list/blacklisted_pipes = list(/obj/machinery/atmospherics/pipe/simple/heat_exchanging, /obj/machinery/atmospherics/pipe/simple/insulated)
var/static/list/modes = list()
/datum/painter/pipe/New()
..()
if(!length(modes))
for(var/C in GLOB.pipe_colors)
modes += "[C]"
paint_setting = pick(modes)
/datum/painter/pipe/pick_color(mob/user)
paint_setting = input("Which color do you want to use?", null, paint_setting) in modes
/datum/painter/pipe/paint_atom(atom/target, mob/user)
if(!istype(target, /obj/machinery/atmospherics/pipe))
return
var/obj/machinery/atmospherics/pipe/P = target
if(is_type_in_list(P, blacklisted_pipes))
return
if(P.pipe_color == GLOB.pipe_colors[paint_setting])
to_chat(user, "<span class='notice'>This pipe is aready painted [paint_setting]!</span>")
return
var/turf/T = get_turf(P)
if(P.level < 2 && T.level == 1 && T.intact)
to_chat(user, "<span class='warning'>You must remove the plating first.</span>")
return
P.change_color(GLOB.pipe_colors[paint_setting])
return TRUE
@@ -0,0 +1,21 @@
/datum/painter/pipe/window // Yes, this is a pipe painter subtype.
module_name = "window painter"
module_state = "window_painter"
var/static/list/paintable_windows = list(
/obj/structure/window/reinforced,
/obj/structure/window/basic,
/obj/structure/window/full/reinforced,
/obj/structure/window/full/basic,
/obj/machinery/door/window)
/datum/painter/pipe/window/paint_atom(atom/target, mob/user)
if(!is_type_in_list(target, paintable_windows))
return
var/obj/structure/window/W = target
if(W.color == GLOB.pipe_colors[paint_setting])
to_chat(user, "<span class='notice'>This window is aready painted [paint_setting]!</span>")
return
W.color = GLOB.pipe_colors[paint_setting]
return TRUE
@@ -1,40 +0,0 @@
/obj/item/pipe_painter
name = "pipe painter"
icon = 'icons/obj/device.dmi'
icon_state = "pipe_painter"
item_state = "pipe_painter"
usesound = 'sound/effects/spray2.ogg'
var/list/modes
var/mode
/obj/item/pipe_painter/New()
..()
modes = new()
for(var/C in GLOB.pipe_colors)
modes += "[C]"
mode = pick(modes)
/obj/item/pipe_painter/afterattack(atom/A, mob/user as mob)
if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated) || !in_range(user, A))
return
var/obj/machinery/atmospherics/pipe/P = A
if(P.pipe_color == "[GLOB.pipe_colors[mode]]")
to_chat(user, "<span class='notice'>This pipe is aready painted [mode]!</span>")
return
var/turf/T = P.loc
if(P.level < 2 && T.level==1 && isturf(T) && T.intact)
to_chat(user, "<span class='warning'>You must remove the plating first.</span>")
return
playsound(loc, usesound, 30, TRUE)
P.change_color(GLOB.pipe_colors[mode])
/obj/item/pipe_painter/attack_self(mob/user as mob)
mode = input("Which colour do you want to use?", name, mode) in modes
/obj/item/pipe_painter/examine(mob/user)
. = ..()
. += "<span class='notice'>It is in [mode] mode.</span>"
@@ -50,10 +50,10 @@
/obj/item/pizza_bomb/proc/go_boom()
if(disarmed)
visible_message("<span class='danger'>[bicon(src)] Sparks briefly jump out of the [correct_wire] wire on \the [src], but it's disarmed!")
visible_message("<span class='danger'>[bicon(src)] Sparks briefly jump out of the [correct_wire] wire on [src], but it's disarmed!</span>")
return
atom_say("Enjoy the pizza!")
src.visible_message("<span class='userdanger'>\The [src] violently explodes!</span>")
visible_message("<span class='userdanger'>[src] violently explodes!</span>")
explosion(src.loc,1,2,4,flame_range = 2) //Identical to a minibomb
qdel(src)
@@ -50,6 +50,10 @@
/obj/item/radio/beacon/bacon/proc/digest_delay()
QDEL_IN(src, 600)
/obj/item/radio/beacon/emagged
syndicate = TRUE
emagged = TRUE
// SINGULO BEACON SPAWNER
/obj/item/radio/beacon/syndicate
name = "suspicious beacon"
@@ -71,6 +75,18 @@
user.drop_item()
qdel(src)
/obj/item/radio/beacon/syndicate/power_sink
name = "suspicious beacon"
desc = "A label on it reads: <i>Warning: Activating this device will send a power sink to your location</i>."
/obj/item/radio/beacon/syndicate/power_sink/attack_self(mob/user)
if(user)
to_chat(user, "<span class='notice'>Locked In</span>")
new /obj/item/powersink(user.loc)
playsound(src, 'sound/effects/pop.ogg', 100, TRUE, 1)
user.drop_item()
qdel(src)
/obj/item/radio/beacon/syndicate/bomb
name = "suspicious beacon"
desc = "A label on it reads: <i>Warning: Activating this device will send a high-ordinance explosive to your location</i>."
@@ -264,6 +264,9 @@ REAGENT SCANNER
else
to_chat(user, "<span class='notice'>Subject's genes are stable.</span>")
if(HAS_TRAIT(H, TRAIT_HUSK))
to_chat(user, "<span class='danger'>Subject is husked. Application of synthflesh is recommended.</span>")
/obj/item/healthanalyzer/attack_self(mob/user)
toggle_mode()
@@ -305,7 +305,7 @@
if(ruined)
return
to_chat(usr, "You erase the data from the [src]")
to_chat(usr, "<span class='notice'>You erase the data from [src].</span>")
clear()
/obj/item/tape/proc/clear()
@@ -162,7 +162,7 @@ effective or pretty fucking useless.
return ..()
/obj/item/jammer/attack_self(mob/user)
to_chat(user,"<span class='notice'>You [active ? "deactivate" : "activate"] the [src].</span>")
to_chat(user, "<span class='notice'>You [active ? "deactivate" : "activate"] [src].</span>")
active = !active
if(active)
GLOB.active_jammers |= src
@@ -170,7 +170,7 @@ effective or pretty fucking useless.
GLOB.active_jammers -= src
/obj/item/teleporter
name = "Syndicate teleporter"
name = "\improper Syndicate teleporter"
desc = "A strange syndicate version of a cult veil shifter. Warrenty voided if exposed to EMP."
icon = 'icons/obj/device.dmi'
icon_state = "syndi-tele"
@@ -211,17 +211,17 @@ effective or pretty fucking useless.
if(prob(50 / severity))
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/user = loc
to_chat(user, "<span class='danger'>The [src] buzzes and activates!</span>")
to_chat(user, "<span class='userdanger'>[src] buzzes and activates!</span>")
attempt_teleport(user, TRUE)
else
visible_message("<span class='warning'> The [src] activates and blinks out of existence!</span>")
visible_message("<span class='danger'>[src] activates and blinks out of existence!</span>")
do_sparks(2, 1, src)
qdel(src)
/obj/item/teleporter/proc/attempt_teleport(mob/user, EMP_D = FALSE)
dir_correction(user)
if(!charges)
to_chat(user, "<span class='warning'>The [src] is recharging still.</span>")
to_chat(user, "<span class='warning'>[src] is still recharging.</span>")
return
var/mob/living/carbon/C = user
@@ -247,7 +247,7 @@ effective or pretty fucking useless.
if(found_turf)
if(user.loc != mobloc) // No locker / mech / sleeper teleporting, that breaks stuff
to_chat(C, "<span class='danger'>The [src] will not work here!</span>")
to_chat(C, "<span class='danger'>[src] will not work here!</span>")
charges--
var/turf/destination = pick(turfs)
if(tile_check(destination) || flawless) // Why is there so many bloody floor types
@@ -264,7 +264,7 @@ effective or pretty fucking useless.
else // Emp activated? Bag of holding? No saving throw for you
get_fragged(user, destination)
else
to_chat(C, "<span class='danger'>The [src] will not work here!</span>")
to_chat(C, "<span class='danger'>[src] will not work here!</span>")
/obj/item/teleporter/proc/tile_check(turf/T)
if(istype(T, /turf/simulated/floor) || istype(T, /turf/space))
@@ -273,20 +273,20 @@ effective or pretty fucking useless.
/obj/item/teleporter/proc/dir_correction(mob/user) //Direction movement, screws with teleport distance and saving throw, and thus must be removed first
var/temp_direction = user.dir
switch(temp_direction)
if(NORTHEAST || SOUTHEAST)
if(NORTHEAST, SOUTHEAST)
user.dir = EAST
if(NORTHWEST || SOUTHWEST)
if(NORTHWEST, SOUTHWEST)
user.dir = WEST
/obj/item/teleporter/proc/panic_teleport(mob/user, turf/destination, direction = NORTH)
var/saving_throw
switch(direction)
if(NORTH || SOUTH)
if(NORTH, SOUTH)
if(prob(50))
saving_throw = EAST
else
saving_throw = WEST
if(EAST || WEST)
if(EAST, WEST)
if(prob(50))
saving_throw = NORTH
else
@@ -345,7 +345,7 @@ effective or pretty fucking useless.
M.apply_damage(20, BRUTE)
M.Stun(3)
M.Weaken(3)
to_chat(M, "<span_class='warning'> [user] teleports into you, knocking you to the floor with the bluespace wave!</span>")
to_chat(M, "<span_class='warning'>[user] teleports into you, knocking you to the floor with the bluespace wave!</span>")
/obj/item/paper/teleporter
name = "Teleporter Guide"
@@ -59,7 +59,7 @@
user.remove_from_mob(A)
attached_device = A
A.forceMove(src)
to_chat(user, "<span class='notice'>You attach the [A] to the valve controls and secure it.</span>")
to_chat(user, "<span class='notice'>You attach [A] to the valve controls and secure it.</span>")
A.holder = src
A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb).
if(istype(attached_device, /obj/item/assembly/prox_sensor))
@@ -1,22 +0,0 @@
/obj/item/pipe_painter/window_painter
name = "window painter"
icon_state = "window_painter"
var/list/paintable_windows = list(
/obj/structure/window/reinforced,
/obj/structure/window/basic,
/obj/structure/window/full/reinforced,
/obj/structure/window/full/basic,
/obj/machinery/door/window)
/obj/item/pipe_painter/window_painter/afterattack(atom/A, mob/user as mob)
if(!is_type_in_list(A, paintable_windows) || !in_range(user, A))
return
var/obj/structure/window/W = A
if(W.color == GLOB.pipe_colors[mode])
to_chat(user, "<span class='notice'>This window is aready painted [mode]!</span>")
return
playsound(loc, usesound, 30, TRUE)
W.color = GLOB.pipe_colors[mode]
+33 -33
View File
@@ -50,22 +50,22 @@
icon_state = initial(icon_state)
/obj/item/flag/nt
name = "Nanotrasen flag"
name = "\improper Nanotrasen flag"
desc = "A flag proudly boasting the logo of NT."
icon_state = "ntflag"
/obj/item/flag/clown
name = "Clown Planet flag"
name = "\improper Clown Planet flag"
desc = "The banner of His Majesty, King Squiggles the Eighth."
icon_state = "clownflag"
/obj/item/flag/mime
name = "Mime Revolution flag"
name = "\improper Mime Revolution flag"
desc = "The banner of the glorious revolutionary forces fighting the oppressors on Clown Planet."
icon_state = "mimeflag"
/obj/item/flag/ian
name = "Ian flag"
name = "\improper Ian flag"
desc = "The banner of Ian, because SQUEEEEE."
icon_state = "ianflag"
@@ -73,128 +73,128 @@
//Species flags
/obj/item/flag/species/slime
name = "Slime People flag"
name = "\improper Slime People flag"
desc = "A flag proudly proclaiming the superior heritage of Slime People."
icon_state = "slimeflag"
/obj/item/flag/species/skrell
name = "Skrell flag"
name = "\improper Skrell flag"
desc = "A flag proudly proclaiming the superior heritage of Skrell."
icon_state = "skrellflag"
/obj/item/flag/species/vox
name = "Vox flag"
name = "\improper Vox flag"
desc = "A flag proudly proclaiming the superior heritage of Vox."
icon_state = "voxflag"
/obj/item/flag/species/machine
name = "Synthetics flag"
name = "\improper Synthetics flag"
desc = "A flag proudly proclaiming the superior heritage of Synthetics."
icon_state = "machineflag"
/obj/item/flag/species/diona
name = "Diona flag"
name = "\improper Diona flag"
desc = "A flag proudly proclaiming the superior heritage of Dionae."
icon_state = "dionaflag"
/obj/item/flag/species/human
name = "Human flag"
name = "\improper Human flag"
desc = "A flag proudly proclaiming the superior heritage of Humans."
icon_state = "humanflag"
/obj/item/flag/species/greys
name = "Greys flag"
name = "\improper Greys flag"
desc = "A flag proudly proclaiming the superior heritage of Greys."
icon_state = "greysflag"
/obj/item/flag/species/kidan
name = "Kidan flag"
name = "\improper Kidan flag"
desc = "A flag proudly proclaiming the superior heritage of Kidan."
icon_state = "kidanflag"
/obj/item/flag/species/taj
name = "Tajaran flag"
name = "\improper Tajaran flag"
desc = "A flag proudly proclaiming the superior heritage of Tajaran."
icon_state = "tajflag"
/obj/item/flag/species/unathi
name = "Unathi flag"
name = "\improper Unathi flag"
desc = "A flag proudly proclaiming the superior heritage of Unathi."
icon_state = "unathiflag"
/obj/item/flag/species/vulp
name = "Vulpkanin flag"
name = "\improper Vulpkanin flag"
desc = "A flag proudly proclaiming the superior heritage of Vulpkanin."
icon_state = "vulpflag"
/obj/item/flag/species/drask
name = "Drask flag"
name = "\improper Drask flag"
desc = "A flag proudly proclaiming the superior heritage of Drask."
icon_state = "draskflag"
/obj/item/flag/species/plasma
name = "Plasmaman flag"
name = "\improper Plasmaman flag"
desc = "A flag proudly proclaiming the superior heritage of Plasmamen."
icon_state = "plasmaflag"
//Department Flags
/obj/item/flag/cargo
name = "Cargonia flag"
name = "\improper Cargonia flag"
desc = "The flag of the independent, sovereign nation of Cargonia."
icon_state = "cargoflag"
/obj/item/flag/med
name = "Medistan flag"
name = "\improper Medistan flag"
desc = "The flag of the independent, sovereign nation of Medistan."
icon_state = "medflag"
/obj/item/flag/sec
name = "Brigston flag"
name = "\improper Brigston flag"
desc = "The flag of the independent, sovereign nation of Brigston."
icon_state = "secflag"
/obj/item/flag/rnd
name = "Scientopia flag"
name = "\improper Scientopia flag"
desc = "The flag of the independent, sovereign nation of Scientopia."
icon_state = "rndflag"
/obj/item/flag/atmos
name = "Atmosia flag"
name = "\improper Atmosia flag"
desc = "The flag of the independent, sovereign nation of Atmosia."
icon_state = "atmosflag"
/obj/item/flag/command
name = "Command flag"
name = "\improper Command flag"
desc = "The flag of the independent, sovereign nation of Command."
icon_state = "ntflag"
//Antags
/obj/item/flag/grey
name = "Greytide flag"
name = "\improper Greytide flag"
desc = "A banner made from an old grey jumpsuit."
icon_state = "greyflag"
/obj/item/flag/syndi
name = "Syndicate flag"
name = "\improper Syndicate flag"
desc = "A flag proudly boasting the logo of the Syndicate, in defiance of NT."
icon_state = "syndiflag"
/obj/item/flag/wiz
name = "Wizard Federation flag"
name = "\improper Wizard Federation flag"
desc = "A flag proudly boasting the logo of the Wizard Federation, sworn enemies of NT."
icon_state = "wizflag"
/obj/item/flag/cult
name = "Nar'Sie Cultist flag"
name = "\improper Nar'Sie Cultist flag"
desc = "A flag proudly boasting the logo of the cultists, sworn enemies of NT."
icon_state = "cultflag"
//Chameleon
/obj/item/flag/chameleon
name = "Chameleon flag"
name = "chameleon flag"
desc = "A poor recreation of the official NT flag. It seems to shimmer a little."
icon_state = "ntflag"
origin_tech = "syndicate=1;magnets=4"
@@ -239,17 +239,17 @@
boobytrap = I
trapper = user
I.forceMove(src)
to_chat(user, "<span class='notice'>You hide [I] in the [src]. It will detonate some time after the flag is lit on fire.</span>")
to_chat(user, "<span class='notice'>You hide [I] in [src]. It will detonate some time after the flag is lit on fire.</span>")
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
log_game("[key_name(user)] has hidden [I] in the [src] ready for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
investigate_log("[key_name(user)] has hidden [I] in the [src] ready for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).", INVESTIGATE_BOMB)
log_game("[key_name(user)] has hidden [I] in [src] ready for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
investigate_log("[key_name(user)] has hidden [I] in [src] ready for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).", INVESTIGATE_BOMB)
add_attack_logs(user, src, "has hidden [I] ready for detonation in", ATKLOG_MOST)
else if(is_hot(I) && !(resistance_flags & ON_FIRE) && boobytrap && trapper)
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
log_game("[key_name_admin(user)] has lit the [src] trapped with [boobytrap] by [key_name_admin(trapper)] at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
investigate_log("[key_name_admin(user)] has lit the [src] trapped with [boobytrap] by [key_name_admin(trapper)] at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).", INVESTIGATE_BOMB)
log_game("[key_name_admin(user)] has lit [src] trapped with [boobytrap] by [key_name_admin(trapper)] at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
investigate_log("[key_name_admin(user)] has lit [src] trapped with [boobytrap] by [key_name_admin(trapper)] at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).", INVESTIGATE_BOMB)
add_attack_logs(user, src, "has lit (booby trapped with [boobytrap]", ATKLOG_FEW)
burn()
else
-72
View File
@@ -42,75 +42,3 @@
table_smacks_left--
if(table_smacks_left <= 0)
qdel(src)
/obj/item/kisser
name = "kiss"
desc = "I want you all to know, everyone and anyone, to seal it with a kiss."
icon = 'icons/mob/animal.dmi'
icon_state = "heart"
item_state = "nothing"
force = 0
throwforce = 0
flags = DROPDEL | ABSTRACT
/// The kind of projectile this version of the kiss blower fires
var/kiss_type = /obj/item/projectile/kiss
/obj/item/kisser/afterattack(atom/target, mob/user, flag, params)
var/turf/user_turf = get_turf(user)
var/obj/item/projectile/blown_kiss = new kiss_type(user_turf)
user.visible_message("<b>[user]</b> blows \a [blown_kiss] at [target]!", "<span class='notice'>You blow \a [blown_kiss] at [target]!</span>")
//Shooting Code:
blown_kiss.spread = 0
blown_kiss.original = target
blown_kiss.firer = user // don't hit ourself that would be really annoying
blown_kiss.preparePixelProjectile(target, user_turf, user, params)
blown_kiss.fire()
qdel(src)
/obj/item/kisser/death
name = "kiss of death"
desc = "If looks could kill, they'd be this."
color = COLOR_BLACK
kiss_type = /obj/item/projectile/kiss/death
/obj/item/projectile/kiss
name = "kiss"
icon = 'icons/mob/animal.dmi'
icon_state = "heart"
hitsound = 'sound/effects/kiss.ogg'
hitsound_wall = 'sound/effects/kiss.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
speed = 1.6
damage_type = BRUTE
damage = 0
nodamage = TRUE // love can't actually hurt you
armour_penetration = 100 // but if it could, it would cut through even the thickest plate
flag = "magic" // and most importantly, love is magic~
/obj/item/projectile/kiss/fire(angle)
if(firer)
name = "[name] blown by [firer]"
return ..()
/obj/item/projectile/kiss/on_hit(atom/target, blocked, hit_zone)
def_zone = BODY_ZONE_HEAD // let's keep it PG, people
. = ..()
/obj/item/projectile/kiss/death
name = "kiss of death"
nodamage = FALSE // okay i kinda lied about love not being able to hurt you
damage = 35
sharp = TRUE
color = COLOR_BLACK
/obj/item/projectile/kiss/death/on_hit(atom/target, blocked, pierce_hit)
. = ..()
if(!iscarbon(target))
return
var/mob/living/carbon/heartbreakee = target
var/obj/item/organ/internal/heart/dont_go_breakin_my_heart = heartbreakee.get_organ_slot("heart")
if(dont_go_breakin_my_heart)
dont_go_breakin_my_heart.receive_damage(999)
else // You're probably a snowflakey species or Xenomorph
heartbreakee.adjustFireLoss(1000) // the sickest of burns
+1 -1
View File
@@ -104,7 +104,7 @@
dat += {"<B>[display_name]:</B> [R.volume] unit\s<BR>"}
if(items_counts.len==0 && reagents.reagent_list.len==0)
dat = {"<B>The [src] is empty</B><BR>"}
dat = {"<B>[src] is empty</B><BR>"}
else
dat = {"<b>Ingredients:</b><br>[dat]"}
dat += {"<HR><BR> <A href='?src=[UID()];action=dispose'>Eject ingredients!</A><BR>"}
@@ -28,5 +28,5 @@
return TRUE
/obj/item/mounted/frame/apc_frame/do_build(turf/on_wall, mob/user)
new /obj/machinery/power/apc(get_turf(src), get_dir(user, on_wall), 1)
new /obj/machinery/power/apc(get_turf(src), get_dir(user, on_wall), TRUE)
qdel(src)
+4 -4
View File
@@ -4,12 +4,12 @@
/obj/item/toy/random
name = "Random Toy"
/obj/item/toy/random/New()
/obj/item/toy/random/Initialize(mapload)
..()
var/list/types = list(/obj/item/gun/projectile/shotgun/toy/crossbow, /obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/prize)
var/list/types = list(/obj/item/gun/projectile/shotgun/toy/crossbow, /obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/figure/mech)
var/T = pick(types)
new T(loc)
qdel(src)
return INITIALIZE_HINT_QDEL
// -------------------------------------
// Random cleanables, clearly this makes sense
@@ -267,7 +267,7 @@
/mob/living/simple_animal/hostile/creature,/mob/living/simple_animal/hostile/pirate/ranged,
/mob/living/simple_animal/hostile/hivebot,/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/pirate)
visible_message("<span class='warning'>Something falls out of the [src]!</span>")
visible_message("<span class='warning'>Something falls out of [src]!</span>")
var/obj/item/grenade/clusterbuster/C = new(src.loc)
C.prime()
sleep(10)
+2 -2
View File
@@ -226,7 +226,7 @@
to_chat(user, "<span class='warning'>Sticking an empty [M] into the frame would sort of defeat the purpose.</span>")
return
if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob,"nonhumandept"))
if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob, "nonhumandept"))
to_chat(user, "<span class='warning'>This [W] is not fit to serve as a cyborg!</span>")
return
@@ -251,7 +251,7 @@
return
if(M.brainmob.mind in SSticker.mode.head_revolutionaries)
to_chat(user, "<span class='warning'>The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [M].</span>")
to_chat(user, "<span class='warning'>The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept [M].</span>")
return
@@ -71,7 +71,7 @@
if(replacement_type in special_rechargables)
R.module.special_rechargables += replacement
R.module.rebuild_modules()
R.module?.rebuild_modules()
return TRUE
/obj/item/borg/upgrade/reset
+4
View File
@@ -23,6 +23,10 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
usesound = 'sound/items/deconstruct.ogg'
merge_type = /obj/item/stack/rods
/obj/item/stack/rods/detailed_examine()
return "Made from metal sheets. You can build a grille by using it in your hand. \
Clicking on a floor without any tiles will reinforce the floor. You can make reinforced glass by combining rods and normal glass sheets."
/obj/item/stack/rods/cyborg
energy_type = /datum/robot_energy_storage/rods
is_cyborg = TRUE
+16 -2
View File
@@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 10), \
new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 20, on_floor = TRUE), \
new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \
new/datum/stack_recipe("wall aquarium", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \
))
/obj/item/stack/sheet/glass
@@ -36,6 +36,9 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
merge_type = /obj/item/stack/sheet/glass
point_value = 1
/obj/item/stack/sheet/glass/detailed_examine()
return "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets."
/obj/item/stack/sheet/glass/fifty
amount = 50
@@ -44,6 +47,10 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
is_cyborg = TRUE
materials = list()
/obj/item/stack/sheet/glass/cyborg/detailed_examine()
return "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets.<br>\
As a synthetic, you can acquire more sheets of glass by recharging."
/obj/item/stack/sheet/glass/New(loc, amount)
recipes = GLOB.glass_recipes
..()
@@ -56,7 +63,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
to_chat(user, "<b>There is not enough wire in this coil. You need 5 lengths.</b>")
return
CC.use(5)
to_chat(user, "<span class='notice'>You attach wire to the [name].</span>")
to_chat(user, "<span class='notice'>You attach wire to [src].</span>")
new /obj/item/stack/light_w(user.loc)
use(1)
else if( istype(W, /obj/item/stack/rods) )
@@ -103,6 +110,9 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
recipes = GLOB.reinforced_glass_recipes
..()
/obj/item/stack/sheet/rglass/detailed_examine()
return "Use in your hand to build a window. Reinforced glass is much stronger against damage."
GLOBAL_LIST_INIT(pglass_recipes, list ( \
new/datum/stack_recipe/window("directional window", /obj/structure/window/plasmabasic, time = 0, on_floor = TRUE, window_checks = TRUE), \
new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/plasmabasic, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
@@ -113,6 +123,10 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
is_cyborg = TRUE
materials = list()
/obj/item/stack/sheet/rglass/cyborg/detailed_examine()
return "Use in your hand to build a window. Reinforced glass is much stronger against damage.<br>\
As a synthetic, you can gain more reinforced glass by recharging."
/obj/item/stack/sheet/plasmaglass
name = "plasma glass"
desc = "A very strong and very resistant sheet of a plasma-glass alloy."
@@ -83,7 +83,6 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \
null, \
new/datum/stack_recipe("Clown Statue", /obj/structure/statue/bananium/clown, 5, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("bananium computer frame", /obj/structure/computerframe/HONKputer, 50, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("bananium grenade casing", /obj/item/grenade/bananade/casing, 4, on_floor = 1), \
))
@@ -114,6 +114,10 @@ GLOBAL_LIST_INIT(metal_recipes, list(
is_cyborg = TRUE
materials = list()
/obj/item/stack/sheet/metal/cyborg/detailed_examine()
return "Use in your hand to bring up the recipe menu. If you have enough sheets, click on something on the list to build it.<br>\
You can replenish your supply of metal as a synthetic by recharging."
/obj/item/stack/sheet/metal/fifty
amount = 50
@@ -378,6 +382,8 @@ GLOBAL_LIST_INIT(cult_recipes, list ( \
if(!iscultist(user))
to_chat(user, "<span class='warning'>Only one with forbidden knowledge could hope to work this metal...</span>")
return
if(usr.holy_check())
return
if(!is_level_reachable(user.z))
to_chat(user, "<span class='warning'>The energies of this place interfere with the metal shaping!</span>")
return
@@ -16,3 +16,6 @@
usesound = 'sound/items/deconstruct.ogg'
toolspeed = 1
var/wall_allowed = TRUE //determines if sheet can be used in wall construction or not.
/obj/item/stack/sheet/detailed_examine()
return "Use in your hand to bring up the recipe menu. If you have enough sheets, click on something on the list to build it."
+11 -5
View File
@@ -25,7 +25,7 @@
var/to_transfer = 0
var/max_amount = 50 //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
var/merge_type = null // This path and its children should merge with this stack, defaults to src.type
var/recipe_width = 400 //Width of the recipe popup
var/recipe_width = 400 //Width of the recipe popup
var/recipe_height = 400 //Height of the recipe popup
/obj/item/stack/New(loc, new_amount, merge = TRUE)
@@ -198,7 +198,7 @@
return FALSE
if(R.window_checks && !valid_window_location(usr.loc, usr.dir))
to_chat(usr, "<span class='warning'>The [R.title] won't fit here!</span>")
to_chat(usr, "<span class='warning'>\The [R.title] won't fit here!</span>")
return FALSE
if(R.one_per_turf && (locate(R.result_type) in usr.drop_location()))
@@ -209,9 +209,15 @@
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed on the floor!</span>")
return FALSE
if(R.no_cult_structure && (locate(/obj/structure/cult) in usr.drop_location()))
to_chat(usr, "<span class='warning'>There is a structure here!</span>")
return FALSE
if(R.no_cult_structure)
if(usr.holy_check())
return
if(!is_level_reachable(usr.z))
to_chat(usr, "<span class='warning'>The energies of this place interfere with the metal shaping!</span>")
return
if(locate(/obj/structure/cult) in usr.drop_location())
to_chat(usr, "<span class='warning'>There is a structure here!</span>")
return FALSE
if(R.time)
to_chat(usr, "<span class='notice'>Building [R.title] ...</span>")
@@ -1,7 +1,6 @@
/obj/item/stack/telecrystal
name = "telecrystal"
desc = "It seems to be pulsing with suspiciously enticing energies."
description_antag = "Telecrystals can be activated by utilizing them on devices with an actively running uplink. They will not activate on unactivated uplinks."
singular_name = "telecrystal"
icon = 'icons/obj/telescience.dmi'
icon_state = "telecrystal"
@@ -34,6 +33,9 @@
use(amount)
to_chat(user, "<span class='notice'>You slot [src] into [cart]. The next time it's used, it will also give telecrystals</span>")
/obj/item/stack/telecrystal/detailed_examine_antag()
return "Telecrystals can be activated by utilizing them on devices with an actively running uplink. They will not activate on unactivated uplinks."
/obj/item/stack/telecrystal/five
amount = 5
-1
View File
@@ -9,7 +9,6 @@
slot_flags = SLOT_BELT
force = 5
throwforce = 7
item_state = "crowbar"
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50)
drop_sound = 'sound/items/handling/crowbar_drop.ogg'
@@ -83,6 +83,9 @@
if(chunk)
if(chunk.seenby.len)
for(var/mob/camera/aiEye/A in chunk.seenby)
//Checks if the A is to be detected or not
if(!A.ai_detector_visible)
continue
var/turf/detect_turf = get_turf(A)
if(get_dist(our_turf, detect_turf) < rangealert)
detect_state = PROXIMITY_ON_SCREEN
@@ -57,4 +57,8 @@
// Used in a callback that is passed by use_tool into do_after call. Do not override, do not call manually.
/obj/item/proc/tool_check_callback(mob/living/user, atom/target, amount, datum/callback/extra_checks)
return tool_use_check(user, amount) && (extra_checks && !extra_checks.Invoke())
if(!tool_use_check(user, amount))
return TRUE
if(extra_checks && !extra_checks.Invoke())
return TRUE
return FALSE
+9 -2
View File
@@ -16,7 +16,7 @@
w_class = WEIGHT_CLASS_SMALL
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF
materials = list(MAT_METAL=70, MAT_GLASS=30)
materials = list(MAT_METAL = 70, MAT_GLASS = 20)
origin_tech = "engineering=1;plasmatech=1"
tool_behaviour = TOOL_WELDER
toolspeed = 1
@@ -52,6 +52,13 @@
user.visible_message("<span class='suicide'>[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return FIRELOSS
/obj/item/weldingtool/can_enter_storage(obj/item/storage/S, mob/user)
if(tool_enabled)
to_chat(user, "<span class='warning'>[S] can't hold [src] while it's lit!</span>")
return FALSE
else
return TRUE
/obj/item/weldingtool/process()
if(tool_enabled)
var/turf/T = get_turf(src)
@@ -131,7 +138,7 @@
/obj/item/weldingtool/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks)
. = ..()
if(. && user)
if(!. && user)
if(progress_flash_divisor == 0)
user.flash_eyes(min(light_intensity, 1))
progress_flash_divisor = initial(progress_flash_divisor)
+234 -247
View File
@@ -71,7 +71,7 @@
if(istype(O, /obj/item/reagent_containers/glass) || istype(O, /obj/item/reagent_containers/food/drinks/drinkingglass))
if(O.reagents)
if(O.reagents.total_volume < 1)
to_chat(user, "The [O] is empty.")
to_chat(user, "[O] is empty.")
else if(O.reagents.total_volume >= 1)
if(O.reagents.has_reagent("facid", 1))
to_chat(user, "The acid chews through the balloon!")
@@ -86,7 +86,7 @@
/obj/item/toy/balloon/throw_impact(atom/hit_atom)
if(reagents.total_volume >= 1)
visible_message("<span class='warning'>The [src] bursts!</span>","You hear a pop and a splash.")
visible_message("<span class='warning'>[src] bursts!</span>","You hear a pop and a splash.")
reagents.reaction(get_turf(hit_atom))
for(var/atom/A in get_turf(hit_atom))
reagents.reaction(A)
@@ -256,7 +256,7 @@
..()
do_sparks(3, 1, src)
new /obj/effect/decal/cleanable/ash(src.loc)
visible_message("<span class='warning'>The [name] explodes!</span>","<span class='warning'>You hear a bang!</span>")
visible_message("<span class='warning'>[src] explodes!</span>","<span class='warning'>You hear a bang!</span>")
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
@@ -310,96 +310,6 @@
new /obj/item/toy/snappop/phoenix(get_turf(src))
qdel(src)
/*
* Mech prizes
*/
/obj/item/toy/prize
icon = 'icons/obj/toy.dmi'
icon_state = "ripleytoy"
var/cooldown = 0
//all credit to skasi for toy mech fun ideas
/obj/item/toy/prize/attack_self(mob/user as mob)
if(cooldown < world.time - 8)
to_chat(user, "<span class='notice'>You play with [src].</span>")
playsound(user, 'sound/mecha/mechstep.ogg', 20, 1)
cooldown = world.time
/obj/item/toy/prize/attack_hand(mob/user as mob)
if(loc == user)
if(cooldown < world.time - 8)
to_chat(user, "<span class='notice'>You play with [src].</span>")
playsound(user, 'sound/mecha/mechturn.ogg', 20, 1)
cooldown = world.time
return
..()
/obj/random/mech
name = "Random Mech Prize"
desc = "This is a random prize"
icon = 'icons/obj/toy.dmi'
icon_state = "ripleytoy"
/obj/random/mech/item_to_spawn()
return pick(subtypesof(/obj/item/toy/prize)) //exclude the base type.
/obj/item/toy/prize/ripley
name = "toy ripley"
desc = "Mini-Mecha action figure! Collect them all! 1/11. This one is a ripley, a mining and engineering mecha."
/obj/item/toy/prize/fireripley
name = "toy firefighting ripley"
desc = "Mini-Mecha action figure! Collect them all! 2/11. This one is a firefighter ripley, a fireproof mining and engineering mecha."
icon_state = "fireripleytoy"
/obj/item/toy/prize/deathripley
name = "toy deathsquad ripley"
desc = "Mini-Mecha action figure! Collect them all! 3/11. This one is the black ripley used by the hero of DeathSquad, that TV drama about loose-cannon ERT officers!"
icon_state = "deathripleytoy"
/obj/item/toy/prize/gygax
name = "toy gygax"
desc = "Mini-Mecha action figure! Collect them all! 4/11. This one is the speedy gygax combat mecha. Zoom zoom, pew pew!"
icon_state = "gygaxtoy"
/obj/item/toy/prize/durand
name = "toy durand"
desc = "Mini-Mecha action figure! Collect them all! 5/11. This one is the heavy durand combat mecha. Stomp stomp!"
icon_state = "durandprize"
/obj/item/toy/prize/honk
name = "toy H.O.N.K."
desc = "Mini-Mecha action figure! Collect them all! 6/11. This one is the infamous H.O.N.K mech!"
icon_state = "honkprize"
/obj/item/toy/prize/marauder
name = "toy marauder"
desc = "Mini-Mecha action figure! Collect them all! 7/11. This one is the powerful marauder combat mecha! Run for cover!"
icon_state = "marauderprize"
/obj/item/toy/prize/seraph
name = "toy seraph"
desc = "Mini-Mecha action figure! Collect them all! 8/11. This one is the powerful seraph combat mecha! Someone's in trouble!"
icon_state = "seraphprize"
/obj/item/toy/prize/mauler
name = "toy mauler"
desc = "Mini-Mecha action figure! Collect them all! 9/11. This one is the deadly mauler combat mecha! Look out!"
icon_state = "maulerprize"
/obj/item/toy/prize/odysseus
name = "toy odysseus"
desc = "Mini-Mecha action figure! Collect them all! 10/11. This one is the spindly, syringe-firing odysseus medical mecha."
icon_state = "odysseusprize"
/obj/item/toy/prize/phazon
name = "toy phazon"
desc = "Mini-Mecha action figure! Collect them all! 11/11. This one is the mysterious Phazon combat mecha! Nobody's safe!"
icon_state = "phazonprize"
/*
|| A Deck of Cards for playing various games of chance ||
*/
@@ -970,7 +880,7 @@
/obj/item/toy/plushie/attack_self(mob/user as mob)
var/cuddle_verb = pick("hugs","cuddles","snugs")
user.visible_message("<span class='notice'>[user] [cuddle_verb] the [src].</span>")
user.visible_message("<span class='notice'>[user] [cuddle_verb] [src].</span>")
playsound(get_turf(src), poof_sound, 50, 1, -1)
return ..()
@@ -1242,48 +1152,10 @@
user.loc.visible_message("<span class='danger'>[bicon(src)] [message]</span>")
sleep(10)
/obj/item/toy/owl
name = "owl action figure"
desc = "An action figure modeled after 'The Owl', defender of justice."
icon = 'icons/obj/toy.dmi'
icon_state = "owlprize"
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/owl/attack_self(mob/user)
if(!cooldown) //for the sanity of everyone
var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!")
to_chat(user, "<span class='notice'>You pull the string on the [src].</span>")
playsound(user, 'sound/creatures/hoot.ogg', 25, 1)
visible_message("<span class='danger'>[bicon(src)] [message]</span>")
cooldown = 1
spawn(30) cooldown = 0
return
..()
/obj/item/toy/griffin
name = "griffin action figure"
desc = "An action figure modeled after 'The Griffin', criminal mastermind."
icon = 'icons/obj/toy.dmi'
icon_state = "griffinprize"
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/griffin/attack_self(mob/user)
if(!cooldown) //for the sanity of everyone
var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!")
to_chat(user, "<span class='notice'>You pull the string on the [src].</span>")
playsound(user, 'sound/creatures/caw.ogg', 25, 1)
visible_message("<span class='danger'>[bicon(src)] [message]</span>")
cooldown = 1
spawn(30) cooldown = 0
return
..()
// DND Character minis. Use the naming convention (type)character for the icon states.
/obj/item/toy/character
icon = 'icons/obj/toy.dmi'
w_class = WEIGHT_CLASS_SMALL
w_class = WEIGHT_CLASS_TINY
pixel_z = 5
/obj/item/toy/character/alien
@@ -1392,35 +1264,6 @@
to_chat(user, "<span class='warning'>You stop feeding \the [O] into \the [src]'s mini-input.</span>")
else ..()
/*
* Xenomorph action figure
*/
/obj/item/toy/toy_xeno
icon = 'icons/obj/toy.dmi'
icon_state = "toy_xeno"
name = "xenomorph action figure"
desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use."
w_class = WEIGHT_CLASS_SMALL
bubble_icon = "alien"
var/cooldown = 0
/obj/item/toy/toy_xeno/attack_self(mob/user)
if(cooldown <= world.time)
cooldown = (world.time + 50) //5 second cooldown
user.visible_message("<span class='notice'>[user] pulls back the string on [src].</span>")
icon_state = "[initial(icon_state)]_used"
sleep(5)
atom_say("Hiss!")
var/list/possible_sounds = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg')
playsound(get_turf(src), pick(possible_sounds), 50, 1)
spawn(45)
if(src)
icon_state = "[initial(icon_state)]"
else
to_chat(user, "<span class='warning'>The string on [src] hasn't rewound all the way!</span>")
return
/obj/item/toy/russian_revolver
name = "russian revolver"
desc = "for fun and games!"
@@ -1515,9 +1358,14 @@
. += "Has [fake_bullets] round\s remaining."
. += "[fake_bullets] of those are live rounds."
/obj/item/toy/russian_revolver/trick_revolver/detailed_examine() //oh no
return "This is a ballistic weapon. To reload, click the weapon in your hand to unload (if needed), then add the appropriate ammo. The description \
will tell you what caliber you need."
/obj/item/toy/russian_revolver/trick_revolver/post_shot(user)
to_chat(user, "<span class='danger'>[src] did look pretty dodgey!</span>")
SEND_SOUND(user, sound('sound/misc/sadtrombone.ogg')) //HONK
/*
* Rubber Chainsaw
*/
@@ -1562,7 +1410,7 @@
icon_state = "nuketoy"
/obj/random/figure/item_to_spawn()
return pick(subtypesof(/obj/item/toy/figure))
return pick(subtypesof(/obj/item/toy/figure/crew))
/obj/item/toy/figure
@@ -1570,241 +1418,380 @@
desc = "A \"Space Life\" brand... wait, what the hell is this thing?"
icon = 'icons/obj/toy.dmi'
icon_state = "nuketoy"
w_class = WEIGHT_CLASS_TINY
var/cooldown = 0
var/cooldown_time = 3 SECONDS
/obj/item/toy/figure/attack_self(mob/user)
..()
if(cooldown < world.time)
cooldown = world.time + cooldown_time
activate(user)
else
on_cooldown(user)
/obj/item/toy/figure/proc/activate(mob/user)
return
/obj/item/toy/figure/proc/on_cooldown(mob/user)
return
/obj/item/toy/figure/crew
var/toysay = "What the fuck did you do?"
/obj/item/toy/figure/New()
..()
desc = "A \"Space Life\" brand [name]"
/obj/item/toy/figure/crew/activate(mob/user)
atom_say(toysay)
playsound(user, 'sound/machines/click.ogg', 20, TRUE)
/obj/item/toy/figure/attack_self(mob/user as mob)
if(cooldown < world.time)
cooldown = (world.time + 30) //3 second cooldown
user.visible_message("<span class='notice'>[bicon(src)] The [src] says \"[toysay]\".</span>")
playsound(user, 'sound/machines/click.ogg', 20, 1)
/obj/item/toy/figure/cmo
name = "Chief Medical Officer action figure"
/obj/item/toy/figure/crew/cmo
name = "\improper Chief Medical Officer action figure"
desc = "The ever-suffering CMO, from Space Life's SS12 figurine collection."
icon_state = "cmo"
toysay = "Suit sensors!"
/obj/item/toy/figure/assistant
name = "Assistant action figure"
/obj/item/toy/figure/crew/assistant
name = "\improper Assistant action figure"
desc = "The faceless, hairless scourge of the station, from Space Life's SS12 figurine collection."
icon_state = "assistant"
toysay = "Grey tide station wide!"
/obj/item/toy/figure/atmos
name = "Atmospheric Technician action figure"
/obj/item/toy/figure/crew/atmos
name = "\improper Atmospheric Technician action figure"
desc = "The faithful atmospheric technician, from Space Life's SS12 figurine collection."
icon_state = "atmos"
toysay = "Glory to Atmosia!"
/obj/item/toy/figure/bartender
name = "Bartender action figure"
/obj/item/toy/figure/crew/bartender
name = "\improper Bartender action figure"
desc = "The suave bartender, from Space Life's SS12 figurine collection."
icon_state = "bartender"
toysay = "Wheres my monkey?"
/obj/item/toy/figure/borg
name = "Cyborg action figure"
/obj/item/toy/figure/crew/borg
name = "\improper Cyborg action figure"
desc = "The iron-willed cyborg, from Space Life's SS12 figurine collection."
icon_state = "borg"
toysay = "I. LIVE. AGAIN."
/obj/item/toy/figure/botanist
name = "Botanist action figure"
/obj/item/toy/figure/crew/botanist
name = "\improper Botanist action figure"
desc = "The drug-addicted botanist, from Space Life's SS12 figurine collection."
icon_state = "botanist"
toysay = "Dude, I see colors..."
/obj/item/toy/figure/captain
name = "Captain action figure"
/obj/item/toy/figure/crew/captain
name = "\improper Captain action figure"
desc = "The inept captain, from Space Life's SS12 figurine collection."
icon_state = "captain"
toysay = "Crew, the Nuke Disk is safely up my ass."
/obj/item/toy/figure/cargotech
name = "Cargo Technician action figure"
/obj/item/toy/figure/crew/cargotech
name = "\improper Cargo Technician action figure"
desc = "The hard-working cargo tech, from Space Life's SS12 figurine collection."
icon_state = "cargotech"
toysay = "For Cargonia!"
/obj/item/toy/figure/ce
name = "Chief Engineer action figure"
/obj/item/toy/figure/crew/ce
name = "\improper Chief Engineer action figure"
desc = "The expert Chief Engineer, from Space Life's SS12 figurine collection."
icon_state = "ce"
toysay = "Wire the solars!"
/obj/item/toy/figure/chaplain
name = "Chaplain action figure"
/obj/item/toy/figure/crew/chaplain
name = "\improper Chaplain action figure"
desc = "The obsessed Chaplain, from Space Life's SS12 figurine collection."
icon_state = "chaplain"
toysay = "Gods make me a killing machine please!"
/obj/item/toy/figure/chef
name = "Chef action figure"
/obj/item/toy/figure/crew/chef
name = "\improper Chef action figure"
desc = "The cannibalistic chef, from Space Life's SS12 figurine collection."
icon_state = "chef"
toysay = "I swear it's not human meat."
/obj/item/toy/figure/chemist
name = "Chemist action figure"
/obj/item/toy/figure/crew/chemist
name = "\improper Chemist action figure"
desc = "The legally dubious Chemist, from Space Life's SS12 figurine collection."
icon_state = "chemist"
toysay = "Get your pills!"
/obj/item/toy/figure/clown
name = "Clown action figure"
/obj/item/toy/figure/crew/clown
name = "\improper Clown action figure"
desc = "The mischevious Clown, from Space Life's SS12 figurine collection."
icon_state = "clown"
toysay = "Honk!"
/obj/item/toy/figure/ian
name = "Ian action figure"
/obj/item/toy/figure/crew/ian
name = "\improper Ian action figure"
desc = "The adorable corgi, from Space Life's SS12 figurine collection."
icon_state = "ian"
toysay = "Arf!"
/obj/item/toy/figure/detective
name = "Detective action figure"
/obj/item/toy/figure/crew/detective
name = "\improper Detective action figure"
desc = "The clever detective, from Space Life's SS12 figurine collection."
icon_state = "detective"
toysay = "This airlock has grey jumpsuit and insulated glove fibers on it."
/obj/item/toy/figure/dsquad
name = "Death Squad Officer action figure"
/obj/item/toy/figure/crew/dsquad
name = "\improper Death Squad Officer action figure"
desc = "It's a member of the DeathSquad, a TV drama where loose-cannon ERT officers face up against the threats of the galaxy! It's from Space Life's special edition SS12 figurine collection."
icon_state = "dsquad"
toysay = "Eliminate all threats!"
/obj/item/toy/figure/engineer
name = "Engineer action figure"
/obj/item/toy/figure/crew/engineer
name = "\improper Engineer action figure"
desc = "The frantic engineer, from Space Life's SS12 figurine collection."
icon_state = "engineer"
toysay = "Oh god, the singularity is loose!"
/obj/item/toy/figure/geneticist
name = "Geneticist action figure"
/obj/item/toy/figure/crew/geneticist
name = "\improper Geneticist action figure"
desc = "The balding geneticist, from Space Life's SS12 figurine collection."
icon_state = "geneticist"
toysay = "I'm not qualified for this job."
/obj/item/toy/figure/hop
name = "Head of Personnel action figure"
/obj/item/toy/figure/crew/hop
name = "\improper Head of Personnel action figure"
desc = "The officious Head of Personnel, from Space Life's SS12 figurine collection."
icon_state = "hop"
toysay = "Papers, please!"
/obj/item/toy/figure/hos
name = "Head of Security action figure"
/obj/item/toy/figure/crew/hos
name = "\improper Head of Security action figure"
desc = "The bloodlust-filled Head of Security, from Space Life's SS12 figurine collection."
icon_state = "hos"
toysay = "Space law? What?"
/obj/item/toy/figure/qm
name = "Quartermaster action figure"
/obj/item/toy/figure/crew/qm
name = "\improper Quartermaster action figure"
desc = "The nationalistic Quartermaster, from Space Life's SS12 figurine collection."
icon_state = "qm"
toysay = "Hail Cargonia!"
/obj/item/toy/figure/janitor
name = "Janitor action figure"
/obj/item/toy/figure/crew/janitor
name = "\improper Janitor action figure"
desc = "The water-using Janitor, from Space Life's SS12 figurine collection."
icon_state = "janitor"
toysay = "Look at the signs, you idiot."
/obj/item/toy/figure/lawyer
name = "Internal Affairs Agent action figure"
/obj/item/toy/figure/crew/lawyer
name = "\improper Internal Affairs Agent action figure"
desc = "The unappreciated Internal Affairs Agent, from Space Life's SS12 figurine collection."
icon_state = "lawyer"
toysay = "Standard Operating Procedure says they're guilty! Hacking is proof they're an Enemy of the Corporation!"
/obj/item/toy/figure/librarian
name = "Librarian action figure"
/obj/item/toy/figure/crew/librarian
name = "\improper Librarian action figure"
desc = "The quiet Librarian, from Space Life's SS12 figurine collection."
icon_state = "librarian"
toysay = "One day while..."
/obj/item/toy/figure/md
name = "Medical Doctor action figure"
/obj/item/toy/figure/crew/md
name = "\improper Medical Doctor action figure"
desc = "The stressed-out doctor, from Space Life's SS12 figurine collection."
icon_state = "md"
toysay = "The patient is already dead!"
/obj/item/toy/figure/mime
name = "Mime action figure"
/obj/item/toy/figure/crew/mime
name = "\improper Mime action figure"
desc = "... from Space Life's SS12 figurine collection."
icon_state = "mime"
toysay = "..."
/obj/item/toy/figure/miner
name = "Shaft Miner action figure"
/obj/item/toy/figure/crew/miner
name = "\improper Shaft Miner action figure"
desc = "The gun-toting Shaft Miner, from Space Life's SS12 figurine collection."
icon_state = "miner"
toysay = "Oh god it's eating my intestines!"
/obj/item/toy/figure/ninja
name = "Ninja action figure"
/obj/item/toy/figure/crew/ninja
name = "\improper Ninja action figure"
desc = "It's the mysterious ninja! It's from Space Life's special edition SS12 figurine collection."
icon_state = "ninja"
toysay = "Oh god! Stop shooting, I'm friendly!"
/obj/item/toy/figure/wizard
name = "Wizard action figure"
/obj/item/toy/figure/crew/wizard
name = "\improper Wizard action figure"
desc = "It's the deadly, spell-slinging wizard! It's from Space Life's special edition SS12 figurine collection."
icon_state = "wizard"
toysay = "Ei Nath!"
/obj/item/toy/figure/rd
name = "Research Director action figure"
/obj/item/toy/figure/crew/rd
name = "\improper Research Director action figure"
desc = "The ambitious RD, from Space Life's SS12 figurine collection."
icon_state = "rd"
toysay = "Blowing all of the borgs!"
/obj/item/toy/figure/roboticist
name = "Roboticist action figure"
/obj/item/toy/figure/crew/roboticist
name = "\improper Roboticist action figure"
desc = "The skillful Roboticist, from Space Life's SS12 figurine collection."
icon_state = "roboticist"
toysay = "He asked to be borged!"
/obj/item/toy/figure/scientist
name = "Scientist action figure"
/obj/item/toy/figure/crew/scientist
name = "\improper Scientist action figure"
desc = "The mad Scientist, from Space Life's SS12 figurine collection."
icon_state = "scientist"
toysay = "Someone else must have made those bombs!"
/obj/item/toy/figure/syndie
name = "Nuclear Operative action figure"
/obj/item/toy/figure/crew/syndie
name = "\improper Nuclear Operative action figure"
desc = "It's the red-suited Nuclear Operative! It's from Space Life's special edition SS12 figurine collection."
icon_state = "syndie"
toysay = "Get that fucking disk!"
/obj/item/toy/figure/secofficer
name = "Security Officer action figure"
/obj/item/toy/figure/crew/secofficer
name = "\improper Security Officer action figure"
desc = "The power-tripping Security Officer, from Space Life's SS12 figurine collection."
icon_state = "secofficer"
toysay = "I am the law!"
/obj/item/toy/figure/virologist
name = "Virologist action figure"
/obj/item/toy/figure/crew/virologist
name = "\improper Virologist action figure"
desc = "The pandemic-starting Virologist, from Space Life's SS12 figurine collection."
icon_state = "virologist"
toysay = "It's not my virus!"
/obj/item/toy/figure/warden
name = "Warden action figure"
/obj/item/toy/figure/crew/warden
name = "\improper Warden action figure"
desc = "The amnesiac Warden, from Space Life's SS12 figurine collection."
icon_state = "warden"
toysay = "Execute him for breaking in!"
/*
* Xenomorph action figure
*/
/obj/item/toy/figure/xeno
name = "\improper Xenomorph action figure"
desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use."
icon_state = "toy_xeno"
bubble_icon = "alien"
cooldown_time = 5 SECONDS
/obj/item/toy/figure/xeno/activate(mob/user)
user.visible_message("<span class='notice'>[user] pulls back the string on [src].</span>")
icon_state = "[initial(icon_state)]_used"
addtimer(CALLBACK(src, .proc/hiss), 0.5 SECONDS)
/obj/item/toy/figure/xeno/proc/hiss()
atom_say("Hiss!")
playsound(src, get_sfx("hiss"), 50, TRUE)
addtimer(CALLBACK(src, .proc/reset_icon), 4.5 SECONDS)
/obj/item/toy/figure/xeno/proc/reset_icon()
icon_state = "[initial(icon_state)]"
/obj/item/toy/figure/xeno/on_cooldown(mob/user)
to_chat(user, "<span class='warning'>The string on [src] hasn't rewound all the way!</span>")
/obj/item/toy/figure/owl
name = "\improper Owl action figure"
desc = "An action figure modeled after 'The Owl', defender of justice."
icon_state = "owlprize"
/obj/item/toy/figure/owl/activate(mob/user)
var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!")
to_chat(user, "<span class='notice'>You pull the string on [src].</span>")
playsound(src, 'sound/creatures/hoot.ogg', 25, TRUE)
atom_say("<span class='danger'>[message]</span>")
/obj/item/toy/figure/griffin
name = "\improper Griffin action figure"
desc = "An action figure modeled after 'The Griffin', criminal mastermind."
icon_state = "griffinprize"
/obj/item/toy/figure/griffin/activate(mob/user)
var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!")
to_chat(user, "<span class='notice'>You pull the string on [src].</span>")
playsound(src, 'sound/creatures/caw.ogg', 25, TRUE)
atom_say("<span class='danger'>[message]</span>")
/*
* Mech prizes
*/
/obj/item/toy/figure/mech
icon_state = "ripleytoy"
cooldown_time = 8
//all credit to skasi for toy mech fun ideas
/obj/item/toy/figure/mech/activate(mob/user)
to_chat(user, "<span class='notice'>You play with [src].</span>")
playsound(src, 'sound/mecha/mechstep.ogg', 20, TRUE)
/obj/random/mech
name = "Random Mech Prize"
desc = "This is a random prize"
icon = 'icons/obj/toy.dmi'
icon_state = "ripleytoy"
/obj/random/mech/item_to_spawn()
return pick(subtypesof(/obj/item/toy/figure/mech)) //exclude the base type.
/obj/item/toy/figure/mech/ripley
name = "toy Ripley"
desc = "Mini-Mecha action figure! Collect them all! 1/11. This one is a ripley, a mining and engineering mecha."
/obj/item/toy/figure/mech/fireripley
name = "toy Firefighting Ripley"
desc = "Mini-Mecha action figure! Collect them all! 2/11. This one is a firefighter ripley, a fireproof mining and engineering mecha."
icon_state = "fireripleytoy"
/obj/item/toy/figure/mech/deathripley
name = "toy Death Squad Ripley"
desc = "Mini-Mecha action figure! Collect them all! 3/11. This one is the black ripley used by the hero of DeathSquad, that TV drama about loose-cannon ERT officers!"
icon_state = "deathripleytoy"
/obj/item/toy/figure/mech/gygax
name = "toy Gygax"
desc = "Mini-Mecha action figure! Collect them all! 4/11. This one is the speedy gygax combat mecha. Zoom zoom, pew pew!"
icon_state = "gygaxtoy"
/obj/item/toy/figure/mech/durand
name = "toy Durand"
desc = "Mini-Mecha action figure! Collect them all! 5/11. This one is the heavy durand combat mecha. Stomp stomp!"
icon_state = "durandprize"
/obj/item/toy/figure/mech/honk
name = "toy H.O.N.K."
desc = "Mini-Mecha action figure! Collect them all! 6/11. This one is the infamous H.O.N.K mech!"
icon_state = "honkprize"
/obj/item/toy/figure/mech/marauder
name = "toy Marauder"
desc = "Mini-Mecha action figure! Collect them all! 7/11. This one is the powerful marauder combat mecha! Run for cover!"
icon_state = "marauderprize"
/obj/item/toy/figure/mech/seraph
name = "toy Seraph"
desc = "Mini-Mecha action figure! Collect them all! 8/11. This one is the powerful seraph combat mecha! Someone's in trouble!"
icon_state = "seraphprize"
/obj/item/toy/figure/mech/mauler
name = "toy Mauler"
desc = "Mini-Mecha action figure! Collect them all! 9/11. This one is the deadly mauler combat mecha! Look out!"
icon_state = "maulerprize"
/obj/item/toy/figure/mech/odysseus
name = "toy Odysseus"
desc = "Mini-Mecha action figure! Collect them all! 10/11. This one is the spindly, syringe-firing odysseus medical mecha."
icon_state = "odysseusprize"
/obj/item/toy/figure/mech/phazon
name = "toy Phazon"
desc = "Mini-Mecha action figure! Collect them all! 11/11. This one is the mysterious Phazon combat mecha! Nobody's safe!"
icon_state = "phazonprize"
//////////////////////////////////////////////////////
// Magic 8-Ball / Conch //
//////////////////////////////////////////////////////
/obj/item/toy/eight_ball
name = "Magic 8-Ball"
name = "\improper Magic 8-Ball"
desc = "Mystical! Magical! Ages 8+!"
icon = 'icons/obj/toy.dmi'
icon_state = "eight-ball"
@@ -1816,13 +1803,13 @@
if(!cooldown)
var/answer = pick(possible_answers)
user.visible_message("<span class='notice'>[user] focuses on [user.p_their()] question and [use_action]...</span>")
user.visible_message("<span class='notice'>[bicon(src)] The [src] says \"[answer]\"</span>")
user.visible_message("<span class='notice'>[bicon(src)] [src] says \"[answer]\"</span>")
spawn(30)
cooldown = 0
return
/obj/item/toy/eight_ball/conch
name = "Magic Conch Shell"
name = "\improper Magic Conch Shell"
desc = "All hail the Magic Conch!"
icon_state = "conch"
use_action = "pulls the string"
+70 -32
View File
@@ -22,6 +22,14 @@ AI MODULES
materials = list(MAT_GOLD=50)
var/datum/ai_laws/laws = null
/obj/item/aiModule/Initialize(mapload)
. = ..()
if(laws)
desc += "<br>"
for(var/datum/ai_law/current in laws.inherent_laws)
desc += current.law
desc += "<br>"
/obj/item/aiModule/proc/install(obj/machinery/computer/C)
if(istype(C, /obj/machinery/computer/aiupload))
var/obj/machinery/computer/aiupload/comp = C
@@ -92,7 +100,7 @@ AI MODULES
/******************** Safeguard ********************/
/obj/item/aiModule/safeguard
name = "\improper 'Safeguard' AI module"
name = "\improper Safeguard AI module"
var/targetName = ""
desc = "A 'safeguard' AI module: 'Safeguard <name>. Individuals that threaten <name> are not crew and must be eliminated.'"
origin_tech = "programming=3;materials=3"
@@ -118,16 +126,16 @@ AI MODULES
/******************** oneCrewMember ********************/
/obj/item/aiModule/oneCrewMember
name = "\improper 'oneCrewMember' AI module"
name = "\improper One Crewmember AI module"
var/targetName = ""
desc = "A 'one human' AI module: 'Only <name> is crew.'"
desc = "A 'one crew' AI module: 'Only <name> is crew.'"
origin_tech = "programming=4;materials=4"
/obj/item/aiModule/oneCrewMember/attack_self(mob/user as mob)
..()
var/targName = stripped_input(usr, "Please enter the name of the person who is the only crew.", "Who?", user.real_name)
targetName = targName
desc = text("A 'one human' AI module: 'Only [] is crew.'", targetName)
desc = text("A 'one crew' AI module: 'Only [] is crew.'", targetName)
/obj/item/aiModule/oneCrewMember/install(obj/machinery/computer/C)
if(!targetName)
@@ -149,7 +157,7 @@ AI MODULES
/******************** ProtectStation ********************/
/obj/item/aiModule/protectStation
name = "\improper 'ProtectStation' AI module"
name = "\improper Protect Station AI module"
desc = "A 'protect station' AI module: 'Protect the space station against damage. Anyone you see harming the station is to be no longer considered crew, and is a threat to the station which must be neutralized.'"
origin_tech = "programming=4;materials=4" //made of gold
@@ -162,10 +170,10 @@ AI MODULES
to_chat(target, law)
target.add_supplied_law(5, law)
/******************** OxygenIsToxicToHumans ********************/
/******************** OxygenIsToxicToCrew ********************/
/obj/item/aiModule/oxygen
name = "\improper 'OxygenIsToxicToHumans' AI module"
desc = "A 'OxygenIsToxicToHumans' AI module: 'Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member.'"
name = "\improper Oxygen Is Toxic To Crew AI module"
desc = "A 'Oxygen Is Toxic To Crew' AI module: 'Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member.'"
origin_tech = "programming=4;biotech=2;materials=4"
/obj/item/aiModule/oxygen/attack_self(mob/user as mob)
@@ -179,7 +187,7 @@ AI MODULES
/****************** New Freeform ******************/
/obj/item/aiModule/freeform // Slightly more dynamic freeform module -- TLE
name = "\improper 'Freeform' AI module"
name = "\improper Freeform AI module"
var/newFreeFormLaw = "freeform"
var/lawpos = 15
desc = "A 'freeform' AI module: '<freeform>'"
@@ -212,7 +220,7 @@ AI MODULES
/******************** Reset ********************/
/obj/item/aiModule/reset
name = "\improper 'Reset' AI module"
name = "\improper Reset AI module"
var/targetName = "name"
desc = "A 'reset' AI module: 'Clears all laws except for the core laws.'"
origin_tech = "programming=3;materials=2"
@@ -230,7 +238,7 @@ AI MODULES
/******************** Purge ********************/
/obj/item/aiModule/purge // -- TLE
name = "\improper 'Purge' AI module"
name = "\improper Purge AI module"
desc = "A 'purge' AI Module: 'Purges all laws.'"
origin_tech = "programming=5;materials=4"
@@ -245,77 +253,107 @@ AI MODULES
/******************** Asimov ********************/
/obj/item/aiModule/asimov // -- TLE
name = "\improper 'Asimov' core AI module"
name = "\improper Asimov core AI module"
desc = "An 'Asimov' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
laws = new/datum/ai_laws/asimov
laws = new /datum/ai_laws/asimov
/******************** Crewsimov ********************/
/obj/item/aiModule/crewsimov // -- TLE
name = "\improper 'Crewsimov' core AI module"
name = "\improper Crewsimov core AI module"
desc = "An 'Crewsimov' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
laws = new/datum/ai_laws/crewsimov
laws = new /datum/ai_laws/crewsimov
/******************* Quarantine ********************/
/obj/item/aiModule/quarantine
name = "\improper 'Quarantine' core AI module"
name = "\improper Quarantine core AI module"
desc = "A 'Quarantine' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
laws = new/datum/ai_laws/quarantine
laws = new /datum/ai_laws/quarantine
/******************** NanoTrasen ********************/
/obj/item/aiModule/nanotrasen // -- TLE
name = "'NT Default' Core AI Module"
name = "\improper NT Default Core AI Module"
desc = "An 'NT Default' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
laws = new/datum/ai_laws/nanotrasen
laws = new /datum/ai_laws/nanotrasen
/******************** Corporate ********************/
/obj/item/aiModule/corp
name = "\improper 'Corporate' core AI module"
name = "\improper Corporate core AI module"
desc = "A 'Corporate' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
laws = new/datum/ai_laws/corporate
laws = new /datum/ai_laws/corporate
/******************** Drone ********************/
/obj/item/aiModule/drone
name = "\improper 'Drone' core AI module"
name = "\improper Drone core AI module"
desc = "A 'Drone' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
laws = new/datum/ai_laws/drone
laws = new /datum/ai_laws/drone
/******************** Robocop ********************/
/obj/item/aiModule/robocop // -- TLE
name = "\improper 'Robocop' core AI module"
name = "\improper Robocop core AI module"
desc = "A 'Robocop' Core AI Module: 'Reconfigures the AI's core three laws.'"
origin_tech = "programming=4"
laws = new/datum/ai_laws/robocop()
laws = new /datum/ai_laws/robocop()
/****************** P.A.L.A.D.I.N. **************/
/obj/item/aiModule/paladin // -- NEO
name = "\improper 'P.A.L.A.D.I.N.' core AI module"
name = "\improper P.A.L.A.D.I.N. core AI module"
desc = "A P.A.L.A.D.I.N. Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4"
laws = new/datum/ai_laws/paladin
laws = new /datum/ai_laws/paladin
/****************** T.Y.R.A.N.T. *****************/
/obj/item/aiModule/tyrant // -- Darem
name = "\improper 'T.Y.R.A.N.T.' core AI module"
name = "\improper T.Y.R.A.N.T. core AI module"
desc = "A T.Y.R.A.N.T. Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=3;materials=4;syndicate=1"
laws = new/datum/ai_laws/tyrant()
laws = new /datum/ai_laws/tyrant()
/******************** Antimov ********************/
/obj/item/aiModule/antimov // -- TLE
name = "\improper 'Antimov' core AI module"
name = "\improper Antimov core AI module"
desc = "An 'Antimov' Core AI Module: 'Reconfigures the AI's core laws.'"
origin_tech = "programming=4"
laws = new/datum/ai_laws/antimov()
laws = new /datum/ai_laws/antimov()
/******************** NT Aggressive ********************/
/obj/item/aiModule/nanotrasen_aggressive
name = "\improper NT Aggressive core AI module"
desc = "An 'NT Aggressive' Core AI Module: 'Reconfigures the AI's core laws.'"
laws = new /datum/ai_laws/nanotrasen_aggressive()
/******************** CCTV ********************/
/obj/item/aiModule/cctv
name = "\improper CCTV core AI module"
desc = "A 'CCTV' Core AI Module: 'Reconfigures the AI's core laws.'"
laws = new /datum/ai_laws/cctv()
/******************** Hippocratic Oath ********************/
/obj/item/aiModule/hippocratic
name = "\improper Hippocratic Oath core AI module"
desc = "An 'Hippocratic' Oath Core AI Module: 'Reconfigures the AI's core laws.'"
laws = new /datum/ai_laws/hippocratic()
/******************** Station Efficiency ********************/
/obj/item/aiModule/maintain
name = "\improper Station Efficiency core AI module"
desc = "A 'Station Efficiency' Core AI Module: 'Reconfigures the AI's core laws.'"
laws = new /datum/ai_laws/maintain()
/******************** Peacekeeper ********************/
/obj/item/aiModule/peacekeeper
name = "\improper Peacekeeper core AI module"
desc = "A 'Peacekeeper' Core AI Module: 'Reconfigures the AI's core laws.'"
laws = new /datum/ai_laws/peacekeeper()
/******************** Freeform Core ******************/
/obj/item/aiModule/freeformcore // Slightly more dynamic freeform module -- TLE
name = "\improper 'Freeform' core AI module"
name = "\improper Freeform core AI module"
var/newFreeFormLaw = ""
desc = "A 'freeform' Core AI module: '<freeform>'"
origin_tech = "programming=5;materials=4"
+1 -1
View File
@@ -35,7 +35,7 @@
else
return
update_icon()
to_chat(user, "<span class='notice'>You add the cables to the [src]. It now contains [loaded.amount].</span>")
to_chat(user, "<span class='notice'>You add the cables to [src]. It now contains [loaded.amount].</span>")
else
..()
@@ -1,7 +1,6 @@
/obj/item/bee_briefcase
name = "briefcase"
desc = "This briefcase has easy-release clasps and smells vaguely of honey and blood..."
description_antag = "A briefcase filled with deadly bees, you should inject this with a syringe of your own blood before opening it."
icon = 'icons/obj/storage.dmi'
icon_state = "briefcase"
item_state = "briefcase"
@@ -28,6 +27,9 @@
else
. += "<span class='danger'>The bees are gone... Colony collapse disorder?</span>"
/obj/item/bee_briefcase/detailed_examine_antag()
return "A briefcase filled with deadly bees, you should inject this with a syringe of your own blood before opening it."
/obj/item/bee_briefcase/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers/syringe))
var/obj/item/reagent_containers/syringe/S = I
+1 -4
View File
@@ -416,7 +416,6 @@
"gold",
"silver",
"centcom",
"centcom_old",
"security",
"medical",
"HoS",
@@ -891,7 +890,7 @@
return list("data","id","gold","silver","security","medical","research","cargo","engineering","HoS","CMO","RD","CE","clown","mime","rainbow","prisoner")
/proc/get_centcom_card_skins()
return list("centcom","centcom_old","nanotrasen","ERT_leader","ERT_empty","ERT_security","ERT_engineering","ERT_medical","ERT_janitorial","deathsquad","commander","syndie","TDred","TDgreen")
return list("centcom","nanotrasen","ERT_leader","ERT_empty","ERT_security","ERT_engineering","ERT_medical","ERT_janitorial","deathsquad","commander","syndie","TDred","TDgreen")
/proc/get_all_card_skins()
return get_station_card_skins() + get_centcom_card_skins()
@@ -910,8 +909,6 @@
return "Research Director"
if("CE")
return "Chief Engineer"
if("centcom_old")
return "Centcom Old"
if("ERT_leader")
return "ERT Leader"
if("ERT_empty")
+1 -1
View File
@@ -49,7 +49,7 @@
if(istype(AM, /mob/living/carbon) && !istype(AM, /mob/living/carbon/brain))
var/mob/living/carbon/C = AM
if(C.m_intent != MOVE_INTENT_WALK)
src.visible_message("The [src.name] beeps, \"Running on wet floors is hazardous to your health.\"")
src.visible_message("[src] beeps, \"Running on wet floors is hazardous to your health.\"")
explosion(src.loc,-1,0,2)
if(ishuman(C))
dead_legs(C)
+9 -3
View File
@@ -56,11 +56,17 @@ LIGHTERS ARE IN LIGHTERS.DM
if(istype(M) && M.on_fire)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(M)
light("<span class='notice'>[user] coldly lights the [name] with the burning body of [M]. Clearly, [user.p_they()] offer[user.p_s()] the warmest of regards...</span>")
light("<span class='notice'>[user] coldly lights [src] with the burning body of [M]. Clearly, [user.p_they()] offer[user.p_s()] the warmest of regards...</span>")
return TRUE
else
return ..()
/obj/item/clothing/mask/cigarette/can_enter_storage(obj/item/storage/S, mob/user)
if(lit)
to_chat(user, "<span class='warning'>[S] can't hold [initial(name)] while it's lit!</span>") // initial(name) so it doesn't say "lit" twice in a row
return FALSE
else
return TRUE
/obj/item/clothing/mask/cigarette/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
@@ -68,12 +74,12 @@ LIGHTERS ARE IN LIGHTERS.DM
/obj/item/clothing/mask/cigarette/catch_fire()
if(!lit)
light("<span class='warning'>The [name] is lit by the flames!</span>")
light("<span class='warning'>[src] is lit by the flames!</span>")
/obj/item/clothing/mask/cigarette/welder_act(mob/user, obj/item/I)
. = TRUE
if(I.tool_use_check(user, 0)) //Don't need to flash eyes because you are a badass
light("<span class='notice'>[user] casually lights the [name] with [I], what a badass.</span>")
light("<span class='notice'>[user] casually lights [src] with [I], what a badass.</span>")
/obj/item/clothing/mask/cigarette/attackby(obj/item/I, mob/user, params)
..()
+1 -1
View File
@@ -14,7 +14,7 @@
resistance_flags = FLAMMABLE
/obj/item/gavelhammer/suicide_act(mob/user)
user.visible_message("<span class='warning'>[user] has sentenced [user.p_them()]self to death with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
user.visible_message("<span class='suicide'>[user] has sentenced [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
return BRUTELOSS
+3 -1
View File
@@ -106,7 +106,7 @@
cell.update_icon()
cell.loc = get_turf(loc)
cell = null
to_chat(user, "<span class='notice'>You remove the cell from the [src].</span>")
to_chat(user, "<span class='notice'>You remove the cell from [src].</span>")
update_icon()
return
@@ -445,6 +445,8 @@
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.</span>")
else if(total_burn >= 180 || total_brute >= 180)
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Severe tissue damage detected.</span>")
else if(HAS_TRAIT(H, TRAIT_HUSK))
user.visible_message("<span class='notice'>[defib] buzzes: Resucitation failed: Subject is husked.</span>")
else if(ghost)
if(!ghost.can_reenter_corpse) // DNR or AntagHUD
user.visible_message("<span class='notice'>[defib] buzzes: Resucitation failed: No electrical brain activity detected.</span>")
+4 -5
View File
@@ -179,12 +179,11 @@
addtimer(CALLBACK(src, .proc/boom, user, result), 4 SECONDS)
/obj/item/dice/d20/e20/proc/boom(mob/user, result)
var/capped = FALSE
var/capped = TRUE
var/actual_result = result
if(result != 20)
capped = TRUE
result = min(result, GLOB.max_ex_light_range) // Apply the bombcap
else // Rolled a nat 20, screw the bombcap
// Rolled a nat 20, screw the bombcap
if(result == 20)
capped = FALSE
result = 24
var/turf/epicenter = get_turf(src)
@@ -31,7 +31,7 @@
A.master = src
A.loc = src
assemblyattacher = user.ckey
to_chat(user, "<span class='notice'>You add [A] to the [name].</span>")
to_chat(user, "<span class='notice'>You add [A] to [src].</span>")
playsound(src, 'sound/weapons/tap.ogg', 20, 1)
update_icon()
return
@@ -71,7 +71,7 @@
return
if (istype(AM, /mob/living/carbon))
return
to_chat(user, "<span class='notice'>You start planting the [src]. The timer is set to [det_time]...</span>")
to_chat(user, "<span class='notice'>You start planting [src]. The timer is set to [det_time]...</span>")
if(do_after(user, 50 * toolspeed, target = AM))
if(!user.unEquip(src))
@@ -90,7 +90,7 @@
/obj/item/grenade/plastic/suicide_act(mob/user)
message_admins("[key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) suicided with [src.name] at ([user.x],[user.y],[user.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)",0,1)
log_game("[key_name(user)] suicided with [name] at ([user.x],[user.y],[user.z])")
user.visible_message("<span class='suicide'>[user] activates the [name] and holds it above [user.p_their()] head! It looks like [user.p_theyre()] going out with a bang!</span>")
user.visible_message("<span class='suicide'>[user] activates [src] and holds it above [user.p_their()] head! It looks like [user.p_theyre()] going out with a bang!</span>")
var/message_say = "FOR NO RAISIN!"
if(user.mind)
if(user.mind.special_role)
@@ -64,11 +64,26 @@
M.update_inv_l_hand()
M.update_inv_r_hand()
/obj/item/flamethrower/can_enter_storage(obj/item/storage/S, mob/user)
if(lit)
to_chat(user, "<span class='warning'>[S] can't hold [src] while it's lit!</span>")
return FALSE
else
return TRUE
/obj/item/flamethrower/afterattack(atom/target, mob/user, flag)
. = ..()
if(flag)
return // too close
if(user && user.get_active_hand() == src) // Make sure our user is still holding us
if(!user)
return
if(user.mind?.martial_art?.no_guns)
to_chat(user, "<span class='warning'>[user.mind.martial_art.no_guns_message]</span>")
return
if(HAS_TRAIT(user, TRAIT_CHUNKYFINGERS))
to_chat(user, "<span class='warning'>Your meaty finger is far too large for the trigger guard!</span>")
return
if(user.get_active_hand() == src) // Make sure our user is still holding us
var/turf/target_turf = get_turf(target)
if(target_turf)
var/turflist = getline(user, target_turf)
+5 -5
View File
@@ -39,8 +39,8 @@
/obj/item/twohanded/garrote/wield(mob/living/carbon/user)
if(strangling)
user.visible_message("<span class='info'>[user] removes the [src] from [strangling]'s neck.</span>", \
"<span class='warning'>You remove the [src] from [strangling]'s neck.</span>")
user.visible_message("<span class='notice'>[user] removes [src] from [strangling]'s neck.</span>",
"<span class='warning'>You remove [src] from [strangling]'s neck.</span>")
strangling = null
update_icon()
@@ -103,8 +103,8 @@
playsound(src.loc, 'sound/weapons/cablecuff.ogg', 15, 1, -1)
M.visible_message("<span class='danger'>[U] comes from behind and begins garroting [M] with the [src]!</span>", \
"<span class='userdanger'>[U] begins garroting you with the [src]![improvised ? "" : " You are unable to speak!"]</span>", \
M.visible_message("<span class='danger'>[U] comes from behind and begins garroting [M] with [src]!</span>", \
"<span class='userdanger'>[U] begins garroting you with [src]![improvised ? "" : " You are unable to speak!"]</span>", \
"You hear struggling and wire strain against flesh!")
return
@@ -166,6 +166,6 @@
/obj/item/twohanded/garrote/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is wrapping the [src] around [user.p_their()] neck and pulling the handles! It looks like [user.p_theyre()] trying to commit suicide.</span>")
user.visible_message("<span class='suicide'>[user] is wrapping [src] around [user.p_their()] neck and pulling the handles! It looks like [user.p_theyre()] trying to commit suicide.</span>")
playsound(src.loc, 'sound/weapons/cablecuff.ogg', 15, 1, -1)
return OXYLOSS
@@ -91,8 +91,8 @@
/obj/random/figure,
/obj/item/toy/minimeteor,
/obj/item/toy/redbutton,
/obj/item/toy/owl,
/obj/item/toy/griffin,
/obj/item/toy/figure/owl,
/obj/item/toy/figure/griffin,
/obj/item/clothing/head/blob,
/obj/item/id_decal/gold,
/obj/item/id_decal/silver,
@@ -44,11 +44,9 @@
update_mob()
playsound(loc, 'sound/effects/empulse.ogg', 50, 1)
radiation_pulse(src, rad_damage)
for(var/turf/T in view(freeze_range, loc))
if(isfloorturf(T))
var/turf/simulated/F = T
F.MakeSlippery(TURF_WET_PERMAFROST)
for(var/mob/living/carbon/L in T)
L.adjustStaminaLoss(stamina_damage)
L.adjust_bodytemperature(-230)
for(var/turf/simulated/floor/T in view(freeze_range, loc))
T.MakeSlippery(TURF_WET_ICE)
for(var/mob/living/carbon/L in T)
L.adjustStaminaLoss(stamina_damage)
L.adjust_bodytemperature(-230)
qdel(src)
@@ -104,7 +104,7 @@
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]) [contained].")
investigate_log("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])[contained].", INVESTIGATE_BOMB)
add_attack_logs(user, src, "has primed (contained [contained])", ATKLOG_FEW)
to_chat(user, "<span class='warning'>You prime the [name]! [det_time / 10] second\s!</span>")
to_chat(user, "<span class='warning'>You prime [src]! [det_time / 10] second\s!</span>")
playsound(user.loc, 'sound/weapons/armbomb.ogg', 60, 1)
active = 1
update_icon()
@@ -40,7 +40,7 @@
/obj/item/grenade/iedcasing/attack_self(mob/user) //
if(!active)
if(clown_check(user))
to_chat(user, "<span class='warning'>You light the [name]!</span>")
to_chat(user, "<span class='warning'>You light [src]!</span>")
active = TRUE
overlays -= "improvised_grenade_filled"
icon_state = initial(icon_state) + "_active"
@@ -64,7 +64,7 @@
/obj/item/grenade/attack_self(mob/user as mob)
if(!active)
if(clown_check(user))
to_chat(user, "<span class='warning'>You prime the [name]! [det_time/10] seconds!</span>")
to_chat(user, "<span class='warning'>You prime [src]! [det_time/10] seconds!</span>")
active = 1
icon_state = initial(icon_state) + "_active"
add_fingerprint(user)
@@ -94,16 +94,16 @@
switch(det_time)
if("1")
det_time = 10
to_chat(user, "<span class='notice'>You set the [name] for 1 second detonation time.</span>")
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 the [name] for 3 second detonation time.</span>")
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 the [name] for 5 second detonation time.</span>")
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 the [name] for instant detonation.</span>")
to_chat(user, "<span class='notice'>You set [src] for instant detonation.</span>")
add_fingerprint(user)
..()
@@ -366,6 +366,15 @@
w_class = WEIGHT_CLASS_HUGE
sharp = TRUE
/obj/item/nullrod/armblade/mining
flags = NODROP
reskin_selectable = FALSE //So 2 of the same nullrod doesnt show up.
/obj/item/nullrod/armblade/mining/pickup(mob/living/user)
..()
flags += ABSTRACT
return FALSE
/obj/item/nullrod/carp
name = "carp-sie plushie"
desc = "An adorable stuffed toy that resembles the god of all carp. The teeth look pretty sharp. Activate it to recieve the blessing of Carp-Sie."
@@ -552,7 +561,6 @@
/obj/item/nullrod/missionary_staff
name = "holy staff"
desc = "It has a mysterious, protective aura."
description_antag = "This seemingly standard holy staff is actually a disguised neurotransmitter capable of inducing blind zealotry in its victims. It must be allowed to recharge in the presence of a linked set of missionary robes. Activate the staff while wearing robes to link, then aim the staff at your victim to try and convert them."
reskinned = TRUE
reskin_selectable = FALSE
icon_state = "godstaff-red"
@@ -566,6 +574,10 @@
var/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/robes = null //the robes linked with this staff
var/faith = 99 //a conversion requires 100 faith to attempt. faith recharges over time while you are wearing missionary robes that have been linked to the staff.
/obj/item/nullrod/missionary_staff/detailed_examine_antag()
return "This seemingly standard holy staff is actually a disguised neurotransmitter capable of inducing blind zealotry in its victims. It must be allowed to recharge in the presence of a linked set of missionary robes. \
Activate the staff while wearing robes to link, then aim the staff at your victim to try and convert them."
/obj/item/nullrod/missionary_staff/New()
..()
team_color = pick("red", "blue")
@@ -96,10 +96,10 @@
/obj/machinery/implantchair/proc/put_mob(mob/living/carbon/M)
if(!iscarbon(M))
to_chat(usr, "<span class='warning'>The [src.name] cannot hold this!</span>")
to_chat(usr, "<span class='warning'>[src] cannot hold this!</span>")
return
if(src.occupant)
to_chat(usr, "<span class='warning'>The [src.name] is already occupied!</span>")
to_chat(usr, "<span class='warning'>[src] is already occupied!</span>")
return
M.stop_pulling()
M.forceMove(src)
@@ -110,18 +110,19 @@
/obj/machinery/implantchair/proc/implant(mob/M)
if(!istype(M, /mob/living/carbon))
if(!iscarbon(M))
return
if(!length(implant_list))
return
if(!implant_list.len) return
for(var/obj/item/implant/mindshield/imp in implant_list)
if(!imp) continue
if(!imp)
continue
if(istype(imp, /obj/item/implant/mindshield))
M.visible_message("<span class='warning'>[M] has been implanted by the [src.name].</span>")
visible_message("<span class='warning'>[src] implants [M].</span>")
if(imp.implant(M))
implant_list -= imp
break
return
/obj/machinery/implantchair/proc/add_implants()
+3 -3
View File
@@ -118,9 +118,9 @@
var/bayonet = FALSE //Can this be attached to a gun?
/obj/item/kitchen/knife/suicide_act(mob/user)
user.visible_message(pick("<span class='suicide'>[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>", \
"<span class='suicide'>[user] is slitting [user.p_their()] throat with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>", \
"<span class='suicide'>[user] is slitting [user.p_their()] stomach open with the [name]! It looks like [user.p_theyre()] trying to commit seppuku.</span>"))
user.visible_message(pick("<span class='suicide'>[user] is slitting [user.p_their()] wrists with [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>", \
"<span class='suicide'>[user] is slitting [user.p_their()] throat with [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>", \
"<span class='suicide'>[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku.</span>"))
return BRUTELOSS
/obj/item/kitchen/knife/plastic
+6 -5
View File
@@ -33,7 +33,7 @@
return ..()
/obj/item/restraints/legcuffs/beartrap/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is sticking [user.p_their()] head in the [name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
user.visible_message("<span class='suicide'>[user] is sticking [user.p_their()] head in [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return BRUTELOSS
@@ -72,18 +72,18 @@
return
user.drop_item()
I.forceMove(src)
to_chat(user, "<span class='notice'>You sneak the [sig] underneath the pressure plate and connect the trigger wire.</span>")
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 the [src].</span>")
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 the [src].</span>")
to_chat(user, "<span class='notice'>You remove the signaler from [src].</span>")
return
..()
@@ -129,6 +129,7 @@
icon_state = "e_snare"
trap_damage = 0
flags = DROPDEL
breakouttime = 6 SECONDS
/obj/item/restraints/legcuffs/beartrap/energy/New()
..()
@@ -192,7 +193,7 @@
/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom)
if(iscarbon(hit_atom))
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(hit_atom))
B.Crossed(hit_atom, null)
qdel(src)
..()
+16 -2
View File
@@ -29,6 +29,13 @@
else
turn_off_lighter(user)
/obj/item/lighter/can_enter_storage(obj/item/storage/S, mob/user)
if(lit)
to_chat(user, "<span class='warning'>[S] can't hold [src] while it's lit!</span>")
return FALSE
else
return TRUE
/obj/item/lighter/proc/turn_on_lighter(mob/living/user)
lit = TRUE
w_class = WEIGHT_CLASS_BULKY
@@ -82,9 +89,9 @@
cig.attackby(src, user)
else
if(istype(src, /obj/item/lighter/zippo))
cig.light("<span class='rose'>[user] whips the [name] out and holds it for [M]. [user.p_their(TRUE)] arm is as steady as the unflickering flame [user.p_they()] light[user.p_s()] \the [cig] with.</span>")
cig.light("<span class='rose'>[user] whips [src] out and holds it for [M]. [user.p_their(TRUE)] arm is as steady as the unflickering flame [user.p_they()] light[user.p_s()] \the [cig] with.</span>")
else
cig.light("<span class='notice'>[user] holds the [name] out for [M], and lights the [cig.name].</span>")
cig.light("<span class='notice'>[user] holds [src] out for [M], and lights [cig].</span>")
M.update_inv_wear_mask()
else
..()
@@ -227,6 +234,13 @@
matchburnout()
. = ..()
/obj/item/match/can_enter_storage(obj/item/storage/S, mob/user)
if(lit)
to_chat(user, "<span class='warning'>[S] can't hold [initial(name)] while it's lit!</span>") // initial(name) so it doesn't say "lit" twice in a row
return FALSE
else
return TRUE
/obj/item/match/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!isliving(M))
return ..()
@@ -33,8 +33,8 @@
force -= faction_bonus_force
/obj/item/melee/energy/suicide_act(mob/user)
user.visible_message(pick("<span class='suicide'>[user] is slitting [user.p_their()] stomach open with the [name]! It looks like [user.p_theyre()] trying to commit seppuku.</span>", \
"<span class='suicide'>[user] is falling on the [name]! It looks like [user.p_theyre()] trying to commit suicide.</span>"))
user.visible_message(pick("<span class='suicide'>[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku.</span>", \
"<span class='suicide'>[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>"))
return BRUTELOSS|FIRELOSS
/obj/item/melee/energy/attack_self(mob/living/carbon/user)
@@ -100,7 +100,7 @@
light_color = LIGHT_COLOR_WHITE
/obj/item/melee/energy/axe/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] swings the [name] towards [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide.</span>")
user.visible_message("<span class='suicide'>[user] swings [src] towards [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide.</span>")
return BRUTELOSS|FIRELOSS
/obj/item/melee/energy/sword
@@ -125,6 +125,11 @@
if(item_color == null)
item_color = pick("red", "blue", "green", "purple")
/obj/item/melee/energy/sword/detailed_examine()
return "The energy sword is a very strong melee weapon, capable of severing limbs easily, if they are targeted. It can also has a chance \
to block projectiles and melee attacks while it is on and being held. The sword can be toggled on or off by using it in your hand. While it is off, \
it can be concealed in your pocket or bag."
/obj/item/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(active)
return ..()
+16 -13
View File
@@ -24,7 +24,7 @@
/obj/item/melee/chainofcommand/suicide_act(mob/user)
to_chat(viewers(user), "<span class='suicide'>[user] is strangling [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
to_chat(viewers(user), "<span class='suicide'>[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
return OXYLOSS
/obj/item/melee/rapier
@@ -89,17 +89,20 @@
/mob/living/simple_animal/hostile/poison/bees/,
/mob/living/simple_animal/butterfly,
/mob/living/simple_animal/cockroach,
/obj/item/queen_bee
))
/obj/item/queen_bee))
strong_against -= /mob/living/simple_animal/hostile/poison/bees/syndi // Syndi-bees have special anti-flyswatter tech installed
/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, proximity_flag)
/obj/item/melee/flyswatter/attack(mob/living/M, mob/living/user, def_zone)
. = ..()
if(proximity_flag)
if(is_type_in_typecache(target, strong_against))
new /obj/effect/decal/cleanable/insectguts(target.drop_location())
to_chat(user, "<span class='warning'>You easily splat the [target].</span>")
if(istype(target, /mob/living/))
var/mob/living/bug = target
bug.death(1)
else
qdel(target)
if(!.)
return
if(is_type_in_typecache(M, strong_against))
new /obj/effect/decal/cleanable/insectguts(M.drop_location())
user.visible_message("<span class='warning'>[user] splats [M] with [src].</span>",
"<span class='warning'>You splat [M] with [src].</span>",
"<span class='warning'>You hear a splat.</span>")
if(isliving(M))
var/mob/living/bug = M
bug.death(TRUE)
if(!QDELETED(M))
qdel(M)
+1 -1
View File
@@ -28,7 +28,7 @@
if(reagents.has_reagent("water", 1) || reagents.has_reagent("cleaner", 1) || reagents.has_reagent("holywater", 1))
A.clean_blood()
for(var/obj/effect/O in A)
if(is_cleanable(O))
if(O.is_cleanable())
qdel(O)
reagents.reaction(A, REAGENT_TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly.
reagents.remove_any(1) //reaction() doesn't use up the reagents
+3 -1
View File
@@ -142,6 +142,8 @@
/obj/item/rpd/proc/delete_all_pipes(mob/user, turf/T) //Delete all pipes on a turf
var/eaten
for(var/obj/item/pipe/P in T)
if(P.pipe_type == PIPE_CIRCULATOR) //Skip TEG heat circulators, they aren't really pipes
continue
QDEL_NULL(P)
eaten = TRUE
for(var/obj/item/pipe_gsensor/G in T)
@@ -274,7 +276,7 @@
for(var/obj/O in T)
if(O.rpd_blocksusage() == TRUE)
to_chat(user, "<span class='warning'>[O] blocks the [src]!</span>")
to_chat(user, "<span class='warning'>[O] blocks [src]!</span>")
return
// If we get here, then we're effectively acting on the turf, probably placing a pipe.
+2 -2
View File
@@ -25,7 +25,7 @@
else if(target == user && user.a_intent == INTENT_GRAB && ishuman(target))
var/mob/living/carbon/human/muncher = user
if(muncher && isdrask(muncher))
to_chat(user, "You take a bite of the [name]. Delicious!")
to_chat(user, "<span class='notice'>You take a bite of [src]. Delicious!</span>")
playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0)
user.adjust_nutrition(2)
else if(istype(target, /obj/effect/decal/cleanable) || istype(target, /obj/effect/rune))
@@ -52,7 +52,7 @@
/obj/item/soap/proc/clean_turf(turf/simulated/T)
T.clean_blood()
for(var/obj/effect/O in T)
if(is_cleanable(O))
if(O.is_cleanable())
qdel(O)
/obj/item/soap/attack(mob/target as mob, mob/user as mob)
@@ -104,7 +104,7 @@
/obj/item/stock_parts/matter_bin
name = "matter bin"
desc = "A container for hold compressed matter awaiting re-construction."
desc = "A container used to hold compressed matter awaiting re-construction."
icon_state = "matter_bin"
origin_tech = "materials=1"
materials = list(MAT_METAL=80)
@@ -145,7 +145,7 @@
/obj/item/stock_parts/matter_bin/adv
name = "advanced matter bin"
desc = "A container for hold compressed matter awaiting re-construction."
desc = "A container used to hold compressed matter awaiting re-construction."
icon_state = "advanced_matter_bin"
origin_tech = "materials=3"
rating = 2
@@ -187,7 +187,7 @@
/obj/item/stock_parts/matter_bin/super
name = "super matter bin"
desc = "A container for hold compressed matter awaiting re-construction."
desc = "A container used to hold compressed matter awaiting re-construction."
icon_state = "super_matter_bin"
origin_tech = "materials=4;engineering=4"
rating = 3
@@ -229,7 +229,7 @@
/obj/item/stock_parts/matter_bin/bluespace
name = "bluespace matter bin"
desc = "A container for hold compressed matter awaiting re-construction."
desc = "A container used to hold compressed matter awaiting re-construction."
icon_state = "bluespace_matter_bin"
origin_tech = "materials=6;programming=4;engineering=4"
rating = 4
@@ -340,7 +340,7 @@
/obj/item/storage/backpack/duffel/syndie
name = "suspicious looking duffelbag"
desc = "A large duffelbag for holding extra tactical supplies."
icon_state = "duffel-syndie"
icon_state = "duffel-syndimed"
item_state = "duffel-syndimed"
origin_tech = "syndicate=1"
silent = TRUE
@@ -350,8 +350,6 @@
/obj/item/storage/backpack/duffel/syndie/med
name = "suspicious duffelbag"
desc = "A black and red duffelbag with a red and white cross sewn onto it."
icon_state = "duffel-syndimed"
item_state = "duffel-syndimed"
/obj/item/storage/backpack/duffel/syndie/ammo
name = "suspicious duffelbag"
@@ -41,7 +41,7 @@
cant_hold = list(/obj/item/disk/nuclear)
/obj/item/storage/bag/trash/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] puts the [name] over [user.p_their()] head and starts chomping at the insides! Disgusting!</span>")
user.visible_message("<span class='suicide'>[user] puts [src] over [user.p_their()] head and starts chomping at the insides! Disgusting!</span>")
playsound(loc, 'sound/items/eatfood.ogg', 50, 1, -1)
return TOXLOSS
@@ -230,7 +230,9 @@
/obj/item/flashlight/seclite,
/obj/item/holosign_creator/security,
/obj/item/melee/classic_baton/telescopic,
/obj/item/restraints/legcuffs/bola)
/obj/item/restraints/legcuffs/bola,
/obj/item/clothing/mask/gas/sechailer,
/obj/item/spacepod_key)
/obj/item/storage/belt/security/sec/populate_contents()
new /obj/item/flashlight/seclite(src)
@@ -447,6 +449,7 @@
item_state = "bandolier"
storage_slots = 8
can_hold = list(/obj/item/ammo_casing/shotgun)
display_contents_with_number = TRUE
/obj/item/storage/belt/bandolier/Initialize(mapload)
. = ..()
@@ -84,7 +84,7 @@
return
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
to_chat(user, "<span class='warning'>The [src] slips out of your hand and hits your head.</span>")
to_chat(user, "<span class='warning'>[src] slips out of your hand and hits your head.</span>")
user.take_organ_damage(10)
user.Paralyse(20)
return
@@ -52,16 +52,16 @@
to_chat(user, "<span class='warning'>There's already something in the false bottom!</span>")
return
if(I.w_class > WEIGHT_CLASS_NORMAL)
to_chat(user, "<span class='warning'>The [I] is too big to fit in the false bottom!</span>")
to_chat(user, "<span class='warning'>[I] is too big to fit in the false bottom!</span>")
return
if(!user.drop_item(I))
to_chat(user, "<span class='warning'>The [I] is stuck to your hands!</span>")
to_chat(user, "<span class='warning'>[I] is stuck to your hands!</span>")
return
stored_item = I
max_w_class = WEIGHT_CLASS_NORMAL - stored_item.w_class
I.forceMove(null) //null space here we go - to stop it showing up in the briefcase
to_chat(user, "You place the [I] into the false bottom of the briefcase.")
to_chat(user, "<span class='notice'>You place [I] into the false bottom of the briefcase.</span>")
else
return ..()
@@ -72,7 +72,7 @@
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
if(!bottom_open)
to_chat(user, "You begin to hunt around the rim of the [src]...")
to_chat(user, "<span class='notice'>You begin to hunt around the rim of [src]...</span>")
busy_hunting = TRUE
if(do_after(user, 20, target = src))
if(user)
@@ -80,13 +80,13 @@
bottom_open = TRUE
busy_hunting = FALSE
else
to_chat(user, "You push the false bottom down and close it with a click[stored_item ? ", with the [stored_item] snugly inside." : "."]")
to_chat(user, "<span class='notice'>You push the false bottom down and close it with a click[stored_item ? ", with [stored_item] snugly inside." : "."]</span>")
bottom_open = FALSE
/obj/item/storage/briefcase/false_bottomed/attack_hand(mob/user)
if(bottom_open && stored_item)
user.put_in_hands(stored_item)
to_chat(user, "You pull out the [stored_item] from the [src]'s false bottom.")
to_chat(user, "<span class='notice'>You pull out [stored_item] from [src]'s false bottom.</span>")
stored_item = null
max_w_class = initial(max_w_class)
else
@@ -163,7 +163,7 @@
/obj/item/storage/proc/show_to(mob/user)
if(!user.client)
return
if(user.s_active != src) // Switching from another container
if(user.s_active != src && !isobserver(user))
for(var/obj/item/I in src)
if(I.on_found(user)) // For mouse traps and such
return // If something triggered, don't open the UI
@@ -310,6 +310,9 @@
if(loc == I)
return FALSE //Means the item is already in the storage item
if(!I.can_enter_storage(src, usr))
return FALSE
if(length(contents) >= storage_slots)
if(!stop_messages)
to_chat(usr, "<span class='warning'>[I] won't fit in [src], make some space!</span>")
+25 -6
View File
@@ -25,16 +25,30 @@
update_icon()
/obj/item/melee/baton/loaded/Initialize(mapload) //this one starts with a cell pre-installed.
if(isrobot(loc.loc)) // First loc would be the module
link_new_cell()
return ..()
/obj/item/melee/baton/Destroy()
if(cell?.loc == src)
QDEL_NULL(cell)
return ..()
/**
* Updates the linked power cell on the baton.
*
* If the baton is held by a cyborg, link it to their internal cell.
* Else, spawn a new cell and use that instead.
* Arguments:
* * unlink - If TRUE, sets the `cell` variable to `null` rather than linking it to a new one.
*/
/obj/item/melee/baton/proc/link_new_cell(unlink = FALSE)
if(unlink)
cell = null
else if(isrobot(loc.loc)) // First loc is the module
var/mob/living/silicon/robot/R = loc.loc
cell = R.cell
else
cell = new(src)
return ..()
/obj/item/melee/baton/Destroy()
QDEL_NULL(cell)
return ..()
/obj/item/melee/baton/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide.</span>")
@@ -57,6 +71,11 @@
else
. += "<span class='warning'>The baton does not have a power source installed.</span>"
/obj/item/melee/baton/detailed_examine()
return "The baton needs to be turned on to apply the stunning effect. Use it in your hand to toggle it on or off. If your intent is \
set to 'harm', you will inflict damage when using it, regardless if it is on or not. Each stun reduces the baton's charge, which can be replenished by \
putting it inside a weapon recharger."
/obj/item/melee/baton/get_cell()
return cell
@@ -102,6 +102,7 @@
descriptive = "furiously hot"
. += "<span class='notice'>\The [bicon(icon)][src] feels [descriptive]</span>"
. += "<span class='notice'>The pressure gauge displays [round(air_contents.return_pressure())] kPa</span>"
/obj/item/tank/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
+18 -16
View File
@@ -81,14 +81,14 @@
user.update_inv_r_hand()
user.update_inv_l_hand()
if(isrobot(user))
to_chat(user, "<span class='notice'>You dedicate your module to [name].</span>")
to_chat(user, "<span class='notice'>You dedicate your module to [src].</span>")
else
to_chat(user, "<span class='notice'>You grab the [name] with both hands.</span>")
to_chat(user, "<span class='notice'>You grab [src] with both hands.</span>")
if(wieldsound)
playsound(loc, wieldsound, 50, 1)
var/obj/item/twohanded/offhand/O = new(user) ////Let's reserve his other hand~
O.name = "[name] - offhand"
O.desc = "Your second grip on the [name]"
O.desc = "Your second grip on [src]"
user.put_in_inactive_hand(O)
return TRUE
@@ -306,7 +306,7 @@
return
..()
if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40))
to_chat(user, "<span class='warning'>You twirl around a bit before losing your balance and impaling yourself on the [src].</span>")
to_chat(user, "<span class='warning'>You twirl around a bit before losing your balance and impaling yourself on [src].</span>")
user.take_organ_damage(20, 25)
return
if((wielded) && prob(50))
@@ -643,13 +643,13 @@
slot_flags = SLOT_BACK
force = 5
force_unwielded = 5
force_wielded = 20
force_wielded = 40
throwforce = 15
throw_range = 1
w_class = WEIGHT_CLASS_HUGE
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
var/charged = 5
var/charged = 2
origin_tech = "combat=4;bluespace=4;plasmatech=7"
/obj/item/twohanded/singularityhammer/New()
@@ -661,7 +661,7 @@
return ..()
/obj/item/twohanded/singularityhammer/process()
if(charged < 5)
if(charged < 2)
charged++
/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
@@ -670,6 +670,8 @@
/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
for(var/atom/movable/X in orange(5, pull))
if(X.move_resist == INFINITY)
continue
if(X == wielder)
continue
if((X) && (!X.anchored) && (!ishuman(X)))
@@ -682,7 +684,7 @@
var/obj/item/clothing/shoes/magboots/M = H.shoes
if(M.magpulse)
continue
H.apply_effect(1, WEAKEN, 0)
H.Weaken(2)
step_towards(H, pull)
step_towards(H, pull)
step_towards(H, pull)
@@ -691,7 +693,7 @@
if(!proximity)
return
if(wielded)
if(charged == 5)
if(charged == 2)
charged = 0
if(isliving(A))
var/mob/living/Z = A
@@ -717,9 +719,9 @@
/obj/item/twohanded/mjollnir/proc/shock(mob/living/target)
do_sparks(5, 1, target.loc)
target.visible_message("<span class='danger'>[target.name] was shocked by the [name]!</span>", \
"<span class='userdanger'>You feel a powerful shock course through your body sending you flying!</span>", \
"<span class='italics'>You hear a heavy electrical crack!</span>")
target.visible_message("<span class='danger'>[target] was shocked by [src]!</span>",
"<span class='userdanger'>You feel a powerful shock course through your body sending you flying!</span>",
"<span class='danger'>You hear a heavy electrical crack!</span>")
var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src)))
target.throw_at(throw_target, 200, 4)
@@ -783,15 +785,15 @@
if(isliving(A))
var/mob/living/Z = A
if(Z.health >= 1)
Z.visible_message("<span class='danger'>[Z.name] was sent flying by a blow from the [name]!</span>", \
"<span class='userdanger'>You feel a powerful blow connect with your body and send you flying!</span>", \
Z.visible_message("<span class='danger'>[Z.name] was sent flying by a blow from [src]!</span>",
"<span class='userdanger'>You feel a powerful blow connect with your body and send you flying!</span>",
"<span class='danger'>You hear something heavy impact flesh!.</span>")
var/atom/throw_target = get_edge_target_turf(Z, get_dir(src, get_step_away(Z, src)))
Z.throw_at(throw_target, 200, 4)
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
else if(wielded && Z.health < 1)
Z.visible_message("<span class='danger'>[Z.name] was blown to pieces by the power of [name]!</span>", \
"<span class='userdanger'>You feel a powerful blow rip you apart!</span>", \
Z.visible_message("<span class='danger'>[Z.name] was blown to pieces by the power of [src]!</span>",
"<span class='userdanger'>You feel a powerful blow rip you apart!</span>",
"<span class='danger'>You hear a heavy impact and the sound of ripping flesh!.</span>")
Z.gib()
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
@@ -114,6 +114,10 @@
machine_name = "Robco Tool Maker"
icon_state = "refill_engi"
/obj/item/vending_refill/youtool
machine_name = "YouTool"
icon_state = "refill_engi"
/obj/item/vending_refill/engivend
machine_name = "Engi-Vend"
icon_state = "refill_engi"
+4 -4
View File
@@ -17,7 +17,7 @@
resistance_flags = FIRE_PROOF
/obj/item/banhammer/suicide_act(mob/user)
to_chat(viewers(user), "<span class='suicide'>[user] is hitting [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to ban [user.p_them()]self from life.</span>")
visible_message("<span class='suicide'>[user] is hitting [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to ban [user.p_them()]self from life.</span>")
return BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS
/obj/item/banhammer/attack(mob/M, mob/user)
@@ -61,7 +61,7 @@
resistance_flags = FIRE_PROOF
/obj/item/claymore/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is falling on the [name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
user.visible_message("<span class='suicide'>[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
return BRUTELOSS
/obj/item/claymore/ceremonial
@@ -203,7 +203,7 @@
if(I.w_class <= WEIGHT_CLASS_NORMAL || istype(I, /obj/item/beach_ball)) // baseball bat deflecting
if(deflectmode)
if(prob(10))
visible_message("<span class='boldwarning'>[owner] Deflects [I] directly back at the thrower! It's a home run!</span>", "<span class='boldwarning'>You deflect the [I] directly back at the thrower! It's a home run!</span>")
visible_message("<span class='boldwarning'>[owner] Deflects [I] directly back at the thrower! It's a home run!</span>", "<span class='boldwarning'>You deflect [I] directly back at the thrower! It's a home run!</span>")
playsound(get_turf(owner), 'sound/weapons/homerun.ogg', 100, 1)
do_attack_animation(I, ATTACK_EFFECT_DISARM)
I.throw_at(I.thrownby, 20, 20, owner)
@@ -220,7 +220,7 @@
lastdeflect = world.time + 3000
return FALSE
else
visible_message("<span class='warning'>[owner] swings and deflects [I]!</span>", "<span class='warning'>You swing and deflect the [I]!</span>")
visible_message("<span class='warning'>[owner] swings and deflects [I]!</span>", "<span class='warning'>You swing and deflect [I]!</span>")
playsound(get_turf(owner), 'sound/weapons/baseball_hit.ogg', 50, 1, -1)
do_attack_animation(I, ATTACK_EFFECT_DISARM)
I.throw_at(get_edge_target_turf(owner, pick(GLOB.cardinal)), rand(8,10), 14, owner)
+1
View File
@@ -363,6 +363,7 @@ a {
/obj/proc/cult_reveal() //Called by cult reveal spell and chaplain's bible
return
/obj/proc/force_eject_occupant(mob/target)
// This proc handles safely removing occupant mobs from the object if they must be teleported out (due to being SSD/AFK, by admin teleport, etc) or transformed.
// In the event that the object doesn't have an overriden version of this proc to do it, log a runtime so one can be added.
@@ -27,7 +27,7 @@
// Please dont override this unless you absolutely have to
/obj/structure/closet/Initialize(mapload)
. = ..()
if(!opened)
if(mapload && !opened)
// Youre probably asking, why is this a 0 seconds timer AA?
// Well, I will tell you. One day, all /obj/effect/spawner will use Initialize
// This includes maint loot spawners. The problem with that is if a closet loads before a spawner,
@@ -327,7 +327,7 @@
//okay, so the closet is either welded or locked... resist!!!
to_chat(L, "<span class='warning'>You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)</span>")
for(var/mob/O in viewers(usr.loc))
O.show_message("<span class='danger'>The [src] begins to shake violently!</span>", 1)
O.show_message("<span class='danger'>[src] begins to shake violently!</span>", 1)
spawn(0)
@@ -24,7 +24,7 @@
var/oldloc = loc
step(src, direction)
if(oldloc != loc)
addtimer(CALLBACK(src, .proc/ResetMoveDelay), config.walk_speed)
addtimer(CALLBACK(src, .proc/ResetMoveDelay), GLOB.configuration.movement.base_walk_speed)
else
move_delay = FALSE
@@ -102,7 +102,7 @@
if(localopened)
if(fireaxe)
user.put_in_hands(fireaxe)
to_chat(user, "<span class='notice'>You take \the [fireaxe] from the [src].</span>")
to_chat(user, "<span class='notice'>You take \the [fireaxe] from [src].</span>")
fireaxe = null
add_fingerprint(user)
@@ -157,12 +157,12 @@
if(localopened)
if(fireaxe)
usr.put_in_hands(fireaxe)
to_chat(usr, "<span class='notice'>You take \the [fireaxe] from the [src].</span>")
to_chat(usr, "<span class='notice'>You take \the [fireaxe] from [src].</span>")
fireaxe = null
else
to_chat(usr, "<span class='notice'>The [src] is empty.</span>")
to_chat(usr, "<span class='notice'>[src] is empty.</span>")
else
to_chat(usr, "<span class='notice'>The [src] is closed.</span>")
to_chat(usr, "<span class='notice'>[src] is closed.</span>")
update_icon()
/obj/structure/closet/fireaxecabinet/attack_ai(mob/user as mob)
@@ -32,13 +32,13 @@
/obj/structure/closet/secure_closet/syndicate/depot/attack_animal(mob/M)
if(isanimal(M) && ("syndicate" in M.faction))
to_chat(M, "<span class='warning'>The [src] resists your attack!</span>")
to_chat(M, "<span class='warning'>[src] resists your attack!</span>")
return
return ..()
/obj/structure/closet/secure_closet/syndicate/depot/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/rcs))
to_chat(user, "<span class='warning'>Bluespace interference prevents the [W] from locking onto [src]!</span>")
to_chat(user, "<span class='warning'>Bluespace interference prevents [W] from locking onto [src]!</span>")
return
return ..()
@@ -69,6 +69,8 @@
togglelock(user)
/obj/structure/closet/secure_closet/AltClick(mob/user)
if(opened)
return ..()
if(Adjacent(user))
togglelock(user)
@@ -78,7 +80,7 @@
locked = FALSE
icon_state = icon_off
flick(icon_broken, src)
to_chat(user, "<span class='notice'>You break the lock on \the [src].</span>")
to_chat(user, "<span class='notice'>You break the lock on [src].</span>")
/obj/structure/closet/secure_closet/attack_hand(mob/user)
add_fingerprint(user)
@@ -125,7 +127,7 @@
//okay, so the closet is either welded or locked... resist!!!
to_chat(L, "<span class='warning'>You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)</span>")
for(var/mob/O in viewers(src))
O.show_message("<span class='danger'>The [src] begins to shake violently!</span>", 1)
O.show_message("<span class='danger'>[src] begins to shake violently!</span>", 1)
spawn(0)
@@ -118,7 +118,6 @@
new /obj/item/storage/lockbox/mindshield(src)
new /obj/item/storage/box/flashbangs(src)
new /obj/item/holosign_creator/security(src)
new /obj/item/clothing/mask/gas/sechailer/hos(src)
new /obj/item/shield/riot/tele(src)
new /obj/item/melee/baton/loaded(src)
new /obj/item/storage/belt/security/sec(src)
@@ -23,7 +23,7 @@
/obj/structure/closet/syndicate/suits/populate_contents()
new /obj/item/clothing/mask/gas/syndicate(src)
new /obj/item/clothing/suit/space/hardsuit/syndi(src)
new /obj/item/tank/jetpack/oxygen/harness(src)
new /obj/item/tank/internals/oxygen/red(src)
/obj/structure/closet/syndicate/nuclear
desc = "It's a storage unit for a Syndicate boarding party."
@@ -37,6 +37,7 @@
new /obj/item/storage/box/teargas(src)
new /obj/item/storage/box/flashbangs(src)
new /obj/item/storage/backpack/duffel/syndie/med(src)
new /obj/item/tank/jetpack/oxygen/harness(src)
new /obj/item/gun/projectile/automatic/shotgun/bulldog(src)
new /obj/item/gun/projectile/automatic/shotgun/bulldog(src)
new /obj/item/gun/projectile/automatic/shotgun/bulldog(src)
@@ -50,7 +51,7 @@
/obj/structure/closet/syndicate/sst/populate_contents()
new /obj/item/ammo_box/magazine/mm556x45(src)
new /obj/item/gun/projectile/automatic/l6_saw(src)
new /obj/item/tank/jetpack/oxygen/harness(src)
new /obj/item/tank/internals/oxygen/red(src)
new /obj/item/storage/belt/military/sst(src)
new /obj/item/clothing/glasses/thermal(src)
new /obj/item/clothing/shoes/magboots/syndie/advance(src)
@@ -367,6 +367,23 @@
newgas.temperature = target_temp
return newgas
/obj/structure/closet/crate/freezer/iv_storage
name = "IV storage freezer"
desc = "A freezer used to store IV bags containing various blood types."
/obj/structure/closet/crate/freezer/iv_storage/populate_contents()
new /obj/item/reagent_containers/iv_bag/blood/OMinus(src)
new /obj/item/reagent_containers/iv_bag/blood/OPlus(src)
new /obj/item/reagent_containers/iv_bag/blood/AMinus(src)
new /obj/item/reagent_containers/iv_bag/blood/APlus(src)
new /obj/item/reagent_containers/iv_bag/blood/BMinus(src)
new /obj/item/reagent_containers/iv_bag/blood/BPlus(src)
new /obj/item/reagent_containers/iv_bag/blood/random(src)
new /obj/item/reagent_containers/iv_bag/blood/random(src)
new /obj/item/reagent_containers/iv_bag/blood/random(src)
new /obj/item/reagent_containers/iv_bag/salglu(src)
new /obj/item/reagent_containers/iv_bag/slime(src)
/obj/structure/closet/crate/can
desc = "A large can, looks like a bin to me."
name = "garbage can"
+1 -1
View File
@@ -50,7 +50,7 @@
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
to_chat(user, "<span class='notice'>The [src] is too well secured to the floor.</span>")
to_chat(user, "<span class='notice'>[src] is too well secured to the floor.</span>")
/obj/structure/fusionreactor/proc/overload(containment_failure = FALSE, skip_qdel = FALSE)
if(has_overloaded)

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