Merge remote-tracking branch 'upstream/master'
@@ -72,9 +72,11 @@
|
||||
#define LOADOUT_LIMBS list(LOADOUT_LIMB_NORMAL,LOADOUT_LIMB_PROSTHETIC,LOADOUT_LIMB_AMPUTATED) //you can amputate your legs/arms though
|
||||
|
||||
//loadout saving/loading specific defines
|
||||
#define MAXIMUM_LOADOUT_SAVES 5
|
||||
#define LOADOUT_ITEM "loadout_item"
|
||||
#define LOADOUT_COLOR "loadout_color"
|
||||
#define MAXIMUM_LOADOUT_SAVES 5
|
||||
#define LOADOUT_ITEM "loadout_item"
|
||||
#define LOADOUT_COLOR "loadout_color"
|
||||
#define LOADOUT_CUSTOM_NAME "loadout_custom_name"
|
||||
#define LOADOUT_CUSTOM_DESCRIPTION "loadout_custom_description"
|
||||
|
||||
//loadout item flags
|
||||
#define LOADOUT_CAN_NAME (1<<0) //renaming items
|
||||
|
||||
@@ -263,7 +263,7 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
return .
|
||||
|
||||
//Returns a list of all items of interest with their name
|
||||
/proc/getpois(mobs_only=0,skip_mindless=0)
|
||||
/proc/getpois(mobs_only = FALSE, skip_mindless = FALSE, specify_dead_role = TRUE)
|
||||
var/list/mobs = sortmobs()
|
||||
var/list/namecounts = list()
|
||||
var/list/pois = list()
|
||||
@@ -277,7 +277,7 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
|
||||
if(M.real_name && M.real_name != M.name)
|
||||
name += " \[[M.real_name]\]"
|
||||
if(M.stat == DEAD)
|
||||
if(M.stat == DEAD && specify_dead_role)
|
||||
if(isobserver(M))
|
||||
name += " \[ghost\]"
|
||||
else
|
||||
|
||||
@@ -274,7 +274,7 @@ GLOBAL_LIST_INIT(redacted_strings, list("\[REDACTED\]", "\[CLASSIFIED\]", "\[ARC
|
||||
GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt"))
|
||||
|
||||
//LANGUAGE CHARACTER CUSTOMIZATION
|
||||
GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles"))
|
||||
GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles", "caws", "gekkers", "clucks"))
|
||||
GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc, "xeno tongue" = /obj/item/organ/tongue/alien))
|
||||
|
||||
//SPECIES BODYPART LISTS
|
||||
|
||||
@@ -691,21 +691,29 @@ SUBSYSTEM_DEF(job)
|
||||
if(!permitted)
|
||||
continue
|
||||
var/obj/item/I = new G.path
|
||||
if(I && length(i[LOADOUT_COLOR])) //handle loadout colors
|
||||
//handle polychromic items
|
||||
if((G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) && length(G.loadout_initial_colors))
|
||||
var/datum/element/polychromic/polychromic = I.comp_lookup["item_worn_overlays"] //stupid way to do it but GetElement does not work for this
|
||||
if(polychromic && istype(polychromic))
|
||||
var/list/polychromic_entry = polychromic.colors_by_atom[I]
|
||||
if(polychromic_entry)
|
||||
if(polychromic.suits_with_helmet_typecache[I.type]) //is this one of those toggleable hood/helmet things?
|
||||
polychromic.connect_helmet(I,i[LOADOUT_COLOR])
|
||||
polychromic.colors_by_atom[I] = i[LOADOUT_COLOR]
|
||||
I.update_icon()
|
||||
else
|
||||
//handle non-polychromic items (they only have one color)
|
||||
I.add_atom_colour(i[LOADOUT_COLOR][1], FIXED_COLOUR_PRIORITY)
|
||||
I.update_icon()
|
||||
if(I)
|
||||
if(length(i[LOADOUT_COLOR])) //handle loadout colors
|
||||
//handle polychromic items
|
||||
if((G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) && length(G.loadout_initial_colors))
|
||||
var/datum/element/polychromic/polychromic = I.comp_lookup["item_worn_overlays"] //stupid way to do it but GetElement does not work for this
|
||||
if(polychromic && istype(polychromic))
|
||||
var/list/polychromic_entry = polychromic.colors_by_atom[I]
|
||||
if(polychromic_entry)
|
||||
if(polychromic.suits_with_helmet_typecache[I.type]) //is this one of those toggleable hood/helmet things?
|
||||
polychromic.connect_helmet(I,i[LOADOUT_COLOR])
|
||||
polychromic.colors_by_atom[I] = i[LOADOUT_COLOR]
|
||||
I.update_icon()
|
||||
else
|
||||
//handle non-polychromic items (they only have one color)
|
||||
I.add_atom_colour(i[LOADOUT_COLOR][1], FIXED_COLOUR_PRIORITY)
|
||||
I.update_icon()
|
||||
//when inputting the data it's already sanitized
|
||||
if(i[LOADOUT_CUSTOM_NAME])
|
||||
var/custom_name = i[LOADOUT_CUSTOM_NAME]
|
||||
I.name = custom_name
|
||||
if(i[LOADOUT_CUSTOM_DESCRIPTION])
|
||||
var/custom_description = i[LOADOUT_CUSTOM_DESCRIPTION]
|
||||
I.desc = custom_description
|
||||
if(!M.equip_to_slot_if_possible(I, G.slot, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
|
||||
@@ -146,9 +146,11 @@
|
||||
if(!istype(A) || !get_turf(A) || A == src)
|
||||
return
|
||||
|
||||
orbit_target = A
|
||||
return A.AddComponent(/datum/component/orbiter, src, radius, clockwise, rotation_speed, rotation_segments, pre_rotation)
|
||||
|
||||
/atom/movable/proc/stop_orbit(datum/component/orbiter/orbits)
|
||||
orbit_target = null
|
||||
return // We're just a simple hook
|
||||
|
||||
/atom/proc/transfer_observers_to(atom/target)
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
qdel(src)
|
||||
|
||||
/datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/M, force)
|
||||
handle_vehicle_offsets()
|
||||
handle_vehicle_offsets(M.buckled?.dir)
|
||||
|
||||
/datum/component/riding/proc/handle_vehicle_layer(dir)
|
||||
var/atom/movable/AM = parent
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
|
||||
/obj/item/clothing/head/mob_holder/dropped(mob/user)
|
||||
. = ..()
|
||||
if(held_mob && isturf(loc))//don't release on soft-drops
|
||||
if(held_mob && !ismob(loc))//don't release on soft-drops
|
||||
release()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/proc/release()
|
||||
|
||||
@@ -239,8 +239,13 @@ GLOBAL_LIST_EMPTY(explosions)
|
||||
atoms += A
|
||||
for(var/i in atoms)
|
||||
var/atom/A = i
|
||||
if(!QDELETED(A))
|
||||
A.ex_act(dist)
|
||||
if(QDELETED(A))
|
||||
continue
|
||||
A.ex_act(dist, null, src)
|
||||
if(QDELETED(A) || !ismovable(A))
|
||||
continue
|
||||
var/atom/movable/AM = A
|
||||
LAZYADD(AM.acted_explosions, explosion_id)
|
||||
|
||||
if(flame_dist && prob(40) && !isspaceturf(T) && !T.density)
|
||||
new /obj/effect/hotspot(T) //Mostly for ambience!
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
var/antag_removal_text // Text will be given to the quirk holder if they get an antag that has it blacklisted.
|
||||
var/mood_quirk = FALSE //if true, this quirk affects mood and is unavailable if moodlets are disabled
|
||||
var/mob_trait //if applicable, apply and remove this mob trait
|
||||
/// should we immediately call on_spawn or add a timer to trigger
|
||||
var/on_spawn_immediate = TRUE
|
||||
var/mob/living/quirk_holder
|
||||
|
||||
/datum/quirk/New(mob/living/quirk_mob, spawn_effects)
|
||||
@@ -26,7 +28,10 @@
|
||||
START_PROCESSING(SSquirks, src)
|
||||
add()
|
||||
if(spawn_effects)
|
||||
on_spawn()
|
||||
if(on_spawn_immediate)
|
||||
on_spawn()
|
||||
else
|
||||
addtimer(CALLBACK(src, .proc/on_spawn), 0)
|
||||
addtimer(CALLBACK(src, .proc/post_add), 30)
|
||||
|
||||
/datum/quirk/Destroy()
|
||||
|
||||
@@ -184,6 +184,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
|
||||
gain_text = null // Handled by trauma.
|
||||
lose_text = null
|
||||
medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities."
|
||||
on_spawn_immediate = FALSE
|
||||
|
||||
/datum/quirk/paraplegic/add()
|
||||
var/datum/brain_trauma/severe/paralysis/paraplegic/T = new()
|
||||
|
||||
@@ -99,6 +99,9 @@
|
||||
///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy()
|
||||
var/list/targeted_by
|
||||
|
||||
///Reference to atom being orbited
|
||||
var/atom/orbit_target
|
||||
|
||||
/**
|
||||
* Called when an atom is created in byond (built in engine proc)
|
||||
*
|
||||
@@ -548,7 +551,7 @@
|
||||
/atom/proc/contents_explosion(severity, target)
|
||||
return //For handling the effects of explosions on contents that would not normally be effected
|
||||
|
||||
/atom/proc/ex_act(severity, target)
|
||||
/atom/proc/ex_act(severity, target, datum/explosion/E)
|
||||
set waitfor = FALSE
|
||||
contents_explosion(severity, target)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
circuit = /obj/item/circuitboard/machine/cell_charger
|
||||
pass_flags = PASSTABLE
|
||||
var/obj/item/stock_parts/cell/charging = null
|
||||
var/charge_rate = 500
|
||||
var/recharge_coeff = 1
|
||||
|
||||
/obj/machinery/cell_charger/update_overlays()
|
||||
. += ..()
|
||||
@@ -28,9 +28,10 @@
|
||||
. = ..()
|
||||
. += "There's [charging ? "a" : "no"] cell in the charger."
|
||||
if(charging)
|
||||
. += "Current charge: [round(charging.percent(), 1)]%."
|
||||
var/obj/item/stock_parts/cell/C = charging.get_cell()
|
||||
. += "Current charge: [C.percent()]%."
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
. += "<span class='notice'>The status display reads: Charge rate at <b>[charge_rate]J</b> per cycle.</span>"
|
||||
. += "<span class='notice'>The status display reads: Charge rate at <b>[recharge_coeff*10]J</b> per cycle.</span>"
|
||||
|
||||
/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/stock_parts/cell) && !panel_open)
|
||||
@@ -122,17 +123,18 @@
|
||||
charging.emp_act(severity)
|
||||
|
||||
/obj/machinery/cell_charger/RefreshParts()
|
||||
charge_rate = 500
|
||||
for(var/obj/item/stock_parts/capacitor/C in component_parts)
|
||||
charge_rate *= C.rating
|
||||
recharge_coeff = C.rating
|
||||
|
||||
/obj/machinery/cell_charger/process()
|
||||
if(!charging || !anchored || (stat & (BROKEN|NOPOWER)))
|
||||
return
|
||||
|
||||
if(charging.percent() >= 100)
|
||||
return
|
||||
use_power(charge_rate)
|
||||
charging.give(charge_rate) //this is 2558, efficient batteries exist
|
||||
if(charging)
|
||||
var/obj/item/stock_parts/cell/C = charging.get_cell()
|
||||
if(C)
|
||||
if(C.charge < C.maxcharge)
|
||||
C.give(C.chargerate * recharge_coeff)
|
||||
use_power(250 * recharge_coeff)
|
||||
|
||||
update_icon()
|
||||
|
||||
@@ -6,10 +6,12 @@
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/colormate
|
||||
var/obj/item/inserted
|
||||
var/atom/movable/inserted
|
||||
var/activecolor = "#FFFFFF"
|
||||
var/list/color_matrix_last
|
||||
var/matrix_mode = FALSE
|
||||
/// Allow holder'd mobs
|
||||
var/allow_mobs = TRUE
|
||||
/// Minimum lightness for normal mode
|
||||
var/minimum_normal_lightness = 50
|
||||
/// Minimum lightness for matrix mode, tested using 4 test colors of full red, green, blue, white.
|
||||
@@ -57,11 +59,22 @@
|
||||
return
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
if(allow_mobs && istype(I, /obj/item/clothing/head/mob_holder))
|
||||
var/obj/item/clothing/head/mob_holder/H = I
|
||||
var/mob/victim = H.held_mob
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
|
||||
return
|
||||
if(!QDELETED(H))
|
||||
H.release()
|
||||
insert_mob(victim, user)
|
||||
|
||||
if(is_type_in_list(I, allowed_types) && is_operational())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
|
||||
return
|
||||
if(QDELETED(I))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] inserts [I] into [src]'s receptable.</span>")
|
||||
|
||||
inserted = I
|
||||
@@ -69,9 +82,22 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/gear_painter/proc/insert_mob(mob/victim, mob/user)
|
||||
if(inserted)
|
||||
return
|
||||
if(user)
|
||||
visible_message("<span class='warning'>[user] stuffs [victim] into [src]!</span>")
|
||||
inserted = victim
|
||||
inserted.forceMove(src)
|
||||
|
||||
/obj/machinery/gear_painter/AllowDrop()
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/gear_painter/handle_atom_del(atom/movable/AM)
|
||||
if(AM == inserted)
|
||||
inserted = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/gear_painter/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(!user.CanReach(src))
|
||||
|
||||
@@ -393,6 +393,27 @@
|
||||
spark_system.start() //creates some sparks because they look cool
|
||||
qdel(cover) //deletes the cover - no need on keeping it there!
|
||||
|
||||
//turret healing
|
||||
/obj/machinery/porta_turret/examine(mob/user)
|
||||
. = ..()
|
||||
if(obj_integrity < max_integrity)
|
||||
. += "<span class='notice'>[src] is damaged, use a lit welder to fix it.</span>"
|
||||
|
||||
/obj/machinery/porta_turret/welder_act(mob/living/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(cover && obj_integrity < max_integrity)
|
||||
if(!I.tool_start_check(user, amount=0))
|
||||
return
|
||||
user.visible_message("[user] is welding the turret.", \
|
||||
"<span class='notice'>You begin repairing the turret...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
if(I.use_tool(src, user, 40, volume=50))
|
||||
obj_integrity = max_integrity
|
||||
user.visible_message("[user.name] has repaired [src].", \
|
||||
"<span class='notice'>You finish repairing the turret.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The turret doesn't need repairing.</span>")
|
||||
|
||||
/obj/machinery/porta_turret/process()
|
||||
//the main machinery process
|
||||
if(cover == null && anchored) //if it has no cover and is anchored
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
name = "advanced fire extinguisher"
|
||||
desc = "Used to stop thermonuclear fires from spreading inside your engine."
|
||||
icon_state = "foam_extinguisher0"
|
||||
//item_state = "foam_extinguisher" needs sprite
|
||||
item_state = "foam_extinguisher"
|
||||
dog_fashion = null
|
||||
chem = /datum/reagent/firefighting_foam
|
||||
tanktype = /obj/structure/reagent_dispensers/foamtank
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination
|
||||
var/ignore_suit_sensor_level = FALSE // Do we find people even if their suit sensors are turned off
|
||||
var/alert = FALSE // TRUE to display things more seriously
|
||||
/// resets target on toggle
|
||||
var/resets_target = TRUE
|
||||
|
||||
/obj/item/pinpointer/Initialize()
|
||||
. = ..()
|
||||
@@ -27,7 +29,7 @@
|
||||
/obj/item/pinpointer/Destroy()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
GLOB.pinpointer_list -= src
|
||||
target = null
|
||||
unset_target()
|
||||
return ..()
|
||||
|
||||
/obj/item/pinpointer/DoRevenantThrowEffects(atom/target)
|
||||
@@ -41,7 +43,8 @@
|
||||
if(active)
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
else
|
||||
target = null
|
||||
if(resets_target)
|
||||
unset_target()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
update_icon()
|
||||
|
||||
@@ -54,6 +57,18 @@
|
||||
/obj/item/pinpointer/proc/scan_for_target()
|
||||
return
|
||||
|
||||
/obj/item/pinpointer/proc/set_target(atom/movable/newtarget)
|
||||
if(target)
|
||||
unset_target()
|
||||
target = newtarget
|
||||
RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/unset_target)
|
||||
|
||||
/obj/item/pinpointer/proc/unset_target()
|
||||
if(!target)
|
||||
return
|
||||
UnregisterSignal(target, COMSIG_PARENT_QDELETING)
|
||||
target = null
|
||||
|
||||
/obj/item/pinpointer/update_overlays()
|
||||
. = ..()
|
||||
if(!active)
|
||||
@@ -105,7 +120,8 @@
|
||||
active = FALSE
|
||||
user.visible_message("<span class='notice'>[user] deactivates [user.p_their()] pinpointer.</span>", "<span class='notice'>You deactivate your pinpointer.</span>")
|
||||
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
|
||||
target = null //Restarting the pinpointer forces a target reset
|
||||
if(resets_target)
|
||||
unset_target() //Restarting the pinpointer forces a target reset
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
update_icon()
|
||||
return
|
||||
@@ -141,7 +157,7 @@
|
||||
if(!A || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated())
|
||||
return
|
||||
|
||||
target = names[A]
|
||||
set_target(names[A])
|
||||
active = TRUE
|
||||
user.visible_message("<span class='notice'>[user] activates [user.p_their()] pinpointer.</span>", "<span class='notice'>You activate your pinpointer.</span>")
|
||||
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
|
||||
@@ -153,7 +169,7 @@
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(!trackable(H))
|
||||
target = null
|
||||
unset_target()
|
||||
if(!target) //target can be set to null from above code, or elsewhere
|
||||
active = FALSE
|
||||
|
||||
@@ -167,7 +183,7 @@
|
||||
. = ..()
|
||||
|
||||
/obj/item/pinpointer/pair/scan_for_target()
|
||||
target = other_pair
|
||||
set_target(other_pair)
|
||||
|
||||
/obj/item/pinpointer/pair/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -199,7 +215,7 @@
|
||||
shuttleport = SSshuttle.getShuttle("huntership")
|
||||
|
||||
/obj/item/pinpointer/shuttle/scan_for_target()
|
||||
target = shuttleport
|
||||
set_target(shuttleport)
|
||||
|
||||
/obj/item/pinpointer/shuttle/Destroy()
|
||||
shuttleport = null
|
||||
@@ -211,4 +227,8 @@
|
||||
icon_state = "pinpointer_ian"
|
||||
|
||||
/obj/item/pinpointer/ian/scan_for_target()
|
||||
target = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list
|
||||
set_target(locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list)
|
||||
|
||||
/obj/item/pinpointer/custom
|
||||
resets_target = FALSE
|
||||
|
||||
|
||||
@@ -113,12 +113,6 @@
|
||||
to_chat(src, "<span class='danger'>Error: Use the admin IRC/Discord channel, nerd.</span>", confidential = TRUE)
|
||||
return
|
||||
|
||||
//clean the message if it's not sent by a high-rank admin
|
||||
if(!check_rights(R_SERVER|R_DEBUG,0)||external)//no sending html to the poor bots
|
||||
msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
|
||||
if(!msg)
|
||||
return
|
||||
|
||||
else
|
||||
//get message text, limit it's length.and clean/escape html
|
||||
if(!msg)
|
||||
@@ -133,11 +127,16 @@
|
||||
else
|
||||
if(holder)
|
||||
to_chat(src, "<span class='danger'>Error: Admin-PM: Client not found.</span>", confidential = TRUE)
|
||||
to_chat(src, "<span class='danger'><b>Message not sent:</b></span><br>[msg]", confidential = TRUE)
|
||||
to_chat(src, "<span class='danger'><b>Message not sent:</b></span><br>[sanitize(msg)]", confidential = TRUE)
|
||||
if(recipient_ticket)
|
||||
recipient_ticket.AddInteraction("<b>No client found, message not sent:</b><br>[msg]")
|
||||
return
|
||||
else
|
||||
//clean the message if it's not sent by a high-rank admin
|
||||
if(!check_rights(R_SERVER|R_DEBUG,0)||external)//no sending html to the poor bots
|
||||
msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
|
||||
if(!msg)
|
||||
return
|
||||
current_ticket.MessageNoRecipient(msg)
|
||||
return
|
||||
|
||||
@@ -149,6 +148,12 @@
|
||||
if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
|
||||
return
|
||||
|
||||
//clean the message if it's not sent by a high-rank admin
|
||||
if(!check_rights(R_SERVER|R_DEBUG,0)||external)//no sending html to the poor bots
|
||||
msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
|
||||
if(!msg)
|
||||
return
|
||||
|
||||
var/rawmsg = msg
|
||||
|
||||
if(holder)
|
||||
|
||||
@@ -895,19 +895,23 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
continue
|
||||
var/class_link = ""
|
||||
var/list/loadout_item = has_loadout_gear(loadout_slot, "[gear.type]")
|
||||
var/extra_color_data = ""
|
||||
var/extra_loadout_data = ""
|
||||
if(loadout_item)
|
||||
class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=0'"
|
||||
if(gear.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC)
|
||||
extra_color_data += "<BR><a href='?_src_=prefs;preference=gear;loadout_color_polychromic=1;loadout_gear_name=[html_encode(gear.name)];'>Color</a>"
|
||||
extra_loadout_data += "<BR><a href='?_src_=prefs;preference=gear;loadout_color_polychromic=1;loadout_gear_name=[html_encode(gear.name)];'>Color</a>"
|
||||
for(var/loadout_color in loadout_item[LOADOUT_COLOR])
|
||||
extra_color_data += "<span style='border: 1px solid #161616; background-color: [loadout_color];'> </span>"
|
||||
extra_loadout_data += "<span style='border: 1px solid #161616; background-color: [loadout_color];'> </span>"
|
||||
else
|
||||
var/loadout_color_non_poly = "#FFFFFF"
|
||||
if(length(loadout_item[LOADOUT_COLOR]))
|
||||
loadout_color_non_poly = loadout_item[LOADOUT_COLOR][1]
|
||||
extra_color_data += "<BR><a href='?_src_=prefs;preference=gear;loadout_color=1;loadout_gear_name=[html_encode(gear.name)];'>Color</a>"
|
||||
extra_color_data += "<span style='border: 1px solid #161616; background-color: [loadout_color_non_poly];'> </span>"
|
||||
extra_loadout_data += "<BR><a href='?_src_=prefs;preference=gear;loadout_color=1;loadout_gear_name=[html_encode(gear.name)];'>Color</a>"
|
||||
extra_loadout_data += "<span style='border: 1px solid #161616; background-color: [loadout_color_non_poly];'> </span>"
|
||||
if(gear.loadout_flags & LOADOUT_CAN_NAME)
|
||||
extra_loadout_data += "<BR><a href='?_src_=prefs;preference=gear;loadout_rename=1;loadout_gear_name=[html_encode(gear.name)];'>Name</a> [loadout_item[LOADOUT_CUSTOM_NAME] ? loadout_item[LOADOUT_CUSTOM_NAME] : "N/A"]"
|
||||
if(gear.loadout_flags & LOADOUT_CAN_DESCRIPTION)
|
||||
extra_loadout_data += "<BR><a href='?_src_=prefs;preference=gear;loadout_redescribe=1;loadout_gear_name=[html_encode(gear.name)];'>Description</a>"
|
||||
else if((gear_points - gear.cost) < 0)
|
||||
class_link = "style='white-space:normal;' class='linkOff'"
|
||||
else if(donoritem)
|
||||
@@ -916,7 +920,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
class_link = "style='white-space:normal;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'"
|
||||
else
|
||||
class_link = "style='white-space:normal;background:#eb2e2e;' class='linkOff'"
|
||||
dat += "<tr style='vertical-align:top;'><td width=15%><a [class_link]>[name]</a>[extra_color_data]</td>"
|
||||
dat += "<tr style='vertical-align:top;'><td width=15%><a [class_link]>[name]</a>[extra_loadout_data]</td>"
|
||||
dat += "<td width = 5% style='vertical-align:top'>[gear.cost]</td><td>"
|
||||
if(islist(gear.restricted_roles))
|
||||
if(gear.restricted_roles.len)
|
||||
@@ -929,14 +933,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += gear.restricted_roles.Join(";")
|
||||
dat += "</font>"
|
||||
if(!istype(gear, /datum/gear/unlockable))
|
||||
dat += "</td><td><font size=2><i>[gear.description]</i></font></td></tr>"
|
||||
// the below line essentially means "if the loadout item is picked by the user and has a custom description, give it the custom description, otherwise give it the default description"
|
||||
dat += "</td><td><font size=2><i>[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description]</i></font></td></tr>"
|
||||
else
|
||||
//we add the user's progress to the description assuming they have progress
|
||||
var/datum/gear/unlockable/unlockable = gear
|
||||
var/progress_made = unlockable_loadout_data[unlockable.progress_key]
|
||||
if(!progress_made)
|
||||
progress_made = 0
|
||||
dat += "</td><td><font size=2><i>[gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required]</i></font></td></tr>"
|
||||
dat += "</td><td><font size=2><i>[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required]</i></font></td></tr>"
|
||||
|
||||
dat += "</table>"
|
||||
if(4) // Content preferences
|
||||
@@ -2700,7 +2705,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
loadout_data["SAVE_[loadout_slot]"] += list(new_loadout_data) //double packed because it does the union of the CONTENTS of the lists
|
||||
else
|
||||
loadout_data["SAVE_[loadout_slot]"] = list(new_loadout_data) //double packed because you somehow had no save slot in your loadout?
|
||||
if(href_list["loadout_color"])
|
||||
|
||||
if(href_list["loadout_color"] || href_list["loadout_color_polychromic"] || href_list["loadout_rename"] || href_list["loadout_redescribe"])
|
||||
//if the gear doesn't exist, or they don't have it, ignore the request
|
||||
var/name = html_decode(href_list["loadout_gear_name"])
|
||||
var/datum/gear/G = GLOB.loadout_items[gear_category][gear_subcategory][name]
|
||||
if(!G)
|
||||
@@ -2708,29 +2715,44 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/user_gear = has_loadout_gear(loadout_slot, "[G.type]")
|
||||
if(!user_gear)
|
||||
return
|
||||
if(!length(user_gear[LOADOUT_COLOR]))
|
||||
user_gear[LOADOUT_COLOR] = list("#FFFFFF")
|
||||
var/current_color = user_gear[LOADOUT_COLOR][1]
|
||||
var/new_color = input(user, "Polychromic options", "Choose Color", current_color) as color|null
|
||||
user_gear[LOADOUT_COLOR][1] = sanitize_hexcolor(new_color, 6, TRUE, current_color)
|
||||
if(href_list["loadout_color_polychromic"])
|
||||
var/name = html_decode(href_list["loadout_gear_name"])
|
||||
var/datum/gear/G = GLOB.loadout_items[gear_category][gear_subcategory][name]
|
||||
if(!G)
|
||||
return
|
||||
var/user_gear = has_loadout_gear(loadout_slot, "[G.type]")
|
||||
if(!user_gear)
|
||||
return
|
||||
var/list/color_options = list()
|
||||
for(var/i=1, i<=length(G.loadout_initial_colors), i++)
|
||||
color_options += "Color [i]"
|
||||
var/color_to_change = input(user, "Polychromic options", "Recolor [name]") as null|anything in color_options
|
||||
if(color_to_change)
|
||||
var/color_index = text2num(copytext(color_to_change, 7))
|
||||
var/current_color = user_gear[LOADOUT_COLOR][color_index]
|
||||
var/new_color = input(user, "Polychromic options", "Choose [color_to_change] Color", current_color) as color|null
|
||||
if(new_color)
|
||||
user_gear[LOADOUT_COLOR][color_index] = sanitize_hexcolor(new_color, 6, TRUE, current_color)
|
||||
|
||||
//possible requests: recolor, recolor (polychromic), rename, redescribe
|
||||
//always make sure the gear allows said request before proceeding
|
||||
|
||||
//non-poly coloring can only be done by non-poly items
|
||||
if(href_list["loadout_color"] && !(G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC))
|
||||
if(!length(user_gear[LOADOUT_COLOR]))
|
||||
user_gear[LOADOUT_COLOR] = list("#FFFFFF")
|
||||
var/current_color = user_gear[LOADOUT_COLOR][1]
|
||||
var/new_color = input(user, "Polychromic options", "Choose Color", current_color) as color|null
|
||||
user_gear[LOADOUT_COLOR][1] = sanitize_hexcolor(new_color, 6, TRUE, current_color)
|
||||
|
||||
//poly coloring can only be done by poly items
|
||||
if(href_list["loadout_color_polychromic"] && (G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC))
|
||||
var/list/color_options = list()
|
||||
for(var/i=1, i<=length(G.loadout_initial_colors), i++)
|
||||
color_options += "Color [i]"
|
||||
var/color_to_change = input(user, "Polychromic options", "Recolor [name]") as null|anything in color_options
|
||||
if(color_to_change)
|
||||
var/color_index = text2num(copytext(color_to_change, 7))
|
||||
var/current_color = user_gear[LOADOUT_COLOR][color_index]
|
||||
var/new_color = input(user, "Polychromic options", "Choose [color_to_change] Color", current_color) as color|null
|
||||
if(new_color)
|
||||
user_gear[LOADOUT_COLOR][color_index] = sanitize_hexcolor(new_color, 6, TRUE, current_color)
|
||||
|
||||
//both renaming and redescribing strip the input to stop html injection
|
||||
|
||||
//renaming is only allowed if it has the flag for it
|
||||
if(href_list["loadout_rename"] && (G.loadout_flags & LOADOUT_CAN_NAME))
|
||||
var/new_name = stripped_input(user, "Enter new name for item. Maximum [MAX_NAME_LEN] characters.", "Loadout Item Naming", null, MAX_NAME_LEN)
|
||||
if(new_name)
|
||||
user_gear[LOADOUT_CUSTOM_NAME] = new_name
|
||||
|
||||
//redescribing is only allowed if it has the flag for it
|
||||
if(href_list["loadout_redescribe"] && (G.loadout_flags & LOADOUT_CAN_DESCRIPTION)) //redescribe isnt a real word but i can't think of the right term to use
|
||||
var/new_description = stripped_input(user, "Enter new description for item. Maximum 500 characters.", "Loadout Item Redescribing", null, 500)
|
||||
if(new_description)
|
||||
user_gear[LOADOUT_CUSTOM_DESCRIPTION] = new_description
|
||||
|
||||
ShowChoices(user)
|
||||
return 1
|
||||
|
||||
@@ -33,6 +33,16 @@
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
|
||||
/obj/item/clothing/mask/surgical/aesthetic
|
||||
name = "aesthetic sterile mask"
|
||||
desc = "A sterile mask designed to help prevent the spread of diseases. This one doesn't seem like it does a whole lot, somehow."
|
||||
flags_inv = HIDEFACE
|
||||
flags_cover = null
|
||||
visor_flags_inv = null
|
||||
visor_flags_cover = null
|
||||
permeability_coefficient = 1
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/obj/item/clothing/mask/surgical/attack_self(mob/user)
|
||||
adjustmask(user)
|
||||
|
||||
|
||||
@@ -237,6 +237,12 @@
|
||||
icon_state = "choker"
|
||||
poly_colors = list("#222222")
|
||||
|
||||
/obj/item/clothing/neck/necklace/cowbell
|
||||
name = "cowbell collar"
|
||||
desc = "Who would wear this? Take this off, you aren't a cow, you're just an awful degenerate."
|
||||
icon = 'icons/obj/clothing/neck.dmi'
|
||||
icon_state = "cowbell"
|
||||
|
||||
/obj/item/key/collar
|
||||
name = "Collar Key"
|
||||
desc = "A key for a tiny lock on a collar or bag."
|
||||
|
||||
@@ -79,13 +79,175 @@
|
||||
if(initial(above_suit))
|
||||
. += "<span class='notice'>\The [src] can be worn above or below your suit. Alt-click to toggle.</span>"
|
||||
|
||||
//////////////
|
||||
//Waistcoats//
|
||||
//////////////
|
||||
|
||||
/obj/item/clothing/accessory/waistcoat
|
||||
name = "waistcoat"
|
||||
name = "black waistcoat"
|
||||
desc = "For some classy, murderous fun."
|
||||
icon_state = "waistcoat"
|
||||
item_state = "waistcoat"
|
||||
minimize_when_attached = FALSE
|
||||
|
||||
/obj/item/clothing/accessory/waistcoat/red
|
||||
name = "red waistcoat"
|
||||
icon_state = "waistcoat_red"
|
||||
item_state = "waistcoat_red"
|
||||
|
||||
/obj/item/clothing/accessory/waistcoat/grey
|
||||
name = "grey waistcoat"
|
||||
icon_state = "waistcoat_grey"
|
||||
item_state = "waistcoat_grey"
|
||||
|
||||
/obj/item/clothing/accessory/waistcoat/brown
|
||||
name = "red waistcoat"
|
||||
icon_state = "waistcoat_brown"
|
||||
item_state = "waistcoat_brown"
|
||||
|
||||
/obj/item/clothing/accessory/waistcoat/sweatervest
|
||||
name = "black sweatervest"
|
||||
icon_state = "sweatervest"
|
||||
item_state = "sweatervest"
|
||||
|
||||
/obj/item/clothing/accessory/waistcoat/sweatervest/blue
|
||||
name = "blue sweatervest"
|
||||
icon_state = "sweatervest_blue"
|
||||
item_state = "sweatervest_blue"
|
||||
|
||||
/obj/item/clothing/accessory/waistcoat/sweatervest/red
|
||||
name = "red sweatervest"
|
||||
icon_state = "sweatervest_red"
|
||||
item_state = "sweatervest_red"
|
||||
|
||||
////////////
|
||||
//Sweaters//
|
||||
////////////
|
||||
|
||||
/obj/item/clothing/accessory/sweater
|
||||
name = "grey sweater"
|
||||
desc = "Nicely comfy and warm!"
|
||||
icon_state = "sweater"
|
||||
item_state = "sweater"
|
||||
minimize_when_attached = FALSE
|
||||
|
||||
/obj/item/clothing/accessory/sweater/pink
|
||||
name = "pink sweater"
|
||||
icon_state = "sweater_pink"
|
||||
item_state = "sweater_pink"
|
||||
|
||||
/obj/item/clothing/accessory/sweater/heart
|
||||
name = "heart sweater"
|
||||
icon_state = "sweater_heart"
|
||||
item_state = "sweater_heart"
|
||||
|
||||
/obj/item/clothing/accessory/sweater/blue
|
||||
name = "blue sweater"
|
||||
icon_state = "sweater_blue"
|
||||
item_state = "sweater_blue"
|
||||
|
||||
/obj/item/clothing/accessory/sweater/nt
|
||||
name = "nanotrasen sweater"
|
||||
icon_state = "sweater_nt"
|
||||
item_state = "sweater_nt"
|
||||
|
||||
/obj/item/clothing/accessory/sweater/mint
|
||||
name = "mint sweater"
|
||||
icon_state = "sweater_mint"
|
||||
item_state = "sweater_mint"
|
||||
|
||||
/obj/item/clothing/accessory/sweater/shoulderless
|
||||
name = "shoulderless sweater"
|
||||
icon_state = "sweater_shoulderless"
|
||||
item_state = "sweater_shoulderless"
|
||||
|
||||
/obj/item/clothing/accessory/sweater/uglyxmas
|
||||
name = "ugly xmas sweater"
|
||||
icon_state = "sweater_uglyxmas"
|
||||
item_state = "sweater_uglyxmas"
|
||||
|
||||
/obj/item/clothing/accessory/sweater/flower
|
||||
name = "flower sweater"
|
||||
icon_state = "sweater_flower"
|
||||
item_state = "sweater_flower"
|
||||
|
||||
////////////////
|
||||
//Suit Jackets//
|
||||
////////////////
|
||||
|
||||
/obj/item/clothing/accessory/suitjacket
|
||||
name = "tan suit jacket"
|
||||
desc = "For those times when you have to attend a fancy business meeting without wearing your pants."
|
||||
icon_state = "jacket_tan"
|
||||
item_state = "jacket_tan"
|
||||
minimize_when_attached = FALSE
|
||||
|
||||
/obj/item/clothing/accessory/suitjacket/charcoal
|
||||
name = "charcoal suit jacket"
|
||||
icon_state = "jacket_charcoal"
|
||||
item_state = "jacket_charcoal"
|
||||
|
||||
/obj/item/clothing/accessory/suitjacket/navy
|
||||
name = "navy suit jacket"
|
||||
icon_state = "jacket_navy"
|
||||
item_state = "jacket_navy"
|
||||
|
||||
/obj/item/clothing/accessory/suitjacket/burgundy
|
||||
name = "burgundy suit jacket"
|
||||
icon_state = "jacket_burgundy"
|
||||
item_state = "jacket_burgundy"
|
||||
|
||||
/obj/item/clothing/accessory/suitjacket/checkered
|
||||
name = "checkered suit jacket"
|
||||
icon_state = "jacket_checkered"
|
||||
item_state = "jacket_checkered"
|
||||
|
||||
///////////////////////
|
||||
//Tactical Turtlnecks//
|
||||
///////////////////////
|
||||
|
||||
/obj/item/clothing/accessory/turtleneck
|
||||
name = "black turtleneck"
|
||||
desc = "Extra cool. Extra fool."
|
||||
icon_state = "turtleneck"
|
||||
item_state = "turtleneck"
|
||||
minimize_when_attached = FALSE
|
||||
|
||||
/obj/item/clothing/accessory/turtleneck/red
|
||||
name = "red turtleneck"
|
||||
icon_state = "turtleneck_red"
|
||||
item_state = "turtleneck_red"
|
||||
|
||||
/obj/item/clothing/accessory/turtleneck/comfy
|
||||
name = "comfy turtleneck"
|
||||
icon_state = "turtleneck_comfy"
|
||||
item_state = "turtleneck_comfy"
|
||||
|
||||
/obj/item/clothing/accessory/turtleneck/tactifool
|
||||
name = "black sweaterneck"
|
||||
desc = "Extra fool. Extra cool."
|
||||
icon_state = "tactifool"
|
||||
item_state = "tactifool"
|
||||
|
||||
/obj/item/clothing/accessory/turtleneck/tactifool/green
|
||||
name = "green sweaterneck"
|
||||
icon_state = "tactifool_green"
|
||||
item_state = "tactifool_green"
|
||||
|
||||
/obj/item/clothing/accessory/turtleneck/tactifool/blue
|
||||
name = "blue sweaterneck"
|
||||
icon_state = "tactifool_blue"
|
||||
item_state = "tactifool_blue"
|
||||
|
||||
/obj/item/clothing/accessory/turtleneck/tactifool/syndicate
|
||||
name = "tactifool sweaterneck"
|
||||
icon_state = "tactifool_syndicate"
|
||||
item_state = "tactifool_syndicate"
|
||||
|
||||
/////////////////
|
||||
//Miscellaneous//
|
||||
/////////////////
|
||||
|
||||
/obj/item/clothing/accessory/maidapron
|
||||
name = "maid apron"
|
||||
desc = "The best part of a maid costume."
|
||||
|
||||
@@ -137,6 +137,10 @@
|
||||
//Shooting Code:
|
||||
A.preparePixelProjectile(target, src)
|
||||
A.fire()
|
||||
if(ismob(loc.loc))
|
||||
installed_gun.shoot_live_shot(loc.loc)
|
||||
else
|
||||
installed_gun.shoot_live_shot() //Shitcode, but we don't have much of a choice
|
||||
log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
|
||||
return A
|
||||
|
||||
|
||||
@@ -522,7 +522,7 @@
|
||||
max_charges = 1
|
||||
item_flags = NEEDS_PERMIT | NOBLUDGEON
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force = 18
|
||||
force = 15
|
||||
|
||||
/obj/item/ammo_casing/magic/hook
|
||||
name = "hook"
|
||||
@@ -536,11 +536,11 @@
|
||||
icon_state = "hook"
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
pass_flags = PASSTABLE
|
||||
damage = 25
|
||||
armour_penetration = 100
|
||||
damage = 15
|
||||
armour_penetration = 10
|
||||
knockdown = 5
|
||||
damage_type = BRUTE
|
||||
hitsound = 'sound/effects/splat.ogg'
|
||||
knockdown = 30
|
||||
var/chain
|
||||
|
||||
/obj/item/projectile/hook/fire(setAngle)
|
||||
|
||||
@@ -250,6 +250,8 @@
|
||||
if(points)
|
||||
if(I)
|
||||
I.mining_points += points
|
||||
if(usr.client)
|
||||
usr.client.increment_progress("miner", points)
|
||||
points = 0
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>No ID detected.</span>")
|
||||
|
||||
@@ -20,25 +20,6 @@
|
||||
data["totalPoints"] = points
|
||||
return data
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
if("Claim")
|
||||
var/mob/M = usr
|
||||
var/obj/item/card/id/I = M.get_idcard(TRUE)
|
||||
if(points)
|
||||
if(I)
|
||||
I.mining_points += points
|
||||
if(usr.client)
|
||||
usr.client.increment_progress("miner", points)
|
||||
points = 0
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>No ID detected.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>No points to claim.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/point_bank/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
name = "Bald"
|
||||
icon_state = "bald"
|
||||
|
||||
/datum/sprite_accessory/hair/adhara
|
||||
name = "Adhara"
|
||||
icon_state = "hair_adhara"
|
||||
|
||||
/datum/sprite_accessory/hair/afro
|
||||
name = "Afro"
|
||||
icon_state = "hair_afro"
|
||||
@@ -29,6 +33,14 @@
|
||||
name = "Ahoge"
|
||||
icon_state = "hair_antenna"
|
||||
|
||||
/datum/sprite_accessory/hair/amazon
|
||||
name = "Amazon"
|
||||
icon_state = "hair_amazon"
|
||||
|
||||
/datum/sprite_accessory/hair/anita
|
||||
name = "Anita"
|
||||
icon_state = "hair_anita"
|
||||
|
||||
/datum/sprite_accessory/hair/balding
|
||||
name = "Balding Hair"
|
||||
icon_state = "hair_e"
|
||||
@@ -61,6 +73,18 @@
|
||||
name = "Beehive 2"
|
||||
icon_state = "hair_beehive2"
|
||||
|
||||
/datum/sprite_accessory/hair/belenko
|
||||
name = "Beleneko"
|
||||
icon_state = "hair_belenko"
|
||||
|
||||
/datum/sprite_accessory/hair/belenkotied
|
||||
name = "Belenko (Tied)"
|
||||
icon_state = "hair_belenkotied"
|
||||
|
||||
/datum/sprite_accessory/hair/belle
|
||||
name = "Belle"
|
||||
icon_state = "hair_belle"
|
||||
|
||||
/datum/sprite_accessory/hair/bob
|
||||
name = "Bob Hair"
|
||||
icon_state = "hair_bob"
|
||||
@@ -309,6 +333,10 @@
|
||||
name = "Flow Hair"
|
||||
icon_state = "hair_f"
|
||||
|
||||
/datum/sprite_accessory/hair/fluffy
|
||||
name = "Fluffy"
|
||||
icon_state = "hair_fluffy"
|
||||
|
||||
/datum/sprite_accessory/hair/fringetail
|
||||
name = "Fringe Tail"
|
||||
icon_state = "hair_fringetail"
|
||||
@@ -365,6 +393,10 @@
|
||||
name = "Hitop"
|
||||
icon_state = "hair_hitop"
|
||||
|
||||
/datum/sprite_accessory/hair/inkling
|
||||
name = "Inkling"
|
||||
icon_state = "hair_inkling"
|
||||
|
||||
/datum/sprite_accessory/hair/jade
|
||||
name = "Jade"
|
||||
icon_state = "hair_jade"
|
||||
@@ -373,6 +405,10 @@
|
||||
name = "Jensen"
|
||||
icon_state = "hair_jensen"
|
||||
|
||||
/datum/sprite_accessory/hair/jessica
|
||||
name = "Jessica"
|
||||
icon_state = "hair_jessica"
|
||||
|
||||
/datum/sprite_accessory/hair/joestar
|
||||
name = "Joestar"
|
||||
icon_state = "hair_joestar"
|
||||
@@ -389,6 +425,10 @@
|
||||
name = "Kusanagi"
|
||||
icon_state = "hair_kusanagi"
|
||||
|
||||
/datum/sprite_accessory/hair/kleeia
|
||||
name = "Kleeia"
|
||||
icon_state = "hair_kleeia"
|
||||
|
||||
/datum/sprite_accessory/hair/long
|
||||
name = "Long Hair 1"
|
||||
icon_state = "hair_long"
|
||||
@@ -445,6 +485,10 @@
|
||||
name = "Mohawk"
|
||||
icon_state = "hair_d"
|
||||
|
||||
/datum/sprite_accessory/hair/newyou
|
||||
name = "New You"
|
||||
icon_state = "hair_newyou"
|
||||
|
||||
/datum/sprite_accessory/hair/reversemohawk
|
||||
name = "Mohawk (Reverse)"
|
||||
icon_state = "hair_reversemohawk"
|
||||
@@ -575,6 +619,10 @@
|
||||
name = "Ponytail (Side) 4"
|
||||
icon_state = "hair_sidetail4"
|
||||
|
||||
/datum/sprite_accessory/hair/sharptail
|
||||
name = "Ponytail (Sharp)"
|
||||
icon_state = "hair_sharptail"
|
||||
|
||||
/datum/sprite_accessory/hair/spikytail
|
||||
name = "Ponytail (Spiky)"
|
||||
icon_state = "hair_spikyponytail"
|
||||
@@ -679,6 +727,26 @@
|
||||
name = "Skinhead"
|
||||
icon_state = "hair_skinhead"
|
||||
|
||||
/datum/sprite_accessory/hair/simple
|
||||
name = "Simple"
|
||||
icon_state = "hair_simple"
|
||||
|
||||
/datum/sprite_accessory/hair/skrellvshort
|
||||
name = "Skrell Replicant (Very Short)"
|
||||
icon_state = "hair_skrellvshort"
|
||||
|
||||
/datum/sprite_accessory/hair/skrellshort
|
||||
name = "Skrell Replicant (Short)"
|
||||
icon_state = "hair_skrellshort"
|
||||
|
||||
/datum/sprite_accessory/hair/skrell
|
||||
name = "Skrell Replicant (Average)"
|
||||
icon_state = "hair_skrell"
|
||||
|
||||
/datum/sprite_accessory/hair/skrelllong
|
||||
name = "Skrell Replicant (Long)"
|
||||
icon_state = "hair_skrelllong"
|
||||
|
||||
/datum/sprite_accessory/hair/sleaze
|
||||
name = "Sleaze"
|
||||
icon_state = "hair_sleaze"
|
||||
@@ -699,6 +767,10 @@
|
||||
name = "Spiky 3"
|
||||
icon_state = "hair_spiky2"
|
||||
|
||||
/datum/sprite_accessory/hair/supernova
|
||||
name = "Supernova"
|
||||
icon_state = "hair_supernova"
|
||||
|
||||
/datum/sprite_accessory/hair/swept
|
||||
name = "Swept Back Hair"
|
||||
icon_state = "hair_swept"
|
||||
@@ -743,6 +815,10 @@
|
||||
name = "Trimmed (Flat)"
|
||||
icon_state = "hair_trimflat"
|
||||
|
||||
/datum/sprite_accessory/hair/twincurls
|
||||
name = "Twincurls"
|
||||
icon_state = "hair_twincurls"
|
||||
|
||||
/datum/sprite_accessory/hair/twintails
|
||||
name = "Twintails"
|
||||
icon_state = "hair_twintail"
|
||||
@@ -787,6 +863,10 @@
|
||||
name = "Very Short Over Eye (Alt)"
|
||||
icon_state = "hair_veryshortovereyealternate"
|
||||
|
||||
/datum/sprite_accessory/hair/vivi
|
||||
name = "Vivi"
|
||||
icon_state = "hair_vivi"
|
||||
|
||||
/datum/sprite_accessory/hair/volaju
|
||||
name = "Volaju"
|
||||
icon_state = "hair_volaju"
|
||||
|
||||
@@ -88,6 +88,10 @@
|
||||
name = "Pantyhose"
|
||||
icon_state = "pantyhose"
|
||||
|
||||
/datum/sprite_accessory/underwear/socks/pantyhose_ripped
|
||||
name = "Pantyhose - Ripped"
|
||||
icon_state = "pantyhose_ripped"
|
||||
|
||||
/datum/sprite_accessory/underwear/socks/socks_short
|
||||
name = "Short"
|
||||
icon_state = "socks_short"
|
||||
|
||||
@@ -343,6 +343,20 @@
|
||||
icon_state = "fishnet_body"
|
||||
gender = FEMALE
|
||||
|
||||
/datum/sprite_accessory/underwear/top/shibari
|
||||
name = "Shibari Ropes"
|
||||
icon_state = "shibari"
|
||||
gender = FEMALE
|
||||
has_color = TRUE
|
||||
covers_chest = FALSE
|
||||
|
||||
/datum/sprite_accessory/underwear/top/shibari_sleeved
|
||||
name = "Shibari Ropes - sleeves"
|
||||
icon_state = "shibari_sleeves"
|
||||
gender = FEMALE
|
||||
has_color = TRUE
|
||||
covers_chest = FALSE
|
||||
|
||||
/datum/sprite_accessory/underwear/top/swimsuit
|
||||
name = "Swimsuit Top"
|
||||
icon_state = "bra_swimming"
|
||||
|
||||
@@ -556,7 +556,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
var/list/dest = list() //List of possible destinations (mobs)
|
||||
var/target = null //Chosen target.
|
||||
|
||||
dest += getpois(mobs_only=1) //Fill list, prompt user with list
|
||||
dest += getpois(mobs_only = TRUE) //Fill list, prompt user with list
|
||||
target = input("Please, select a player!", "Jump to Mob", null, null) as null|anything in dest
|
||||
|
||||
if (!target)//Make sure we actually have a target
|
||||
@@ -893,7 +893,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if (!eye_name)
|
||||
return
|
||||
|
||||
var/mob/mob_eye = creatures[eye_name]
|
||||
do_observe(creatures[eye_name])
|
||||
|
||||
/mob/dead/observer/proc/do_observe(mob/mob_eye)
|
||||
//Istype so we filter out points of interest that are not mobs
|
||||
if(client && mob_eye && istype(mob_eye))
|
||||
client.eye = mob_eye
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/orbit_menu
|
||||
var/mob/dead/observer/owner
|
||||
var/auto_observe = FALSE
|
||||
|
||||
/datum/orbit_menu/New(mob/dead/observer/new_owner)
|
||||
if(!istype(new_owner))
|
||||
@@ -10,6 +11,7 @@
|
||||
return GLOB.observer_state
|
||||
|
||||
/datum/orbit_menu/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if (!ui)
|
||||
ui = new(user, src, "Orbit")
|
||||
ui.open()
|
||||
@@ -18,15 +20,35 @@
|
||||
if (..())
|
||||
return
|
||||
|
||||
if (action == "orbit")
|
||||
var/ref = params["ref"]
|
||||
var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list)
|
||||
if (poi != null)
|
||||
switch(action)
|
||||
if ("orbit")
|
||||
var/ref = params["ref"]
|
||||
var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list)
|
||||
if (poi == null)
|
||||
. = TRUE
|
||||
return
|
||||
owner.ManualFollow(poi)
|
||||
owner.reset_perspective(null)
|
||||
if (auto_observe)
|
||||
owner.do_observe(poi)
|
||||
. = TRUE
|
||||
if ("refresh")
|
||||
update_static_data(owner, ui)
|
||||
. = TRUE
|
||||
if ("toggle_observe")
|
||||
auto_observe = !auto_observe
|
||||
if (auto_observe && owner.orbit_target)
|
||||
owner.do_observe(owner.orbit_target)
|
||||
else
|
||||
owner.reset_perspective(null)
|
||||
|
||||
/datum/orbit_menu/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["auto_observe"] = auto_observe
|
||||
return data
|
||||
|
||||
/datum/orbit_menu/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
var/list/alive = list()
|
||||
var/list/antagonists = list()
|
||||
var/list/dead = list()
|
||||
@@ -34,7 +56,7 @@
|
||||
var/list/misc = list()
|
||||
var/list/npcs = list()
|
||||
|
||||
var/list/pois = getpois(skip_mindless = 1)
|
||||
var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE)
|
||||
for (var/name in pois)
|
||||
var/list/serialized = list()
|
||||
serialized["name"] = name
|
||||
@@ -80,7 +102,7 @@
|
||||
data["npcs"] = npcs
|
||||
|
||||
return data
|
||||
|
||||
|
||||
/datum/orbit_menu/ui_assets()
|
||||
. = ..() || list()
|
||||
. += get_asset_datum(/datum/asset/simple/orbit)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//This is the proc for gibbing a mob. Cannot gib ghosts.
|
||||
//added different sort of gibs and animations. N
|
||||
/mob/proc/gib()
|
||||
/mob/proc/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
|
||||
return
|
||||
|
||||
//This is the proc for turning a mob into ash. Mostly a copy of gib code (above).
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
if(SSticker.mode)
|
||||
SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
|
||||
|
||||
/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts)
|
||||
/mob/living/carbon/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
|
||||
var/atom/Tsec = drop_location()
|
||||
for(var/mob/M in src)
|
||||
if(M in stomach_contents)
|
||||
@@ -27,7 +27,7 @@
|
||||
"<span class='danger'>You burst out of [src]!</span>")
|
||||
..()
|
||||
|
||||
/mob/living/carbon/spill_organs(no_brain, no_organs, no_bodyparts)
|
||||
/mob/living/carbon/spill_organs(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
|
||||
var/atom/Tsec = drop_location()
|
||||
if(!no_bodyparts)
|
||||
if(no_organs)//so the organs don't get transfered inside the bodyparts we'll drop.
|
||||
@@ -41,6 +41,8 @@
|
||||
qdel(O) //so the brain isn't transfered to the head when the head drops.
|
||||
continue
|
||||
if(!(O.organ_flags & ORGAN_NO_DISMEMBERMENT) && check_zone(O.zone) == BODY_ZONE_CHEST)
|
||||
if(was_explosion)
|
||||
LAZYADD(O.acted_explosions, was_explosion.explosion_id)
|
||||
O.Remove()
|
||||
O.forceMove(Tsec)
|
||||
O.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
|
||||
@@ -50,13 +52,16 @@
|
||||
if(I.organ_flags & ORGAN_NO_DISMEMBERMENT || (no_brain && istype(I, /obj/item/organ/brain)) || (no_organs && !istype(I, /obj/item/organ/brain)))
|
||||
qdel(I)
|
||||
continue
|
||||
if(was_explosion)
|
||||
LAZYADD(I.acted_explosions, was_explosion.explosion_id)
|
||||
I.Remove()
|
||||
I.forceMove(Tsec)
|
||||
I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
|
||||
|
||||
|
||||
/mob/living/carbon/spread_bodyparts()
|
||||
/mob/living/carbon/spread_bodyparts(no_brain, no_organs, datum/explosion/was_explosion)
|
||||
for(var/X in bodyparts)
|
||||
var/obj/item/bodypart/BP = X
|
||||
if(was_explosion)
|
||||
LAZYADD(BP.acted_explosions, was_explosion.explosion_id)
|
||||
BP.drop_limb()
|
||||
BP.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
|
||||
|
||||
@@ -938,43 +938,43 @@
|
||||
admin_ticket_log(src, msg)
|
||||
|
||||
/mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user)
|
||||
if(pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS)
|
||||
var/GS_needed = istype(target, /mob/living/silicon/pai)? GRAB_PASSIVE : GRAB_AGGRESSIVE
|
||||
if(pulling == target && grab_state >= GS_needed && stat == CONSCIOUS)
|
||||
//If they dragged themselves and we're currently aggressively grabbing them try to piggyback
|
||||
if(user == target && can_piggyback(target))
|
||||
piggyback(target)
|
||||
return
|
||||
//If you dragged them to you and you're aggressively grabbing try to fireman carry them
|
||||
else if(user != target)
|
||||
else if(user == src)
|
||||
if(user.a_intent == INTENT_GRAB)
|
||||
fireman_carry(target)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
//src is the user that will be carrying, target is the mob to be carried
|
||||
/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/target)
|
||||
return (istype(target) && target.stat == CONSCIOUS)
|
||||
/mob/living/carbon/human/proc/can_piggyback(mob/living/target)
|
||||
return (iscarbon(target) || ispAI(target)) && target.stat == CONSCIOUS
|
||||
|
||||
/mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target)
|
||||
return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND))
|
||||
return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND)) || ispAI(target)
|
||||
|
||||
/mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target)
|
||||
var/carrydelay = 50 //if you have latex you are faster at grabbing
|
||||
var/skills_space = "" //cobby told me to do this
|
||||
if(HAS_TRAIT(src, TRAIT_QUICKER_CARRY))
|
||||
carrydelay = 30
|
||||
skills_space = "expertly"
|
||||
skills_space = "expertly "
|
||||
else if(HAS_TRAIT(src, TRAIT_QUICK_CARRY))
|
||||
carrydelay = 40
|
||||
skills_space = "quickly"
|
||||
skills_space = "quickly "
|
||||
if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
|
||||
visible_message("<span class='notice'>[src] starts [skills_space] lifting [target] onto their back..</span>",
|
||||
visible_message("<span class='notice'>[src] starts [skills_space]lifting [target] onto their back..</span>",
|
||||
//Joe Medic starts quickly/expertly lifting Grey Tider onto their back..
|
||||
"<span class='notice'>[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]</span>")
|
||||
"<span class='notice'>[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space]start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]</span>")
|
||||
//(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...)
|
||||
if(do_after(src, carrydelay, TRUE, target))
|
||||
//Second check to make sure they're still valid to be carried
|
||||
if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
|
||||
target.set_resting(FALSE, TRUE)
|
||||
buckle_mob(target, TRUE, TRUE, 90, 1, 0, TRUE)
|
||||
return
|
||||
visible_message("<span class='warning'>[src] fails to fireman carry [target]!")
|
||||
@@ -992,13 +992,13 @@
|
||||
if(target.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE))
|
||||
target.visible_message("<span class='warning'>[target] can't hang onto [src]!</span>")
|
||||
return
|
||||
buckle_mob(target, TRUE, TRUE, FALSE, 1, 2, FALSE)
|
||||
buckle_mob(target, TRUE, TRUE, 0, 1, 2, FALSE)
|
||||
else
|
||||
visible_message("<span class='warning'>[target] fails to climb onto [src]!</span>")
|
||||
else
|
||||
to_chat(target, "<span class='warning'>You can't piggyback ride [src] right now!</span>")
|
||||
|
||||
/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = FALSE, hands_needed = 0, target_hands_needed = 0, fireman = FALSE)
|
||||
/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = 0, hands_needed = 0, target_hands_needed = 0, fireman = FALSE)
|
||||
if(!force)//humans are only meant to be ridden through piggybacking and special cases
|
||||
return
|
||||
if(!is_type_in_typecache(target, can_ride_typecache))
|
||||
@@ -1010,6 +1010,9 @@
|
||||
riding_datum.ride_check_rider_restrained = TRUE
|
||||
if(buckled_mobs && ((target in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled)
|
||||
return
|
||||
if(istype(target, /mob/living/silicon/pai))
|
||||
hands_needed = 1
|
||||
target_hands_needed = 0
|
||||
var/equipped_hands_self
|
||||
var/equipped_hands_target
|
||||
if(hands_needed)
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
var/list/datum/bioware = list()
|
||||
|
||||
var/creamed = FALSE //to use with creampie overlays
|
||||
var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot))
|
||||
var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot, /mob/living/silicon/pai))
|
||||
var/lastpuke = 0
|
||||
var/account_id
|
||||
var/last_fire_update
|
||||
|
||||
@@ -30,10 +30,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
|
||||
|
||||
/datum/species/dwarf/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
. = ..()
|
||||
var/dwarf_hair = pick("Beard (Dwarf)", "Beard (Very Long)", "Beard (Long)") //beard roullette
|
||||
var/mob/living/carbon/human/H = C
|
||||
H.facial_hair_style = dwarf_hair
|
||||
H.update_hair()
|
||||
H.AddElement(/datum/element/dwarfism, COMSIG_SPECIES_LOSS, src)
|
||||
RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) //We register handle_speech is being used.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/gib(no_brain, no_organs, no_bodyparts)
|
||||
/mob/living/gib(no_brain, no_organs, no_bodyparts, datum/explosion/was_explosion)
|
||||
var/prev_lying = lying
|
||||
if(stat != DEAD)
|
||||
death(1)
|
||||
@@ -6,22 +6,22 @@
|
||||
if(!prev_lying)
|
||||
gib_animation()
|
||||
|
||||
spill_organs(no_brain, no_organs, no_bodyparts)
|
||||
spill_organs(no_brain, no_organs, no_bodyparts, was_explosion)
|
||||
|
||||
if(!no_bodyparts)
|
||||
spread_bodyparts(no_brain, no_organs)
|
||||
spread_bodyparts(no_brain, no_organs, was_explosion)
|
||||
|
||||
for(var/X in implants)
|
||||
var/obj/item/implant/I = X
|
||||
qdel(I)
|
||||
|
||||
spawn_gibs(no_bodyparts)
|
||||
spawn_gibs(no_bodyparts, null, was_explosion)
|
||||
qdel(src)
|
||||
|
||||
/mob/living/proc/gib_animation()
|
||||
return
|
||||
|
||||
/mob/living/proc/spawn_gibs(with_bodyparts, atom/loc_override)
|
||||
/mob/living/proc/spawn_gibs(with_bodyparts, atom/loc_override, datum/explosion/was_explosion)
|
||||
var/location = loc_override ? loc_override.drop_location() : drop_location()
|
||||
if(mob_biotypes & MOB_ROBOTIC)
|
||||
new /obj/effect/gibspawner/robot(location, src, get_static_viruses())
|
||||
@@ -31,7 +31,7 @@
|
||||
/mob/living/proc/spill_organs()
|
||||
return
|
||||
|
||||
/mob/living/proc/spread_bodyparts()
|
||||
/mob/living/proc/spread_bodyparts(no_brain, no_organs, datum/explosion/was_explosion)
|
||||
return
|
||||
|
||||
/mob/living/dust(just_ash, drop_items, force)
|
||||
|
||||
@@ -143,6 +143,10 @@
|
||||
custom_holoform.Grant(src)
|
||||
emitter_next_use = world.time + 10 SECONDS
|
||||
|
||||
/mob/living/silicon/pai/deployed/Initialize()
|
||||
. = ..()
|
||||
fold_out(TRUE)
|
||||
|
||||
/mob/living/silicon/pai/ComponentInitialize()
|
||||
. = ..()
|
||||
if(possible_chassis[chassis])
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
if("PRG_edit")
|
||||
if(!computer || !authenticated || !target_id_card)
|
||||
return
|
||||
var/new_name = params["name"]
|
||||
var/new_name = reject_bad_name(params["name"])
|
||||
if(!new_name)
|
||||
return
|
||||
target_id_card.registered_name = new_name
|
||||
@@ -190,7 +190,7 @@
|
||||
return
|
||||
|
||||
if(target == "Custom")
|
||||
var/custom_name = params["custom_name"]
|
||||
var/custom_name = reject_bad_name(params["custom_name"])
|
||||
if(custom_name)
|
||||
target_id_card.assignment = custom_name
|
||||
target_id_card.update_label()
|
||||
|
||||
@@ -12,3 +12,7 @@
|
||||
|
||||
/datum/movespeed_modifier/reagent/nitryl
|
||||
multiplicative_slowdown = -1
|
||||
|
||||
/datum/movespeed_modifier/reagent/meth
|
||||
multiplicative_slowdown = -0.5
|
||||
absolute_max_tiles_per_second = 11
|
||||
|
||||
@@ -504,6 +504,14 @@
|
||||
glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland."
|
||||
value = REAGENT_VALUE_COMMON
|
||||
|
||||
/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/carbon/M)
|
||||
M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/carbon/M)
|
||||
M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M)
|
||||
M.Jitter(20)
|
||||
M.set_drugginess(30)
|
||||
|
||||
@@ -174,11 +174,13 @@
|
||||
ADD_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type)
|
||||
L.update_movespeed()
|
||||
ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
|
||||
|
||||
/datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/L)
|
||||
REMOVE_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type)
|
||||
L.update_movespeed()
|
||||
REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M)
|
||||
|
||||
@@ -783,6 +783,8 @@
|
||||
value = REAGENT_VALUE_VERY_RARE
|
||||
|
||||
/datum/reagent/toxin/rotatium/on_mob_life(mob/living/carbon/M)
|
||||
return ..() // until fixed - the rotations never stop
|
||||
/*
|
||||
if(M.hud_used)
|
||||
if(current_cycle >= 20 && current_cycle%20 == 0)
|
||||
var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"],
|
||||
@@ -800,6 +802,7 @@
|
||||
for(var/whole_screen in screens)
|
||||
animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING)
|
||||
..()
|
||||
*/
|
||||
|
||||
/datum/reagent/toxin/skewium
|
||||
name = "Skewium"
|
||||
|
||||
@@ -404,6 +404,7 @@
|
||||
on_mob.set_light(1, 1, current_color_string)
|
||||
|
||||
/obj/effect/abstract/eye_lighting
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
var/obj/item/organ/eyes/robotic/glow/parent
|
||||
|
||||
/obj/effect/abstract/eye_lighting/Initialize()
|
||||
|
||||
@@ -102,6 +102,7 @@
|
||||
along with slurred speech, aggression, and the ability to infect others with this agent."
|
||||
item = /obj/item/storage/box/syndie_kit/romerol
|
||||
cost = 25
|
||||
player_minimum = 25
|
||||
cant_discount = TRUE
|
||||
exclude_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
|
||||
@@ -34,6 +34,20 @@
|
||||
/obj/item/clothing/under/costume/kilt = 3,
|
||||
/obj/item/clothing/under/misc/overalls = 3,
|
||||
/obj/item/clothing/under/suit/sl = 3,
|
||||
/obj/item/clothing/accessory/sweater = 3,
|
||||
/obj/item/clothing/accessory/sweater/pink = 3,
|
||||
/obj/item/clothing/accessory/sweater/heart = 3,
|
||||
/obj/item/clothing/accessory/sweater/blue = 3,
|
||||
/obj/item/clothing/accessory/sweater/nt = 3,
|
||||
/obj/item/clothing/accessory/sweater/mint = 3,
|
||||
/obj/item/clothing/accessory/sweater/shoulderless = 3,
|
||||
/obj/item/clothing/accessory/sweater/flower = 3,
|
||||
/obj/item/clothing/accessory/turtleneck = 2,
|
||||
/obj/item/clothing/accessory/turtleneck/red = 2,
|
||||
/obj/item/clothing/accessory/turtleneck/comfy = 2,
|
||||
/obj/item/clothing/accessory/turtleneck/tactifool = 2,
|
||||
/obj/item/clothing/accessory/turtleneck/tactifool/green = 2,
|
||||
/obj/item/clothing/accessory/turtleneck/tactifool/blue = 2,
|
||||
/obj/item/clothing/under/sweater = 3,
|
||||
/obj/item/clothing/under/sweater/black = 3,
|
||||
/obj/item/clothing/under/sweater/purple = 3,
|
||||
@@ -50,6 +64,11 @@
|
||||
/obj/item/clothing/under/pants/black = 4,
|
||||
/obj/item/clothing/under/pants/tan = 4,
|
||||
/obj/item/clothing/under/pants/track = 3,
|
||||
/obj/item/clothing/accessory/suitjacket = 2,
|
||||
/obj/item/clothing/accessory/suitjacket/charcoal = 2,
|
||||
/obj/item/clothing/accessory/suitjacket/navy = 2,
|
||||
/obj/item/clothing/accessory/suitjacket/burgundy = 2,
|
||||
/obj/item/clothing/accessory/suitjacket/checkered = 2,
|
||||
/obj/item/clothing/suit/jacket/miljacket = 5,
|
||||
/obj/item/clothing/under/suit/white_on_white/skirt = 2,
|
||||
/obj/item/clothing/under/rank/captain/suit/skirt = 2,
|
||||
@@ -74,6 +93,12 @@
|
||||
/obj/item/clothing/neck/stripedbluescarf = 3,
|
||||
/obj/item/clothing/neck/stripedgreenscarf = 3,
|
||||
/obj/item/clothing/accessory/waistcoat = 2,
|
||||
/obj/item/clothing/accessory/waistcoat/red = 2,
|
||||
/obj/item/clothing/accessory/waistcoat/grey = 2,
|
||||
/obj/item/clothing/accessory/waistcoat/brown = 2,
|
||||
/obj/item/clothing/accessory/waistcoat/sweatervest = 2,
|
||||
/obj/item/clothing/accessory/waistcoat/sweatervest/blue = 2,
|
||||
/obj/item/clothing/accessory/waistcoat/sweatervest/red = 2,
|
||||
/obj/item/clothing/under/dress/skirt = 3,
|
||||
/obj/item/clothing/under/dress/skirt/blue = 3,
|
||||
/obj/item/clothing/under/dress/skirt/red = 3,
|
||||
@@ -132,22 +157,22 @@
|
||||
/obj/item/clothing/ears/headphones = 10,
|
||||
/obj/item/clothing/suit/apron/purple_bartender = 4,
|
||||
/obj/item/clothing/under/rank/civilian/bartender/purple = 4,
|
||||
|
||||
/* Commenting out until next Christmas or made automatic
|
||||
/obj/item/clothing/accessory/sweater/uglyxmas = 3,
|
||||
/obj/item/clothing/under/costume/christmas = 3,
|
||||
/obj/item/clothing/under/costume/christmas/green = 3,
|
||||
/obj/item/clothing/under/costume/christmas/croptop = 3,
|
||||
/obj/item/clothing/under/costume/christmas/croptop/green = 3,
|
||||
*/
|
||||
/obj/item/clothing/suit/hooded/wintercoat/christmascoatr = 3,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/christmascoatg = 3,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/christmascoatrg = 3,
|
||||
/*Commenting out until next Christmas or made automatic
|
||||
/obj/item/clothing/head/christmashat = 3,
|
||||
/obj/item/clothing/head/christmashatg = 3,
|
||||
*/
|
||||
/obj/item/clothing/shoes/winterboots/christmasbootsr = 3,
|
||||
/obj/item/clothing/shoes/winterboots/christmasbootsg = 3,
|
||||
/obj/item/clothing/shoes/winterboots/santaboots = 3,
|
||||
*/
|
||||
/obj/item/clothing/head/cowboyhat = 3,
|
||||
/obj/item/clothing/head/cowboyhat/black = 3,
|
||||
/obj/item/clothing/head/cowboyhat/white = 3,
|
||||
@@ -161,7 +186,8 @@
|
||||
/obj/item/clothing/under/costume/cheongsam/white = 3,
|
||||
/obj/item/clothing/under/costume/cheongsam/red = 3,
|
||||
/obj/item/storage/backpack/snail = 3)
|
||||
contraband = list(/obj/item/clothing/under/syndicate/tacticool = 3,
|
||||
contraband = list(/obj/item/clothing/accessory/turtleneck/tactifool/syndicate = 3,
|
||||
/obj/item/clothing/under/syndicate/tacticool = 3,
|
||||
/obj/item/clothing/under/syndicate/tacticool/skirt = 3,
|
||||
/obj/item/clothing/mask/balaclava = 3,
|
||||
/obj/item/clothing/head/ushanka = 3,
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
/obj/item/clothing/neck/petcollar = 5,
|
||||
/obj/item/clothing/neck/petcollar/choker = 5,
|
||||
/obj/item/clothing/neck/petcollar/leather = 5,
|
||||
/obj/item/clothing/neck/necklace/cowbell = 5,
|
||||
/obj/item/restraints/handcuffs/fake/kinky = 5,
|
||||
/obj/item/clothing/glasses/sunglasses/blindfold = 4,
|
||||
/obj/item/clothing/mask/muzzle = 4,
|
||||
|
||||
@@ -675,3 +675,6 @@ TURF_DIRT_THRESHOLD 100
|
||||
|
||||
## Default alpha of dirt on spawn
|
||||
DIRT_ALPHA_STARTING 127
|
||||
|
||||
## Allows pAI custom holoforms
|
||||
PAI_CUSTOM_HOLOFORMS
|
||||
|
||||
@@ -50,6 +50,128 @@
|
||||
-->
|
||||
<div class="commit sansserif">
|
||||
|
||||
<h2 class="date">03 February 2021</h2>
|
||||
<h3 class="author">Hatterhat updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">The green energy sabre's sprite now respects proper handedness.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">02 February 2021</h2>
|
||||
<h3 class="author">silicons updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">pais can now be carried around piggybacking/fireman</li>
|
||||
<li class="balance">Meth and Nuka Cola once again, speed you up.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">31 January 2021</h2>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">fermichem explosion EMPs don't cover the entire station</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">30 January 2021</h2>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">adds 'clucks', 'caws' and 'gekkers' to the speech verb list</li>
|
||||
</ul>
|
||||
<h3 class="author">zeroisthebiggay updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">some more FUCKING hairs</li>
|
||||
<li class="imageadd">uncodersprites the advanced extinguisher</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">29 January 2021</h2>
|
||||
<h3 class="author">MrJWhit updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Ported the QM, Captain, CMO, and HoS cloaks from beestation.</li>
|
||||
<li class="rscdel">Removes excess air alarms from boxstation</li>
|
||||
</ul>
|
||||
<h3 class="author">TripleShades updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">fixes engineering secure storage being the wrong area because I fucked that up previously my bad</li>
|
||||
<li class="bugfix">removes funny extra light switch under right surgery table in surgery oops</li>
|
||||
<li class="rscadd">Added chairs to the corpse launch viewing area</li>
|
||||
<li class="rscadd">Small garden plot for flowers for parity with other station Chapels</li>
|
||||
<li class="rscadd">Plain Bible to glass tables in Chapel</li>
|
||||
<li class="rscadd">Candles and Matchbox to glass tables in Chapel</li>
|
||||
<li class="rscadd">More glass tables, with a chaplain figure and another spare bible.</li>
|
||||
<li class="rscadd">Bookcase to Box Chapel for parity with other station Chapels</li>
|
||||
<li class="rscadd">Minimoog to Box Chapel as substitute for a church organ</li>
|
||||
<li class="rscadd">Holy department sign just below Chapel change: Expanded the corpse launching area to feel less congested change: Added windows to the corpse launch so you can look inside I guess? change: Moved flowers and burial garments to the corner next to the corpse launcher change: Box Chaplain's office door is moved over one change: Confessional is now connected to Chaplain's office for parity with other station Chapels change: Moved coffins over to old confessional location change: Box Chapel now has pews instead of stools change: Box Chapel Confessional is now lit instead of being nearly pitch black remove: Two coffins from Chapel</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">the miner bedsheet will now increment its progress when you redeem points from the ORM</li>
|
||||
<li class="rscadd">you can add custom names and descriptions to item's on the loadout now</li>
|
||||
</ul>
|
||||
<h3 class="author">zeroisthebiggay updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">roundstart aesthetic sterile masks and roundstart paper masks</li>
|
||||
<li class="rscadd">more accessory slot items</li>
|
||||
<li class="rscadd">cowbell necklace happy 2021</li>
|
||||
<li class="rscadd">shibari ropes & torn pantyhose</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">28 January 2021</h2>
|
||||
<h3 class="author">silicons updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">colormates can now paint some mobs.</li>
|
||||
<li class="bugfix">1 dev explosions shouldn't delete brains anymore</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">27 January 2021</h2>
|
||||
<h3 class="author">ArcaneMusic, ported by Hatterhat updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Strike a hydroponics tray with a fully-charged floral somatoray to lock in a mutation.</li>
|
||||
<li class="rscadd">Floral somatorays now have the ability to force a mutation in a plant. This should drain the cell in a single shot, but we'll see.</li>
|
||||
<li class="balance">Somatorays now take uranium to craft instead of radium.</li>
|
||||
</ul>
|
||||
<h3 class="author">Arturlang updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Actually adds a right click give option</li>
|
||||
<li class="rscadd">Revenants can now clickdrag to throw stuff at people, with some items doing various things at the same time.</li>
|
||||
</ul>
|
||||
<h3 class="author">DeltaFire15 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">The woundmending rite no longer causes runtimes.</li>
|
||||
<li class="bugfix">Ratvarian borgs can now use their tier-0 spells.</li>
|
||||
<li class="balance">Ratvarian borgs can always use their assigned spells, if there is enough power.</li>
|
||||
<li class="admin">The heretic antag panel now shows their sacrifices & current sacrifice targets.</li>
|
||||
<li class="tweak">The heretic roundend report now shows their sacrifices and nonsacrificed targets.</li>
|
||||
<li class="bugfix">Living hearts can no longer select the same target as another living heart, removing a certain problem.</li>
|
||||
</ul>
|
||||
<h3 class="author">Hatterhat updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Department budget cards have been readded. TO THE CODE. NOT LOCKERS.</li>
|
||||
<li class="tweak">Also budget cards now look more like every other ID - see tgstation#55001.</li>
|
||||
<li class="balance">One of the contractor tablet's payouts has been raised from a small payout to a medium payout.</li>
|
||||
<li class="balance">The free golem ship's GPSes no longer start on. They were never meant to, but they did.</li>
|
||||
<li class="rscdel">Headsets can't be found on most legion corpses now.</li>
|
||||
<li class="rscdel">The flash on the assistant corpse is gone, too.</li>
|
||||
</ul>
|
||||
<h3 class="author">MrJWhit updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Remaps some air alarms for sanity.</li>
|
||||
</ul>
|
||||
<h3 class="author">SandPoot updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">The drop circuit can no longer drop things that are not inside it.</li>
|
||||
</ul>
|
||||
<h3 class="author">raspy-on-osu updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">bespoke ventcrawling element not detaching due to malformed call</li>
|
||||
</ul>
|
||||
<h3 class="author">shellspeed1 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Floorbots had had a software update, preventing them from dogpiling on their target as easily as they did before.</li>
|
||||
<li class="soundadd">Floorbots will now play a small chime when stacked on top of each other to indicate that they're moving apart.</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">blobs can use the 'me' verb</li>
|
||||
<li class="admin">adminhelps and pms only sanitize once instead of twice</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">25 January 2021</h2>
|
||||
<h3 class="author">MrJWhit updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
|
||||
@@ -28270,3 +28270,101 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
- refactor: ventcrawling
|
||||
silicons:
|
||||
- tweak: you can now shove yourself up in any intent, not just help.
|
||||
2021-01-27:
|
||||
ArcaneMusic, ported by Hatterhat:
|
||||
- rscadd: Strike a hydroponics tray with a fully-charged floral somatoray to lock
|
||||
in a mutation.
|
||||
- rscadd: Floral somatorays now have the ability to force a mutation in a plant.
|
||||
This should drain the cell in a single shot, but we'll see.
|
||||
- balance: Somatorays now take uranium to craft instead of radium.
|
||||
Arturlang:
|
||||
- rscadd: Actually adds a right click give option
|
||||
- rscadd: Revenants can now clickdrag to throw stuff at people, with some items
|
||||
doing various things at the same time.
|
||||
DeltaFire15:
|
||||
- bugfix: The woundmending rite no longer causes runtimes.
|
||||
- bugfix: Ratvarian borgs can now use their tier-0 spells.
|
||||
- balance: Ratvarian borgs can always use their assigned spells, if there is enough
|
||||
power.
|
||||
- admin: The heretic antag panel now shows their sacrifices & current sacrifice
|
||||
targets.
|
||||
- tweak: The heretic roundend report now shows their sacrifices and nonsacrificed
|
||||
targets.
|
||||
- bugfix: Living hearts can no longer select the same target as another living heart,
|
||||
removing a certain problem.
|
||||
Hatterhat:
|
||||
- tweak: Department budget cards have been readded. TO THE CODE. NOT LOCKERS.
|
||||
- tweak: Also budget cards now look more like every other ID - see tgstation#55001.
|
||||
- balance: One of the contractor tablet's payouts has been raised from a small payout
|
||||
to a medium payout.
|
||||
- balance: The free golem ship's GPSes no longer start on. They were never meant
|
||||
to, but they did.
|
||||
- rscdel: Headsets can't be found on most legion corpses now.
|
||||
- rscdel: The flash on the assistant corpse is gone, too.
|
||||
MrJWhit:
|
||||
- tweak: Remaps some air alarms for sanity.
|
||||
SandPoot:
|
||||
- bugfix: The drop circuit can no longer drop things that are not inside it.
|
||||
raspy-on-osu:
|
||||
- bugfix: bespoke ventcrawling element not detaching due to malformed call
|
||||
shellspeed1:
|
||||
- bugfix: Floorbots had had a software update, preventing them from dogpiling on
|
||||
their target as easily as they did before.
|
||||
- soundadd: Floorbots will now play a small chime when stacked on top of each other
|
||||
to indicate that they're moving apart.
|
||||
timothyteakettle:
|
||||
- rscadd: blobs can use the 'me' verb
|
||||
- admin: adminhelps and pms only sanitize once instead of twice
|
||||
2021-01-28:
|
||||
silicons:
|
||||
- rscadd: colormates can now paint some mobs.
|
||||
- bugfix: 1 dev explosions shouldn't delete brains anymore
|
||||
2021-01-29:
|
||||
MrJWhit:
|
||||
- tweak: Ported the QM, Captain, CMO, and HoS cloaks from beestation.
|
||||
- rscdel: Removes excess air alarms from boxstation
|
||||
TripleShades:
|
||||
- bugfix: fixes engineering secure storage being the wrong area because I fucked
|
||||
that up previously my bad
|
||||
- bugfix: removes funny extra light switch under right surgery table in surgery
|
||||
oops
|
||||
- rscadd: Added chairs to the corpse launch viewing area
|
||||
- rscadd: Small garden plot for flowers for parity with other station Chapels
|
||||
- rscadd: Plain Bible to glass tables in Chapel
|
||||
- rscadd: Candles and Matchbox to glass tables in Chapel
|
||||
- rscadd: More glass tables, with a chaplain figure and another spare bible.
|
||||
- rscadd: Bookcase to Box Chapel for parity with other station Chapels
|
||||
- rscadd: Minimoog to Box Chapel as substitute for a church organ
|
||||
- rscadd: 'Holy department sign just below Chapel change: Expanded the corpse launching
|
||||
area to feel less congested change: Added windows to the corpse launch so you
|
||||
can look inside I guess? change: Moved flowers and burial garments to the corner
|
||||
next to the corpse launcher change: Box Chaplain''s office door is moved over
|
||||
one change: Confessional is now connected to Chaplain''s office for parity with
|
||||
other station Chapels change: Moved coffins over to old confessional location
|
||||
change: Box Chapel now has pews instead of stools change: Box Chapel Confessional
|
||||
is now lit instead of being nearly pitch black remove: Two coffins from Chapel'
|
||||
timothyteakettle:
|
||||
- bugfix: the miner bedsheet will now increment its progress when you redeem points
|
||||
from the ORM
|
||||
- rscadd: you can add custom names and descriptions to item's on the loadout now
|
||||
zeroisthebiggay:
|
||||
- rscadd: roundstart aesthetic sterile masks and roundstart paper masks
|
||||
- rscadd: more accessory slot items
|
||||
- rscadd: cowbell necklace happy 2021
|
||||
- rscadd: shibari ropes & torn pantyhose
|
||||
2021-01-30:
|
||||
timothyteakettle:
|
||||
- rscadd: adds 'clucks', 'caws' and 'gekkers' to the speech verb list
|
||||
zeroisthebiggay:
|
||||
- rscadd: some more FUCKING hairs
|
||||
- imageadd: uncodersprites the advanced extinguisher
|
||||
2021-01-31:
|
||||
Putnam3145:
|
||||
- balance: fermichem explosion EMPs don't cover the entire station
|
||||
2021-02-02:
|
||||
silicons:
|
||||
- rscadd: pais can now be carried around piggybacking/fireman
|
||||
- balance: Meth and Nuka Cola once again, speed you up.
|
||||
2021-02-03:
|
||||
Hatterhat:
|
||||
- bugfix: The green energy sabre's sprite now respects proper handedness.
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
author: "Hatterhat"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscdel: "Headsets can't be found on most legion corpses now."
|
||||
- rscdel: "The flash on the assistant corpse is gone, too."
|
||||
@@ -1,6 +0,0 @@
|
||||
author: "ArcaneMusic, ported by Hatterhat"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Strike a hydroponics tray with a fully-charged floral somatoray to lock in a mutation."
|
||||
- rscadd: "Floral somatorays now have the ability to force a mutation in a plant. This should drain the cell in a single shot, but we'll see."
|
||||
- balance: "Somatorays now take uranium to craft instead of radium."
|
||||
@@ -1,6 +0,0 @@
|
||||
author: "DeltaFire15"
|
||||
delete-after: True
|
||||
changes:
|
||||
- admin: "The heretic antag panel now shows their sacrifices & current sacrifice targets."
|
||||
- tweak: "The heretic roundend report now shows their sacrifices and nonsacrificed targets."
|
||||
- bugfix: "Living hearts can no longer select the same target as another living heart, removing a certain problem."
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "Arturlang"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Revenants can now clickdrag to throw stuff at people, with some items doing various things at the same time."
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "Hatterhat"
|
||||
delete-after: True
|
||||
changes:
|
||||
- balance: "The free golem ship's GPSes no longer start on. They were never meant to, but they did."
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "timothyteakettle"
|
||||
delete-after: True
|
||||
changes:
|
||||
- admin: "adminhelps and pms only sanitize once instead of twice"
|
||||
@@ -1,6 +0,0 @@
|
||||
author: "DeltaFire15"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "The woundmending rite no longer causes runtimes."
|
||||
- bugfix: "Ratvarian borgs can now use their tier-0 spells."
|
||||
- balance: "Ratvarian borgs can always use their assigned spells, if there is enough power."
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "Hatterhat"
|
||||
delete-after: True
|
||||
changes:
|
||||
- balance: "One of the contractor tablet's payouts has been raised from a small payout to a medium payout."
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "MrJWhit"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Remaps some air alarms for sanity."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "shellspeed1"
|
||||
delete-after: True
|
||||
changes:
|
||||
- balance: "There actually needs to be people for zombies to happen now."
|
||||
@@ -1,5 +0,0 @@
|
||||
author: "Hatterhat"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Department budget cards have been readded. TO THE CODE. NOT LOCKERS."
|
||||
- tweak: "Also budget cards now look more like every other ID - see tgstation#55001."
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "Arturlang"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Actually adds a right click give option"
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "raspy-on-osu"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "bespoke ventcrawling element not detaching due to malformed call"
|
||||
@@ -1,5 +0,0 @@
|
||||
author: "shellspeed1"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Floorbots had had a software update, preventing them from dogpiling on their target as easily as they did before."
|
||||
- soundadd: "Floorbots will now play a small chime when stacked on top of each other to indicate that they're moving apart."
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "SandPoot"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "The drop circuit can no longer drop things that are not inside it."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "SmArtKar"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "The orbit menu now has an Auto-Observe button! No more sifting through the lame observe menu to snoop in people's backpacks! Also, orbit menu now refreshes."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "SmArtKar"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "KAs are no longer getting broken when fired by a circuit"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "keronshb"
|
||||
delete-after: True
|
||||
changes:
|
||||
- balance: "Makes cell chargers, charge faster."
|
||||
@@ -0,0 +1,6 @@
|
||||
author: "keronshb"
|
||||
delete-after: True
|
||||
changes:
|
||||
- balance: "Force and damage > 15 from 18/25"
|
||||
- balance: "Knockdown put down to 5 from 30"
|
||||
- balance: "Armor pen down to 10 from 100."
|
||||
@@ -1,4 +1,4 @@
|
||||
author: "timothyteakettle"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "blobs can use the 'me' verb"
|
||||
- rscadd: "dwarf facial hair is no longer randomised"
|
||||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 125 KiB |
@@ -53,7 +53,7 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids)
|
||||
var/path //item-to-spawn path
|
||||
var/cost = 1 //normally, each loadout costs a single point.
|
||||
var/geargroupID //defines the ID that the gear inherits from the config
|
||||
var/loadout_flags = 0
|
||||
var/loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
|
||||
var/list/loadout_initial_colors = list()
|
||||
|
||||
//NEW DONATOR SYTSEM STUFF
|
||||
|
||||
@@ -15,6 +15,18 @@
|
||||
name = "Black beret"
|
||||
path = /obj/item/clothing/head/beret/black
|
||||
|
||||
/datum/gear/head/redberet
|
||||
name = "Red beret"
|
||||
path = /obj/item/clothing/head/beret
|
||||
|
||||
/datum/gear/head/purpleberet
|
||||
name = "Purple beret"
|
||||
path = /obj/item/clothing/head/beret/purple
|
||||
|
||||
/datum/gear/head/blueberet
|
||||
name = "Blue beret"
|
||||
path = /obj/item/clothing/head/beret/blue
|
||||
|
||||
/datum/gear/head/flatcap
|
||||
name = "Flat cap"
|
||||
path = /obj/item/clothing/head/flatcap
|
||||
|
||||
@@ -20,3 +20,14 @@
|
||||
path = /obj/item/clothing/mask/gas
|
||||
cost = 2
|
||||
restricted_roles = list("Chief Engineer", "Atmospheric Technician", "Station Engineer") //*shrug
|
||||
|
||||
/datum/gear/mask/sterile
|
||||
name = "Aesthetic sterile mask"
|
||||
path = /obj/item/clothing/mask/surgical/aesthetic
|
||||
cost = 2
|
||||
|
||||
/datum/gear/mask/paper
|
||||
name = "Paper mask"
|
||||
path = /obj/item/clothing/mask/paper
|
||||
cost = 2
|
||||
|
||||
|
||||
@@ -30,6 +30,10 @@
|
||||
name = "Choker"
|
||||
path = /obj/item/clothing/neck/petcollar/choker
|
||||
|
||||
/datum/gear/neck/cowbell
|
||||
name = "Cowbell collar"
|
||||
path = /obj/item/clothing/neck/necklace/cowbell
|
||||
|
||||
/datum/gear/neck/scarf
|
||||
name = "White scarf"
|
||||
subcategory = LOADOUT_SUBCATEGORY_NECK_SCARVES
|
||||
@@ -86,7 +90,7 @@
|
||||
/datum/gear/neck/polycloak
|
||||
name = "Polychromatic Cloak"
|
||||
path = /obj/item/clothing/neck/cloak/polychromic
|
||||
loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#FFFFFF", "#FFFFFF", "#808080")
|
||||
|
||||
/datum/gear/neck/altpolycloak
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
name = "Polychromic winter coat"
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat/polychromic
|
||||
cost = 4 //too many people with neon green coats is hard on the eyes
|
||||
loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#6A6964", "#C4B8A6", "#0000FF")
|
||||
|
||||
/datum/gear/suit/coat/med
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
/datum/gear/uniform/maidcostume/polychromic
|
||||
name = "Polychromic maid costume"
|
||||
path = /obj/item/clothing/under/rank/civilian/janitor/maid/polychromic
|
||||
loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#FFFFFF", "#000000")
|
||||
|
||||
/datum/gear/uniform/mailmanuniform
|
||||
@@ -229,49 +229,49 @@
|
||||
name = "Polychromic Jumpsuit"
|
||||
path = /obj/item/clothing/under/misc/polyjumpsuit
|
||||
cost = 2
|
||||
loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#FFFFFF", "#808080", "#353535")
|
||||
|
||||
/datum/gear/uniform/skirt/poly
|
||||
name = "Polychromic Jumpskirt"
|
||||
path = /obj/item/clothing/under/dress/skirt/polychromic
|
||||
cost = 2
|
||||
loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#FFFFFF", "#F08080", "#808080")
|
||||
|
||||
/datum/gear/uniform/suit/poly
|
||||
name = "Polychromic Button-up Shirt"
|
||||
path = /obj/item/clothing/under/misc/poly_shirt
|
||||
cost = 3
|
||||
loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#FFFFFF", "#353535", "#353535")
|
||||
|
||||
/datum/gear/uniform/skirt/poly/pleated
|
||||
name = "Polychromic Pleated Sweaterskirt"
|
||||
path = /obj/item/clothing/under/dress/skirt/polychromic/pleated
|
||||
cost = 3
|
||||
loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#8CC6FF", "#808080", "#FF3535")
|
||||
|
||||
/datum/gear/uniform/polykilt
|
||||
name = "Polychromic Kilt"
|
||||
path = /obj/item/clothing/under/costume/kilt/polychromic
|
||||
cost = 3
|
||||
loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#FFFFFF", "#F08080")
|
||||
|
||||
/datum/gear/uniform/shorts/poly
|
||||
name = "Polychromic Shorts"
|
||||
path = /obj/item/clothing/under/misc/polyshorts
|
||||
cost = 3
|
||||
loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#353535", "#808080", "#808080")
|
||||
|
||||
/datum/gear/uniform/shorts/poly/athletic
|
||||
name = "Polychromic Athletic Shorts"
|
||||
path = /obj/item/clothing/under/shorts/polychromic
|
||||
cost = 2
|
||||
loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#FFFFFF", "#F08080")
|
||||
|
||||
/datum/gear/uniform/hopcasual
|
||||
|
||||
@@ -93,9 +93,8 @@
|
||||
e.set_up(round((volume/28)*(pH-9)), T, 0, 0)
|
||||
e.start()
|
||||
|
||||
if(!ImpureTot == 0) //If impure, v.small emp (0.6 or less)
|
||||
ImpureTot *= volume
|
||||
empulse(T, volume, 1)
|
||||
if(ImpureTot) //If impure, v.small emp (0.6 or less)
|
||||
empulse(T, ImpureTot, 1)
|
||||
|
||||
my_atom.reagents.clear_reagents() //just in case
|
||||
return
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { createSearch } from 'common/string';
|
||||
import { multiline } from 'common/string';
|
||||
import { resolveAsset } from '../assets';
|
||||
import { useBackend, useLocalState } from '../backend';
|
||||
import { Box, Button, Flex, Icon, Input, Section } from '../components';
|
||||
import { Box, Button, Divider, Flex, Icon, Input, Section } from '../components';
|
||||
import { Window } from '../layouts';
|
||||
|
||||
const PATTERN_DESCRIPTOR = / \[(?:ghost|dead)\]$/;
|
||||
const PATTERN_NUMBER = / \(([0-9]+)\)$/;
|
||||
|
||||
const searchFor = searchText => createSearch(searchText, thing => thing.name);
|
||||
@@ -43,7 +43,7 @@ const BasicSection = (props, context) => {
|
||||
{things.map(thing => (
|
||||
<Button
|
||||
key={thing.name}
|
||||
content={thing.name.replace(PATTERN_DESCRIPTOR, "")}
|
||||
content={thing.name}
|
||||
onClick={() => act("orbit", {
|
||||
ref: thing.ref,
|
||||
})} />
|
||||
@@ -82,6 +82,7 @@ export const Orbit = (props, context) => {
|
||||
const {
|
||||
alive,
|
||||
antagonists,
|
||||
auto_observe,
|
||||
dead,
|
||||
ghosts,
|
||||
misc,
|
||||
@@ -140,6 +141,27 @@ export const Orbit = (props, context) => {
|
||||
onInput={(_, value) => setSearchText(value)}
|
||||
onEnter={(_, value) => orbitMostRelevant(value)} />
|
||||
</Flex.Item>
|
||||
<Flex.Item>
|
||||
<Divider vertical />
|
||||
</Flex.Item>
|
||||
<Flex.Item>
|
||||
<Button
|
||||
inline
|
||||
color="transparent"
|
||||
tooltip={multiline`Toggle Auto-Observe. When active, you'll
|
||||
see the UI / full inventory of whoever you're orbiting. Neat!`}
|
||||
tooltipPosition="bottom-left"
|
||||
selected={auto_observe}
|
||||
icon={auto_observe ? "toggle-on" : "toggle-off"}
|
||||
onClick={() => act("toggle_observe")} />
|
||||
<Button
|
||||
inline
|
||||
color="transparent"
|
||||
tooltip="Refresh"
|
||||
tooltipPosition="bottom-left"
|
||||
icon="sync-alt"
|
||||
onClick={() => act("refresh")} />
|
||||
</Flex.Item>
|
||||
</Flex>
|
||||
</Section>
|
||||
{antagonists.length > 0 && (
|
||||
@@ -161,7 +183,7 @@ export const Orbit = (props, context) => {
|
||||
</Section>
|
||||
)}
|
||||
|
||||
<Section title="Alive">
|
||||
<Section title={`Alive - (${alive.length})`}>
|
||||
{alive
|
||||
.filter(searchFor(searchText))
|
||||
.sort(compareNumberedText)
|
||||
@@ -174,7 +196,7 @@ export const Orbit = (props, context) => {
|
||||
</Section>
|
||||
|
||||
<BasicSection
|
||||
title="Ghosts"
|
||||
title={`Ghosts - (${ghosts.length})`}
|
||||
source={ghosts}
|
||||
searchText={searchText}
|
||||
/>
|
||||
|
||||