Merge branch 'master' into hoodies

This commit is contained in:
farie82
2019-08-30 22:57:07 +02:00
committed by GitHub
484 changed files with 15958 additions and 6957 deletions
+8
View File
@@ -196,6 +196,14 @@
/datum/action/item_action/toggle_helmet_light
name = "Toggle Helmet Light"
/datum/action/item_action/toggle_welding_screen/plasmaman
name = "Toggle Welding Screen"
/datum/action/item_action/toggle_welding_screen/plasmaman/Trigger()
var/obj/item/clothing/head/helmet/space/plasmaman/H = target
if(istype(H))
H.toggle_welding_screen(owner)
/datum/action/item_action/toggle_helmet_mode
name = "Toggle Helmet Mode"
+31
View File
@@ -0,0 +1,31 @@
/datum/component/spraycan_paintable
var/current_paint
/datum/component/spraycan_paintable/Initialize()
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/Repaint)
/datum/component/spraycan_paintable/Destroy()
RemoveCurrentCoat()
return ..()
/datum/component/spraycan_paintable/proc/RemoveCurrentCoat()
var/atom/A = parent
A.remove_atom_colour(FIXED_COLOUR_PRIORITY, current_paint)
/datum/component/spraycan_paintable/proc/Repaint(datum/source, obj/item/toy/crayon/spraycan/spraycan, mob/living/user)
if(!istype(spraycan) || user.a_intent == INTENT_HARM)
return
. = COMPONENT_NO_AFTERATTACK
if(spraycan.capped)
to_chat(user, "<span class='warning'>Take the cap off first!</span>")
return
if(spraycan.uses < 2)
to_chat(user, "<span class ='warning'>There is not enough paint in the can!")
return
RemoveCurrentCoat()
var/colour = spraycan.colour
current_paint = colour
var/atom/A = parent
A.add_atom_colour(colour, FIXED_COLOUR_PRIORITY)
playsound(spraycan, 'sound/effects/spray.ogg', 5, 1, 5)
to_chat(user, "<span class='notice'>You spray [spraycan] on [A], painting it.</span>")
+6 -1
View File
@@ -1269,7 +1269,12 @@
return
src.debug_variables(DAT)
return
if(href_list["copyoutfit"])
if(!check_rights(R_EVENT))
return
var/mob/living/carbon/human/H = locateUID(href_list["copyoutfit"])
if(istype(H))
H.copy_outfit()
/client/proc/view_var_Topic_list(href, href_list, hsrc)
if(href_list["VarsList"])
@@ -30,11 +30,11 @@ Bonus
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
to_chat(M, "<span class='warning'>[pick("You feel cold.", "You start shivering.")]</span>")
if(M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
if(M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT)
Chill(M, A)
return
/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2))
M.bodytemperature = min(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
return 1
M.bodytemperature = max(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
return 1
+1 -1
View File
@@ -1151,7 +1151,7 @@
A.set_zeroth_law("")
A.show_laws()
A.verbs -= /mob/living/silicon/ai/proc/choose_modules
A.malf_picker.remove_verbs(A)
A.malf_picker.remove_malf_verbs(A)
qdel(A.malf_picker)
SSticker.mode.update_traitor_icons_removed(src)
+118 -2
View File
@@ -19,14 +19,20 @@
var/suit_store = null
var/l_hand = null
var/r_hand = null
/// Should the toggle helmet proc be called on the helmet during equip
var/toggle_helmet = TRUE
var/pda = null
var/internals_slot = null //ID of slot containing a gas tank
var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format
var/list/implants = null
var/list/cybernetic_implants = null
var/box // Internals box. Will be inserted at the start of backpack_contents
var/list/implants = list()
var/list/cybernetic_implants = list()
var/list/accessories = list()
var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns
var/can_be_admin_equipped = TRUE // Set to FALSE if your outfit requires runtime parameters
/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//to be overriden for customization depending on client prefs,species etc
return
@@ -82,12 +88,24 @@
if(pda)
equip_item(H, pda, slot_wear_pda)
if(uniform)
for(var/path in accessories)
var/obj/item/clothing/accessory/A = new path()
var/obj/item/clothing/under/U = uniform
U.attach_accessory(A, H)
if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
if(l_pocket)
equip_item(H, l_pocket, slot_l_store)
if(r_pocket)
equip_item(H, r_pocket, slot_r_store)
if(box)
if(!backpack_contents)
backpack_contents = list()
backpack_contents.Insert(1, box)
backpack_contents[box] = 1
for(var/path in backpack_contents)
var/number = backpack_contents[path]
for(var/i in 1 to number)
@@ -97,6 +115,10 @@
var/obj/item/organ/internal/O = new path(H)
O.insert(H)
if(!H.head && toggle_helmet && istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit))
var/obj/item/clothing/suit/space/hardsuit/HS = H.wear_suit
HS.ToggleHelmet()
post_equip(H, visualsOnly)
if(!visualsOnly)
@@ -159,3 +181,97 @@
types += chameleon_extras
listclearnulls(types)
return types
/datum/outfit/proc/save_to_file(mob/admin)
var/stored_data = get_json_data()
var/json = json_encode(stored_data)
// Kinda annoying but as far as I can tell you need to make actual file.
var/f = file("data/TempOutfitUpload")
fdel(f)
WRITE_FILE(f, json)
admin << ftp(f, "[name].json")
/datum/outfit/proc/load_from(list/outfit_data)
// This could probably use more strict validation.
name = outfit_data["name"]
uniform = text2path(outfit_data["uniform"])
suit = text2path(outfit_data["suit"])
toggle_helmet = text2path(outfit_data["toggle_helmet"])
back = text2path(outfit_data["back"])
belt = text2path(outfit_data["belt"])
gloves = text2path(outfit_data["gloves"])
shoes = text2path(outfit_data["shoes"])
head = text2path(outfit_data["head"])
mask = text2path(outfit_data["mask"])
l_ear = text2path(outfit_data["l_ear"])
r_ear = text2path(outfit_data["r_ear"])
glasses = text2path(outfit_data["glasses"])
id = text2path(outfit_data["id"])
pda = text2path(outfit_data["pda"])
l_pocket = text2path(outfit_data["l_pocket"])
r_pocket = text2path(outfit_data["r_pocket"])
suit_store = text2path(outfit_data["suit_store"])
r_hand = text2path(outfit_data["r_hand"])
l_hand = text2path(outfit_data["l_hand"])
internals_slot = text2path(outfit_data["internals_slot"])
var/list/backpack = outfit_data["backpack_contents"]
backpack_contents = list()
for(var/item in backpack)
var/itype = text2path(item)
if(itype)
backpack_contents[itype] = backpack[item]
box = text2path(outfit_data["box"])
var/list/impl = outfit_data["implants"]
implants = list()
for(var/I in impl)
var/imptype = text2path(I)
if(imptype)
implants += imptype
var/list/cybernetic_impl = outfit_data["cybernetic_implants"]
cybernetic_implants = list()
for(var/I in cybernetic_impl)
var/cybtype = text2path(I)
if(cybtype)
cybernetic_implants += cybtype
var/list/accessories = outfit_data["accessories"]
accessories = list()
for(var/A in accessories)
var/accessorytype = text2path(A)
if(accessorytype)
accessories += accessorytype
return TRUE
/datum/outfit/proc/get_json_data()
. = list()
.["outfit_type"] = type
.["name"] = name
.["uniform"] = uniform
.["suit"] = suit
.["toggle_helmet"] = toggle_helmet
.["back"] = back
.["belt"] = belt
.["gloves"] = gloves
.["shoes"] = shoes
.["head"] = head
.["mask"] = mask
.["l_ear"] = l_ear
.["r_ear"] = r_ear
.["glasses"] = glasses
.["id"] = id
.["pda"] = pda
.["l_pocket"] = l_pocket
.["r_pocket"] = r_pocket
.["suit_store"] = suit_store
.["r_hand"] = r_hand
.["l_hand"] = l_hand
.["internals_slot"] = internals_slot
.["backpack_contents"] = backpack_contents
.["box"] = box
.["implants"] = implants
.["cybernetic_implants"] = cybernetic_implants
.["accessories"] = accessories
+3 -14
View File
@@ -78,7 +78,6 @@
suit = /obj/item/clothing/suit/space/hardsuit/syndi
belt = /obj/item/storage/belt/military
head = /obj/item/clothing/head/helmet/space/hardsuit/syndi
mask = /obj/item/clothing/mask/gas/syndicate
l_ear = /obj/item/radio/headset/syndicate/alt
glasses = /obj/item/clothing/glasses/night
@@ -110,7 +109,6 @@
/datum/outfit/admin/syndicate/operative/freedom
name = "Syndicate Freedom Operative"
suit = /obj/item/clothing/suit/space/hardsuit/syndi/freedom
head = /obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom
/datum/outfit/admin/syndicate_strike_team
@@ -794,41 +792,34 @@
/datum/outfit/admin/hardsuit/engineer
name = "Engineer Hardsuit"
suit = /obj/item/clothing/suit/space/hardsuit
head = /obj/item/clothing/head/helmet/space/hardsuit
suit = /obj/item/clothing/suit/space/hardsuit/engine
/datum/outfit/admin/hardsuit/ce
name = "CE Hardsuit"
suit = /obj/item/clothing/suit/space/hardsuit/elite
head = /obj/item/clothing/head/helmet/space/hardsuit/elite
suit = /obj/item/clothing/suit/space/hardsuit/engine/elite
shoes = /obj/item/clothing/shoes/magboots/advance
/datum/outfit/admin/hardsuit/mining
name = "Mining Hardsuit"
suit = /obj/item/clothing/suit/space/hardsuit/mining
head = /obj/item/clothing/head/helmet/space/hardsuit/mining
/datum/outfit/admin/hardsuit/syndi
name = "Syndi Hardsuit"
suit = /obj/item/clothing/suit/space/hardsuit/syndi
head = /obj/item/clothing/head/helmet/space/hardsuit/syndi
shoes = /obj/item/clothing/shoes/magboots/syndie
/datum/outfit/admin/hardsuit/wizard
name = "Wizard Hardsuit"
suit = /obj/item/clothing/suit/space/hardsuit/wizard
head = /obj/item/clothing/head/helmet/space/hardsuit/wizard
shoes = /obj/item/clothing/shoes/magboots
/datum/outfit/admin/hardsuit/medical
name = "Medical Hardsuit"
suit = /obj/item/clothing/suit/space/hardsuit/medical
head = /obj/item/clothing/head/helmet/space/hardsuit/medical
/datum/outfit/admin/hardsuit/atmos
name = "Atmos Hardsuit"
suit = /obj/item/clothing/suit/space/hardsuit/atmos
head = /obj/item/clothing/head/helmet/space/hardsuit/atmos
suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos
/datum/outfit/admin/tournament
@@ -963,7 +954,6 @@
belt = /obj/item/claymore/ceremonial
gloves = /obj/item/clothing/gloves/combat
shoes = /obj/item/clothing/shoes/magboots
head = /obj/item/clothing/head/helmet/space/hardsuit/singuloth
mask = /obj/item/clothing/mask/breath
l_ear = /obj/item/radio/headset/ert
glasses = /obj/item/clothing/glasses/meson/cyber
@@ -1111,7 +1101,6 @@
backpack_contents = list(
/obj/item/storage/box/engineer = 1,
/obj/item/clothing/suit/space/hardsuit/wizard = 1,
/obj/item/clothing/head/helmet/space/hardsuit/wizard = 1,
/obj/item/clothing/shoes/magboots = 1,
/obj/item/kitchen/knife/ritual = 1,
/obj/item/clothing/suit/wizrobe/red = 1,
+178
View File
@@ -0,0 +1,178 @@
/datum/outfit/plasmaman
name = "Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman
uniform = /obj/item/clothing/under/plasmaman
r_hand = /obj/item/tank/plasma/plasmaman/belt/full
mask = /obj/item/clothing/mask/breath
/datum/outfit/plasmaman/bar
name = "Bartender Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/white
uniform = /obj/item/clothing/under/plasmaman/enviroslacks
/datum/outfit/plasmaman/chef
name = "Chef Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/chef
uniform = /obj/item/clothing/under/plasmaman/chef
/datum/outfit/plasmaman/botany
name = "Botany Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/botany
uniform = /obj/item/clothing/under/plasmaman/botany
/datum/outfit/plasmaman/librarian
name = "Librarian Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/librarian
uniform = /obj/item/clothing/under/plasmaman/librarian
/datum/outfit/plasmaman/chaplain
name = "Chaplain Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/chaplain
uniform = /obj/item/clothing/under/plasmaman/chaplain
/datum/outfit/plasmaman/janitor
name = "Janitor Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/janitor
uniform = /obj/item/clothing/under/plasmaman/janitor
/datum/outfit/plasmaman/security
name = "Security Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/security
uniform = /obj/item/clothing/under/plasmaman/security
/datum/outfit/plasmaman/detective
name = "Detective Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/white
uniform = /obj/item/clothing/under/plasmaman/enviroslacks
l_ear = /obj/item/radio/headset/headset_sec
/datum/outfit/plasmaman/warden
name = "Warden Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/security/warden
uniform = /obj/item/clothing/under/plasmaman/security/warden
/datum/outfit/plasmaman/hos
name = "Head of Security Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/security/hos
uniform = /obj/item/clothing/under/plasmaman/security/hos
/datum/outfit/plasmaman/cargo
name = "Cargo Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/cargo
uniform = /obj/item/clothing/under/plasmaman/cargo
/datum/outfit/plasmaman/mining
name = "Mining Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/mining
uniform = /obj/item/clothing/under/plasmaman/mining
/datum/outfit/plasmaman/medical
name = "Medical Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/medical
uniform = /obj/item/clothing/under/plasmaman/medical
/datum/outfit/plasmaman/cmo
name = "Chief Medical Officer Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/cmo
uniform = /obj/item/clothing/under/plasmaman/cmo
/datum/outfit/plasmaman/viro
name = "Virology Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/viro
uniform = /obj/item/clothing/under/plasmaman/viro
/datum/outfit/plasmaman/chemist
name = "Chemist Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/chemist
uniform = /obj/item/clothing/under/plasmaman/chemist
/datum/outfit/plasmaman/genetics
name = "Genetics Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/genetics
uniform = /obj/item/clothing/under/plasmaman/genetics
/datum/outfit/plasmaman/science
name = "Science Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/science
uniform = /obj/item/clothing/under/plasmaman/science
/datum/outfit/plasmaman/rd
name = "Research Director Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/rd
uniform = /obj/item/clothing/under/plasmaman/rd
/datum/outfit/plasmaman/robotics
name = "Robotics Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/robotics
uniform = /obj/item/clothing/under/plasmaman/robotics
/datum/outfit/plasmaman/engineering
name = "Engineering Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/engineering
uniform = /obj/item/clothing/under/plasmaman/engineering
/datum/outfit/plasmaman/ce
name = "Chief Engineer Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/engineering/ce
uniform = /obj/item/clothing/under/plasmaman/engineering/ce
/datum/outfit/plasmaman/atmospherics
name = "Atmospherics Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/atmospherics
uniform = /obj/item/clothing/under/plasmaman/atmospherics
/datum/outfit/plasmaman/mime
name = "Plasmamime"
head = /obj/item/clothing/head/helmet/space/plasmaman/mime
uniform = /obj/item/clothing/under/plasmaman/mime
mask = /obj/item/clothing/mask/gas/mime
/datum/outfit/plasmaman/clown
name = "Plasmaclown"
head = /obj/item/clothing/head/helmet/space/plasmaman/clown
uniform = /obj/item/clothing/under/plasmaman/clown
mask = /obj/item/clothing/mask/gas/clown_hat
/datum/outfit/plasmaman/hop
name = "Head of Personnel Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/hop
uniform = /obj/item/clothing/under/plasmaman/hop
/datum/outfit/plasmaman/captain
name = "Captain Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/captain
uniform = /obj/item/clothing/under/plasmaman/captain
/datum/outfit/plasmaman/blueshield
name = "Blueshield Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/blueshield
uniform = /obj/item/clothing/under/plasmaman/blueshield
+190
View File
@@ -0,0 +1,190 @@
// This outfit preserves varedits made on the items
// Created from admin helpers.
/datum/outfit/varedit
var/list/vv_values
var/list/stored_access
var/update_id_name = FALSE //If the name of the human is same as the name on the id they're wearing we'll update provided id when equipping
/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly)
H.delete_equipment() //Applying VV to wrong objects is not reccomended.
. = ..()
/datum/outfit/varedit/proc/set_equipment_by_slot(slot, item_path)
switch(slot)
if(slot_w_uniform)
uniform = item_path
if(slot_back)
back = item_path
if(slot_wear_suit)
suit = item_path
if(slot_belt)
belt = item_path
if(slot_gloves)
gloves = item_path
if(slot_shoes)
shoes = item_path
if(slot_head)
head = item_path
if(slot_wear_mask)
mask = item_path
if(slot_l_ear)
l_ear = item_path
if(slot_r_ear)
r_ear = item_path
if(slot_glasses)
glasses = item_path
if(slot_wear_id)
id = item_path
if(slot_wear_pda)
pda = item_path
if(slot_s_store)
suit_store = item_path
if(slot_l_store)
l_pocket = item_path
if(slot_r_store)
r_pocket = item_path
/proc/collect_vv(obj/item/I)
//Temporary/Internal stuff, do not copy these.
var/static/list/ignored_vars = list("vars","x","y","z","plane","layer","override","animate_movement","pixel_step_size","screen_loc","fingerprintslast","tip_timer")
if(istype(I))
var/list/vedits = list()
for(var/varname in I.vars)
if(!I.can_vv_get(varname))
continue
if(varname in ignored_vars)
continue
var/vval = I.vars[varname]
//Does it even work ?
if(vval == initial(I.vars[varname]))
continue
//Only text/numbers and icons variables to make it less weirdness prone.
if(!istext(vval) && !isnum(vval) && !isicon(vval))
continue
vedits[varname] = I.vars[varname]
return vedits
/mob/living/carbon/human/proc/copy_outfit()
var/datum/outfit/varedit/O = new
//Copy equipment
var/list/result = list()
var/list/slots_to_check = list(slot_w_uniform, slot_back, slot_wear_suit, slot_belt, slot_gloves, slot_shoes, slot_head, slot_wear_mask, slot_l_ear, slot_r_ear, slot_glasses, slot_wear_id, slot_wear_pda, slot_s_store, slot_l_store, slot_r_store)
for(var/s in slots_to_check)
var/obj/item/I = get_item_by_slot(s)
var/vedits = collect_vv(I)
if(vedits)
result["[s]"] = vedits
if(istype(I))
O.set_equipment_by_slot(s, I.type)
//Copy access
O.stored_access = list()
var/obj/item/id_slot = get_item_by_slot(slot_wear_id)
if(id_slot)
O.stored_access |= id_slot.GetAccess()
var/obj/item/card/id/ID = id_slot.GetID()
if(ID && ID.registered_name == real_name)
O.update_id_name = TRUE
//Copy hands
if(l_hand || r_hand) //Not in the mood to let outfits transfer amputees
var/obj/item/left_hand = l_hand
var/obj/item/right_hand = r_hand
if(istype(left_hand))
O.l_hand = left_hand.type
var/vedits = collect_vv(left_hand)
if(vedits)
result["LHAND"] = vedits
if(istype(right_hand))
O.r_hand = right_hand.type
var/vedits = collect_vv(left_hand)
if(vedits)
result["RHAND"] = vedits
O.vv_values = result
//Copy backpack contents if exist.
var/obj/item/backpack = get_item_by_slot(slot_back)
if(istype(backpack) && LAZYLEN(backpack.contents) > 0)
var/list/typecounts = list()
for(var/obj/item/I in backpack)
if(typecounts[I.type])
typecounts[I.type] += 1
else
typecounts[I.type] = 1
O.backpack_contents = typecounts
//TODO : Copy varedits from backpack stuff too.
//Copy implants
O.implants = list()
for(var/obj/item/implant/I in contents)
if(istype(I))
O.implants |= I.type
// Copy cybernetic implants
O.cybernetic_implants = list()
for(var/obj/item/organ/internal/CI in contents)
if(istype(CI))
O.cybernetic_implants |= CI.type
// Copy accessories
var/obj/item/clothing/under/uniform_slot = get_item_by_slot(slot_w_uniform)
if(uniform_slot)
O.accessories = list()
for(var/obj/item/clothing/accessory/A in uniform_slot.accessories)
if(istype(A))
O.accessories |= A
//Copy to outfit cache
var/outfit_name = stripped_input(usr, "Enter the outfit name")
O.name = outfit_name
GLOB.custom_outfits += O
to_chat(usr, "Outfit registered, use select equipment to equip it.")
/datum/outfit/varedit/post_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
//Apply VV
for(var/slot in vv_values)
var/list/edits = vv_values[slot]
var/obj/item/I
switch(slot)
if("LHAND")
I = H.l_hand
if("RHAND")
I = H.r_hand
else
I = H.get_item_by_slot(text2num(slot))
for(var/vname in edits)
I.vv_edit_var(vname,edits[vname])
//Apply access
var/obj/item/id_slot = H.get_item_by_slot(slot_wear_id)
if(id_slot)
var/obj/item/card/id/card = id_slot.GetID()
if(istype(card))
card.access |= stored_access
if(update_id_name)
card.registered_name = H.real_name
card.update_label()
/datum/outfit/varedit/get_json_data()
. = .. ()
.["stored_access"] = stored_access
.["update_id_name"] = update_id_name
var/list/stripped_vv = list()
for(var/slot in vv_values)
var/list/vedits = vv_values[slot]
var/list/stripped_edits = list()
for(var/edit in vedits)
if(istext(vedits[edit]) || isnum(vedits[edit]) || isnull(vedits[edit]))
stripped_edits[edit] = vedits[edit]
if(stripped_edits.len)
stripped_vv[slot] = stripped_edits
.["vv_values"] = stripped_vv
/datum/outfit/varedit/load_from(list/outfit_data)
. = ..()
stored_access = outfit_data["stored_access"]
vv_values = outfit_data["vv_values"]
update_id_name = outfit_data["update_id_name"]
+9 -6
View File
@@ -337,6 +337,13 @@ GLOBAL_LIST_EMPTY(rpd_pipe_list) //Some pipes we don't want to be dispensable
pipe_icon = "intake"
rpd_dispensable = TRUE
/datum/pipes/disposal/sortjunction
pipe_name = "disposals sort junction"
pipe_id = PIPE_DISPOSALS_SORT_RIGHT
orientations = 4
pipe_icon = "pipe-j1s"
rpd_dispensable = TRUE
//Pipes the RPD can't dispense. Since these don't use an interface, we don't need to bother with setting an icon. We do, however, want to name these for other purposes
/datum/pipes/atmospheric/circulator
@@ -363,12 +370,8 @@ GLOBAL_LIST_EMPTY(rpd_pipe_list) //Some pipes we don't want to be dispensable
pipe_name = "bent insulated pipe"
pipe_id = PIPE_INSULATED_BENT
/datum/pipes/disposal/sortjunction
pipe_name = "disposals sort junction"
pipe_id = PIPE_DISPOSALS_SORT_RIGHT
pipe_icon = "pipe-j1s"
/datum/pipes/disposal/sortjunction/left
/datum/pipes/disposal/left_sortjunction
pipe_name = "disposals sort junction left"
pipe_id = PIPE_DISPOSALS_SORT_LEFT
pipe_icon = "pipe-j2s"
+13
View File
@@ -12,6 +12,19 @@
Comes with a rustic wooden bar and suicidal bartender."
suffix = "lavaland_biodome_beach.dmm"
/datum/map_template/ruin/lavaland/biodome/winter
name = "Biodome Winter"
id = "biodome-winter"
description = "For those getaways where you want to get back to nature, but you don't want to leave the fortified military compound where you spend your days. \
Includes a unique(*) laser pistol display case, and the recently introduced I.C.E(tm)."
suffix = "lavaland_biodome_winter.dmm"
/datum/map_template/ruin/lavaland/biodome/clown
name = "Biodome Clown Planet"
id = "biodome-clown"
description = "WELCOME TO CLOWN PLANET! HONK HONK HONK etc.!"
suffix = "lavaland_biodome_clown_planet.dmm"
/datum/map_template/ruin/lavaland/cube
name = "The Wishgranter Cube"
id = "wishgranter-cube"
+1 -2
View File
@@ -1,7 +1,6 @@
/obj/effect/proc_holder/spell/targeted/charge
name = "Charge"
desc = "This spell can be used to recharge a variety of things in your hands, from magical artifacts to electrical components. A creative wizard can even use it to grant magical power to a fellow magic user."
school = "transmutation"
charge_max = 600
clothes_req = 0
@@ -10,7 +9,7 @@
range = -1
cooldown_min = 400 //50 deciseconds reduction per rank
include_user = 1
action_icon_state = "charge"
/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets,mob/user = usr)
for(var/mob/living/L in targets)
+1 -1
View File
@@ -36,7 +36,7 @@
return
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
magichead.flags |= NODROP //curses!
magichead.flags |= NODROP | DROPDEL //curses!
magichead.flags_inv = null //so you can still see their face
magichead.voicechange = 1 //NEEEEIIGHH
target.visible_message( "<span class='danger'>[target]'s face lights up in fire, and after the event a horse's head takes its place!</span>", \
-2
View File
@@ -11,8 +11,6 @@
cooldown_min = 10 //Gun wizard
action_icon_state = "bolt_action"
/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/C in targets)
C.drop_item()
+1
View File
@@ -72,6 +72,7 @@
/obj/effect/proc_holder/spell/noclothes
name = "No Clothes"
desc = "This always-on spell allows you to cast magic without your garments."
action_icon_state = "no_clothes"
/obj/effect/proc_holder/spell/targeted/genetic/mutate
name = "Mutate"
+43
View File
@@ -40,6 +40,49 @@
playsound(owner, 'sound/weapons/bite.ogg', 50, 1)
owner.adjustBruteLoss(3)
/datum/status_effect/blooddrunk
id = "blooddrunk"
duration = 10
tick_interval = 0
alert_type = /obj/screen/alert/status_effect/blooddrunk
/obj/screen/alert/status_effect/blooddrunk
name = "Blood-Drunk"
desc = "You are drunk on blood! Your pulse thunders in your ears! Nothing can harm you!" //not true, and the item description mentions its actual effect
icon_state = "blooddrunk"
/datum/status_effect/blooddrunk/on_apply()
. = ..()
if(.)
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
for(var/X in H.bodyparts)
var/obj/item/organ/external/BP = X
BP.brute_mod *= 0.1
BP.burn_mod *= 0.1
H.dna.species.tox_mod *= 0.1
H.dna.species.oxy_mod *= 0.1
H.dna.species.clone_mod *= 0.1
H.dna.species.stamina_mod *= 0.1
add_attack_logs(owner, owner, "gained blood-drunk stun immunity")
var/status = CANSTUN | CANWEAKEN | CANPARALYSE | IGNORESLOWDOWN
owner.status_flags &= ~status
owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1)
/datum/status_effect/blooddrunk/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
for(var/X in H.bodyparts)
var/obj/item/organ/external/BP = X
BP.brute_mod *= 10
BP.burn_mod *= 10
H.dna.species.tox_mod *= 10
H.dna.species.oxy_mod *= 10
H.dna.species.clone_mod *= 10
H.dna.species.stamina_mod *= 10
add_attack_logs(owner, owner, "lost blood-drunk stun immunity")
owner.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | IGNORESLOWDOWN
/datum/status_effect/exercised
id = "Exercised"
duration = 1200
+33
View File
@@ -9,6 +9,39 @@
if(owner.reagents)
owner.reagents.del_reagent("holywater") //can't be deconverted
/datum/status_effect/crusher_mark
id = "crusher_mark"
duration = 300 //if you leave for 30 seconds you lose the mark, deal with it
status_type = STATUS_EFFECT_REPLACE
alert_type = null
var/mutable_appearance/marked_underlay
var/obj/item/twohanded/kinetic_crusher/hammer_synced
/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/twohanded/kinetic_crusher/new_hammer_synced)
. = ..()
if(.)
hammer_synced = new_hammer_synced
/datum/status_effect/crusher_mark/on_apply()
if(owner.mob_size >= MOB_SIZE_LARGE)
marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2")
marked_underlay.pixel_x = -owner.pixel_x
marked_underlay.pixel_y = -owner.pixel_y
owner.underlays += marked_underlay
return TRUE
return FALSE
/datum/status_effect/crusher_mark/Destroy()
hammer_synced = null
if(owner)
owner.underlays -= marked_underlay
QDEL_NULL(marked_underlay)
return ..()
/datum/status_effect/crusher_mark/be_replaced()
owner.underlays -= marked_underlay //if this is being called, we should have an owner at this point.
..()
/datum/status_effect/saw_bleed
id = "saw_bleed"
duration = -1 //removed under specific conditions
+38
View File
@@ -1,5 +1,43 @@
//entirely neutral or internal status effects go here
/datum/status_effect/crusher_damage //tracks the damage dealt to this mob by kinetic crushers
id = "crusher_damage"
duration = -1
status_type = STATUS_EFFECT_UNIQUE
alert_type = null
var/total_damage = 0
/datum/status_effect/syphon_mark
id = "syphon_mark"
duration = 50
status_type = STATUS_EFFECT_MULTIPLE
alert_type = null
on_remove_on_mob_delete = TRUE
var/obj/item/borg/upgrade/modkit/bounty/reward_target
/datum/status_effect/syphon_mark/on_creation(mob/living/new_owner, obj/item/borg/upgrade/modkit/bounty/new_reward_target)
. = ..()
if(.)
reward_target = new_reward_target
/datum/status_effect/syphon_mark/on_apply()
if(owner.stat == DEAD)
return FALSE
return ..()
/datum/status_effect/syphon_mark/proc/get_kill()
if(!QDELETED(reward_target))
reward_target.get_kill(owner)
/datum/status_effect/syphon_mark/tick()
if(owner.stat == DEAD)
get_kill()
qdel(src)
/datum/status_effect/syphon_mark/on_remove()
get_kill()
. = ..()
/datum/status_effect/high_five
id = "high_five"
duration = 40
+15 -10
View File
@@ -160,12 +160,16 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
containername = "vox life support supplies crate"
/datum/supply_packs/emergency/plasmamansupport
name = "Plasmaman Life Support Supplies"
contains = list(/obj/item/clothing/mask/breath,
/obj/item/tank/emergency_oxygen/plasma,
/obj/item/clothing/suit/space/eva/plasmaman,
/obj/item/clothing/head/helmet/space/eva/plasmaman)
cost = 75
name = "Plasmaman Supply Kit"
contains = list(/obj/item/clothing/under/plasmaman,
/obj/item/clothing/under/plasmaman,
/obj/item/tank/plasma/plasmaman/belt/full,
/obj/item/tank/plasma/plasmaman/belt/full,
/obj/item/clothing/mask/breath,
/obj/item/clothing/mask/breath,
/obj/item/clothing/head/helmet/space/plasmaman,
/obj/item/clothing/head/helmet/space/plasmaman)
cost = 20
containertype = /obj/structure/closet/crate/secure/plasma
containername = "plasmaman life support supplies crate"
access = access_eva
@@ -478,10 +482,10 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/security/securitybarriers
name = "Security Barriers Crate"
contains = list(/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier)
contains = list(/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier,
/obj/item/grenade/barrier)
cost = 20
containername = "security barriers crate"
@@ -1169,6 +1173,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/organic/hydroponics/seeds
name = "Seeds Crate"
contains = list(/obj/item/seeds/chili,
/obj/item/seeds/cotton,
/obj/item/seeds/berry,
/obj/item/seeds/corn,
/obj/item/seeds/eggplant,
+17 -2
View File
@@ -207,6 +207,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 10
job = list("Mime")
/datum/uplink_item/jobspecific/pressure_mod
name = "Kinetic Accelerator Pressure Mod"
desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. Occupies 35% mod capacity."
reference = "KPM"
item = /obj/item/borg/upgrade/modkit/indoors
cost = 5 //you need two for full damage, so total of 10 for maximum damage
job = list("Shaft Miner")
//Chef
/datum/uplink_item/jobspecific/specialsauce
name = "Chef Excellence's Special Sauce"
@@ -892,6 +900,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 3
surplus = 10
/datum/uplink_item/stealthy_weapons/false_briefcase
name = "False Bottomed Briefcase"
desc = "A modified briefcase capable of storing and firing a gun under a false bottom. Use a screwdriver to pry away the false bottom and make modifications. Distinguishable upon close examination due to the added weight."
reference = "FBBC"
item = /obj/item/storage/briefcase/false_bottomed
cost = 3
/datum/uplink_item/stealthy_weapons/soap
name = "Syndicate Soap"
desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. You can also drop it underfoot to slip people."
@@ -1305,7 +1320,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/suits/hardsuit/elite
name = "Elite Syndicate Hardsuit"
desc = "An advanced hardsuit with superior armor and mobility to the standard Syndicate Hardsuit."
item = /obj/item/storage/box/syndie_kit/elite_hardsuit
item = /obj/item/clothing/suit/space/hardsuit/syndi/elite
cost = 8
reference = "ESHS"
excludefrom = list()
@@ -1314,7 +1329,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/suits/hardsuit/shielded
name = "Shielded Hardsuit"
desc = "An advanced hardsuit with built in energy shielding. The shields will rapidly recharge when not under fire."
item = /obj/item/storage/box/syndie_kit/shielded_hardsuit
item = /obj/item/clothing/suit/space/hardsuit/shielded/syndi
cost = 30
reference = "SHS"
excludefrom = list()