Merge branch 'master' into familyport
This commit is contained in:
@@ -69,7 +69,7 @@
|
||||
/obj/effect/anomaly/proc/detonate()
|
||||
return
|
||||
|
||||
/obj/effect/anomaly/ex_act(severity, target)
|
||||
/obj/effect/anomaly/ex_act(severity, target, origin)
|
||||
if(severity == 1)
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/countdown/ex_act(severity, target) //immune to explosions
|
||||
/obj/effect/countdown/ex_act(severity, target, origin) //immune to explosions
|
||||
return
|
||||
|
||||
/obj/effect/countdown/syndicatebomb
|
||||
|
||||
@@ -77,10 +77,10 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/effect/decal/cleanable/ex_act()
|
||||
/obj/effect/decal/cleanable/ex_act(severity, target, origin)
|
||||
if(reagents)
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
R.on_ex_act()
|
||||
R.on_ex_act(severity)
|
||||
..()
|
||||
|
||||
/obj/effect/decal/cleanable/fire_act(exposed_temperature, exposed_volume)
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
var/gibs_reagent_id = /datum/reagent/liquidgibs
|
||||
var/gibs_bloodtype = "A+"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases)
|
||||
/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases, list/blood_data)
|
||||
. = ..()
|
||||
if(random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0)
|
||||
icon_state = pick(random_icon_states)
|
||||
if(gibs_reagent_id)
|
||||
reagents.add_reagent(gibs_reagent_id, 5)
|
||||
reagents.add_reagent(gibs_reagent_id, 5, blood_data)
|
||||
if(gibs_bloodtype)
|
||||
add_blood_DNA(list("Non-human DNA" = gibs_bloodtype), diseases)
|
||||
update_icon()
|
||||
@@ -36,7 +36,7 @@
|
||||
. = ..()
|
||||
return /obj/effect/decal/cleanable/blood/gibs/old
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target)
|
||||
/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target, origin)
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/Crossed(mob/living/L)
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
. = ..()
|
||||
setDir(pick(GLOB.cardinals))
|
||||
|
||||
/obj/effect/decal/cleanable/glass/ex_act()
|
||||
/obj/effect/decal/cleanable/glass/ex_act(severity, target, origin)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/cleanable/glass/wave_ex_act(power, datum/wave_explosion/explosion, dir)
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
if (!step_to(src, get_step(src, direction), 0))
|
||||
break
|
||||
|
||||
/obj/effect/decal/cleanable/robot_debris/ex_act()
|
||||
/obj/effect/decal/cleanable/robot_debris/ex_act(severity, target, origin)
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/robot_debris/limb
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
/obj/effect/decal/proc/NeverShouldHaveComeHere(turf/T)
|
||||
return isclosedturf(T) || isgroundlessturf(T)
|
||||
|
||||
/obj/effect/decal/ex_act(severity, target)
|
||||
/obj/effect/decal/ex_act(severity, target, origin)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/fire_act(exposed_temperature, exposed_volume)
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
/obj/effect/experience_pressure_difference()
|
||||
return
|
||||
|
||||
/obj/effect/ex_act(severity, target)
|
||||
/obj/effect/ex_act(severity, target, origin)
|
||||
if(target == src)
|
||||
qdel(src)
|
||||
else
|
||||
@@ -51,7 +51,7 @@
|
||||
/obj/effect/ConveyorMove()
|
||||
return
|
||||
|
||||
/obj/effect/abstract/ex_act(severity, target)
|
||||
/obj/effect/abstract/ex_act(severity, target, origin)
|
||||
return
|
||||
|
||||
/obj/effect/abstract/singularity_pull()
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
return
|
||||
|
||||
// Please stop bombing the Observer-Start landmark.
|
||||
/obj/effect/landmark/ex_act()
|
||||
/obj/effect/landmark/ex_act(severity, target, origin)
|
||||
return
|
||||
|
||||
/obj/effect/landmark/singularity_pull()
|
||||
|
||||
@@ -31,7 +31,10 @@
|
||||
|
||||
var/list/dna_to_add //find the dna to pass to the spawned gibs. do note this can be null if the mob doesn't have blood. add_blood_DNA() has built in null handling.
|
||||
var/body_coloring = ""
|
||||
|
||||
var/list/blood_data_to_add
|
||||
if(source_mob)
|
||||
blood_data_to_add = source_mob.get_blood_data()
|
||||
if(!issilicon(source_mob))
|
||||
dna_to_add = blood_dna || source_mob.get_blood_dna_list() //ez pz
|
||||
if(ishuman(source_mob))
|
||||
@@ -65,7 +68,7 @@
|
||||
if(gibamounts[i])
|
||||
for(var/j = 1, j<= gibamounts[i], j++)
|
||||
var/gibType = gibtypes[i]
|
||||
gib = new gibType(loc, diseases)
|
||||
gib = new gibType(loc, diseases, blood_data_to_add)
|
||||
if(iscarbon(loc))
|
||||
var/mob/living/carbon/digester = loc
|
||||
digester.stomach_contents += gib
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
duration = 5
|
||||
randomdir = FALSE
|
||||
layer = BELOW_MOB_LAYER
|
||||
color = BLOOD_COLOR_HUMAN // set it to red by default because the actual icons are white
|
||||
var/splatter_type = "splatter"
|
||||
|
||||
/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir, new_color)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
/obj/effect/temp_visual/singularity_pull()
|
||||
return
|
||||
|
||||
/obj/effect/temp_visual/ex_act()
|
||||
/obj/effect/temp_visual/ex_act(severity, target, origin)
|
||||
return
|
||||
|
||||
/obj/effect/temp_visual/dir_setting
|
||||
|
||||
+95
-43
@@ -46,11 +46,23 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
max_integrity = 200
|
||||
|
||||
obj_flags = NONE
|
||||
///Item flags for the item
|
||||
var/item_flags = NONE
|
||||
|
||||
var/hitsound = null
|
||||
var/usesound = null
|
||||
var/throwhitsound = null
|
||||
///Sound played when you hit something with the item
|
||||
var/hitsound
|
||||
///Played when the item is used, for example tools
|
||||
var/usesound
|
||||
///Used when yate into a mob
|
||||
var/mob_throw_hit_sound
|
||||
///Sound used when equipping the item into a valid slot
|
||||
var/equip_sound
|
||||
///Sound uses when picking the item up (into your hands)
|
||||
var/pickup_sound
|
||||
///Sound uses when dropping the item, or when its thrown.
|
||||
var/drop_sound
|
||||
///Whether or not we use stealthy audio levels for this item's attack sounds
|
||||
var/stealthy_audio = FALSE
|
||||
|
||||
/// Weight class for how much storage capacity it uses and how big it physically is meaning storages can't hold it if their maximum weight class isn't as high as it.
|
||||
var/w_class = WEIGHT_CLASS_NORMAL
|
||||
@@ -129,7 +141,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
var/datum/dog_fashion/dog_fashion = null
|
||||
|
||||
//Tooltip vars
|
||||
var/force_string //string form of an item's force. Edit this var only to set a custom force string
|
||||
///string form of an item's force. Edit this var only to set a custom force string
|
||||
var/force_string
|
||||
var/last_force_string_check = 0
|
||||
|
||||
var/trigger_guard = TRIGGER_GUARD_NONE
|
||||
@@ -331,6 +344,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
return ..()
|
||||
|
||||
/obj/item/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(!user)
|
||||
return
|
||||
if(anchored)
|
||||
@@ -340,6 +356,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
to_chat(user, "<span class='warning'>You are unable to unequip that while wearing other garments over it!</span>")
|
||||
return FALSE
|
||||
|
||||
. = TRUE
|
||||
|
||||
if(resistance_flags & ON_FIRE)
|
||||
var/mob/living/carbon/C = user
|
||||
var/can_handle_hot = FALSE
|
||||
@@ -374,6 +392,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
|
||||
//If the item is in a storage item, take it out
|
||||
SEND_SIGNAL(loc, COMSIG_TRY_STORAGE_TAKE, src, user.loc, TRUE)
|
||||
if(QDELETED(src)) //moving it out of the storage to the floor destroyed it.
|
||||
return
|
||||
|
||||
if(throwing)
|
||||
throwing.finalize(FALSE)
|
||||
@@ -381,11 +401,12 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src))
|
||||
return
|
||||
|
||||
remove_outline()
|
||||
. = FALSE
|
||||
pickup(user)
|
||||
add_fingerprint(user)
|
||||
if(!user.put_in_active_hand(src, FALSE, FALSE))
|
||||
user.dropItemToGround(src)
|
||||
return TRUE
|
||||
|
||||
/obj/item/proc/allow_attack_hand_drop(mob/user)
|
||||
return TRUE
|
||||
@@ -453,9 +474,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
item_flags &= ~(IN_INVENTORY)
|
||||
item_flags &= ~(IN_STORAGE)
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user)
|
||||
remove_outline()
|
||||
// if(!silent)
|
||||
// playsound(src, drop_sound, DROP_SOUND_VOLUME, ignore_walls = FALSE)
|
||||
if(!silent)
|
||||
playsound(src, drop_sound, DROP_SOUND_VOLUME, ignore_walls = FALSE)
|
||||
user?.update_equipment_speed_mods()
|
||||
|
||||
// called just as an item is picked up (loc is not yet changed)
|
||||
@@ -702,8 +722,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
if(isliving(hit_atom)) //Living mobs handle hit sounds differently.
|
||||
var/volume = get_volume_by_throwforce_and_or_w_class()
|
||||
if (throwforce > 0)
|
||||
if (throwhitsound)
|
||||
playsound(hit_atom, throwhitsound, volume, TRUE, -1)
|
||||
if (mob_throw_hit_sound)
|
||||
playsound(hit_atom, mob_throw_hit_sound, volume, TRUE, -1)
|
||||
else if(hitsound)
|
||||
playsound(hit_atom, hitsound, volume, TRUE, -1)
|
||||
else
|
||||
@@ -711,8 +731,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
else
|
||||
playsound(hit_atom, 'sound/weapons/throwtap.ogg', 1, volume, -1)
|
||||
|
||||
// else
|
||||
// playsound(src, drop_sound, YEET_SOUND_VOLUME, ignore_walls = FALSE)
|
||||
else if (drop_sound)
|
||||
playsound(src, drop_sound, YEET_SOUND_VOLUME, ignore_walls = FALSE)
|
||||
return hit_atom.hitby(src, 0, itempush, throwingdatum=throwingdatum)
|
||||
|
||||
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE)
|
||||
@@ -886,47 +906,55 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
openToolTip(user,src,params,title = name,content = "[desc]<br><b>Force:</b> [force_string]",theme = "")
|
||||
|
||||
/obj/item/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_ENTER, location, control, params)
|
||||
if((item_flags & IN_INVENTORY || item_flags & IN_STORAGE) && usr?.client.prefs.enable_tips && !QDELETED(src))
|
||||
var/timedelay = max(usr.client.prefs.tip_delay * 0.01, 0.01) // I heard multiplying is faster, also runtimes from very low/negative numbers
|
||||
usr.client.tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, usr), timedelay, TIMER_STOPPABLE)//timer takes delay in deciseconds, but the pref is in milliseconds. dividing by 100 converts it.
|
||||
var/mob/living/L = usr
|
||||
if(istype(L) && (L.incapacitated() || (current_equipped_slot in L.check_obscured_slots()) || !L.canUnEquip(src)))
|
||||
apply_outline(_size = 3)
|
||||
else
|
||||
apply_outline()
|
||||
if(get(src, /mob) == usr && !QDELETED(src))
|
||||
var/mob/living/L = usr
|
||||
if(usr.client.prefs.enable_tips)
|
||||
var/timedelay = usr.client.prefs.tip_delay/100
|
||||
usr.client.tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, usr), timedelay, TIMER_STOPPABLE)//timer takes delay in deciseconds, but the pref is in milliseconds. dividing by 100 converts it.
|
||||
if(usr.client.prefs.outline_enabled)
|
||||
if(istype(L) && L.incapacitated())
|
||||
apply_outline(COLOR_RED_GRAY) //if they're dead or handcuffed, let's show the outline as red to indicate that they can't interact with that right now
|
||||
else
|
||||
apply_outline(usr.client.prefs.outline_color) //if the player's alive and well we send the command with no color set, so it uses the theme's color
|
||||
|
||||
/obj/item/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params)
|
||||
. = ..()
|
||||
remove_outline()
|
||||
remove_filter("hover_outline") //get rid of the hover effect in case the mouse exit isn't called if someone drags and drops an item and somthing goes wrong
|
||||
|
||||
/obj/item/MouseExited(location,control,params)
|
||||
/obj/item/MouseExited(location, control, params)
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_MOUSE_EXIT, location, control, params)
|
||||
deltimer(usr.client.tip_timer) //delete any in-progress timer if the mouse is moved off the item before it finishes
|
||||
closeToolTip(usr)
|
||||
remove_outline()
|
||||
remove_filter("hover_outline")
|
||||
|
||||
/obj/item/proc/apply_outline(colour = null, _size=1)
|
||||
if(!(item_flags & IN_INVENTORY || item_flags & IN_STORAGE) || QDELETED(src) || isobserver(usr))
|
||||
/obj/item/proc/apply_outline(outline_color = null)
|
||||
if(get(src, /mob) != usr || QDELETED(src) || isobserver(usr)) //cancel if the item isn't in an inventory, is being deleted, or if the person hovering is a ghost (so that people spectating you don't randomly make your items glow)
|
||||
return
|
||||
if(usr.client)
|
||||
if(!usr.client.prefs.outline_enabled)
|
||||
return
|
||||
if(!colour)
|
||||
if(usr.client)
|
||||
colour = usr.client.prefs.outline_color
|
||||
if(!colour)
|
||||
colour = COLOR_BLUE_GRAY
|
||||
else
|
||||
colour = COLOR_BLUE_GRAY
|
||||
if(outline_filter)
|
||||
filters -= outline_filter
|
||||
outline_filter = filter(type="outline", size=_size, color=colour)
|
||||
filters += outline_filter
|
||||
var/theme = lowertext(usr.client.prefs.UI_style)
|
||||
if(!outline_color) //if we weren't provided with a color, take the theme's color
|
||||
switch(theme) //yeah it kinda has to be this way
|
||||
if("midnight")
|
||||
outline_color = COLOR_THEME_MIDNIGHT
|
||||
if("plasmafire")
|
||||
outline_color = COLOR_THEME_PLASMAFIRE
|
||||
if("retro")
|
||||
outline_color = COLOR_THEME_RETRO //just as garish as the rest of this theme
|
||||
if("slimecore")
|
||||
outline_color = COLOR_THEME_SLIMECORE
|
||||
if("operative")
|
||||
outline_color = COLOR_THEME_OPERATIVE
|
||||
if("clockwork")
|
||||
outline_color = COLOR_THEME_CLOCKWORK //if you want free gbp go fix the fact that clockwork's tooltip css is glass'
|
||||
if("glass")
|
||||
outline_color = COLOR_THEME_GLASS
|
||||
else //this should never happen, hopefully
|
||||
outline_color = COLOR_WHITE
|
||||
if(color)
|
||||
outline_color = COLOR_WHITE //if the item is recolored then the outline will be too, let's make the outline white so it becomes the same color instead of some ugly mix of the theme and the tint
|
||||
|
||||
/obj/item/proc/remove_outline()
|
||||
if(outline_filter)
|
||||
filters -= outline_filter
|
||||
outline_filter = null
|
||||
add_filter("hover_outline", 1, list("type" = "outline", "size" = 1, "color" = outline_color))
|
||||
|
||||
// Called when a mob tries to use the item as a tool.
|
||||
// Handles most checks.
|
||||
@@ -1063,6 +1091,19 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
. = ..()
|
||||
if(var_name == NAMEOF(src, slowdown))
|
||||
set_slowdown(var_value) //don't care if it's a duplicate edit as slowdown'll be set, do it anyways to force normal behavior.
|
||||
|
||||
/obj/item/proc/canStrip(mob/stripper, mob/owner)
|
||||
SHOULD_BE_PURE(TRUE)
|
||||
return !HAS_TRAIT(src, TRAIT_NODROP) && !(item_flags & ABSTRACT)
|
||||
|
||||
/obj/item/proc/doStrip(mob/stripper, mob/owner)
|
||||
if(owner.dropItemToGround(src))
|
||||
if(stripper.can_hold_items())
|
||||
stripper.put_in_hands(src)
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/**
|
||||
* Does the current embedding var meet the criteria for being harmless? Namely, does it explicitly define the pain multiplier and jostle pain mult to be 0? If so, return true.
|
||||
*
|
||||
@@ -1221,3 +1262,14 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
/obj/item/proc/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)
|
||||
if(SEND_SIGNAL(src, COMSIG_ITEM_OFFER_TAKEN, offerer, taker) & COMPONENT_OFFER_INTERRUPT)
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Updates all action buttons associated with this item
|
||||
*
|
||||
* Arguments:
|
||||
* * status_only - Update only current availability status of the buttons to show if they are ready or not to use
|
||||
* * force - Force buttons update even if the given button icon state has not changed
|
||||
*/
|
||||
/obj/item/proc/update_action_buttons(status_only = FALSE, force = FALSE)
|
||||
for(var/datum/action/current_action as anything in actions)
|
||||
current_action.UpdateButtonIcon(status_only, force)
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
/obj/item/wallframe/apc/try_build(turf/on_wall, user)
|
||||
if(!..())
|
||||
return
|
||||
var/turf/T = get_turf(on_wall) //the user is not where it needs to be.
|
||||
var/turf/T = get_turf(user)
|
||||
var/area/A = get_area(T)
|
||||
if(A.get_apc())
|
||||
to_chat(user, "<span class='warning'>This area already has an APC!</span>")
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
var/response_timer_id = null
|
||||
var/approval_time = 600
|
||||
var/allow_unicode = FALSE
|
||||
var/admin_approved = FALSE
|
||||
|
||||
var/static/regex/standard_station_regex
|
||||
|
||||
@@ -62,8 +63,32 @@
|
||||
|
||||
to_chat(user, "Your name has been sent to your employers for approval.")
|
||||
// Autoapproves after a certain time
|
||||
response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE)
|
||||
to_chat(GLOB.admins, "<span class='adminnotice'><b><font color=orange>CUSTOM STATION RENAME:</font></b>[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [html_encode(new_name)] (will autoapprove in [DisplayTimeText(approval_time)]). [ADMIN_SMITE(user)] (<A HREF='?_src_=holder;[HrefToken(TRUE)];reject_custom_name=[REF(src)]'>REJECT</A>) [ADMIN_CENTCOM_REPLY(user)]</span>")
|
||||
var/requires_approval = CONFIG_GET(flag/station_name_needs_approval)
|
||||
response_timer_id = addtimer(CALLBACK(src, .proc/check_state, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE)
|
||||
to_chat(GLOB.admins, "<span class='adminnotice'><b><font color=orange>CUSTOM STATION RENAME:</font></b>[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [html_encode(new_name)] ([requires_approval ? "REQUIRES ADMIN APPROVAL and will autodeny" : "will autoapprove"] in [DisplayTimeText(approval_time)]). [ADMIN_SMITE(user)] (<A HREF='?_src_=holder;[HrefToken(TRUE)];reject_custom_name=[REF(src)]'>REJECT</A>)[requires_approval ? " (<A HREF='?_src_=holder;[HrefToken(TRUE)];approve_custom_name=[REF(src)]'>APPROVE</A>)" : ""] [ADMIN_CENTCOM_REPLY(user)]</span>")
|
||||
|
||||
/obj/item/station_charter/proc/check_state(designation, uname, ureal_name, ukey)
|
||||
var/requires_approval = CONFIG_GET(flag/station_name_needs_approval)
|
||||
if(requires_approval && !admin_approved)
|
||||
var/turf/T = get_turf(src)
|
||||
T.visible_message("<span class='warning'>A note appears on [src], stating this sector requires central command approval for its station names, which was not performed in time for this request. Looks like the change has been auto-rejected.</span>")
|
||||
var/m = "Station rename has been autorejected due to config requiring admin approval."
|
||||
message_admins(m)
|
||||
log_admin(m)
|
||||
else
|
||||
rename_station(designation, uname, ureal_name, ukey)
|
||||
response_timer_id = null
|
||||
admin_approved = FALSE
|
||||
|
||||
/obj/item/station_charter/proc/allow_pass(user)
|
||||
if(!user)
|
||||
return
|
||||
if(!response_timer_id)
|
||||
return
|
||||
admin_approved = TRUE
|
||||
var/m = "[key_name(user)] has approved the proposed station name. It can still be denied prior to the timer expiring."
|
||||
message_admins(m)
|
||||
log_admin(m)
|
||||
|
||||
/obj/item/station_charter/proc/reject_proposed(user)
|
||||
if(!user)
|
||||
@@ -80,6 +105,7 @@
|
||||
|
||||
deltimer(response_timer_id)
|
||||
response_timer_id = null
|
||||
admin_approved = FALSE
|
||||
|
||||
/obj/item/station_charter/proc/rename_station(designation, uname, ureal_name, ukey)
|
||||
set_station_name(designation)
|
||||
|
||||
@@ -266,7 +266,7 @@
|
||||
/obj/effect/chrono_field/singularity_pull()
|
||||
return
|
||||
|
||||
/obj/effect/chrono_field/ex_act()
|
||||
/obj/effect/chrono_field/ex_act(severity, target, origin)
|
||||
return
|
||||
|
||||
/obj/effect/chrono_field/blob_act(obj/structure/blob/B)
|
||||
|
||||
@@ -759,6 +759,8 @@
|
||||
|
||||
if(isobj(target) && !istype(target, /obj/effect/decal/cleanable/crayon/gang))
|
||||
if(actually_paints)
|
||||
if(istype(target, /obj/item/canvas)) //dont color our canvas neon green when im trying to paint please
|
||||
return
|
||||
var/list/hsl = rgb2hsl(hex2num(copytext(paint_color,2,4)),hex2num(copytext(paint_color,4,6)),hex2num(copytext(paint_color,6,8)))
|
||||
var/static/whitelisted = typecacheof(list(/obj/structure/window,
|
||||
/obj/effect/decal/cleanable/crayon,
|
||||
|
||||
@@ -144,8 +144,8 @@
|
||||
/obj/effect/dummy/chameleon/attack_alien()
|
||||
master.disrupt()
|
||||
|
||||
/obj/effect/dummy/chameleon/ex_act(S, T)
|
||||
contents_explosion(S, T)
|
||||
/obj/effect/dummy/chameleon/ex_act(severity, target, origin)
|
||||
contents_explosion(severity, target, origin)
|
||||
master.disrupt()
|
||||
|
||||
/obj/effect/dummy/chameleon/bullet_act()
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
attack_verb = list("blown up", "exploded", "detonated")
|
||||
custom_materials = list(/datum/material/iron=50, /datum/material/glass=30)
|
||||
|
||||
/obj/item/doorCharge/ex_act(severity, target)
|
||||
/obj/item/doorCharge/ex_act(severity, target, origin)
|
||||
switch(severity)
|
||||
if(EXPLODE_DEVASTATE)
|
||||
visible_message("<span class='warning'>[src] detonates!</span>")
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
rad_flags = RAD_NO_CONTAMINATE
|
||||
item_flags = NOBLUDGEON
|
||||
custom_materials = list(/datum/material/iron = 150, /datum/material/glass = 150)
|
||||
|
||||
var/grace = RAD_GRACE_PERIOD
|
||||
@@ -35,17 +36,15 @@
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
soundloop = new(list(src), FALSE)
|
||||
soundloop = new(src, FALSE)
|
||||
|
||||
/obj/item/geiger_counter/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
QDEL_NULL(soundloop)
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/geiger_counter/process()
|
||||
update_icon()
|
||||
update_sound()
|
||||
|
||||
/obj/item/geiger_counter/process(delta_time)
|
||||
if(!scanning)
|
||||
current_tick_amount = 0
|
||||
return
|
||||
@@ -64,49 +63,55 @@
|
||||
|
||||
current_tick_amount = 0
|
||||
|
||||
update_appearance()
|
||||
update_sound()
|
||||
|
||||
/obj/item/geiger_counter/examine(mob/user)
|
||||
. = ..()
|
||||
if(!scanning)
|
||||
return
|
||||
. += "<span class='info'>Alt-click it to clear stored radiation levels.</span>"
|
||||
. += span_info("Alt-click it to clear stored radiation levels.")
|
||||
if(obj_flags & EMAGGED)
|
||||
. += "<span class='warning'>The display seems to be incomprehensible.</span>"
|
||||
. += span_warning("The display seems to be incomprehensible.")
|
||||
return
|
||||
switch(radiation_count)
|
||||
if(-INFINITY to RAD_LEVEL_NORMAL)
|
||||
. += "<span class='notice'>Ambient radiation level count reports that all is well.</span>"
|
||||
. += span_notice("Ambient radiation level count reports that all is well.")
|
||||
if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE)
|
||||
. += "<span class='disarm'>Ambient radiation levels slightly above average.</span>"
|
||||
. += span_alert("Ambient radiation levels slightly above average.")
|
||||
if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH)
|
||||
. += "<span class='warning'>Ambient radiation levels above average.</span>"
|
||||
. += span_warning("Ambient radiation levels above average.")
|
||||
if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH)
|
||||
. += "<span class='danger'>Ambient radiation levels highly above average.</span>"
|
||||
. += span_danger("Ambient radiation levels highly above average.")
|
||||
if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL)
|
||||
. += "<span class='suicide'>Ambient radiation levels nearing critical level.</span>"
|
||||
. += span_suicide("Ambient radiation levels nearing critical level.")
|
||||
if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
|
||||
. += "<span class='boldannounce'>Ambient radiation levels above critical level!</span>"
|
||||
. += span_boldannounce("Ambient radiation levels above critical level!")
|
||||
|
||||
. += "<span class='notice'>The last radiation amount detected was [last_tick_amount]</span>"
|
||||
. += span_notice("The last radiation amount detected was [last_tick_amount]")
|
||||
|
||||
/obj/item/geiger_counter/update_icon_state()
|
||||
if(!scanning)
|
||||
icon_state = "geiger_off"
|
||||
else if(obj_flags & EMAGGED)
|
||||
return ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
icon_state = "geiger_on_emag"
|
||||
else
|
||||
switch(radiation_count)
|
||||
if(-INFINITY to RAD_LEVEL_NORMAL)
|
||||
icon_state = "geiger_on_1"
|
||||
if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE)
|
||||
icon_state = "geiger_on_2"
|
||||
if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH)
|
||||
icon_state = "geiger_on_3"
|
||||
if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH)
|
||||
icon_state = "geiger_on_4"
|
||||
if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL)
|
||||
icon_state = "geiger_on_4"
|
||||
if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
|
||||
icon_state = "geiger_on_5"
|
||||
return ..()
|
||||
|
||||
switch(radiation_count)
|
||||
if(-INFINITY to RAD_LEVEL_NORMAL)
|
||||
icon_state = "geiger_on_1"
|
||||
if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE)
|
||||
icon_state = "geiger_on_2"
|
||||
if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH)
|
||||
icon_state = "geiger_on_3"
|
||||
if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH)
|
||||
icon_state = "geiger_on_4"
|
||||
if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL)
|
||||
icon_state = "geiger_on_4"
|
||||
if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
|
||||
icon_state = "geiger_on_5"
|
||||
return ..()
|
||||
|
||||
/obj/item/geiger_counter/proc/update_sound()
|
||||
var/datum/looping_sound/geiger/loop = soundloop
|
||||
@@ -124,21 +129,21 @@
|
||||
if(amount <= RAD_BACKGROUND_RADIATION || !scanning)
|
||||
return
|
||||
current_tick_amount += amount
|
||||
update_icon()
|
||||
update_appearance()
|
||||
|
||||
/obj/item/geiger_counter/attack_self(mob/user)
|
||||
scanning = !scanning
|
||||
update_icon()
|
||||
to_chat(user, "<span class='notice'>[icon2html(src, user)] You switch [scanning ? "on" : "off"] [src].</span>")
|
||||
update_appearance()
|
||||
to_chat(user, span_notice("[icon2html(src, user)] You switch [scanning ? "on" : "off"] [src]."))
|
||||
|
||||
/obj/item/geiger_counter/afterattack(atom/target, mob/user)
|
||||
/obj/item/geiger_counter/afterattack(atom/target, mob/living/user)
|
||||
. = ..()
|
||||
if(user.a_intent == INTENT_HELP)
|
||||
if(!(obj_flags & EMAGGED))
|
||||
user.visible_message("<span class='notice'>[user] scans [target] with [src].</span>", "<span class='notice'>You scan [target]'s radiation levels with [src]...</span>")
|
||||
user.visible_message(span_notice("[user] scans [target] with [src]."), span_notice("You scan [target]'s radiation levels with [src]..."))
|
||||
addtimer(CALLBACK(src, .proc/scan, target, user), 20, TIMER_UNIQUE) // Let's not have spamming GetAllContents
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] scans [target] with [src].</span>", "<span class='danger'>You project [src]'s stored radiation into [target]!</span>")
|
||||
user.visible_message(span_notice("[user] scans [target] with [src]."), span_danger("You project [src]'s stored radiation into [target]!"))
|
||||
target.rad_act(radiation_count)
|
||||
radiation_count = 0
|
||||
return TRUE
|
||||
@@ -156,57 +161,61 @@
|
||||
if(isliving(A))
|
||||
var/mob/living/M = A
|
||||
if(!M.radiation)
|
||||
to_chat(user, "<span class='notice'>[icon2html(src, user)] Radiation levels within normal boundaries.</span>")
|
||||
to_chat(user, span_notice("[icon2html(src, user)] Radiation levels within normal boundaries."))
|
||||
else
|
||||
to_chat(user, "<span class='boldannounce'>[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation] rad.</span>")
|
||||
to_chat(user, span_boldannounce("[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation]."))
|
||||
|
||||
if(rad_strength)
|
||||
to_chat(user, "<span class='boldannounce'>[icon2html(src, user)] Target contains radioactive contamination. Radioactive strength: [rad_strength]</span>")
|
||||
to_chat(user, span_boldannounce("[icon2html(src, user)] Target contains radioactive contamination. Radioactive strength: [rad_strength]"))
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[icon2html(src, user)] Target is free of radioactive contamination.</span>")
|
||||
to_chat(user, span_notice("[icon2html(src, user)] Target is free of radioactive contamination."))
|
||||
|
||||
/obj/item/geiger_counter/attackby(obj/item/I, mob/user, params)
|
||||
if(I.tool_behaviour == TOOL_SCREWDRIVER && (obj_flags & EMAGGED))
|
||||
if(scanning)
|
||||
to_chat(user, "<span class='warning'>Turn off [src] before you perform this action!</span>")
|
||||
return 0
|
||||
user.visible_message("<span class='notice'>[user] unscrews [src]'s maintenance panel and begins fiddling with its innards...</span>", "<span class='notice'>You begin resetting [src]...</span>")
|
||||
to_chat(user, span_warning("Turn off [src] before you perform this action!"))
|
||||
return FALSE
|
||||
user.visible_message(span_notice("[user] unscrews [src]'s maintenance panel and begins fiddling with its innards..."), span_notice("You begin resetting [src]..."))
|
||||
if(!I.use_tool(src, user, 40, volume=50))
|
||||
return 0
|
||||
user.visible_message("<span class='notice'>[user] refastens [src]'s maintenance panel!</span>", "<span class='notice'>You reset [src] to its factory settings!</span>")
|
||||
return FALSE
|
||||
user.visible_message(span_notice("[user] refastens [src]'s maintenance panel!"), span_notice("You reset [src] to its factory settings!"))
|
||||
obj_flags &= ~EMAGGED
|
||||
radiation_count = 0
|
||||
update_icon()
|
||||
return 1
|
||||
update_appearance()
|
||||
return TRUE
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/geiger_counter/AltClick(mob/living/user)
|
||||
. = ..()
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
|
||||
return
|
||||
return ..()
|
||||
if(!scanning)
|
||||
to_chat(usr, "<span class='warning'>[src] must be on to reset its radiation level!</span>")
|
||||
return TRUE
|
||||
to_chat(usr, span_warning("[src] must be on to reset its radiation level!"))
|
||||
return
|
||||
radiation_count = 0
|
||||
to_chat(usr, "<span class='notice'>You flush [src]'s radiation counts, resetting it to normal.</span>")
|
||||
update_icon()
|
||||
return TRUE
|
||||
to_chat(usr, span_notice("You flush [src]'s radiation counts, resetting it to normal."))
|
||||
update_appearance()
|
||||
|
||||
/obj/item/geiger_counter/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
if(scanning)
|
||||
to_chat(user, "<span class='warning'>Turn off [src] before you perform this action!</span>")
|
||||
to_chat(user, span_warning("Turn off [src] before you perform this action!"))
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You override [src]'s radiation storing protocols. It will now generate small doses of radiation, and stored rads are now projected into creatures you scan.</span>")
|
||||
to_chat(user, span_warning("You override [src]'s radiation storing protocols. It will now generate small doses of radiation, and stored rads are now projected into creatures you scan."))
|
||||
obj_flags |= EMAGGED
|
||||
return TRUE
|
||||
|
||||
/obj/item/geiger_counter/cyborg
|
||||
var/mob/listeningTo
|
||||
|
||||
/obj/item/geiger_counter/cyborg/cyborg_unequip(mob/user)
|
||||
if(!scanning)
|
||||
return
|
||||
scanning = FALSE
|
||||
update_appearance()
|
||||
|
||||
/obj/item/geiger_counter/cyborg/equipped(mob/user)
|
||||
. = ..()
|
||||
if(listeningTo == user)
|
||||
@@ -217,6 +226,7 @@
|
||||
listeningTo = user
|
||||
|
||||
/obj/item/geiger_counter/cyborg/proc/redirect_rad_act(datum/source, amount)
|
||||
SIGNAL_HANDLER
|
||||
rad_act(amount)
|
||||
|
||||
/obj/item/geiger_counter/cyborg/dropped(mob/user)
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
QDEL_NULL(beaker)
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/ex_act(severity, target)
|
||||
/obj/item/storage/portable_chem_mixer/ex_act(severity, target, origin)
|
||||
if(severity < 3)
|
||||
..()
|
||||
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
|
||||
/obj/item/reverse_bear_trap/Initialize()
|
||||
. = ..()
|
||||
soundloop = new(list(src))
|
||||
soundloop2 = new(list(src))
|
||||
soundloop = new(src)
|
||||
soundloop2 = new(src)
|
||||
|
||||
/obj/item/reverse_bear_trap/Destroy()
|
||||
QDEL_NULL(soundloop)
|
||||
@@ -33,16 +33,16 @@
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/reverse_bear_trap/process()
|
||||
/obj/item/reverse_bear_trap/process(delta_time)
|
||||
if(!ticking)
|
||||
return
|
||||
time_left--
|
||||
time_left -= delta_time
|
||||
soundloop2.mid_length = max(0.5, time_left - 5) //beepbeepbeepbeepbeep
|
||||
if(!time_left || !isliving(loc))
|
||||
if(time_left <= 0 || !isliving(loc))
|
||||
playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE)
|
||||
soundloop.stop()
|
||||
soundloop2.stop()
|
||||
to_chat(loc, "<span class='userdanger'>*ding*</span>")
|
||||
to_chat(loc, span_userdanger("*ding*"))
|
||||
addtimer(CALLBACK(src, .proc/snap), 2)
|
||||
|
||||
/obj/item/reverse_bear_trap/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
@@ -116,13 +116,22 @@
|
||||
|
||||
/obj/item/reverse_bear_trap/proc/reset()
|
||||
ticking = FALSE
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
|
||||
soundloop.stop()
|
||||
soundloop2.stop()
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
|
||||
/obj/item/reverse_bear_trap/update_overlays()
|
||||
. = ..()
|
||||
if(ticking != TRUE)
|
||||
return
|
||||
/// note: this timer overlay increments one frame every second (to simulate a clock ticking). If you want to instead have it do a full cycle in a minute, set the 'delay' of each frame of the icon overlay to 75 rather than 10, and the worn overlay to twice that.
|
||||
// . += "rbt_ticking"
|
||||
|
||||
/obj/item/reverse_bear_trap/proc/arm() //hulen
|
||||
ticking = TRUE
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes
|
||||
time_left = initial(time_left)
|
||||
ADD_TRAIT(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT)
|
||||
|
||||
@@ -325,7 +325,7 @@ GENETICS SCANNER
|
||||
var/breathes = TRUE
|
||||
var/blooded = TRUE
|
||||
if(C.dna && C.dna.species)
|
||||
if(HAS_TRAIT_FROM(C, TRAIT_NOBREATH, SPECIES_TRAIT))
|
||||
if(!HAS_TRAIT_FROM(C, TRAIT_AUXILIARY_LUNGS, SPECIES_TRAIT) && HAS_TRAIT_FROM(C, TRAIT_NOBREATH, SPECIES_TRAIT))
|
||||
breathes = FALSE
|
||||
if(NOBLOOD in C.dna.species.species_traits)
|
||||
blooded = FALSE
|
||||
@@ -434,12 +434,13 @@ GENETICS SCANNER
|
||||
if(R)
|
||||
blood_type = R.name
|
||||
|
||||
|
||||
if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_SAFE * C.blood_ratio) && (C.scan_blood_volume() + C.integrating_blood) > (BLOOD_VOLUME_OKAY*C.blood_ratio))
|
||||
msg += "<span class='danger'>LOW blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""].</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
msg += "<span class='danger'>LOW [HAS_TRAIT(C, TRAIT_ROBOTIC_ORGANISM) ? "coolant" : "blood"] level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""].</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
else if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_OKAY * C.blood_ratio))
|
||||
msg += "<span class='danger'>CRITICAL blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""].</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
msg += "<span class='danger'>CRITICAL [HAS_TRAIT(C, TRAIT_ROBOTIC_ORGANISM) ? "coolant" : "blood"] level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""].</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
else
|
||||
msg += "<span class='info'>Blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]</span>\n"
|
||||
msg += "<span class='info'>[HAS_TRAIT(C, TRAIT_ROBOTIC_ORGANISM) ? "Coolant" : "Blood"] level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]</span>\n"
|
||||
|
||||
|
||||
var/cyberimp_detect
|
||||
@@ -467,7 +468,8 @@ GENETICS SCANNER
|
||||
if(length(reagents))
|
||||
msg += "<span class='notice'>Subject contains the following reagents:</span>\n"
|
||||
for(var/datum/reagent/R in reagents)
|
||||
msg += "<span class='notice'>[R.volume] units of [R.name][R.overdosed == 1 ? "</span> - <span class='boldannounce'>OVERDOSING</span>" : ".</span>"]\n"
|
||||
var/invalid_reagent = is_reagent_processing_invalid(R, M)
|
||||
msg += "<span class='notice'>[invalid_reagent ? "<font color='grey'>" : ""][R.volume] units of [R.name][invalid_reagent ? "</font>" : ""][R.overdosed == 1 ? "</span> - <span class='boldannounce'>OVERDOSING</span>" : ".</span>"]\n"
|
||||
else
|
||||
msg += "<span class='notice'>Subject contains no reagents.</span>\n"
|
||||
|
||||
|
||||
@@ -59,9 +59,6 @@
|
||||
I.play_tool_sound(src, 25)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to add at least one beaker before locking the [initial(name)] assembly!</span>")
|
||||
else if(stage == READY && !nadeassembly)
|
||||
det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50
|
||||
to_chat(user, "<span class='notice'>You modify the time delay. It's set for [DisplayTimeText(det_time)].</span>")
|
||||
else if(stage == EMPTY)
|
||||
to_chat(user, "<span class='warning'>You need to add an activation mechanism!</span>")
|
||||
|
||||
|
||||
@@ -135,16 +135,16 @@
|
||||
/obj/item/grenade/tool_act(mob/living/user, obj/item/I, tool_behaviour)
|
||||
if(tool_behaviour == TOOL_SCREWDRIVER)
|
||||
switch(det_time)
|
||||
if ("1")
|
||||
det_time = 10
|
||||
if(1)
|
||||
det_time = 1 SECONDS
|
||||
to_chat(user, "<span class='notice'>You set the [name] for 1 second detonation time.</span>")
|
||||
if ("10")
|
||||
det_time = 30
|
||||
if(1 SECONDS)
|
||||
det_time = 3 SECONDS
|
||||
to_chat(user, "<span class='notice'>You set the [name] for 3 second detonation time.</span>")
|
||||
if ("30")
|
||||
det_time = 50
|
||||
if(3 SECONDS)
|
||||
det_time = 5 SECONDS
|
||||
to_chat(user, "<span class='notice'>You set the [name] for 5 second detonation time.</span>")
|
||||
if ("50")
|
||||
if(5 SECONDS)
|
||||
det_time = 1
|
||||
to_chat(user, "<span class='notice'>You set the [name] for instant detonation.</span>")
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -20,4 +20,7 @@
|
||||
imp_type = /obj/item/implant/uplink/precharged
|
||||
|
||||
/obj/item/implant/uplink/precharged
|
||||
starting_tc = 10
|
||||
starting_tc = TELECRYSTALS_PRELOADED_IMPLANT
|
||||
|
||||
/obj/item/implant/uplink/starting
|
||||
starting_tc = TELECRYSTALS_DEFAULT - UPLINK_IMPLANT_TELECRYSTAL_COST
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
user.update_inv_hands()
|
||||
loc.assume_air(air_contents)
|
||||
|
||||
/obj/item/latexballon/ex_act(severity, target)
|
||||
/obj/item/latexballon/ex_act(severity, target, origin)
|
||||
burst()
|
||||
switch(severity)
|
||||
if (1)
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/saber
|
||||
possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER)
|
||||
unique_reskin = list("Sword" = "sword0", "saber" = "esaber0")
|
||||
unique_reskin = list("Sword" = "sword0", "Saber" = "esaber0")
|
||||
var/hacked = FALSE
|
||||
var/saber = FALSE
|
||||
|
||||
|
||||
@@ -557,7 +557,7 @@
|
||||
..()
|
||||
balanced = 0
|
||||
|
||||
/obj/item/melee/supermatter_sword/ex_act(severity, target)
|
||||
/obj/item/melee/supermatter_sword/ex_act(severity, target, origin)
|
||||
visible_message("<span class='danger'>The blast wave smacks into [src] and rapidly flashes to ash.</span>",\
|
||||
"<span class='italics'>You hear a loud crack as you are washed with a wave of heat.</span>")
|
||||
consume_everything()
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
/obj/machinery/door/keycard/emp_act(severity)
|
||||
return
|
||||
|
||||
/obj/machinery/door/keycard/ex_act(severity, target)
|
||||
/obj/machinery/door/keycard/ex_act(severity, target, origin)
|
||||
return
|
||||
|
||||
/obj/machinery/door/keycard/try_to_activate_door(mob/user)
|
||||
|
||||
@@ -247,22 +247,28 @@
|
||||
var/final_damage = damage
|
||||
|
||||
if(attack_type & ATTACK_TYPE_MELEE)
|
||||
var/obj/hittingthing = object
|
||||
if(hittingthing.damtype == BURN)
|
||||
if((shield_flags & SHIELD_ENERGY_WEAK))
|
||||
final_damage *= 2
|
||||
else if((shield_flags & SHIELD_ENERGY_STRONG))
|
||||
final_damage *= 0.5
|
||||
if(istype(object, /obj)) //Assumption: non-object attackers are a meleeing mob. Therefore: Assuming physical attack in this case.
|
||||
var/obj/hittingthing = object
|
||||
if(hittingthing.damtype == BURN)
|
||||
if((shield_flags & SHIELD_ENERGY_WEAK))
|
||||
final_damage *= 2
|
||||
else if((shield_flags & SHIELD_ENERGY_STRONG))
|
||||
final_damage *= 0.5
|
||||
|
||||
if(hittingthing.damtype == BRUTE)
|
||||
if(hittingthing.damtype == BRUTE)
|
||||
if((shield_flags & SHIELD_KINETIC_WEAK))
|
||||
final_damage *= 2
|
||||
else if((shield_flags & SHIELD_KINETIC_STRONG))
|
||||
final_damage *= 0.5
|
||||
|
||||
if(hittingthing.damtype == STAMINA || hittingthing.damtype == TOX || hittingthing.damtype == CLONE || hittingthing.damtype == BRAIN || hittingthing.damtype == OXY)
|
||||
final_damage = 0
|
||||
else
|
||||
if((shield_flags & SHIELD_KINETIC_WEAK))
|
||||
final_damage *= 2
|
||||
else if((shield_flags & SHIELD_KINETIC_STRONG))
|
||||
final_damage *= 0.5
|
||||
|
||||
if(hittingthing.damtype == STAMINA || hittingthing.damtype == TOX || hittingthing.damtype == CLONE || hittingthing.damtype == BRAIN || hittingthing.damtype == OXY)
|
||||
final_damage = 0
|
||||
|
||||
if(attack_type & ATTACK_TYPE_PROJECTILE)
|
||||
var/obj/item/projectile/shootingthing = object
|
||||
if(is_energy_reflectable_projectile(shootingthing))
|
||||
|
||||
@@ -488,6 +488,9 @@
|
||||
icon_state = "nanogel"
|
||||
var/being_applied = FALSE //No doafter stacking.
|
||||
|
||||
/obj/item/stack/medical/nanogel/one
|
||||
amount = 1
|
||||
|
||||
/obj/item/stack/medical/nanogel/try_heal(mob/living/M, mob/user, silent = FALSE)
|
||||
if(being_applied)
|
||||
to_chat(user, "<span class='warning'>You are already applying [src]!</span>")
|
||||
|
||||
@@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
|
||||
new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("double bed", /obj/structure/bed/double, 4, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
//CIT CHANGE - adds sofas to metal recipe list
|
||||
new/datum/stack_recipe_list("sofas", list( \
|
||||
new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
@@ -396,6 +397,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
|
||||
new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \
|
||||
new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \
|
||||
new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
|
||||
new/datum/stack_recipe("double bedsheet", /obj/item/bedsheet/double, 6), \
|
||||
new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \
|
||||
new/datum/stack_recipe("padded floor tile", /obj/item/stack/tile/padded, 1, 4, 20), \
|
||||
null, \
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
/obj/item/storage/AllowDrop()
|
||||
return TRUE
|
||||
|
||||
/obj/item/storage/contents_explosion(severity, target)
|
||||
/obj/item/storage/contents_explosion(severity, target, origin)
|
||||
var/in_storage = istype(loc, /obj/item/storage)? (max(0, severity - 1)) : (severity)
|
||||
for(var/atom/A in contents)
|
||||
A.ex_act(in_storage, target)
|
||||
A.ex_act(in_storage, target, origin)
|
||||
CHECK_TICK
|
||||
|
||||
//Cyberboss says: "USE THIS TO FILL IT, NOT INITIALIZE OR NEW"
|
||||
|
||||
@@ -368,12 +368,16 @@
|
||||
if(ishuman(hit_atom) && !caught && prob(throw_hit_chance) && thrownby)//if they are a carbon and they didn't catch it
|
||||
baton_stun(hit_atom, thrownby, shoving = TRUE)
|
||||
if(thrownby && !caught)
|
||||
sleep(1)
|
||||
if(!QDELETED(src))
|
||||
throw_at(thrownby, throw_range+2, throw_speed, null, TRUE)
|
||||
throw_back()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/melee/baton/boomerang/proc/throw_back()
|
||||
set waitfor = FALSE
|
||||
sleep(1)
|
||||
if(!QDELETED(src))
|
||||
throw_at(thrownby, throw_range+2, throw_speed, null, TRUE)
|
||||
|
||||
/obj/item/melee/baton/boomerang/update_icon()
|
||||
if(turned_on)
|
||||
icon_state = "[initial(icon_state)]_active"
|
||||
|
||||
@@ -291,8 +291,8 @@
|
||||
message_admins("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].")
|
||||
log_game("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].")
|
||||
//Give the gas a chance to build up more pressure through reacting
|
||||
air_contents.react(src)
|
||||
air_contents.react(src)
|
||||
for(var/i in 1 to TANK_POST_FRAGMENT_REACTIONS)
|
||||
air_contents.react(src)
|
||||
|
||||
pressure = air_contents.return_pressure()
|
||||
var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE
|
||||
|
||||
@@ -271,18 +271,7 @@
|
||||
if(resin_cooldown)
|
||||
to_chat(user, "<span class='warning'>Resin launcher is still recharging...</span>")
|
||||
return
|
||||
resin_cooldown = TRUE
|
||||
R.remove_any(100)
|
||||
var/obj/effect/resin_container/A = new (get_turf(src))
|
||||
log_game("[key_name(user)] used Resin Launcher at [AREACOORD(user)].")
|
||||
playsound(src,'sound/items/syringeproj.ogg',40,1)
|
||||
for(var/a=0, a<5, a++)
|
||||
step_towards(A, target)
|
||||
sleep(2)
|
||||
A.Smoke()
|
||||
spawn(100)
|
||||
if(src)
|
||||
resin_cooldown = FALSE
|
||||
launch_resin(target, user)
|
||||
return
|
||||
if(nozzle_mode == RESIN_FOAM)
|
||||
if(!Adj|| !isturf(target))
|
||||
@@ -301,6 +290,21 @@
|
||||
to_chat(user, "<span class='warning'>Resin foam mix is still being synthesized...</span>")
|
||||
return
|
||||
|
||||
/obj/item/extinguisher/mini/nozzle/proc/launch_resin(atom/target, mob/user)
|
||||
set waitfor = FALSE
|
||||
resin_cooldown = TRUE
|
||||
reagents.remove_any(100)
|
||||
var/obj/effect/resin_container/A = new (get_turf(src))
|
||||
log_game("[key_name(user)] used Resin Launcher at [AREACOORD(user)].")
|
||||
playsound(src,'sound/items/syringeproj.ogg',40,1)
|
||||
for(var/a=0, a<5, a++)
|
||||
step_towards(A, target)
|
||||
sleep(2)
|
||||
A.Smoke()
|
||||
spawn(100)
|
||||
if(src)
|
||||
resin_cooldown = FALSE
|
||||
|
||||
/obj/effect/resin_container
|
||||
name = "resin container"
|
||||
desc = "A compacted ball of expansive resin, used to repair the atmosphere in a room, or seal off breaches."
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
throwdamage = 0
|
||||
take_damage(throwdamage, BRUTE, "melee", 1, get_dir(src, AM))
|
||||
|
||||
/obj/ex_act(severity, target)
|
||||
/obj/ex_act(severity, target, origin)
|
||||
if(resistance_flags & INDESTRUCTIBLE)
|
||||
return
|
||||
..() //contents explosion
|
||||
|
||||
@@ -383,3 +383,34 @@
|
||||
|
||||
/obj/proc/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
|
||||
return
|
||||
|
||||
|
||||
//For returning special data when the object is saved
|
||||
//For example, or silos will return a list of their materials which will be dumped on top of them
|
||||
//Can be customised if you have something that contains something you want saved
|
||||
//If you put an incorrect format it will break outputting, so don't use this if you don't know what you are doing
|
||||
//NOTE: Contents is automatically saved, so if you store your things in the contents var, don't worry about this
|
||||
//====Output Format Examples====:
|
||||
//===Single Object===
|
||||
// "/obj/item/folder/blue"
|
||||
//===Multiple Objects===
|
||||
// "/obj/item/folder/blue,\n
|
||||
// /obj/item/folder/red"
|
||||
//===Single Object with metadata===
|
||||
// "/obj/item/folder/blue{\n
|
||||
// \tdir = 8;\n
|
||||
// \tname = "special folder"\n
|
||||
// \t}"
|
||||
//===Multiple Objects with metadata===
|
||||
// "/obj/item/folder/blue{\n
|
||||
// \tdir = 8;\n
|
||||
// \tname = "special folder"\n
|
||||
// \t},\n
|
||||
// /obj/item/folder/red"
|
||||
//====How to save easily====:
|
||||
// return "[thing.type][generate_tgm_metadata(thing)]"
|
||||
//Where thing is the additional thing you want to same (For example ores inside an ORM)
|
||||
//Just add ,\n between each thing
|
||||
//generate_tgm_metadata(thing) handles everything inside the {} for you
|
||||
/obj/proc/on_object_saved(depth)
|
||||
return ""
|
||||
|
||||
@@ -52,6 +52,8 @@
|
||||
var/author_ckey
|
||||
var/icon_generated = FALSE
|
||||
var/icon/generated_icon
|
||||
///boolean that blocks persistence from saving it. enabled from printing copies, because we do not want to save copies.
|
||||
var/no_save = FALSE
|
||||
|
||||
// Painting overlay offset when framed
|
||||
var/framed_offset_x = 11
|
||||
@@ -370,7 +372,7 @@
|
||||
update_icon()
|
||||
|
||||
/obj/structure/sign/painting/proc/save_persistent()
|
||||
if(!persistence_id || !current_canvas)
|
||||
if(!persistence_id || !current_canvas || current_canvas.no_save)
|
||||
return
|
||||
if(sanitize_filename(persistence_id) != persistence_id)
|
||||
stack_trace("Invalid persistence_id - [persistence_id]")
|
||||
|
||||
@@ -53,6 +53,12 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/bed/post_buckle_mob(mob/living/target)
|
||||
target.pixel_y = target.get_standard_pixel_y_offset(TRUE)
|
||||
|
||||
/obj/structure/bed/double/post_unbuckle_mob(mob/living/target)
|
||||
target.pixel_y = target.get_standard_pixel_y_offset(FALSE)
|
||||
|
||||
/*
|
||||
* Roller beds
|
||||
*/
|
||||
@@ -214,3 +220,24 @@
|
||||
name = "resting contraption"
|
||||
desc = "This looks similar to contraptions from Earth. Could aliens be stealing our technology?"
|
||||
icon_state = "abed"
|
||||
|
||||
//Double Beds, for luxurious sleeping, i.e. the captain and maybe heads- Do use this for ERP
|
||||
/obj/structure/bed/double
|
||||
name = "double bed"
|
||||
desc = "A luxurious double bed, for those too important for small dreams."
|
||||
icon_state = "bed_double"
|
||||
buildstackamount = 4
|
||||
max_buckled_mobs = 2
|
||||
///The mob who buckled to this bed second, to avoid other mobs getting pixel-shifted before he unbuckles.
|
||||
var/mob/living/goldilocks
|
||||
|
||||
/obj/structure/bed/double/post_buckle_mob(mob/living/target)
|
||||
target.pixel_y = target.get_standard_pixel_y_offset(TRUE)
|
||||
if(buckled_mobs.len > 1 && !goldilocks) //Push the second buckled mob a bit higher from the normal lying position
|
||||
target.pixel_y = target.get_standard_pixel_y_offset(FALSE) + 6
|
||||
goldilocks = target
|
||||
|
||||
/obj/structure/bed/double/post_unbuckle_mob(mob/living/target)
|
||||
target.pixel_y = target.get_standard_pixel_y_offset(FALSE)
|
||||
if(target == goldilocks)
|
||||
goldilocks = null
|
||||
|
||||
@@ -4,6 +4,41 @@ BEDSHEETS
|
||||
LINEN BINS
|
||||
*/
|
||||
|
||||
#define BEDSHEET_SINGLE "single"
|
||||
#define BEDSHEET_DOUBLE "double"
|
||||
|
||||
GLOBAL_LIST_INIT(double_bedsheets, list(/obj/item/bedsheet/double,
|
||||
/obj/item/bedsheet/blue/double,
|
||||
/obj/item/bedsheet/green/double,
|
||||
/obj/item/bedsheet/grey/double,
|
||||
/obj/item/bedsheet/orange/double,
|
||||
/obj/item/bedsheet/purple/double,
|
||||
/obj/item/bedsheet/patriot/double,
|
||||
/obj/item/bedsheet/rainbow/double,
|
||||
/obj/item/bedsheet/red/double,
|
||||
/obj/item/bedsheet/yellow/double,
|
||||
/obj/item/bedsheet/mime/double,
|
||||
/obj/item/bedsheet/clown/double,
|
||||
/obj/item/bedsheet/captain/double,
|
||||
/obj/item/bedsheet/rd/double,
|
||||
/obj/item/bedsheet/medical/double,
|
||||
/obj/item/bedsheet/cmo/double,
|
||||
/obj/item/bedsheet/hos/double,
|
||||
/obj/item/bedsheet/hop/double,
|
||||
/obj/item/bedsheet/ce/double,
|
||||
/obj/item/bedsheet/qm/double,
|
||||
/obj/item/bedsheet/chaplain/double,
|
||||
/obj/item/bedsheet/brown/double,
|
||||
/obj/item/bedsheet/black/double,
|
||||
/obj/item/bedsheet/centcom/double,
|
||||
/obj/item/bedsheet/syndie/double,
|
||||
/obj/item/bedsheet/cult/double,
|
||||
/obj/item/bedsheet/wiz/double,
|
||||
/obj/item/bedsheet/nanotrasen/double,
|
||||
/obj/item/bedsheet/ian/double,
|
||||
/obj/item/bedsheet/cosmos/double
|
||||
))
|
||||
|
||||
/obj/item/bedsheet
|
||||
name = "bedsheet"
|
||||
desc = "A surprisingly soft linen bedsheet."
|
||||
@@ -21,10 +56,15 @@ LINEN BINS
|
||||
|
||||
dog_fashion = /datum/dog_fashion/head/ghost
|
||||
var/list/dream_messages = list("white")
|
||||
var/stack_amount = 3
|
||||
var/bedsheet_type = BEDSHEET_SINGLE
|
||||
|
||||
/obj/item/bedsheet/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/bed_tuckable, 0, 0, 0)
|
||||
if(bedsheet_type == BEDSHEET_DOUBLE)
|
||||
stack_amount *= 2
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
|
||||
/obj/item/bedsheet/attack(mob/living/M, mob/user)
|
||||
if(!attempt_initiate_surgery(src, M, user))
|
||||
@@ -46,7 +86,7 @@ LINEN BINS
|
||||
|
||||
/obj/item/bedsheet/attackby(obj/item/I, mob/user, params)
|
||||
if(!(flags_1 & HOLOGRAM_1) && (I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness()))
|
||||
var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3)
|
||||
var/obj/item/stack/sheet/cloth/C = new (get_turf(src), stack_amount)
|
||||
transfer_fingerprints_to(C)
|
||||
C.add_fingerprint(user)
|
||||
qdel(src)
|
||||
@@ -247,9 +287,171 @@ LINEN BINS
|
||||
|
||||
/obj/item/bedsheet/random/Initialize()
|
||||
..()
|
||||
var/type = pick(typesof(/obj/item/bedsheet) - (list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon) + typesof(/obj/item/bedsheet/unlockable)))
|
||||
new type(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
if(bedsheet_type == BEDSHEET_SINGLE)
|
||||
var/type = pick(typesof(/obj/item/bedsheet) - (list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon) + typesof(/obj/item/bedsheet/unlockable) + GLOB.double_bedsheets))
|
||||
new type(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/bedsheet/double
|
||||
icon_state = "double_sheetwhite"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/blue/double
|
||||
icon_state = "double_sheetblue"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/green/double
|
||||
icon_state = "double_sheetgreen"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/grey/double
|
||||
icon_state = "double_sheetgrey"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/orange/double
|
||||
icon_state = "double_sheetorange"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/purple/double
|
||||
icon_state = "double_sheetpurple"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/patriot/double
|
||||
icon_state = "double_sheetUSA"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/rainbow/double
|
||||
icon_state = "double_sheetrainbow"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/red/double
|
||||
icon_state = "double_sheetred"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/yellow/double
|
||||
icon_state = "double_sheetyellow"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/mime/double
|
||||
icon_state = "double_sheetmime"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/clown/double
|
||||
icon_state = "double_sheetclown"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/captain/double
|
||||
icon_state = "double_sheetcaptain"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/rd/double
|
||||
icon_state = "double_sheetrd"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/medical/double
|
||||
icon_state = "double_sheetmedical"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/cmo/double
|
||||
icon_state = "double_sheetcmo"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/hos/double
|
||||
icon_state = "double_sheethos"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/hop/double
|
||||
icon_state = "double_sheethop"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/ce/double
|
||||
icon_state = "double_sheetce"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/qm/double
|
||||
icon_state = "double_sheetqm"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/chaplain/double
|
||||
icon_state = "double_sheetchap"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/brown/double
|
||||
icon_state = "double_sheetbrown"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/black/double
|
||||
icon_state = "double_sheetblack"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/centcom/double
|
||||
icon_state = "double_sheetcentcom"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/syndie/double
|
||||
icon_state = "double_sheetsyndie"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/cult/double
|
||||
icon_state = "double_sheetcult"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/wiz/double
|
||||
icon_state = "double_sheetwiz"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/nanotrasen/double
|
||||
icon_state = "double_sheetNT"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/ian/double
|
||||
icon_state = "double_sheetian"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/cosmos/double
|
||||
icon_state = "double_sheetcosmos"
|
||||
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/random/double
|
||||
icon_state = "random_bedsheet"
|
||||
bedsheet_type = BEDSHEET_DOUBLE
|
||||
|
||||
/obj/item/bedsheet/random/double/Initialize()
|
||||
..()
|
||||
if(bedsheet_type == BEDSHEET_DOUBLE)
|
||||
var/type = pick(GLOB.double_bedsheets)
|
||||
new type(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/bedsheet/chameleon //donator chameleon bedsheet
|
||||
name = "chameleon bedsheet"
|
||||
|
||||
@@ -531,7 +531,7 @@
|
||||
|
||||
/obj/structure/closet/get_remote_view_fullscreens(mob/user)
|
||||
if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
|
||||
user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1)
|
||||
user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/scaled/impaired, 1)
|
||||
|
||||
/obj/structure/closet/emp_act(severity)
|
||||
. = ..()
|
||||
@@ -554,9 +554,9 @@
|
||||
if(!QDELETED(lockerelectronics))
|
||||
lockerelectronics.accesses = req_access
|
||||
|
||||
/obj/structure/closet/contents_explosion(severity, target)
|
||||
/obj/structure/closet/contents_explosion(severity, target, origin)
|
||||
for(var/atom/A in contents)
|
||||
A.ex_act(severity, target)
|
||||
A.ex_act(severity, target, origin)
|
||||
CHECK_TICK
|
||||
|
||||
/obj/structure/closet/singularity_act()
|
||||
@@ -672,3 +672,15 @@
|
||||
if(allowed(user))
|
||||
return TRUE
|
||||
to_chat(user, "<span class='notice'>Access denied.</span>")
|
||||
|
||||
/obj/structure/closet/on_object_saved(depth)
|
||||
if(depth >= 10)
|
||||
return ""
|
||||
var/dat = ""
|
||||
for(var/obj/item in contents)
|
||||
var/metadata = generate_tgm_metadata(item)
|
||||
dat += "[dat ? ",\n" : ""][item.type][metadata]"
|
||||
//Save the contents of things inside the things inside us, EG saving the contents of bags inside lockers
|
||||
var/custom_data = item.on_object_saved(depth++)
|
||||
dat += "[custom_data ? ",\n[custom_data]" : ""]"
|
||||
return dat
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
if(.) //if we actually closed the locker
|
||||
recursive_organ_check(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/ex_act()
|
||||
/obj/structure/closet/secure_closet/freezer/ex_act(severity, target, origin)
|
||||
if(!jones)
|
||||
jones = TRUE
|
||||
else
|
||||
|
||||
@@ -397,7 +397,7 @@
|
||||
data["owner_name"] = payments_acc.account_holder
|
||||
if(showpiece)
|
||||
data["product_name"] = capitalize(showpiece.name)
|
||||
var/base64 = icon2base64(icon(showpiece.icon, showpiece.icon_state))
|
||||
var/base64 = icon2base64(icon(showpiece.icon, showpiece.icon_state, SOUTH, 1))
|
||||
data["product_icon"] = base64
|
||||
data["registered"] = register
|
||||
data["product_cost"] = sale_price
|
||||
|
||||
@@ -32,9 +32,9 @@
|
||||
stored_extinguisher = null
|
||||
return ..()
|
||||
|
||||
/obj/structure/extinguisher_cabinet/contents_explosion(severity, target)
|
||||
/obj/structure/extinguisher_cabinet/contents_explosion(severity, target, origin)
|
||||
if(stored_extinguisher)
|
||||
stored_extinguisher.ex_act(severity, target)
|
||||
stored_extinguisher.ex_act(severity, target, origin)
|
||||
|
||||
/obj/structure/extinguisher_cabinet/handle_atom_del(atom/A)
|
||||
if(A == stored_extinguisher)
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
hole_size = LARGE_HOLE
|
||||
|
||||
/obj/structure/fence/attackby(obj/item/W, mob/user)
|
||||
var/current_stage = hole_size
|
||||
if(W.tool_behaviour == TOOL_WIRECUTTER)
|
||||
if(!cuttable)
|
||||
to_chat(user, "<span class='notice'>This section of the fence can't be cut.</span>")
|
||||
@@ -64,7 +65,6 @@
|
||||
if(invulnerable)
|
||||
to_chat(user, "<span class='notice'>This fence is too strong to cut through.</span>")
|
||||
return
|
||||
var/current_stage = hole_size
|
||||
if(current_stage >= MAX_HOLE_SIZE)
|
||||
to_chat(user, "<span class='notice'>This fence has too much cut out of it already.</span>")
|
||||
return
|
||||
@@ -86,6 +86,25 @@
|
||||
|
||||
update_cut_status()
|
||||
|
||||
else if(istype(W, /obj/item/stack/rods) && broken)
|
||||
if(!hole_size)
|
||||
to_chat(user, "<span class='info'>The [src] has no cuts in it!</span>")
|
||||
return
|
||||
var/obj/item/stack/rods/R = W
|
||||
if(do_after(user, CUT_TIME, target = src))
|
||||
if(current_stage == hole_size)
|
||||
switch(--hole_size)
|
||||
if(NO_HOLE)
|
||||
visible_message("<span class='notice'>\The [user] repairs \the [src] fully.</span>")
|
||||
to_chat(user, "<span class='info'>You repaire the [src] back to it's former glory.</span>")
|
||||
climbable = TRUE
|
||||
if(MEDIUM_HOLE)
|
||||
visible_message("<span class='notice'>\The [user] patches up \the [src].</span>")
|
||||
to_chat(user, "<span class='info'>The hole in \the [src] is reduced slightly, though someone could probably sill squeeze though if you don't patch it up more.</span>")
|
||||
climbable = FALSE
|
||||
R.use(1)
|
||||
update_cut_status()
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/structure/fence/proc/update_cut_status()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#define LOG_BURN_TIMER 150
|
||||
#define LOG_BURN_TIMER 400
|
||||
#define PAPER_BURN_TIMER 5
|
||||
#define MAXIMUM_BURN_TIMER 3000
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
pixel_x = -16
|
||||
resistance_flags = FIRE_PROOF
|
||||
var/lit = FALSE
|
||||
light_color = "#E38C2D"
|
||||
|
||||
var/fuel_added = 0
|
||||
var/flame_expiry_timer
|
||||
@@ -64,6 +65,12 @@
|
||||
</span>")
|
||||
adjust_fuel_timer(PAPER_BURN_TIMER)
|
||||
qdel(T)
|
||||
else if(istype(T,/obj/item/grown/log))
|
||||
user.visible_message("<span class='notice'>[user] tosses some \
|
||||
wood into [src].</span>", "<span class='notice'>You add \
|
||||
some fuel to [src].</span>")
|
||||
adjust_fuel_timer(LOG_BURN_TIMER)
|
||||
qdel(T)
|
||||
else if(try_light(T,user))
|
||||
return
|
||||
else
|
||||
|
||||
@@ -40,6 +40,16 @@
|
||||
density = FALSE
|
||||
pixel_x = -16
|
||||
|
||||
/obj/structure/flora/stump/attackby(obj/item/W, mob/user, params)
|
||||
if((W.tool_behaviour == TOOL_SHOVEL) && params)
|
||||
playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
new /obj/item/grown/log/tree(get_turf(src))
|
||||
user.visible_message("[user] digs up [src].", "<span class='notice'>You dig up [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/flora/tree/pine
|
||||
name = "pine tree"
|
||||
desc = "A coniferous pine tree."
|
||||
|
||||
@@ -78,6 +78,12 @@
|
||||
deconstructible = FALSE
|
||||
layer = EDGED_TURF_LAYER
|
||||
|
||||
/obj/structure/fluff/lightpost/light
|
||||
desc = "That which most enchants the Edinians is the lighting by gas of the boulevards... These humble rows of lamps, shining with a clarity white and pure, have a marvelous effect upon the streets on Nova Edina. Adorned with a cheery garb, in tune with the festive spirits of the city."
|
||||
light_power = 0.8
|
||||
light_range = 10
|
||||
light_color = "#ffeeab"
|
||||
|
||||
/obj/structure/fluff/bus
|
||||
name = "bus"
|
||||
desc = "GO TO SCHOOL. READ A BOOK."
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//Objects that spawn ghosts in as a certain role when they click on it, i.e. away mission bartenders.
|
||||
|
||||
#define spawnOverride TRUE
|
||||
//Preserved terrarium/seed vault: Spawns in seed vault structures in lavaland. Ghosts become plantpeople and are advised to begin growing plants in the room near them.
|
||||
/obj/effect/mob_spawn/human/seed_vault
|
||||
name = "preserved terrarium"
|
||||
@@ -36,6 +36,44 @@
|
||||
|
||||
//Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers.
|
||||
|
||||
/obj/structure/ash_walker_eggshell
|
||||
name = "ash walker egg"
|
||||
desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within. The egg shell looks resistant to temperature but otherwise rather brittle."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "large_egg"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | FREEZE_PROOF
|
||||
max_integrity = 80
|
||||
var/obj/effect/mob_spawn/human/ash_walker/egg
|
||||
|
||||
/obj/structure/ash_walker_eggshell/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) //lifted from xeno eggs
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(damage_amount)
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, TRUE)
|
||||
else
|
||||
playsound(src, 'sound/weapons/tap.ogg', 50, TRUE)
|
||||
if(BURN)
|
||||
if(damage_amount)
|
||||
playsound(loc, 'sound/items/welder.ogg', 100, TRUE)
|
||||
|
||||
/obj/structure/ash_walker_eggshell/attack_ghost(mob/user) //Pass on ghost clicks to the mob spawner
|
||||
if(egg)
|
||||
egg.attack_ghost(user)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/ash_walker_eggshell/Destroy()
|
||||
if(!egg)
|
||||
return ..()
|
||||
var/mob/living/carbon/human/yolk = new /mob/living/carbon/human/(get_turf(src))
|
||||
yolk.fully_replace_character_name(null,random_unique_lizard_name(gender))
|
||||
yolk.set_species(/datum/species/lizard/ashwalker)
|
||||
yolk.underwear = "Nude"
|
||||
yolk.equipOutfit(/datum/outfit/ashwalker)//this is an authentic mess we're making
|
||||
yolk.update_body()
|
||||
yolk.gib()
|
||||
QDEL_NULL(egg)
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/ash_walker
|
||||
name = "ash walker egg"
|
||||
desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within."
|
||||
@@ -55,12 +93,25 @@
|
||||
You have seen lights in the distance... they foreshadow the arrival of outsiders to your domain. \
|
||||
Ensure your nest remains protected at all costs."
|
||||
assignedrole = "Ash Walker"
|
||||
var/datum/team/ashwalkers/team
|
||||
var/obj/structure/ash_walker_eggshell/eggshell
|
||||
|
||||
/obj/effect/mob_spawn/human/ash_walker/Destroy()
|
||||
eggshell = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/ash_walker/allow_spawn(mob/user, silent = FALSE)
|
||||
if(!(user.key in team.players_spawned) || spawnOverride)//one per person unless you get a bonus spawn
|
||||
return TRUE
|
||||
to_chat(user, span_warning("<b>You have exhausted your usefulness to the Necropolis</b>."))
|
||||
return FALSE
|
||||
|
||||
/obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn)
|
||||
new_spawn.real_name = random_unique_lizard_name(gender)
|
||||
if(is_mining_level(z))
|
||||
to_chat(new_spawn, "<b>Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind. Glory to the Necropolis!</b>")
|
||||
to_chat(new_spawn, "<b>You can expand the weather proof area provided by your shelters by using the 'New Area' key near the bottom right of your HUD.</b>")
|
||||
to_chat(new_spawn, "<b>Dragging injured ashwalkers to the tentacle or using the sleep verb next to it youself causes the body to remade whole after a short delay!</b>")
|
||||
else
|
||||
to_chat(new_spawn, "<span class='userdanger'>You have been born outside of your natural home! Whether you decide to return home, or make due with your new home is your own decision.</span>")
|
||||
|
||||
@@ -72,10 +123,18 @@
|
||||
H.undershirt = "Nude"
|
||||
H.socks = "Nude"
|
||||
H.update_body()
|
||||
new_spawn.mind.add_antag_datum(/datum/antagonist/ashwalker, team)
|
||||
team.players_spawned += (new_spawn.key)
|
||||
eggshell.egg = null
|
||||
QDEL_NULL(eggshell)
|
||||
|
||||
/obj/effect/mob_spawn/human/ash_walker/Initialize(mapload)
|
||||
/obj/effect/mob_spawn/human/ash_walker/Initialize(mapload, datum/team/ashwalkers/ashteam)
|
||||
. = ..()
|
||||
var/area/A = get_area(src)
|
||||
team = ashteam
|
||||
eggshell = new /obj/structure/ash_walker_eggshell(get_turf(loc))
|
||||
eggshell.egg = src
|
||||
src.forceMove(eggshell)
|
||||
if(A)
|
||||
notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER, ignore_dnr_observers = TRUE)
|
||||
|
||||
|
||||
@@ -91,9 +91,9 @@
|
||||
/obj/structure/guncase/handle_atom_del(atom/A)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/guncase/contents_explosion(severity, target)
|
||||
/obj/structure/guncase/contents_explosion(severity, target, origin)
|
||||
for(var/atom/A in contents)
|
||||
A.ex_act(severity++, target)
|
||||
A.ex_act(severity++, target, origin)
|
||||
CHECK_TICK
|
||||
|
||||
/obj/structure/guncase/shotgun
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
icon_state = "randompile"
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
max_integrity = 100
|
||||
var/loot_amount = 5
|
||||
var/delete_on_depletion = FALSE
|
||||
var/can_use_hands = TRUE
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
/obj/machinery/manned_turret/Destroy()
|
||||
target = null
|
||||
target_turf = null
|
||||
..()
|
||||
return ..()
|
||||
|
||||
//BUCKLE HOOKS
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
|
||||
|
||||
/obj/structure/bodycontainer/get_remote_view_fullscreens(mob/user)
|
||||
if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
|
||||
user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2)
|
||||
user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/scaled/impaired, 2)
|
||||
/*
|
||||
* Morgue
|
||||
*/
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define MAX_NOTICES 5
|
||||
|
||||
/obj/structure/noticeboard
|
||||
name = "notice board"
|
||||
desc = "A board for pinning important notices upon."
|
||||
@@ -7,8 +9,25 @@
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
max_integrity = 150
|
||||
/// Current number of a pinned notices
|
||||
var/notices = 0
|
||||
|
||||
/obj/structure/noticeboard/directional/north
|
||||
dir = SOUTH
|
||||
pixel_y = 32
|
||||
|
||||
/obj/structure/noticeboard/directional/south
|
||||
dir = NORTH
|
||||
pixel_y = -32
|
||||
|
||||
/obj/structure/noticeboard/directional/east
|
||||
dir = WEST
|
||||
pixel_x = 32
|
||||
|
||||
/obj/structure/noticeboard/directional/west
|
||||
dir = EAST
|
||||
pixel_x = -32
|
||||
|
||||
/obj/structure/noticeboard/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -16,7 +35,7 @@
|
||||
return
|
||||
|
||||
for(var/obj/item/I in loc)
|
||||
if(notices > 4)
|
||||
if(notices >= MAX_NOTICES)
|
||||
break
|
||||
if(istype(I, /obj/item/paper))
|
||||
I.forceMove(src)
|
||||
@@ -27,67 +46,84 @@
|
||||
/obj/structure/noticeboard/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/paper) || istype(O, /obj/item/photo))
|
||||
if(!allowed(user))
|
||||
to_chat(user, "<span class='info'>You are not authorized to add notices</span>")
|
||||
to_chat(user, span_warning("You are not authorized to add notices!"))
|
||||
return
|
||||
if(notices < 5)
|
||||
if(notices < MAX_NOTICES)
|
||||
if(!user.transferItemToLoc(O, src))
|
||||
return
|
||||
notices++
|
||||
icon_state = "nboard0[notices]"
|
||||
to_chat(user, "<span class='notice'>You pin the [O] to the noticeboard.</span>")
|
||||
to_chat(user, span_notice("You pin the [O] to the noticeboard."))
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The notice board is full</span>")
|
||||
to_chat(user, span_warning("The notice board is full!"))
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/noticeboard/interact(mob/user)
|
||||
ui_interact(user)
|
||||
/obj/structure/noticeboard/ui_state(mob/user)
|
||||
return GLOB.physical_state
|
||||
|
||||
/obj/structure/noticeboard/ui_interact(mob/user)
|
||||
/obj/structure/noticeboard/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "NoticeBoard", name)
|
||||
ui.open()
|
||||
|
||||
/obj/structure/noticeboard/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["allowed"] = allowed(user)
|
||||
data["items"] = list()
|
||||
for(var/obj/item/content in contents)
|
||||
var/list/content_data = list(
|
||||
name = content.name,
|
||||
ref = REF(content)
|
||||
)
|
||||
data["items"] += list(content_data)
|
||||
return data
|
||||
|
||||
/obj/structure/noticeboard/ui_act(action, params)
|
||||
. = ..()
|
||||
var/auth = allowed(user)
|
||||
var/dat = "<B>[name]</B><BR>"
|
||||
for(var/obj/item/P in src)
|
||||
if(istype(P, /obj/item/paper))
|
||||
dat += "<A href='?src=[REF(src)];read=[REF(P)]'>[P.name]</A> [auth ? "<A href='?src=[REF(src)];write=[REF(P)]'>Write</A> <A href='?src=[REF(src)];remove=[REF(P)]'>Remove</A>" : ""]<BR>"
|
||||
else
|
||||
dat += "<A href='?src=[REF(src)];read=[REF(P)]'>[P.name]</A> [auth ? "<A href='?src=[REF(src)];remove=[REF(P)]'>Remove</A>" : ""]<BR>"
|
||||
user << browse("<HEAD><TITLE>Notices</TITLE></HEAD>[dat]","window=noticeboard")
|
||||
onclose(user, "noticeboard")
|
||||
if(.)
|
||||
return
|
||||
|
||||
/obj/structure/noticeboard/Topic(href, href_list)
|
||||
..()
|
||||
usr.set_machine(src)
|
||||
if(href_list["remove"])
|
||||
if((usr.stat || usr.restrained())) //For when a player is handcuffed while they have the notice window open
|
||||
return
|
||||
var/obj/item/I = locate(href_list["remove"]) in contents
|
||||
if(istype(I) && I.loc == src)
|
||||
I.forceMove(usr.loc)
|
||||
usr.put_in_hands(I)
|
||||
notices--
|
||||
icon_state = "nboard0[notices]"
|
||||
var/obj/item/item = locate(params["ref"]) in contents
|
||||
if(!istype(item) || item.loc != src)
|
||||
return
|
||||
|
||||
if(href_list["write"])
|
||||
if((usr.stat || usr.restrained())) //For when a player is handcuffed while they have the notice window open
|
||||
return
|
||||
var/obj/item/P = locate(href_list["write"]) in contents
|
||||
if(istype(P) && P.loc == src)
|
||||
var/obj/item/I = usr.is_holding_item_of_type(/obj/item/pen)
|
||||
if(I)
|
||||
add_fingerprint(usr)
|
||||
P.attackby(I, usr)
|
||||
var/mob/user = usr
|
||||
|
||||
switch(action)
|
||||
if("examine")
|
||||
if(istype(item, /obj/item/paper))
|
||||
item.ui_interact(user)
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You'll need something to write with!</span>")
|
||||
user.examinate(item)
|
||||
return TRUE
|
||||
if("remove")
|
||||
if(!allowed(user))
|
||||
return
|
||||
remove_item(item, user)
|
||||
return TRUE
|
||||
|
||||
if(href_list["read"])
|
||||
var/obj/item/I = locate(href_list["read"]) in contents
|
||||
if(istype(I) && I.loc == src)
|
||||
usr.examinate(I)
|
||||
/**
|
||||
* Removes an item from the notice board
|
||||
*
|
||||
* Arguments:
|
||||
* * item - The item that is to be removed
|
||||
* * user - The mob that is trying to get the item removed, if there is one
|
||||
*/
|
||||
/obj/structure/noticeboard/proc/remove_item(obj/item/item, mob/user)
|
||||
item.forceMove(drop_location())
|
||||
if(user)
|
||||
user.put_in_hands(item)
|
||||
balloon_alert(user, "removed from board")
|
||||
notices--
|
||||
icon_state = "nboard0[notices]"
|
||||
|
||||
/obj/structure/noticeboard/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
new /obj/item/stack/sheet/metal (loc, 1)
|
||||
for(var/obj/item/content in contents)
|
||||
remove_item(content)
|
||||
qdel(src)
|
||||
|
||||
// Notice boards for the heads of staff (plus the qm)
|
||||
@@ -131,3 +167,5 @@
|
||||
name = "Staff Notice Board"
|
||||
desc = "Important notices from the heads of staff."
|
||||
req_access = list(ACCESS_HEADS)
|
||||
|
||||
#undef MAX_NOTICES
|
||||
|
||||
@@ -249,7 +249,7 @@
|
||||
P.setAngle(rotation_angle)
|
||||
return ..()
|
||||
|
||||
/obj/structure/reflector/ex_act()
|
||||
/obj/structure/reflector/ex_act(severity, target, origin)
|
||||
if(admin)
|
||||
return
|
||||
else
|
||||
|
||||
@@ -84,7 +84,7 @@ FLOOR SAFES
|
||||
/obj/structure/safe/blob_act(obj/structure/blob/B)
|
||||
return
|
||||
|
||||
/obj/structure/safe/ex_act(severity, target)
|
||||
/obj/structure/safe/ex_act(severity, target, origin)
|
||||
if(((severity == 2 && target == src) || severity == 1) && explosion_count < BROKEN_THRESHOLD)
|
||||
explosion_count++
|
||||
switch(explosion_count)
|
||||
|
||||
@@ -50,14 +50,14 @@
|
||||
empty_pod(location)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/transit_tube_pod/ex_act(severity, target)
|
||||
/obj/structure/transit_tube_pod/ex_act(severity, target, origin)
|
||||
..()
|
||||
if(!QDELETED(src))
|
||||
empty_pod()
|
||||
|
||||
/obj/structure/transit_tube_pod/contents_explosion(severity, target)
|
||||
/obj/structure/transit_tube_pod/contents_explosion(severity, target, origin)
|
||||
for(var/atom/movable/AM in contents)
|
||||
AM.ex_act(severity, target)
|
||||
AM.ex_act(severity, target, origin)
|
||||
|
||||
/obj/structure/transit_tube_pod/singularity_pull(S, current_size)
|
||||
..()
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
|
||||
/obj/machinery/shower/Initialize()
|
||||
. = ..()
|
||||
soundloop = new(list(src), FALSE)
|
||||
soundloop = new(src, FALSE)
|
||||
|
||||
/obj/machinery/shower/Destroy()
|
||||
QDEL_NULL(soundloop)
|
||||
@@ -669,7 +669,7 @@
|
||||
icon_state = "well_3"
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need at least tweenty-five pieces of sandstone!</span>")
|
||||
to_chat(user, "<span class='warning'>You need at least twenty-five pieces of sandstone!</span>")
|
||||
return
|
||||
if(steps == 3 && S.tool_behaviour == TOOL_SHOVEL)
|
||||
S.use_tool(src, user, 80, volume=100)
|
||||
|
||||
Reference in New Issue
Block a user