Merge remote-tracking branch 'upstream/master' into just-defibrillator-things

This commit is contained in:
E-MonaRhg
2021-07-09 00:03:38 +02:00
632 changed files with 15669 additions and 22631 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(.)
@@ -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))
+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
+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()
@@ -0,0 +1,128 @@
/**
* Can be used to group spawners together so you ensure a certain amount of things are spawned but can be spawned on multiple locations.
*
* How to use:
* Either place the base grouped_spawner in the map and define the group_id to
* determine which spawners belong to one another.
* Or make a child instance of the grouped_spawner and define the values there.
*
* When using the base version be sure to define both total_amount and max_per_spawner on
* at least one of the spawners of the group.
* A mismatch between instances of the same group between these values will lead to a runtime.
* So either leave it empty for the rest or have the rest have the same values
**/
/obj/effect/spawner/grouped_spawner
name = "grouped spawner"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
/// Which path will be used to spawn.
var/path_to_spawn
/// How many will spawn. Set this in the map edit tool or in a child instance to set it for all the other instances.
var/total_amount
/// How many will spawn maximum per spawner. Set this in the map edit tool or in a child instance to set it for all the other instances.
var/max_per_spawner
/// The id of the group this spawner belongs to. If left empty it'll use the type as id. Define this for map instances if you want to link different spawners up or want to use the base version.
var/group_id
/// The assoc list of grouped spawners. Key = group_id, value = list of spawners with that key
var/static/list/spawner_groups
/// Which spawners are chosen to spawn the objects
var/static/list/chosen_spawners
/// The list which holds the total_amount values for each spawner group
var/static/list/total_amount_for_spawners
/// The list which holds the max_per_spawner values for each spawner group
var/static/list/max_per_spawner_for_spawners
/obj/effect/spawner/grouped_spawner/Initialize(mapload)
. = INITIALIZE_HINT_QDEL // For crash handling
if(!mapload)
CRASH("[src] of type [type] was made post mapload")
var/turf/T = get_turf(src)
if(!T)
CRASH("Spawner placed in nullspace!")
if(isnull(group_id)) // Set the group_id if null
group_id = type
if(group_id == /obj/effect/spawner/grouped_spawner) // Not allowed to use the base type as group_id
CRASH("group_id was not set for [src] of type '[type]'")
..()
save_spawn_values()
LAZYADDASSOC(spawner_groups, group_id, src)
return INITIALIZE_HINT_LATELOAD
/obj/effect/spawner/grouped_spawner/LateInitialize()
..()
if(LAZYACCESS(spawner_groups, group_id) && !LAZYACCESS(chosen_spawners, group_id)) // Not yet picked the spawners
pick_spawners()
var/list/CS = LAZYACCESS(chosen_spawners, group_id)
if(!LAZYACCESS(CS, src)) // I'm not one of the chosen ones ;(
qdel(src)
return
get_spawn_values()
var/turf/T = get_turf(src)
spawn_objects(T, CS[src])
qdel(src)
/obj/effect/spawner/grouped_spawner/Destroy()
. = ..()
LAZYREMOVEASSOC(chosen_spawners, group_id, src)
if(!LAZYACCESS(chosen_spawners, group_id)) // Last instance that uses these values
LAZYREMOVE(total_amount_for_spawners, group_id)
LAZYREMOVE(max_per_spawner_for_spawners, group_id)
/**
* Saves the spawn values. Will only pick the first defined version of this group_id
*/
/obj/effect/spawner/grouped_spawner/proc/save_spawn_values()
if(!isnull(total_amount))
if(LAZYACCESS(total_amount_for_spawners, group_id) && total_amount_for_spawners[group_id] != total_amount)
stack_trace("total_amount mismatch for type [type]. Possible duplicate total_amount definition in the map")
else
LAZYSET(total_amount_for_spawners, group_id, total_amount)
if(!isnull(max_per_spawner))
if(LAZYACCESS(max_per_spawner_for_spawners, group_id) && max_per_spawner_for_spawners[group_id] != max_per_spawner)
stack_trace("max_per_spawner mismatch for type [type]. Possible duplicate total_amount definition in the map")
else
LAZYSET(max_per_spawner_for_spawners, group_id, max_per_spawner)
/**
* Sets the spawn values to the values of the first defined instance of this group_id
*/
/obj/effect/spawner/grouped_spawner/proc/get_spawn_values()
total_amount = total_amount_for_spawners[group_id]
max_per_spawner = max_per_spawner_for_spawners[group_id]
/obj/effect/spawner/grouped_spawner/proc/spawn_objects(turf/T, amount)
for(var/i in 1 to amount)
new path_to_spawn(T)
/obj/effect/spawner/grouped_spawner/proc/pick_spawners()
var/list/pickable_spawners = spawner_groups[group_id]
LAZYSET(chosen_spawners, group_id, list())
var/list/spawners = chosen_spawners[group_id]
for(var/i in 1 to total_amount)
if(!length(pickable_spawners))
return // No more to pick from
var/obj/effect/spawner/grouped_spawner/S = pick(pickable_spawners)
if(++spawners[S] >= max_per_spawner)
pickable_spawners -= S
// Clean up
pickable_spawners.Cut()
LAZYREMOVE(spawner_groups, group_id)
// Example grouped spawner
/obj/effect/spawner/grouped_spawner/duck_spawn
name = "grouped rubberducky spawner"
path_to_spawn = /obj/item/bikehorn/rubberducky
max_per_spawner = 2
total_amount = 5
@@ -258,7 +258,7 @@
/obj/item/assembly/signaler/anomaly/random = 50, // anomaly core
/obj/item/mecha_parts/mecha_equipment/weapon/energy/xray = 25, // mecha x-ray laser
/obj/item/mecha_parts/mecha_equipment/teleporter/precise = 25, // upgraded mecha teleporter
/obj/item/autosurgeon = 50,
/obj/item/autosurgeon/organ = 50,
// Research / Experimentor
/obj/item/paper/researchnotes = 150, // papers that give random R&D levels
@@ -388,11 +388,11 @@
lootcount = 3
lootdoubles = FALSE
var/soups = list(
/obj/item/reagent_containers/food/snacks/beetsoup,
/obj/item/reagent_containers/food/snacks/stew,
/obj/item/reagent_containers/food/snacks/hotchili,
/obj/item/reagent_containers/food/snacks/nettlesoup,
/obj/item/reagent_containers/food/snacks/meatballsoup)
/obj/item/reagent_containers/food/snacks/soup/beetsoup,
/obj/item/reagent_containers/food/snacks/soup/stew,
/obj/item/reagent_containers/food/snacks/soup/hotchili,
/obj/item/reagent_containers/food/snacks/soup/nettlesoup,
/obj/item/reagent_containers/food/snacks/soup/meatballsoup)
var/salads = list(
/obj/item/reagent_containers/food/snacks/herbsalad,
/obj/item/reagent_containers/food/snacks/validsalad,
@@ -83,7 +83,7 @@
/obj/effect/temp_visual/dir_setting/wraith
name = "blood"
icon = 'icons/mob/mob.dmi'
icon = 'icons/mob/cult.dmi'
icon_state = "phase_shift2"
duration = 12
+6
View File
@@ -288,6 +288,9 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
if(!user.unEquip(src, silent = TRUE))
return 0
if(flags & ABSTRACT)
return 0
else
if(isliving(loc))
return 0
@@ -728,3 +731,6 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
if(flags & SLOT_PDA)
owner.update_inv_wear_pda()
/// Called on cyborg items that need special charging behavior. Override as needed for specific items.
/obj/item/proc/cyborg_recharge(coeff = 1, emagged = FALSE)
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)
+1 -1
View File
@@ -40,7 +40,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)
@@ -120,10 +120,6 @@
name = "Unknown"
desc = "A cardboard cutout of a cultist."
icon_state = "cutout_cultist"
//if("Clockwork Cultist")
// name = "[random_name(pick(MALE,FEMALE))]"
// desc = "A cardboard cutout of a servant of Ratvar."
// icon_state = "cutout_servant"
if("Revolutionary")
name = "Unknown"
desc = "A cardboard cutout of a revolutionary."
-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()
..()
+9 -4
View File
@@ -174,6 +174,11 @@
colourName = "purple"
..()
/obj/item/toy/crayon/black
icon_state = "crayonblack"
colour = "#000000"
colourName = "black"
/obj/item/toy/crayon/white
icon_state = "crayonwhite"
colour = "#FFFFFF"
@@ -232,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")
+2 -2
View File
@@ -74,7 +74,7 @@
var/dead_notes = input("Insert any relevant notes")
var/obj/item/paper/R = new(user.loc)
R.name = "Official Coroner's Report - [dead_name]"
R.info = "<b>Nanotrasen Science Station [GLOB.using_map.station_short] - Coroner's Report</b><br><br><b>Name of Deceased:</b> [dead_name]</br><br><b>Rank of Deceased:</b> [dead_rank]<br><br><b>Time of Death:</b> [dead_tod]<br><br><b>Cause of Death:</b> [dead_cause]<br><br><b>Trace Chemicals:</b> [dead_chems]<br><br><b>Additional Coroner's Notes:</b> [dead_notes]<br><br><b>Coroner's Signature:</b> <span class=\"paper_field\">"
R.info = "<b>[SSmapping.map_datum.fluff_name] - Coroner's Report</b><br><br><b>Name of Deceased:</b> [dead_name]</br><br><b>Rank of Deceased:</b> [dead_rank]<br><br><b>Time of Death:</b> [dead_tod]<br><br><b>Cause of Death:</b> [dead_cause]<br><br><b>Trace Chemicals:</b> [dead_chems]<br><br><b>Additional Coroner's Notes:</b> [dead_notes]<br><br><b>Coroner's Signature:</b> <span class=\"paper_field\">"
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
sleep(10)
user.put_in_hands(R)
@@ -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
+18 -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
@@ -176,6 +176,12 @@
..()
new /obj/effect/temp_visual/borgflash(get_turf(src))
/obj/item/flash/cyborg/cyborg_recharge(coeff, emagged)
if(broken)
broken = FALSE
times_used = 0
icon_state = "flash"
/obj/item/flash/cameraflash
name = "camera"
icon = 'icons/obj/items.dmi'
@@ -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
@@ -262,6 +262,10 @@
/obj/item/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
return
/obj/item/lightreplacer/cyborg/cyborg_recharge(coeff, emagged)
for(var/I in 1 to coeff)
Charge()
#undef LIGHT_OK
#undef LIGHT_EMPTY
#undef LIGHT_BROKEN
@@ -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>."
@@ -190,14 +190,14 @@
ks2type = /obj/item/encryptionkey/heads/captain
/obj/item/radio/headset/heads/captain/alt
name = "\proper the captain's bowman headset"
name = "captain's bowman headset"
desc = "The headset of the boss. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
/obj/item/radio/headset/heads/rd
name = "Research Director's headset"
name = "research director's headset"
desc = "Headset of the researching God."
icon_state = "com_headset"
item_state = "headset"
@@ -211,7 +211,7 @@
ks2type = /obj/item/encryptionkey/heads/hos
/obj/item/radio/headset/heads/hos/alt
name = "\proper the head of security's bowman headset"
name = "head of security's bowman headset"
desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
@@ -272,7 +272,7 @@
ks2type = /obj/item/encryptionkey/heads/magistrate
/obj/item/radio/headset/heads/magistrate/alt
name = "\proper magistrate's bowman headset"
name = "magistrate's bowman headset"
desc = "The headset of the Magistrate. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
@@ -286,7 +286,7 @@
ks2type = /obj/item/encryptionkey/heads/blueshield
/obj/item/radio/headset/heads/blueshield/alt
name = "\proper blueshield's bowman headset"
name = "blueshield's bowman headset"
desc = "The headset of the Blueshield. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
@@ -314,7 +314,7 @@
instant = TRUE
/obj/item/radio/headset/centcom
name = "\proper centcom officer's bowman headset"
name = "centcom officer's bowman headset"
desc = "The headset of final authority. Protects ears from flashbangs. Can transmit even if telecomms are down."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
@@ -132,7 +132,7 @@
return
else if(iscoil(W) && buildstage == 1)
var/obj/item/stack/cable_coil/coil = W
if(coil.amount < 5)
if(coil.get_amount() < 5)
to_chat(user, "<span class='warning'>You need more cable for this!</span>")
return
if(do_after(user, 10 * coil.toolspeed, target = src) && buildstage == 1)
+20 -10
View File
@@ -100,9 +100,9 @@ REAGENT SCANNER
/obj/item/healthanalyzer/attack(mob/living/M, mob/living/user)
if((HAS_TRAIT(user, TRAIT_CLUMSY) || user.getBrainLoss() >= 60) && prob(50))
user.visible_message("<span class='warning'>[user] analyzes the floor's vitals!</span>", "<span class='notice'>You stupidly try to analyze the floor's vitals!</span>")
to_chat(user, "<span class='info'>Analyzing results for The floor:\n\tOverall status: <b>Healthy</b></span>")
to_chat(user, "<span class='info'>Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FF8000'>Burn</font>/<font color='red'>Brute</font></span>")
to_chat(user, "<span class='info'>\tDamage specifics: <font color='blue'>0</font>-<font color='green'>0</font>-<font color='#FF8000'>0</font>-<font color='red'>0</font></span>")
to_chat(user, "<span class='info'>Analyzing results for The floor:\n\tOverall status: Healthy</span>")
to_chat(user, "<span class='info'>Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burn</font>/<font color='red'>Brute</font></span>")
to_chat(user, "<span class='info'>\tDamage specifics: <font color='blue'>0</font> - <font color='green'>0</font> - <font color='#FFA500'>0</font> - <font color='red'>0</font></span>")
to_chat(user, "<span class='info'>Body temperature: ???</span>")
return
@@ -130,19 +130,29 @@ REAGENT SCANNER
var/TX = H.getToxLoss() > 50 ? "<b>[H.getToxLoss()]</b>" : H.getToxLoss()
var/BU = H.getFireLoss() > 50 ? "<b>[H.getFireLoss()]</b>" : H.getFireLoss()
var/BR = H.getBruteLoss() > 50 ? "<b>[H.getBruteLoss()]</b>" : H.getBruteLoss()
if(HAS_TRAIT(H, TRAIT_FAKEDEATH))
OX = fake_oxy > 50 ? "<b>[fake_oxy]</b>" : fake_oxy
to_chat(user, "<span class='notice'>Analyzing Results for [H]:\n\t Overall Status: dead</span>")
else
to_chat(user, "<span class='notice'>Analyzing Results for [H]:\n\t Overall Status: [H.stat > 1 ? "dead" : "[H.health]% healthy"]</span>")
var/status = "<font color='red'>Dead</font>" // Dead by default to make it simpler
var/DNR = !H.ghost_can_reenter() // If the ghost can't reenter
if(H.stat == DEAD)
if(DNR)
status = "<font color='red'>Dead <b>\[DNR]</b></font>"
else // Alive or unconscious
if(HAS_TRAIT(H, TRAIT_FAKEDEATH)) // status still shows as "Dead"
OX = fake_oxy > 50 ? "<b>[fake_oxy]</b>" : fake_oxy
else
status = "[H.health]% Healthy"
to_chat(user, "<span class='notice'>Analyzing Results for [H]:\n\t Overall Status: [status]")
to_chat(user, "\t Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font>")
to_chat(user, "\t Damage Specifics: <font color='blue'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>")
to_chat(user, "<span class='notice'>Body Temperature: [H.bodytemperature-T0C]&deg;C ([H.bodytemperature*1.8-459.67]&deg;F)</span>")
if(H.timeofdeath && (H.stat == DEAD || (HAS_TRAIT(H, TRAIT_FAKEDEATH))))
to_chat(user, "<span class='notice'>Time of Death: [station_time_timestamp("hh:mm:ss", H.timeofdeath)]</span>")
var/tdelta = round(world.time - H.timeofdeath)
if(tdelta < DEFIB_TIME_LIMIT)
if(tdelta < DEFIB_TIME_LIMIT && !DNR)
to_chat(user, "<span class='danger'>Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!</span>")
else
to_chat(user, "<font color='red'>Subject died [DisplayTimeText(tdelta)] ago.</font>")
if(mode == 1)
var/list/damaged = H.get_damaged_organs(1,1)
@@ -812,7 +822,7 @@ REAGENT SCANNER
if(unknown_body || e.hidden)
imp += "Unknown body present:"
if(!AN && !open && !infected & !imp)
if(!AN && !open && !infected && !imp)
AN = "None:"
dat += "<td>[e.name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]</td>"
dat += "</tr>"
@@ -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))
+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
+2 -2
View File
@@ -31,7 +31,7 @@
return 1
if(istype(I, /obj/item/stack))
var/obj/item/stack/S = I
if(S.amount > 1)
if(S.get_amount() > 1)
var/obj/item/stack/to_add = S.split(user, 1)
to_add.forceMove(src)
user.visible_message("<span class='notice'>[user] adds one of [S] to [src].</span>", "<span class='notice'>You add one of [S] to [src].</span>")
@@ -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)
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+102 -126
View File
@@ -7,19 +7,72 @@
icon = 'icons/obj/module.dmi'
icon_state = "cyborg_upgrade"
origin_tech = "programming=2"
var/locked = 0
var/installed = 0
/// Whether or not the cyborg needs to have a chosen module before they can recieve this upgrade.
var/require_module = FALSE
/// The type of module this upgrade is compatible with: Engineering, Medical, etc.
var/module_type = null
/// A list of items, and their replacements that this upgrade should replace on installation, in the format of `item_type_to_replace = replacement_item_type`.
var/list/items_to_replace = list()
/// A list of replacement items will need to be placed into a cyborg module's `special_rechargable` list after this upgrade is installed.
var/list/special_rechargables = list()
/**
* Called when someone clicks on a borg with an upgrade in their hand.
*
* Arguments:
* * R - the cyborg that was clicked on with an upgrade.
*/
/obj/item/borg/upgrade/proc/action(mob/living/silicon/robot/R)
if(!pre_install_checks(R))
return
if(!do_install(R))
return
after_install(R)
return TRUE
/**
* Checks if the upgrade is able to be applied to the cyborg, before actually applying it.
*
* Arguments:
* * R - the cyborg that was clicked on with an upgrade.
*/
/obj/item/borg/upgrade/proc/pre_install_checks(mob/living/silicon/robot/R)
if(R.stat == DEAD)
to_chat(usr, "<span class='notice'>[src] will not function on a deceased cyborg.</span>")
return TRUE
to_chat(usr, "<span class='warning'>[src] will not function on a deceased cyborg.</span>")
return FALSE
if(module_type && !istype(R.module, module_type))
to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
to_chat(usr, "There's no mounting point for the module!")
return TRUE
to_chat(R, "<span class='warning'>Upgrade mounting error! No suitable hardpoint detected!</span>")
to_chat(usr, "<span class='warning'>There's no mounting point for the module!</span>")
return FALSE
return TRUE
/**
* Executes code that will modify the cyborg or its module.
*
* Arguments:
* * R - the cyborg we're applying the upgrade to.
*/
/obj/item/borg/upgrade/proc/do_install(mob/living/silicon/robot/R)
return TRUE
/**
* Executes code after the module has been installed and the cyborg has been modified in some way.
*
* Arguments:
* * R - the cyborg that we've applied the upgrade to.
*/
/obj/item/borg/upgrade/proc/after_install(mob/living/silicon/robot/R)
for(var/item in items_to_replace)
var/replacement_type = items_to_replace[item]
var/obj/item/replacement = new replacement_type(R.module)
R.module.remove_item_from_lists(item)
R.module.basic_modules += replacement
if(replacement_type in special_rechargables)
R.module.special_rechargables += replacement
R.module?.rebuild_modules()
return TRUE
/obj/item/borg/upgrade/reset
name = "cyborg module reset board"
@@ -27,14 +80,13 @@
icon_state = "cyborg_upgrade1"
require_module = TRUE
/obj/item/borg/upgrade/reset/action(mob/living/silicon/robot/R)
if(..())
return
/obj/item/borg/upgrade/reset/do_install(mob/living/silicon/robot/R)
R.reset_module()
return TRUE
/obj/item/borg/upgrade/reset/after_install(mob/living/silicon/robot/R)
return // We don't need to give them replacement items, or rebuild their module list. It's going to be a blank borg.
/obj/item/borg/upgrade/rename
name = "cyborg reclassification board"
desc = "Used to rename a cyborg."
@@ -44,9 +96,7 @@
/obj/item/borg/upgrade/rename/attack_self(mob/user)
heldname = stripped_input(user, "Enter new robot name", "Cyborg Reclassification", heldname, MAX_NAME_LEN)
/obj/item/borg/upgrade/rename/action(mob/living/silicon/robot/R)
if(..())
return
/obj/item/borg/upgrade/rename/do_install(mob/living/silicon/robot/R)
if(!R.allow_rename)
to_chat(R, "<span class='warning'>Internal diagnostic error: incompatible upgrade module detected.</span>")
return 0
@@ -63,7 +113,7 @@
desc = "Used to force a reboot of a disabled-but-repaired cyborg, bringing it back online."
icon_state = "cyborg_upgrade1"
/obj/item/borg/upgrade/restart/action(mob/living/silicon/robot/R)
/obj/item/borg/upgrade/restart/do_install(mob/living/silicon/robot/R)
if(R.health < 0)
to_chat(usr, "<span class='warning'>You have to repair the cyborg before using this module!</span>")
return 0
@@ -88,9 +138,7 @@
require_module = TRUE
origin_tech = "engineering=4;materials=5;programming=4"
/obj/item/borg/upgrade/vtec/action(mob/living/silicon/robot/R)
if(..())
return
/obj/item/borg/upgrade/vtec/do_install(mob/living/silicon/robot/R)
if(R.speed < 0)
to_chat(R, "<span class='notice'>A VTEC unit is already installed!</span>")
to_chat(usr, "<span class='notice'>There's no room for another VTEC unit!</span>")
@@ -108,10 +156,7 @@
require_module = TRUE
module_type = /obj/item/robot_module/security
/obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R)
if(..())
return
/obj/item/borg/upgrade/disablercooler/do_install(mob/living/silicon/robot/R)
var/obj/item/gun/energy/disabler/cyborg/T = locate() in R.module.modules
if(!T)
to_chat(usr, "<span class='notice'>There's no disabler in this unit!</span>")
@@ -131,10 +176,7 @@
icon_state = "cyborg_upgrade3"
origin_tech = "engineering=4;powerstorage=4"
/obj/item/borg/upgrade/thrusters/action(mob/living/silicon/robot/R)
if(..())
return
/obj/item/borg/upgrade/thrusters/do_install(mob/living/silicon/robot/R)
if(R.ionpulse)
to_chat(usr, "<span class='notice'>This unit already has ion thrusters installed!</span>")
return
@@ -149,20 +191,9 @@
origin_tech = "engineering=4;materials=5"
require_module = TRUE
module_type = /obj/item/robot_module/miner
/obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R)
if(..())
return
for(var/obj/item/pickaxe/drill/cyborg/D in R.module.modules)
qdel(D)
for(var/obj/item/shovel/S in R.module.modules)
qdel(S)
R.module.modules += new /obj/item/pickaxe/drill/cyborg/diamond(R.module)
R.module.rebuild()
return TRUE
items_to_replace = list(
/obj/item/pickaxe/drill/cyborg = /obj/item/pickaxe/drill/cyborg/diamond
)
/obj/item/borg/upgrade/soh
name = "mining cyborg satchel of holding"
@@ -171,18 +202,9 @@
origin_tech = "engineering=4;materials=4;bluespace=4"
require_module = TRUE
module_type = /obj/item/robot_module/miner
/obj/item/borg/upgrade/soh/action(mob/living/silicon/robot/R)
if(..())
return
for(var/obj/item/storage/bag/ore/cyborg/S in R.module.modules)
qdel(S)
R.module.modules += new /obj/item/storage/bag/ore/holding(R.module)
R.module.rebuild()
return TRUE
items_to_replace = list(
/obj/item/storage/bag/ore/cyborg = /obj/item/storage/bag/ore/holding
)
/obj/item/borg/upgrade/abductor_engi
name = "engineering cyborg abductor upgrade"
@@ -191,33 +213,17 @@
origin_tech = "engineering=6;materials=6;abductor=3"
require_module = TRUE
module_type = /obj/item/robot_module/engineering
/obj/item/borg/upgrade/abductor_engi/action(mob/living/silicon/robot/R)
if(..())
return
for(var/obj/item/weldingtool/largetank/cyborg/W in R.module.modules)
qdel(W)
for(var/obj/item/screwdriver/cyborg/S in R.module.modules)
qdel(S)
for(var/obj/item/wrench/cyborg/E in R.module.modules)
qdel(E)
for(var/obj/item/crowbar/cyborg/C in R.module.modules)
qdel(C)
for(var/obj/item/wirecutters/cyborg/I in R.module.modules)
qdel(I)
for(var/obj/item/multitool/cyborg/M in R.module.modules)
qdel(M)
R.module.modules += new /obj/item/weldingtool/abductor(R.module)
R.module.modules += new /obj/item/wrench/abductor(R.module)
R.module.modules += new /obj/item/screwdriver/abductor(R.module)
R.module.modules += new /obj/item/crowbar/abductor(R.module)
R.module.modules += new /obj/item/wirecutters/abductor(R.module)
R.module.modules += new /obj/item/multitool/abductor(R.module)
R.module.rebuild()
return TRUE
items_to_replace = list(
/obj/item/weldingtool = /obj/item/weldingtool/abductor,
/obj/item/wrench = /obj/item/wrench/abductor,
/obj/item/screwdriver = /obj/item/screwdriver/abductor,
/obj/item/crowbar = /obj/item/crowbar/abductor,
/obj/item/wirecutters = /obj/item/wirecutters/abductor,
/obj/item/multitool = /obj/item/multitool/abductor
)
special_rechargables = list(
/obj/item/weldingtool/abductor
)
/obj/item/borg/upgrade/abductor_medi
name = "medical cyborg abductor upgrade"
@@ -226,39 +232,16 @@
origin_tech = "biotech=6;materials=6;abductor=3"
require_module = TRUE
module_type = /obj/item/robot_module/medical
/obj/item/borg/upgrade/abductor_medi/action(mob/living/silicon/robot/R)
if(..())
return
for(var/obj/item/scalpel/laser/laser1/L in R.module.modules)
qdel(L)
for(var/obj/item/hemostat/H in R.module.modules)
qdel(H)
for(var/obj/item/retractor/E in R.module.modules)
qdel(E)
for(var/obj/item/bonegel/B in R.module.modules)
qdel(B)
for(var/obj/item/FixOVein/F in R.module.modules)
qdel(F)
for(var/obj/item/bonesetter/S in R.module.modules)
qdel(S)
for(var/obj/item/circular_saw/C in R.module.modules)
qdel(C)
for(var/obj/item/surgicaldrill/D in R.module.modules)
qdel(D)
R.module.modules += new /obj/item/scalpel/laser/laser3(R.module) //no abductor laser scalpel, so next best thing.
R.module.modules += new /obj/item/hemostat/alien(R.module)
R.module.modules += new /obj/item/retractor/alien(R.module)
R.module.modules += new /obj/item/bonegel/alien(R.module)
R.module.modules += new /obj/item/FixOVein/alien(R.module)
R.module.modules += new /obj/item/bonesetter/alien(R.module)
R.module.modules += new /obj/item/circular_saw/alien(R.module)
R.module.modules += new /obj/item/surgicaldrill/alien(R.module)
R.module.rebuild()
return TRUE
items_to_replace = list(
/obj/item/scalpel/laser/laser1 = /obj/item/scalpel/laser/laser3, // No abductor laser scalpel, so next best thing.
/obj/item/hemostat = /obj/item/hemostat/alien,
/obj/item/retractor = /obj/item/retractor/alien,
/obj/item/bonegel = /obj/item/bonegel/alien,
/obj/item/FixOVein = /obj/item/FixOVein/alien,
/obj/item/bonesetter = /obj/item/bonesetter/alien,
/obj/item/circular_saw = /obj/item/circular_saw/alien,
/obj/item/surgicaldrill = /obj/item/surgicaldrill/alien
)
/obj/item/borg/upgrade/syndicate
name = "safety override module"
@@ -267,13 +250,11 @@
origin_tech = "combat=6;materials=6"
require_module = TRUE
/obj/item/borg/upgrade/syndicate/action(mob/living/silicon/robot/R)
if(..())
return
/obj/item/borg/upgrade/syndicate/do_install(mob/living/silicon/robot/R)
if(R.weapons_unlock)
to_chat(R, "<span class='warning'>Warning: Safety Overide Protocols have be disabled.</span>")
return
R.weapons_unlock = 1
return // They already had the safety override upgrade, or they're a cyborg type which has this by default.
R.weapons_unlock = TRUE
to_chat(R, "<span class='warning'>Warning: Safety Overide Protocols have be disabled.</span>")
return TRUE
/obj/item/borg/upgrade/lavaproof
@@ -284,9 +265,7 @@
require_module = TRUE
module_type = /obj/item/robot_module/miner
/obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R)
if(..())
return
/obj/item/borg/upgrade/lavaproof/do_install(mob/living/silicon/robot/R)
if(istype(R))
R.weather_immunities += "lava"
return TRUE
@@ -303,10 +282,7 @@
var/powercost = 10
var/mob/living/silicon/robot/cyborg
/obj/item/borg/upgrade/selfrepair/action(mob/living/silicon/robot/R)
if(..())
return
/obj/item/borg/upgrade/selfrepair/do_install(mob/living/silicon/robot/R)
var/obj/item/borg/upgrade/selfrepair/U = locate() in R
if(U)
to_chat(usr, "<span class='warning'>This unit is already equipped with a self-repair module.</span>")
+26 -2
View File
@@ -17,13 +17,18 @@
var/healverb = "bandage"
/obj/item/stack/medical/attack(mob/living/M, mob/user)
if(get_amount() <= 0)
if(is_cyborg)
to_chat(user, "<span class='warning'>You don't have enough energy to dispense more [singular_name]\s!</span>")
return TRUE
if(!iscarbon(M) && !isanimal(M))
to_chat(user, "<span class='danger'>[src] cannot be applied to [M]!</span>")
return 1
return TRUE
if(!user.IsAdvancedToolUser())
to_chat(user, "<span class='danger'>You don't have the dexterity to do this!</span>")
return 1
return TRUE
if(ishuman(M))
@@ -167,7 +172,12 @@
heal_brute = 25
stop_bleeding = 0
/obj/item/stack/medical/bruise_pack/advanced/cyborg
energy_type = /datum/robot_energy_storage/medical/adv_brute_kit
is_cyborg = TRUE
/obj/item/stack/medical/bruise_pack/advanced/cyborg/syndicate
energy_type = /datum/robot_energy_storage/medical/adv_brute_kit/syndicate
//Ointment//
@@ -208,6 +218,13 @@
icon_state = "burnkit"
heal_burn = 25
/obj/item/stack/medical/ointment/advanced/cyborg
energy_type = /datum/robot_energy_storage/medical/adv_burn_kit
is_cyborg = TRUE
/obj/item/stack/medical/ointment/advanced/cyborg/syndicate
energy_type = /datum/robot_energy_storage/medical/adv_burn_kit/syndicate
//Medical Herbs//
/obj/item/stack/medical/bruise_pack/comfrey
name = "\improper Comfrey leaf"
@@ -283,6 +300,13 @@
H.handle_splints()
use(1)
/obj/item/stack/medical/splint/cyborg
energy_type = /datum/robot_energy_storage/medical/splint
is_cyborg = TRUE
/obj/item/stack/medical/splint/cyborg/syndicate
energy_type = /datum/robot_energy_storage/medical/splint/syndicate
/obj/item/stack/medical/splint/tribal
name = "tribal splints"
icon_state = "tribal_splint"
@@ -63,3 +63,16 @@
to_chat(user, "<span class='notice'>Nothing to fix here.</span>")
else
to_chat(user, "<span class='notice'>[src] won't work on that.</span>")
/obj/item/stack/nanopaste/cyborg
energy_type = /datum/robot_energy_storage/medical/nanopaste
is_cyborg = TRUE
/obj/item/stack/nanopaste/cyborg/attack(mob/living/M, mob/user)
if(get_amount() <= 0)
to_chat(user, "<span class='warning'>You don't have enough energy to dispense more [name]!</span>")
else
return ..()
/obj/item/stack/nanopaste/cyborg/syndicate
energy_type = /datum/robot_energy_storage/medical/nanopaste/syndicate
+6
View File
@@ -21,10 +21,16 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
hitsound = 'sound/weapons/grenadelaunch.ogg'
toolspeed = 1
usesound = 'sound/items/deconstruct.ogg'
merge_type = /obj/item/stack/rods
/obj/item/stack/rods/cyborg
energy_type = /datum/robot_energy_storage/rods
is_cyborg = TRUE
materials = list()
/obj/item/stack/rods/cyborg/update_icon()
return // icon_state should always be a full stack of rods.
/obj/item/stack/rods/ten
amount = 10
+12 -8
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
@@ -40,6 +40,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
amount = 50
/obj/item/stack/sheet/glass/cyborg
energy_type = /datum/robot_energy_storage/glass
is_cyborg = TRUE
materials = list()
/obj/item/stack/sheet/glass/New(loc, amount)
@@ -48,15 +50,15 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user, params)
..()
if(istype(W,/obj/item/stack/cable_coil))
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CC = W
if(CC.amount < 5)
if(CC.get_amount() < 5)
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)
src.use(1)
use(1)
else if( istype(W, /obj/item/stack/rods) )
var/obj/item/stack/rods/V = W
var/obj/item/stack/sheet/rglass/RG = new (user.loc)
@@ -97,9 +99,6 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
merge_type = /obj/item/stack/sheet/rglass
point_value = 4
/obj/item/stack/sheet/rglass/cyborg
materials = list()
/obj/item/stack/sheet/rglass/New(loc, amount)
recipes = GLOB.reinforced_glass_recipes
..()
@@ -109,6 +108,11 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/plasmabasic, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
))
/obj/item/stack/sheet/rglass/cyborg
energy_type = /datum/robot_energy_storage/rglass
is_cyborg = TRUE
materials = list()
/obj/item/stack/sheet/plasmaglass
name = "plasma glass"
desc = "A very strong and very resistant sheet of a plasma-glass alloy."
+9 -18
View File
@@ -13,25 +13,16 @@
flags = CONDUCT
max_amount = 60
/obj/item/stack/light_w/attackby(obj/item/O as obj, mob/user as mob, params)
/obj/item/stack/light_w/attackby(obj/item/I, mob/user, params)
..()
if(istype(O,/obj/item/wirecutters))
var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
if(istype(I, /obj/item/wirecutters))
var/obj/item/stack/cable_coil/CC = new(user.loc)
CC.amount = 5
amount--
new/obj/item/stack/sheet/glass(user.loc)
if(amount <= 0)
user.unEquip(src, 1)
qdel(src)
use(1)
if(istype(O,/obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = O
M.amount--
if(M.amount <= 0)
user.unEquip(src, 1)
qdel(M)
amount--
new/obj/item/stack/tile/light(user.loc)
if(amount <= 0)
user.unEquip(src, 1)
qdel(src)
if(istype(I, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = I
M.use(1)
new /obj/item/stack/tile/light(user.loc)
use(1)
@@ -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), \
))
@@ -110,15 +110,13 @@ GLOBAL_LIST_INIT(metal_recipes, list(
point_value = 2
/obj/item/stack/sheet/metal/cyborg
energy_type = /datum/robot_energy_storage/metal
is_cyborg = TRUE
materials = list()
/obj/item/stack/sheet/metal/fifty
amount = 50
/obj/item/stack/sheet/metal/ratvar_act()
new /obj/item/stack/tile/brass(loc, amount)
qdel(src)
/obj/item/stack/sheet/metal/narsie_act()
new /obj/item/stack/sheet/runed_metal(loc, amount)
qdel(src)
@@ -162,6 +160,10 @@ GLOBAL_LIST_INIT(plasteel_recipes, list(
recipes = GLOB.plasteel_recipes
return ..()
/obj/item/stack/sheet/wood/cyborg
energy_type = /datum/robot_energy_storage/wood
is_cyborg = TRUE
/*
* Wood
*/
@@ -372,10 +374,6 @@ GLOBAL_LIST_INIT(cult_recipes, list ( \
. = ..()
icon_state = SSticker.cultdat?.runed_metal_icon_state
/obj/item/stack/sheet/runed_metal/ratvar_act()
new /obj/item/stack/tile/brass(loc, amount)
qdel(src)
/obj/item/stack/sheet/runed_metal/attack_self(mob/living/user)
if(!iscultist(user))
to_chat(user, "<span class='warning'>Only one with forbidden knowledge could hope to work this metal...</span>")
+52 -20
View File
@@ -10,7 +10,16 @@
*/
/obj/item/stack
origin_tech = "materials=1"
var/list/recipes = list() // /datum/stack_recipe
/// Whether this stack is a `/cyborg` subtype or not.
var/is_cyborg = FALSE
/// The energy storage datum that will be used with this stack. Used only with `/cyborg` type stacks.
var/datum/robot_energy_storage/source
/// Which `robot_energy_storage` to choose when this stack is created in cyborgs. Used only with `/cyborg` type stacks.
var/energy_type
/// How much energy using 1 sheet from the stack costs. Used only with `/cyborg` type stacks.
var/cost = 1
/// A list of recipes buildable with this stack.
var/list/recipes = list()
var/singular_name
var/amount = 1
var/to_transfer = 0
@@ -52,15 +61,27 @@
/obj/item/stack/examine(mob/user)
. = ..()
if(in_range(user, src))
if(!in_range(user, src))
return
if(is_cyborg)
if(singular_name)
. += "There are [amount] [singular_name]\s in the stack."
. += "There is enough energy for [get_amount()] [singular_name]\s."
else
. += "There are [amount] [name]\s in the stack."
. +="<span class='notice'>Alt-click to take a custom amount.</span>"
. += "There is enough energy for [get_amount()]."
return
if(singular_name)
. += "There are [amount] [singular_name]\s in the stack."
else
. += "There are [amount] [name]\s in the stack."
. +="<span class='notice'>Alt-click to take a custom amount.</span>"
/obj/item/stack/proc/add(newamount)
amount += newamount
if(is_cyborg)
source.add_charge(newamount * cost)
else
amount += newamount
update_icon()
/obj/item/stack/attack_self(mob/user)
@@ -87,8 +108,10 @@
if(!recipes)
return
if(amount <= 0)
if(get_amount() <= 0)
user << browse(null, "window=stack")
if(is_cyborg)
to_chat(user, "<span class='warning'>You don't have enough energy to dispense more [name]!</span>")
return
user.set_machine(src) //for correct work of onclose
@@ -98,7 +121,7 @@
var/datum/stack_recipe_list/srl = recipe_list[recipes_sublist]
recipe_list = srl.recipes
var/t1 = "Amount Left: [amount]<br>"
var/t1 = "Amount Left: [get_amount()]<br>"
for(var/i in 1 to recipe_list.len)
var/E = recipe_list[i]
if(isnull(E))
@@ -114,7 +137,7 @@
if(istype(E, /datum/stack_recipe))
var/datum/stack_recipe/R = E
var/max_multiplier = round(amount / R.req_amount)
var/max_multiplier = round(get_amount() / R.req_amount)
var/title
var/can_build = 1
can_build = can_build && (max_multiplier > 0)
@@ -154,7 +177,7 @@
list_recipes(usr, text2num(href_list["sublist"]))
if(href_list["make"])
if(amount < 1)
if(amount < 0 && !is_cyborg)
qdel(src) //Never should happen
var/list/recipes_list = recipes
@@ -167,15 +190,15 @@
if(!multiplier || multiplier <= 0 || multiplier > 50) // Href exploit checks
multiplier = 1
if(amount < R.req_amount * multiplier)
if(R.req_amount * multiplier>1)
if(get_amount() < R.req_amount * multiplier)
if(R.req_amount * multiplier > 1)
to_chat(usr, "<span class='warning'>You haven't got enough [src] to build \the [R.req_amount * multiplier] [R.title]\s!</span>")
else
to_chat(usr, "<span class='warning'>You haven't got enough [src] to build \the [R.title]!</span>")
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()))
@@ -195,7 +218,7 @@
if(!do_after(usr, R.time, target = usr))
return 0
if(amount < R.req_amount * multiplier)
if(get_amount() < R.req_amount * multiplier)
return
var/atom/O
@@ -205,6 +228,7 @@
O = new R.result_type(usr.drop_location())
O.setDir(usr.dir)
use(R.req_amount * multiplier)
updateUsrDialog()
R.post_build(src, O)
@@ -231,6 +255,8 @@
/obj/item/stack/use(used, check = TRUE)
if(check && zero_amount())
return FALSE
if(is_cyborg)
return source.use_charge(used * cost)
if(amount < used)
return FALSE
amount -= used
@@ -240,6 +266,8 @@
return TRUE
/obj/item/stack/proc/get_amount()
if(is_cyborg)
return round(source.energy / cost)
return amount
/obj/item/stack/proc/get_max_amount()
@@ -258,7 +286,7 @@
return F
/obj/item/stack/attack_hand(mob/user)
if(user.is_in_inactive_hand(src) && amount > 1)
if(user.is_in_inactive_hand(src) && get_amount() > 1)
change_stack(user, 1)
if(src && usr.machine == src)
spawn(0)
@@ -272,6 +300,8 @@
return
if(!in_range(src, user))
return
if(is_cyborg)
return
if(!ishuman(usr))
return
if(amount < 1)
@@ -305,11 +335,9 @@
// Returns TRUE if the stack amount is zero.
// Also qdels the stack gracefully if it is.
/obj/item/stack/proc/zero_amount()
if(is_cyborg)
return source.energy < cost
if(amount < 1)
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc
if(locate(src) in R.module.modules)
R.module.modules -= src
if(ismob(loc))
var/mob/living/L = loc // At this stage, stack code is so horrible and atrocious, I wouldn't be all surprised ghosts can somehow have stacks. If this happens, then the world deserves to burn.
L.unEquip(src, TRUE)
@@ -325,7 +353,10 @@
if(QDELETED(S) || QDELETED(src) || S == src) //amusingly this can cause a stack to consume itself, let's not allow that.
return FALSE
var/transfer = get_amount()
transfer = min(transfer, S.max_amount - S.amount)
if(S.is_cyborg)
transfer = min(transfer, round((S.source.max_energy - S.source.energy) / S.cost))
else
transfer = min(transfer, S.max_amount - S.amount)
if(transfer <= 0)
return
if(pulledby)
@@ -333,6 +364,7 @@
S.copy_evidences(src)
S.add(transfer)
use(transfer)
return transfer
/obj/item/stack/proc/copy_evidences(obj/item/stack/from)
blood_DNA = from.blood_DNA
@@ -61,8 +61,13 @@
icon_state = "tile-wood"
origin_tech = "biotech=1"
turf_type = /turf/simulated/floor/wood
merge_type = /obj/item/stack/tile/wood
resistance_flags = FLAMMABLE
/obj/item/stack/tile/wood/cyborg
energy_type = /datum/robot_energy_storage/wood_tile
is_cyborg = TRUE
//Carpets
/obj/item/stack/tile/carpet
name = "carpet"
@@ -101,13 +106,17 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70)
resistance_flags = FIRE_PROOF
/obj/item/stack/tile/plasteel/cyborg
energy_type = /datum/robot_energy_storage/metal_tile
is_cyborg = TRUE
//Light
/obj/item/stack/tile/light
name = "light tiles"
gender = PLURAL
singular_name = "light floor tile"
desc = "A floor tile, made out off glass. Use a multitool on it to change its color."
icon_state = "tile_light blue"
desc = "A floor tile made of glass, with an integrated light. Use a multitool on it to change its color."
icon_state = "tile_white"
force = 3
throwforce = 5
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
-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'
+14 -3
View File
@@ -24,7 +24,6 @@
toolspeed = 1
tool_behaviour = TOOL_MULTITOOL
hitsound = 'sound/weapons/tap.ogg'
var/shows_wire_information = FALSE // shows what a wire does if set to TRUE
var/obj/machinery/buffer // simple machine buffer for device linkage
/obj/item/multitool/proc/IsBufferA(typepath)
@@ -95,7 +94,10 @@
/obj/item/multitool/ai_detect/admin
desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'" //What else should I say for a meme item?
track_delay = 5
shows_wire_information = TRUE
/obj/item/multitool/ai_detect/admin/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SHOW_WIRE_INFO, ROUNDSTART_TRAIT)
/obj/item/multitool/ai_detect/admin/multitool_detect()
var/turf/our_turf = get_turf(src)
@@ -112,6 +114,12 @@
desc = "Optimised and stripped-down version of a regular multitool."
toolspeed = 0.5
/obj/item/multitool/cyborg/drone
/obj/item/multitool/cyborg/drone/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SHOW_WIRE_INFO, ROUNDSTART_TRAIT) // Drones are linked to the station
/obj/item/multitool/abductor
name = "alien multitool"
desc = "An omni-technological interface."
@@ -119,4 +127,7 @@
icon_state = "multitool"
toolspeed = 0.1
origin_tech = "magnets=5;engineering=5;abductor=3"
shows_wire_information = TRUE
/obj/item/multitool/abductor/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SHOW_WIRE_INFO, ROUNDSTART_TRAIT)
@@ -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
+5 -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
@@ -131,7 +131,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)
@@ -177,6 +177,9 @@
update_torch()
..()
/obj/item/weldingtool/cyborg_recharge(coeff, emagged)
if(reagents.check_and_add("fuel", maximum_fuel, 2 * coeff))
update_icon()
/obj/item/weldingtool/largetank
name = "industrial welding tool"
@@ -62,11 +62,21 @@
origin_tech = "materials=5;engineering=4;abductor=3"
random_color = FALSE
/obj/item/wirecutters/abductor/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SHOW_WIRE_INFO, ROUNDSTART_TRAIT)
/obj/item/wirecutters/cyborg
name = "wirecutters"
desc = "This cuts wires."
toolspeed = 0.5
/obj/item/wirecutters/cyborg/drone
/obj/item/wirecutters/cyborg/drone/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SHOW_WIRE_INFO, ROUNDSTART_TRAIT) // Drones are linked to the station
/obj/item/wirecutters/power
name = "jaws of life"
desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a cutting head."
+10 -10
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)
@@ -970,7 +970,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 ..()
@@ -1253,7 +1253,7 @@
/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>")
to_chat(user, "<span class='notice'>You pull the string on [src].</span>")
playsound(user, 'sound/creatures/hoot.ogg', 25, 1)
visible_message("<span class='danger'>[bicon(src)] [message]</span>")
cooldown = 1
@@ -1272,7 +1272,7 @@
/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>")
to_chat(user, "<span class='notice'>You pull the string on [src].</span>")
playsound(user, 'sound/creatures/caw.ogg', 25, 1)
visible_message("<span class='danger'>[bicon(src)] [message]</span>")
cooldown = 1
@@ -1580,7 +1580,7 @@
/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>")
user.visible_message("<span class='notice'>[bicon(src)] [src] says \"[toysay]\".</span>")
playsound(user, 'sound/machines/click.ogg', 20, 1)
/obj/item/toy/figure/cmo
@@ -1804,7 +1804,7 @@
//////////////////////////////////////////////////////
/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 +1816,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"
+2 -2
View File
@@ -52,12 +52,12 @@
icon_state = "waffles"
/obj/item/trash/plate
name = "Plate"
name = "plate"
icon_state = "plate"
resistance_flags = NONE
/obj/item/trash/snack_bowl
name = "Snack bowl"
name = "snack bowl"
icon_state = "snack_bowl"
/obj/item/trash/fried_vox
+2
View File
@@ -428,6 +428,8 @@
if(iswallturf(A))
if(istype(A, /turf/simulated/wall/r_wall) && !canRwall)
return FALSE
if(istype(A, /turf/simulated/wall/indestructible))
return FALSE
if(checkResource(5, user))
to_chat(user, "Deconstructing Wall...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
+2 -2
View File
@@ -29,13 +29,13 @@
return
else
if(loaded.amount < max_amount)
var/amount = min(loaded.amount + C.amount, max_amount)
var/amount = min(loaded.amount + C.get_amount(), max_amount)
C.use(amount - loaded.amount)
loaded.amount = amount
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
..()
@@ -29,6 +29,7 @@
desc = "squirts smokey liquids."
icon = 'icons/mob/alien.dmi'
icon_state = "borg-spray-smoke"
list_reagents = list("water" = 50)
/obj/item/reagent_containers/spray/alien/smoke/afterattack(atom/A as mob|obj, mob/user as mob)
if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1)
@@ -45,17 +46,29 @@
smoke.start()
playsound(user.loc, 'sound/effects/bamf.ogg', 50, 2)
/obj/item/reagent_containers/spray/alien/smoke/cyborg_recharge(coeff, emagged)
reagents.check_and_add("water", volume, 2 * coeff)
/obj/item/reagent_containers/spray/alien/acid
name = "acid synthesizer"
desc = "squirts burny liquids."
icon = 'icons/mob/alien.dmi'
icon_state = "borg-spray-acid"
list_reagents = list("facid" = 125, "sacid" = 125)
/obj/item/reagent_containers/spray/alien/acid/cyborg_recharge(coeff, emagged)
reagents.check_and_add("facid", volume / 2, 2 * coeff) // Volume / 2 here becuase there should be an even amount of both chems.
reagents.check_and_add("sacid", volume / 2, 2 * coeff)
/obj/item/reagent_containers/spray/alien/stun
name = "paralytic toxin synthesizer"
desc = "squirts viagra."
icon = 'icons/mob/alien.dmi'
icon_state = "borg-spray-stun"
list_reagents = list("ether" = 250)
/obj/item/reagent_containers/spray/alien/stun/cyborg_recharge(coeff, emagged)
reagents.check_and_add("ether", volume, 2 * coeff)
//SKREEEEEEEEEEEE tool
+1 -1
View File
@@ -363,7 +363,7 @@
/obj/item/card/id/syndicate/attack_self(mob/user as mob)
if(!src.registered_name)
var/t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name))
var/t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name), TRUE)
if(!t)
to_chat(user, "<span class='warning'>Invalid name.</span>")
return
+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)
+3 -3
View File
@@ -56,7 +56,7 @@ 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 ..()
@@ -68,12 +68,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
+9 -6
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
@@ -406,7 +406,7 @@
if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("<span class='notice'>[user] places [src] on [M.name]'s chest.</span>", "<span class='warning'>You place [src] on [M.name]'s chest.</span>")
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
var/mob/dead/observer/ghost = H.get_ghost()
var/mob/dead/observer/ghost = H.get_ghost(TRUE)
if(ghost && !ghost.client)
// In case the ghost's not getting deleted for some reason
H.key = ghost.key
@@ -489,10 +489,13 @@
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(ghost)
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
if(!ghost.can_reenter_corpse) // DNR or AntagHUD
user.visible_message("<span class='notice'>[defib] buzzes: Resucitation failed: No electrical brain activity detected.</span>")
else
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed.</span>")
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
@@ -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)
@@ -180,3 +180,6 @@
sleep(2)
else
return ..()
/obj/item/extinguisher/cyborg_recharge(coeff, emagged)
reagents.check_and_add("water", max_water, 5 * coeff)
@@ -68,7 +68,15 @@
. = ..()
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
@@ -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."
@@ -471,7 +480,7 @@
if(target.mind)
if(iscultist(target))
SSticker.mode.remove_cultist(target.mind) // This proc will handle message generation.
SSticker.mode.remove_cultist(target.mind, TRUE, TRUE) // This proc will handle message generation.
praying = FALSE
return
@@ -3,6 +3,7 @@
desc = "And boom goes the weasel."
icon_state = "explosive"
origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
actions_types = list(/datum/action/item_action/hands_free/activate/always)
var/weak = 2
var/medium = 0.8
var/heavy = 0.4
@@ -135,6 +136,7 @@
desc = "An alarm which monitors host vital signs, transmitting a radio message and dusting the corpse on death."
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
actions_types = list(/datum/action/item_action/hands_free/activate/always)
/obj/item/implant/dust/get_data()
var/dat = {"<b>Implant Specifications:</b><BR>
@@ -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)
..()
+2 -2
View File
@@ -82,9 +82,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
..()
@@ -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
@@ -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
@@ -97,7 +97,7 @@
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>")
to_chat(user, "<span class='warning'>You easily splat [target].</span>")
if(istype(target, /mob/living/))
var/mob/living/bug = target
bug.death(1)
+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
@@ -314,7 +314,7 @@
//Therefore, make a new stack internally that has the remainder.
// -Sayu
if(S.amount > S.max_amount)
if(S.get_amount() > S.max_amount)
var/obj/item/stack/sheet/temp = new S.type(src)
temp.amount = S.amount - S.max_amount
S.amount = S.max_amount
@@ -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)
@@ -366,6 +368,22 @@
item_state = "assault"
storage_slots = 6
/obj/item/storage/belt/military/assault/marines/full/populate_contents()
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m45(src)
new /obj/item/ammo_box/magazine/m45(src)
update_icon()
/obj/item/storage/belt/military/assault/marines/elite/full/populate_contents()
new /obj/item/ammo_box/magazine/m556/arg(src)
new /obj/item/ammo_box/magazine/m556/arg(src)
new /obj/item/ammo_box/magazine/m556/arg(src)
new /obj/item/ammo_box/magazine/m45(src)
new /obj/item/ammo_box/magazine/m45(src)
update_icon()
/obj/item/storage/belt/janitor
name = "janibelt"
desc = "A belt used to hold most janitorial supplies."
@@ -431,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
@@ -121,19 +121,21 @@
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonbox"
w_class = WEIGHT_CLASS_SMALL
storage_slots = 6
storage_slots = 8
icon_type = "crayon"
can_hold = list(
/obj/item/toy/crayon
)
/obj/item/storage/fancy/crayons/populate_contents()
new /obj/item/toy/crayon/white(src)
new /obj/item/toy/crayon/red(src)
new /obj/item/toy/crayon/orange(src)
new /obj/item/toy/crayon/yellow(src)
new /obj/item/toy/crayon/green(src)
new /obj/item/toy/crayon/blue(src)
new /obj/item/toy/crayon/purple(src)
new /obj/item/toy/crayon/black(src)
update_icon()
/obj/item/storage/fancy/crayons/update_icon()
@@ -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
+24 -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>")
@@ -76,6 +90,10 @@
if(!cell)
return
cell.use(amount)
if(cell.rigged)
cell = null
turned_on = FALSE
update_icon()
if(cell.charge < (hitcost)) // If after the deduction the baton doesn't have enough charge for a stun hit it turns off.
turned_on = FALSE
update_icon()
@@ -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)
+13 -11
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))
@@ -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)))
@@ -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)
+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)
@@ -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)
@@ -22,6 +22,7 @@
new /obj/item/storage/backpack/cultpack(src)
new /obj/item/clothing/head/helmet/riot/knight/templar(src)
new /obj/item/clothing/suit/armor/riot/knight/templar(src)
new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/soulstone/anybody/purified/chaplain(src)
new /obj/item/storage/fancy/candle_box/eternal(src)
new /obj/item/storage/fancy/candle_box/eternal(src)
@@ -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,7 +69,8 @@
togglelock(user)
/obj/structure/closet/secure_closet/AltClick(mob/user)
..()
if(opened)
return ..()
if(Adjacent(user))
togglelock(user)
@@ -79,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)
@@ -126,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)
@@ -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)
+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)
+10 -1
View File
@@ -35,10 +35,19 @@
QDEL_NULL(showpiece)
return ..()
/obj/structure/displaycase/emag_act(mob/user)
if(!emagged)
to_chat(user, "<span class='warning'>You override the ID lock on [src].</span>")
trigger_alarm()
emagged = TRUE
/obj/structure/displaycase/examine(mob/user)
. = ..()
if(alert)
. += "<span class='notice'>Hooked up with an anti-theft system.</span>"
if(emagged)
. += "<span class='warning'>The ID lock has been shorted out.</span>"
if(showpiece)
. += "<span class='notice'>There's [showpiece] inside.</span>"
if(trophy_message)
@@ -100,7 +109,7 @@
/obj/structure/displaycase/attackby(obj/item/I, mob/user, params)
if(I.GetID() && !broken && openable)
if(allowed(user))
if(allowed(user) || emagged)
to_chat(user, "<span class='notice'>You [open ? "close":"open"] [src].</span>")
toggle_lock(user)
else
@@ -226,7 +226,7 @@
return
if(mineral)
var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]")
visible_message("<span class='notice'>[user] welds the [mineral] plating off [src].</span>",\
user.visible_message("<span class='notice'>[user] welds the [mineral] plating off [src].</span>",\
"<span class='notice'>You start to weld the [mineral] plating off [src]...</span>",\
"<span class='warning'>You hear welding.</span>")
if(!I.use_tool(src, user, 40, volume = I.tool_volume))
@@ -236,7 +236,7 @@
var/obj/structure/door_assembly/PA = new previous_assembly(loc)
transfer_assembly_vars(src, PA)
else if(glass)
visible_message("<span class='notice'>[user] welds the glass panel out of [src].</span>",\
user.visible_message("<span class='notice'>[user] welds the glass panel out of [src].</span>",\
"<span class='notice'>You start to weld the glass panel out of the [src]...</span>",\
"<span class='warning'>You hear welding.</span>")
if(!I.use_tool(src, user, 40, volume = I.tool_volume))
@@ -51,10 +51,6 @@
if(0 to 40)
return "<span class='danger'>It looks heavily damaged.</span>"
/obj/structure/falsewall/ratvar_act()
new /obj/structure/falsewall/brass(loc)
qdel(src)
/obj/structure/falsewall/Destroy()
density = 0
air_update_turf(1)
+7 -16
View File
@@ -55,13 +55,6 @@
if(!anchored)
. += "<span class='notice'>The anchoring screws are <i>unscrewed</i>. The rods look like they could be <b>cut</b> through.</span>"
/obj/structure/grille/ratvar_act()
if(broken)
new /obj/structure/grille/ratvar/broken(loc)
else
new /obj/structure/grille/ratvar(loc)
qdel(src)
/obj/structure/grille/Bumped(atom/user)
if(ismob(user))
if(!(shockcooldown <= world.time))
@@ -133,11 +126,12 @@
return ..()
/obj/structure/grille/proc/repair(mob/user, obj/item/stack/rods/R)
user.visible_message("<span class='notice'>[user] rebuilds the broken grille.</span>",
"<span class='notice'>You rebuild the broken grille.</span>")
new grille_type(loc)
R.use(1)
qdel(src)
if(R.get_amount() >= 1)
user.visible_message("<span class='notice'>[user] rebuilds the broken grille.</span>",
"<span class='notice'>You rebuild the broken grille.</span>")
new grille_type(loc)
R.use(1)
qdel(src)
/obj/structure/grille/wirecutter_act(mob/user, obj/item/I)
. = TRUE
@@ -190,7 +184,7 @@
W.update_nearby_icons()
W.state = WINDOW_OUT_OF_FRAME
S.use(2)
to_chat(user, "<span class='notice'>You place the [W] on [src].</span>")
to_chat(user, "<span class='notice'>You place [W] on [src].</span>")
/obj/structure/grille/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
@@ -289,9 +283,6 @@
color = "#960000"
animate(src, color = previouscolor, time = 8)
/obj/structure/grille/ratvar/ratvar_act()
return
/obj/structure/grille/ratvar/broken
icon_state = "brokenratvargrille"
density = FALSE
+1 -1
View File
@@ -216,7 +216,7 @@
/obj/structure/guillotine/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
if(!anchored)
to_chat(usr, "<span class='warning'>The [src] needs to be wrenched to the floor!</span>")
to_chat(usr, "<span class='warning'>[src] needs to be wrenched to the floor!</span>")
return FALSE
if(!ishuman(M))

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