| [button("+", i != 1 ? "upvote=[i]" : "", , i == 1)] | " + dat += "[button("-", i != choices.len ? "downvote=[i]" : "", , i == choices.len)] | " + dat += "[i]. [choice] | " + dat += "
| Syndicates |
| Revolutionaries | |
| Head Revolutionary not found! |
| Target(s) | Location |
| Blob | ||
| Progress: [blobs.len]/[mode.blobwincount] | ||
| Blob not found! |
| Growing TS on-station: [count_eggs] egg[count_eggs != 1 ? "s" : ""], [count_spiderlings] spiderling[count_spiderlings != 1 ? "s" : ""]. |
| [message] |
"
dat += "General Settings" - dat += "Attack Animations: [(show_ghostitem_attack) ? "Yes" : "No"]" if(user.client.holder) dat += "Adminhelp sound: [(sound & SOUND_ADMINHELP)?"On":"Off"] " + dat += "Ambient Occlusion: [toggles & AMBIENT_OCCLUSION ? "Enabled" : "Disabled"] " + dat += "Attack Animations: [(show_ghostitem_attack) ? "Yes" : "No"] " if(unlock_content) dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"] " dat += "Custom UI settings: " @@ -451,11 +451,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(user.client.donator_level > 0) dat += "Donator Publicity: [(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"] " dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"] " - dat += "FPS: [clientfps] " - dat += "Ambient Occlusion: [toggles & AMBIENT_OCCLUSION ? "Enabled" : "Disabled"] " + dat += "FPS: [clientfps] " dat += "Ghost Ears: [(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"] " - dat += "Ghost Sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"] " dat += "Ghost Radio: [(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"] " + dat += "Ghost Sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"] " if(check_rights(R_ADMIN,0)) dat += "OOC Color: Change " if(config.allow_Metadata) diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index 731bf06496e..90a4bed6f14 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -18,7 +18,8 @@ ghost_anonsay, exp, clientfps, - atklog + atklog, + fuid FROM [format_table_name("player")] WHERE ckey='[C.ckey]'"} ) @@ -50,6 +51,7 @@ exp = query.item[16] clientfps = text2num(query.item[17]) atklog = text2num(query.item[18]) + fuid = text2num(query.item[19]) //Sanitize ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) @@ -69,6 +71,7 @@ exp = sanitize_text(exp, initial(exp)) clientfps = sanitize_integer(clientfps, 0, 1000, initial(clientfps)) atklog = sanitize_integer(atklog, 0, 100, initial(atklog)) + fuid = sanitize_integer(fuid, 0, 10000000, initial(fuid)) return 1 /datum/preferences/proc/save_preferences(client/C) @@ -87,7 +90,7 @@ UI_style_alpha='[UI_style_alpha]', be_role='[sanitizeSQL(list2params(be_special))]', default_slot='[default_slot]', - toggles='[toggles]', + toggles='[num2text(toggles, 7)]', atklog='[atklog]', sound='[sound]', randomslot='[randomslot]', diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/chameleon.dm similarity index 92% rename from code/modules/clothing/under/chameleon.dm rename to code/modules/clothing/chameleon.dm index b08a1ce72c9..0a0a2e45abd 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -1,478 +1,516 @@ -#define EMP_RANDOMISE_TIME 300 - -/datum/action/chameleon_outfit - name = "Select Chameleon Outfit" - button_icon_state = "chameleon_outfit" - var/list/outfit_options //By default, this list is shared between all instances. It is not static because if it were, subtypes would not be able to have their own. If you ever want to edit it, copy it first. - -/datum/action/chameleon_outfit/New() - ..() - initialize_outfits() - -/datum/action/chameleon_outfit/proc/initialize_outfits() - var/static/list/standard_outfit_options - if(!standard_outfit_options) - standard_outfit_options = list() - for(var/path in subtypesof(/datum/outfit/job)) - var/datum/outfit/O = path - standard_outfit_options[initial(O.name)] = path - sortTim(standard_outfit_options, /proc/cmp_text_asc) - outfit_options = standard_outfit_options - -/datum/action/chameleon_outfit/Trigger() - return select_outfit(owner) - -/datum/action/chameleon_outfit/proc/select_outfit(mob/user) - if(!user || !IsAvailable()) - return FALSE - var/selected = input("Select outfit to change into", "Chameleon Outfit") as null|anything in outfit_options - if(!IsAvailable() || QDELETED(src) || QDELETED(user)) - return FALSE - var/outfit_type = outfit_options[selected] - if(!outfit_type) - return FALSE - var/datum/outfit/O = new outfit_type() - var/list/outfit_types = O.get_chameleon_disguise_info() - - for(var/V in user.chameleon_item_actions) - var/datum/action/item_action/chameleon/change/A = V - var/done = FALSE - for(var/T in outfit_types) - for(var/name in A.chameleon_list) - if(A.chameleon_list[name] == T) - A.update_look(user, T) - outfit_types -= T - done = TRUE - break - if(done) - break - //hardsuit helmets/suit hoods - if(ispath(O.suit, /obj/item/clothing/suit/hooded) && ishuman(user)) - var/mob/living/carbon/human/H = user - //make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat - if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon)) - var/helmet_type - var/obj/item/clothing/suit/hooded/hooded = O.suit - helmet_type = initial(hooded.hoodtype) - - if(helmet_type) - var/obj/item/clothing/head/chameleon/hat = H.head - hat.chameleon_action.update_look(user, helmet_type) - qdel(O) - return TRUE - - -/datum/action/item_action/chameleon/change - name = "Chameleon Change" - var/list/chameleon_blacklist = list() //This is a typecache - var/list/chameleon_list = list() - var/chameleon_type = null - var/chameleon_name = "Item" - - var/emp_timer - -/datum/action/item_action/chameleon/change/Grant(mob/M) - if(M && (owner != M)) - if(!M.chameleon_item_actions) - M.chameleon_item_actions = list(src) - var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit() - O.Grant(M) - else - M.chameleon_item_actions |= src - ..() - -/datum/action/item_action/chameleon/change/Remove(mob/M) - if(M && (M == owner)) - LAZYREMOVE(M.chameleon_item_actions, src) - if(!LAZYLEN(M.chameleon_item_actions)) - var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions - qdel(O) - ..() - -/datum/action/item_action/chameleon/change/proc/initialize_disguises() - if(button) - button.name = "Change [chameleon_name] Appearance" - - chameleon_blacklist |= typecacheof(target.type) - for(var/V in typesof(chameleon_type)) - if(ispath(V) && ispath(V, /obj/item)) - var/obj/item/I = V - if(chameleon_blacklist[V] || (initial(I.flags) & ABSTRACT) || !initial(I.icon_state)) - continue - var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])" - chameleon_list[chameleon_item_name] = I - -/datum/action/item_action/chameleon/change/proc/select_look(mob/user) - var/obj/item/picked_item - var/picked_name - picked_name = input("Select [chameleon_name] to change into", "Chameleon [chameleon_name]", picked_name) as null|anything in chameleon_list - if(!picked_name) - return - picked_item = chameleon_list[picked_name] - if(!picked_item) - return - update_look(user, picked_item) - -/datum/action/item_action/chameleon/change/proc/random_look(mob/user) - var/picked_name = pick(chameleon_list) - // If a user is provided, then this item is in use, and we - // need to update our icons and stuff - - if(user) - update_look(user, chameleon_list[picked_name]) - - // Otherwise, it's likely a random initialisation, so we - // don't have to worry - - else - update_item(chameleon_list[picked_name]) - -/datum/action/item_action/chameleon/change/proc/update_look(mob/user, obj/item/picked_item) - if(isliving(user)) - var/mob/living/C = user - if(C.stat != CONSCIOUS) - return - - update_item(picked_item) - var/obj/item/thing = target - thing.update_slot_icon() - UpdateButtonIcon() - -/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) - target.name = initial(picked_item.name) - target.desc = initial(picked_item.desc) - target.icon_state = initial(picked_item.icon_state) - if(isitem(target)) - var/obj/item/I = target - I.item_state = initial(picked_item.item_state) - I.item_color = initial(picked_item.item_color) - if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing)) - var/obj/item/clothing/CL = I - var/obj/item/clothing/PCL = picked_item - CL.flags_cover = initial(PCL.flags_cover) - target.icon = initial(picked_item.icon) - -/datum/action/item_action/chameleon/change/Trigger() - if(!IsAvailable()) - return - - select_look(owner) - return 1 - -/datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME) - START_PROCESSING(SSprocessing, src) - random_look(owner) - - var/new_value = world.time + amount - if(new_value > emp_timer) - emp_timer = new_value - -/datum/action/item_action/chameleon/change/process() - if(world.time > emp_timer) - STOP_PROCESSING(SSprocessing, src) - return - random_look(owner) - -/obj/item/clothing/under/chameleon -//starts off as black - name = "black jumpsuit" - icon_state = "black" - item_state = "bl_suit" - item_color = "black" - desc = "It's a plain jumpsuit. It has a small dial on the wrist." - sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? - random_sensor = FALSE - resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/clothing/under/chameleon/Initialize() - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/under - chameleon_action.chameleon_name = "Jumpsuit" - chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank), only_root_path = TRUE) - chameleon_action.initialize_disguises() - -/obj/item/clothing/under/chameleon/emp_act(severity) - . = ..() - chameleon_action.emp_randomise() - -/obj/item/clothing/under/chameleon/broken/Initialize() - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/suit/chameleon - name = "armor" - desc = "A slim armored vest that protects against most types of damage." - icon_state = "armor" - item_state = "armor" - blood_overlay_type = "armor" - resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/clothing/suit/chameleon/Initialize() - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/suit - chameleon_action.chameleon_name = "Suit" - chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor), only_root_path = TRUE) - chameleon_action.initialize_disguises() - -/obj/item/clothing/suit/chameleon/emp_act(severity) - . = ..() - chameleon_action.emp_randomise() - -/obj/item/clothing/suit/chameleon/broken/Initialize() - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/glasses/chameleon - name = "Optical Meson Scanner" - desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." - icon_state = "meson" - item_state = "meson" - resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/clothing/glasses/chameleon/Initialize() - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/glasses - chameleon_action.chameleon_name = "Glasses" - chameleon_action.chameleon_blacklist = list() - chameleon_action.initialize_disguises() - -/obj/item/clothing/glasses/chameleon/emp_act(severity) - . = ..() - chameleon_action.emp_randomise() - -/obj/item/clothing/glasses/chameleon/broken/Initialize() - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/gloves/chameleon - desc = "These gloves will protect the wearer from electric shock." - name = "insulated gloves" - icon_state = "yellow" - item_state = "ygloves" - - resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/clothing/gloves/chameleon/Initialize() - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/gloves - chameleon_action.chameleon_name = "Gloves" - chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color), only_root_path = TRUE) - chameleon_action.initialize_disguises() - -/obj/item/clothing/gloves/chameleon/emp_act(severity) - . = ..() - chameleon_action.emp_randomise() - -/obj/item/clothing/gloves/chameleon/broken/Initialize() - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/head/chameleon - name = "grey cap" - desc = "It's a baseball hat in a tasteful grey colour." - icon_state = "greysoft" - item_color = "grey" - - resistance_flags = NONE - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/clothing/head/chameleon/Initialize() - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/head - chameleon_action.chameleon_name = "Hat" - chameleon_action.chameleon_blacklist = list() - chameleon_action.initialize_disguises() - -/obj/item/clothing/head/chameleon/emp_act(severity) - . = ..() - chameleon_action.emp_randomise() - -/obj/item/clothing/head/chameleon/broken/Initialize() - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/mask/chameleon - name = "gas mask" - desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate - icon_state = "gas_alt" - item_state = "gas_alt" - resistance_flags = NONE - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - flags = AIRTIGHT | BLOCK_GAS_SMOKE_EFFECT - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - gas_transfer_coefficient = 0.01 - permeability_coefficient = 0.01 - flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH - - var/obj/item/voice_changer/voice_changer - - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/clothing/mask/chameleon/Initialize() - . = ..() - - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/mask - chameleon_action.chameleon_name = "Mask" - chameleon_action.chameleon_blacklist = list() - chameleon_action.initialize_disguises() - - voice_changer = new(src) - -/obj/item/clothing/mask/chameleon/Destroy() - QDEL_NULL(voice_changer) - return ..() - -/obj/item/clothing/mask/chameleon/emp_act(severity) - . = ..() - chameleon_action.emp_randomise() - -/obj/item/clothing/mask/chameleon/broken/Initialize() - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/clothing/shoes/chameleon - name = "black shoes" - icon_state = "black" - item_color = "black" - desc = "A pair of black shoes." - permeability_coefficient = 0.05 - resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/clothing/shoes/chameleon/Initialize() - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/shoes - chameleon_action.chameleon_name = "Shoes" - chameleon_action.chameleon_blacklist = list() - chameleon_action.initialize_disguises() - -/obj/item/clothing/shoes/chameleon/emp_act(severity) - . = ..() - chameleon_action.emp_randomise() - -/obj/item/clothing/shoes/chameleon/noslip - name = "black shoes" - icon_state = "black" - item_color = "black" - desc = "A pair of black shoes." - flags = NOSLIP - -/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize() - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/storage/backpack/chameleon - name = "backpack" - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/storage/backpack/chameleon/Initialize() - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/storage/backpack - chameleon_action.chameleon_name = "Backpack" - chameleon_action.initialize_disguises() - -/obj/item/storage/backpack/chameleon/emp_act(severity) - . = ..() - chameleon_action.emp_randomise() - -/obj/item/storage/backpack/chameleon/broken/Initialize() - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/storage/belt/chameleon - name = "toolbelt" - desc = "Holds tools." - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/storage/belt/chameleon/Initialize() - . = ..() - - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/storage/belt - chameleon_action.chameleon_name = "Belt" - chameleon_action.initialize_disguises() - -/obj/item/storage/belt/chameleon/emp_act(severity) - . = ..() - chameleon_action.emp_randomise() - -/obj/item/storage/belt/chameleon/broken/Initialize() - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/radio/headset/chameleon - name = "radio headset" - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/radio/headset/chameleon/Initialize() - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/radio/headset - chameleon_action.chameleon_name = "Headset" - chameleon_action.initialize_disguises() - -/obj/item/radio/headset/chameleon/emp_act(severity) - . = ..() - chameleon_action.emp_randomise() - -/obj/item/radio/headset/chameleon/broken/Initialize() - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/pda/chameleon - name = "PDA" - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/pda/chameleon/Initialize() - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/pda - chameleon_action.chameleon_name = "PDA" - chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/pda/heads), only_root_path = TRUE) - chameleon_action.initialize_disguises() - -/obj/item/pda/chameleon/emp_act(severity) - . = ..() - chameleon_action.emp_randomise() - -/obj/item/pda/chameleon/broken/Initialize() - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/stamp/chameleon - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/stamp/chameleon/Initialize() - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/stamp - chameleon_action.chameleon_name = "Stamp" - chameleon_action.initialize_disguises() - -/obj/item/stamp/chameleon/broken/Initialize() - . = ..() +#define EMP_RANDOMISE_TIME 300 + +/datum/action/chameleon_outfit + name = "Select Chameleon Outfit" + button_icon_state = "chameleon_outfit" + var/list/outfit_options //By default, this list is shared between all instances. It is not static because if it were, subtypes would not be able to have their own. If you ever want to edit it, copy it first. + +/datum/action/chameleon_outfit/New() + ..() + initialize_outfits() + +/datum/action/chameleon_outfit/proc/initialize_outfits() + var/static/list/standard_outfit_options + if(!standard_outfit_options) + standard_outfit_options = list() + for(var/path in subtypesof(/datum/outfit/job)) + var/datum/outfit/O = path + standard_outfit_options[initial(O.name)] = path + sortTim(standard_outfit_options, /proc/cmp_text_asc) + outfit_options = standard_outfit_options + +/datum/action/chameleon_outfit/Trigger() + return select_outfit(owner) + +/datum/action/chameleon_outfit/proc/select_outfit(mob/user) + if(!user || !IsAvailable()) + return FALSE + var/selected = input("Select outfit to change into", "Chameleon Outfit") as null|anything in outfit_options + if(!IsAvailable() || QDELETED(src) || QDELETED(user)) + return FALSE + var/outfit_type = outfit_options[selected] + if(!outfit_type) + return FALSE + var/datum/outfit/O = new outfit_type() + var/list/outfit_types = O.get_chameleon_disguise_info() + + for(var/V in user.chameleon_item_actions) + var/datum/action/item_action/chameleon/change/A = V + var/done = FALSE + for(var/T in outfit_types) + for(var/name in A.chameleon_list) + if(A.chameleon_list[name] == T) + A.update_look(user, T) + outfit_types -= T + done = TRUE + break + if(done) + break + //hardsuit helmets/suit hoods + if(ispath(O.suit, /obj/item/clothing/suit/hooded) && ishuman(user)) + var/mob/living/carbon/human/H = user + //make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat + if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon)) + var/helmet_type + var/obj/item/clothing/suit/hooded/hooded = O.suit + helmet_type = initial(hooded.hoodtype) + + if(helmet_type) + var/obj/item/clothing/head/chameleon/hat = H.head + hat.chameleon_action.update_look(user, helmet_type) + qdel(O) + return TRUE + + +/datum/action/item_action/chameleon/change + name = "Chameleon Change" + var/list/chameleon_blacklist = list() //This is a typecache + var/list/chameleon_list = list() + var/chameleon_type = null + var/chameleon_name = "Item" + + var/emp_timer + +/datum/action/item_action/chameleon/change/Grant(mob/M) + if(M && (owner != M)) + if(!M.chameleon_item_actions) + M.chameleon_item_actions = list(src) + var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit() + O.Grant(M) + else + M.chameleon_item_actions |= src + ..() + +/datum/action/item_action/chameleon/change/Remove(mob/M) + if(M && (M == owner)) + LAZYREMOVE(M.chameleon_item_actions, src) + if(!LAZYLEN(M.chameleon_item_actions)) + var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions + qdel(O) + ..() + +/datum/action/item_action/chameleon/change/proc/initialize_disguises() + if(button) + button.name = "Change [chameleon_name] Appearance" + + chameleon_blacklist |= typecacheof(target.type) + for(var/V in typesof(chameleon_type)) + if(ispath(V) && ispath(V, /obj/item)) + var/obj/item/I = V + if(chameleon_blacklist[V] || (initial(I.flags) & ABSTRACT) || !initial(I.icon_state)) + continue + var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])" + chameleon_list[chameleon_item_name] = I + +/datum/action/item_action/chameleon/change/proc/select_look(mob/user) + var/obj/item/picked_item + var/picked_name + picked_name = input("Select [chameleon_name] to change into", "Chameleon [chameleon_name]", picked_name) as null|anything in chameleon_list + if(!picked_name) + return + picked_item = chameleon_list[picked_name] + if(!picked_item) + return + update_look(user, picked_item) + +/datum/action/item_action/chameleon/change/proc/random_look(mob/user) + var/picked_name = pick(chameleon_list) + // If a user is provided, then this item is in use, and we + // need to update our icons and stuff + + if(user) + update_look(user, chameleon_list[picked_name]) + + // Otherwise, it's likely a random initialisation, so we + // don't have to worry + + else + update_item(chameleon_list[picked_name]) + +/datum/action/item_action/chameleon/change/proc/update_look(mob/user, obj/item/picked_item) + if(isliving(user)) + var/mob/living/C = user + if(C.stat != CONSCIOUS) + return + + update_item(picked_item) + var/obj/item/thing = target + thing.update_slot_icon() + UpdateButtonIcon() + +/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) + // Species-related variables are lists, which can not be retrieved using initial(). As such, we need to instantiate the picked item. + var/obj/item/P = new picked_item(null) + + target.name = P.name + target.desc = P.desc + target.icon_state = P.icon_state + + if(isitem(target)) + var/obj/item/I = target + + I.item_state = P.item_state + I.item_color = P.item_color + + I.icon_override = P.icon_override + I.sprite_sheets = P.sprite_sheets + + if(istype(I, /obj/item/clothing) && istype(P, /obj/item/clothing)) + var/obj/item/clothing/CL = I + var/obj/item/clothing/PCL = P + CL.flags_cover = PCL.flags_cover + + target.icon = P.icon + qdel(P) + +/datum/action/item_action/chameleon/change/Trigger() + if(!IsAvailable()) + return + + select_look(owner) + return 1 + +/datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME) + START_PROCESSING(SSprocessing, src) + random_look(owner) + + var/new_value = world.time + amount + if(new_value > emp_timer) + emp_timer = new_value + +/datum/action/item_action/chameleon/change/process() + if(world.time > emp_timer) + STOP_PROCESSING(SSprocessing, src) + return + random_look(owner) + +/obj/item/clothing/under/chameleon + name = "black jumpsuit" + icon_state = "black" + item_state = "bl_suit" + item_color = "black" + desc = "It's a plain jumpsuit. It has a small dial on the wrist." + sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? + random_sensor = FALSE + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/under/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/under + chameleon_action.chameleon_name = "Jumpsuit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/clothing/under/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/under/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/suit/chameleon + name = "armor" + desc = "A slim armored vest that protects against most types of damage." + icon_state = "armor" + item_state = "armor" + blood_overlay_type = "armor" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/suit/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/suit + chameleon_action.chameleon_name = "Suit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/clothing/suit/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/suit/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/glasses/chameleon + name = "Optical Meson Scanner" + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." + icon_state = "meson" + item_state = "meson" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi' + ) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/glasses/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/glasses + chameleon_action.chameleon_name = "Glasses" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/glasses/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/glasses/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/gloves/chameleon + desc = "These gloves will protect the wearer from electric shock." + name = "insulated gloves" + icon_state = "yellow" + item_state = "ygloves" + + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/gloves/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/gloves + chameleon_action.chameleon_name = "Gloves" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/clothing/gloves/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/gloves/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/head/chameleon + name = "grey cap" + desc = "It's a baseball hat in a tasteful grey colour." + icon_state = "greysoft" + item_color = "grey" + + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi' + ) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/head/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/head + chameleon_action.chameleon_name = "Hat" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/head/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/head/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/mask/chameleon + name = "gas mask" + desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate + icon_state = "gas_alt" + item_state = "gas_alt" + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + flags = AIRTIGHT | BLOCK_GAS_SMOKE_EFFECT + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + gas_transfer_coefficient = 0.01 + permeability_coefficient = 0.01 + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Drask" = 'icons/mob/species/drask/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' + ) + + var/obj/item/voice_changer/voice_changer + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/mask/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/mask + chameleon_action.chameleon_name = "Mask" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + + voice_changer = new(src) + +/obj/item/clothing/mask/chameleon/Destroy() + QDEL_NULL(voice_changer) + return ..() + +/obj/item/clothing/mask/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/mask/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/shoes/chameleon + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + permeability_coefficient = 0.05 + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/shoes/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/shoes + chameleon_action.chameleon_name = "Shoes" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/shoes/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/shoes/chameleon/noslip + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + flags = NOSLIP + +/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/backpack/chameleon + name = "backpack" + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/back.dmi' + ) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/backpack/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/backpack + chameleon_action.chameleon_name = "Backpack" + chameleon_action.initialize_disguises() + +/obj/item/storage/backpack/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/storage/backpack/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/belt/chameleon + name = "toolbelt" + desc = "Holds tools." + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/belt/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/belt + chameleon_action.chameleon_name = "Belt" + chameleon_action.initialize_disguises() + +/obj/item/storage/belt/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/storage/belt/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/radio/headset/chameleon + name = "radio headset" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/radio/headset/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/radio/headset + chameleon_action.chameleon_name = "Headset" + chameleon_action.initialize_disguises() + +/obj/item/radio/headset/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/radio/headset/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/pda/chameleon + name = "PDA" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/pda/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/pda + chameleon_action.chameleon_name = "PDA" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/pda/heads), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/pda/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/pda/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/stamp/chameleon + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/stamp/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/stamp + chameleon_action.chameleon_name = "Stamp" + chameleon_action.initialize_disguises() + +/obj/item/stamp/chameleon/broken/Initialize() + . = ..() chameleon_action.emp_randomise(INFINITY) \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 2cc570ded70..4bbf68b4b7f 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -213,7 +213,7 @@ BLIND // can't see anything var/clipped = 0 strip_delay = 20 put_on_delay = 40 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/gloves.dmi', "Drask" = 'icons/mob/species/drask/gloves.dmi' @@ -404,7 +404,7 @@ BLIND // can't see anything permeability_coefficient = 0.50 slowdown = SHOES_SLOWDOWN - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/shoes.dmi' ) @@ -594,12 +594,13 @@ BLIND // can't see anything permeability_coefficient = 0.90 slot_flags = SLOT_ICLOTHING armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) - species_fit = list("Vox", "Drask", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/uniform.dmi', "Drask" = 'icons/mob/species/drask/uniform.dmi', "Grey" = 'icons/mob/species/grey/uniform.dmi' ) + var/has_sensor = TRUE//For the crew computer 2 = unable to change mode var/sensor_mode = SENSOR_OFF var/random_sensor = TRUE @@ -624,12 +625,14 @@ BLIND // can't see anything /obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A) if(istype(A)) - .=1 + . = 1 else return 0 - if(accessories.len && (A.slot in list("utility","armband"))) + if(accessories.len) for(var/obj/item/clothing/accessory/AC in accessories) - if(AC.slot == A.slot) + if((A.slot in list(ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_ARMBAND)) && AC.slot == A.slot) + return 0 + if(!A.allow_duplicates && AC.type == A.type) return 0 /obj/item/clothing/under/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 3a427d96bec..d965166fdb2 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -39,7 +39,7 @@ vision_flags = SEE_TURFS lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE prescription_upgradable = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -88,7 +88,7 @@ origin_tech = "magnets=2;engineering=1" prescription_upgradable = 0 scan_reagents = 1 //You can see reagents while wearing science goggles - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -112,7 +112,7 @@ desc = "These'll keep the soap out of your eyes." icon_state = "purple" item_state = "glasses" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi' ) @@ -125,7 +125,7 @@ origin_tech = "materials=4;magnets=4;plasmatech=4;engineering=4" see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -137,7 +137,7 @@ desc = "Yarr." icon_state = "eyepatch" item_state = "eyepatch" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -149,7 +149,7 @@ icon_state = "monocle" item_state = "headset" // lol prescription_upgradable = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -163,7 +163,7 @@ item_state = "glasses" origin_tech = "magnets=3;engineering=3" vision_flags = SEE_OBJS - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -178,13 +178,22 @@ flags = NODROP flags_cover = null +/obj/item/clothing/glasses/material/lighting + name = "Neutron Goggles" + desc = "These odd glasses use a form of neutron-based imaging to completely negate the effects of light and darkness." + origin_tech = null + vision_flags = 0 + + flags = NODROP + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + /obj/item/clothing/glasses/regular name = "prescription glasses" desc = "Made by Nerd. Co." icon_state = "glasses" item_state = "glasses" prescription = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -201,7 +210,7 @@ name = "3D glasses" icon_state = "3d" item_state = "3d" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -212,7 +221,7 @@ desc = "Forest green glasses, like the kind you'd wear when hatching a nasty scheme." icon_state = "gglasses" item_state = "gglasses" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -228,7 +237,7 @@ flash_protect = 1 tint = 1 prescription_upgradable = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -247,16 +256,16 @@ desc = "Somehow these seem even more out-of-date than normal sunglasses." actions_types = list(/datum/action/item_action/noir) -/obj/item/clothing/glasses/sunglasses/noir/attack_self() - toggle_noir() +/obj/item/clothing/glasses/sunglasses/noir/attack_self(mob/user) + toggle_noir(user) /obj/item/clothing/glasses/sunglasses/noir/item_action_slot_check(slot) if(slot == slot_glasses) return 1 -/obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir() +/obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir(mob/user) color_view = color_view ? null : MATRIX_GREYSCALE //Toggles between null and grayscale, with null being the default option. - usr.update_client_colour() + user.update_client_colour() /obj/item/clothing/glasses/sunglasses/yeah name = "agreeable glasses" @@ -289,7 +298,7 @@ see_in_dark = 1 flash_protect = 1 tint = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -315,7 +324,7 @@ actions_types = list(/datum/action/item_action/toggle) flash_protect = 2 tint = 2 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -385,7 +394,7 @@ vision_flags = SEE_MOBS lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE flash_protect = -1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -416,7 +425,7 @@ desc = "Strangely ancient technology used to help provide rudimentary eye cover." icon_state = "sun" item_state = "sunglasses" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -534,7 +543,7 @@ actions_types = list(/datum/action/item_action/toggle) up = 0 tint = 0 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi' ) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 7f5d73acb1d..59ebb6c9446 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -31,7 +31,7 @@ icon_state = "healthhud" origin_tech = "magnets=3;biotech=2" HUDType = DATA_HUD_MEDICAL_ADVANCED - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -60,7 +60,7 @@ icon_state = "diagnostichud" origin_tech = "magnets=2;engineering=2" HUDType = DATA_HUD_DIAGNOSTIC - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -84,7 +84,7 @@ var/global/list/jobs[0] HUDType = DATA_HUD_SECURITY_ADVANCED var/read_only = FALSE - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -128,7 +128,7 @@ flash_protect = 1 tint = 1 prescription_upgradable = 1 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', @@ -143,7 +143,7 @@ desc = "A heads-up display capable of analyzing the health and status of plants growing in hydro trays and soil." icon_state = "hydroponichud" HUDType = DATA_HUD_HYDROPONIC - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' @@ -166,7 +166,7 @@ flags_cover = GLASSESCOVERSEYES actions_types = list(/datum/action/item_action/toggle) up = 0 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi' ) @@ -182,7 +182,7 @@ flags_cover = GLASSESCOVERSEYES actions_types = list(/datum/action/item_action/toggle) up = 0 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi' ) diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index bbaf5b34e8b..70f0b1944de 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -59,7 +59,7 @@ icon_state = "welding" item_state = "welding" burn_state = FIRE_PROOF - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -126,7 +126,7 @@ icon_state = "swat" item_state = "swat" burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi' ) diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 4a51349e165..0e9d2bac8de 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -11,7 +11,7 @@ flags_inv = 0 actions_types = list(/datum/action/item_action/toggle_helmet_light) burn_state = FIRE_PROOF - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -95,7 +95,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/helmet.dmi' ) \ No newline at end of file diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 6e3a0302cbc..4c915e5fc9c 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -13,7 +13,7 @@ max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 60 burn_state = FIRE_PROOF - species_fit = list("Vox", "Drask", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Drask" = 'icons/mob/species/drask/helmet.dmi', @@ -203,7 +203,7 @@ obj/item/clothing/head/blob item_state = "blobhat" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi' ) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 62873252ad1..c3377296177 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -76,7 +76,7 @@ desc = "A plastic replica of a syndicate agent's space helmet, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/helmet.dmi' ) @@ -90,7 +90,7 @@ flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -103,7 +103,7 @@ flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -265,7 +265,7 @@ icon_state = "chickenhead" item_state = "chickensuit" flags = BLOCKHAIR - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -419,7 +419,7 @@ item_state = "griffinhat" flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -452,7 +452,7 @@ icon_state = "papersack" flags = BLOCKHAIR flags_inv = HIDEFACE|HIDEEARS - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -463,7 +463,7 @@ icon_state = "papersack_smile" flags = BLOCKHAIR flags_inv = HIDEFACE|HIDEEARS - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index ab0dffee5dc..35f346402f9 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -25,7 +25,7 @@ flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) actions_types = list(/datum/action/item_action/toggle) burn_state = FIRE_PROOF - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi', "Unathi" = 'icons/mob/species/unathi/helmet.dmi', @@ -132,7 +132,7 @@ flags_inv = HIDEEARS cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -159,7 +159,7 @@ flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -230,7 +230,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH species_disguise = "High-tech robot" - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/head.dmi' ) @@ -256,10 +256,10 @@ desc = "A band of rubber with a very reflective looking mirror attached to the front of it. One of the early signs of medical budget cuts." icon_state = "head_mirror" item_state = "head_mirror" - species_fit = list("Vox, Drask") + sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/head.dmi', - "Drask" = 'icons/mob/species/drask/head.dmi', - "Grey" = 'icons/mob/species/grey/head.dmi' + "Vox" = 'icons/mob/species/vox/head.dmi', + "Drask" = 'icons/mob/species/drask/head.dmi', + "Grey" = 'icons/mob/species/grey/head.dmi' ) diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 93d420f8ede..81d36884ef2 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -6,7 +6,7 @@ item_color = "cargo" var/flipped = 0 actions_types = list(/datum/action/item_action/flip_cap) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' ) diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index d66daf59760..78034a3c0c8 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -8,7 +8,7 @@ w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/adjust) adjusted_flags = SLOT_HEAD - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -29,7 +29,7 @@ flags = BLOCKHAIR flags_inv = HIDEFACE w_class = WEIGHT_CLASS_SMALL - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 55c305cf449..df229f5b9c3 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -10,14 +10,14 @@ permeability_coefficient = 0.50 actions_types = list(/datum/action/item_action/adjust) burn_state = FIRE_PROOF - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey" ) sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', "Grey" = 'icons/mob/species/grey/mask.dmi', - "Drask" = 'icons/mob/species/drask/mask.dmi' + "Drask" = 'icons/mob/species/drask/mask.dmi', + "Plasmaman" = 'icons/mob/species/plasmaman/mask.dmi' ) /obj/item/clothing/mask/breath/attack_self(var/mob/user) @@ -36,7 +36,6 @@ item_state = "medical" permeability_coefficient = 0.01 put_on_delay = 10 - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") /obj/item/clothing/mask/breath/vox desc = "A weirdly-shaped breath mask." diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 1bd53217770..289250befac 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -10,14 +10,14 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 burn_state = FIRE_PROOF - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', "Drask" = 'icons/mob/species/drask/mask.dmi', - "Grey" = 'icons/mob/species/grey/mask.dmi' + "Grey" = 'icons/mob/species/grey/mask.dmi', + "Plasmaman" = 'icons/mob/species/plasmaman/mask.dmi' ) // **** Welding gas mask **** @@ -62,6 +62,34 @@ var/datum/action/A = X A.UpdateButtonIcon() +/obj/item/clothing/mask/gas/explorer + name = "explorer gas mask" + desc = "A military-grade gas mask that can be connected to an air supply." + icon_state = "gas_mining" + actions_types = list(/datum/action/item_action/adjust) + armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 0, "bio" = 50, "rad" = 0) + resistance_flags = FIRE_PROOF + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', + "Drask" = 'icons/mob/species/drask/mask.dmi', + "Grey" = 'icons/mob/species/grey/mask.dmi' + ) + +/obj/item/clothing/mask/gas/explorer/attack_self(mob/user) + adjustmask(user) + +/obj/item/clothing/mask/gas/explorer/adjustmask(user) + ..() + w_class = mask_adjusted ? WEIGHT_CLASS_SMALL : WEIGHT_CLASS_NORMAL + +/obj/item/clothing/mask/gas/explorer/folded/Initialize() + . = ..() + adjustmask() + //Bane gas mask /obj/item/clothing/mask/banemask name = "bane mask" @@ -194,6 +222,7 @@ name = "security gas mask" desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device, plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you taze them. Do not tamper with the device." icon_state = "sechailer" + item_state = "sechailer" var/phrase = 1 var/aggressiveness = 1 var/safety = 1 diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 231a353e153..85840d5db42 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -11,7 +11,7 @@ var/mute = MUZZLE_MUTE_ALL var/security_lock = FALSE // Requires brig access to remove 0 - Remove as normal var/locked = FALSE //Indicates if a mask is locked, should always start as 0. - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi' ) @@ -89,7 +89,7 @@ resist_time = 150 mute = MUZZLE_MUTE_MUFFLE flags = DROPDEL - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -197,7 +197,7 @@ permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0) actions_types = list(/datum/action/item_action/adjust) - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -216,7 +216,7 @@ icon_state = "fake-moustache" flags_inv = HIDEFACE actions_types = list(/datum/action/item_action/pontificate) - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -295,7 +295,7 @@ var/voicechange = 0 var/temporaryname = " the Horse" var/originalname = "" - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/mask.dmi' ) @@ -390,7 +390,7 @@ desc = "It's the eater of worlds, and of children." icon_state = "pennywise_mask" item_state = "pennywise_mask" - species_fit = list("Vox") + flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR // Bandanas @@ -403,7 +403,7 @@ slot_flags = SLOT_MASK adjusted_flags = SLOT_HEAD icon_state = "bandbotany" - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', diff --git a/code/modules/clothing/patreon/glasses.dm b/code/modules/clothing/patreon/glasses.dm index 8f795b212a2..f52d54f7df2 100644 --- a/code/modules/clothing/patreon/glasses.dm +++ b/code/modules/clothing/patreon/glasses.dm @@ -7,7 +7,7 @@ desc = "Row row!" icon_state = "gar" item_state = "gar" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi' ) diff --git a/code/modules/clothing/patreon/hats.dm b/code/modules/clothing/patreon/hats.dm index bfcc69972e4..abee0cb9466 100644 --- a/code/modules/clothing/patreon/hats.dm +++ b/code/modules/clothing/patreon/hats.dm @@ -9,7 +9,7 @@ icon_state = "mushhat" item_state = "mushhat" flags = BLOCKHAIR - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' ) @@ -20,7 +20,7 @@ desc = "Poshness incarnate." icon_state = "goldtophat" item_state = "goldtophat" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' ) @@ -45,7 +45,7 @@ icon_state = "guardhelm" item_state = "guardhelm" flags = BLOCKHAIR - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' ) @@ -57,7 +57,7 @@ icon_state = "blacksombrero" item_state = "blacksombrero" flags = BLOCKHAIR - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' ) \ No newline at end of file diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index ed4471d7b7c..1805d911caa 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -83,7 +83,7 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team /obj/item/clothing/shoes/magboots/wizard/attack_self(mob/user) if(user) - if(user.mind in ticker.mode.wizards) + if(user.mind in SSticker.mode.wizards) if(magpulse) //faint blue light when shoes are turned on gives a reason to turn them off when not needed in maint set_light(0) else diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index d4411fbdbe6..f878ec0d65e 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -95,6 +95,12 @@ can_cut_open = 1 icon_state = "workboots" +/obj/item/clothing/shoes/workboots/mining + name = "mining boots" + desc = "Steel-toed mining boots for mining in hazardous environments. Very good at keeping toes uncrushed." + icon_state = "explorer" + resistance_flags = FIRE_PROOF + /obj/item/clothing/shoes/winterboots name = "winter boots" desc = "Boots lined with 'synthetic' animal fur." @@ -245,3 +251,35 @@ force = 0 silence_steps = TRUE w_class = WEIGHT_CLASS_SMALL + +/obj/item/clothing/shoes/bhop + name = "jump boots" + desc = "A specialized pair of combat boots with a built-in propulsion system for rapid foward movement." + icon_state = "jetboots" + item_state = "jetboots" + item_color = "hosred" + resistance_flags = FIRE_PROOF + actions_types = list(/datum/action/item_action/bhop) + permeability_coefficient = 0.05 + can_cut_open = FALSE + var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles + var/jumpspeed = 3 + var/recharging_rate = 60 //default 6 seconds between each dash + var/recharging_time = 0 //time until next dash + +/obj/item/clothing/shoes/bhop/ui_action_click(mob/user, action) + if(!isliving(user)) + return + + if(recharging_time > world.time) + to_chat(user, "The boot's internal propulsion needs to recharge still!") + return + + var/atom/target = get_edge_target_turf(user, user.dir) //gets the user's direction + + if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE)) + playsound(src, 'sound/effects/stealthoff.ogg', 50, 1, 1) + user.visible_message("[usr] dashes forward into the air!") + recharging_time = world.time + recharging_rate + else + to_chat(user, "Something prevents you from dashing forward!") \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index 1131f1ee648..099b46a10b9 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -9,7 +9,7 @@ var/obj/machinery/camera/camera var/has_camera = TRUE strip_delay = 130 - species_fit = list("Grey", "Vox") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/helmet.dmi', "Vox" = 'icons/mob/species/vox/helmet.dmi' @@ -42,7 +42,7 @@ /obj/item/radio, /obj/item/analyzer, /obj/item/gun/energy/laser, /obj/item/gun/energy/pulse, \ /obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun, /obj/item/gun/projectile/automatic/lasercarbine, /obj/item/gun/energy/gun/blueshield, /obj/item/gun/energy/immolator/multi) strip_delay = 130 - species_fit = list("Drask", "Vox") + sprite_sheets = list( "Drask" = 'icons/mob/species/drask/suit.dmi', "Vox" = 'icons/mob/species/vox/suit.dmi' @@ -61,7 +61,6 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "hardsuit0-gammacommander" item_color = "gammacommander" - species_fit = null /obj/item/clothing/suit/space/hardsuit/ert/commander name = "emergency response team commander suit" @@ -73,7 +72,6 @@ name = "elite emergency response team commander suit" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "ert_gcommander" - species_fit = null //Security /obj/item/clothing/head/helmet/space/hardsuit/ert/security @@ -88,7 +86,6 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "hardsuit0-gammasecurity" item_color = "gammasecurity" - species_fit = null /obj/item/clothing/suit/space/hardsuit/ert/security name = "emergency response team security suit" @@ -100,7 +97,6 @@ name = "elite emergency response team security suit" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "ert_gsecurity" - species_fit = null //Engineer /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer @@ -116,7 +112,6 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "hardsuit0-gammaengineer" item_color = "gammaengineer" - species_fit = null /obj/item/clothing/suit/space/hardsuit/ert/engineer name = "emergency response team engineer suit" @@ -128,7 +123,6 @@ name = "elite emergency response team engineer suit" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "ert_gengineer" - species_fit = null //Medical /obj/item/clothing/head/helmet/space/hardsuit/ert/medical @@ -142,7 +136,6 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "hardsuit0-gammamedical" item_color = "gammamedical" - species_fit = null /obj/item/clothing/suit/space/hardsuit/ert/medical name = "emergency response team medical suit" @@ -153,7 +146,6 @@ name = "elite emergency response team medical suit" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "ert_gmedical" - species_fit = null //Janitor /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor @@ -167,8 +159,6 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "hardsuit0-gammajanitor" item_color = "gammajanitor" - species_fit = null - /obj/item/clothing/suit/space/hardsuit/ert/janitor name = "emergency response team janitor suit" desc = "A suit worn by the janitorial of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured, space ready, and fire resistant." @@ -178,7 +168,6 @@ name = "elite emergency response team janitor suit" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT icon_state = "ert_gjanitor" - species_fit = null //Paranormal /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 9a0354b6b0f..ead2c04016d 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -498,7 +498,7 @@ armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - species_fit = list("Grey") + sprite_sheets = list( "Grey" = 'icons/mob/species/grey/helmet.dmi' ) diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 91b28ad3206..9706b254fa8 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -8,7 +8,7 @@ permeability_coefficient = 0.01 armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Vox", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Grey" = 'icons/mob/species/grey/helmet.dmi' @@ -32,7 +32,7 @@ allowed = list(/obj/item/tank, /obj/item/flashlight,/obj/item/gun/energy, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton,/obj/item/restraints/handcuffs) armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -73,7 +73,7 @@ armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20) strip_delay = 120 species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -100,13 +100,14 @@ name = "Santa's hat" desc = "Ho ho ho. Merrry X-mas!" icon_state = "santahat" - species_fit = list("Grey, Drask") + sprite_sheets = list( "Grey" = 'icons/mob/species/Grey/head.dmi', "Drask" = 'icons/mob/species/Drask/helmet.dmi' ) flags = BLOCKHAIR | STOPSPRESSUREDMAGE flags_cover = HEADCOVERSEYES + /obj/item/clothing/head/helmet/space/santahat/attack_self(mob/user as mob) if(src.icon_state == "santahat") src.icon_state = "santahat_beard" @@ -159,7 +160,7 @@ item_state = "paramedic-eva-helmet" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Grey" = 'icons/mob/species/grey/helmet.dmi', @@ -180,7 +181,7 @@ desc = "A brand new paramedic EVA suit. The nitrile seems a bit too thin to be space proof. Used for retrieving bodies in space." armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Vox", "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi', "Skrell" = 'icons/mob/species/skrell/suit.dmi', @@ -200,7 +201,7 @@ desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies." armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin") + sprite_sheets = list( "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', "Unathi" = 'icons/mob/species/unathi/suit.dmi', @@ -223,7 +224,7 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) flash_protect = 0 species_restricted = list("exclude", "Diona", "Wryn") - species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin", "Grey") + sprite_sheets = list( "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', "Unathi" = 'icons/mob/species/unathi/helmet.dmi', @@ -244,7 +245,6 @@ icon_state = "spacemimehelmet" item_state = "spacemimehelmet" species_restricted = list("exclude","Diona","Vox","Wryn") - species_fit = null sprite_sheets = null sprite_sheets_obj = null @@ -255,7 +255,6 @@ icon_state = "spacemime_suit" item_state = "spacemime_items" species_restricted = list("exclude","Diona","Vox","Wryn") - species_fit = null sprite_sheets = null sprite_sheets_obj = null @@ -266,7 +265,6 @@ icon_state = "clownhelmet" item_state = "clownhelmet" species_restricted = list("exclude","Diona","Vox","Wryn") - species_fit = null sprite_sheets = null sprite_sheets_obj = null @@ -277,6 +275,6 @@ icon_state = "spaceclown_suit" item_state = "spaceclown_items" species_restricted = list("exclude","Diona","Vox","Wryn") - species_fit = null sprite_sheets = null sprite_sheets_obj = null + \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 57588f29d62..e355aead650 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -235,6 +235,16 @@ base_state = "plasmamanMiner_helmet" armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50) +/obj/item/clothing/suit/space/eva/plasmaman/explorer + name = "plasmaman explorer suit" + icon_state = "plasmamanExplorer_suit" + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50) + +/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer + name = "plasmaman explorer helmet" + icon_state = "plasmamanExplorer_helmet0" + base_state = "plasmamanExplorer_helmet" + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50) // MEDSCI diff --git a/code/modules/clothing/suits/alien.dm b/code/modules/clothing/suits/alien.dm index 664e1dea237..1a2fabea889 100644 --- a/code/modules/clothing/suits/alien.dm +++ b/code/modules/clothing/suits/alien.dm @@ -1,6 +1,5 @@ //Unathi clothing. /obj/item/clothing/suit/unathi/ - species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 87d79e5f5ff..96c2ed46f7a 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -8,7 +8,7 @@ strip_delay = 60 put_on_delay = 40 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -91,7 +91,6 @@ desc = "A vest drenched in the blood of Greytide. It has seen better days." icon_state = "bloody_armor" item_state = "bloody_armor" - species_fit = null sprite_sheets = null /obj/item/clothing/suit/armor/secjacket @@ -137,7 +136,6 @@ icon_state = "jensencoat" item_state = "jensencoat" flags_inv = 0 - species_fit = null sprite_sheets = null /obj/item/clothing/suit/armor/vest/warden @@ -383,7 +381,6 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - species_fit = null sprite_sheets = null armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100) @@ -476,4 +473,68 @@ heat_protection = UPPER_TORSO|LOWER_TORSO max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT burn_state = FIRE_PROOF - armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) \ No newline at end of file + armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) + +//LAVALAND! + +/obj/item/clothing/suit/hooded/drake + name = "drake armour" + icon_state = "dragon" + item_state = "dragon" + desc = "A suit of armour fashioned from the remains of an ash drake." + allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/twohanded/spear) + armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100) + hoodtype = /obj/item/clothing/head/hooded/drake + heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + resistance_flags = FIRE_PROOF + +/obj/item/clothing/head/hooded/drake + name = "drake helmet" + icon_state = "dragon" + item_state = "dragon" + desc = "The skull of a dragon." + armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100) + heat_protection = HEAD + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + resistance_flags = FIRE_PROOF + flags = BLOCKHAIR + flags_cover = HEADCOVERSEYES + +/obj/item/clothing/suit/hooded/goliath + name = "goliath cloak" + icon_state = "goliath_cloak" + item_state = "goliath_cloak" + desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits." + allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/twohanded/spear) + armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot + hoodtype = /obj/item/clothing/head/hooded/goliath + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + +/obj/item/clothing/head/hooded/goliath + name = "goliath cloak hood" + icon_state = "golhood" + item_state = "golhood" + desc = "A protective & concealing hood." + armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) + flags = BLOCKHAIR + flags_cover = HEADCOVERSEYES + +/obj/item/clothing/suit/armor/bone + name = "bone armor" + desc = "A tribal armor plate, crafted from animal bone." + icon_state = "bonearmor" + item_state = "bonearmor" + blood_overlay_type = "armor" + armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS + +/obj/item/clothing/head/skullhelmet + name = "skull helmet" + desc = "An intimidating tribal helmet, it doesn't look very comfortable." + flags = BLOCKHAIR + flags_cover = HEADCOVERSEYES + armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 10, "bio" = 5, "rad" = 20, "fire" = 40, "acid" = 20) + icon_state = "skull" + item_state = "skull" \ No newline at end of file diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 0c85db3d533..86130ba8008 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -9,7 +9,7 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES burn_state = FIRE_PROOF - species_fit = list("Vox", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Grey" = 'icons/mob/species/grey/head.dmi' @@ -33,7 +33,7 @@ strip_delay = 70 put_on_delay = 70 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -97,5 +97,5 @@ item_state = "bio_suit" strip_delay = 40 put_on_delay = 20 - species_fit = null + sprite_sheets = null diff --git a/code/modules/clothing/suits/hood.dm b/code/modules/clothing/suits/hood.dm index 3718a16602c..5b2266bb53b 100644 --- a/code/modules/clothing/suits/hood.dm +++ b/code/modules/clothing/suits/hood.dm @@ -23,6 +23,12 @@ /obj/item/clothing/head/berserkerhood flags = NODROP +/obj/item/clothing/head/hooded/drake + flags = NODROP + +/obj/item/clothing/head/hooded/goliath + flags = NODROP + /obj/item/clothing/suit/hooded/New() MakeHood() ..() diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 2d20a1d2937..06a3f35fa29 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -10,7 +10,7 @@ allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \ /obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -25,7 +25,7 @@ /obj/item/healthanalyzer, /obj/item/flashlight, \ /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser) armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -39,7 +39,7 @@ blood_overlay_type = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO allowed = list(/obj/item/reagent_containers/spray/plantbgone,/obj/item/plant_analyzer,/obj/item/seeds,/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/cultivator,/obj/item/reagent_containers/spray/pestspray,/obj/item/hatchet,/obj/item/storage/bag/plants) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -54,7 +54,7 @@ flags_inv = HIDEJUMPSUIT flags_size = ONESIZEFITSALL allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/flash, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/emergency_oxygen) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -66,7 +66,7 @@ item_state = "bio_suit" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEJUMPSUIT - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -87,7 +87,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS hoodtype = /obj/item/clothing/head/chaplain_hood allowed = list(/obj/item/storage/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/emergency_oxygen) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -102,7 +102,7 @@ flags_inv = HIDESHOES|HIDEJUMPSUIT hoodtype = /obj/item/clothing/head/nun_hood allowed = list(/obj/item/storage/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/emergency_oxygen) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -142,7 +142,7 @@ permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS allowed = list (/obj/item/kitchen/knife) - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -185,7 +185,7 @@ cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_size = ONESIZEFITSALL - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -222,7 +222,7 @@ cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_size = ONESIZEFITSALL - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -236,14 +236,13 @@ blood_overlay_type = "armor" allowed = list (/obj/item/flashlight, /obj/item/t_scanner, /obj/item/tank/emergency_oxygen) burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) //Lawyer /obj/item/clothing/suit/storage/lawyer - species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -315,7 +314,7 @@ suit_adjusted = 1 actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -330,7 +329,7 @@ ignore_suitadjust = 0 actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -348,7 +347,7 @@ suit_adjusted = 1 actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -360,11 +359,19 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "suspenders" blood_overlay_type = "armor" //it's the less thing that I can put here - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) +// Surgeon +/obj/item/clothing/suit/apron/surgical + name = "surgical apron" + desc = "A sterile blue surgical apron." + icon_state = "surgical" + item_state = "surgical" + allowed = list(/obj/item/scalpel, /obj/item/surgical_drapes, /obj/item/cautery, /obj/item/hemostat, /obj/item/retractor) + //Research Director /obj/item/clothing/suit/mantle/labcoat name = "research director's mantle" @@ -372,4 +379,4 @@ icon_state = "rdmantle" item_state = "rdmantle" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser) - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0) \ No newline at end of file + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index c7ab509fb2c..f3759a67786 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -9,7 +9,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0) - species_fit = list("Vox","Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi', "Grey" = 'icons/mob/species/grey/suit.dmi' diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 0903710ddc8..25fa28931d3 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -18,7 +18,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO allowed = list (/obj/item/gun/energy/laser/tag/blue) burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -32,7 +32,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO allowed = list (/obj/item/gun/energy/laser/tag/red) burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -45,7 +45,7 @@ desc = "Yarr." icon_state = "pirate_old" item_state = "pirate_old" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -55,7 +55,7 @@ desc = "Yarr." icon_state = "pirate" item_state = "pirate" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -117,7 +117,7 @@ item_state = "wcoat" blood_overlay_type = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -262,7 +262,7 @@ desc = "Your classic, non-racist poncho." icon_state = "classicponcho" item_state = "classicponcho" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -351,7 +351,7 @@ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - species_fit = list("Vox") + sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') /obj/item/clothing/head/winterhood @@ -363,7 +363,7 @@ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT flags = NODROP|BLOCKHAIR flags_inv = HIDEEARS - species_fit = list("Vox") + sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi') /obj/item/clothing/suit/hooded/wintercoat/captain @@ -474,7 +474,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen) hoodtype = /obj/item/clothing/head/hood - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -487,7 +487,7 @@ cold_protection = HEAD flags = NODROP|BLOCKHAIR flags_inv = HIDEEARS - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' ) @@ -549,7 +549,7 @@ desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it but it's pretty close. Good for sleeping in." icon_state = "ianshirt" item_state = "ianshirt" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -599,7 +599,7 @@ desc = "It makes you stand out. Just the opposite of why it's typically worn. Nice try trying to blend in while wearing it." icon_state = "brtrenchcoat" item_state = "brtrenchcoat" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -609,7 +609,7 @@ desc = "That shade of black just makes you look a bit more evil. Good for those mafia types." icon_state = "bltrenchcoat" item_state = "bltrenchcoat" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -626,7 +626,7 @@ suit_adjusted = 1 actions_types = list(/datum/action/item_action/openclose) adjust_flavour = "unzip" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -760,7 +760,7 @@ cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS actions_types = list(/datum/action/item_action/zipper) adjust_flavour = "unzip" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -806,7 +806,7 @@ ignore_suitadjust = 0 actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -819,7 +819,7 @@ ignore_suitadjust = 0 actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 267a3c86802..f3b06e30c83 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -33,7 +33,7 @@ /obj/item/clothing/suit/fire/firefighter icon_state = "firesuit" item_state = "firefighter" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -52,7 +52,7 @@ icon_state = "atmos_firesuit" item_state = "firesuit_atmos" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -75,7 +75,7 @@ strip_delay = 70 put_on_delay = 70 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', "Grey" = 'icons/mob/species/grey/head.dmi' @@ -101,7 +101,7 @@ strip_delay = 70 put_on_delay = 70 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -129,7 +129,7 @@ strip_delay = 60 put_on_delay = 60 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi', "Grey" = 'icons/mob/species/grey/head.dmi' @@ -152,7 +152,7 @@ strip_delay = 60 put_on_delay = 60 burn_state = FIRE_PROOF - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 9d2c29e2679..9f225e48884 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -7,9 +7,10 @@ item_color = "bluetie" slot_flags = SLOT_TIE w_class = WEIGHT_CLASS_SMALL - var/slot = "decor" + var/slot = ACCESSORY_SLOT_DECOR var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to var/image/inv_overlay = null //overlay used when attached to clothing. + var/allow_duplicates = TRUE // Allow accessories of the same type. /obj/item/clothing/accessory/New() ..() @@ -117,7 +118,7 @@ icon_state = "waistcoat" item_state = "waistcoat" item_color = "waistcoat" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -378,6 +379,31 @@ item_color = "necklace" slot_flags = SLOT_TIE +/obj/item/clothing/accessory/necklace/dope + name = "gold necklace" + desc = "Damn, it feels good to be a gangster." + icon_state = "bling" + item_state = "bling" + item_color = "bling" + +/obj/item/clothing/accessory/necklace/skullcodpiece + name = "skull codpiece" + desc = "A skull shaped ornament, intended to protect the important things in life." + icon_state = "skull" + item_state = "skull" + item_color = "skull" + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5) + allow_duplicates = FALSE + +/obj/item/clothing/accessory/necklace/talisman + name = "bone talisman" + desc = "A hunter's talisman, some say the old gods smile on those who wear it." + icon_state = "talisman" + item_state = "talisman" + item_color = "talisman" + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5) + allow_duplicates = FALSE + /obj/item/clothing/accessory/necklace/locket name = "gold locket" desc = "A gold locket that seems to have space for a photo within." @@ -436,7 +462,7 @@ icon_state = "cowboyshirt" item_state = "cowboyshirt" item_color = "cowboyshirt" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -447,7 +473,7 @@ icon_state = "cowboyshirt_s" item_state = "cowboyshirt_s" item_color = "cowboyshirt_s" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -458,7 +484,7 @@ icon_state = "cowboyshirt_white" item_state = "cowboyshirt_white" item_color = "cowboyshirt_white" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -469,7 +495,7 @@ icon_state = "cowboyshirt_whites" item_state = "cowboyshirt_whites" item_color = "cowboyshirt_whites" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -480,7 +506,7 @@ icon_state = "cowboyshirt_pink" item_state = "cowboyshirt_pink" item_color = "cowboyshirt_pink" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -491,7 +517,7 @@ icon_state = "cowboyshirt_pinks" item_state = "cowboyshirt_pinks" item_color = "cowboyshirt_pinks" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -502,7 +528,7 @@ icon_state = "cowboyshirt_navy" item_state = "cowboyshirt_navy" item_color = "cowboyshirt_navy" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -513,7 +539,7 @@ icon_state = "cowboyshirt_navys" item_state = "cowboyshirt_navys" item_color = "cowboyshirt_navys" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -524,7 +550,7 @@ icon_state = "cowboyshirt_red" item_state = "cowboyshirt_red" item_color = "cowboyshirt_red" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) @@ -535,7 +561,7 @@ icon_state = "cowboyshirt_reds" item_state = "cowboyshirt_reds" item_color = "cowboyshirt_reds" - species_fit = list("Vox", "Drask", "Grey") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi', "Drask" = 'icons/mob/species/drask/suit.dmi', diff --git a/code/modules/clothing/under/accessories/armband.dm b/code/modules/clothing/under/accessories/armband.dm index 90bcf90ec62..23a22fd77e7 100644 --- a/code/modules/clothing/under/accessories/armband.dm +++ b/code/modules/clothing/under/accessories/armband.dm @@ -3,7 +3,7 @@ desc = "A fancy red armband!" icon_state = "red" item_color = "red" - slot = "armband" + slot = ACCESSORY_SLOT_ARMBAND /obj/item/clothing/accessory/armband/sec name = "security armband" diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 1a1d5d1a98b..29b89e8418d 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -3,7 +3,7 @@ desc = "A handgun holster." icon_state = "holster" item_color = "holster" - slot = "utility" + slot = ACCESSORY_SLOT_UTILITY var/holster_allow = /obj/item/gun var/obj/item/gun/holstered = null actions_types = list(/datum/action/item_action/accessory/holster) diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 3b2e9c75a20..16eb1cd476a 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -3,7 +3,7 @@ desc = "Used to hold things when you don't have enough hands." icon_state = "webbing" item_color = "webbing" - slot = "utility" + slot = ACCESSORY_SLOT_UTILITY var/slots = 3 var/obj/item/storage/internal/hold actions_types = list(/datum/action/item_action/accessory/storage) @@ -78,7 +78,7 @@ desc = "Sturdy mess of synthcotton belts and buckles, ready to share your burden." icon_state = "webbing" item_color = "webbing" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 08c7c403ff5..e7f29305929 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -120,7 +120,7 @@ desc = "Groovy!" icon_state = "psyche" item_color = "psyche" - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/uniform.dmi' ) diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 4b1588f09cf..6bfd40ad0ad 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -217,6 +217,15 @@ item_color = "miner" flags_size = ONESIZEFITSALL +/obj/item/clothing/under/rank/miner/lavaland + desc = "A green uniform for operating in hazardous environments." + name = "shaft miner's jumpsuit" + icon_state = "explorer" + item_state = "explorer" + item_color = "explorer" + + sprite_sheets = list() + /obj/item/clothing/under/barber desc = "It's a barber's uniform." name = "barber's uniform" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index da905dd1e75..cfd828aeab1 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -85,7 +85,7 @@ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) flags_size = ONESIZEFITSALL strip_delay = 50 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/uniform.dmi' ) diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 1cce81c12c2..adcb1639c12 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -381,6 +381,10 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS burn_state = FIRE_PROOF +/obj/item/clothing/under/gladiator/ash_walker + desc = "This gladiator uniform appears to be covered in ash and fairly dated." + has_sensor = FALSE + //dress /obj/item/clothing/under/dress/dress_fire diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index bc99aa07b0e..f4f952d4db5 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -391,6 +391,77 @@ reqs = list(/obj/item/grown/log = 5) result = /obj/structure/bonfire category = CAT_PRIMAL + +/datum/crafting_recipe/boneaxe + name = "Bone Axe" + result = /obj/item/twohanded/fireaxe/boneaxe + time = 50 + reqs = list(/obj/item/stack/sheet/bone = 6, + /obj/item/stack/sheet/sinew = 3) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonespear + name = "Bone Spear" + result = /obj/item/twohanded/spear/bonespear + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 4, + /obj/item/stack/sheet/sinew = 1) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonedagger + name = "Bone Dagger" + result = /obj/item/kitchen/knife/combat/survival/bone + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonecodpiece + name = "Skull Codpiece" + result = /obj/item/clothing/accessory/necklace/skullcodpiece + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 1) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonetalisman + name = "Bone Talisman" + result = /obj/item/clothing/accessory/necklace/talisman + time = 20 + reqs = list(/obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/sinew = 1) + category = CAT_PRIMAL + +/datum/crafting_recipe/bonearmor + name = "Bone Armor" + result = /obj/item/clothing/suit/armor/bone + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 6) + category = CAT_PRIMAL + +/datum/crafting_recipe/skullhelm + name = "Skull Helmet" + result = /obj/item/clothing/head/skullhelmet + time = 30 + reqs = list(/obj/item/stack/sheet/bone = 4) + category = CAT_PRIMAL + +/datum/crafting_recipe/goliathcloak + name = "Goliath Cloak" + result = /obj/item/clothing/suit/hooded/goliath + time = 50 + reqs = list(/obj/item/stack/sheet/leather = 2, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 2) + category = CAT_PRIMAL + +/datum/crafting_recipe/drakecloak + name = "Ash Drake Armour" + result = /obj/item/clothing/suit/hooded/drake + time = 60 + reqs = list(/obj/item/stack/sheet/bone = 10, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/sheet/animalhide/ashdrake = 5) + category = CAT_PRIMAL /datum/crafting_recipe/guillotine name = "Guillotine" diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index d2b32f720cf..c7ad35e5f47 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -323,7 +323,6 @@ if(!has_action) new /datum/action/item_action/openclose(jacket)//this actually works jacket.adjust_flavour = "unbutton" - jacket.species_fit = null jacket.sprite_sheets = null user.update_inv_wear_suit() qdel(src) @@ -345,7 +344,6 @@ M.desc = "It looks heavily modified, but otherwise functions as a gas mask. The words “Property of Yon-Dale†can be seen on the inner band." M.icon = 'icons/obj/custom_items.dmi' M.icon_state = "gas_tariq" - M.species_fit = list("Vulpkanin") M.sprite_sheets = list( "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) @@ -844,7 +842,6 @@ actions_types = list() ignore_suitadjust = 1 adjust_flavour = null - species_fit = null sprite_sheets = null /obj/item/clothing/suit/storage/labcoat/fluff/pulsecoat //ozewse : Daniel Harper : Donated to them by Runemeds, who is the original donor. @@ -934,7 +931,6 @@ desc = "A labcoat with a few markings denoting it as the labcoat of roboticist." icon = 'icons/obj/custom_items.dmi' icon_state = "aeneasrinil_open" - species_fit = null sprite_sheets = null /obj/item/clothing/suit/jacket/fluff/kidosvest // Anxipal: Kido Qasteth @@ -946,7 +942,6 @@ ignore_suitadjust = 1 actions_types = list() adjust_flavour = null - species_fit = null sprite_sheets = null /obj/item/clothing/suit/jacket/fluff/jacksvest // Anxipal: Jack Harper @@ -957,7 +952,6 @@ ignore_suitadjust = TRUE actions_types = list() adjust_flavour = null - species_fit = null sprite_sheets = null /obj/item/clothing/suit/fluff/kluys // Kluys: Cripty Pandaen @@ -997,7 +991,6 @@ desc = "A suit that protects against minor chemical spills. Has a red stripe on the shoulders and rolled up sleeves." icon = 'icons/obj/custom_items.dmi' icon_state = "labcoat_red_open" - species_fit = null sprite_sheets = null /obj/item/clothing/suit/storage/labcoat/fluff/ionward_labcoat // Ionward: Gemini @@ -1005,7 +998,6 @@ desc = "A thin, faded, carbon fiber labcoat. On the back, a Technocracy vessel's logo. Inside, the name 'Gemini' is printed on the collar." icon = 'icons/obj/custom_items.dmi' icon_state = "ionward_labcoat_open" - species_fit = null sprite_sheets = null /obj/item/clothing/suit/fluff/stobarico_greatcoat // Stobarico: F.U.R.R.Y @@ -1059,7 +1051,7 @@ desc = "A somewhat worn but well kept set of vox tactical webbing. It has a couple of pouches attached." icon = 'icons/obj/custom_items.dmi' icon_state = "k3_webbing" - species_fit = list("Vox") + sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') ignore_suitadjust = 0 actions_types = list(/datum/action/item_action/toggle) @@ -1338,7 +1330,6 @@ ignore_suitadjust = TRUE actions_types = list() adjust_flavour = null - species_fit = null sprite_sheets = null /obj/item/clothing/under/fluff/fox @@ -1481,7 +1472,6 @@ icon = 'icons/obj/clothing/ties.dmi' icon_state = "vest_black" item_state = "vest_black" - species_fit = null sprite_sheets = null /obj/item/clothing/under/pants/fluff/combat @@ -1498,7 +1488,6 @@ item_state = "elliot_windbreaker_open" adjust_flavour = "unzip" suit_adjusted = 1 - species_fit = null sprite_sheets = null /obj/item/storage/backpack/fluff/syndiesatchel //SkeletalElite: Rawkkihiki @@ -1723,7 +1712,6 @@ icon = 'icons/obj/custom_items.dmi' lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi' righthand_file = 'icons/mob/inhands/fluff_righthand.dmi' - species_fit = list("Vox") sprite_sheets = list("Vox" = 'icons/mob/species/vox/uniform.dmi') icon_state = "kiaoutfit" item_state = "kiaoutfit" @@ -1747,7 +1735,6 @@ icon = 'icons/obj/custom_items.dmi' lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi' righthand_file = 'icons/mob/inhands/fluff_righthand.dmi' - species_fit = list("Vox") sprite_sheets = list("Vox" = 'icons/mob/species/vox/mask.dmi') icon_state = "kiamask" item_state = "kiamask" @@ -1785,4 +1772,3 @@ item_state = "voxbodysuit" item_color = "voxbodysuit" body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - species_fit = list("Vox") \ No newline at end of file diff --git a/code/modules/discord/accountlink.dm b/code/modules/discord/accountlink.dm deleted file mode 100644 index c65d7da1440..00000000000 --- a/code/modules/discord/accountlink.dm +++ /dev/null @@ -1,52 +0,0 @@ -// DONT TOUCH ANYTHING IN HERE UNLESS YOU KNOW WHAT YOU ARE DOING -affected -/client/verb/linkdiscord() - set category = "Special Verbs" - set name = "Link Discord Account" - set desc = "Link your discord account to your BYOND account." - var/user_ckey = sanitizeSQL(usr.ckey) // Probably not neccassary but better safe than sorry - if(!config.sql_enabled) - to_chat(src, "This is feature requires the SQL backend") - return - var/DBQuery/db_discord_id = dbcon.NewQuery("SELECT discord_id FROM [format_table_name("discord")] WHERE ckey = '[user_ckey]'") - if(!db_discord_id.Execute()) - var/err = db_discord_id.ErrorMsg() - log_game("SQL ERROR while selecting discord account. Error : \[[err]\]\n") - to_chat(src, "Error checking Discord account. Please inform an administrator") - return - var/stored_id - while(db_discord_id.NextRow()) - stored_id = db_discord_id.item[1] - if(!stored_id) // Not linked - var/know_how = alert("Do you know how to get a discord user ID? This ID is NOT your discord username and numbers!","Question","Yes","No") - if(know_how == "No") // Opens discord support on how to collect IDs - src << link("https://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID") - var/entered_id = input("Please enter your Discord ID.", "Enter Discord ID", null, null) as text|null - var/sql_id = sanitizeSQL(entered_id) - var/DBQuery/store_discord_id = dbcon.NewQuery("INSERT INTO [format_table_name("discord")] (ckey, discord_id, notify) VALUES ('[user_ckey]', [sql_id], 0)") - if(!store_discord_id.Execute()) - var/err = db_discord_id.ErrorMsg() - log_game("SQL ERROR while linking discord account. Error : \[[err]\]\n") - to_chat(src, "Error linking Discord account. Please inform an administrator") - return - to_chat(src, "Successfully linked discord account [entered_id] to [user_ckey]") - else // Linked - var/choice = alert("You already have the Discord Account [stored_id] linked to [user_ckey]. Would you like to unlink or replace","Already Linked","Unlink","Replace") - switch(choice) - if("Unlink") - var/DBQuery/unlink_discord_id = dbcon.NewQuery("DELETE FROM [format_table_name("discord")] WHERE ckey = '[user_ckey]'") - if(!unlink_discord_id.Execute()) - var/err = unlink_discord_id.ErrorMsg() - log_game("SQL ERROR while unlinking discord account. Error : \[[err]\]\n") - to_chat(src, "Error unlinking Discord account. Please inform an administrator") - return - to_chat(src, "Successfully unlinked discord account") - if("Replace") - var/entered_id = input("Please enter your Discord ID. Instructions can be found at https://bit.ly/2AfUu40", "Enter Discord ID", null, null) as text|null - var/sql_id = sanitizeSQL(entered_id) - var/DBQuery/store_discord_id = dbcon.NewQuery("UPDATE [format_table_name("discord")] SET discord_id = '[sql_id]' WHERE ckey='[user_ckey]'") - if(!store_discord_id.Execute()) - var/err = db_discord_id.ErrorMsg() - to_chat(src, "Error replacing Discord account. Please inform an administrator") - log_game("SQL ERROR while linking discord account. Error : \[[err]\]\n") - return - to_chat(src, "Successfully linked discord account [entered_id] to [user_ckey]") diff --git a/code/modules/discord/notify.dm b/code/modules/discord/notify.dm deleted file mode 100644 index a5bfac04940..00000000000 --- a/code/modules/discord/notify.dm +++ /dev/null @@ -1,48 +0,0 @@ -// DONT TOUCH ANYTHING IN HERE UNLESS YOU KNOW WHAT YOU ARE DOING -affected -/client/verb/notify_restart() - set category = "Special Verbs" - set name = "Notify Restart" - set desc = "Notifies you on Discord when the server restarts." - if(!config.sql_enabled) - to_chat(src, "This is feature requires the SQL backend") - return - var/DBQuery/db_discord_id = dbcon.NewQuery("SELECT discord_id FROM [format_table_name("discord")] WHERE ckey = '[ckey]'") - if(!db_discord_id.Execute()) - var/err = db_discord_id.ErrorMsg() - log_game("SQL ERROR while selecting discord account. Error : \[[err]\]\n") - to_chat(src, "Error checking Discord account. Please inform an administrator") - return - var/stored_id - while(db_discord_id.NextRow()) - stored_id = db_discord_id.item[1] - if(!stored_id) // Not linked - to_chat(src, "This requires you to link your Discord account with the \"Link Discord Account\" verb.") - return - else // Linked - var/DBQuery/toggle_status = dbcon.NewQuery("SELECT notify FROM [format_table_name("discord")] WHERE ckey = '[ckey]'") - if(!toggle_status.Execute()) - var/err = toggle_status.ErrorMsg() - log_game("SQL ERROR while getting discord account. Error : \[[err]\]\n") - var/notify_status - while(toggle_status.NextRow()) - notify_status = toggle_status.item[1] - if(notify_status) // Data is there - switch(notify_status) - if("0") - var/DBQuery/update_notify = dbcon.NewQuery("UPDATE [format_table_name("discord")] SET notify = 1 WHERE ckey='[ckey]'") - if(!update_notify.Execute()) - var/err = db_discord_id.ErrorMsg() - to_chat(src, "Error updating notify status. Please inform an administrator") - log_game("SQL ERROR while updating notify status. Error : \[[err]\]\n") - return - to_chat(src, "You will now be notified on discord when the next round is starting") - if("1") - var/DBQuery/update_notify = dbcon.NewQuery("UPDATE [format_table_name("discord")] SET notify = 0 WHERE ckey='[ckey]'") - if(!update_notify.Execute()) - var/err = db_discord_id.ErrorMsg() - to_chat(src, "Error updating notify status. Please inform an administrator") - log_game("SQL ERROR while updating notify status. Error : \[[err]\]\n") - return - to_chat(src, "You will no longer be notified on discord when the next round is starting") - else // Oh fuck what the hell happened - to_chat(src, "Something has gone VERY wrong, or affected cant code.") diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index 18d75f3ef30..3c7dcc6496b 100644 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -13,11 +13,11 @@ if(candidates.len >= 2) //Oh god why we can't have static functions - var/number = ticker.mode.abductor_teams + 1 + var/number = SSticker.mode.abductor_teams + 1 var/datum/game_mode/abduction/temp - if(ticker.mode.config_tag == "abduction") - temp = ticker.mode + if(SSticker.mode.config_tag == "abduction") + temp = SSticker.mode else temp = new @@ -42,10 +42,10 @@ temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) temp.post_setup_team(number) - ticker.mode.abductor_teams++ + SSticker.mode.abductor_teams++ - if(ticker.mode.config_tag != "abduction") - ticker.mode.abductors |= temp.abductors + if(SSticker.mode.config_tag != "abduction") + SSticker.mode.abductors |= temp.abductors processing = 1 //So it will get gc'd return 1 else diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 7e4473cb0d2..590ff374ad6 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -27,8 +27,8 @@ GLOB.respawnable_list -= C.client var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) new_xeno.key = C.key - if(ticker && ticker.mode) - ticker.mode.xenos += new_xeno.mind + if(SSticker && SSticker.mode) + SSticker.mode.xenos += new_xeno.mind spawncount-- successSpawn = 1 diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 2c2fdfbab84..28ca16b9a79 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -23,6 +23,5 @@ var/mob/M = pick(candidates) B.key = M.key to_chat(B, "You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.") - var/image/alert_overlay = image('icons/mob/blob.dmi', "blank_blob") - notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay) + notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B) processing = TRUE // Let it naturally end, if it runs successfully \ No newline at end of file diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index be145752671..811eed6b9de 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -34,7 +34,6 @@ qdel(O) wormholes.Cut() - /obj/effect/portal/wormhole name = "wormhole" desc = "It looks highly unstable; It could close at any moment." @@ -42,23 +41,26 @@ icon_state = "anom" failchance = 0 -/obj/effect/portal/wormhole/attack_hand(mob/user) - teleport(user) +/obj/effect/portal/wormhole/can_teleport(atom/movable/M) + . = ..() -/obj/effect/portal/wormhole/attackby(obj/item/I, mob/user, params) - teleport(user) + if(istype(M, /obj/singularity)) + . = FALSE /obj/effect/portal/wormhole/teleport(atom/movable/M) - if(istype(M, /obj/effect)) //sparks don't teleport - return - if(M.anchored && istype(M, /obj/mecha)) - return + if(!can_teleport(M)) + return FALSE - if(istype(M, /atom/movable)) - var/turf/target - if(GLOB.portals.len) - var/obj/effect/portal/P = pick(GLOB.portals) - if(P && isturf(P.loc)) - target = P.loc - if(!target) return - do_teleport(M, target, 1, 1, 0, 0) ///You will appear adjacent to the beacon + var/turf/target + if(GLOB.portals.len) + var/obj/effect/portal/P = pick(GLOB.portals) + if(P && isturf(P.loc)) + target = P.loc + + if(!target) + return FALSE + + if(!do_teleport(M, target, 1, TRUE)) ///You will appear adjacent to the beacon + return FALSE + + return TRUE diff --git a/code/modules/ext_scripts/irc.dm b/code/modules/ext_scripts/irc.dm index 0e8c72496d2..7f87413694a 100644 --- a/code/modules/ext_scripts/irc.dm +++ b/code/modules/ext_scripts/irc.dm @@ -19,20 +19,3 @@ if(config.admin_irc) send2irc(config.admin_irc, msg) return - -/hook/startup/proc/ircNotify() - var/people_to_ping = "" - var/DBQuery/pull_notify = dbcon.NewQuery("SELECT discord_id FROM [format_table_name("discord")] WHERE notify = 1") - if(!pull_notify.Execute()) - var/err = pull_notify.ErrorMsg() - log_game("SQL ERROR while pulling notify people. Error : \[[err]\]\n") - else - while(pull_notify.NextRow()) - people_to_ping += "<@" + pull_notify.item[1] + "> " - send2mainirc("Server starting up on [station_name()]. Connect to: But the database failed us, so f*$! it. I tried to be good to you Now this is an I.O.U If you're feeling entitled, well, stuff it! ~" + P.update_icon() + return + if(prob(25)) + category = null + var/c = category? " AND category='[sanitizeSQL(category)]'" :"" + var/DBQuery/query_get_random_books = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE (isnull(flagged) OR flagged = 0)[c] GROUP BY title ORDER BY rand() LIMIT [amount];") + query_get_random_books.Execute() + while(query_get_random_books.NextRow()) + var/obj/item/book/B = new(location) + . += B + B.author = query_get_random_books.item[2] + B.title = query_get_random_books.item[3] + B.dat = query_get_random_books.item[4] + B.name = "Book: [B.title]" + B.icon_state= "book[rand(1,8)]" + +/obj/structure/bookcase/random/fiction + name = "bookcase (Fiction)" + category = "Fiction" +/obj/structure/bookcase/random/nonfiction + name = "bookcase (Non-Fiction)" + category = "Non-fiction" +/obj/structure/bookcase/random/religion + name = "bookcase (Religion)" + category = "Religion" +/obj/structure/bookcase/random/adult + name = "bookcase (Adult)" + category = "Adult" + +/obj/structure/bookcase/random/reference + name = "bookcase (Reference)" + category = "Reference" + var/ref_book_prob = 20 + +/obj/structure/bookcase/random/reference/Initialize(mapload) + . = ..() + while(book_count > 0 && prob(ref_book_prob)) + book_count-- + new /obj/item/book/manual/random(src) \ No newline at end of file diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm new file mode 100644 index 00000000000..3a31e59cd55 --- /dev/null +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -0,0 +1,138 @@ +/*****************Marker Beacons**************************/ +GLOBAL_LIST_INIT(marker_beacon_colors, list( +"Random" = FALSE, //not a true color, will pick a random color +"Burgundy" = LIGHT_COLOR_FLARE, +"Bronze" = LIGHT_COLOR_ORANGE, +"Yellow" = LIGHT_COLOR_YELLOW, +"Lime" = LIGHT_COLOR_SLIME_LAMP, +"Olive" = LIGHT_COLOR_GREEN, +"Jade" = LIGHT_COLOR_BLUEGREEN, +"Teal" = LIGHT_COLOR_LIGHT_CYAN, +"Cerulean" = LIGHT_COLOR_BLUE, +"Indigo" = LIGHT_COLOR_DARK_BLUE, +"Purple" = LIGHT_COLOR_PURPLE, +"Violet" = LIGHT_COLOR_LAVENDER, +"Fuchsia" = LIGHT_COLOR_PINK)) + +/obj/item/stack/marker_beacon + name = "marker beacon" + singular_name = "marker beacon" + desc = "Prism-brand path illumination devices. Used by miners to mark paths and warn of danger." + icon = 'icons/obj/lighting.dmi' + icon_state = "marker" + merge_type = /obj/item/stack/marker_beacon + max_amount = 100 + var/picked_color = "random" + +/obj/item/stack/marker_beacon/ten //miners start with 10 of these + amount = 10 + +/obj/item/stack/marker_beacon/thirty //and they're bought in stacks of 1, 10, or 30 + amount = 30 + +/obj/item/stack/marker_beacon/Initialize(mapload) + . = ..() + update_icon() + +/obj/item/stack/marker_beacon/examine(mob/user) + ..() + to_chat(user, "Use in-hand to place a [singular_name].") + to_chat(user, "Alt-click to select a color. Current color is [picked_color].") + +/obj/item/stack/marker_beacon/update_icon() + icon_state = "[initial(icon_state)][lowertext(picked_color)]" + +/obj/item/stack/marker_beacon/attack_self(mob/user) + if(!isturf(user.loc)) + to_chat(user, "You need more space to place a [singular_name] here.") + return + if(locate(/obj/structure/marker_beacon) in user.loc) + to_chat(user, "There is already a [singular_name] here.") + return + if(use(1)) + to_chat(user, "You activate and anchor [amount ? "a":"the"] [singular_name] in place.") + playsound(user, 'sound/machines/click.ogg', 50, 1) + var/obj/structure/marker_beacon/M = new(user.loc, picked_color) + transfer_fingerprints_to(M) + +/obj/item/stack/marker_beacon/AltClick(mob/living/user) + if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE) + return + var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors + if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE) + return + if(input_color) + picked_color = input_color + update_icon() + +/obj/structure/marker_beacon + name = "marker beacon" + desc = "A Prism-brand path illumination device. It is anchored in place and glowing steadily." + icon = 'icons/obj/lighting.dmi' + icon_state = "marker" + layer = BELOW_OPEN_DOOR_LAYER + armor = list("melee" = 50, "bullet" = 75, "laser" = 75, "energy" = 75, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 25, "acid" = 0) + max_integrity = 50 + anchored = TRUE + light_range = 2 + light_power = 3 + var/remove_speed = 15 + var/picked_color + +/obj/structure/marker_beacon/Initialize(mapload, set_color) + . = ..() + picked_color = set_color + update_icon() + +/obj/structure/marker_beacon/deconstruct(disassembled = TRUE) + if(can_deconstruct) + var/obj/item/stack/marker_beacon/M = new(loc) + M.picked_color = picked_color + M.update_icon() + qdel(src) + +/obj/structure/marker_beacon/examine(mob/user) + ..() + to_chat(user, "Alt-click to select a color. Current color is [picked_color].") + +/obj/structure/marker_beacon/update_icon() + while(!picked_color || !GLOB.marker_beacon_colors[picked_color]) + picked_color = pick(GLOB.marker_beacon_colors) + icon_state = "[initial(icon_state)][lowertext(picked_color)]-on" + set_light(light_range, light_power, GLOB.marker_beacon_colors[picked_color]) + +/obj/structure/marker_beacon/attack_hand(mob/living/user) + . = ..() + if(.) + return + to_chat(user, "You start picking [src] up...") + if(do_after(user, remove_speed, target = src)) + var/obj/item/stack/marker_beacon/M = new(loc) + M.picked_color = picked_color + M.update_icon() + transfer_fingerprints_to(M) + if(user.put_in_hands(M, TRUE)) //delete the beacon if it fails + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + qdel(src) //otherwise delete us + +/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/stack/marker_beacon)) + var/obj/item/stack/marker_beacon/M = I + to_chat(user, "You start picking [src] up...") + if(do_after(user, remove_speed, target = src) && M.amount + 1 <= M.max_amount) + M.add(1) + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + qdel(src) + return + return ..() + +/obj/structure/marker_beacon/AltClick(mob/living/user) + ..() + if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE) + return + var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors + if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE) + return + if(input_color) + picked_color = input_color + update_icon() \ No newline at end of file diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm new file mode 100644 index 00000000000..d846e065761 --- /dev/null +++ b/code/modules/mining/equipment/survival_pod.dm @@ -0,0 +1,357 @@ +/area/survivalpod + name = "\improper Emergency Shelter" + icon_state = "away" + requires_power = FALSE + has_gravity = TRUE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + +/obj/item/survivalcapsule + name = "bluespace shelter capsule" + desc = "An emergency shelter stored within a pocket of bluespace." + icon_state = "capsule" + icon = 'icons/obj/mining.dmi' + w_class = WEIGHT_CLASS_TINY + origin_tech = "engineering=3;bluespace=3" + var/template_id = "shelter_alpha" + var/datum/map_template/shelter/template + var/used = FALSE + +/obj/item/survivalcapsule/proc/get_template() + if(template) + return + template = shelter_templates[template_id] + if(!template) + log_runtime("Shelter template ([template_id]) not found!", src) + qdel(src) + +/obj/item/survivalcapsule/examine(mob/user) + . = ..() + get_template() + to_chat(user, "This capsule has the [template.name] stored.") + to_chat(user, template.description) + +/obj/item/survivalcapsule/attack_self() + // Can't grab when capsule is New() because templates aren't loaded then + get_template() + if(used == FALSE) + loc.visible_message("[src] begins to shake. Stand back!") + used = TRUE + sleep(50) + var/turf/deploy_location = get_turf(src) + var/status = template.check_deploy(deploy_location) + switch(status) + if(SHELTER_DEPLOY_BAD_AREA) + loc.visible_message("[src] will not function in this area.") + if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS) + var/width = template.width + var/height = template.height + loc.visible_message("[src] doesn't have room to deploy! You need to clear a [width]x[height] area!") + + if(status != SHELTER_DEPLOY_ALLOWED) + used = FALSE + return + + playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1) + + var/turf/T = deploy_location + if(!is_mining_level(T.z))//only report capsules away from the mining/lavaland level + message_admins("[key_name_admin(usr)] ([ADMIN_QUE(usr,"?")]) ([ADMIN_FLW(usr,"FLW")]) activated a bluespace capsule away from the mining level! (JMP)") + log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]") + template.load(deploy_location, centered = TRUE) + new /obj/effect/particle_effect/smoke(get_turf(src)) + qdel(src) + +/obj/item/survivalcapsule/luxury + name = "luxury bluespace shelter capsule" + desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace." + origin_tech = "engineering=3;bluespace=4" + template_id = "shelter_beta" + +//Pod turfs and objects + +//Window +/obj/structure/window/shuttle/survival_pod + name = "pod window" + icon = 'icons/obj/smooth_structures/pod_window.dmi' + icon_state = "smooth" + dir = FULLTILE_WINDOW_DIR + max_integrity = 100 + fulltile = TRUE + reinf = TRUE + heat_resistance = 1600 + armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100) + smooth = SMOOTH_MORE + canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod) + explosion_block = 3 + level = 3 + glass_type = /obj/item/stack/sheet/titaniumglass + glass_amount = 2 + +/obj/structure/window/reinforced/survival_pod + name = "pod window" + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "pwindow" + +//Floors +/turf/simulated/floor/pod + name = "pod floor" + icon_state = "podfloor" + icon_regular_floor = "podfloor" + floor_tile = /obj/item/stack/tile/pod + +/turf/simulated/floor/pod/light + icon_state = "podfloor_light" + icon_regular_floor = "podfloor_light" + floor_tile = /obj/item/stack/tile/pod/light + +/turf/simulated/floor/pod/dark + icon_state = "podfloor_dark" + icon_regular_floor = "podfloor_dark" + floor_tile = /obj/item/stack/tile/pod/dark + +//Door +/obj/machinery/door/airlock/survival_pod + icon = 'icons/obj/doors/airlocks/survival/survival.dmi' + overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_pod + +/obj/machinery/door/airlock/survival_pod/glass + opacity = FALSE + glass = TRUE + +/obj/structure/door_assembly/door_assembly_pod + name = "pod airlock assembly" + icon = 'icons/obj/doors/airlocks/survival/survival.dmi' + base_name = "pod airlock" + overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi' + airlock_type = /obj/machinery/door/airlock/survival_pod + glass_type = /obj/machinery/door/airlock/survival_pod/glass + +//Windoor +/obj/machinery/door/window/survival_pod + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "windoor" + base_state = "windoor" + +//Table +/obj/structure/table/survival_pod + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "table" + smooth = SMOOTH_FALSE + +//Sleeper +/obj/machinery/sleeper/survival_pod + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "sleeper-open" + density = FALSE + +/obj/machinery/sleeper/survival_pod/New() + ..() + component_parts = list() + component_parts += new /obj/item/circuitboard/sleeper/survival(null) + var/obj/item/stock_parts/matter_bin/B = new(null) + B.rating = initial_bin_rating + component_parts += B + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/console_screen(null) + component_parts += new /obj/item/stock_parts/console_screen(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() + +//NanoMed +/obj/machinery/vending/wallmed1/survival_pod + name = "survival pod medical supply" + desc = "Wall-mounted Medical Equipment dispenser. This one seems just a tiny bit smaller." + req_access = list() + refill_canister = null + + products = list(/obj/item/reagent_containers/food/pill/patch/styptic = 5, + /obj/item/reagent_containers/food/pill/patch/silver_sulf = 5, + /obj/item/reagent_containers/food/pill/charcoal = 2, + /obj/item/stack/medical/bruise_pack/advanced = 1, + /obj/item/stack/medical/ointment/advanced = 1, + /obj/item/reagent_containers/hypospray/autoinjector = 2, + /obj/item/stack/medical/splint = 1) + contraband = list(/obj/item/reagent_containers/food/pill/tox = 2, + /obj/item/reagent_containers/food/pill/morphine = 2) + +//Computer +/obj/item/gps/computer + name = "pod computer" + icon_state = "pod_computer" + icon = 'icons/obj/lavaland/pod_computer.dmi' + anchored = 1 + density = 1 + pixel_y = -32 + +/obj/item/gps/computer/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/wrench)) + playsound(loc, W.usesound, 50, 1) + user.visible_message("[user] disassembles the gps.", \ + "You start to disassemble the gps...", "You hear clanking and banging noises.") + if(do_after(user, 20 * W.toolspeed, target = src)) + new /obj/item/gps(loc) + qdel(src) + return ..() + +/obj/item/gps/computer/attack_hand(mob/user) + attack_self(user) + +//Bed +/obj/structure/bed/pod + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "bed" + +//Survival Storage Unit +/obj/machinery/smartfridge/survival_pod + name = "survival pod storage" + desc = "A heated storage unit." + icon_state = "donkvendor" + icon = 'icons/obj/lavaland/donkvendor.dmi' + light_range = 8 + light_power = 1.2 + light_color = "#DDFFD3" + max_n_of_items = 10 + pixel_y = -4 + can_deconstruct = FALSE + var/empty = FALSE + +/obj/machinery/smartfridge/survival_pod/Initialize(mapload) + . = ..() + + if(empty) + return + + for(var/i in 1 to 5) + var/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak/W = new(src) + load(W) + if(prob(50)) + var/obj/item/storage/pill_bottle/dice/D = new(src) + load(D) + else + var/obj/item/instrument/guitar/G = new(src) + load(G) + +/obj/machinery/smartfridge/survival_pod/update_icon() + return + +/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O) + return isitem(O) + +/obj/machinery/smartfridge/survival_pod/empty + name = "dusty survival pod storage" + desc = "A heated storage unit. This one's seen better days." + empty = TRUE + +//Fans +/obj/structure/fans + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "fans" + name = "environmental regulation system" + desc = "A large machine releasing a constant gust of air." + anchored = 1 + density = 1 + var/arbitraryatmosblockingvar = 1 + var/buildstacktype = /obj/item/stack/sheet/metal + var/buildstackamount = 5 + +/obj/structure/fans/Initialize(loc) + ..() + air_update_turf(1) + +/obj/structure/fans/Destroy() + arbitraryatmosblockingvar = 0 + air_update_turf(1) + return ..() + +/obj/structure/fans/CanAtmosPass(turf/T) + return !arbitraryatmosblockingvar + +/obj/structure/fans/deconstruct() + if(buildstacktype) + new buildstacktype(loc, buildstackamount) + qdel(src) + +/obj/structure/fans/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/wrench)) + playsound(loc, W.usesound, 50, 1) + user.visible_message("[user] disassembles the fan.", \ + "You start to disassemble the fan...", "You hear clanking and banging noises.") + if(do_after(user, 20 * W.toolspeed, target = src)) + deconstruct() + return ..() + +/obj/structure/fans/tiny + name = "tiny fan" + desc = "A tiny fan, releasing a thin gust of air." + layer = TURF_LAYER+0.1 + density = 0 + icon_state = "fan_tiny" + buildstackamount = 2 + +/obj/structure/fans/tiny/invisible + name = "air flow blocker" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF + unacidable = TRUE + invisibility = INVISIBILITY_ABSTRACT + +//Signs +/obj/structure/sign/mining + name = "nanotrasen mining corps sign" + desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims." + icon = 'icons/turf/walls/survival_pod_walls.dmi' + icon_state = "ntpod" + +/obj/structure/sign/mining/survival + name = "shelter sign" + desc = "A high visibility sign designating a safe shelter." + icon = 'icons/turf/walls/survival_pod_walls.dmi' + icon_state = "survival" + +//Fluff +/obj/structure/tubes + icon_state = "tubes" + icon = 'icons/obj/lavaland/survival_pod.dmi' + name = "tubes" + anchored = 1 + layer = MOB_LAYER - 0.2 + density = 0 + +/obj/structure/tubes/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/wrench)) + playsound(loc, W.usesound, 50, 1) + user.visible_message("[user] disassembles [src].", \ + "You start to disassemble [src]...", "You hear clanking and banging noises.") + if(do_after(user, 20 * W.toolspeed, target = src)) + new /obj/item/stack/rods(loc) + qdel(src) + return ..() + +/obj/item/fakeartefact + name = "expensive forgery" + icon = 'icons/mob/screen_gen.dmi' + icon_state = "x2" + var/possible = list(/obj/item/ship_in_a_bottle, + /obj/item/gun/energy/pulse, + /obj/item/sleeping_carp_scroll, + /obj/item/shield/changeling, + /obj/item/lava_staff, + /obj/item/katana/energy, + /obj/item/hierophant_staff, + /obj/item/storage/toolbox/green/memetic, + /obj/item/gun/projectile/automatic/l6_saw, + /obj/item/gun/magic/staff/chaos, + /obj/item/gun/magic/staff/spellblade, + /obj/item/gun/magic/wand/death, + /obj/item/gun/magic/wand/fireball, + /obj/item/stack/telecrystal/twenty, + /obj/item/banhammer) + +/obj/item/fakeartefact/New() + . = ..() + var/obj/item/I = pick(possible) + name = initial(I.name) + icon = initial(I.icon) + desc = initial(I.desc) + icon_state = initial(I.icon_state) + item_state = initial(I.item_state) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 38d5436ecfb..10823051563 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -401,44 +401,53 @@ anchored = 1.0 var/obj/item/card/id/inserted_id var/list/prize_list = list( - new /datum/data/mining_equipment("Stimpack", /obj/item/reagent_containers/hypospray/autoinjector/stimpack, 50), - new /datum/data/mining_equipment("Teporone MediPen", /obj/item/reagent_containers/hypospray/autoinjector/teporone, 50), - new /datum/data/mining_equipment("MediPen Bundle", /obj/item/storage/box/autoinjector/utility, 200), - new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100), - new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), - new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), - new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), - new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), - new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 400), - new /datum/data/mining_equipment("Hivelord Stabilizer", /obj/item/hivelordstabilizer, 400), - new /datum/data/mining_equipment("Mining Drone", /obj/item/mining_drone_cube, 500), - new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/mine_bot_upgrade, 400), - new /datum/data/mining_equipment("Drone Health Upgrade",/obj/item/mine_bot_upgrade/health, 400), - new /datum/data/mining_equipment("Drone Ranged Upgrade",/obj/item/mine_bot_upgrade/cooldown, 600), - new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/mining_hammer, 750), - new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000), - new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500), - new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600), - new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 600), - new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), - new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800), - new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000), - new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000), - new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800), - new /datum/data/mining_equipment("Lazarus Capsule belt",/obj/item/storage/belt/lazarus, 200), - new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000), - new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000), - new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), - new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), - new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100), + new /datum/data/mining_equipment("Stimpack", /obj/item/reagent_containers/hypospray/autoinjector/stimpack, 50), + new /datum/data/mining_equipment("Teporone MediPen", /obj/item/reagent_containers/hypospray/autoinjector/teporone, 50), + new /datum/data/mining_equipment("MediPen Bundle", /obj/item/storage/box/autoinjector/utility, 200), + new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100), + new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), + new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), + new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), + new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), + new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 400), + new /datum/data/mining_equipment("Hivelord Stabilizer", /obj/item/hivelordstabilizer, 400), + new /datum/data/mining_equipment("Mining Drone", /obj/item/mining_drone_cube, 500), + new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/mine_bot_upgrade, 400), + new /datum/data/mining_equipment("Drone Health Upgrade", /obj/item/mine_bot_upgrade/health, 400), + new /datum/data/mining_equipment("Drone Ranged Upgrade", /obj/item/mine_bot_upgrade/cooldown, 600), + new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750), + new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), + new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), + new /datum/data/mining_equipment("Explorer\'s Webbing", /obj/item/storage/belt/mining, 500), + new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000), + new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500), + new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600), + new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 600), + new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), + new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800), + new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000), + new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000), + new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800), + new /datum/data/mining_equipment("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200), + new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000), + new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000), + new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), + new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), + new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), + new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/storage/box/mininghardsuit, 2000), + new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), + new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100), + new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300), + new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100), new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150), - new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250), - new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300), - new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), - new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), - new /datum/data/mining_equipment("KA Cooldown Decrease",/obj/item/borg/upgrade/modkit/cooldown, 1000), - new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), - new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500), + new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250), + new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300), + new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), + new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), + new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), + new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), + new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500), + new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1000), ) /obj/machinery/mineral/equipment_vendor/golem @@ -468,15 +477,15 @@ new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000) ) -/datum/data/mining_equipment/ +/datum/data/mining_equipment var/equipment_name = "generic" var/equipment_path = null var/cost = 0 -/datum/data/mining_equipment/New(name, path, cost) - src.equipment_name = name - src.equipment_path = path - src.cost = cost +/datum/data/mining_equipment/New(name, path, equipment_cost) + equipment_name = name + equipment_path = path + cost = equipment_cost /obj/machinery/mineral/equipment_vendor/New() ..() @@ -588,20 +597,33 @@ ..() /obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer) - var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Kinetic Accelerator", "Resonator", "Mining Drone", "Advanced Scanner", "Crusher") - if(!selection || !Adjacent(redeemer) || voucher.loc != redeemer) + var/items = list("Kinetic Accelerator", "Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Crusher Kit", "Mining Conscription Kit", "Advanced Scanner") + + var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in items + if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) return + + var/drop_location = loc switch(selection) if("Kinetic Accelerator") - new /obj/item/gun/energy/kinetic_accelerator(src.loc) - if("Resonator") - new /obj/item/resonator(src.loc) - if("Mining Drone") - new /obj/item/storage/box/drone_kit(src.loc) + new /obj/item/gun/energy/kinetic_accelerator(drop_location) + if("Survival Capsule and Explorer's Webbing") + new /obj/item/storage/belt/mining(drop_location) + if("Resonator Kit") + new /obj/item/extinguisher/mini(drop_location) + new /obj/item/resonator(drop_location) + if("Minebot Kit") + new /obj/item/mining_drone_cube(drop_location) + new /obj/item/weldingtool/hugetank(drop_location) + new /obj/item/clothing/head/welding(drop_location) + if("Crusher Kit") + new /obj/item/extinguisher/mini(drop_location) + new /obj/item/twohanded/required/kinetic_crusher(drop_location) + if("Mining Conscription Kit") + new /obj/item/storage/backpack/duffel/mining_conscript(drop_location) if("Advanced Scanner") - new /obj/item/t_scanner/adv_mining_scanner(src.loc) - if("Crusher") - new /obj/item/twohanded/required/mining_hammer(loc) + new /obj/item/t_scanner/adv_mining_scanner(drop_location) + qdel(voucher) /obj/machinery/mineral/equipment_vendor/ex_act(severity, target) @@ -643,11 +665,41 @@ ..(user) to_chat(user, "There's [points] points on the card.") +/**********************Conscription Kit**********************/ + +/obj/item/card/id/mining_access_card + name = "mining access card" + desc = "A small card, that when used on any ID, will add mining access." + icon_state = "data_1" + +/obj/item/card/id/mining_access_card/afterattack(atom/movable/AM, mob/user, proximity) + . = ..() + if(istype(AM, /obj/item/card/id) && proximity) + var/obj/item/card/id/I = AM + I.access |= list(access_mining, access_mining_station, access_mineral_storeroom, access_cargo) + to_chat(user, "You upgrade [I] with mining access.") + qdel(src) + +/obj/item/storage/backpack/duffel/mining_conscript + name = "mining conscription kit" + desc = "A kit containing everything a crewmember needs to support a shaft miner in the field." + +/obj/item/storage/backpack/duffel/mining_conscript/New() + ..() + new /obj/item/pickaxe(src) + new /obj/item/clothing/glasses/meson(src) + new /obj/item/t_scanner/adv_mining_scanner/lesser(src) + new /obj/item/storage/bag/ore(src) + new /obj/item/clothing/under/rank/miner/lavaland(src) + new /obj/item/encryptionkey/headset_cargo(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/card/id/mining_access_card(src) + /**********************Jaunter**********************/ /obj/item/wormhole_jaunter name = "wormhole jaunter" - desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least." + desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to bluespace for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms." icon = 'icons/obj/items.dmi' icon_state = "Jaunter" item_state = "electronic" @@ -656,55 +708,71 @@ throw_speed = 3 throw_range = 5 origin_tech = "bluespace=2" + slot_flags = SLOT_BELT /obj/item/wormhole_jaunter/attack_self(mob/user) + user.visible_message("[user.name] activates the [name]!") + activate(user, TRUE) + +/obj/item/wormhole_jaunter/proc/turf_check(mob/user) var/turf/device_turf = get_turf(user) if(!device_turf || !is_teleport_allowed(device_turf.z)) - to_chat(user, "You're having difficulties getting the [src.name] to work.") - return - else - user.visible_message("[user.name] activates the [src.name]!") - var/list/L = list() - for(var/obj/item/radio/beacon/B in world) - var/turf/T = get_turf(B) - if(is_station_level(T.z)) - L += B - if(!L.len) - to_chat(user, "The [src.name] failed to create a wormhole.") - return - var/chosen_beacon = pick(L) - var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon, lifespan=100) - try_move_adjacent(J) - playsound(src,'sound/effects/sparks4.ogg',50,1) - qdel(src) + to_chat(user, "You're having difficulties getting the [name] to work.") + return FALSE + return TRUE -/obj/effect/portal/wormhole/jaunt_tunnel +/obj/item/wormhole_jaunter/proc/get_destinations(mob/user) + var/list/destinations = list() + + for(var/obj/item/radio/beacon/B in world) + var/turf/T = get_turf(B) + if(is_station_level(T.z)) + destinations += B + + return destinations + +/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent) + if(!turf_check(user)) + return + + var/list/L = get_destinations(user) + if(!L.len) + to_chat(user, "The [name] found no beacons in the world to anchor a wormhole to.") + return + var/chosen_beacon = pick(L) + var/obj/effect/portal/jaunt_tunnel/J = new(get_turf(src), get_turf(chosen_beacon), src, 100) + if(adjacent) + try_move_adjacent(J) + else + J.teleport(user) + playsound(src,'sound/effects/sparks4.ogg',50,1) + qdel(src) + +/obj/item/wormhole_jaunter/proc/chasm_react(mob/user) + if(user.get_item_by_slot(slot_belt) == src) + to_chat(user, "Your [name] activates, saving you from the chasm!") + activate(user, FALSE) + else + to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.") + +/obj/effect/portal/jaunt_tunnel name = "jaunt tunnel" icon = 'icons/effects/effects.dmi' icon_state = "bhole3" desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon." + failchance = 0 -/obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M) - if(istype(M, /obj/effect)) - return - if(istype(M, /atom/movable)) - if(do_teleport(M, target, 6)) - if(isliving(M)) - var/mob/living/L = M - L.Weaken(3) - if(ishuman(L)) - shake_camera(L, 20, 1) - var/mob/living/carbon/human/H = L - spawn(20) - if(H && H.check_has_mouth()) - H.visible_message("[L.name] vomits from travelling through the [src.name]!", "You throw up from travelling through the [src.name]!") - H.nutrition -= 20 - H.adjustToxLoss(-3) - var/turf/T = get_turf(H) - T.add_vomit_floor() - else - visible_message("[src] flickers and fails, due to bluespace interference!") - qdel(src) +/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M) + . = ..() + if(.) + // KERPLUNK + playsound(M,'sound/weapons/resonator_blast.ogg', 50, 1) + if(iscarbon(M)) + var/mob/living/carbon/L = M + L.Weaken(6) + if(ishuman(L)) + shake_camera(L, 20, 1) + addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20) /**********************Resonator**********************/ @@ -822,21 +890,6 @@ new /mob/living/simple_animal/hostile/mining_drone(get_turf(src)) qdel(src) -/**********************Mining drone kit**********************/ - -/obj/item/storage/box/drone_kit - name = "Drone Kit" - desc = "A boxed kit that includes one mining drone cube and a welding tool with an increased capacity." - icon_state = "implant" - max_w_class = WEIGHT_CLASS_NORMAL - storage_slots = 2 - can_hold = list(/obj/item/mining_drone_cube, /obj/item/weldingtool/hugetank) - -/obj/item/storage/box/drone_kit/New() - ..() - new /obj/item/mining_drone_cube(src) - new /obj/item/weldingtool/hugetank(src) - /**********************Lazarus Injector**********************/ /obj/item/lazarus_injector @@ -1057,7 +1110,7 @@ qdel(src) /*********************Mining Hammer****************/ -/obj/item/twohanded/required/mining_hammer +/obj/item/twohanded/required/kinetic_crusher icon = 'icons/obj/mining.dmi' icon_state = "mining_hammer1" item_state = "mining_hammer1" @@ -1091,7 +1144,7 @@ damage_type = BRUTE flag = "bomb" range = 6 - var/obj/item/twohanded/required/mining_hammer/hammer_synced = null + var/obj/item/twohanded/required/kinetic_crusher/hammer_synced = null /obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0, hit_zone) if(hammer_synced) @@ -1114,7 +1167,7 @@ M.gets_drilled(firer) ..() -/obj/item/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/twohanded/required/kinetic_crusher/afterattack(atom/target, mob/user, proximity_flag) if(!proximity_flag && charged)//Mark a target, or mine a tile. var/turf/proj_turf = get_turf(src) if(!istype(proj_turf, /turf)) @@ -1149,7 +1202,7 @@ else L.apply_damage(50, BRUTE, blocked = def_check) -/obj/item/twohanded/required/mining_hammer/proc/Recharge() +/obj/item/twohanded/required/kinetic_crusher/proc/Recharge() if(!charged) charged = 1 icon_state = "mining_hammer1" diff --git a/code/modules/mining/explorer_gear.dm b/code/modules/mining/explorer_gear.dm new file mode 100644 index 00000000000..6453f54c979 --- /dev/null +++ b/code/modules/mining/explorer_gear.dm @@ -0,0 +1,43 @@ +/****************Explorer's Suit and Mask****************/ +/obj/item/clothing/suit/hooded/explorer + name = "explorer suit" + desc = "An armoured suit for exploring harsh environments." + icon_state = "explorer" + item_state = "explorer" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + hoodtype = /obj/item/clothing/head/hooded/explorer + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) + resistance_flags = FIRE_PROOF + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi', + "Drask" = 'icons/mob/species/drask/suit.dmi', + "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', + "Unathi" = 'icons/mob/species/unathi/suit.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi' + ) + +/obj/item/clothing/head/hooded/explorer + name = "explorer hood" + desc = "An armoured hood for exploring harsh environments." + icon_state = "explorer" + item_state = "explorer" + body_parts_covered = HEAD + flags = BLOCKHAIR | NODROP + flags_cover = HEADCOVERSEYES + min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + resistance_flags = FIRE_PROOF + + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi', + "Drask" = 'icons/mob/species/drask/head.dmi', + "Grey" = 'icons/mob/species/grey/head.dmi', + "Skrell" = 'icons/mob/species/skrell/head.dmi' + ) \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborminerals.dm b/code/modules/mining/laborcamp/laborminerals.dm deleted file mode 100644 index 6d963bcd773..00000000000 --- a/code/modules/mining/laborcamp/laborminerals.dm +++ /dev/null @@ -1,6 +0,0 @@ -/turf/simulated/mineral/random/labormineral - mineralSpawnChanceList = list("Uranium" = 1, "Iron" = 100, "Diamond" = 1, "Gold" = 1, "Silver" = 1, "Plasma" = 1) - -/turf/simulated/mineral/random/labormineral/New() - icon_state = "rock" - ..() \ No newline at end of file diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 0e0d248d8b7..ab714c6f1a6 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -4,6 +4,7 @@ icon_state = "l_mushroom" name = "large mushrooms" desc = "A number of large mushrooms, covered in a faint layer of ash and what can only be spores." + anchored = TRUE var/harvested_name = "shortened mushrooms" var/harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large." var/needs_sharp_harvest = TRUE diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index fd8b8dfa4ef..4f8f01498d0 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -72,7 +72,7 @@ var/mob/dead/observer/current_spirits = list() for(var/mob/dead/observer/O in GLOB.player_list) - if(is_type_in_list(O.following, contents)) + if((O.following in contents)) ghost_counter++ O.invisibility = 0 current_spirits |= O @@ -161,9 +161,9 @@ hitsound = 'sound/weapons/sear.ogg' burn_state = LAVA_PROOF | FIRE_PROOF unacidable = 1 - var/turf_type = /turf/unsimulated/floor/lava // /turf/simulated/floor/plating/lava/smooth once Lavaland turfs are added + var/turf_type = /turf/simulated/floor/plating/lava/smooth var/transform_string = "lava" - var/reset_turf_type = /turf/simulated/floor/plating/airless/asteroid // /turf/simulated/floor/plating/asteroid/basalt once Lavaland turfs are added + var/reset_turf_type = /turf/simulated/floor/plating/asteroid/basalt var/reset_string = "basalt" var/create_cooldown = 100 var/create_delay = 30 @@ -198,7 +198,7 @@ user.visible_message("[user] turns \the [T] into [transform_string]!") message_admins("[key_name_admin(user)] fired the lava staff at [get_area(target)] (JMP).") log_game("[key_name(user)] fired the lava staff at [get_area(target)] ([T.x], [T.y], [T.z]).") - T.ChangeTurf(turf_type) + T.TerraformTurf(turf_type, keep_icon = FALSE) timer = world.time + create_cooldown qdel(L) else @@ -207,7 +207,7 @@ return else user.visible_message("[user] turns \the [T] into [reset_string]!") - T.ChangeTurf(reset_turf_type) + T.TerraformTurf(reset_turf_type, keep_icon = FALSE) timer = world.time + reset_cooldown playsound(T,'sound/magic/fireball.ogg', 200, 1) diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index d7c6232121f..2490f6f48db 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -5,8 +5,6 @@ desc = "A completely indestructible chunk of crystal, rumoured to predate the start of this universe. It looks like you could store things inside it." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "blackbox" - icon_on = "blackbox" - icon_off = "blackbox" luminosity = 8 max_n_of_items = INFINITY unacidable = 1 @@ -38,7 +36,7 @@ /obj/machinery/smartfridge/black_box/process() ..() - if(!memory_saved && ticker.current_state == GAME_STATE_FINISHED) + if(!memory_saved && SSticker.current_state == GAME_STATE_FINISHED) WriteMemory() /obj/machinery/smartfridge/black_box/proc/WriteMemory() @@ -189,7 +187,7 @@ terrain_theme = pick("lavaland","winter","jungle","alien") switch(terrain_theme) if("lavaland")//Depressurizes the place... and free cult metal, I guess. - NewTerrainFloors = /turf/simulated/floor/basalt // Needs to be updated after turf update + NewTerrainFloors = /turf/simulated/floor/plating/asteroid/basalt // Needs to be updated after turf update NewTerrainWalls = /turf/simulated/wall/cult NewFlora = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) florachance = 1 diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index 3c154e351c7..c8579fbec65 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -126,12 +126,13 @@ icon = 'icons/obj/lavaland/dragonboat.dmi' keytype = /obj/item/oar burn_state = LAVA_PROOF | FIRE_PROOF + resistance_flags = LAVA_PROOF | FIRE_PROOF /obj/vehicle/lavaboat/relaymove(mob/user, direction) var/turf/next = get_step(src, direction) var/turf/current = get_turf(src) - if(istype(next, /turf/unsimulated/floor/lava) || istype(current, /turf/unsimulated/floor/lava)) //We can move from land to lava, or lava to land, but not from land to land + if(istype(next, /turf/simulated/floor/plating/lava/smooth) || istype(current, /turf/simulated/floor/plating/lava/smooth)) //We can move from land to lava, or lava to land, but not from land to land ..() else to_chat(user, "Boats don't go on land!") @@ -168,6 +169,7 @@ desc = "A tiny ship inside a bottle." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "ship_bottle" + resistance_flags = LAVA_PROOF | FIRE_PROOF /obj/item/ship_in_a_bottle/attack_self(mob/user) to_chat(user, "You're not sure how they get the ships in these things, but you're pretty sure you know how to get it out.") diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 573ff630350..d8286bc8698 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -30,7 +30,6 @@ if(6) new /obj/item/pickaxe/diamond(src) if(7) - new /obj/item/clothing/head/culthood(src) new /obj/item/clothing/suit/hooded/cultrobes(src) new /obj/item/bedsheet/cult(src) if(8) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 860692673a5..03b8404b1f0 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -20,18 +20,27 @@ anchored = TRUE var/obj/machinery/mineral/processing_unit/machine = null var/machinedir = EAST + speed_process = TRUE -/obj/machinery/mineral/processing_unit_console/New() - ..() +/obj/machinery/mineral/processing_unit_console/Initialize(mapload) + . = ..() machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir)) if(machine) machine.CONSOLE = src else - qdel(src) + return INITIALIZE_HINT_QDEL + +/obj/machinery/mineral/processing_unit_console/attack_ghost(mob/user) + return ui_interact(user) /obj/machinery/mineral/processing_unit_console/attack_hand(mob/user) if(..()) - return + return TRUE + + return ui_interact(user) + +/obj/machinery/mineral/processing_unit_console/ui_interact(mob/user) + . = ..() if(!machine) return @@ -43,7 +52,8 @@ /obj/machinery/mineral/processing_unit_console/Topic(href, href_list) if(..()) - return + return TRUE + usr.set_machine(src) add_fingerprint(usr) @@ -59,15 +69,14 @@ machine.on = (href_list["set_on"] == "on") updateUsrDialog() + return TRUE /obj/machinery/mineral/processing_unit_console/Destroy() machine = null return ..() - /**********************Mineral processing unit**************************/ - /obj/machinery/mineral/processing_unit name = "furnace" icon = 'icons/obj/machines/mining_machines.dmi' @@ -81,8 +90,8 @@ var/datum/research/files speed_process = TRUE -/obj/machinery/mineral/processing_unit/New() - ..() +/obj/machinery/mineral/processing_unit/Initialize(mapload) + . = ..() AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, TRUE, /obj/item/stack) files = new /datum/research/smelter(src) @@ -99,6 +108,7 @@ for(var/obj/item/stack/ore/O in T) process_ore(O) CHECK_TICK + if(on) if(selected_material) smelt_ore() @@ -106,11 +116,9 @@ else if(selected_alloy) smelt_alloy() - if(CONSOLE) CONSOLE.updateUsrDialog() - /obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/stack/ore/O) GET_COMPONENT(materials, /datum/component/material_container) var/material_amount = materials.get_item_material_amount(O) @@ -167,7 +175,6 @@ var/out = get_step(src, output_dir) materials.retrieve_sheets(sheets_to_remove, selected_material, out) - /obj/machinery/mineral/processing_unit/proc/smelt_alloy() var/datum/design/alloy = files.FindDesignByID(selected_alloy) //check if it's a valid design if(!alloy) diff --git a/code/modules/mining/mine_areas.dm b/code/modules/mining/mine_areas.dm deleted file mode 100644 index 5781bb06bbe..00000000000 --- a/code/modules/mining/mine_areas.dm +++ /dev/null @@ -1,75 +0,0 @@ -/**********************Mine areas**************************/ - -/area/mine - icon_state = "mining" - -/area/mine/dangerous/explored - name = "Mine" - icon_state = "explored" - music = null - always_unpowered = 1 - requires_power = 1 - poweralm = 0 - power_environ = 0 - power_equip = 0 - power_light = 0 - outdoors = 1 - ambientsounds = list('sound/ambience/ambimine.ogg') - -/area/mine/dangerous/explored/golem - name = "Small Asteroid" - -/area/mine/dangerous/unexplored - name = "Mine" - icon_state = "unexplored" - music = null - always_unpowered = 1 - requires_power = 1 - poweralm = 0 - power_environ = 0 - power_equip = 0 - power_light = 0 - outdoors = 1 - ambientsounds = list('sound/ambience/ambimine.ogg') - -/area/mine/lobby - name = "Mining Station" - -/area/mine/storage - name = "Mining Station Storage" - -/area/mine/production - name = "Mining Station Starboard Wing" - icon_state = "mining_production" - -/area/mine/abandoned - name = "Abandoned Mining Station" - -/area/mine/living_quarters - name = "Mining Station Port Wing" - icon_state = "mining_living" - -/area/mine/eva - name = "Mining Station EVA" - icon_state = "mining_eva" - -/area/mine/maintenance - name = "Mining Station Communications" - -/area/mine/cafeteria - name = "Mining Station Cafeteria" - -/area/mine/hydroponics - name = "Mining Station Hydroponics" - -/area/mine/sleeper - name = "Mining Station Emergency Sleeper" - -/area/mine/north_outpost - name = "North Mining Outpost" - -/area/mine/west_outpost - name = "West Mining Outpost" - -/area/mine/podbay - name = "Mining Podbay" \ No newline at end of file diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index e21a3ab2db6..8ba8b13c09c 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -32,6 +32,21 @@ new /obj/item/clothing/gloves/fingerless(src) new /obj/item/clothing/gloves/fingerless(src) +/obj/structure/closet/wardrobe/miner/lavaland + +/obj/structure/closet/wardrobe/miner/lavaland/New() + ..() + contents = list() + new /obj/item/storage/backpack/duffel(src) + new /obj/item/storage/backpack/explorer(src) + new /obj/item/storage/backpack/explorer(src) + new /obj/item/clothing/under/rank/miner/lavaland(src) + new /obj/item/clothing/under/rank/miner/lavaland(src) + new /obj/item/clothing/under/rank/miner/lavaland(src) + new /obj/item/clothing/shoes/workboots/mining(src) + new /obj/item/clothing/shoes/workboots/mining(src) + new /obj/item/clothing/shoes/workboots/mining(src) + /obj/structure/closet/secure_closet/miner name = "miner's equipment" icon_state = "miningsec1" @@ -50,6 +65,8 @@ new /obj/item/t_scanner/adv_mining_scanner/lesser(src) new /obj/item/storage/bag/ore(src) new /obj/item/clothing/glasses/meson(src) + new /obj/item/survivalcapsule(src) + new /obj/item/stack/marker_beacon/ten /**********************Shuttle Computer**************************/ @@ -76,12 +93,11 @@ icon_state = "pickaxe" flags = CONDUCT slot_flags = SLOT_BELT - force = 15.0 - throwforce = 10.0 + force = 15 + throwforce = 10 item_state = "pickaxe" w_class = WEIGHT_CLASS_BULKY materials = list(MAT_METAL=2000) //one sheet, but where can you make them? - var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO origin_tech = "materials=2;engineering=3" attack_verb = list("hit", "pierced", "sliced", "attacked") var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg') @@ -94,11 +110,21 @@ /obj/item/pickaxe/proc/playDigSound() playsound(src, pick(digsound),20,1) +/obj/item/pickaxe/emergency + name = "emergency disembarkation tool" + desc = "For extracting yourself from rough landings." + +/obj/item/pickaxe/safety + name = "safety pickaxe" + desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon." + force = 1 + throwforce = 1 + attack_verb = list("ineffectively hit") + /obj/item/pickaxe/silver name = "silver-plated pickaxe" icon_state = "spickaxe" item_state = "spickaxe" - digspeed = 30 //mines faster than a normal pickaxe, bought from mining vendor origin_tech = "materials=3;engineering=4" desc = "A silver-plated pickaxe that mines slightly faster than standard-issue." toolspeed = 0.75 @@ -107,7 +133,6 @@ name = "golden pickaxe" icon_state = "gpickaxe" item_state = "gpickaxe" - digspeed = 20 origin_tech = "materials=4;engineering=4" desc = "A gold-plated pickaxe that mines faster than standard-issue." toolspeed = 0.6 @@ -116,7 +141,6 @@ name = "diamond-tipped pickaxe" icon_state = "dpickaxe" item_state = "dpickaxe" - digspeed = 20 //mines twice as fast as a normal pickaxe, bought from mining vendor origin_tech = "materials=5;engineering=4" desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt." toolspeed = 0.5 @@ -125,7 +149,6 @@ name = "mining drill" icon_state = "handdrill" item_state = "jackhammer" - digspeed = 25 //available from roundstart, faster than a pickaxe. digsound = list('sound/weapons/drill.ogg') hitsound = 'sound/weapons/drill.ogg' usesound = 'sound/weapons/drill.ogg' @@ -141,7 +164,6 @@ /obj/item/pickaxe/drill/diamonddrill name = "diamond-tipped mining drill" icon_state = "diamonddrill" - digspeed = 10 origin_tech = "materials=6;powerstorage=4;engineering=4" desc = "Yours is the drill that will pierce the heavens!" toolspeed = 0.25 @@ -156,14 +178,12 @@ /obj/item/pickaxe/drill/cyborg/diamond //This is the BORG version! name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics. icon_state = "diamonddrill" - digspeed = 10 toolspeed = 0.25 /obj/item/pickaxe/drill/jackhammer name = "sonic jackhammer" icon_state = "jackhammer" item_state = "jackhammer" - digspeed = 5 //the epitome of powertools. extremely fast mining, laughs at puny walls origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4" digsound = list('sound/weapons/sonic_jackhammer.ogg') hitsound = 'sound/weapons/sonic_jackhammer.ogg' @@ -180,8 +200,8 @@ icon_state = "shovel" flags = CONDUCT slot_flags = SLOT_BELT - force = 8.0 - throwforce = 4.0 + force = 8 + throwforce = 4 item_state = "shovel" w_class = WEIGHT_CLASS_NORMAL materials = list(MAT_METAL=50) @@ -195,11 +215,17 @@ desc = "A small tool for digging and moving dirt." icon_state = "spade" item_state = "spade" - force = 5.0 - throwforce = 7.0 + force = 5 + throwforce = 7 w_class = WEIGHT_CLASS_SMALL toolspeed = 2 +/obj/item/shovel/safety + name = "safety shovel" + desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon." + force = 1 + throwforce = 1 + attack_verb = list("ineffectively hit") /**********************Mining car (Crate like thing, not the rail car)**************************/ @@ -266,332 +292,3 @@ colorindex = 0 icon_state = "mobcap[colorindex]" update_icon() - -/*****************************Survival Pod********************************/ - - -/area/survivalpod - name = "\improper Emergency Shelter" - icon_state = "away" - requires_power = FALSE - has_gravity = TRUE - dynamic_lighting = DYNAMIC_LIGHTING_FORCED - -/obj/item/survivalcapsule - name = "bluespace shelter capsule" - desc = "An emergency shelter stored within a pocket of bluespace." - icon_state = "capsule" - icon = 'icons/obj/mining.dmi' - w_class = WEIGHT_CLASS_TINY - origin_tech = "engineering=3;bluespace=3" - var/template_id = "shelter_alpha" - var/datum/map_template/shelter/template - var/used = FALSE - -/obj/item/survivalcapsule/proc/get_template() - if(template) - return - template = shelter_templates[template_id] - if(!template) - log_runtime("Shelter template ([template_id]) not found!", src) - qdel(src) - -/obj/item/survivalcapsule/examine(mob/user) - . = ..() - get_template() - to_chat(user, "This capsule has the [template.name] stored.") - to_chat(user, template.description) - -/obj/item/survivalcapsule/attack_self() - // Can't grab when capsule is New() because templates aren't loaded then - get_template() - if(used == FALSE) - loc.visible_message("[src] begins to shake. Stand back!") - used = TRUE - sleep(50) - var/turf/deploy_location = get_turf(src) - var/status = template.check_deploy(deploy_location) - switch(status) - if(SHELTER_DEPLOY_BAD_AREA) - loc.visible_message("[src] will not function in this area.") - if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS) - var/width = template.width - var/height = template.height - loc.visible_message("[src] doesn't have room to deploy! You need to clear a [width]x[height] area!") - - if(status != SHELTER_DEPLOY_ALLOWED) - used = FALSE - return - - playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1) - - var/turf/T = deploy_location - if(!is_mining_level(T.z))//only report capsules away from the mining/lavaland level - message_admins("[key_name_admin(usr)] ([ADMIN_QUE(usr,"?")]) ([ADMIN_FLW(usr,"FLW")]) activated a bluespace capsule away from the mining level! (JMP)") - log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]") - template.load(deploy_location, centered = TRUE) - new /obj/effect/particle_effect/smoke(get_turf(src)) - qdel(src) - -/obj/item/survivalcapsule/luxury - name = "luxury bluespace shelter capsule" - desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace." - origin_tech = "engineering=3;bluespace=4" - template_id = "shelter_beta" - -//Pod turfs and objects - -//Window -/obj/structure/window/shuttle/survival_pod - name = "pod window" - icon = 'icons/obj/smooth_structures/pod_window.dmi' - icon_state = "smooth" - dir = FULLTILE_WINDOW_DIR - max_integrity = 100 - fulltile = TRUE - reinf = TRUE - heat_resistance = 1600 - armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100) - smooth = SMOOTH_MORE - canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod) - explosion_block = 3 - level = 3 - glass_type = /obj/item/stack/sheet/titaniumglass - glass_amount = 2 - -/obj/structure/window/reinforced/survival_pod - name = "pod window" - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "pwindow" - -//Floors -/turf/simulated/floor/pod - name = "pod floor" - icon_state = "podfloor" - icon_regular_floor = "podfloor" - floor_tile = /obj/item/stack/tile/pod - -//Door -/obj/machinery/door/airlock/survival_pod - icon = 'icons/obj/doors/airlocks/survival/survival.dmi' - overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_pod - -/obj/machinery/door/airlock/survival_pod/glass - opacity = FALSE - glass = TRUE - -/obj/structure/door_assembly/door_assembly_pod - name = "pod airlock assembly" - icon = 'icons/obj/doors/airlocks/survival/survival.dmi' - base_name = "pod airlock" - overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi' - airlock_type = /obj/machinery/door/airlock/survival_pod - glass_type = /obj/machinery/door/airlock/survival_pod/glass - -//Windoor -/obj/machinery/door/window/survival_pod - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "windoor" - base_state = "windoor" - -//Table -/obj/structure/table/survival_pod - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "table" - smooth = SMOOTH_FALSE - -//Sleeper -/obj/machinery/sleeper/survival_pod - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "sleeper-open" - density = 0 - -/obj/machinery/sleeper/survival_pod/New() - ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/sleeper/survival(null) - var/obj/item/stock_parts/matter_bin/B = new(null) - B.rating = initial_bin_rating - component_parts += B - component_parts += new /obj/item/stock_parts/manipulator(null) - component_parts += new /obj/item/stock_parts/console_screen(null) - component_parts += new /obj/item/stock_parts/console_screen(null) - component_parts += new /obj/item/stack/cable_coil(null, 1) - RefreshParts() - -//Computer -/obj/item/gps/computer - name = "pod computer" - icon_state = "pod_computer" - icon = 'icons/obj/lavaland/pod_computer.dmi' - anchored = 1 - density = 1 - pixel_y = -32 - -/obj/item/gps/computer/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) - playsound(loc, W.usesound, 50, 1) - user.visible_message("[user] disassembles the gps.", \ - "You start to disassemble the gps...", "You hear clanking and banging noises.") - if(do_after(user, 20 * W.toolspeed, target = src)) - new /obj/item/gps(loc) - qdel(src) - return ..() - -/obj/item/gps/computer/attack_hand(mob/user) - attack_self(user) - -//Bed -/obj/structure/bed/pod - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "bed" - -//Survival Storage Unit -/obj/machinery/smartfridge/survival_pod - name = "survival pod storage" - desc = "A heated storage unit." - icon_state = "donkvendor" - icon = 'icons/obj/lavaland/donkvendor.dmi' - icon_on = "donkvendor" - icon_off = "donkvendor" - light_range = 8 - max_n_of_items = 10 - pixel_y = -4 - -/obj/item/circuitboard/smartfridge/survival - name = "circuit board (Smartfridge Survival)" - build_path = /obj/machinery/smartfridge/survival_pod - -/obj/item/circuitboard/smartfridge/attackby(obj/item/I, mob/user, params) - return - -/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O) - if(istype(O, /obj/item)) - return 1 - return 0 - -/obj/machinery/smartfridge/survival_pod/New() - ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/smartfridge/survival(null) - component_parts += new /obj/item/stock_parts/matter_bin(null) - RefreshParts() - -/obj/machinery/smartfridge/survival_pod/loaded/New() - ..() - for(var/i in 1 to 5) - var/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak/W = new(src) - load(W) - if(prob(50)) - var/obj/item/storage/pill_bottle/dice/D = new(src) - load(D) - else - var/obj/item/instrument/guitar/G = new(src) - load(G) - -//Fans -/obj/structure/fans - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "fans" - name = "environmental regulation system" - desc = "A large machine releasing a constant gust of air." - anchored = 1 - density = 1 - var/arbitraryatmosblockingvar = 1 - var/buildstacktype = /obj/item/stack/sheet/metal - var/buildstackamount = 5 - -/obj/structure/fans/deconstruct() - if(buildstacktype) - new buildstacktype(loc, buildstackamount) - qdel(src) - -/obj/structure/fans/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) - playsound(loc, W.usesound, 50, 1) - user.visible_message("[user] disassembles the fan.", \ - "You start to disassemble the fan...", "You hear clanking and banging noises.") - if(do_after(user, 20 * W.toolspeed, target = src)) - deconstruct() - return ..() - -/obj/structure/fans/tiny - name = "tiny fan" - desc = "A tiny fan, releasing a thin gust of air." - layer = TURF_LAYER+0.1 - density = 0 - icon_state = "fan_tiny" - buildstackamount = 2 - -/obj/structure/fans/Initialize(loc) - ..() - air_update_turf(1) - -/obj/structure/fans/Destroy() - arbitraryatmosblockingvar = 0 - air_update_turf(1) - return ..() - -/obj/structure/fans/CanAtmosPass(turf/T) - return !arbitraryatmosblockingvar - -//Signs -/obj/structure/sign/mining - name = "nanotrasen mining corps sign" - desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims." - icon = 'icons/turf/walls/survival_pod_walls.dmi' - icon_state = "ntpod" - -/obj/structure/sign/mining/survival - name = "shelter sign" - desc = "A high visibility sign designating a safe shelter." - icon = 'icons/turf/walls/survival_pod_walls.dmi' - icon_state = "survival" - -//Fluff -/obj/structure/tubes - icon_state = "tubes" - icon = 'icons/obj/lavaland/survival_pod.dmi' - name = "tubes" - anchored = 1 - layer = MOB_LAYER - 0.2 - density = 0 - -/obj/structure/tubes/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) - playsound(loc, W.usesound, 50, 1) - user.visible_message("[user] disassembles [src].", \ - "You start to disassemble [src]...", "You hear clanking and banging noises.") - if(do_after(user, 20 * W.toolspeed, target = src)) - new /obj/item/stack/rods(loc) - qdel(src) - return ..() - -/obj/item/fakeartefact - name = "expensive forgery" - icon = 'icons/mob/screen_gen.dmi' - icon_state = "x2" - var/possible = list(/obj/item/ship_in_a_bottle, - /obj/item/gun/energy/pulse, - /obj/item/sleeping_carp_scroll, - /obj/item/shield/changeling, - /obj/item/lava_staff, - /obj/item/katana/energy, - /obj/item/storage/toolbox/green/memetic, - /obj/item/gun/projectile/automatic/l6_saw, - /obj/item/gun/magic/staff/chaos, - /obj/item/gun/magic/staff/spellblade, - /obj/item/gun/magic/wand/death, - /obj/item/gun/magic/wand/fireball, - /obj/item/stack/telecrystal, - /obj/item/banhammer) - -/obj/item/fakeartefact/New() - . = ..() - var/obj/item/I = pick(possible) - name = initial(I.name) - icon = initial(I.icon) - desc = initial(I.desc) - icon_state = initial(I.icon_state) - item_state = initial(I.item_state) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm deleted file mode 100644 index 0670c87e20d..00000000000 --- a/code/modules/mining/mine_turfs.dm +++ /dev/null @@ -1,672 +0,0 @@ -/**********************Mineral deposits**************************/ - -#define NORTH_EDGING "north" -#define SOUTH_EDGING "south" -#define EAST_EDGING "east" -#define WEST_EDGING "west" - -var/global/list/rockTurfEdgeCache = list( - NORTH_EDGING = image('icons/turf/mining.dmi', "rock_side_n", layer = 6), - SOUTH_EDGING = image('icons/turf/mining.dmi', "rock_side_s"), - EAST_EDGING = image('icons/turf/mining.dmi', "rock_side_e", layer = 6), - WEST_EDGING = image('icons/turf/mining.dmi', "rock_side_w", layer = 6)) - -/turf/simulated/mineral //wall piece - name = "Rock" - icon = 'icons/turf/mining.dmi' - icon_state = "rock_nochance" - oxygen = 0 - nitrogen = 0 - opacity = 1 - density = 1 - blocks_air = 1 - temperature = TCMB - var/mineralType = null - var/mineralAmt = 3 - var/mineralName = null - var/spread = 0 //will the seam spread? - var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles - var/last_act = 0 - var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner - var/hidden = 1 - - //start xenoarch vars - var/datum/geosample/geologic_data - var/excavation_level = 0 - var/list/finds - var/next_rock = 0 - var/archaeo_overlay = "" - var/excav_overlay = "" - var/obj/item/last_find - var/datum/artifact_find/artifact_find - //end xenaorch vars - -/turf/simulated/mineral/ex_act(severity, target) - ..() - switch(severity) - if(3.0) - if(prob(75)) - src.gets_drilled(null, 1) - if(2.0) - if(prob(90)) - src.gets_drilled(null, 1) - if(1.0) - src.gets_drilled(null, 1) - return - -/turf/simulated/mineral/New() - ..() - GLOB.mineral_turfs += src - - if(mineralType && mineralAmt && spread && spreadChance) - for(var/dir in cardinal) - if(prob(spreadChance)) - var/turf/T = get_step(src, dir) - if(istype(T, /turf/simulated/mineral/random)) - Spread(T) - - HideRock() - -/turf/simulated/mineral/proc/HideRock() - if(hidden) - name = "rock" - icon_state = "rock" - return - -/turf/simulated/mineral/proc/Spread(var/turf/T) - new src.type(T) - -/hook/startup/proc/add_mineral_edges() - var/watch = start_watch() - log_startup_progress("Reticulating splines...") - for(var/turf/simulated/mineral/M in GLOB.mineral_turfs) - M.add_edges() - log_startup_progress(" Splines reticulated in [stop_watch(watch)]s.") - return 1 - -/turf/simulated/mineral/proc/add_edges() - var/turf/T - if((istype(get_step(src, NORTH), /turf/simulated/floor)) || (istype(get_step(src, NORTH), /turf/space))) - T = get_step(src, NORTH) - if(T) - T.overlays += rockTurfEdgeCache[SOUTH_EDGING] - if((istype(get_step(src, SOUTH), /turf/simulated/floor)) || (istype(get_step(src, SOUTH), /turf/space))) - T = get_step(src, SOUTH) - if(T) - T.overlays += rockTurfEdgeCache[NORTH_EDGING] - if((istype(get_step(src, EAST), /turf/simulated/floor)) || (istype(get_step(src, EAST), /turf/space))) - T = get_step(src, EAST) - if(T) - T.overlays += rockTurfEdgeCache[WEST_EDGING] - if((istype(get_step(src, WEST), /turf/simulated/floor)) || (istype(get_step(src, WEST), /turf/space))) - T = get_step(src, WEST) - if(T) - T.overlays += rockTurfEdgeCache[EAST_EDGING] - -/turf/simulated/mineral/random - name = "mineral deposit" - icon_state = "rock" - var/mineralSpawnChanceList = list( - "Uranium" = 5, "Diamond" = 1, "Gold" = 10, - "Silver" = 12, "Plasma" = 20, "Iron" = 40, - "Gibtonite" = 4, "Cave" = 2, "BScrystal" = 1, - "Titanium" = 11) - var/mineralChance = 13 - -/turf/simulated/mineral/random/New() - ..() - if(prob(mineralChance)) - var/mName = pickweight(mineralSpawnChanceList) //temp mineral name - - if(mName) - var/turf/simulated/mineral/M - switch(mName) - if("Uranium") - M = new/turf/simulated/mineral/uranium(src) - if("Iron") - M = new/turf/simulated/mineral/iron(src) - if("Diamond") - M = new/turf/simulated/mineral/diamond(src) - if("Gold") - M = new/turf/simulated/mineral/gold(src) - if("Silver") - M = new/turf/simulated/mineral/silver(src) - if("Plasma") - M = new/turf/simulated/mineral/plasma(src) - if("Cave") - new/turf/simulated/floor/plating/airless/asteroid/cave(src) - if("Gibtonite") - M = new/turf/simulated/mineral/gibtonite(src) - if("Bananium") - M = new/turf/simulated/mineral/clown(src) - if("Tranquillite") - M = new/turf/simulated/mineral/mime(src) - if("Titanium") - M = new/turf/simulated/mineral/titanium(src) - if("BScrystal") - M = new/turf/simulated/mineral/bscrystal(src) - if(M) - M.mineralAmt = rand(1, 5) - src = M - M.levelupdate() - return - - -/turf/simulated/mineral/random/high_chance - icon_state = "rock_highchance" - mineralChance = 25 - mineralSpawnChanceList = list( - "Uranium" = 35, "Diamond" = 30, "Gold" = 45, - "Silver" = 50, "Plasma" = 50, "BScrystal" = 20, - "Titanium" = 45) - - -/turf/simulated/mineral/random/high_chance_clown - mineralChance = 40 - mineralSpawnChanceList = list( - "Uranium" = 35, "Diamond" = 2, - "Gold" = 5, "Silver" = 5, "Plasma" = 25, - "Iron" = 30, "Bananium" = 15, "Tranquillite" = 15, "BScrystal" = 10) - -/turf/simulated/mineral/random/high_chance/New() - icon_state = "rock" - ..() - -/turf/simulated/mineral/random/low_chance - icon_state = "rock_lowchance" - mineralChance = 6 - mineralSpawnChanceList = list( - "Uranium" = 2, "Diamond" = 1, "Gold" = 4, - "Silver" = 6, "Plasma" = 15, "Iron" = 40, - "Gibtonite" = 2, "BScrystal" = 1, "Titanium" = 4) - -/turf/simulated/mineral/random/low_chance/New() - icon_state = "rock" - ..() - -/turf/simulated/mineral/iron - name = "iron deposit" - icon_state = "rock_Iron" - mineralType = /obj/item/stack/ore/iron - mineralName = "Iron" - spreadChance = 20 - spread = 1 - hidden = 0 - -/turf/simulated/mineral/uranium - name = "uranium deposit" - mineralType = /obj/item/stack/ore/uranium - mineralName = "Uranium" - spreadChance = 5 - spread = 1 - hidden = 1 - scan_state = "rock_Uranium" - -/turf/simulated/mineral/diamond - name = "diamond deposit" - mineralType = /obj/item/stack/ore/diamond - mineralName = "Diamond" - spreadChance = 0 - spread = 1 - hidden = 1 - scan_state = "rock_Diamond" - -/turf/simulated/mineral/gold - name = "gold deposit" - mineralType = /obj/item/stack/ore/gold - mineralName = "Gold" - spreadChance = 5 - spread = 1 - hidden = 1 - scan_state = "rock_Gold" - -/turf/simulated/mineral/silver - name = "silver deposit" - mineralType = /obj/item/stack/ore/silver - mineralName = "Silver" - spreadChance = 5 - spread = 1 - hidden = 1 - scan_state = "rock_Silver" - -/turf/simulated/mineral/titanium - name = "titanium deposit" - mineralType = /obj/item/stack/ore/titanium - spreadChance = 5 - spread = 1 - hidden = 1 - scan_state = "rock_Titanium" - -/turf/simulated/mineral/plasma - name = "plasma deposit" - icon_state = "rock_Plasma" - mineralType = /obj/item/stack/ore/plasma - mineralName = "Plasma" - spreadChance = 8 - spread = 1 - hidden = 1 - scan_state = "rock_Plasma" - -/turf/simulated/mineral/clown - name = "bananium deposit" - icon_state = "rock_Clown" - mineralType = /obj/item/stack/ore/bananium - mineralName = "Bananium" - mineralAmt = 3 - spreadChance = 0 - spread = 0 - hidden = 0 - -/turf/simulated/mineral/mime - name = "tranquillite deposit" - icon_state = "rock_Mime" - mineralType = /obj/item/stack/ore/tranquillite - mineralAmt = 3 - spreadChance = 0 - spread = 0 - hidden = 0 - -/turf/simulated/mineral/bscrystal - name = "bluespace crystal deposit" - icon_state = "rock_BScrystal" - mineralType = /obj/item/stack/ore/bluespace_crystal - mineralName = "Bluespace crystal" - mineralAmt = 1 - spreadChance = 0 - spread = 0 - hidden = 1 - scan_state = "rock_BScrystal" - -////////////////////////////////Gibtonite -/turf/simulated/mineral/gibtonite - name = "gibtonite deposit" - icon_state = "rock_Gibtonite" - mineralAmt = 1 - mineralName = "Gibtonite" - spreadChance = 0 - spread = 0 - hidden = 1 - scan_state = "rock_Gibtonite" - var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it - var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction - var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes - var/activated_name = null - -/turf/simulated/mineral/gibtonite/New() - det_time = rand(8,10) //So you don't know exactly when the hot potato will explode - ..() - -/turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) && stage == 1) - user.visible_message("You use [I] to locate where to cut off the chain reaction and attempt to stop it...") - defuse() - ..() - -/turf/simulated/mineral/gibtonite/proc/explosive_reaction(var/mob/user = null, triggered_by_explosion = 0) - if(stage == 0) - icon_state = "rock_Gibtonite_active" - name = "gibtonite deposit" - desc = "An active gibtonite reserve. Run!" - stage = 1 - visible_message("There was gibtonite inside! It's going to explode!") - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - - var/notify_admins = 0 - if(z != 5) - notify_admins = 1 - if(!triggered_by_explosion) - message_admins("[key_name_admin(user)] has triggered a gibtonite deposit reaction at [A.name] (JMP).") - else - message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] (JMP).") - - if(!triggered_by_explosion) - log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] ([A.x], [A.y], [A.z]).") - else - log_game("An explosion has triggered a gibtonite deposit reaction at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") - - countdown(notify_admins) - -/turf/simulated/mineral/gibtonite/proc/countdown(notify_admins = 0) - spawn(0) - while(stage == 1 && det_time > 0 && mineralAmt >= 1) - det_time-- - sleep(5) - if(stage == 1 && det_time <= 0 && mineralAmt >= 1) - var/turf/bombturf = get_turf(src) - mineralAmt = 0 - explosion(bombturf,1,3,5, adminlog = notify_admins) - if(stage == 0 || stage == 2) - return - -/turf/simulated/mineral/gibtonite/proc/defuse() - if(stage == 1) - icon_state = "rock_Gibtonite_inactive" - desc = "An inactive gibtonite reserve. The ore can be extracted." - stage = 2 - if(det_time < 0) - det_time = 0 - visible_message("The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!") - -/turf/simulated/mineral/gibtonite/gets_drilled(var/mob/user, triggered_by_explosion = 0) - if(stage == 0 && mineralAmt >= 1) //Gibtonite deposit is activated - playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1) - explosive_reaction(user, triggered_by_explosion) - return - if(stage == 1 && mineralAmt >= 1) //Gibtonite deposit goes kaboom - var/turf/bombturf = get_turf(src) - mineralAmt = 0 - explosion(bombturf,1,2,5, adminlog = 0) - if(stage == 2) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore. - var/obj/item/twohanded/required/gibtonite/G = new /obj/item/twohanded/required/gibtonite/(src) - if(det_time <= 0) - G.quality = 3 - G.icon_state = "Gibtonite ore 3" - if(det_time >= 1 && det_time <= 2) - G.quality = 2 - G.icon_state = "Gibtonite ore 2" - var/turf/simulated/floor/plating/airless/asteroid/gibtonite_remains/G = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid/gibtonite_remains) - G.fullUpdateMineralOverlays() - -/turf/simulated/floor/plating/airless/asteroid/gibtonite_remains - var/det_time = 0 - var/stage = 0 - -////////////////////////////////End Gibtonite - -/turf/simulated/mineral/attackby(var/obj/item/pickaxe/P as obj, mob/user as mob, params) - - if(!user.IsAdvancedToolUser()) - to_chat(usr, "You don't have the dexterity to do this!") - return - - if(istype(P, /obj/item/pickaxe)) - var/turf/T = user.loc - if(!( istype(T, /turf) )) - return - - if(last_act+P.digspeed > world.time)//prevents message spam - return - last_act = world.time - to_chat(user, "You start picking...") - P.playDigSound() - - if(do_after(user, P.digspeed, target = src)) - if(istype(src, /turf/simulated/mineral)) //sanity check against turf being deleted during digspeed delay - to_chat(user, "You finish cutting into the rock.") - P.update_icon() - gets_drilled(user) - feedback_add_details("pick_used_mining","[P.name]") - else - return attack_hand(user) - return - -/turf/simulated/mineral/proc/gets_drilled() - if(mineralType && (src.mineralAmt > 0) && (src.mineralAmt < 11)) - var/i - for(i=0;i Setup Character You are ready (Cancel) " else @@ -106,21 +106,21 @@ /mob/new_player/Stat() statpanel("Lobby") - if(client.statpanel=="Lobby" && ticker) - if(ticker.hide_mode) + if(client.statpanel=="Lobby" && SSticker) + if(SSticker.hide_mode) stat("Game Mode:", "Secret") else - if(ticker.hide_mode == 0) + if(SSticker.hide_mode == 0) stat("Game Mode:", "[master_mode]") // Old setting for showing the game mode else stat("Game Mode: ", "Secret") - if((ticker.current_state == GAME_STATE_PREGAME) && going) - stat("Time To Start:", ticker.pregame_timeleft) - if((ticker.current_state == GAME_STATE_PREGAME) && !going) + if((SSticker.current_state == GAME_STATE_PREGAME) && going) + stat("Time To Start:", round(SSticker.pregame_timeleft/10)) + if((SSticker.current_state == GAME_STATE_PREGAME) && !going) stat("Time To Start:", "DELAYED") - if(ticker.current_state == GAME_STATE_PREGAME) + if(SSticker.current_state == GAME_STATE_PREGAME) stat("Players:", "[totalPlayers]") if(check_rights(R_ADMIN, 0, src)) stat("Players Ready:", "[totalPlayersReady]") @@ -136,7 +136,7 @@ ..() statpanel("Status") - if(client.statpanel == "Status" && ticker) + if(client.statpanel == "Status" && SSticker) show_stat_station_time() @@ -182,7 +182,8 @@ return 0 if(alert(src,"Are you sure you wish to observe? You cannot normally join the round after doing this!","Player Setup","Yes","No") == "Yes") - if(!client) return 1 + if(!client) + return 1 var/mob/dead/observer/observer = new() src << browse(null, "window=playersetup") spawning = 1 @@ -217,10 +218,9 @@ if(!tos_consent) to_chat(usr, "You must consent to the terms of service before you can join!") return 0 - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) to_chat(usr, "The round is either not ready, or has already finished...") return - if(client.prefs.species in GLOB.whitelisted_species) if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist) @@ -303,7 +303,7 @@ /mob/new_player/proc/AttemptLateSpawn(rank,var/spawning_at) if(src != usr) return 0 - if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING) to_chat(usr, "The round is either not ready, or has already finished...") return 0 if(!enter_allowed) @@ -330,7 +330,7 @@ ai_character.moveToEmptyCore() AnnounceCyborg(ai_character, rank, "has been downloaded to the empty core in \the [get_area(ai_character)]") - ticker.mode.latespawn(ai_character) + SSticker.mode.latespawn(ai_character) qdel(src) return @@ -370,15 +370,16 @@ character = SSjobs.EquipRank(character, rank, 1) //equips the human EquipCustomItems(character) - ticker.mode.latespawn(character) + SSticker.mode.latespawn(character) if(character.mind.assigned_role == "Cyborg") AnnounceCyborg(character, rank, join_message) else data_core.manifest_inject(character) - ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn - AnnounceArrival(character, rank, join_message) - AddEmploymentContract(character) + SSticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn + if(!IsAdminJob(rank)) + AnnounceArrival(character, rank, join_message) + AddEmploymentContract(character) if(!thisjob.is_position_available() && thisjob in SSjobs.prioritized_jobs) SSjobs.prioritized_jobs -= thisjob @@ -386,7 +387,7 @@ /mob/new_player/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message) - if(ticker.current_state == GAME_STATE_PLAYING) + if(SSticker.current_state == GAME_STATE_PLAYING) var/ailist[] = list() for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) ailist += A @@ -418,7 +419,7 @@ employmentCabinet.addFile(employee) /mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message) - if(ticker.current_state == GAME_STATE_PLAYING) + if(SSticker.current_state == GAME_STATE_PLAYING) var/ailist[] = list() for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) ailist += A @@ -536,7 +537,7 @@ var/mob/living/carbon/human/new_character = new(loc) new_character.lastarea = get_area(loc) - if(ticker.random_players || appearance_isbanned(new_character)) + if(SSticker.random_players || appearance_isbanned(new_character)) client.prefs.random_character() client.prefs.real_name = random_name(client.prefs.gender) client.prefs.copy_to(new_character) diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm index 9936895e473..3b61ea0f557 100644 --- a/code/modules/nano/modules/atmos_control.dm +++ b/code/modules/nano/modules/atmos_control.dm @@ -42,6 +42,7 @@ /datum/nano_module/atmos_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) var/data[0] data["alarms"] = air_alarm_repository.air_alarm_data(monitored_alarms) + return data /datum/nano_module/atmos_control/proc/generate_state(air_alarm) diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm index bfc87e0104c..0ebec2e724f 100644 --- a/code/modules/ninja/suit/mask.dm +++ b/code/modules/ninja/suit/mask.dm @@ -12,7 +12,7 @@ Contents: icon_state = "s-ninja(norm)" item_state = "s-ninja_mask" unacidable = 1 - species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 8c188952406..b161391f6e3 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -131,3 +131,9 @@ new /obj/item/documents/syndicate/yellow(src) update_icon() +/obj/item/folder/syndicate/mining/New() + . = ..() + new /obj/item/documents/syndicate/mining(src) + update_icon() + + diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 0adec3f6baa..451687cd38c 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -403,8 +403,8 @@ /obj/item/paper/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() - if(burn_state >= FLAMMABLE) //Only render paper that's burnable to be hard to read. - info = "[stars(info)]" + if(burn_state >= FLAMMABLE) //Renders paper that has been lit on fire to be illegible. + info = "Heat-curled corners and sooty words offer little insight. Whatever was once written on this page has been rendered illegible through fire." /obj/item/paper/proc/stamp(var/obj/item/stamp/S) stamps += (!stamps || stamps == "" ? "" : "") + " WARNING: Do not inject more than one pen in quick succession." + icon_state = "stimpen" + volume = 22 + amount_per_transfer_from_this = 22 + list_reagents = list("salbutamol" = 10, "epinephrine" = 5, "lavaland_extract" = 2, "salglu_solution" = 5) //Short burst of healing, followed by minor healing from the saline + /obj/item/reagent_containers/hypospray/autoinjector/nanocalcium name = "nanocalcium autoinjector" desc = "After a short period of time the nanites will slow the body's systems and assist with bone repair. Nanomachines son." diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 4b66482cf1d..cffc2f0ef06 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -76,6 +76,12 @@ icon_state = "pill16" list_reagents = list("adminordrazine" = 50) +/obj/item/reagent_containers/food/pill/morphine + name = "Morphine pill" + desc = "Commonly used to treat insomnia." + icon_state = "pill8" + list_reagents = list("morphine" = 30) + /obj/item/reagent_containers/food/pill/methamphetamine name = "Methamphetamine pill" desc = "Helps improve the ability to concentrate." @@ -106,6 +112,12 @@ icon_state = "pill17" list_reagents = list("charcoal" = 50) +/obj/item/reagent_containers/food/pill/epinephrine + name = "Epinephrine pill" + desc = "Used to provide shots of adrenaline." + icon_state = "pill6" + list_reagents = list("epinephrine" = 50) + /obj/item/reagent_containers/food/pill/salicylic name = "Salicylic Acid pill" desc = "Commonly used to treat moderate pain and fevers." diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 7c0823c2497..d8ee5d88309 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -112,6 +112,13 @@ volume = 50 list_reagents = list("cleaner" = 50) +//spray tan +/obj/item/reagent_containers/spray/spraytan + name = "spray tan" + volume = 50 + desc = "Gyaro brand spray tan. Do not spray near eyes or other orifices." + list_reagents = list("spraytan" = 50) + //pepperspray /obj/item/reagent_containers/spray/pepper name = "pepperspray" diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 6413765c99c..4c9ca937409 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -246,7 +246,7 @@ return // Clumsy folks can only flush it. - if(user.IsAdvancedToolUser(1)) + if(user.IsAdvancedToolUser()) ui_interact(user) else flush = !flush diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 239cb71328e..ae2d3da87ae 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -10,7 +10,6 @@ var/giftwrapped = 0 var/sortTag = 0 - /obj/structure/bigDelivery/attack_hand(mob/user as mob) playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) if(wrapped) @@ -24,7 +23,6 @@ qdel(src) - /obj/structure/bigDelivery/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/destTagger)) var/obj/item/destTagger/O = W @@ -67,17 +65,16 @@ else to_chat(user, "You need more paper.") - /obj/item/smallDelivery name = "small parcel" desc = "A small wrapped package." icon = 'icons/obj/storage.dmi' icon_state = "deliverycrateSmall" + item_state = "deliverypackage" var/obj/item/wrapped = null var/giftwrapped = 0 var/sortTag = 0 - /obj/item/smallDelivery/attack_self(mob/user as mob) if(wrapped && wrapped.loc) //sometimes items can disappear. For example, bombs. --rastaf0 wrapped.loc = user.loc @@ -88,7 +85,6 @@ playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) qdel(src) - /obj/item/smallDelivery/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/destTagger)) var/obj/item/destTagger/O = W @@ -128,8 +124,6 @@ else to_chat(user, "You need more paper.") - - /obj/item/stack/packageWrap name = "package wrapper" icon = 'icons/obj/items.dmi' @@ -140,7 +134,6 @@ max_amount = 25 burn_state = FLAMMABLE - /obj/item/stack/packageWrap/afterattack(var/obj/target as obj, mob/user as mob, proximity) if(!proximity) return if(!istype(target)) //this really shouldn't be necessary (but it is). -Pete @@ -153,8 +146,6 @@ if(target in user) return - - if(istype(target, /obj/item) && !(istype(target, /obj/item/storage) && !istype(target,/obj/item/storage/box) && !istype(target, /obj/item/shippingPackage))) var/obj/item/O = target if(use(1)) @@ -364,7 +355,6 @@ to_chat(user, "You need more welding fuel to complete this task.") return - /obj/item/shippingPackage name = "Shipping package" desc = "A pre-labeled package for shipping an item to coworkers." diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm index 0bac5824780..cdc81a9e759 100644 --- a/code/modules/response_team/ert.dm +++ b/code/modules/response_team/ert.dm @@ -21,11 +21,11 @@ var/ert_request_answered = FALSE if(!check_rights(R_EVENT)) return - if(!ticker) + if(!SSticker) to_chat(usr, "The game hasn't started yet!") return - if(ticker.current_state == GAME_STATE_PREGAME) + if(SSticker.current_state == GAME_STATE_PREGAME) to_chat(usr, "The round hasn't started yet!") return @@ -55,13 +55,9 @@ var/ert_request_answered = FALSE to_chat(src, "Upon using the antagHUD you forfeited the ability to join the round.") return 0 - if(response_team_members.len > 6) - to_chat(src, "The emergency response team is already full!") - return 0 - return 1 -/proc/trigger_armed_response_team(var/datum/response_team/response_team_type, commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots) +/proc/trigger_armed_response_team(datum/response_team/response_team_type, commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots) response_team_members = list() active_team = response_team_type active_team.setSlots(commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots) @@ -71,7 +67,7 @@ var/ert_request_answered = FALSE if(!ert_candidates.len) active_team.cannot_send_team() send_emergency_team = FALSE - return 0 + return // Respawnable players get first dibs for(var/mob/dead/observer/M in ert_candidates) @@ -87,38 +83,58 @@ var/ert_request_answered = FALSE if(!response_team_members.len) active_team.cannot_send_team() send_emergency_team = FALSE - return 0 + return - var/index = 1 + var/list/ert_gender_prefs = list() for(var/mob/M in response_team_members) - if(index > emergencyresponseteamspawn.len) - index = 1 + ert_gender_prefs.Add(input_async(M, "Please select a gender (10 seconds):", list("Male", "Female"))) + addtimer(CALLBACK(GLOBAL_PROC, .proc/get_ert_role_prefs, response_team_members, ert_gender_prefs), 100) +/proc/get_ert_role_prefs(list/response_team_members, list/ert_gender_prefs) + var/list/ert_role_prefs = list() + for(var/datum/async_input/A in ert_gender_prefs) + A.close() + for(var/mob/M in response_team_members) + ert_role_prefs.Add(input_ranked_async(M, "Please order ERT roles from most to least preferred (15 seconds):", active_team.get_slot_list())) + addtimer(CALLBACK(GLOBAL_PROC, .proc/dispatch_response_team, response_team_members, ert_gender_prefs, ert_role_prefs), 150) + +/proc/dispatch_response_team(list/response_team_members, list/ert_gender_prefs, list/ert_role_prefs) + var/spawn_index = 1 + + for(var/i = 1, i <= response_team_members.len, i++) + if(spawn_index > emergencyresponseteamspawn.len) + break + if(!active_team.get_slot_list().len) + break + var/gender_pref = ert_gender_prefs[i].result + var/role_pref = ert_role_prefs[i].close() + var/mob/M = response_team_members[i] if(!M || !M.client) continue - log_debug("Spawning as ERT: [M.ckey] ([M])") - var/client/C = M.client - var/mob/living/new_commando = C.create_response_team(emergencyresponseteamspawn[index]) - if(!M || !new_commando) + if(!gender_pref || !role_pref) + // Player was afk and did not select continue - new_commando.mind.key = M.key - new_commando.key = M.key - new_commando.update_icons() - index++ - + for(var/role in role_pref) + if(active_team.check_slot_available(role)) + var/mob/living/new_commando = M.client.create_response_team(gender_pref, role, emergencyresponseteamspawn[spawn_index]) + active_team.reduceSlots(role) + spawn_index++ + if(!M || !new_commando) + break + new_commando.mind.key = M.key + new_commando.key = M.key + new_commando.update_icons() + break send_emergency_team = FALSE - active_team.announce_team() - return 1 -/client/proc/create_response_team(var/turf/spawn_location) - var/class = 0 - while(!class) - class = input(src, "Which loadout would you like to choose?") in active_team.get_slot_list() - if(!active_team.check_slot_available(class)) // Because the prompt does not update automatically when a slot gets filled. - class = 0 + if(active_team.count) + active_team.announce_team() + return + // Everyone who said yes was afk + active_team.cannot_send_team() - if(class == "Cyborg") - active_team.reduceCyborgSlots() +/client/proc/create_response_team(new_gender, role, turf/spawn_location) + if(role == "Cyborg") var/cyborg_unlock = active_team.getCyborgUnlock() var/mob/living/silicon/robot/ert/R = new /mob/living/silicon/robot/ert(spawn_location, cyborg_unlock) return R @@ -126,8 +142,6 @@ var/ert_request_answered = FALSE var/mob/living/carbon/human/M = new(null) var/obj/item/organ/external/head/head_organ = M.get_organ("head") - var/new_gender = alert(src, "Please select your gender.", "ERT Character Generation", "Male", "Female") - if(new_gender) if(new_gender == "Male") M.change_gender(MALE) @@ -164,26 +178,29 @@ var/ert_request_answered = FALSE M.mind.original = M M.mind.assigned_role = SPECIAL_ROLE_ERT M.mind.special_role = SPECIAL_ROLE_ERT - if(!(M.mind in ticker.minds)) - ticker.minds += M.mind //Adds them to regular mind list. - ticker.mode.ert += M.mind + if(!(M.mind in SSticker.minds)) + SSticker.minds += M.mind //Adds them to regular mind list. + SSticker.mode.ert += M.mind M.forceMove(spawn_location) - SSjobs.CreateMoneyAccount(M, class, null) + SSjobs.CreateMoneyAccount(M, role, null) - active_team.equip_officer(class, M) + active_team.equip_officer(role, M) return M /datum/response_team - var/command_slots = 1 - var/engineer_slots = 3 - var/medical_slots = 3 - var/security_slots = 3 - var/janitor_slots = 0 - var/paranormal_slots = 0 - var/cyborg_slots = 0 + var/list/slots = list( + Commander = 0, + Security = 0, + Engineer = 0, + Medic = 0, + Janitor = 0, + Paranormal = 0, + Cyborg = 0 + ) + var/count = 0 var/command_outfit var/engineering_outfit @@ -193,88 +210,56 @@ var/ert_request_answered = FALSE var/paranormal_outfit var/cyborg_unlock = 0 -/datum/response_team/proc/setSlots(com, sec, med, eng, jan, par, cyb) - command_slots = com == null ? command_slots : com - security_slots = sec == null ? security_slots : sec - medical_slots = med == null ? medical_slots : med - engineer_slots = eng == null ? engineer_slots : eng - janitor_slots = jan == null ? janitor_slots : jan - paranormal_slots = par == null ? paranormal_slots : par - cyborg_slots = cyb == null ? cyborg_slots : cyb +/datum/response_team/proc/setSlots(com=1, sec=3, med=3, eng=3, jan=0, par=0, cyb=0) + slots["Commander"] = com + slots["Security"] = sec + slots["Medic"] = med + slots["Engineer"] = eng + slots["Janitor"] = jan + slots["Paranormal"] = par + slots["Cyborg"] = cyb -/datum/response_team/proc/reduceCyborgSlots() - cyborg_slots-- +/datum/response_team/proc/reduceSlots(role) + slots[role]-- + count++ /datum/response_team/proc/getCyborgUnlock() return cyborg_unlock /datum/response_team/proc/get_slot_list() var/list/slots_available = list() - if(command_slots) - slots_available |= "Commander" - if(security_slots) - slots_available |= "Security" - if(engineer_slots) - slots_available |= "Engineer" - if(medical_slots) - slots_available |= "Medic" - if(janitor_slots) - slots_available |= "Janitor" - if(paranormal_slots) - slots_available |= "Paranormal" - if(cyborg_slots) - slots_available |= "Cyborg" + for(var/role in slots) + if(slots[role]) + slots_available.Add(role) return slots_available -/datum/response_team/proc/check_slot_available(var/slot) - switch(slot) - if("Commander") - return command_slots - if("Security") - return security_slots - if("Engineer") - return engineer_slots - if("Medic") - return medical_slots - if("Janitor") - return janitor_slots - if("Paranormal") - return paranormal_slots - if("Cyborg") - return cyborg_slots - return 0 +/datum/response_team/proc/check_slot_available(role) + return slots[role] /datum/response_team/proc/equip_officer(var/officer_type, var/mob/living/carbon/human/M) switch(officer_type) if("Engineer") - engineer_slots -= 1 M.equipOutfit(engineering_outfit) M.job = "ERT Engineering" if("Security") - security_slots -= 1 M.equipOutfit(security_outfit) M.job = "ERT Security" if("Medic") - medical_slots -= 1 M.equipOutfit(medical_outfit) M.job = "ERT Medical" if("Janitor") - janitor_slots -= 1 M.equipOutfit(janitor_outfit) M.job = "ERT Janitor" if("Paranormal") - paranormal_slots -= 1 M.equipOutfit(paranormal_outfit) M.job = "ERT Paranormal" M.mind.isholy = TRUE if("Commander") - command_slots = 0 - // Override name and age for the commander M.rename_character(null, "[pick("Lieutenant", "Captain", "Major")] [pick(GLOB.last_names)]") M.age = rand(35,45) diff --git a/code/modules/ruins/lavalandruin_code/animal_hospital.dm b/code/modules/ruins/lavalandruin_code/animal_hospital.dm new file mode 100644 index 00000000000..c04fa74e279 --- /dev/null +++ b/code/modules/ruins/lavalandruin_code/animal_hospital.dm @@ -0,0 +1,17 @@ +/obj/item/paper/fluff/henderson_report + name = "Important Notice - Mrs. Henderson" + info = "Nothing of interest to report." + +/obj/effect/mob_spawn/human/doctor/alive/lavaland + name = "broken rejuvenation pod" + desc = "A small sleeper typically used to instantly restore minor wounds. This one seems broken, and its occupant is comatose." + mob_name = "a translocated vet" + flavour_text = "What...? Where are you? Where are the others? This is still the animal hospital - you should know, you've been an intern here for weeks - but \ + everyone's gone. One of the cats scratched you just a few minutes ago. That's why you were in the pod - to heal the scratch. The scabs are still fresh; you see them right now. So where is \ + everyone? Where did they go? What happened to the hospital? And is that smoke you smell? You need to find someone else. Maybe they can tell you what happened." + assignedrole = "Translocated Vet" + +/obj/effect/mob_spawn/human/doctor/alive/lavaland/Destroy() + var/obj/structure/fluff/empty_sleeper/S = new(drop_location()) + S.setDir(dir) + return ..() \ No newline at end of file diff --git a/code/modules/ruins/lavalandruin_code/ash_walker_den.dm b/code/modules/ruins/lavalandruin_code/ash_walker_den.dm new file mode 100644 index 00000000000..7800b3eb9ab --- /dev/null +++ b/code/modules/ruins/lavalandruin_code/ash_walker_den.dm @@ -0,0 +1,88 @@ +#define ASH_WALKER_SPAWN_THRESHOLD 2 +//The ash walker den consumes corpses or unconscious mobs to create ash walker eggs. For more info on those, check ghost_role_spawners.dm +/obj/structure/lavaland/ash_walker + name = "necropolis tendril nest" + desc = "A vile tendril of corruption. It's surrounded by a nest of rapidly growing eggs..." + icon = 'icons/mob/nest.dmi' + icon_state = "ash_walker_nest" + + anchored = TRUE + density = TRUE + + resistance_flags = FIRE_PROOF | LAVA_PROOF + max_integrity = 200 + + var/faction = list("ashwalker") + var/meat_counter = 6 + +/obj/structure/lavaland/ash_walker/Initialize() + . = ..() + START_PROCESSING(SSprocessing, src) + +/obj/structure/lavaland/ash_walker/Destroy() + . = ..() + STOP_PROCESSING(SSprocessing, src) + +/obj/structure/lavaland/ash_walker/deconstruct(disassembled) + new /obj/item/assembly/signaler/anomaly(get_step(loc, pick(alldirs))) + new /obj/effect/collapse(loc) + return ..() + +/obj/structure/lavaland/ash_walker/process() + consume() + spawn_mob() + +/obj/structure/lavaland/ash_walker/proc/consume() + for(var/mob/living/H in view(src, 1)) //Only for corpse right next to/on same tile + if(H.stat) + visible_message("Serrated tendrils eagerly pull [H] to [src], tearing the body apart as its blood seeps over the eggs.") + playsound(get_turf(src),'sound/magic/demon_consume.ogg', 100, 1) + for(var/obj/item/W in H) + if(!H.unEquip(W)) + qdel(W) + if(ismegafauna(H)) + meat_counter += 20 + else + meat_counter++ + H.gib() + obj_integrity = min(obj_integrity + max_integrity*0.05,max_integrity)//restores 5% hp of tendril + +/obj/structure/lavaland/ash_walker/proc/spawn_mob() + if(meat_counter >= ASH_WALKER_SPAWN_THRESHOLD) + new /obj/effect/mob_spawn/human/ash_walker(get_step(loc, pick(alldirs))) + visible_message("One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!") + meat_counter -= ASH_WALKER_SPAWN_THRESHOLD + +/obj/effect/mob_spawn/human/ash_walker + name = "ash walker egg" + desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within." + mob_name = "an ash walker" + icon = 'icons/mob/lavaland/lavaland_monsters.dmi' + icon_state = "large_egg" + mob_species = /datum/species/unathi/ashwalker + outfit = /datum/outfit/ashwalker + roundstart = FALSE + death = FALSE + anchored = FALSE + move_resist = MOVE_FORCE_NORMAL + density = FALSE + flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. \ + You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest. \ + You are free to attack miners and other outsiders. DO NOT leave Lavaland without admin permission! DO NOT attack the mining outpost without being provoked." + assignedrole = "Ash Walker" + +/obj/effect/mob_spawn/human/ash_walker/special(mob/living/carbon/human/new_spawn) + new_spawn.rename_character(new_spawn.real_name, new_spawn.dna.species.get_random_name(new_spawn.gender)) + + to_chat(new_spawn, "Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind. Glory to the Necropolis!") + +/obj/effect/mob_spawn/human/ash_walker/New() + . = ..() + var/area/A = get_area(src) + if(A) + notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) + +/datum/outfit/ashwalker + name ="Ashwalker" + head = /obj/item/clothing/head/helmet/gladiator + uniform = /obj/item/clothing/under/gladiator/ash_walker \ No newline at end of file diff --git a/code/modules/ruins/lavalandruin_code/hermit.dm b/code/modules/ruins/lavalandruin_code/hermit.dm new file mode 100644 index 00000000000..f92686a774e --- /dev/null +++ b/code/modules/ruins/lavalandruin_code/hermit.dm @@ -0,0 +1,52 @@ +//Malfunctioning cryostasis sleepers: Spawns in makeshift shelters in lavaland. Ghosts become hermits with knowledge of how they got to where they are now. +/obj/effect/mob_spawn/human/hermit + name = "malfunctioning cryostasis sleeper" + desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed." + mob_name = "a stranded hermit" + icon = 'icons/obj/lavaland/spawners.dmi' + icon_state = "cryostasis_sleeper" + roundstart = FALSE + death = FALSE + random = TRUE + mob_species = /datum/species/human + flavour_text = "You've been stranded in this godless prison of a planet for longer than you can remember. Each day you barely scrape by, and between the terrible \ + conditions of your makeshift shelter, the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \ + the fresh air of Earth. These thoughts are dispelled by yet another recollection of how you got here... " + assignedrole = "Hermit" + +/obj/effect/mob_spawn/human/hermit/Initialize(mapload) + . = ..() + var/arrpee = rand(1,4) + switch(arrpee) + if(1) + flavour_text += "you were a [pick("arms dealer", "shipwright", "docking manager")]'s assistant on a small trading station several sectors from here. Raiders attacked, and there was \ + only one pod left when you got to the escape bay. You took it and launched it alone, and the crowd of terrified faces crowding at the airlock door as your pod's engines burst to \ + life and sent you to this hell are forever branded into your memory." + outfit.uniform = /obj/item/clothing/under/assistantformal + outfit.shoes = /obj/item/clothing/shoes/black + outfit.back = /obj/item/storage/backpack + if(2) + flavour_text += "you're an exile from the Tiger Cooperative. Their technological fanaticism drove you to question the power and beliefs of the Exolitics, and they saw you as a \ + heretic and subjected you to hours of horrible torture. You were hours away from execution when a high-ranking friend of yours in the Cooperative managed to secure you a pod, \ + scrambled its destination's coordinates, and launched it. You awoke from stasis when you landed and have been surviving - barely - ever since." + outfit.uniform = /obj/item/clothing/under/color/orange + outfit.shoes = /obj/item/clothing/shoes/orange + outfit.back = /obj/item/storage/backpack + if(3) + flavour_text += "you were a doctor on one of Nanotrasen's space stations, but you left behind that damn corporation's tyranny and everything it stood for. From a metaphorical hell \ + to a literal one, you find yourself nonetheless missing the recycled air and warm floors of what you left behind... but you'd still rather be here than there." + outfit.uniform = /obj/item/clothing/under/rank/medical + outfit.suit = /obj/item/clothing/suit/storage/labcoat + outfit.back = /obj/item/storage/backpack/medic + outfit.shoes = /obj/item/clothing/shoes/black + if(4) + flavour_text += "you were always joked about by your friends for \"not playing with a full deck\", as they so kindly put it. It seems that they were right when you, on a tour \ + at one of Nanotrasen's state-of-the-art research facilities, were in one of the escape pods alone and saw the red button. It was big and shiny, and it caught your eye. You pressed \ + it, and after a terrifying and fast ride for days, you landed here. You've had time to wisen up since then, and you think that your old friends wouldn't be laughing now." + outfit.uniform = /obj/item/clothing/under/color/grey/glorf + outfit.shoes = /obj/item/clothing/shoes/black + outfit.back = /obj/item/storage/backpack + +/obj/effect/mob_spawn/human/hermit/Destroy() + new/obj/structure/fluff/empty_cryostasis_sleeper(get_turf(src)) + return ..() diff --git a/code/modules/ruins/lavalandruin_code/seed_vault.dm b/code/modules/ruins/lavalandruin_code/seed_vault.dm new file mode 100644 index 00000000000..21cf86b4a07 --- /dev/null +++ b/code/modules/ruins/lavalandruin_code/seed_vault.dm @@ -0,0 +1,33 @@ +/obj/effect/spawner/lootdrop/seed_vault + name = "seed vault seeds" + lootcount = 1 + + loot = list(/obj/item/seeds/gatfruit = 10, + /obj/item/seeds/cherry/bomb = 10, + /obj/item/seeds/berry/glow = 10, + /obj/item/seeds/sunflower/moonflower = 8 + ) + +/obj/effect/mob_spawn/human/seed_vault + name = "preserved terrarium" + desc = "An ancient machine that seems to be used for storing plant matter. The glass is obstructed by a mat of vines." + mob_name = "a lifebringer" + icon = 'icons/obj/lavaland/spawners.dmi' + icon_state = "terrarium" + density = TRUE + roundstart = FALSE + death = FALSE + mob_species = /datum/species/diona + flavour_text = "You are a sentient ecosystem, an example of the mastery over life that your creators possessed. Your masters, benevolent as they were, created uncounted \ + seed vaults and spread them across the universe to every planet they could chart. You are in one such seed vault. Your goal is to cultivate and spread life wherever it will go while waiting \ + for contact from your creators. Estimated time of last contact: Deployment, 5x10^3 millennia ago." + assignedrole = "Lifebringer" + +/obj/effect/mob_spawn/human/seed_vault/special(mob/living/new_spawn) + var/plant_name = pick("Tomato", "Potato", "Broccoli", "Carrot", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Banana", "Moss", "Flower", "Bloom", "Root", "Bark", "Glowshroom", "Petal", "Leaf", \ + "Venus", "Sprout","Cocoa", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper") + new_spawn.rename_character(null, plant_name) + +/obj/effect/mob_spawn/human/seed_vault/Destroy() + new/obj/structure/fluff/empty_terrarium(get_turf(src)) + return ..() \ No newline at end of file diff --git a/code/modules/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/ruins/lavalandruin_code/syndicate_base.dm new file mode 100644 index 00000000000..bbfa4ef688a --- /dev/null +++ b/code/modules/ruins/lavalandruin_code/syndicate_base.dm @@ -0,0 +1,85 @@ +// SyndiChem +/obj/machinery/vending/syndichem + name = "\improper SyndiChem" + desc = "A vending machine full of grenades and grenade accessories. Sponsored by DonkCo(tm)." + req_access = list(access_syndicate) + products = list(/obj/item/stack/cable_coil/random = 5, + /obj/item/assembly/igniter = 20, + /obj/item/assembly/prox_sensor = 5, + /obj/item/assembly/signaler = 5, + /obj/item/assembly/timer = 5, + /obj/item/assembly/voice = 5, + /obj/item/assembly/health = 5, + /obj/item/assembly/infra = 5, + /obj/item/grenade/chem_grenade = 5, + /obj/item/grenade/chem_grenade/large = 5, + /obj/item/grenade/chem_grenade/pyro = 5, + /obj/item/grenade/chem_grenade/cryo = 5, + /obj/item/grenade/chem_grenade/adv_release = 5, + /obj/item/reagent_containers/food/drinks/bottle/holywater = 1) + product_slogans = "It's not pyromania if you're getting paid!;You smell that? Plasma, son. Nothing else in the world smells like that.;I love the smell of Plasma in the morning." + resistance_flags = FIRE_PROOF + +// Spawners +/obj/effect/mob_spawn/human/lavaland_syndicate + name = "Syndicate Bioweapon Scientist sleeper" + mob_name = "Syndicate Bioweapon Scientist" + roundstart = FALSE + death = FALSE + icon = 'icons/obj/cryogenic2.dmi' + icon_state = "sleeper_s" + flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. The base is rigged with explosives, do not abandon it or let it fall into enemy hands! \ + You are free to attack anyone not aligned with the Syndicate in the vicinity of your base. DO NOT work against Syndicate personnel (such as traitors or nuclear operatives). You may work with or against non-Syndicate antagonists on a case-by-case basis. DO NOT leave your base without admin permission." + outfit = /datum/outfit/lavaland_syndicate + assignedrole = "Lavaland Syndicate" + +/obj/effect/mob_spawn/human/lavaland_syndicate/Destroy() + var/obj/structure/fluff/empty_sleeper/syndicate/S = new /obj/structure/fluff/empty_sleeper/syndicate(get_turf(src)) + S.setDir(dir) + return ..() + +/datum/outfit/lavaland_syndicate + name = "Lavaland Syndicate Agent" + r_hand = /obj/item/gun/projectile/automatic/sniper_rifle + uniform = /obj/item/clothing/under/syndicate + suit = /obj/item/clothing/suit/storage/labcoat + shoes = /obj/item/clothing/shoes/combat + gloves = /obj/item/clothing/gloves/combat + r_ear = /obj/item/radio/headset/syndicate/alt + back = /obj/item/storage/backpack + r_pocket = /obj/item/gun/projectile/automatic/pistol + id = /obj/item/card/id/syndicate/anyone + implants = list(/obj/item/implant/weapons_auth) + +/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H) + H.faction |= "syndicate" + +/obj/effect/mob_spawn/human/lavaland_syndicate/comms + name = "Syndicate Comms Agent sleeper" + mob_name = "Syndicate Comms Agent" + flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands! \ + You are free to attack anyone not aligned with the Syndicate in the vicinity of your base. DO NOT work against Syndicate personnel (such as traitors or nuclear operatives). You may work with or against non-Syndicate antagonists on a case-by-case basis. DO NOT leave your base without admin permission." + outfit = /datum/outfit/lavaland_syndicate/comms + +/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space + flavour_text = "You are a syndicate agent, assigned to a small listening post station situated near your hated enemy's top secret research facility: Space Station 13. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands! \ + You are free to attack anyone not aligned with the Syndicate in the vicinity of your base. DO NOT work against Syndicate personnel (such as traitors or nuclear operatives). You may work with or against non-Syndicate antagonists on a case-by-case basis. DO NOT leave your base without admin permission." + +/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space/Initialize(mapload) + . = ..() + if(prob(90)) //only has a 10% chance of existing, otherwise it'll just be a NPC syndie. + new /mob/living/simple_animal/hostile/syndicate/ranged(get_turf(src)) + return INITIALIZE_HINT_QDEL + +/datum/outfit/lavaland_syndicate/comms + name = "Lavaland Syndicate Comms Agent" + r_hand = /obj/item/melee/energy/sword/saber + mask = /obj/item/clothing/mask/chameleon/gps + suit = /obj/item/clothing/suit/armor/vest + +/obj/item/clothing/mask/chameleon/gps/New() + . = ..() + new /obj/item/gps/internal/lavaland_syndicate_base(src) + +/obj/item/gps/internal/lavaland_syndicate_base + gpstag = "Encrypted Signal" \ No newline at end of file diff --git a/code/modules/ruins/objects_and_mobs/gym.dm b/code/modules/ruins/objects_and_mobs/gym.dm new file mode 100644 index 00000000000..69abf1a7e88 --- /dev/null +++ b/code/modules/ruins/objects_and_mobs/gym.dm @@ -0,0 +1,93 @@ +/obj/structure/punching_bag + name = "punching bag" + desc = "A punching bag. Can you get to speed level 4???" + icon = 'icons/goonstation/objects/fitness.dmi' + icon_state = "punchingbag" + anchored = TRUE + layer = WALL_OBJ_LAYER + var/list/hit_sounds = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg',\ + 'sound/weapons/punch1.ogg', 'sound/weapons/punch2.ogg', 'sound/weapons/punch3.ogg', 'sound/weapons/punch4.ogg') + +/obj/structure/punching_bag/attack_hand(mob/user as mob) + . = ..() + if(.) + return + flick("[icon_state]2", src) + playsound(loc, pick(hit_sounds), 25, 1, -1) + if(isliving(user)) + var/mob/living/L = user + L.apply_status_effect(STATUS_EFFECT_EXERCISED) + +/obj/structure/weightmachine + name = "weight machine" + desc = "Just looking at this thing makes you feel tired." + density = TRUE + anchored = TRUE + var/icon_state_inuse + +/obj/structure/weightmachine/proc/AnimateMachine(mob/living/user) + return + +/obj/structure/weightmachine/attack_hand(mob/living/user) + . = ..() + if(.) + return + if(in_use) + to_chat(user, "It's already in use - wait a bit.") + return + else + in_use = TRUE + icon_state = icon_state_inuse + user.setDir(SOUTH) + user.Stun(4) + user.forceMove(src.loc) + var/bragmessage = pick("pushing it to the limit","going into overdrive","burning with determination","rising up to the challenge", "getting strong now","getting ripped") + user.visible_message("[user] is [bragmessage]!") + AnimateMachine(user) + + playsound(user, 'sound/machines/click.ogg', 60, 1) + in_use = FALSE + user.pixel_y = 0 + var/finishmessage = pick("You feel stronger!","You feel like you can take on the world!","You feel robust!","You feel indestructible!") + icon_state = initial(icon_state) + to_chat(user, finishmessage) + user.apply_status_effect(STATUS_EFFECT_EXERCISED) + +/obj/structure/weightmachine/stacklifter + icon = 'icons/goonstation/objects/fitness.dmi' + icon_state = "fitnesslifter" + icon_state_inuse = "fitnesslifter2" + +/obj/structure/weightmachine/stacklifter/AnimateMachine(mob/living/user) + var/lifts = 0 + while (lifts++ < 6) + if (user.loc != src.loc) + break + sleep(3) + animate(user, pixel_y = -2, time = 3) + sleep(3) + animate(user, pixel_y = -4, time = 3) + sleep(3) + playsound(user, 'sound/goonstation/effects/spring.ogg', 60, 1) + +/obj/structure/weightmachine/weightlifter + icon = 'icons/goonstation/objects/fitness.dmi' + icon_state = "fitnessweight" + icon_state_inuse = "fitnessweight-c" + +/obj/structure/weightmachine/weightlifter/AnimateMachine(mob/living/user) + var/mutable_appearance/swole_overlay = mutable_appearance(icon, "fitnessweight-w", WALL_OBJ_LAYER) + add_overlay(swole_overlay) + var/reps = 0 + user.pixel_y = 5 + while (reps++ < 6) + if (user.loc != src.loc) + break + for (var/innerReps = max(reps, 1), innerReps > 0, innerReps--) + sleep(3) + animate(user, pixel_y = (user.pixel_y == 3) ? 5 : 3, time = 3) + playsound(user, 'sound/goonstation/effects/spring.ogg', 60, 1) + sleep(3) + animate(user, pixel_y = 2, time = 3) + sleep(3) + cut_overlay(swole_overlay) \ No newline at end of file diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm new file mode 100644 index 00000000000..a725d3d5d5f --- /dev/null +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -0,0 +1,413 @@ +//The necropolis gate is used to call forth Legion from the Necropolis. +/obj/structure/necropolis_gate + name = "necropolis gate" + desc = "A massive stone gateway." + icon = 'icons/effects/96x96.dmi' + icon_state = "gate_full" + flags = ON_BORDER + appearance_flags = 0 + layer = TABLE_LAYER + anchored = TRUE + density = TRUE + pixel_x = -32 + pixel_y = -32 + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF + unacidable = 1 + light_range = 8 + light_color = LIGHT_COLOR_LAVA + var/open = FALSE + var/changing_openness = FALSE + var/locked = FALSE + var/static/mutable_appearance/top_overlay + var/static/mutable_appearance/door_overlay + var/static/mutable_appearance/dais_overlay + var/obj/structure/opacity_blocker/sight_blocker + var/sight_blocker_distance = 1 + +/obj/structure/necropolis_gate/Initialize() + . = ..() + setDir(SOUTH) + var/turf/sight_blocker_turf = get_turf(src) + if(sight_blocker_distance) + for(var/i in 1 to sight_blocker_distance) + if(!sight_blocker_turf) + break + sight_blocker_turf = get_step(sight_blocker_turf, NORTH) + if(sight_blocker_turf) + sight_blocker = new (sight_blocker_turf) //we need to block sight in a different spot than most things do + sight_blocker.pixel_y = initial(sight_blocker.pixel_y) - (32 * sight_blocker_distance) + icon_state = "gate_bottom" + top_overlay = mutable_appearance('icons/effects/96x96.dmi', "gate_top") + top_overlay.layer = EDGED_TURF_LAYER + add_overlay(top_overlay) + door_overlay = mutable_appearance('icons/effects/96x96.dmi', "door") + door_overlay.layer = EDGED_TURF_LAYER + add_overlay(door_overlay) + dais_overlay = mutable_appearance('icons/effects/96x96.dmi', "gate_dais") + dais_overlay.layer = CLOSED_TURF_LAYER + add_overlay(dais_overlay) + +/obj/structure/necropolis_gate/Destroy(force) + if(force) + qdel(sight_blocker, TRUE) + . = ..() + else + return QDEL_HINT_LETMELIVE + +/obj/structure/necropolis_gate/singularity_pull() + return 0 + +/obj/structure/necropolis_gate/CanPass(atom/movable/mover, turf/target) + if(get_dir(loc, target) == dir) + return !density + return 1 + +/obj/structure/necropolis_gate/CheckExit(atom/movable/O, target) + if(get_dir(O.loc, target) == dir) + return !density + return 1 + +/obj/structure/opacity_blocker + icon = 'icons/effects/96x96.dmi' + icon_state = "gate_blocker" + layer = EDGED_TURF_LAYER + pixel_x = -32 + pixel_y = -32 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + opacity = TRUE + anchored = TRUE + +/obj/structure/opacity_blocker/singularity_pull() + return 0 + +/obj/structure/opacity_blocker/Destroy(force) + if(force) + . = ..() + else + return QDEL_HINT_LETMELIVE + +//ATTACK HAND IGNORING PARENT RETURN VALUE +/obj/structure/necropolis_gate/attack_hand(mob/user) + if(locked) + to_chat(user, "It's [open ? "stuck open":"locked"].") + return + toggle_the_gate(user) + return ..() + +/obj/structure/necropolis_gate/proc/toggle_the_gate(mob/user, legion_damaged) + if(changing_openness) + return + changing_openness = TRUE + var/turf/T = get_turf(src) + if(open) + new /obj/effect/temp_visual/necropolis(T) + visible_message("The door slams closed!") + sleep(1) + playsound(T, 'sound/effects/stonedoor_openclose.ogg', 300, TRUE, frequency = 80000) + sleep(1) + density = TRUE + sleep(1) + var/turf/sight_blocker_turf = get_turf(src) + if(sight_blocker_distance) + for(var/i in 1 to sight_blocker_distance) + if(!sight_blocker_turf) + break + sight_blocker_turf = get_step(sight_blocker_turf, NORTH) + if(sight_blocker_turf) + sight_blocker.pixel_y = initial(sight_blocker.pixel_y) - (32 * sight_blocker_distance) + sight_blocker.forceMove(sight_blocker_turf) + sleep(2.5) + playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, TRUE, frequency = 15000) + add_overlay(door_overlay) + open = FALSE + else + cut_overlay(door_overlay) + new /obj/effect/temp_visual/necropolis/open(T) + sleep(2) + visible_message("The door starts to grind open...") + playsound(T, 'sound/effects/stonedoor_openclose.ogg', 300, TRUE, frequency = 20000) + sleep(22) + sight_blocker.forceMove(src) + sleep(5) + density = FALSE + sleep(5) + open = TRUE + changing_openness = FALSE + return TRUE + +/obj/structure/necropolis_gate/locked + locked = TRUE + +GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) +/obj/structure/necropolis_gate/legion_gate + desc = "A tremendous, impossibly large gateway, set into a massive tower of stone." + sight_blocker_distance = 2 + +/obj/structure/necropolis_gate/legion_gate/Initialize() + . = ..() + GLOB.necropolis_gate = src + +/obj/structure/necropolis_gate/legion_gate/Destroy(force) + if(force) + if(GLOB.necropolis_gate == src) + GLOB.necropolis_gate = null + . = ..() + else + return QDEL_HINT_LETMELIVE + +//ATTACK HAND IGNORING PARENT RETURN VALUE +/obj/structure/necropolis_gate/legion_gate/attack_hand(mob/user) + if(!open && !changing_openness) + var/safety = alert(user, "You think this might be a bad idea...", "Knock on the door?", "Proceed", "Abort") + if(safety == "Abort" || !in_range(src, user) || !src || open || changing_openness || user.incapacitated()) + return + user.visible_message("[user] knocks on [src]...", "You tentatively knock on [src]...") + playsound(user.loc, 'sound/effects/shieldbash.ogg', 100, 1) + sleep(50) + return ..() + +/obj/structure/necropolis_gate/legion_gate/toggle_the_gate(mob/user, legion_damaged) + if(open) + return + . = ..() + if(.) + locked = TRUE + var/turf/T = get_turf(src) + visible_message("Something horrible emerges from the Necropolis!") + if(legion_damaged) + message_admins("Legion took damage while the necropolis gate was closed, and has released itself!") + log_game("Legion took damage while the necropolis gate was closed and released itself.") + else + message_admins("[user ? ADMIN_LOOKUPFLW(user):"Unknown"] has released Legion!") + log_game("[user ? key_name(user) : "Unknown"] released Legion.") + + var/sound/legion_sound = sound('sound/creatures/legion_spawn.ogg') + for(var/mob/M in GLOB.player_list) + if(M.z == z) + to_chat(M, "Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has been released.") + M.playsound_local(T, null, 100, FALSE, 0, FALSE, pressure_affected = FALSE, S = legion_sound) + flash_color(M, flash_color = "#FF0000", flash_time = 50) + var/mutable_appearance/release_overlay = mutable_appearance('icons/effects/effects.dmi', "legiondoor") + notify_ghosts("Legion has been released in the [get_area(src)]!", source = src, alert_overlay = release_overlay, action = NOTIFY_JUMP) + +/obj/effect/temp_visual/necropolis + icon = 'icons/effects/96x96.dmi' + icon_state = "door_closing" + appearance_flags = 0 + duration = 6 + layer = EDGED_TURF_LAYER + pixel_x = -32 + pixel_y = -32 + +/obj/effect/temp_visual/necropolis/open + icon_state = "door_opening" + duration = 38 + +/obj/structure/necropolis_arch + name = "necropolis arch" + desc = "A massive arch over the necropolis gate, set into a massive tower of stone." + icon = 'icons/effects/160x160.dmi' + icon_state = "arch_full" + appearance_flags = 0 + layer = TABLE_LAYER + anchored = TRUE + pixel_x = -64 + pixel_y = -40 + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF + unacidable = TRUE + var/open = FALSE + var/static/mutable_appearance/top_overlay + +/obj/structure/necropolis_arch/Initialize() + . = ..() + icon_state = "arch_bottom" + top_overlay = mutable_appearance('icons/effects/160x160.dmi', "arch_top") + top_overlay.layer = EDGED_TURF_LAYER + add_overlay(top_overlay) + +/obj/structure/necropolis_arch/singularity_pull() + return 0 + +/obj/structure/necropolis_arch/Destroy(force) + if(force) + . = ..() + else + return QDEL_HINT_LETMELIVE + +#define STABLE 0 //The tile is stable and won't collapse/sink when crossed. +#define COLLAPSE_ON_CROSS 1 //The tile is unstable and will temporary become unusable when crossed. +#define DESTROY_ON_CROSS 2 //The tile is nearly broken and will permanently become unusable when crossed. +#define UNIQUE_EFFECT 3 //The tile has some sort of unique effect when crossed. +//stone tiles for boss arenas +/obj/structure/stone_tile + name = "stone tile" + icon = 'icons/turf/boss_floors.dmi' + icon_state = "pristine_tile1" + layer = ABOVE_OPEN_TURF_LAYER + anchored = TRUE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF + unacidable = TRUE + var/tile_key = "pristine_tile" + var/tile_random_sprite_max = 24 + var/fall_on_cross = STABLE //If the tile has some sort of effect when crossed + var/fallen = FALSE //If the tile is unusable + var/falling = FALSE //If the tile is falling + +/obj/structure/stone_tile/Initialize(mapload) + . = ..() + icon_state = "[tile_key][rand(1, tile_random_sprite_max)]" + +/obj/structure/stone_tile/Destroy(force) + if(force || fallen) + . = ..() + else + return QDEL_HINT_LETMELIVE + +/obj/structure/stone_tile/singularity_pull() + return + +/obj/structure/stone_tile/Crossed(atom/movable/AM) + if(falling || fallen) + return + var/turf/T = get_turf(src) + if(!islava(T) && !ischasm(T)) //nothing to sink or fall into + return + var/obj/item/I + if(istype(AM, /obj/item)) + I = AM + var/mob/living/L + if(isliving(AM)) + L = AM + switch(fall_on_cross) + if(COLLAPSE_ON_CROSS, DESTROY_ON_CROSS) + if((I && I.w_class >= WEIGHT_CLASS_BULKY) || (L && !(L.flying) && L.mob_size >= MOB_SIZE_HUMAN)) //too heavy! too big! aaah! + collapse() + if(UNIQUE_EFFECT) + crossed_effect(AM) + +/obj/structure/stone_tile/proc/collapse() + falling = TRUE + var/break_that_sucker = fall_on_cross == DESTROY_ON_CROSS + playsound(src, 'sound/effects/pressureplate.ogg', 50, TRUE) + Shake(-1, -1, 25) + sleep(5) + if(break_that_sucker) + playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) + else + playsound(src, 'sound/mecha/mechmove04.ogg', 50, TRUE) + animate(src, alpha = 0, pixel_y = pixel_y - 3, time = 5) + fallen = TRUE + if(break_that_sucker) + QDEL_IN(src, 10) + else + addtimer(CALLBACK(src, .proc/rebuild), 55) + +/obj/structure/stone_tile/proc/rebuild() + pixel_x = initial(pixel_x) + pixel_y = initial(pixel_y) - 5 + animate(src, alpha = initial(alpha), pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 30) + sleep(30) + falling = FALSE + fallen = FALSE + +/obj/structure/stone_tile/proc/crossed_effect(atom/movable/AM) + return + +/obj/structure/stone_tile/block + name = "stone block" + icon_state = "pristine_block1" + tile_key = "pristine_block" + tile_random_sprite_max = 4 + +/obj/structure/stone_tile/slab + name = "stone slab" + icon_state = "pristine_slab1" + tile_key = "pristine_slab" + tile_random_sprite_max = 4 + +/obj/structure/stone_tile/center + name = "stone center tile" + icon_state = "pristine_center1" + tile_key = "pristine_center" + tile_random_sprite_max = 4 + +/obj/structure/stone_tile/surrounding + name = "stone surrounding slab" + icon_state = "pristine_surrounding1" + tile_key = "pristine_surrounding" + tile_random_sprite_max = 2 + +/obj/structure/stone_tile/surrounding_tile + name = "stone surrounding tile" + icon_state = "pristine_surrounding_tile1" + tile_key = "pristine_surrounding_tile" + tile_random_sprite_max = 2 + +//cracked stone tiles +/obj/structure/stone_tile/cracked + name = "cracked stone tile" + icon_state = "cracked_tile1" + tile_key = "cracked_tile" + +/obj/structure/stone_tile/block/cracked + name = "cracked stone block" + icon_state = "cracked_block1" + tile_key = "cracked_block" + +/obj/structure/stone_tile/slab/cracked + name = "cracked stone slab" + icon_state = "cracked_slab1" + tile_key = "cracked_slab" + tile_random_sprite_max = 1 + +/obj/structure/stone_tile/center/cracked + name = "cracked stone center tile" + icon_state = "cracked_center1" + tile_key = "cracked_center" + +/obj/structure/stone_tile/surrounding/cracked + name = "cracked stone surrounding slab" + icon_state = "cracked_surrounding1" + tile_key = "cracked_surrounding" + tile_random_sprite_max = 1 + +/obj/structure/stone_tile/surrounding_tile/cracked + name = "cracked stone surrounding tile" + icon_state = "cracked_surrounding_tile1" + tile_key = "cracked_surrounding_tile" + +//burnt stone tiles +/obj/structure/stone_tile/burnt + name = "burnt stone tile" + icon_state = "burnt_tile1" + tile_key = "burnt_tile" + +/obj/structure/stone_tile/block/burnt + name = "burnt stone block" + icon_state = "burnt_block1" + tile_key = "burnt_block" + +/obj/structure/stone_tile/slab/burnt + name = "burnt stone slab" + icon_state = "burnt_slab1" + tile_key = "burnt_slab" + +/obj/structure/stone_tile/center/burnt + name = "burnt stone center tile" + icon_state = "burnt_center1" + tile_key = "burnt_center" + +/obj/structure/stone_tile/surrounding/burnt + name = "burnt stone surrounding slab" + icon_state = "burnt_surrounding1" + tile_key = "burnt_surrounding" + +/obj/structure/stone_tile/surrounding_tile/burnt + name = "burnt stone surrounding tile" + icon_state = "burnt_surrounding_tile1" + tile_key = "burnt_surrounding_tile" + +#undef STABLE +#undef COLLAPSE_ON_CROSS +#undef DESTROY_ON_CROSS +#undef UNIQUE_EFFECT \ No newline at end of file diff --git a/code/modules/ruins/ruin_areas.dm b/code/modules/ruins/ruin_areas.dm index 0304f36156e..2d8ce5a33ac 100644 --- a/code/modules/ruins/ruin_areas.dm +++ b/code/modules/ruins/ruin_areas.dm @@ -1,10 +1,11 @@ //Parent types -/area/ruin/ +/area/ruin name = "\improper Unexplored Location" icon_state = "away" has_gravity = TRUE there_can_be_many = TRUE + ambientsounds = list('sound/ambience/ambimine.ogg') dynamic_lighting = DYNAMIC_LIGHTING_FORCED /area/ruin/unpowered @@ -16,9 +17,6 @@ /area/ruin/powered requires_power = FALSE - - - //Areas /area/ruin/unpowered/no_grav/way_home @@ -35,7 +33,6 @@ name = "Hallway" icon_state = "hallC" - /area/ruin/onehalf/drone_bay name = "Mining Drone Bay" icon_state = "engine" diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm index 3f074c1246c..834d3ddc907 100644 --- a/code/modules/security_levels/keycard authentication.dm +++ b/code/modules/security_levels/keycard authentication.dm @@ -183,7 +183,7 @@ trigger_armed_response_team(new /datum/response_team/amber) // No admins? No problem. Automatically send a code amber ERT. /obj/machinery/keycard_auth/proc/is_ert_blocked() - return ticker.mode && ticker.mode.ert_disabled + return SSticker.mode && SSticker.mode.ert_disabled var/global/maint_all_access = 0 var/global/station_all_access = 0 diff --git a/code/modules/security_levels/security levels.dm b/code/modules/security_levels/security levels.dm index 050326891fb..3b1e56e0c2d 100644 --- a/code/modules/security_levels/security levels.dm +++ b/code/modules/security_levels/security levels.dm @@ -31,6 +31,15 @@ // Mark down this time to prevent shuttle cheese SSshuttle.emergency_sec_level_time = world.time + // Reset gamma borgs if the new security level is lower than Gamma. + if(level < SEC_LEVEL_GAMMA) + for(var/M in GLOB.silicon_mob_list) + if(isrobot(M)) + var/mob/living/silicon/robot/R = M + if(istype(R.module, /obj/item/robot_module/combat) && !R.crisis) + R.reset_module() + to_chat(R, "Crisis mode deactivated. The combat module is no longer available and your module has been reset.") + switch(level) if(SEC_LEVEL_GREEN) security_announcement_down.Announce("All threats to the station have passed. All weapons need to be holstered and privacy laws are once again fully enforced.","Attention! Security level lowered to green.") @@ -176,15 +185,3 @@ return SEC_LEVEL_EPSILON if("delta") return SEC_LEVEL_DELTA - - -/*DEBUG -/mob/verb/set_thing0() - set_security_level(0) -/mob/verb/set_thing1() - set_security_level(1) -/mob/verb/set_thing2() - set_security_level(2) -/mob/verb/set_thing3() - set_security_level(3) -*/ diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index b796e3d8a7d..5481d7856d3 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -358,7 +358,7 @@ dwidth = 1 width = 3 height = 4 - var/target_area = /area/mine/dangerous/unexplored + var/target_area = /area/mine/unexplored /obj/docking_port/stationary/random/Initialize() ..() diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index c72b0896893..5fad9348769 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -912,4 +912,4 @@ T.color = color if(T.dir != dir) T.dir = dir - return T + return T \ No newline at end of file diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 28cb96b128b..b6a7e7bb28f 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -58,12 +58,10 @@ var/contcount for(var/atom/A in T.contents) - if(istype(A,/atom/movable/lighting_object)) - continue - if(istype(A,/obj/machinery/light)) - continue //hacky but whatever, shuttles need three spots each for this shit if(!A.simulated) continue + if(istype(A, /obj/machinery/light)) + continue //hacky but whatever, shuttles need three spots each for this shit contcount++ if(contcount) diff --git a/code/modules/space_management/heap_space_level.dm b/code/modules/space_management/heap_space_level.dm index 640080095a3..d8156291fc0 100644 --- a/code/modules/space_management/heap_space_level.dm +++ b/code/modules/space_management/heap_space_level.dm @@ -51,7 +51,7 @@ continue M.loc = null qdel(M, TRUE) - T.ChangeTurf(/turf/space) + T.ChangeTurf(T.baseturf) var/datum/space_chunk/last_empty_parent = C while(last_empty_parent.parent && last_empty_parent.parent.is_empty) last_empty_parent = last_empty_parent.parent diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 0efe2043ab0..4c945921389 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -13,7 +13,7 @@ /datum/station_goal/dna_vault/New() ..() animal_count = rand(15, 20) //might be too few given ~15 roundstart stationside ones - human_count = rand(round(0.75 * ticker.mode.num_players_started()), ticker.mode.num_players_started()) // 75%+ roundstart population. + human_count = rand(round(0.75 * SSticker.mode.num_players_started()), SSticker.mode.num_players_started()) // 75%+ roundstart population. var/non_standard_plants = non_standard_plants_count() plant_count = rand(round(0.5 * non_standard_plants),round(0.7 * non_standard_plants)) @@ -166,8 +166,8 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/ F.parent = src fillers += F - if(ticker.mode) - for(var/datum/station_goal/dna_vault/G in ticker.mode.station_goals) + if(SSticker.mode) + for(var/datum/station_goal/dna_vault/G in SSticker.mode.station_goals) animals_max = G.animal_count plants_max = G.plant_count dna_max = G.human_count diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 09ccb3ce36b..68977b5e14d 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -83,7 +83,7 @@ )) data["notice"] = notice - var/datum/station_goal/station_shield/G = locate() in ticker.mode.station_goals + var/datum/station_goal/station_shield/G = locate() in SSticker.mode.station_goals if(G) data["meteor_shield"] = 1 data["meteor_shield_coverage"] = G.get_coverage() diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm index 754e09b4185..90d4defa26c 100644 --- a/code/modules/station_goals/station_goal.dm +++ b/code/modules/station_goals/station_goal.dm @@ -33,7 +33,7 @@ to_chat(world, "Station Goal : [name] : Failed!") /datum/station_goal/Destroy() - ticker.mode.station_goals -= src + SSticker.mode.station_goals -= src . = ..() /datum/station_goal/Topic(href, href_list) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 512de9de9e9..987315ac13b 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -82,11 +82,10 @@ var/heal_burn = 0 var/heal_oxy = 0 - /obj/item/organ/internal/heart/cursed/attack(mob/living/carbon/human/H, mob/living/carbon/human/user, obj/target) if(H == user && istype(H)) if(NO_BLOOD in H.dna.species.species_traits) - to_chat(H, "\The [src] is not compatible with your form!") + to_chat(H, "[src] is not compatible with your form!") return playsound(user,'sound/effects/singlebeat.ogg', 40, 1) user.drop_item() @@ -111,17 +110,16 @@ if(owner) to_chat(owner, "Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!") - /datum/action/item_action/organ_action/cursed_heart name = "pump your blood" //You are now brea- pumping blood manually /datum/action/item_action/organ_action/cursed_heart/Trigger() . = ..() - if(. && istype(target,/obj/item/organ/internal/heart/cursed)) + if(. && istype(target, /obj/item/organ/internal/heart/cursed)) var/obj/item/organ/internal/heart/cursed/cursed_heart = target - if(world.time < (cursed_heart.last_pump + (cursed_heart.pump_delay-10))) //no spam + if(world.time < (cursed_heart.last_pump + (cursed_heart.pump_delay - 10))) //no spam to_chat(owner, "Too soon!") return @@ -132,7 +130,7 @@ var/mob/living/carbon/human/H = owner if(istype(H)) if(!(NO_BLOOD in H.dna.species.species_traits)) - H.blood_volume = min(H.blood_volume + cursed_heart.blood_loss*0.5, BLOOD_VOLUME_NORMAL) + H.blood_volume = min(H.blood_volume + cursed_heart.blood_loss * 0.5, BLOOD_VOLUME_NORMAL) if(owner.client) owner.client.color = "" diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index f959732427a..ebe824f0bbc 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -328,7 +328,7 @@ if(target.vision_type) //Turns off their darksight if it's still active. to_chat(target, "Your eyes are suddenly wrought with immense pain as your darksight is forcibly dismissed!") target.vision_type = null - ticker.mode.remove_thrall(target.mind, 0) + SSticker.mode.remove_thrall(target.mind, 0) target.visible_message("A strange black mass falls from [target]'s [E]!") var/obj/item/organ/thing = new /obj/item/organ/internal/shadowtumor(get_turf(target)) thing.set_dna(target.dna) diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index ca22fb5cb0e..29a4509ae7a 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -80,19 +80,18 @@ var/list/GPS_list = list() popup.open() /obj/item/gps/Topic(href, href_list) - if(..(state = inventory_state)) + if(..()) return 1 if(href_list["tag"] ) - var/a = input("Please enter desired tag.", name, gpstag) as text|null - if(!a || ..(state = inventory_state)) - return 1 + var/tag = input("Please enter desired tag.", name, gpstag) as text|null + if(!tag || ..()) + return TRUE - a = uppertext(sanitize(copytext(a, 1, 5))) - if(src.loc == usr) - gpstag = a - name = "global positioning system ([gpstag])" - attack_self(usr) + tag = uppertext(sanitize(copytext(tag, 1, 5))) + gpstag = tag + name = "global positioning system ([gpstag])" + attack_self(usr) /obj/item/gps/science icon_state = "gps-s" diff --git a/code/modules/tram/tram.dm b/code/modules/tram/tram.dm index fed50355dde..0f80c99405e 100644 --- a/code/modules/tram/tram.dm +++ b/code/modules/tram/tram.dm @@ -22,7 +22,7 @@ var/delay_timer = null - var/list/blacklist = list(/obj/tram/rail,/atom/movable/lighting_object) + var/list/blacklist = list(/obj/tram/rail) var/list/ancwhitelist = list(/obj/tram, /obj/vehicle, /obj/structure/chair, /obj/structure/grille, /obj/structure/window) /obj/tram/tram_controller/New() @@ -135,14 +135,20 @@ tram += src /obj/tram/tram_controller/proc/check_validity(var/atom/movable/AM) - if(!AM) return 0 - if(is_type_in_list(AM, blacklist)) return 0 - if(!AM.simulated) return 0 + if(!AM) + return FALSE + + if(!AM.simulated) + return FALSE + + if(is_type_in_list(AM, blacklist)) + return FALSE + if(AM.anchored) if(is_type_in_list(AM, ancwhitelist)) - return 1 - return 0 - return 1 + return TRUE + return FALSE + return TRUE /obj/tram/tram_controller/proc/init_controllers() for(var/obj/tram/controlpad/CCP in tram) diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index bdd8c2a9608..fc2ea3b4600 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -3,7 +3,7 @@ name = "vehicle" desc = "A basic vehicle, vroom" icon = 'icons/obj/vehicles.dmi' - icon_state = "fuckyou" + icon_state = "scooter" density = 1 anchored = 0 can_buckle = 1 diff --git a/code/modules/vr/vr_goggles.dm b/code/modules/vr/vr_goggles.dm index c2a185b0ffa..f2df5d2189e 100644 --- a/code/modules/vr/vr_goggles.dm +++ b/code/modules/vr/vr_goggles.dm @@ -7,7 +7,7 @@ icon_state = "3d" item_state = "3d" prescription_upgradable = 0 - species_fit = list("Vox") + sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi' ) diff --git a/config/example/config.txt b/config/example/config.txt index 6e54e2af1f6..87ed0ce5cf1 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -46,6 +46,9 @@ LOG_SAY ## log admin actions LOG_ADMIN +## log debug messages +LOG_DEBUG + ## log admin chat LOG_ADMINCHAT @@ -182,6 +185,28 @@ GUEST_JOBBAN ## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) GUEST_BAN +### IPINTEL: +### This allows you to detect likely proxies by checking ips against getipintel.net +## Rating to warn at: (0.90 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning +#IPINTEL_RATING_BAD 0.90 +## Contact email, (required to use the service, leaving blank or default disables IPINTEL) +#IPINTEL_EMAIL ch@nge.me +## How long to save good matches (ipintel rate limits to 15 per minute and 500 per day. so this shouldn't be too low, getipintel.net suggests 6 hours, time is in hours) (Your ip will get banned if you go over 500 a day too many times) +#IPINTEL_SAVE_GOOD 72 +## How long to save bad matches (these numbers can change as ips change hands, best not to save these for too long in case somebody gets a new ip used by a spammer/proxy before.) +#IPINTEL_SAVE_BAD 24 +## Domain name to query (leave commented out for the default, only needed if you pay getipintel.net for more querys) +#IPINTEL_DOMAIN check.getipintel.net +## Ignore players with this many hours of playtime. Requires USE_EXP_TRACKING +#IPINTEL_MAXPLAYTIME 10 +## Require players (except the previous ones with playtime, if enabled) to be whitelisted to use proxies/VPNs. +#IPINTEL_WHITELIST +## URL to show to admins to provide more information about an IP address. Leave undefined for default. +#IPINTEL_DETAILSURL https://iphub.info/?ip= + +## URL to use to link forum accounts. If not set, no link option will be offered. +#FORUM_LINK_URL https://example.com/link.php?token= + ## Comment to disable checking for the cid randomizer dll. (disabled if database isn't enabled or connected) CHECK_RANDOMIZER diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt index 6ca1f0201e8..8b411db15e1 100644 --- a/config/example/dbconfig.txt +++ b/config/example/dbconfig.txt @@ -9,7 +9,7 @@ ## This value must be set to the version of the paradise schema in use. ## If this value does not match, the SQL database will not be loaded and an error will be generated. ## Roundstart will be delayed. -DB_VERSION 5 +DB_VERSION 6 ## Server the MySQL database can be found at. # Examples: localhost, 200.135.5.43, www.mysqldb.com, etc. diff --git a/config/example/game_options.txt b/config/example/game_options.txt index f934ba87b2b..31ee950243a 100644 --- a/config/example/game_options.txt +++ b/config/example/game_options.txt @@ -65,4 +65,11 @@ DEFAULT_LAWS 1 RANDOMIZE_SHIFT_TIME ## Enable Nightshift - Causes the station to go into "night mode" from 19:30 to 07:30. Best used with RANDOMIZED_SHIFT_TIME. -ENABLE_NIGHT_SHIFTS \ No newline at end of file +ENABLE_NIGHT_SHIFTS + +## Lavaland "Budget" +# Lavaland ruin spawning has an imaginary budget to spend on ruins, where +# a less lootfilled or smaller or less round effecting ruin costs less to +# spawn, while the converse is true. Alter this number to affect the amount +# of ruins. +LAVALAND_BUDGET 60 \ No newline at end of file diff --git a/config/example/lavaRuinBlacklist.txt b/config/example/lavaRuinBlacklist.txt new file mode 100644 index 00000000000..ee3f0245a07 --- /dev/null +++ b/config/example/lavaRuinBlacklist.txt @@ -0,0 +1,24 @@ +#Listing maps here will blacklist them from generating in lavaland. +#Maps must be the full path to them +#A list of maps valid to blacklist can be found in _maps\RandomRuins\LavaRuins +#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START + +##BIODOMES +#_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm + +##RESPAWN +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm + +##SIN + + +##MISC +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm +#_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm index 28a2690b5f6..3456e0a2ce9 100644 --- a/goon/code/datums/browserOutput.dm +++ b/goon/code/datums/browserOutput.dm @@ -149,7 +149,7 @@ var/list/chatResources = list( var/list/row = connectionHistory[i] if(!row || row.len < 3 || !(row["ckey"] && row["compid"] && row["ip"])) return - if(world.IsBanned(row["ckey"], row["compid"], row["ip"])) + if(world.IsBanned(row["ckey"], row["compid"], row["ip"], FALSE)) found = row break diff --git a/html/browser/common.css b/html/browser/common.css index 23b675f7fa2..3480183d129 100644 --- a/html/browser/common.css +++ b/html/browser/common.css @@ -345,4 +345,22 @@ div.notice -ms-interpolation-mode: nearest-neighbor; width: 64px; height:64px; -} \ No newline at end of file +} + +.typing:after +{ + overflow: hidden; + display: inline-block; + vertical-align: bottom; + animation: ellipsis steps(4,end) 900ms infinite; + content: "\2026"; + width: 0px; +} + +@keyframes ellipsis +{ + to + { + width: 1.25em; + } +} diff --git a/html/changelog.html b/html/changelog.html index 6ce02bc19c8..1d3eb4038b5 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,122 @@ -->
+ 10 May 2019+AffectedArc07 updated:+
Arkatos updated:+
Couls updated:+
Crazylemon and Fox McCloud updated:+
EvadableMoxie updated:+
Fox McCloud updated:+
Ionward updated:+
KasparoVy updated:+
Kyep updated:+
Markolie updated:+
Mitchs98 updated:+
TDSSS updated:+
Twinmold93 updated:+
farie82 updated:+
fludd12 updated:+
variableundefined updated:+
02 May 2019AffectedArc07 updated:
-
+
NTTC
diff --git a/icons/effects/160x160.dmi b/icons/effects/160x160.dmi
index 309a32e615d..3cf6d397449 100644
Binary files a/icons/effects/160x160.dmi and b/icons/effects/160x160.dmi differ
diff --git a/icons/effects/64x64.dmi b/icons/effects/64x64.dmi
new file mode 100644
index 00000000000..d5d0b8df0e6
Binary files /dev/null and b/icons/effects/64x64.dmi differ
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index a5195cc0167..95e9747f878 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/icons/effects/bleed.dmi b/icons/effects/bleed.dmi
new file mode 100644
index 00000000000..d563334f632
Binary files /dev/null and b/icons/effects/bleed.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 9a8d69a66bd..26526f68951 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi
new file mode 100644
index 00000000000..821338058ce
Binary files /dev/null and b/icons/effects/mapping_helpers.dmi differ
diff --git a/icons/goonstation/objects/fitness.dmi b/icons/goonstation/objects/fitness.dmi
new file mode 100644
index 00000000000..e2675cbda49
Binary files /dev/null and b/icons/goonstation/objects/fitness.dmi differ
diff --git a/icons/misc/beach.dmi b/icons/misc/beach.dmi
index 330bb8dddb4..aa846e1c60a 100644
Binary files a/icons/misc/beach.dmi and b/icons/misc/beach.dmi differ
diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi
index 7bc556c628c..ea66e024a19 100644
Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ
diff --git a/icons/mob/alienqueen.dmi b/icons/mob/alienqueen.dmi
index b01af7e71b4..5d09aad2480 100644
Binary files a/icons/mob/alienqueen.dmi and b/icons/mob/alienqueen.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 1e321d40058..26cc4faf2ee 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index fff645f8f12..c58a6b635f4 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 0cfc59b0553..a1e80aa5e65 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index 7fa7b78561d..fcfef35c38b 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 4cdf9b38920..409cf04e862 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi
new file mode 100644
index 00000000000..69b9922f140
Binary files /dev/null and b/icons/mob/inhands/64x64_lefthand.dmi differ
diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi
new file mode 100644
index 00000000000..09cef64e2b0
Binary files /dev/null and b/icons/mob/inhands/64x64_righthand.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 06b2934ebde..11a962c579d 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index 3a558b90140..bda8c4a8e00 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/custodial_lefthand.dmi b/icons/mob/inhands/equipment/custodial_lefthand.dmi
new file mode 100644
index 00000000000..a707c315cfa
Binary files /dev/null and b/icons/mob/inhands/equipment/custodial_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/custodial_righthand.dmi b/icons/mob/inhands/equipment/custodial_righthand.dmi
new file mode 100644
index 00000000000..f42d427a82d
Binary files /dev/null and b/icons/mob/inhands/equipment/custodial_righthand.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 35bd70efd28..ae285a5453a 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 0f2b8b0996d..8b949a8e732 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi
index 8cf32385df3..27f09173518 100644
Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ
diff --git a/icons/mob/lavaland/watcher.dmi b/icons/mob/lavaland/watcher.dmi
index 23960478b39..a357e82a13f 100644
Binary files a/icons/mob/lavaland/watcher.dmi and b/icons/mob/lavaland/watcher.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index 9605302e11f..08aca040280 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/mob/radial.dmi b/icons/mob/radial.dmi
index ba3179a4214..3951523ebc1 100644
Binary files a/icons/mob/radial.dmi and b/icons/mob/radial.dmi differ
diff --git a/icons/mob/species/drask/head.dmi b/icons/mob/species/drask/head.dmi
index 41bf78cc8c6..fadfc1ed68d 100644
Binary files a/icons/mob/species/drask/head.dmi and b/icons/mob/species/drask/head.dmi differ
diff --git a/icons/mob/species/drask/mask.dmi b/icons/mob/species/drask/mask.dmi
index c1357c43144..dffedfb1c78 100644
Binary files a/icons/mob/species/drask/mask.dmi and b/icons/mob/species/drask/mask.dmi differ
diff --git a/icons/mob/species/drask/suit.dmi b/icons/mob/species/drask/suit.dmi
index 697c3888f77..a5fa1e95a3c 100644
Binary files a/icons/mob/species/drask/suit.dmi and b/icons/mob/species/drask/suit.dmi differ
diff --git a/icons/mob/species/grey/head.dmi b/icons/mob/species/grey/head.dmi
index e24367a10e2..201e1032562 100644
Binary files a/icons/mob/species/grey/head.dmi and b/icons/mob/species/grey/head.dmi differ
diff --git a/icons/mob/species/grey/mask.dmi b/icons/mob/species/grey/mask.dmi
index 1225b1e68ad..112895a6009 100644
Binary files a/icons/mob/species/grey/mask.dmi and b/icons/mob/species/grey/mask.dmi differ
diff --git a/icons/mob/species/plasmaman/helmet.dmi b/icons/mob/species/plasmaman/helmet.dmi
index 188db97e788..bd5465857d8 100644
Binary files a/icons/mob/species/plasmaman/helmet.dmi and b/icons/mob/species/plasmaman/helmet.dmi differ
diff --git a/icons/mob/species/plasmaman/mask.dmi b/icons/mob/species/plasmaman/mask.dmi
new file mode 100644
index 00000000000..1acdc5e581f
Binary files /dev/null and b/icons/mob/species/plasmaman/mask.dmi differ
diff --git a/icons/mob/species/plasmaman/suit.dmi b/icons/mob/species/plasmaman/suit.dmi
index 42832013f85..c4d1a7a2b3c 100644
Binary files a/icons/mob/species/plasmaman/suit.dmi and b/icons/mob/species/plasmaman/suit.dmi differ
diff --git a/icons/mob/species/skrell/head.dmi b/icons/mob/species/skrell/head.dmi
new file mode 100644
index 00000000000..ec5e8dd62e4
Binary files /dev/null and b/icons/mob/species/skrell/head.dmi differ
diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi
index 8cb76c80b75..3b2c1891c07 100644
Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ
diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi
index 1b7299cc8fb..bcc02304de0 100644
Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ
diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi
index a4218e5af40..5274697cdc1 100644
Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index 6e2c3d9836d..3c372768f16 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi
index fb0c9962a07..7d9f2999e27 100644
Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ
diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi
index 971978ccff4..b836b78538f 100644
Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 3af770d719a..0716073b931 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi
index 8f7f7f103c2..43b527266b8 100644
Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ
diff --git a/icons/mob/species/vulpkanin/suit.dmi b/icons/mob/species/vulpkanin/suit.dmi
index 61d5e4b3b67..751ecf7626d 100644
Binary files a/icons/mob/species/vulpkanin/suit.dmi and b/icons/mob/species/vulpkanin/suit.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 44626a67680..f79ca1fb338 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi
index 5a3595f7baf..e434cdd94ae 100644
Binary files a/icons/mob/swarmer.dmi and b/icons/mob/swarmer.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index b7d3b243994..bbb986c088e 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index ce2c967de4f..e5102b7eee9 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 4445b3c3bb0..58e078b223c 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 418f221c78f..1bfe41618c4 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 0b4635317d8..f158b1df20d 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 14a173785ed..b008f3139cc 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/hats.dmi b/icons/obj/clothing/species/plasmaman/hats.dmi
index 1d85d184ad1..fc76e521d55 100644
Binary files a/icons/obj/clothing/species/plasmaman/hats.dmi and b/icons/obj/clothing/species/plasmaman/hats.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/suits.dmi b/icons/obj/clothing/species/plasmaman/suits.dmi
index 43d69f5fa82..78ddd94dedb 100644
Binary files a/icons/obj/clothing/species/plasmaman/suits.dmi and b/icons/obj/clothing/species/plasmaman/suits.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 4308626cdca..8e5a4b8e879 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index 1b9ca75d1a7..4799e9ad963 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 36ae38d9250..c39331ce8d4 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi
index 98da468fc56..7351c8c7483 100644
Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 1fd9c1565be..ebabdcf2ef5 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 3b1c4c07cfa..f9e4f6bfbfc 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index b8bd2933bbc..0cfe6dc554c 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 2c3b244a41d..b39c3668294 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi
index 45927256e35..a0486389b74 100644
Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index 29d4e1faea9..f57c6ded447 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index a7146793675..f8943c2c39b 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/icons/obj/smooth_structures/catwalk.dmi b/icons/obj/smooth_structures/catwalk.dmi
index c9bcbc04b93..4b71fb50731 100644
Binary files a/icons/obj/smooth_structures/catwalk.dmi and b/icons/obj/smooth_structures/catwalk.dmi differ
diff --git a/icons/obj/smooth_structures/lattice.dmi b/icons/obj/smooth_structures/lattice.dmi
index ad676cc2835..5adab0caf1b 100644
Binary files a/icons/obj/smooth_structures/lattice.dmi and b/icons/obj/smooth_structures/lattice.dmi differ
diff --git a/icons/obj/smooth_structures/swarmer_catwalk.dmi b/icons/obj/smooth_structures/swarmer_catwalk.dmi
new file mode 100644
index 00000000000..b247132eacb
Binary files /dev/null and b/icons/obj/smooth_structures/swarmer_catwalk.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index b2330c0f5b4..c9293cbb7a7 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index dfc7faf89df..f30ecfe94d1 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index e212d9c5882..5a976767f11 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 4d5fe2d875d..343e5d4c785 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index ccfa57790d9..17ebf4c9219 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index 66dbdc88c10..5be90269399 100755
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi
index e30d7888844..baa04328498 100644
Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ
diff --git a/icons/turf/boss_floors.dmi b/icons/turf/boss_floors.dmi
new file mode 100644
index 00000000000..a350967f7cf
Binary files /dev/null and b/icons/turf/boss_floors.dmi differ
diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi
new file mode 100644
index 00000000000..966afe0399b
Binary files /dev/null and b/icons/turf/decals.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index a269bc1930e..411f371af9b 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/icons/turf/floors/boss_floors.dmi b/icons/turf/floors/boss_floors.dmi
new file mode 100644
index 00000000000..a350967f7cf
Binary files /dev/null and b/icons/turf/floors/boss_floors.dmi differ
diff --git a/icons/turf/floors/lava.dmi b/icons/turf/floors/lava.dmi
index b2d9064ed2b..0f7b5d3fa15 100644
Binary files a/icons/turf/floors/lava.dmi and b/icons/turf/floors/lava.dmi differ
diff --git a/icons/turf/floors/plating.dmi b/icons/turf/floors/plating.dmi
index c765195aff6..a1fe3dc4e6f 100644
Binary files a/icons/turf/floors/plating.dmi and b/icons/turf/floors/plating.dmi differ
diff --git a/icons/turf/mining.dmi b/icons/turf/mining.dmi
index d36db34304b..9621ef05d5c 100644
Binary files a/icons/turf/mining.dmi and b/icons/turf/mining.dmi differ
diff --git a/icons/turf/smoothrocks.dmi b/icons/turf/smoothrocks.dmi
new file mode 100644
index 00000000000..ba2bbce9551
Binary files /dev/null and b/icons/turf/smoothrocks.dmi differ
diff --git a/icons/turf/snow.dmi b/icons/turf/snow.dmi
index 62f32b6e45b..d71431f99ad 100644
Binary files a/icons/turf/snow.dmi and b/icons/turf/snow.dmi differ
diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi
index cc0ca3a0eab..36670222559 100644
Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ
diff --git a/icons/turf/walls/boss_wall.dmi b/icons/turf/walls/boss_wall.dmi
new file mode 100644
index 00000000000..a197aac8ce3
Binary files /dev/null and b/icons/turf/walls/boss_wall.dmi differ
diff --git a/icons/turf/walls/rock_wall.dmi b/icons/turf/walls/rock_wall.dmi
new file mode 100644
index 00000000000..c07657149ac
Binary files /dev/null and b/icons/turf/walls/rock_wall.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 7a8eadca405..8c846be4546 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -17,6 +17,7 @@
#include "code\world.dm"
#include "code\__DEFINES\_globals.dm"
#include "code\__DEFINES\_readme.dm"
+#include "code\__DEFINES\_tick.dm"
#include "code\__DEFINES\admin.dm"
#include "code\__DEFINES\antagonists.dm"
#include "code\__DEFINES\atmospherics.dm"
@@ -43,13 +44,13 @@
#include "code\__DEFINES\machines.dm"
#include "code\__DEFINES\math.dm"
#include "code\__DEFINES\MC.dm"
+#include "code\__DEFINES\medal.dm"
#include "code\__DEFINES\misc.dm"
#include "code\__DEFINES\mobs.dm"
#include "code\__DEFINES\move_force.dm"
#include "code\__DEFINES\pda.dm"
#include "code\__DEFINES\pipes.dm"
#include "code\__DEFINES\preferences.dm"
-#include "code\__DEFINES\process_scheduler.dm"
#include "code\__DEFINES\qdel.dm"
#include "code\__DEFINES\radio.dm"
#include "code\__DEFINES\reagents.dm"
@@ -62,7 +63,6 @@
#include "code\__DEFINES\station_goals.dm"
#include "code\__DEFINES\status_effects.dm"
#include "code\__DEFINES\subsystems.dm"
-#include "code\__DEFINES\tick.dm"
#include "code\__DEFINES\typeids.dm"
#include "code\__DEFINES\vv.dm"
#include "code\__DEFINES\zlevel.dm"
@@ -103,7 +103,6 @@
#include "code\_globalvars\logging.dm"
#include "code\_globalvars\mapping.dm"
#include "code\_globalvars\misc.dm"
-#include "code\_globalvars\station.dm"
#include "code\_globalvars\unused.dm"
#include "code\_globalvars\lists\flavor_misc.dm"
#include "code\_globalvars\lists\fortunes.dm"
@@ -198,9 +197,6 @@
#include "code\controllers\master.dm"
#include "code\controllers\subsystem.dm"
#include "code\controllers\verbs.dm"
-#include "code\controllers\Processes\ticker.dm"
-#include "code\controllers\ProcessScheduler\core\process.dm"
-#include "code\controllers\ProcessScheduler\core\processScheduler.dm"
#include "code\controllers\subsystem\air.dm"
#include "code\controllers\subsystem\alarm.dm"
#include "code\controllers\subsystem\assets.dm"
@@ -211,10 +207,12 @@
#include "code\controllers\subsystem\holiday.dm"
#include "code\controllers\subsystem\icon_smooth.dm"
#include "code\controllers\subsystem\idlenpcpool.dm"
+#include "code\controllers\subsystem\ipintel.dm"
#include "code\controllers\subsystem\jobs.dm"
#include "code\controllers\subsystem\lighting.dm"
#include "code\controllers\subsystem\machinery.dm"
#include "code\controllers\subsystem\mapping.dm"
+#include "code\controllers\subsystem\medals.dm"
#include "code\controllers\subsystem\mobs.dm"
#include "code\controllers\subsystem\nano_mob_hunter.dm"
#include "code\controllers\subsystem\nanoui.dm"
@@ -226,6 +224,7 @@
#include "code\controllers\subsystem\spacedrift.dm"
#include "code\controllers\subsystem\sun.dm"
#include "code\controllers\subsystem\throwing.dm"
+#include "code\controllers\subsystem\ticker.dm"
#include "code\controllers\subsystem\timer.dm"
#include "code\controllers\subsystem\vote.dm"
#include "code\controllers\subsystem\weather.dm"
@@ -271,6 +270,7 @@
#include "code\datums\cache\crew.dm"
#include "code\datums\cache\powermonitor.dm"
#include "code\datums\components\_component.dm"
+#include "code\datums\components\decal.dm"
#include "code\datums\components\ducttape.dm"
#include "code\datums\components\jestosterone.dm"
#include "code\datums\components\material_container.dm"
@@ -336,6 +336,7 @@
#include "code\datums\helper_datums\global_iterator.dm"
#include "code\datums\helper_datums\hotkey_modes.dm"
#include "code\datums\helper_datums\icon_snapshot.dm"
+#include "code\datums\helper_datums\input.dm"
#include "code\datums\helper_datums\map_template.dm"
#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\helper_datums\topic_input.dm"
@@ -345,6 +346,7 @@
#include "code\datums\looping_sounds\weather.dm"
#include "code\datums\outfits\outfit.dm"
#include "code\datums\outfits\outfit_admin.dm"
+#include "code\datums\ruins\lavaland.dm"
#include "code\datums\ruins\space.dm"
#include "code\datums\spells\area_teleport.dm"
#include "code\datums\spells\bloodcrawl.dm"
@@ -426,9 +428,11 @@
#include "code\game\world.dm"
#include "code\game\area\ai_monitored.dm"
#include "code\game\area\areas.dm"
-#include "code\game\area\depot-areas.dm"
#include "code\game\area\Dynamic areas.dm"
#include "code\game\area\Space Station 13 areas.dm"
+#include "code\game\area\areas\depot-areas.dm"
+#include "code\game\area\areas\mining.dm"
+#include "code\game\area\areas\ruins\lavaland.dm"
#include "code\game\dna\dna2.dm"
#include "code\game\dna\dna2_domutcheck.dm"
#include "code\game\dna\dna2_helpers.dm"
@@ -443,7 +447,6 @@
#include "code\game\dna\genes\vg_powers.dm"
#include "code\game\gamemodes\factions.dm"
#include "code\game\gamemodes\game_mode.dm"
-#include "code\game\gamemodes\gameticker.dm"
#include "code\game\gamemodes\intercept_report.dm"
#include "code\game\gamemodes\objective.dm"
#include "code\game\gamemodes\scoreboard.dm"
@@ -771,6 +774,7 @@
#include "code\game\objects\effects\glowshroom.dm"
#include "code\game\objects\effects\landmarks.dm"
#include "code\game\objects\effects\manifest.dm"
+#include "code\game\objects\effects\mapping_helpers.dm"
#include "code\game\objects\effects\mines.dm"
#include "code\game\objects\effects\misc.dm"
#include "code\game\objects\effects\overlays.dm"
@@ -781,6 +785,7 @@
#include "code\game\objects\effects\decals\cleanable.dm"
#include "code\game\objects\effects\decals\contraband.dm"
#include "code\game\objects\effects\decals\crayon.dm"
+#include "code\game\objects\effects\decals\decal.dm"
#include "code\game\objects\effects\decals\misc.dm"
#include "code\game\objects\effects\decals\remains.dm"
#include "code\game\objects\effects\decals\warning_stripes.dm"
@@ -790,6 +795,10 @@
#include "code\game\objects\effects\decals\Cleanable\misc.dm"
#include "code\game\objects\effects\decals\Cleanable\robots.dm"
#include "code\game\objects\effects\decals\Cleanable\tracks.dm"
+#include "code\game\objects\effects\decals\turfdecals\dirt.dm"
+#include "code\game\objects\effects\decals\turfdecals\markings.dm"
+#include "code\game\objects\effects\decals\turfdecals\tilecoloring.dm"
+#include "code\game\objects\effects\decals\turfdecals\weather.dm"
#include "code\game\objects\effects\effect_system\effect_system.dm"
#include "code\game\objects\effects\effect_system\effects_chem_smoke.dm"
#include "code\game\objects\effects\effect_system\effects_explosion.dm"
@@ -1018,6 +1027,7 @@
#include "code\game\objects\structures\extinguisher.dm"
#include "code\game\objects\structures\false_walls.dm"
#include "code\game\objects\structures\flora.dm"
+#include "code\game\objects\structures\fluff.dm"
#include "code\game\objects\structures\foodcart.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
@@ -1094,12 +1104,19 @@
#include "code\game\turfs\turf.dm"
#include "code\game\turfs\unsimulated.dm"
#include "code\game\turfs\simulated\floor.dm"
+#include "code\game\turfs\simulated\minerals.dm"
+#include "code\game\turfs\simulated\river.dm"
#include "code\game\turfs\simulated\shuttle.dm"
#include "code\game\turfs\simulated\walls.dm"
+#include "code\game\turfs\simulated\walls_indestructible.dm"
#include "code\game\turfs\simulated\walls_mineral.dm"
#include "code\game\turfs\simulated\walls_misc.dm"
#include "code\game\turfs\simulated\walls_reinforced.dm"
+#include "code\game\turfs\simulated\floor\asteroid.dm"
+#include "code\game\turfs\simulated\floor\chasm.dm"
#include "code\game\turfs\simulated\floor\fancy_floor.dm"
+#include "code\game\turfs\simulated\floor\indestructible.dm"
+#include "code\game\turfs\simulated\floor\lava.dm"
#include "code\game\turfs\simulated\floor\light_floor.dm"
#include "code\game\turfs\simulated\floor\mineral.dm"
#include "code\game\turfs\simulated\floor\misc_floor.dm"
@@ -1131,6 +1148,7 @@
#include "code\modules\admin\create_poll.dm"
#include "code\modules\admin\create_turf.dm"
#include "code\modules\admin\holder2.dm"
+#include "code\modules\admin\ipintel.dm"
#include "code\modules\admin\IsBanned.dm"
#include "code\modules\admin\machine_upgrade.dm"
#include "code\modules\admin\NewBan.dm"
@@ -1298,6 +1316,7 @@
#include "code\modules\client\preference\loadout\loadout_shoes.dm"
#include "code\modules\client\preference\loadout\loadout_suit.dm"
#include "code\modules\client\preference\loadout\loadout_uniform.dm"
+#include "code\modules\clothing\chameleon.dm"
#include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\ears\ears.dm"
#include "code\modules\clothing\glasses\glasses.dm"
@@ -1359,7 +1378,6 @@
#include "code\modules\clothing\suits\storage.dm"
#include "code\modules\clothing\suits\utility.dm"
#include "code\modules\clothing\suits\wiz_robe.dm"
-#include "code\modules\clothing\under\chameleon.dm"
#include "code\modules\clothing\under\color.dm"
#include "code\modules\clothing\under\miscellaneous.dm"
#include "code\modules\clothing\under\oldstation_uni.dm"
@@ -1384,8 +1402,6 @@
#include "code\modules\detective_work\evidence.dm"
#include "code\modules\detective_work\footprints_and_rag.dm"
#include "code\modules\detective_work\scanner.dm"
-#include "code\modules\discord\accountlink.dm"
-#include "code\modules\discord\notify.dm"
#include "code\modules\economy\Accounts.dm"
#include "code\modules\economy\Accounts_DB.dm"
#include "code\modules\economy\ATM.dm"
@@ -1577,6 +1593,7 @@
#include "code\modules\library\lib_items.dm"
#include "code\modules\library\lib_machines.dm"
#include "code\modules\library\lib_readme.dm"
+#include "code\modules\library\random_books.dm"
#include "code\modules\library\computers\base.dm"
#include "code\modules\library\computers\checkout.dm"
#include "code\modules\library\computers\public.dm"
@@ -1608,19 +1625,19 @@
#include "code\modules\mining\abandonedcrates.dm"
#include "code\modules\mining\coins.dm"
#include "code\modules\mining\equipment_locker.dm"
+#include "code\modules\mining\explorer_gear.dm"
#include "code\modules\mining\machine_processing.dm"
#include "code\modules\mining\machine_stacking.dm"
#include "code\modules\mining\machine_unloading.dm"
-#include "code\modules\mining\mine_areas.dm"
#include "code\modules\mining\mine_items.dm"
-#include "code\modules\mining\mine_turfs.dm"
#include "code\modules\mining\minebot.dm"
#include "code\modules\mining\mint.dm"
#include "code\modules\mining\money_bag.dm"
#include "code\modules\mining\ore.dm"
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\shelters.dm"
-#include "code\modules\mining\laborcamp\laborminerals.dm"
+#include "code\modules\mining\equipment\marker_beacons.dm"
+#include "code\modules\mining\equipment\survival_pod.dm"
#include "code\modules\mining\laborcamp\laborshuttle.dm"
#include "code\modules\mining\laborcamp\laborstacker.dm"
#include "code\modules\mining\lavaland\ash_flora.dm"
@@ -1894,7 +1911,6 @@
#include "code\modules\mob\living\simple_animal\hostile\jungle_animals.dm"
#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm"
#include "code\modules\mob\living\simple_animal\hostile\mimic.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs.dm"
#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm"
#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
#include "code\modules\mob\living\simple_animal\hostile\russian.dm"
@@ -1904,14 +1920,21 @@
#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm"
#include "code\modules\mob\living\simple_animal\hostile\winter_mobs.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm"
-#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining\basilisk.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining\goldgrub.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining\goliath.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining\gutlunch.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining\hivelord.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining\mining.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining\necropolis_tendril.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\fish.dm"
@@ -2094,7 +2117,6 @@
#include "code\modules\power\cable_heavyduty.dm"
#include "code\modules\power\cable_logic.dm"
#include "code\modules\power\cell.dm"
-#include "code\modules\power\engine.dm"
#include "code\modules\power\generator.dm"
#include "code\modules\power\gravitygenerator.dm"
#include "code\modules\power\lighting.dm"
@@ -2270,6 +2292,13 @@
#include "code\modules\response_team\ert.dm"
#include "code\modules\response_team\ert_outfits.dm"
#include "code\modules\ruins\ruin_areas.dm"
+#include "code\modules\ruins\lavalandruin_code\animal_hospital.dm"
+#include "code\modules\ruins\lavalandruin_code\ash_walker_den.dm"
+#include "code\modules\ruins\lavalandruin_code\hermit.dm"
+#include "code\modules\ruins\lavalandruin_code\seed_vault.dm"
+#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm"
+#include "code\modules\ruins\objects_and_mobs\gym.dm"
+#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm"
#include "code\modules\security_levels\keycard authentication.dm"
#include "code\modules\security_levels\security levels.dm"
#include "code\modules\shuttle\assault_pod.dm"
diff --git a/sound/ambience/ambidanger.ogg b/sound/ambience/ambidanger.ogg
new file mode 100644
index 00000000000..265b51f2c9b
Binary files /dev/null and b/sound/ambience/ambidanger.ogg differ
diff --git a/sound/ambience/ambidanger2.ogg b/sound/ambience/ambidanger2.ogg
new file mode 100644
index 00000000000..761c63a4809
Binary files /dev/null and b/sound/ambience/ambidanger2.ogg differ
diff --git a/sound/ambience/ambilava.ogg b/sound/ambience/ambilava.ogg
new file mode 100644
index 00000000000..b552965faac
Binary files /dev/null and b/sound/ambience/ambilava.ogg differ
diff --git a/sound/creatures/legion_death.ogg b/sound/creatures/legion_death.ogg
new file mode 100644
index 00000000000..fdcf9c8a659
Binary files /dev/null and b/sound/creatures/legion_death.ogg differ
diff --git a/sound/creatures/legion_death_far.ogg b/sound/creatures/legion_death_far.ogg
new file mode 100644
index 00000000000..3e3261687c3
Binary files /dev/null and b/sound/creatures/legion_death_far.ogg differ
diff --git a/sound/creatures/legion_spawn.ogg b/sound/creatures/legion_spawn.ogg
new file mode 100644
index 00000000000..9fce6dec4c6
Binary files /dev/null and b/sound/creatures/legion_spawn.ogg differ
diff --git a/sound/effects/bin_close.ogg b/sound/effects/bin_close.ogg
new file mode 100644
index 00000000000..aef7b0cd886
Binary files /dev/null and b/sound/effects/bin_close.ogg differ
diff --git a/sound/effects/pressureplate.ogg b/sound/effects/pressureplate.ogg
new file mode 100644
index 00000000000..aff7d198b5a
Binary files /dev/null and b/sound/effects/pressureplate.ogg differ
diff --git a/sound/effects/tendril_destroyed.ogg b/sound/effects/tendril_destroyed.ogg
new file mode 100644
index 00000000000..449db1a381f
Binary files /dev/null and b/sound/effects/tendril_destroyed.ogg differ
diff --git a/sound/goonstation/effects/spring.ogg b/sound/goonstation/effects/spring.ogg
new file mode 100644
index 00000000000..472a75e304b
Binary files /dev/null and b/sound/goonstation/effects/spring.ogg differ
diff --git a/sound/magic/clockwork/invoke_general.ogg b/sound/magic/clockwork/invoke_general.ogg
new file mode 100644
index 00000000000..6f0c0dd097a
Binary files /dev/null and b/sound/magic/clockwork/invoke_general.ogg differ
diff --git a/sound/magic/demon_consume.ogg b/sound/magic/demon_consume.ogg
new file mode 100644
index 00000000000..ef9276e74c0
Binary files /dev/null and b/sound/magic/demon_consume.ogg differ
diff --git a/sound/magic/fellowship_armory.ogg b/sound/magic/fellowship_armory.ogg
new file mode 100644
index 00000000000..c108d4621c6
Binary files /dev/null and b/sound/magic/fellowship_armory.ogg differ
diff --git a/tools/Runtime Condenser/Input.txt b/tools/Runtime Condenser/Input.txt
index 1224868e1ea..282fc5f3bf3 100644
--- a/tools/Runtime Condenser/Input.txt
+++ b/tools/Runtime Condenser/Input.txt
@@ -1410,7 +1410,7 @@ proc name: throw at (/atom/movable/proc/throw_at)
usr: Reese Marcotte (/mob/living/carbon/human)
src: Reese Marcotte (/mob/living/carbon/human)
call stack:
-Reese Marcotte (/mob/living/carbon/human): throw at(Asteroid (174,85,5) (/turf/simulated/floor/plating/airless/asteroid), 5, 1)
+Reese Marcotte (/mob/living/carbon/human): throw at(Asteroid (174,85,5) (/turf/simulated/floor/plating/asteroid/airless), 5, 1)
Delivery chute (/obj/machinery/disposal/deliveryChute): expel(null)
Rebooted server.
Running TG Revision Number: 4060.
|