mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-20 10:37:17 +01:00
Merge remote-tracking branch 'upstream/master' into just-defibrillator-things
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]°C ([H.bodytemperature*1.8-459.67]°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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user