diff --git a/code/_helpers/names.dm b/code/_helpers/names.dm index 20f7b2b31d..e85a607417 100644 --- a/code/_helpers/names.dm +++ b/code/_helpers/names.dm @@ -172,7 +172,7 @@ var/syndicate_code_response//Code response for traitors. var/safety[] = list(1,2,3)//Tells the proc which options to remove later on. var/nouns[] = list("love","hate","anger","peace","pride","sympathy","bravery","loyalty","honesty","integrity","compassion","charity","success","courage","deceit","skill","beauty","brilliance","pain","misery","beliefs","dreams","justice","truth","faith","liberty","knowledge","thought","information","culture","trust","dedication","progress","education","hospitality","leisure","trouble","friendships", "relaxation") - var/drinks[] = list("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequilla sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine") + var/drinks[] = list("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequilla sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","redwine","moonshine") var/locations[] = teleportlocs.len ? teleportlocs : drinks//if null, defaults to drinks instead. var/names[] = list() diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 65974fe009..9f7848b3d3 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -15,14 +15,13 @@ return FALSE // should stop you from dragging through windows return TRUE -/atom/MouseDrop(atom/over) - if(!usr || !over) return - if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows +/atom/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + if(!usr || !over) + return + if(!Adjacent(usr) || !over.Adjacent(usr)) + return // should stop you from dragging through windows - spawn(0) - over.MouseDrop_T(src,usr) - return + INVOKE_ASYNC(over, /atom/.proc/MouseDrop_T, src, usr, src_location, over_location, src_control, over_control, params) -// recieve a mousedrop -/atom/proc/MouseDrop_T(atom/dropping, mob/user) - return +/atom/proc/MouseDrop_T(atom/dropping, mob/user, src_location, over_location, src_control, over_control, params) + return \ No newline at end of file diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 6994973bfc..b54548cfc5 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -124,6 +124,7 @@ var/list/gamemode_cache = list() var/wikisearchurl var/forumurl var/githuburl + var/discordurl var/rulesurl var/mapurl @@ -541,6 +542,9 @@ var/list/gamemode_cache = list() if ("guest_jobban") config.guest_jobban = 1 + if ("discordurl") + config.discordurl = value + if ("guest_ban") config.guests_allowed = 0 @@ -1002,10 +1006,10 @@ var/list/gamemode_cache = list() if("use_loyalty_implants") config.use_loyalty_implants = 1 - + if("loadout_whitelist") config.loadout_whitelist = text2num(value) - + else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/datums/outfits/costumes/halloween.dm b/code/datums/outfits/costumes/halloween.dm index cca8047625..807c964a98 100644 --- a/code/datums/outfits/costumes/halloween.dm +++ b/code/datums/outfits/costumes/halloween.dm @@ -32,7 +32,7 @@ /decl/hierarchy/outfit/costume/horrorcop name = OUTFIT_COSTUME("Slasher Movie Cop") - uniform = /obj/item/clothing/under/pcrc{ starting_accessories=list(/obj/item/clothing/accessory/holster/hip) } + uniform = /obj/item/clothing/under/corp/pcrc{ starting_accessories=list(/obj/item/clothing/accessory/holster/hip) } shoes = /obj/item/clothing/shoes/black gloves = /obj/item/clothing/gloves/black glasses = /obj/item/clothing/glasses/fakesunglasses diff --git a/code/datums/outfits/jobs/science.dm b/code/datums/outfits/jobs/science.dm index 8920db9b7b..7f0853b41c 100644 --- a/code/datums/outfits/jobs/science.dm +++ b/code/datums/outfits/jobs/science.dm @@ -38,4 +38,5 @@ pda_slot = slot_r_store pda_type = /obj/item/device/pda/roboticist backpack = /obj/item/weapon/storage/backpack - satchel_one = /obj/item/weapon/storage/backpack/satchel/norm \ No newline at end of file + satchel_one = /obj/item/weapon/storage/backpack/satchel/norm + suit = /obj/item/clothing/suit/storage/toggle/labcoat/roboticist \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index de6600b194..2a765f34e5 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -454,7 +454,11 @@ src.germ_level = 0 if(istype(blood_DNA, /list)) blood_DNA = null - return 1 + return TRUE + +/atom/proc/on_rag_wipe(var/obj/item/weapon/reagent_containers/glass/rag/R) + clean_blood() + R.reagents.splash(src, 1) /atom/proc/get_global_map_pos() if(!islist(global_map) || isemptylist(global_map)) return diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index ed2869da1d..a2cbe7638b 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -56,7 +56,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() */ // Loop through all linked machines and send the signal or copy. for(var/obj/machinery/telecomms/machine in links) - if(filter && !istype( machine, text2path(filter) )) + if(filter && !istype(machine, filter)) continue if(!machine.on) continue @@ -288,9 +288,9 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() //Remove the level and then start adding levels that it is being broadcasted in. signal.data["level"] = list() - var/can_send = relay_information(signal, "/obj/machinery/telecomms/hub") // ideally relay the copied information to relays + var/can_send = relay_information(signal, /obj/machinery/telecomms/hub) // ideally relay the copied information to relays if(!can_send) - relay_information(signal, "/obj/machinery/telecomms/bus") // Send it to a bus instead, if it's linked to one + relay_information(signal, /obj/machinery/telecomms/bus) // Send it to a bus instead, if it's linked to one /obj/machinery/telecomms/receiver/proc/check_receive_level(datum/signal/signal) // If it's a direct message from a bluespace radio, we eat it and convert it into a subspace signal locally @@ -355,11 +355,11 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() if(is_freq_listening(signal)) if(istype(machine_from, /obj/machinery/telecomms/receiver)) //If the signal is compressed, send it to the bus. - relay_information(signal, "/obj/machinery/telecomms/bus", 1) // ideally relay the copied information to bus units + relay_information(signal, /obj/machinery/telecomms/bus, 1) // ideally relay the copied information to bus units else // Get a list of relays that we're linked to, then send the signal to their levels. - relay_information(signal, "/obj/machinery/telecomms/relay", 1) - relay_information(signal, "/obj/machinery/telecomms/broadcaster", 1) // Send it to a broadcaster. + relay_information(signal, /obj/machinery/telecomms/relay, 1) + relay_information(signal, /obj/machinery/telecomms/broadcaster, 1) // Send it to a broadcaster. /* @@ -457,7 +457,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() if(!istype(machine_from, /obj/machinery/telecomms/processor) && machine_from != src) // Signal must be ready (stupid assuming machine), let's send it // send to one linked processor unit - var/send_to_processor = relay_information(signal, "/obj/machinery/telecomms/processor") + var/send_to_processor = relay_information(signal, /obj/machinery/telecomms/processor) if(send_to_processor) return @@ -466,7 +466,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() src.receive_information(signal, src) // Try sending it! - var/list/try_send = list("/obj/machinery/telecomms/server", "/obj/machinery/telecomms/hub", "/obj/machinery/telecomms/broadcaster", "/obj/machinery/telecomms/bus") + var/list/try_send = list(/obj/machinery/telecomms/server, /obj/machinery/telecomms/hub, /obj/machinery/telecomms/broadcaster, /obj/machinery/telecomms/bus) var/i = 0 for(var/send in try_send) if(i) @@ -517,7 +517,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() relay_direct_information(signal, machine_from) // send the signal back to the machine else // no bus detected - send the signal to servers instead signal.data["slow"] += rand(5, 10) // slow the signal down - relay_information(signal, "/obj/machinery/telecomms/server") + relay_information(signal, /obj/machinery/telecomms/server) /* @@ -643,9 +643,9 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() if(Compiler && autoruncode) Compiler.Run(signal) // execute the code - var/can_send = relay_information(signal, "/obj/machinery/telecomms/hub") + var/can_send = relay_information(signal, /obj/machinery/telecomms/hub) if(!can_send) - relay_information(signal, "/obj/machinery/telecomms/broadcaster") + relay_information(signal, /obj/machinery/telecomms/broadcaster) /obj/machinery/telecomms/server/proc/setcode(var/t) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index e32d951a99..72af67faed 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -110,3 +110,10 @@ plane = PLANE_LIGHTING_ABOVE pixel_x = -32 pixel_y = -32 + +/obj/effect/overlay/closet_door + anchored = TRUE + plane = FLOAT_PLANE + layer = FLOAT_LAYER + vis_flags = VIS_INHERIT_ID + appearance_flags = KEEP_TOGETHER | LONG_GLIDE | PIXEL_SCALE \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 966a48141b..b70c46f54d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -84,7 +84,7 @@ // Works similarly to worn sprite_sheets, except the alternate sprites are used when the clothing/refit_for_species() proc is called. var/list/sprite_sheets_obj = list() - var/toolspeed = 1.0 // This is a multipler on how 'fast' a tool works. e.g. setting this to 0.5 will make the tool work twice as fast. + var/toolspeed = 1 // This is a multipler on how 'fast' a tool works. e.g. setting this to 0.5 will make the tool work twice as fast. var/attackspeed = DEFAULT_ATTACK_COOLDOWN // How long click delay will be when using this, in 1/10ths of a second. Checked in the user's get_attack_speed(). var/reach = 1 // Length of tiles it can reach, 1 is adjacent. var/addblends // Icon overlay for ADD highlights when applicable. @@ -347,9 +347,9 @@ if(user.pulling == src) user.stop_pulling() if((slot_flags & slot)) if(equip_sound) - playsound(src, equip_sound, 30) + playsound(src, equip_sound, 20) else - playsound(src, drop_sound, 30) + playsound(src, drop_sound, 20) else if(slot == slot_l_hand || slot == slot_r_hand) playsound(src, pickup_sound, 20, preference = /datum/client_preference/pickup_sounds) return @@ -925,4 +925,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. // Like the above, but used for RPED sorting of parts. /obj/item/proc/rped_rating() - return get_rating() \ No newline at end of file + return get_rating() + +// this gets called when the item gets chucked by the vending machine +/obj/item/proc/vendor_action(var/obj/machinery/vending/V) + return \ No newline at end of file diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 2c045e1e87..970613bc5b 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -26,6 +26,7 @@ closet_appearance = null open_sound = 'sound/items/zip.ogg' close_sound = 'sound/items/zip.ogg' + door_anim_time = 0 //Unsupported var/item_path = /obj/item/bodybag density = 0 storage_capacity = (MOB_MEDIUM * 2) - 1 diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 258fa02632..ad5e5c583f 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -16,7 +16,7 @@ var/obj/item/device/encryptionkey/keyslot2 = null var/ks1type = null var/ks2type = null - + drop_sound = 'sound/items/drop/component.ogg' pickup_sound = 'sound/items/pickup/component.ogg' @@ -62,10 +62,12 @@ /obj/item/device/radio/headset/receive_range(freq, level, aiOverride = 0) if (aiOverride) + playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds) return ..(freq, level) if(ishuman(src.loc)) var/mob/living/carbon/human/H = src.loc if(H.l_ear == src || H.r_ear == src) + playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds) return ..(freq, level) return -1 diff --git a/code/game/objects/items/magazine.dm b/code/game/objects/items/magazine.dm new file mode 100644 index 0000000000..59640c4c01 --- /dev/null +++ b/code/game/objects/items/magazine.dm @@ -0,0 +1,97 @@ +/obj/item/tabloid + name = "tabloid magazine" + desc = "It's one of those trashy tabloid magazines. It looks pretty out of date." + icon = 'icons/obj/magazine.dmi' + icon_state = "magazine" + + var/headline + var/static/list/tabloid_states = icon_states('icons/obj/magazine.dmi') + var/static/list/tabloid_publishers = list( + "\improper Solar Enquirer", + "\improper Stellar Examiner", + "\improper Antares Daily", + "\improper Weekly Galactic News", + "\improper Spiral" + ) + + var/static/list/tabloid_headlines = list( + "NARCOALGORITHMS: ARE YOUR CHILDREN SAFE?", + "ARE GMO HUMANS POISONOUS IN BED?", + "TOP 10 REASONS WHY OTHER SPECIES ARE A HOAX", + "CENTENNIAL POSITRONIC EXTENDS LIFESPAN WITH 1 SIMPLE TRICK", + "TOP 10 DANGEROUS FOODS WITH CHEMICALS", + "NEW TERRIFYING TEEN TREND: SUN-DIVING", + "HAS YOUR SPOUSE BEEN REPLACED BY AN ALIEN IMPOSTER? STUDIES SUGGEST YES!", + "SPACE CAUSES CANCER: DOCTORS CONFIRM", + "ARE BODY SCANNERS TOO INVASIVE? FIND OUT INSIDE!", + "HAS SCIENCE GONE TOO FAR? LOCAL SCIENTIST DEBUNKS ALIEN THEORY, DECRIES THEM AS TUBE EXPERIMENTS GONE WRONG", + "100 DELICIOUS RECIPES LETHAL TO CARBON-BASED LIFE", + "TOP FIVE SPECIES WE DROVE TO EXTINCTION; NUMBER TWO WILL SHOCK YOU", + "LOCAL MAN HAS SEIZURE AFTER SAYING SKRELLIAN NAME; FORCED ASSIMILATION SOON?", + "RELIGION WAS RIGHT? SHOCK FINDINGS SHOW ALIEN SIMILARITY TO ANIMALS, EXISTENCE OF BOATS", + "TOP TEN REASONS WHY ONLY HUMANS ARE SENTIENT", + "LOCAL UNATHI SYMPATHIZER: 'I really think you should stop with these spacebaiting articles.'", + "DO UNATHI SYMPATHIZERS HATE THE HUMAN RACE?", + "WHICH PLANET HAS THE BEST LOVERS? THIS AND MORE INSIDE!", + "SHE SAID WE SHOULD SEE OTHER PEOPLE, SO I MARRIED A TESHARI PACK: FULL STORY INSIDE", + "LOSE WEIGHT THREE TIMES FASTER WITH THESE LOW-G MANEUVERS!", + "SHOCKING FIGURES REVEAL MORE TEENS DIE TO UNATHI HONOUR DUELS THAN GUN VIOLENCE", + "MY DAUGHTER JOINED A NEURAL COLLECTIVE AND NOW SHE CAN TASTE SPACETIME: FULL STORY INSIDE", + "WERE THE NAZIS PSYCHIC? ONE HISTORIAN TELLS ALL", + "TAJARANS: CUTE AND CUDDLY, OR INFILTRATING THE GOVERNMENT? FIND OUT MORE INSIDE", + "IS THE SOLAR GOVERNMENT CREATING AN AI SUPERINTELLIGENCE NEAR MERCURY? ONE EXPERT REVEALS SHOCKING INSIDER DETAILS!", + "TOP TEN HISTORICAL FIGURES THAT WERE TWO PROMETHEANS IN A TRENCHCOAT", + "ZADDAT: FACT OR FICTION?", + "TOP 10 SECRET AUGMENTS THE GOVERNMENT DOESN'T WANT YOU TO GET", + "ENLARGE YOUR MENTAL FACULTIES WITH THIS 1 WEIRD HAT", + "'HELP, MY SON THINKS HE'S A 20TH CENTURY VID CHARACTER CALLED SPOCK' AND MORE SHOCKING TALES INSIDE", + "18 RADICAL HIP IMPLANTS ALL THE KIDS ARE GETTING!", + "PRESERVED HEAD OF 21ST CENTURY CAPITALIST INSISTS THAT 'DYSON WALL' ONLY SANE SOLUTION TO RIMWARD MALCONTENTS", + "50 SHADES OF GREEN; BESTSELLING MULTISPECIES ROMANCE COMING TO CINEMAS", + "PLUTO: DWARF PLANET, OR SECRET RAMPANT AI FACILITY HELL-BENT ON CORRUPTING YOUR CHILDREN?", + "TOP TEN ANIME ALIENS. NUMBER 3 WILL SICKEN YOU", + "OCTUBER X'RALLBRE EXPOSED; NUDE PHOTOSHOOT LEAKS", + "WAR ON MARS AFTER NAKED MAN WAS FOUND; WERE THE ROMANS RIGHT?", + "REAL ALIENS ARGUE EARTH MOVIES RACIST!", + "HELP! I MARRIED A HEGEMONOUS SWARM INTELLIGENCE AND MY SON THINKS HE'S A ROUTER!", + "POSITRONICS: HUMAN INGENUITY AND GENEROSITY, OR A HORRIBLE MISTAKE? FIND OUT INSIDE!", + "TENTACLES OF TERROR: SKRELL BLACK OPS SEIGE NYX NAVAL DEPOT. SHOCKING PHOTOGRAPHS INSIDE!", + "THE FREE TRADER UNION: NEITHER FREE NOR A UNION. SHOCKING EXPOSE!", + "HAS THE FREE MARKET GONE TOO FAR? LUNA GLITTERPOP STAR AUCTIONS THIRD TESTICLE FOR TRANS-ORBITAL SHIPPING BONDS", + "THEY SAID IT WAS CANCER, BUT I KNEW IT WAS A TINY, SELF-REPLICATING CLONE OF RAY KURZWEIL: FULL STORY INSIDE", + "WHAT HAS TECHNOLOGY DONE? INDUSTRY BILLIONAIRE MARRIES OWN INFORMORPH MIND-COPY", + "REPTILLIAN ICE WARRIORS FROM ANOTHER WORLD LIVE INSIDE YOUR AIR DUCTS: HERE'S HOW TO GET RID OF THEM", + "10 CRITICAL THINGS YOU NEED TO KNOW ABOUT 'DRONEGATE'", + "THEY CALL THEM JUMPGATES BUT I'VE NEVER SEEN THEM JUMP: AN INDUSTRY INSIDER SPEAKS FOR THE FIRST TIME", + "EMERGENT INTELLIGENCES ARE STEALING YOUR BANK DETAILS, FETISHES: FOIL HAT RECIPE INSIDE", + "TIME TRAVELLERS ARE STEALING YOUR WIFI: 5 TIPS FOR DEFEATING HACKERS FROM THE FUTURE", + "'My mother was an alien spy': THIS CELEBRITY REVEAL WILL SHOCK AND AMAZE YOU", + "LUMINARY SCIENTIST SPEAKS: DIABETES IS A HYPERCORP RETROVIRUS!", + "'I REROUTED MY NEURAL CIRCUITRY SO THAT PAIN TASTES OF STRAWBERRIES' AND FIFTEEN OTHER CRAZY ALMACH STORIES", + "JOINING THE NAVY? HERE'S 15 EXPERT TIPS FOR AVOIDING BRAIN PARASITES" + ) + +/obj/item/tabloid/Initialize() + . = ..() + + pixel_x = 5-rand(10) + pixel_x = 5-rand(10) + + icon_state = pick(tabloid_states) + headline = pick(tabloid_headlines) + name = pick(tabloid_publishers) + +/obj/item/tabloid/examine(mob/user, distance) + . = ..() + if(headline) + to_chat(user, "The headline screams, \"[headline]\"") + +/obj/item/tabloid/attack_self(mob/user) + user.visible_message(SPAN_NOTICE("\The [user] leafs idly through \the [src].")) + if(headline) + to_chat(user, "Most of it is the usual tabloid garbage, but the headline story, \"[headline]\", holds your attention for awhile.") + if(tabloid_headlines[headline]) + to_chat(user, tabloid_headlines[headline]) + else + to_chat(user, "Most of it is the usual tabloid garbage. You find nothing of interest.") + return TRUE diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm index 4300eeed71..594e57361c 100644 --- a/code/game/objects/items/poi_items.dm +++ b/code/game/objects/items/poi_items.dm @@ -65,6 +65,7 @@ closet_appearance = null catalogue_data = list(/datum/category_item/catalogue/information/objects/oldreactor) climbable = 0 + door_anim_time = 0 //Unsupported starts_with = list( /obj/item/weapon/fuel_assembly/deuterium = 6) diff --git a/code/game/objects/items/toys/toys.dm b/code/game/objects/items/toys/toys.dm index 07017fb5d4..17faef53bb 100644 --- a/code/game/objects/items/toys/toys.dm +++ b/code/game/objects/items/toys/toys.dm @@ -1257,11 +1257,11 @@ icon_state = "therapygreen" item_state = "egg3" // It's the green egg in items_left/righthand -/obj/structure/plushie/fumo +/obj/item/toy/plushie/fumo name = "Fumo" desc = "A plushie of a....?." icon_state = "fumoplushie" - phrase = "I just don't think about losing." + pokephrase = "I just don't think about losing." //Toy cult sword /obj/item/toy/cultsword diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 7ac049a774..209e47b253 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -112,3 +112,6 @@ walk(src, null, null) ..() return + +/obj/item/weapon/grenade/vendor_action(var/obj/machinery/vending/V) + activate(V) \ No newline at end of file diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 59f9fdb69e..08fbb4f348 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -84,6 +84,13 @@ to_chat(user, SPAN_WARNING("You don't have anything on \the [src].")) //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK return +/obj/item/weapon/material/kitchen/utensil/on_rag_wipe() + . = ..() + if(reagents.total_volume > 0) + reagents.clear_reagents() + cut_overlays() + return + /obj/item/weapon/material/kitchen/utensil/fork name = "fork" desc = "It's a fork. Sure is pointy." diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index 301fff7600..73f2c9efd4 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -24,6 +24,18 @@ drop_sound = 'sound/items/drop/axe.ogg' pickup_sound = 'sound/items/pickup/axe.ogg' +/obj/item/weapon/material/knife/machete/hatchet/stone + name = "sharp rock" + desc = "The secret is to bang the rocks together, guys." + force_divisor = 0.2 + icon_state = "rock" + item_state = "rock" + attack_verb = list("chopped", "torn", "cut") + +/obj/item/weapon/material/knife/machete/hatchet/stone/set_material(var/new_material) + var/old_name = name + . = ..() + name = old_name /obj/item/weapon/material/knife/machete/hatchet/unathiknife name = "duelling knife" desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude." diff --git a/code/game/objects/random/_random.dm b/code/game/objects/random/_random.dm index e9beda6de1..df32a567d7 100644 --- a/code/game/objects/random/_random.dm +++ b/code/game/objects/random/_random.dm @@ -1,8 +1,8 @@ /obj/random name = "random object" desc = "This item type is used to spawn random objects at round-start" - icon = 'icons/misc/mark.dmi' - icon_state = "rup" + icon = 'icons/misc/random_spawners.dmi' + icon_state = "generic" var/spawn_nothing_percentage = 0 // this variable determines the likelyhood that this random object will not spawn anything var/drop_get_turf = TRUE @@ -80,7 +80,7 @@ var/list/random_useful_ /obj/random/single name = "randomly spawned object" desc = "This item type is used to randomly spawn a given object at round-start" - icon_state = "x3" + icon_state = "generic" var/spawn_object = null /obj/random/single/item_to_spawn() @@ -104,8 +104,8 @@ var/list/multi_point_spawns /obj/random_multi name = "random object spawn point" desc = "This item type is used to spawn random objects at round-start. Only one spawn point for a given group id is selected." - icon = 'icons/misc/mark.dmi' - icon_state = "x3" + icon = 'icons/misc/random_spawners.dmi' + icon_state = "generic_3" invisibility = INVISIBILITY_MAXIMUM var/id // Group id var/weight // Probability weight for this spawn point diff --git a/code/game/objects/random/guns_and_ammo.dm b/code/game/objects/random/guns_and_ammo.dm index cb8362879d..649e54f3db 100644 --- a/code/game/objects/random/guns_and_ammo.dm +++ b/code/game/objects/random/guns_and_ammo.dm @@ -1,8 +1,7 @@ /obj/random/gun/random name = "Random Weapon" desc = "This is a random energy or ballistic weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "energystun100" + icon_state = "gun" /obj/random/gun/random/item_to_spawn() return pick(prob(5);/obj/random/energy, @@ -10,9 +9,8 @@ /obj/random/energy name = "Random Energy Weapon" - desc = "This is a random weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "energykill100" + desc = "This is a random energy weapon." + icon_state = "gun_energy" /obj/random/energy/item_to_spawn() return pick(prob(3);/obj/item/weapon/gun/energy/laser, @@ -28,17 +26,34 @@ prob(2);/obj/item/weapon/gun/energy/ionrifle, prob(2);/obj/item/weapon/gun/energy/ionrifle/pistol, prob(3);/obj/item/weapon/gun/energy/toxgun, - prob(4);/obj/item/weapon/gun/energy/taser, + prob(3);/obj/item/weapon/gun/energy/taser, prob(2);/obj/item/weapon/gun/energy/crossbow/largecrossbow, - prob(4);/obj/item/weapon/gun/energy/stunrevolver, + prob(3);/obj/item/weapon/gun/energy/stunrevolver, prob(2);/obj/item/weapon/gun/energy/stunrevolver/vintage, prob(3);/obj/item/weapon/gun/energy/gun/compact) +/obj/random/energy/highend + name = "Random Energy Weapon" + desc = "This is a random, actually good energy weapon." + icon_state = "gun_energy_2" + +/obj/random/energy/item_to_spawn() + return pick(prob(3);/obj/item/weapon/gun/energy/laser, + prob(3);/obj/item/weapon/gun/energy/laser/sleek, + prob(4);/obj/item/weapon/gun/energy/gun, + prob(3);/obj/item/weapon/gun/energy/gun/burst, + prob(1);/obj/item/weapon/gun/energy/gun/nuclear, + prob(2);/obj/item/weapon/gun/energy/retro, + prob(2);/obj/item/weapon/gun/energy/lasercannon, + prob(3);/obj/item/weapon/gun/energy/xray, + prob(1);/obj/item/weapon/gun/energy/sniperrifle, + prob(2);/obj/item/weapon/gun/energy/crossbow/largecrossbow, + prob(3);/obj/item/weapon/gun/energy/gun/compact) + /obj/random/energy/sec name = "Random Security Energy Weapon" desc = "This is a random security weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "energykill100" + icon_state = "gun_energy" /obj/random/energy/sec/item_to_spawn() return pick(prob(2);/obj/item/weapon/gun/energy/laser, @@ -47,8 +62,7 @@ /obj/random/projectile name = "Random Projectile Weapon" desc = "This is a random projectile weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun" /obj/random/projectile/item_to_spawn() return pick(prob(3);/obj/item/weapon/gun/projectile/automatic/wt550, @@ -89,8 +103,7 @@ /obj/random/projectile/sec name = "Random Security Projectile Weapon" desc = "This is a random security weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_shotgun" /obj/random/projectile/sec/item_to_spawn() return pick(prob(3);/obj/item/weapon/gun/projectile/shotgun/pump, @@ -98,10 +111,9 @@ prob(1);/obj/item/weapon/gun/projectile/shotgun/pump/combat) /obj/random/projectile/shotgun - name = "Random Projectile Weapon" - desc = "This is a random projectile weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "shotgun" + name = "Random Shotgun" + desc = "This is a random shotgun-type weapon." + icon_state = "gun_shotgun" /obj/random/projectile/item_to_spawn() return pick(prob(4);/obj/item/weapon/gun/projectile/shotgun/doublebarrel, @@ -113,7 +125,7 @@ name = "Random Handgun" desc = "This is a random sidearm." icon = 'icons/obj/gun.dmi' - icon_state = "secgundark" + icon_state = "gun" /obj/random/handgun/item_to_spawn() return pick(prob(4);/obj/item/weapon/gun/projectile/sec, @@ -130,8 +142,7 @@ /obj/random/handgun/sec name = "Random Security Handgun" desc = "This is a random security sidearm." - icon = 'icons/obj/gun.dmi' - icon_state = "secgundark" + icon_state = "gun" /obj/random/handgun/sec/item_to_spawn() return pick(prob(3);/obj/item/weapon/gun/projectile/sec, @@ -140,8 +151,7 @@ /obj/random/ammo name = "Random Ammunition" desc = "This is random security ammunition." - icon = 'icons/obj/ammo.dmi' - icon_state = "45-10" + icon_state = "ammo" /obj/random/ammo/item_to_spawn() return pick(prob(6);/obj/item/weapon/storage/box/beanbags, @@ -157,8 +167,7 @@ /obj/random/grenade name = "Random Grenade" desc = "This is random thrown grenades (no C4/etc.)." - icon = 'icons/obj/grenade.dmi' - icon_state = "clusterbang_segment" + icon_state = "grenade_2" /obj/random/grenade/item_to_spawn() return pick( prob(15);/obj/item/weapon/grenade/concussion, @@ -179,11 +188,24 @@ prob(15);/obj/item/weapon/grenade/smokebomb ) +/obj/random/grenade/lethal + name = "Random Grenade" + desc = "This is random thrown grenade that hurts a lot." + icon_state = "grenade_3" + +/obj/random/grenade/lethal/item_to_spawn() + return pick( prob(15);/obj/item/weapon/grenade/concussion, + prob(5);/obj/item/weapon/grenade/empgrenade, + prob(2);/obj/item/weapon/grenade/chem_grenade/incendiary, + prob(5);/obj/item/weapon/grenade/explosive, + prob(10);/obj/item/weapon/grenade/explosive/mini, + prob(2);/obj/item/weapon/grenade/explosive/frag + ) + /obj/random/grenade/less_lethal name = "Random Security Grenade" desc = "This is a random thrown grenade that shouldn't kill anyone." - icon = 'icons/obj/grenade.dmi' - icon_state = "clusterbang_segment" + icon_state = "grenade" /obj/random/grenade/less_lethal/item_to_spawn() return pick( prob(20);/obj/item/weapon/grenade/concussion, @@ -199,8 +221,7 @@ /obj/random/grenade/box name = "Random Grenade Box" desc = "This is a random box of grenades. Not to be mistaken for a box of random grenades. Or a grenade of random boxes - but that would just be silly." - icon = 'icons/obj/grenade.dmi' - icon_state = "clusterbang_segment" + icon_state = "grenade_box" /obj/random/grenade/box/item_to_spawn() return pick( prob(20);/obj/item/weapon/storage/box/flashbangs, @@ -215,9 +236,9 @@ /obj/random/projectile/random name = "Random Projectile Weapon" - desc = "This is a random weapon." + desc = "This is a random projectile weapon." icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_2" /obj/random/projectile/random/item_to_spawn() return pick(prob(3);/obj/random/multiple/gun/projectile/handgun, @@ -228,8 +249,7 @@ /obj/random/multiple/gun/projectile/smg name = "random smg projectile gun" desc = "Loot for PoIs." - icon = 'icons/obj/gun.dmi' - icon_state = "saber" + icon_state = "gun_auto" /obj/random/multiple/gun/projectile/smg/item_to_spawn() return pick( @@ -267,8 +287,7 @@ /obj/random/multiple/gun/projectile/rifle name = "random rifle projectile gun" desc = "Loot for PoIs." - icon = 'icons/obj/gun.dmi' - icon_state = "carbine" + icon_state = "gun_rifle" //Concerns about the bullpup, but currently seems to be only a slightly stronger z8. But we shall see. @@ -319,8 +338,7 @@ /obj/random/multiple/gun/projectile/handgun name = "random handgun projectile gun" desc = "Loot for PoIs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun" /obj/random/multiple/gun/projectile/handgun/item_to_spawn() return pick( @@ -451,8 +469,7 @@ /obj/random/multiple/gun/projectile/shotgun name = "random shotgun projectile gun" desc = "Loot for PoIs." - icon = 'icons/obj/gun.dmi' - icon_state = "shotgun" + icon_state = "gun_shotgun" /obj/random/multiple/gun/projectile/shotgun/item_to_spawn() return pick( @@ -485,7 +502,7 @@ name = "broken gun spawner" desc = "Spawns a random broken gun, or rarely a fully functional one." icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_gun/item_to_spawn() return pickweight(list( @@ -503,8 +520,7 @@ /obj/random/projectile/scrapped_shotgun name = "broken shotgun spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "shotgun" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_shotgun/item_to_spawn() return pickweight(list( @@ -517,8 +533,7 @@ /obj/random/projectile/scrapped_smg name = "broken smg spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_smg/item_to_spawn() return pickweight(list( @@ -529,8 +544,7 @@ /obj/random/projectile/scrapped_pistol name = "broken pistol spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_pistol/item_to_spawn() return pickweight(list( @@ -541,8 +555,7 @@ /obj/random/projectile/scrapped_laser name = "broken laser spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_laser/item_to_spawn() return pickweight(list( @@ -555,8 +568,7 @@ /obj/random/projectile/scrapped_ionrifle name = "broken ionrifle spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_ionrifle/item_to_spawn() return pickweight(list( @@ -567,8 +579,7 @@ /obj/random/projectile/scrapped_bulldog name = "broken z8 spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_bulldog/item_to_spawn() return pickweight(list( @@ -579,8 +590,7 @@ /obj/random/projectile/scrapped_flechette name = "broken flechette spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_flechette/item_to_spawn() return pickweight(list( @@ -591,8 +601,7 @@ /obj/random/projectile/scrapped_grenadelauncher name = "broken grenadelauncher spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_grenadelauncher/item_to_spawn() return pickweight(list( @@ -603,8 +612,7 @@ /obj/random/projectile/scrapped_dartgun name = "broken dartgun spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_dartgun/item_to_spawn() return pickweight(list( diff --git a/code/game/objects/random/maintenance.dm b/code/game/objects/random/maintenance.dm index 0e66da28da..6b4b71189b 100644 --- a/code/game/objects/random/maintenance.dm +++ b/code/game/objects/random/maintenance.dm @@ -1,8 +1,6 @@ /obj/random/maintenance //Clutter and loot for maintenance and away missions name = "random maintenance item" desc = "This is a random maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" /obj/random/maintenance/item_to_spawn() return pick(prob(300);/obj/random/tech_supply, @@ -25,8 +23,6 @@ Individual items to add to the maintenance list should go here, if you add something, make sure it's not in one of the other lists.*/ name = "random clean maintenance item" desc = "This is a random clean maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" /obj/random/maintenance/clean/item_to_spawn() return pick(prob(10);/obj/random/contraband, @@ -112,8 +108,7 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around security areas*/ name = "random security maintenance item" desc = "This is a random security maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" + icon_state = "security" /obj/random/maintenance/security/item_to_spawn() return pick(prob(320);/obj/random/maintenance/clean, @@ -169,8 +164,7 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around medical areas*/ name = "random medical maintenance item" desc = "This is a random medical maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" + icon_state = "medical" /obj/random/maintenance/medical/item_to_spawn() return pick(prob(320);/obj/random/maintenance/clean, @@ -209,8 +203,7 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around medical areas*/ name = "random engineering maintenance item" desc = "This is a random engineering maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" + icon_state = "tool" /obj/random/maintenance/engineering/item_to_spawn() return pick(prob(320);/obj/random/maintenance/clean, @@ -247,8 +240,7 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around medical areas*/ name = "random research maintenance item" desc = "This is a random research maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" + icon_state = "science" /obj/random/maintenance/research/item_to_spawn() return pick(prob(320);/obj/random/maintenance/clean, @@ -279,8 +271,6 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around cargo areas*/ name = "random cargo maintenance item" desc = "This is a random cargo maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" /obj/random/maintenance/cargo/item_to_spawn() return pick(prob(320);/obj/random/maintenance/clean, diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm index e332ed40f7..a057a290a0 100644 --- a/code/game/objects/random/mapping.dm +++ b/code/game/objects/random/mapping.dm @@ -64,6 +64,52 @@ /obj/structure/closet/crate/engineering, /obj/structure/closet/crate) +/obj/random/vendorall //Fully random selection of consumer vendors + name = "random vending machine" + desc = "This is a random vending machine" + icon = 'icons/obj/vending.dmi' + icon_state = "radren-off" + +/obj/random/vendorall/item_to_spawn() + return pick (/obj/machinery/vending/coffee, + /obj/machinery/vending/snack, + /obj/machinery/vending/cola, + /obj/machinery/vending/fitness, + /obj/machinery/vending/cigarette, + /obj/machinery/vending/giftvendor, + /obj/machinery/vending/hotfood, + /obj/machinery/vending/weeb, + /obj/machinery/vending/sol, + /obj/machinery/vending/snix, + /obj/machinery/vending/snlvend, + /obj/machinery/vending/sovietsoda, + /obj/machinery/vending/sovietvend, + /obj/machinery/vending/radren) + +/obj/random/vendorfood //Random food vendors for station use + name = "random snack vending machine" + desc = "This is a random food vending machine" + icon = 'icons/obj/vending.dmi' + icon_state = "snack" + +/obj/random/vendorfood/item_to_spawn() + return pick (/obj/machinery/vending/snack, + /obj/machinery/vending/weeb, + /obj/machinery/vending/sol, + /obj/machinery/vending/snix, + /obj/machinery/vending/snlvend) + +/obj/random/vendordrink //Random drink vendors for station use + name = "random drink vending machine" + desc = "This is a random drink vending machine" + icon = 'icons/obj/vending.dmi' + icon_state = "Cola_Machine" + +/obj/random/vendordrink/item_to_spawn() //Not including coffee as it's more specific in usage. + return pick (/obj/machinery/vending/cola, + /obj/machinery/vending/sovietsoda, + /obj/machinery/vending/radren) + /obj/random/obstruction //Large objects to block things off in maintenance name = "random obstruction" desc = "This is a random obstruction." diff --git a/code/game/objects/random/mechs.dm b/code/game/objects/random/mechs.dm index 7dcd3db5cc..6129e177da 100644 --- a/code/game/objects/random/mechs.dm +++ b/code/game/objects/random/mechs.dm @@ -1,8 +1,7 @@ /obj/random/mech name = "random mech" desc = "This is a random single mech." - icon = 'icons/mecha/mecha.dmi' - icon_state = "old_durand" + icon_state = "mecha" drop_get_turf = FALSE //This list includes the phazon, gorilla and mauler. You might want to use something else if balance is a concern. @@ -25,8 +24,6 @@ /obj/random/mech/weaker name = "random mech" desc = "This is a random single mech. Those are less potent and more common." - icon = 'icons/mecha/mecha.dmi' - icon_state = "old_durand" drop_get_turf = FALSE /obj/random/mech/weaker/item_to_spawn() @@ -42,8 +39,6 @@ /obj/random/mech/old name = "random mech" desc = "This is a random single old mech." - icon = 'icons/mecha/mecha.dmi' - icon_state = "old_durand" drop_get_turf = FALSE //Note that all of those are worn out and have slightly less maximal health than the standard. diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 778bb2beaf..efa1376ae2 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -6,8 +6,7 @@ /obj/random/tool name = "random tool" desc = "This is a random tool" - icon = 'icons/obj/tools.dmi' - icon_state = "welder" + icon_state = "tool" /obj/random/tool/item_to_spawn() return pick(/obj/item/weapon/tool/screwdriver, @@ -22,7 +21,7 @@ /obj/random/tool/powermaint name = "random powertool" desc = "This is a random rare powertool for maintenance" - icon_state = "jaws_pry" + icon_state = "tool_2" /obj/random/tool/powermaint/item_to_spawn() return pick(prob(320);/obj/random/tool, @@ -34,7 +33,7 @@ /obj/random/tool/power name = "random powertool" desc = "This is a random powertool" - icon_state = "jaws_pry" + icon_state = "tool_2" /obj/random/tool/power/item_to_spawn() return pick(/obj/item/weapon/tool/screwdriver/power, @@ -45,8 +44,7 @@ /obj/random/tool/alien name = "random alien tool" desc = "This is a random tool" - icon = 'icons/obj/abductor.dmi' - icon_state = "welder" + icon_state = "tool_3" /obj/random/tool/alien/item_to_spawn() return pick(/obj/item/weapon/tool/screwdriver/alien, @@ -60,8 +58,7 @@ /obj/random/technology_scanner name = "random scanner" desc = "This is a random technology scanner." - icon = 'icons/obj/device.dmi' - icon_state = "atmos" + icon_state = "tech" /obj/random/technology_scanner/item_to_spawn() return pick(prob(5);/obj/item/device/t_scanner, @@ -71,7 +68,6 @@ /obj/random/powercell name = "random powercell" desc = "This is a random powercell." - icon = 'icons/obj/power.dmi' icon_state = "cell" /obj/random/powercell/item_to_spawn() @@ -85,8 +81,7 @@ /obj/random/bomb_supply name = "bomb supply" desc = "This is a random bomb supply." - icon = 'icons/obj/assemblies/new_assemblies.dmi' - icon_state = "signaller" + icon_state = "tech" /obj/random/bomb_supply/item_to_spawn() return pick(/obj/item/device/assembly/igniter, @@ -99,8 +94,7 @@ /obj/random/toolbox name = "random toolbox" desc = "This is a random toolbox." - icon = 'icons/obj/storage.dmi' - icon_state = "red" + icon_state = "toolbox" /obj/random/toolbox/item_to_spawn() return pick(prob(6);/obj/item/weapon/storage/toolbox/mechanical, @@ -111,8 +105,7 @@ /obj/random/smes_coil name = "random smes coil" desc = "This is a random smes coil." - icon = 'icons/obj/power.dmi' - icon_state = "smes" + icon_state = "cell_2" /obj/random/smes_coil/item_to_spawn() return pick(prob(4);/obj/item/weapon/smes_coil, @@ -122,8 +115,7 @@ /obj/random/pacman name = "random portable generator" desc = "This is a random portable generator." - icon = 'icons/obj/power.dmi' - icon_state = "portgen0" + icon_state = "cell_3" /obj/random/pacman/item_to_spawn() return pick(prob(6);/obj/machinery/power/port_gen/pacman, @@ -133,8 +125,7 @@ /obj/random/tech_supply name = "random tech supply" desc = "This is a random piece of technology supplies." - icon = 'icons/obj/power.dmi' - icon_state = "cell" + icon_state = "tech" spawn_nothing_percentage = 25 /obj/random/tech_supply/item_to_spawn() @@ -161,8 +152,7 @@ /obj/random/tech_supply/component name = "random tech component" desc = "This is a random machine component." - icon = 'icons/obj/items.dmi' - icon_state = "portable_analyzer" + icon_state = "tech" /obj/random/tech_supply/component/item_to_spawn() return pick(prob(3);/obj/item/weapon/stock_parts/gear, @@ -188,8 +178,7 @@ /obj/random/medical name = "Random Medicine" desc = "This is a random medical item." - icon = 'icons/obj/stacks.dmi' - icon_state = "traumakit" + icon_state = "medical" /obj/random/medical/item_to_spawn() return pick(prob(21);/obj/random/medical/lite, @@ -208,8 +197,7 @@ /obj/random/medical/pillbottle name = "Random Pill Bottle" desc = "This is a random pill bottle." - icon = 'icons/obj/chemical.dmi' - icon_state = "pill_canister" + icon_state = "pillbottle" /obj/random/medical/pillbottle/item_to_spawn() return pick(prob(1);/obj/item/weapon/storage/pill_bottle/spaceacillin, @@ -221,8 +209,7 @@ /obj/random/medical/lite name = "Random Medicine" desc = "This is a random simple medical item." - icon = 'icons/obj/items.dmi' - icon_state = "brutepack" + icon_state = "medical" spawn_nothing_percentage = 25 /obj/random/medical/lite/item_to_spawn() @@ -240,8 +227,7 @@ /obj/random/firstaid name = "Random First Aid Kit" desc = "This is a random first aid kit." - icon = 'icons/obj/storage.dmi' - icon_state = "firstaid" + icon_state = "medicalkit" /obj/random/firstaid/item_to_spawn() return pick(prob(10);/obj/item/weapon/storage/firstaid/regular, @@ -254,8 +240,7 @@ /obj/random/contraband name = "Random Illegal Item" desc = "Hot Stuff." - icon = 'icons/obj/items.dmi' - icon_state = "purplecomb" + icon_state = "sus" spawn_nothing_percentage = 50 /obj/random/contraband/item_to_spawn() return pick(prob(6);/obj/item/weapon/storage/pill_bottle/tramadol, @@ -504,8 +489,7 @@ /obj/random/material //Random materials for building stuff name = "random material" desc = "This is a random material." - icon = 'icons/obj/stacks.dmi' - icon_state = "sheet-metal_2" + icon_state = "material" /obj/random/material/item_to_spawn() return pick(/obj/item/stack/material/steel{amount = 10}, @@ -523,8 +507,7 @@ /obj/random/material/refined //Random materials for building stuff name = "random refined material" desc = "This is a random refined metal." - icon = 'icons/obj/stacks.dmi' - icon_state = "sheet-adamantine_3" + icon_state = "material_2" /obj/random/material/refined/item_to_spawn() return pick(/obj/item/stack/material/steel{amount = 10}, @@ -554,8 +537,7 @@ /obj/random/material/precious //Precious metals, go figure name = "random precious metal" desc = "This is a small stack of a random precious metal." - icon = 'icons/obj/stacks.dmi' - icon_state = "sheet-gold_2" + icon_state = "material_3" /obj/random/material/precious/item_to_spawn() return pick(/obj/item/stack/material/gold{amount = 5}, @@ -774,8 +756,7 @@ /obj/random/janusmodule name = "random janus circuit" desc = "A random (possibly broken) Janus module." - icon = 'icons/obj/abductor.dmi' - icon_state = "circuit_damaged" + icon_state = "tech_2" /obj/random/janusmodule/item_to_spawn() return pick(subtypesof(/obj/item/weapon/circuitboard/mecha/imperion)) @@ -950,3 +931,4 @@ prob(3);/obj/item/clothing/accessory/poncho/thermal/green, prob(3);/obj/item/clothing/accessory/poncho/thermal/purple, prob(3);/obj/item/clothing/accessory/poncho/thermal/blue) + diff --git a/code/game/objects/random/mob.dm b/code/game/objects/random/mob.dm index 0699dfb9a1..d0cee5dff0 100644 --- a/code/game/objects/random/mob.dm +++ b/code/game/objects/random/mob.dm @@ -5,8 +5,7 @@ /obj/random/mob name = "Random Animal" desc = "This is a random animal." - icon = 'icons/mob/animal.dmi' - icon_state = "chicken_white" + icon_state = "animal" var/overwrite_hostility = 0 @@ -68,7 +67,7 @@ /obj/random/mob/sif name = "Random Sif Animal" desc = "This is a random cold weather animal." - icon_state = "penguin" + icon_state = "animal" mob_returns_home = 1 mob_wander_distance = 10 @@ -89,7 +88,7 @@ /obj/random/mob/sif/peaceful name = "Random Peaceful Sif Animal" desc = "This is a random peaceful cold weather animal." - icon_state = "penguin" + icon_state = "animal_passive" mob_returns_home = 1 mob_wander_distance = 12 @@ -106,7 +105,7 @@ /obj/random/mob/sif/hostile name = "Random Hostile Sif Animal" desc = "This is a random hostile cold weather animal." - icon_state = "frost" + icon_state = "animal_hostile" /obj/random/mob/sif/hostile/item_to_spawn() return pick(prob(22);/mob/living/simple_mob/animal/sif/savik, @@ -169,7 +168,7 @@ /obj/random/mob/robotic name = "Random Robot Mob" desc = "This is a random robot." - icon_state = "drone_dead" + icon_state = "robot" overwrite_hostility = 1 @@ -217,7 +216,7 @@ /obj/random/mob/robotic/hivebot name = "Random Hivebot" desc = "This is a random hivebot." - icon_state = "drone3" + icon_state = "robot" mob_faction = "hivebot" @@ -237,18 +236,58 @@ name = "Random Mouse" desc = "This is a random boring maus." icon_state = "mouse_gray" + spawn_nothing_percentage = 15 /obj/random/mob/mouse/item_to_spawn() return pick(prob(15);/mob/living/simple_mob/animal/passive/mouse/white, prob(30);/mob/living/simple_mob/animal/passive/mouse/brown, prob(30);/mob/living/simple_mob/animal/passive/mouse/gray, - prob(25);/obj/random/mouseremains) //because figuring out how to come up with it picking nothing is beyond my coding ability. + prob(30);/mob/living/simple_mob/animal/passive/mouse/rat) + +/obj/random/mob/fish + name = "Random Fish" + desc = "This is a random fish found on Sif." + icon_state = "fish" + mob_faction = "fish" + overwrite_hostility = 1 + mob_hostile = 0 + mob_retaliate = 0 + +/obj/random/mob/fish/item_to_spawn() + return pick(prob(10);/mob/living/simple_mob/animal/passive/fish/bass, + prob(20);/mob/living/simple_mob/animal/passive/fish/icebass, + prob(20);/mob/living/simple_mob/animal/passive/fish/trout, + prob(20);/mob/living/simple_mob/animal/passive/fish/salmon, + prob(10);/mob/living/simple_mob/animal/passive/fish/pike, + prob(10);/mob/living/simple_mob/animal/passive/fish/perch, + prob(20);/mob/living/simple_mob/animal/passive/fish/murkin, + prob(15);/mob/living/simple_mob/animal/passive/fish/javelin, + prob(20);/mob/living/simple_mob/animal/passive/fish/rockfish, + prob(5);/mob/living/simple_mob/animal/passive/fish/solarfish, + prob(10);/mob/living/simple_mob/animal/passive/crab, + prob(1);/mob/living/simple_mob/animal/sif/hooligan_crab) + +/obj/random/mob/bird + name = "Random Bird" + desc = "This is a random wild/feral bird." + icon_state = "bird" + mob_faction = "bird" + +/obj/random/mob/bird/item_to_spawn() + return pick(prob(10);/mob/living/simple_mob/animal/passive/bird/black_bird, + prob(10);/mob/living/simple_mob/animal/passive/bird/azure_tit, + prob(20);/mob/living/simple_mob/animal/passive/bird/european_robin, + prob(10);/mob/living/simple_mob/animal/passive/bird/goldcrest, + prob(20);/mob/living/simple_mob/animal/passive/bird/ringneck_dove, + prob(10);/mob/living/simple_mob/animal/space/goose, + prob(5);/mob/living/simple_mob/animal/passive/chicken, + prob(1);/mob/living/simple_mob/animal/passive/penguin) // Mercs /obj/random/mob/merc name = "Random Mercenary" desc = "This is a random PoI mercenary." - icon_state = "syndicate" + icon_state = "humanoid" mob_faction = "syndicate" mob_returns_home = 1 @@ -270,7 +309,7 @@ /obj/random/mob/merc/armored name = "Random Armored Infantry Merc" desc = "This is a random PoI exo or robot for mercs." - icon_state = "drone3" + icon_state = "mecha" /obj/random/mob/merc/armored/item_to_spawn() return pick(prob(30);/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark, @@ -327,6 +366,7 @@ /obj/random/mob/multiple/sifmobs name = "Random Sifmob Pack" desc = "A pack of random neutral sif mobs." + icon_state = "animal_group" /obj/random/mob/multiple/sifmobs/item_to_spawn() return pick( diff --git a/code/game/objects/structures/crates_lockers/__closets.dm b/code/game/objects/structures/crates_lockers/__closets.dm index 9754fb6959..96cd5bacf3 100644 --- a/code/game/objects/structures/crates_lockers/__closets.dm +++ b/code/game/objects/structures/crates_lockers/__closets.dm @@ -7,10 +7,10 @@ density = 1 w_class = ITEMSIZE_HUGE layer = UNDER_JUNK_LAYER - + var/opened = 0 var/sealed = 0 - + var/seal_tool = /obj/item/weapon/weldingtool //Tool used to seal the closet, defaults to welder var/wall_mounted = 0 //never solid (You can always pass over it) var/health = 100 @@ -35,6 +35,19 @@ var/closet_appearance = /decl/closet_appearance // The /decl that defines what decals we end up with, that makes our look unique + /// Currently animating the door transform + var/is_animating_door = FALSE + /// Length of time (ds) to animate the door transform + var/door_anim_time = 2.0 + /// Amount to 'squish' the full width of the door by + var/door_anim_squish = 0.30 + /// Virtual angle at which the door is opened to (136 by default, so not a full 180) + var/door_anim_angle = 136 + /// Offset for the door hinge location from centerline + var/door_hinge = -6.5 + /// Our visual object for the closet door + var/obj/effect/overlay/closet_door/door_obj + /obj/structure/closet/Initialize() ..() return INITIALIZE_HINT_LATELOAD @@ -65,6 +78,10 @@ color = null update_icon() +/obj/structure/closet/Destroy() + . = ..() + qdel_null(door_obj) + /obj/structure/closet/examine(mob/user) . = ..() if(Adjacent(user) || isobserver(user)) @@ -133,7 +150,7 @@ playsound(src, open_sound, 15, 1, -3) if(initial(density)) density = !density - update_icon() + animate_door() return 1 /obj/structure/closet/proc/close() @@ -158,7 +175,7 @@ playsound(src, close_sound, 15, 1, -3) if(initial(density)) density = !density - update_icon() + animate_door(TRUE) return 1 //Cham Projector Exception @@ -213,10 +230,11 @@ /obj/structure/closet/proc/toggle(mob/user as mob) + if(is_animating_door) + return if(!(opened ? close() : open())) to_chat(user, "It won't budge!") return - update_icon() // this should probably use dump_contents() /obj/structure/closet/ex_act(severity) @@ -480,8 +498,45 @@ spawn(1) qdel(src) return 1 -// Just a generic cabinet for mappers to use -/obj/structure/closet/cabinet - name = "cabinet" - icon = 'icons/obj/closets/bases/cabinet.dmi' - closet_appearance = /decl/closet_appearance/cabinet +/obj/structure/closet/proc/animate_door(closing = FALSE) + if(!door_anim_time) + update_icon() + return + if(!door_obj) + door_obj = new + vis_contents |= door_obj + door_obj.icon = icon + door_obj.icon_state = "door_front" + is_animating_door = TRUE + if(!closing) + update_icon() + var/num_steps = door_anim_time / world.tick_lag + for(var/I in 0 to num_steps) + var/angle = door_anim_angle * (closing ? 1 - (I/num_steps) : (I/num_steps)) + var/matrix/M = get_door_transform(angle) + var/door_state = angle >= 90 ? "door_back" : "door_front" + var/door_layer = angle >= 90 ? FLOAT_LAYER : ABOVE_MOB_LAYER + + if(I == 0) + door_obj.transform = M + door_obj.icon_state = door_state + door_obj.layer = door_layer + else if(I == 1) + animate(door_obj, transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag, flags = ANIMATION_END_NOW) + else + animate(transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag) + addtimer(CALLBACK(src,.proc/end_door_animation,closing),door_anim_time,TIMER_UNIQUE|TIMER_OVERRIDE) + +/obj/structure/closet/proc/end_door_animation(closing = FALSE) + is_animating_door = FALSE + if(closing) + // There's not really harm in leaving it on, but, one less atom to send to clients to render when lockers are closed + vis_contents -= door_obj + update_icon() + +/obj/structure/closet/proc/get_door_transform(angle) + var/matrix/M = matrix() + M.Translate(-door_hinge, 0) + M.Multiply(matrix(cos(angle), 0, 0, -sin(angle) * door_anim_squish, 1, 0)) + M.Translate(door_hinge, 0) + return M \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm b/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm index 9075c87272..52bb07c9dd 100644 --- a/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm +++ b/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm @@ -33,6 +33,8 @@ var/icon/closed_locked_welded_icon var/icon/closed_unlocked_icon var/icon/closed_unlocked_welded_icon + var/icon/door_front_icon + var/icon/door_back_icon // Create open icon. var/icon/new_icon = new @@ -40,6 +42,8 @@ open_icon.Blend(icon(base_icon, "open"), ICON_OVERLAY) open_icon.Blend(color, BLEND_ADD) open_icon.Blend(icon(base_icon, "interior"), ICON_OVERLAY) + door_back_icon = icon(base_icon, "door_back") + door_back_icon.Blend(color, BLEND_ADD) if(decal_icon) for(var/thing in decals) var/icon/this_decal_icon = icon(decal_icon, "[thing]_open") @@ -47,6 +51,8 @@ open_icon.Blend(this_decal_icon, ICON_OVERLAY) // Generate basic closed icons. + door_front_icon = icon(base_icon, "door_front") + door_front_icon.Blend(color, BLEND_ADD) closed_emagged_icon = icon(base_icon, "base") if(can_lock) closed_emagged_icon.Blend(icon(base_icon, "lock"), ICON_OVERLAY) @@ -56,6 +62,10 @@ var/icon/this_decal_icon = icon(decal_icon, thing) this_decal_icon.Blend(decals[thing], BLEND_ADD) closed_emagged_icon.Blend(this_decal_icon, ICON_OVERLAY) + door_front_icon.Blend(this_decal_icon, ICON_OVERLAY) + + door_front_icon.AddAlphaMask(icon(base_icon, "door_front")) // Remove pesky 'more than just door' decals + closed_locked_icon = icon(closed_emagged_icon) closed_unlocked_icon = icon(closed_emagged_icon) @@ -90,6 +100,8 @@ new_icon.Insert(closed_locked_welded_icon, "closed_locked_welded") new_icon.Insert(closed_unlocked_icon, "closed_unlocked") new_icon.Insert(closed_unlocked_welded_icon, "closed_unlocked_welded") + new_icon.Insert(door_front_icon, "door_front") + new_icon.Insert(door_back_icon, "door_back") // Set icon! icon = new_icon diff --git a/code/game/objects/structures/crates_lockers/closets/coffin.dm b/code/game/objects/structures/crates_lockers/closets/coffin.dm index 14e1c276b2..ce1e7cfe5e 100644 --- a/code/game/objects/structures/crates_lockers/closets/coffin.dm +++ b/code/game/objects/structures/crates_lockers/closets/coffin.dm @@ -2,11 +2,12 @@ name = "coffin" desc = "It's a burial receptacle for the dearly departed." icon = 'icons/obj/closets/coffin.dmi' - + icon_state = "closed_unlocked" seal_tool = /obj/item/weapon/tool/screwdriver breakout_sound = 'sound/weapons/tablehit1.ogg' closet_appearance = null // Special icon for us + door_anim_time = 0 //Unsupported /* Graves */ /obj/structure/closet/grave @@ -20,6 +21,7 @@ max_closets = 1 opened = 1 closet_appearance = null // Special icon for us + door_anim_time = 0 //Unsupported /obj/structure/closet/grave/attack_hand(mob/user as mob) if(opened) diff --git a/code/game/objects/structures/crates_lockers/closets/crittercrate.dm b/code/game/objects/structures/crates_lockers/closets/crittercrate.dm index 72a9188d12..0e7763e827 100644 --- a/code/game/objects/structures/crates_lockers/closets/crittercrate.dm +++ b/code/game/objects/structures/crates_lockers/closets/crittercrate.dm @@ -1,4 +1,5 @@ /obj/structure/closet/crate/critter name = "critter crate" desc = "A crate which can sustain life for a while." - closet_appearance = /decl/closet_appearance/large_crate/critter \ No newline at end of file + closet_appearance = /decl/closet_appearance/large_crate/critter + door_anim_time = 0 //Unsupported \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm index ca2f81e307..9d01a4efbe 100644 --- a/code/game/objects/structures/crates_lockers/closets/fitness.dm +++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm @@ -3,6 +3,35 @@ desc = "It's a storage unit for athletic wear." closet_appearance = /decl/closet_appearance/wardrobe/mixed + starts_with = list( + /obj/item/clothing/under/shorts/grey, + /obj/item/clothing/under/shorts/black, + /obj/item/clothing/under/shorts/red, + /obj/item/clothing/under/shorts/blue, + /obj/item/clothing/under/shorts/green, + /obj/item/clothing/under/shorts/white, + /obj/item/clothing/suit/storage/toggle/track, + /obj/item/clothing/suit/storage/toggle/track/blue, + /obj/item/clothing/suit/storage/toggle/track/green, + /obj/item/clothing/suit/storage/toggle/track/red, + /obj/item/clothing/suit/storage/toggle/track/white, + /obj/item/clothing/under/pants/track, + /obj/item/clothing/under/pants/track/blue, + /obj/item/clothing/under/pants/track/green, + /obj/item/clothing/under/pants/track/white, + /obj/item/clothing/under/pants/track/red, + /obj/item/clothing/shoes/athletic = 2, + /obj/item/clothing/shoes/hitops, + /obj/item/clothing/shoes/hitops/red, + /obj/item/clothing/shoes/hitops/black, + /obj/item/clothing/shoes/hitops/blue + ) + +/obj/structure/closet/athletic_swimwear + name = "athletic wardrobe" + desc = "It's a storage unit for swimwear." + closet_appearance = /decl/closet_appearance/wardrobe/mixed + starts_with = list( /obj/item/clothing/under/shorts/grey, /obj/item/clothing/under/shorts/black, @@ -17,6 +46,9 @@ /obj/item/clothing/under/swimsuit/striped, /obj/item/clothing/under/swimsuit/white, /obj/item/clothing/under/swimsuit/earth, + /obj/item/clothing/under/wetsuit, + /obj/item/clothing/under/wetsuit_rec, + /obj/item/clothing/under/wetsuit_skimpy, /obj/item/clothing/mask/snorkel = 2, /obj/item/clothing/shoes/swimmingfins = 2) diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 0c91f7aecf..502562ad96 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -1,7 +1,9 @@ /obj/structure/closet/cabinet name = "cabinet" desc = "Old will forever be in fashion." + icon = 'icons/obj/closets/bases/cabinet.dmi' closet_appearance = /decl/closet_appearance/cabinet + door_anim_time = 0 //Unsupported /obj/structure/closet/acloset name = "strange closet" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index e1addc7b2f..4bb49912c9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -1,6 +1,7 @@ /obj/structure/closet/secure_closet/freezer/kitchen name = "kitchen cabinet" req_access = list(access_kitchen) + door_anim_time = 0 //Unsupported starts_with = list( /obj/item/weapon/reagent_containers/food/condiment/flour = 7, @@ -16,6 +17,7 @@ name = "meat fridge" icon = 'icons/obj/closets/fridge.dmi' closet_appearance = null + door_anim_time = 0 //Unsupported starts_with = list( /obj/item/weapon/reagent_containers/food/snacks/meat/monkey = 10) @@ -25,6 +27,7 @@ name = "refrigerator" icon = 'icons/obj/closets/fridge.dmi' closet_appearance = null + door_anim_time = 0 //Unsupported starts_with = list( /obj/item/weapon/reagent_containers/food/drinks/milk = 6, @@ -38,6 +41,7 @@ icon = 'icons/obj/closets/fridge.dmi' closet_appearance = null req_access = list(access_heads_vault) + door_anim_time = 0 //Unsupported starts_with = list( diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 28d16c9f4c..46cb2409d9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -227,6 +227,7 @@ wall_mounted = 1 req_access = list(access_medical_equip) closet_appearance = /decl/closet_appearance/wall/medical + door_anim_time = 0 // Unsupported /obj/structure/closet/secure_closet/medical_wall/pills name = "pill cabinet" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index c95d841301..decec020e7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -26,6 +26,7 @@ /obj/structure/closet/secure_closet/personal/cabinet closet_appearance = /decl/closet_appearance/cabinet/secure + door_anim_time = 0 //Unsupported starts_with = list( /obj/item/weapon/storage/backpack/satchel/withwallet, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index d0fc4ba136..13c547579f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -33,6 +33,7 @@ /obj/item/clothing/under/rank/research_director/rdalt, /obj/item/clothing/under/rank/research_director/dress_rd, /obj/item/clothing/suit/storage/toggle/labcoat, + /obj/item/clothing/suit/storage/toggle/labcoat/rd, /obj/item/weapon/cartridge/rd, /obj/item/clothing/shoes/white, /obj/item/clothing/shoes/laceup/brown, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index caeb616216..fe27bf6db6 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -223,6 +223,7 @@ name = "detective's cabinet" req_access = list(access_forensics_lockers) closet_appearance = /decl/closet_appearance/cabinet/secure + door_anim_time = 0 //Unsupported starts_with = list( /obj/item/clothing/accessory/badge/holo/detective, @@ -295,6 +296,5 @@ GLOBAL_LIST_BOILERPLATE(all_brig_closets, /obj/structure/closet/secure_closet/br req_access = list(access_security) closet_appearance = /decl/closet_appearance/wall density = 1 - - //too small to put a man in - large = 0 + door_anim_time = 0 // Unsupported + large = 0 //too small to put a man in diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 2ea6372aef..81a778d6e2 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -6,6 +6,7 @@ density = 1 anchored = 1 health = 0 //destroying the statue kills the mob within + door_anim_time = 0 // Why is this a closet?? var/intialTox = 0 //these are here to keep the mob from taking damage from things that logically wouldn't affect a rock var/intialFire = 0 //it's a little sloppy I know but it was this or the GODMODE flag. Lesser of two evils. var/intialBrute = 0 @@ -43,7 +44,7 @@ qdel(src) return - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) ..() /obj/structure/closet/statue/process() diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index f4487b0293..25e1e59572 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -186,6 +186,7 @@ anchored = 1 density = 0 wall_mounted = 1 + door_anim_time = 0 // Unsupported starts_with = list( /obj/item/clothing/suit/fire/firefighter, diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm index 22c3f176b4..2dc9664e65 100644 --- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm @@ -10,6 +10,7 @@ anchored = 1 store_mobs = 0 wall_mounted = 1 + door_anim_time = 0 // Unsupported //spawns 2 sets of breathmask, emergency oxy tank and crowbar @@ -68,6 +69,7 @@ wall_mounted = 1 plane = TURF_PLANE layer = ABOVE_TURF_LAYER + door_anim_time = 0 // Unsupported /obj/structure/closet/walllocker_double/north pixel_y = 32 @@ -108,7 +110,7 @@ /obj/structure/closet/walllocker_double/kitchen/east pixel_x = 32 dir = EAST - + /obj/structure/closet/walllocker_double/medical name = "Medical Cabinet" desc = "A wall mounted medical supply cabinet. Probably full of drugs!" //not actually full of drugs, sorry! @@ -129,7 +131,7 @@ /obj/structure/closet/walllocker_double/medical/east pixel_x = 32 dir = EAST - + /obj/structure/closet/walllocker_double/hydrant name = "fire-safety closet" desc = "It's a storage cabinet packed with fire-fighting supplies." diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index c17085bec1..6edd67d2d2 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -7,6 +7,7 @@ closet_appearance = /decl/closet_appearance/crate climbable = 1 dir = 4 //Spawn facing 'forward' by default. + door_anim_time = 0 //Unsupported until appropriate sprites are available var/points_per_crate = 5 var/rigged = 0 diff --git a/code/game/objects/structures/flora/flora.dm b/code/game/objects/structures/flora/flora.dm index 9195de1767..a78a57ddf2 100644 --- a/code/game/objects/structures/flora/flora.dm +++ b/code/game/objects/structures/flora/flora.dm @@ -13,6 +13,7 @@ var/min_x_scale = 0.9 var/min_y_scale = 0.9 + var/removal_tool = /obj/item/weapon/shovel var/harvest_tool = null // The type of item used to harvest the plant. var/harvest_count = 0 @@ -39,21 +40,34 @@ . = ..() if(harvest_count < max_harvests) . += get_harvestable_desc() + if(harvest_tool) + var/obj/item/tool = harvest_tool + . += SPAN_NOTICE("\The [src] can be harvested with \a [initial(tool.name)].") + + if(removal_tool) + var/obj/item/tool = removal_tool + . += SPAN_NOTICE("\The [src] can be removed with \a [initial(tool.name)].") /obj/structure/flora/proc/get_harvestable_desc() return "\The [src] seems to have something hanging from it." /obj/structure/flora/attackby(var/obj/item/weapon/W, var/mob/living/user) + if(can_harvest(W)) var/harvest_spawn = pickweight(harvest_loot) var/atom/movable/AM = spawn_harvest(harvest_spawn, user) - - if(!AM) - to_chat(user, "You fail to harvest anything from \the [src].") - + if(AM) + to_chat(user, SPAN_NOTICE("You harvest \the [AM] from \the [src].")) else - to_chat(user, "You harvest \the [AM] from \the [src].") - return + to_chat(user, SPAN_NOTICE("You fail to harvest anything from \the [src].")) + return + + if(removal_tool && istype(W, removal_tool)) + to_chat(user, SPAN_WARNING("You start uprooting \the [src]...")) + if(do_after(user, 30)) + visible_message(SPAN_NOTICE("\The [user] uproots and discards \the [src]!")) + qdel(src) + return ..(W, user) @@ -408,19 +422,28 @@ desc = "This is a tiny well lit decorative christmas tree." icon_state = "plant-xmas" +/obj/structure/flora/mushroom + name = "mushroom" + desc = "Hey, this one seems like a fun guy." + icon_state = "mush1" + icon = 'icons/obj/flora/mushrooms.dmi' + harvest_loot = list(/obj/item/weapon/reagent_containers/food/snacks/mushroomslice = 1) + harvest_tool = /obj/item/weapon/material/knife + max_harvests = 2 + min_harvests = 0 + +/obj/structure/flora/mushroom/Initialize() + . = ..() + icon_state = "mush[rand(1,4)]" + if(prob(50)) + adjust_scale(-1, 1) + pixel_x = rand(-4, 4) + /obj/structure/flora/sif icon = 'icons/obj/flora/sifflora.dmi' -/obj/structure/flora/sif/attack_hand(mob/user) - if (user.a_intent == I_HURT) - if(do_after(user, 5 SECONDS)) - user.visible_message("\The [user] digs up \the [src.name].", "You dig up \the [src.name].") - qdel(src) - else - user.visible_message("\The [user] pokes \the [src.name].", "You poke \the [src.name].") - /datum/category_item/catalogue/flora/subterranean_bulbs - name = "Sivian Flora - Subterranean Bulbs" + name = "Sivian Flora - Cavebulbs" desc = "A plant which is native to Sif, it continues the trend of being a bioluminescent specimen. These plants \ are generally suited for conditions experienced in caverns, which are generally dark and cold. It is not \ known why this plant evolved to be bioluminescent, however this property has, unintentionally, allowed for \ @@ -433,19 +456,22 @@ value = CATALOGUER_REWARD_EASY /obj/structure/flora/sif/subterranean - name = "subterranean plant" + name = "subterranean bulbs" desc = "This is a subterranean plant. It's bulbous ends glow faintly." icon_state = "glowplant" light_range = 2 light_power = 0.6 light_color = "#FF6633" catalogue_data = list(/datum/category_item/catalogue/flora/subterranean_bulbs) + harvest_loot = list(/obj/item/weapon/reagent_containers/food/snacks/grown/sif/cavebulbs = 1) + harvest_tool = /obj/item/weapon/material/knife + max_harvests = 2 + min_harvests = 0 /obj/structure/flora/sif/subterranean/Initialize() icon_state = "[initial(icon_state)][rand(1,2)]" . = ..() - /datum/category_item/catalogue/flora/eyebulbs name = "Sivian Flora - Eyebulbs" desc = "A plant native to Sif. On the end of its stems are bulbs which visually resemble \ @@ -454,10 +480,14 @@ value = CATALOGUER_REWARD_EASY /obj/structure/flora/sif/eyes - name = "mysterious bulbs" - desc = "This is a mysterious looking plant. They kind of look like eyeballs. Creepy." + name = "eyebulbs" + desc = "This is a mysterious-looking plant. They kind of look like eyeballs. Creepy." icon_state = "eyeplant" catalogue_data = list(/datum/category_item/catalogue/flora/eyebulbs) + harvest_tool = /obj/item/weapon/material/knife + max_harvests = 2 + min_harvests = 0 + harvest_loot = list(/obj/item/weapon/reagent_containers/food/snacks/grown/sif/eyebulbs = 1) /obj/structure/flora/sif/eyes/Initialize() icon_state = "[initial(icon_state)][rand(1,3)]" @@ -471,20 +501,20 @@ value = CATALOGUER_REWARD_TRIVIAL /obj/structure/flora/sif/tendrils - name = "stocky tendrils" + name = "wabback tendrils" desc = "A 'plant' made up of hardened moss. It has tiny hairs that bunch together to look like snow." icon_state = "grass" randomize_size = TRUE catalogue_data = list(/datum/category_item/catalogue/flora/mosstendrils) harvest_tool = /obj/item/weapon/material/knife - max_harvests = 1 - min_harvests = -4 + max_harvests = 3 + min_harvests = 0 harvest_loot = list( - /obj/item/seeds/wabback = 15, - /obj/item/seeds/blackwabback = 1, - /obj/item/seeds/wildwabback = 30 - ) + /obj/item/weapon/reagent_containers/food/snacks/grown/sif/wabback = 15, + /obj/item/weapon/reagent_containers/food/snacks/grown/sif/blackwabback = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/sif/wildwabback = 30 + ) /obj/structure/flora/sif/tendrils/Initialize() icon_state = "[initial(icon_state)][rand(1,3)]" @@ -503,26 +533,24 @@ value = CATALOGUER_REWARD_HARD /obj/structure/flora/sif/frostbelle - name = "gnarly shrub" + name = "frostbelle shrub" desc = "A stocky plant with fins bearing luminescent veins along its branches." - icon_state = "grass" + icon_state = "frostbelle" randomize_size = TRUE catalogue_data = list(/datum/category_item/catalogue/flora/frostbelle) harvest_tool = /obj/item/weapon/material/knife max_harvests = 2 - min_harvests = -4 + min_harvests = 0 harvest_loot = list( /obj/item/weapon/reagent_containers/food/snacks/frostbelle = 1 - ) + ) var/variantnum = null /obj/structure/flora/sif/frostbelle/Initialize() . = ..() - variantnum = rand(1,3) - update_icon() /obj/structure/flora/sif/frostbelle/update_icon() @@ -530,7 +558,6 @@ if(max_harvests > 0 && harvest_count < max_harvests) icon_state = "[initial(icon_state)][variantnum]" - else icon_state = initial(icon_state) diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm index a9f3658ff6..a677e46a0b 100644 --- a/code/game/objects/structures/flora/trees.dm +++ b/code/game/objects/structures/flora/trees.dm @@ -271,12 +271,12 @@ harvest_tool = /obj/item/weapon/material/knife max_harvests = 2 - min_harvests = -4 + min_harvests = 0 harvest_loot = list( /obj/item/weapon/reagent_containers/food/snacks/siffruit = 20, - /obj/item/weapon/reagent_containers/food/snacks/grown/sifpod = 5, + /obj/item/weapon/reagent_containers/food/snacks/grown/sif/sifpod = 5, /obj/item/seeds/sifbulb = 1 - ) + ) var/light_shift = 0 diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 9066187d15..1cf2202e32 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -126,6 +126,13 @@ playsound(src, W.usesound, 100, 1) remove_padding() + else if(istype(W, /obj/item/weapon/disk) || (istype(W, /obj/item/toy/plushie))) + user.drop_from_inventory(W, get_turf(src)) + W.pixel_x = 10 //make sure they reach the pillow + W.pixel_y = -6 + if(istype(W, /obj/item/weapon/disk)) + user.visible_message("[src] sleeps soundly. Sleep tight, disky.") + else if(istype(W, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = W var/mob/living/affecting = G.affecting diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index a0e9c714d9..3d06376a8b 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -383,6 +383,41 @@ base_icon = "corp_sofacorner" corner_piece = TRUE +//Metal benches + +/obj/structure/bed/chair/sofa/bench + name = "metal bench" + desc = "Almost as comfortable as waiting at a shuttle station for hours on end." + base_icon = "benchmiddle" + icon_state = "benchmiddle" + applies_material_colour = FALSE + color = null + var/padding_color = "#CC0000" + +/obj/structure/bed/chair/sofa/bench/Initialize() + . = ..() + var/mutable_appearance/MA + MA = mutable_appearance(icon, icon_state = "o[icon_state]") + // If we're north-facing, metal goes above mob, padding overlay goes below mob. + if((dir & NORTH) && !corner_piece) + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER + MA.color = padding_color + add_overlay(MA) + +/obj/structure/bed/chair/sofa/bench/left + icon_state = "bench_left" + base_icon = "bench_left" + +/obj/structure/bed/chair/sofa/bench/right + icon_state = "bench_right" + base_icon = "bench_right" + +/obj/structure/bed/chair/sofa/bench/corner + icon_state = "benchcorner" + base_icon = "benchcorner" + + //color variations /obj/structure/bed/chair/sofa @@ -517,4 +552,4 @@ icon_state = "sofaend_right" /obj/structure/bed/chair/sofa/orange/corner - icon_state = "sofacorner" + icon_state = "sofacorner" \ No newline at end of file diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index df5fe16aa7..da8f5d439d 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -143,7 +143,7 @@ var/list/flooring_types /decl/flooring/grass/sif // Subtype for Sif's grass. name = "growth" desc = "A natural moss that has adapted to the sheer cold climate." - flags = TURF_REMOVE_SHOVEL + flags = 0 icon = 'icons/turf/outdoors.dmi' icon_base = "grass_sif" build_type = /obj/item/stack/tile/grass/sif @@ -152,7 +152,7 @@ var/list/flooring_types /decl/flooring/grass/sif/forest name = "thick growth" desc = "A natural moss that has adapted to the sheer cold climate." - flags = TURF_REMOVE_SHOVEL + flags = 0 icon = 'icons/turf/outdoors.dmi' icon_base = "grass_sif_dark" build_type = /obj/item/stack/tile/grass/sif/forest diff --git a/code/game/turfs/simulated/outdoors/dirt.dm b/code/game/turfs/simulated/outdoors/dirt.dm index 63d4aa2887..4d1de09764 100644 --- a/code/game/turfs/simulated/outdoors/dirt.dm +++ b/code/game/turfs/simulated/outdoors/dirt.dm @@ -4,4 +4,66 @@ icon_state = "dirt-dark" edge_blending_priority = 2 turf_layers = list(/turf/simulated/floor/outdoors/rocks) - initial_flooring = /decl/flooring/dirt \ No newline at end of file + initial_flooring = /decl/flooring/dirt + can_dig = TRUE + +/turf/simulated/floor/outdoors/newdirt + name = "dirt" + desc = "Looks dirty." + icon = 'icons/turf/outdoors.dmi' + icon_state = "dirt0" + edge_blending_priority = 2 + initial_flooring = /decl/flooring/outdoors/newdirt + can_dig = TRUE + var/static/possibledirts = list( + "dirt0" = 150, + "dirt1" = 25, + "dirt2" = 25, + "dirt3" = 10, + "dirt4" = 3, + "dirt5" = 3, + "dirt6" = 1, + "dirt7" = 25, + "dirt8" = 10, + "dirt9" = 25 + ) + +/decl/flooring/outdoors/newdirt + name = "dirt" + desc = "Looks dirty." + icon = 'icons/turf/outdoors.dmi' + icon_base = "dirt0" + footstep_sounds = list("human" = list( + 'sound/effects/footstep/asteroid1.ogg', + 'sound/effects/footstep/asteroid2.ogg', + 'sound/effects/footstep/asteroid3.ogg', + 'sound/effects/footstep/asteroid4.ogg', + 'sound/effects/footstep/asteroid5.ogg', + 'sound/effects/footstep/MedDirt1.ogg', + 'sound/effects/footstep/MedDirt2.ogg', + 'sound/effects/footstep/MedDirt3.ogg', + 'sound/effects/footstep/MedDirt4.ogg')) + +/turf/simulated/floor/outdoors/newdirt/Initialize(mapload) + flooring_override = pickweight(possibledirts) + return ..() + + +/turf/simulated/floor/outdoors/newdirt_nograss + name = "dirt" + desc = "Looks dirty." + icon = 'icons/turf/outdoors.dmi' + icon_state = "dirt0" + edge_blending_priority = 2 + initial_flooring = /decl/flooring/outdoors/newdirt + var/static/possibledirts = list( + "dirt0" = 200, + "dirt3" = 20, + "dirt4" = 3, + "dirt5" = 3, + "dirt6" = 1 + ) + +/turf/simulated/floor/outdoors/newdirt_nograss/Initialize(mapload) + flooring_override = pickweight(possibledirts) + return ..() diff --git a/code/game/turfs/simulated/outdoors/grass.dm b/code/game/turfs/simulated/outdoors/grass.dm index 327d2baf91..181ee57c4f 100644 --- a/code/game/turfs/simulated/outdoors/grass.dm +++ b/code/game/turfs/simulated/outdoors/grass.dm @@ -7,6 +7,7 @@ var/list/grass_types = list( icon_state = "grass0" edge_blending_priority = 4 initial_flooring = /decl/flooring/grass + can_dig = TRUE turf_layers = list( /turf/simulated/floor/outdoors/rocks, /turf/simulated/floor/outdoors/dirt @@ -42,7 +43,6 @@ var/list/grass_types = list( var/tree_chance = 2 /* animal_chance = 0.5 - animal_types = list( /mob/living/simple_mob/animal/sif/diyaab = 10, /mob/living/simple_mob/animal/sif/glitterfly = 2, @@ -94,4 +94,4 @@ var/list/grass_types = list( /obj/structure/flora/sif/frostbelle = 1, /obj/structure/flora/sif/eyes = 5, /obj/structure/flora/sif/tendrils = 30 - ) + ) \ No newline at end of file diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm index cfed9385c6..f565b15e5f 100644 --- a/code/game/turfs/simulated/outdoors/outdoors.dm +++ b/code/game/turfs/simulated/outdoors/outdoors.dm @@ -24,6 +24,42 @@ var/list/turf_edge_cache = list() // When a turf gets demoted or promoted, this list gets adjusted. The top-most layer is the layer on the bottom of the list, due to how pop() works. var/list/turf_layers = list(/turf/simulated/floor/outdoors/rocks) + var/can_dig = FALSE + var/loot_count + +/turf/simulated/floor/outdoors/proc/get_loot_type() + if(loot_count && prob(60)) + return pick( \ + 12;/obj/item/weapon/reagent_containers/food/snacks/worm, \ + 1;/obj/item/weapon/material/knife/machete/hatchet/stone \ + ) + +/turf/simulated/floor/outdoors/Initialize(mapload) + . = ..() + if(can_dig && prob(33)) + loot_count = rand(1,3) + +/turf/simulated/floor/outdoors/attackby(obj/item/C, mob/user) + + if(can_dig && istype(C, /obj/item/weapon/shovel)) + to_chat(user, SPAN_NOTICE("\The [user] begins digging into \the [src] with \the [C].")) + var/delay = (3 SECONDS * C.toolspeed) + user.setClickCooldown(delay) + if(do_after(user, delay, src)) + if(!(locate(/obj/machinery/portable_atmospherics/hydroponics/soil) in contents)) + var/obj/machinery/portable_atmospherics/hydroponics/soil/soil = new(src) + user.visible_message(SPAN_NOTICE("\The [src] digs \a [soil] into \the [src].")) + else + var/loot_type = get_loot_type() + if(loot_type) + loot_count-- + var/obj/item/loot = new loot_type(src) + to_chat(user, SPAN_NOTICE("You dug up \a [loot]!")) + else + to_chat(user, SPAN_NOTICE("You didn't find anything of note in \the [src].")) + return + + . = ..() /turf/simulated/floor/Initialize(mapload) if(is_outdoors()) @@ -80,6 +116,7 @@ var/list/turf_edge_cache = list() icon_state = "mud_dark" edge_blending_priority = 3 initial_flooring = /decl/flooring/mud + can_dig = TRUE /turf/simulated/floor/outdoors/rocks name = "rocks" diff --git a/code/game/turfs/simulated/outdoors/outdoors_attackby.dm b/code/game/turfs/simulated/outdoors/outdoors_attackby.dm index a59676834f..1a969fee98 100644 --- a/code/game/turfs/simulated/outdoors/outdoors_attackby.dm +++ b/code/game/turfs/simulated/outdoors/outdoors_attackby.dm @@ -1,15 +1,7 @@ // this code here enables people to dig up worms from certain tiles. /turf/simulated/floor/outdoors/grass/attackby(obj/item/weapon/S as obj, mob/user as mob) - if(istype(S, /obj/item/weapon/shovel)) - to_chat(user, "You begin to dig in \the [src] with your [S].") - if(do_after(user, 4 SECONDS * S.toolspeed)) - to_chat(user, "\The [src] has been dug up, a worm pops from the ground.") - new /obj/item/weapon/reagent_containers/food/snacks/worm(src) - else - to_chat(user, "You decide to not finish digging in \the [src].") - else if(istype(S, /obj/item/stack/tile/floor)) + if(istype(S, /obj/item/stack/tile/floor)) ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE) return - else - ..() \ No newline at end of file + . = ..() \ No newline at end of file diff --git a/code/game/turfs/simulated/outdoors/sidewalk.dm b/code/game/turfs/simulated/outdoors/sidewalk.dm new file mode 100644 index 0000000000..78aa5fca6a --- /dev/null +++ b/code/game/turfs/simulated/outdoors/sidewalk.dm @@ -0,0 +1,42 @@ +/turf/simulated/floor/outdoors/sidewalk + name = "sidewalk" + desc = "Concrete shaped into a path!" + icon = 'icons/turf/outdoors.dmi' + icon_state = "sidewalk" + edge_blending_priority = 1 + movement_cost = -0.5 + initial_flooring = /decl/flooring/outdoors/sidewalk + var/static/possibledirts = list( + "" = 150, + "1" = 3, + "2" = 3, + "3" = 3, + "4" = 3, + "5" = 3, + "6" = 2, + "7" = 2, + "8" = 2, + "9" = 2, + "10" = 2 + ) + +/decl/flooring/outdoors/sidewalk + name = "sidewalk" + desc = "Concrete shaped into a path!" + icon = 'icons/turf/outdoors.dmi' + icon_base = "sidewalk" + footstep_sounds = list("human" = list( + 'sound/effects/footstep/LightStone1.ogg', + 'sound/effects/footstep/LightStone2.ogg', + 'sound/effects/footstep/LightStone3.ogg', + 'sound/effects/footstep/LightStone4.ogg',)) + +/turf/simulated/floor/outdoors/sidewalk/Initialize(mapload) + flooring_override = "[initial(icon_state)][pickweight(possibledirts)]" + return ..() + +/turf/simulated/floor/outdoors/sidewalk/side + icon_state = "side-walk" + +/turf/simulated/floor/outdoors/sidewalk/slab + icon_state = "slab" \ No newline at end of file diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 6aa06ef4ec..eecae83186 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -132,6 +132,8 @@ corpseshoes = /obj/item/clothing/shoes/black random_species = TRUE + + /obj/effect/landmark/corpse/chef name = "Chef" corpseuniform = /obj/item/clothing/under/rank/chef @@ -198,7 +200,7 @@ corpseid = 1 corpseidjob = "Scientist" corpseidaccess = "Scientist" - + /obj/effect/landmark/corpse/security name = "Security Officer" corpseradio = /obj/item/device/radio/headset/headset_sec @@ -212,18 +214,18 @@ corpseid = 1 corpseidjob = "Security Officer" corpseidaccess = "Security Officer" - + /obj/effect/landmark/corpse/security/rig corpsesuit = /obj/item/clothing/suit/space/void/security corpsemask = /obj/item/clothing/mask/breath corpsehelmet = /obj/item/clothing/head/helmet/space/void/security corpseback = /obj/item/weapon/tank/jetpack/oxygen - + /obj/effect/landmark/corpse/security/rig/eva corpsesuit = /obj/item/clothing/suit/space/void/security/alt corpsehelmet = /obj/item/clothing/head/helmet/space/void/security/alt corpseidjob = "Starship Security Officer" - + /obj/effect/landmark/corpse/prisoner name = "Unknown Prisoner" corpseuniform = /obj/item/clothing/under/color/prison @@ -247,7 +249,7 @@ corpsemask = /obj/item/clothing/mask/breath corpsehelmet = /obj/item/clothing/head/helmet/space/void/mining corpseback = /obj/item/weapon/tank/oxygen - + /////////////////Vintage////////////////////// //define the basic props at this level and only change specifics for variants, e.z. @@ -337,3 +339,41 @@ corpseid = 1 corpseidjob = "Commander" corpseidaccess = "Captain" + +/////////////////Lore Factions////////////////////// + +/obj/effect/landmark/corpse/sifguard + name = "Patrolman" + corpseuniform = /obj/item/clothing/under/solgov/utility/sifguard + corpsesuit = /obj/item/clothing/suit/storage/hooded/wintercoat/solgov + corpsebelt = /obj/item/weapon/storage/belt/security/tactical + corpseglasses = /obj/item/clothing/glasses/sunglasses/sechud + corpsemask = /obj/item/clothing/mask/balaclava + corpsehelmet = /obj/item/clothing/head/beret/solgov/sifguard + corpsegloves = /obj/item/clothing/gloves/duty + corpseshoes = /obj/item/clothing/shoes/boots/tactical + corpsepocket1 = /obj/item/clothing/accessory/armor/tag/sifguard + corpseid = 1 + corpseidjob = "Sif Defense Force Patrolman" + +/obj/effect/landmark/corpse/hedberg + name = "Hedberg-Hammarstrom Mercenary" + corpseuniform = /obj/item/clothing/under/solgov/utility/sifguard + corpsesuit = /obj/item/clothing/suit/storage/vest/solgov/hedberg + corpsebelt = /obj/item/weapon/storage/belt/security + corpseglasses = /obj/item/clothing/glasses/sunglasses/sechud + corpsehelmet = /obj/item/clothing/head/beret/corp/hedberg + corpseshoes = /obj/item/clothing/shoes/boots/jackboots + corpseid = 1 + corpseidjob = "Hedberg-Hammarstrom Officer" + +/obj/effect/landmark/corpse/hedberg/merc + name = "Hedberg-Hammarstrom Mercenary" + corpsebelt = /obj/item/weapon/storage/belt/security/tactical + corpseglasses = /obj/item/clothing/glasses/sunglasses/sechud + corpsehelmet = /obj/item/clothing/head/helmet/flexitac + corpsegloves = /obj/item/clothing/gloves/combat + corpseshoes = /obj/item/clothing/shoes/boots/tactical + corpseid = 1 + corpseidjob = "Hedberg-Hammarstrom Enforcer" + diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm index f213c15a8a..f19db59085 100644 --- a/code/modules/client/preference_setup/global/02_settings.dm +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -9,6 +9,7 @@ /datum/category_item/player_setup_item/player_global/settings/load_preferences(var/savefile/S) S["lastchangelog"] >> pref.lastchangelog S["lastnews"] >> pref.lastnews + S["lastlorenews"] >> pref.lastlorenews S["default_slot"] >> pref.default_slot S["preferences"] >> pref.preferences_enabled S["preferences_disabled"] >> pref.preferences_disabled @@ -16,6 +17,7 @@ /datum/category_item/player_setup_item/player_global/settings/save_preferences(var/savefile/S) S["lastchangelog"] << pref.lastchangelog S["lastnews"] << pref.lastnews + S["lastlorenews"] << pref.lastlorenews S["default_slot"] << pref.default_slot S["preferences"] << pref.preferences_enabled S["preferences_disabled"] << pref.preferences_disabled diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm index c428801f62..e57d527e6d 100644 --- a/code/modules/client/preference_setup/global/setting_datums.dm +++ b/code/modules/client/preference_setup/global/setting_datums.dm @@ -253,6 +253,12 @@ var/list/_client_preferences_by_type enabled_description = "Show" disabled_description = "Hide" +/datum/client_preference/radio_sounds + description = "Radio Sounds" + key = "RADIO_SOUNDS" + enabled_description = "On" + disabled_description = "Off" + /datum/client_preference/runechat_mob description = "Runechat (Mobs)" key = "RUNECHAT_MOB" @@ -285,6 +291,13 @@ var/list/_client_preferences_by_type var/datum/plane_holder/PH = preference_mob.plane_holder PH.set_vis(VIS_STATUS, enabled) +/datum/client_preference/show_lore_news + description = "Lore News Popup" + key = "NEWS_POPUP" + enabled_by_default = TRUE + enabled_description = "Popup New On Login" + disabled_description = "Do Nothing" + /******************** * Staff Preferences * ********************/ diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index 84ab99557e..475466986c 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -287,3 +287,11 @@ /datum/gear/accessory/asymovercoat display_name = "orange asymmetrical overcoat" path = /obj/item/clothing/accessory/asymovercoat + +/datum/gear/accessory/virginkiller + display_name = "virgin killer sweater (colorable)" + path = /obj/item/clothing/accessory/sweater/virgin + +/datum/gear/accessory/virginkiller/New() + ..() + gear_tweaks += gear_tweak_free_color_choice diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index 2513757c1c..67bfd7c7de 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -203,6 +203,10 @@ display_name = "hat, tophat" path = /obj/item/clothing/head/that +/datum/gear/head/panama + display_name = "hat, panama" + path = /obj/item/clothing/head/panama + /datum/gear/head/wig/philosopher display_name = "natural philosopher's wig" path = /obj/item/clothing/head/philosopher_wig diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 3f79abe352..dfcd6457fa 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -38,6 +38,10 @@ display_name = "bomber jacket 2" path = /obj/item/clothing/suit/storage/bomber/alt +/datum/gear/suit/bomber_retro + display_name = "bomber jacket, retro" + path = /obj/item/clothing/suit/storage/toggle/bomber/retro + /datum/gear/suit/leather_jacket display_name = "leather jacket, black" path = /obj/item/clothing/suit/storage/toggle/leather_jacket @@ -166,6 +170,11 @@ display_name = "labcoat, yellow" path = /obj/item/clothing/suit/storage/toggle/labcoat/yellow +/datum/gear/suit/labcoat/rd + display_name = "labcoat, research director (RD)" + path = /obj/item/clothing/suit/storage/toggle/labcoat/rd + allowed_roles = list("Research Director") + /datum/gear/suit/labcoat/emt display_name = "labcoat, EMT (Medical)" path = /obj/item/clothing/suit/storage/toggle/labcoat/emt @@ -559,6 +568,18 @@ display_name = "department jacket, medical" path = /obj/item/clothing/suit/storage/toggle/med_dep_jacket +/datum/gear/suit/miscellaneous/light_jacket + display_name = "light jacket selection" + path = /obj/item/clothing/suit/storage/toggle/light_jacket + +/datum/gear/suit/miscellaneous/light_jacket/New() + ..() + var/list/jacket = list( + "grey light jacket" = /obj/item/clothing/suit/storage/toggle/light_jacket, + "dark blue light jacket" = /obj/item/clothing/suit/storage/toggle/light_jacket/blue + ) + gear_tweaks += new/datum/gear_tweak/path(jacket) + /datum/gear/suit/miscellaneous/peacoat display_name = "peacoat" path = /obj/item/clothing/suit/storage/toggle/peacoat diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index 40411684f3..852e5de758 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -33,6 +33,10 @@ croptops[initial(croptop_type.name)] = croptop_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(croptops)) +/datum/gear/uniform/cropsweater + display_name = "cropped sweater" + path = /obj/item/clothing/under/wednesday + /datum/gear/uniform/kilt display_name = "kilt" path = /obj/item/clothing/under/kilt @@ -57,6 +61,22 @@ jumpclothes[initial(jumps.name)] = jumps gear_tweaks += new/datum/gear_tweak/path(sortAssoc(jumpclothes)) +/datum/gear/uniform/qipao + display_name = "qipao" + path = /obj/item/clothing/under/qipao + +/datum/gear/uniform/qipao/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/uniform/qipao2 + display_name = "qipao, slim" + path = /obj/item/clothing/under/qipao2 + +/datum/gear/uniform/qipao2/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + /datum/gear/uniform/skirt display_name = "skirt selection" path = /obj/item/clothing/under/skirt @@ -247,6 +267,11 @@ display_name = "suit, white skirt" path = /obj/item/clothing/under/scratch/skirt +/datum/gear/uniform/suit/detectiveblack + display_name = "suit, detective black (Detective)" + path = /obj/item/clothing/under/det/black_alt + allowed_roles = list("Detective") + /datum/gear/uniform/suit/detectiveskirt display_name = "suit, detective skirt (Detective)" path = /obj/item/clothing/under/det/skirt @@ -409,43 +434,98 @@ display_name = "utility, grey" path = /obj/item/clothing/under/utility/grey +/datum/gear/uniform/utility/gsa + display_name = "utility, galactic survey" + path = /obj/item/clothing/under/gsa + +/datum/gear/uniform/utility/gsa_work + display_name = "heavy utility, galactic survey" + path = /obj/item/clothing/under/gsa_work + /datum/gear/uniform/sweater display_name = "sweater, grey" path = /obj/item/clothing/under/rank/psych/turtleneck/sweater +/datum/gear/uniform/sweaterretro + display_name = "sweater, retro" + path = /obj/item/clothing/under/retrosweater + /datum/gear/uniform/brandsuit/aether display_name = "jumpsuit, aether" - path = /obj/item/clothing/under/aether + path = /obj/item/clothing/under/corp/aether + +/datum/gear/uniform/brandsuit/centauri + display_name = "jumpsuit, centauri provisions" + path = /obj/item/clothing/under/corp/centauri /datum/gear/uniform/brandsuit/focal - display_name = "jumpsuit, focal" - path = /obj/item/clothing/under/focal - -/datum/gear/uniform/mbill - display_name = "outfit, major bill's" - path = /obj/item/clothing/under/mbill - -/datum/gear/uniform/pcrc - display_name = "uniform, PCRC (Security)" - path = /obj/item/clothing/under/pcrc - allowed_roles = list("Security Officer","Head of Security","Warden") + display_name = "jumpsuit, focal point" + path = /obj/item/clothing/under/corp/focal /datum/gear/uniform/brandsuit/grayson display_name = "outfit, grayson" - path = /obj/item/clothing/under/grayson + path = /obj/item/clothing/under/corp/grayson + +/datum/gear/uniform/brandsuit/grayson_jump + display_name = "jumpsuit, grayson" + path = /obj/item/clothing/under/corp/grayson + +/datum/gear/uniform/brandsuit/hedberg + display_name = "uniform, hedberg officer (Security)" + path = /obj/item/clothing/under/hedberg + allowed_roles = list("Security Officer","Head of Security","Warden") + +/datum/gear/uniform/brandsuit/hedbergtech + display_name = "jumpsuit, hedberg technician" + path = /obj/item/clothing/under/hedbergtech + +/datum/gear/uniform/brandsuit/hephaestus + display_name = "jumpsuit, hephaestus" + path = /obj/item/clothing/under/corp/hephaestus + +/datum/gear/uniform/brandsuit/kaleidoscope + display_name = "outfit, kaleidoscope (Science)" + path = /obj/item/clothing/under/corp/kaleidoscope + allowed_roles = list("Research Director","Scientist","Xenobiologist") + +/datum/gear/uniform/mbill + display_name = "outfit, major bill's" + path = /obj/item/clothing/under/corp/mbill + +/datum/gear/uniform/mbill_flight + display_name = "flight suit, major bill's" + path = /obj/item/clothing/under/corp/mbill_flight + +/datum/gear/uniform/brandsuit/morpheus + display_name = "jumpsuit, morpheus" + path = /obj/item/clothing/under/corp/morpheus + +/datum/gear/uniform/pcrc + display_name = "uniform, PCRC (Security)" + path = /obj/item/clothing/under/corp/pcrc + allowed_roles = list("Security Officer","Head of Security","Warden") /datum/gear/uniform/brandsuit/wardt display_name = "jumpsuit, ward-takahashi" - path = /obj/item/clothing/under/wardt + path = /obj/item/clothing/under/corp/wardt + +/datum/gear/uniform/brandsuit/wulf + display_name = "jumpsuit, wulf" + path = /obj/item/clothing/under/corp/wulf + +/datum/gear/uniform/brandsuit/vedmed + display_name = "jumpsuit, vey-med (Medical)" + path = /obj/item/clothing/under/corp/veymed + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic") + +/datum/gear/uniform/brandsuit/zenghu + display_name = "jumpsuit, zeng-hu" + path = /obj/item/clothing/under/corp/zenghu /datum/gear/uniform/frontier display_name = "outfit, frontier" path = /obj/item/clothing/under/frontier -/datum/gear/uniform/brandsuit/hephaestus - display_name = "jumpsuit, hephaestus" - path = /obj/item/clothing/under/hephaestus - /datum/gear/uniform/yogapants display_name = "yoga pants" path = /obj/item/clothing/under/pants/yogapants @@ -474,6 +554,10 @@ display_name = "flamenco dress" path = /obj/item/clothing/under/dress/flamenco +/datum/gear/uniform/alpinedress + display_name = "alpine dress" + path = /obj/item/clothing/under/dress/alpine + /datum/gear/uniform/westernbustle display_name = "western bustle" path = /obj/item/clothing/under/dress/westernbustle @@ -542,6 +626,14 @@ display_name = "little black dress" path = /obj/item/clothing/under/dress/littleblackdress +/datum/gear/uniform/golddress + display_name = "golden dress" + path =/obj/item/clothing/under/dress/golddress + +/datum/gear/uniform/goldwrap + display_name = "golden wrap" + path =/obj/item/clothing/under/dress/goldwrap + /datum/gear/uniform/pinktutu display_name = "pink tutu" path = /obj/item/clothing/under/dress/pinktutu @@ -652,4 +744,8 @@ /datum/gear/uniform/countess display_name = "countess dress" - path = /obj/item/clothing/under/dress/countess \ No newline at end of file + path = /obj/item/clothing/under/dress/countess + +/datum/gear/uniform/vampire + display_name = "high-waisted trousers" + path = /obj/item/clothing/under/hightrousers \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 3200e1e192..cccb9eb2e5 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -139,6 +139,7 @@ var/list/preferences_datums = list() var/datum/browser/panel var/lastnews // Hash of last seen lobby news content. + var/lastlorenews //ID of last seen lore news article. var/examine_text_mode = 0 // Just examine text, include usage (description_info), switch to examine panel. var/multilingual_mode = 0 // Default behaviour, delimiter-key-space, delimiter-key-delimiter, off diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm index c89ea499af..0888f09116 100644 --- a/code/modules/client/preferences_toggle_procs.dm +++ b/code/modules/client/preferences_toggle_procs.dm @@ -238,7 +238,7 @@ SScharacter_setup.queue_preferences_save(prefs) feedback_add_details("admin_verb","TAirPumpNoise") - + /client/verb/toggle_old_door_sounds() set name = "Toggle Old Door Sounds" set category = "Preferences" @@ -253,7 +253,7 @@ SScharacter_setup.queue_preferences_save(prefs) feedback_add_details("admin_verb","TOldDoorSounds") - + /client/verb/toggle_department_door_sounds() set name = "Toggle Department Door Sounds" set category = "Preferences" @@ -378,6 +378,19 @@ feedback_add_details("admin_verb","TStatusIndicators") +/client/verb/toggle_radio_sounds() + set name = "Toggle Radio Sounds" + set category = "Preferences" + set desc = "Enable/Disable hearing a sound when somebody speaks over your headset." + + var/pref_path = /datum/client_preference/radio_sounds + toggle_preference(pref_path) + SScharacter_setup.queue_preferences_save(prefs) + + to_chat(src, "You will now [(is_preference_enabled(/datum/client_preference/radio_sounds)) ? "hear" : "not hear"] radio sounds.") + + feedback_add_details("admin_verb","TRadioSounds") + // Not attached to a pref datum because those are strict binary toggles /client/verb/toggle_examine_mode() set name = "Toggle Examine Mode" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 8636b5b606..9f5ce96020 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -103,6 +103,11 @@ siemens_coefficient = 0.9 body_parts_covered = 0 +/obj/item/clothing/head/panama + name = "panama hat" + icon_state = "panama" + desc = "Columbian Pure." + /obj/item/clothing/head/redcoat name = "redcoat's hat" icon_state = "redcoat" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index bcb3ba80c5..b8151b7743 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -145,7 +145,7 @@ /obj/item/clothing/shoes/athletic name = "athletic shoes" - desc = "A pair of sleek atheletic shoes. Made by and for the sporty types." + desc = "A pair of sleek athletic shoes. Made by and for the sporty types." icon_state = "sportshoe" addblends = "sportshoe_a" item_state_slots = list(slot_r_hand_str = "sportheld", slot_l_hand_str = "sportheld") diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 2560692656..454ba703ed 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -64,6 +64,12 @@ icon_state = "labcoat_cmoalt" item_state_slots = list(slot_r_hand_str = "cmo_labcoat", slot_l_hand_str = "cmo_labcoat") +/obj/item/clothing/suit/storage/toggle/labcoat/rd + name = "research director's labcoat" + desc = "A retro labcoat suitable for only the most eccentric scientists on the payroll." + icon_state = "labcoat_rd" + item_state_slots = list(slot_r_hand_str = "genetics_labcoat", slot_l_hand_str = "genetics_labcoat") + /obj/item/clothing/suit/storage/toggle/labcoat/mad name = "The Mad's labcoat" desc = "It makes you look capable of konking someone on the noggin and shooting them into space." @@ -95,6 +101,12 @@ icon_state = "labcoat_tox" item_state_slots = list(slot_r_hand_str = "science_labcoat", slot_l_hand_str = "science_labcoat") +/obj/item/clothing/suit/storage/toggle/labcoat/roboticist + name = "roboticist labcoat" + desc = "More like an eccentric coat than a labcoat. Helps pass off bloodstains as part of the aesthetic. Comes with red shoulder pads." + icon_state = "labcoat_robo" + item_state_slots = list(slot_r_hand_str = "labcoat", slot_l_hand_str = "labcoat") + /obj/item/clothing/suit/storage/toggle/labcoat/emt name = "EMT's labcoat" desc = "A dark blue labcoat with reflective strips for emergency medical technicians." diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 239accf6d8..6792e308b5 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -464,6 +464,11 @@ min_cold_protection_temperature = T0C - 20 siemens_coefficient = 0.7 +/obj/item/clothing/suit/storage/toggle/bomber/retro + name = "retro bomber jacket" + desc = "A retro style, fur-lined leather bomber jacket that invokes the early days of space exploration when spacemen were spacemen, and laser guns had funny little antennae on them." + icon_state = "retro_bomber" + /obj/item/clothing/suit/storage/bomber/alt name = "bomber jacket" desc = "A thick, well-worn WW2 leather bomber jacket." @@ -715,6 +720,19 @@ item_state_slots = list(slot_r_hand_str = "med_dep_jacket", slot_l_hand_str = "med_dep_jacket") flags_inv = HIDEHOLSTER +/obj/item/clothing/suit/storage/toggle/light_jacket + name = "grey light jacket" + desc = "A light, cozy jacket. Now in grey." + icon_state = "grey_dep_jacket" + item_state_slots = list(slot_r_hand_str = "grey_dep_jacket", slot_l_hand_str = "grey_dep_jacket") + flags_inv = HIDEHOLSTER + +/obj/item/clothing/suit/storage/toggle/light_jacket/blue + name = "dark blue light jacket" + desc = "A light, cozy jacket. Now in dark blue." + icon_state = "blue_dep_jacket" + item_state_slots = list(slot_r_hand_str = "blue_dep_jacket", slot_l_hand_str = "blue_dep_jacket") + /* * Track Jackets */ diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index e31086c659..bd642de1a2 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -435,4 +435,5 @@ name = "sash" desc = "A plain, unadorned sash." icon_state = "sash" - slot = ACCESSORY_SLOT_OVER \ No newline at end of file + slot = ACCESSORY_SLOT_OVER + diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index 97f9bd2c57..a6caa94ac0 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -376,6 +376,13 @@ desc = "A comfortable turtleneck in a dark red." icon_state = "turtleneck_red" +/obj/item/clothing/accessory/sweater/virgin + name = "virgin killer" + desc = "A knit sweater that leaves little to the imagination." + icon_state = "virginkiller" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + + //*** // End of sweaters //*** diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index c675c1b68c..17c4e01b1b 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -133,6 +133,21 @@ icon_state = "black_suit_fem" item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black") +/obj/item/clothing/under/lawyer/modern + name = "black modern suit" + icon_state = "modern_suit_m" + index = 1 + +/obj/item/clothing/under/lawyer/modern/skirt + name = "black modern skirt" + icon_state = "modern_suit_f" + index = 1 + +/obj/item/clothing/under/lawyer/trimskirt + name = "blue-trim skirt" + icon_state = "trim_skirtsuit" + index = 1 + /obj/item/clothing/under/lawyer/red name = "red lawyer suit" icon_state = "lawyer_red" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 40d8e12afd..67b2c4b4e0 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -104,6 +104,11 @@ desc = "An immaculate white dress shirt, paired with a pair of dark grey dress pants, a red tie, and a charcoal vest." starting_accessories = list(/obj/item/clothing/accessory/tie/red_long, /obj/item/clothing/accessory/vest) +/obj/item/clothing/under/det/black_alt + icon_state = "detective_black" + item_state_slots = list(slot_r_hand_str = "sl_suit", slot_l_hand_str = "sl_suit") + desc = "An immaculate white dress shirt, paired with a pair of black dress pants, a red tie, and a black vest." + /obj/item/clothing/under/det/corporate name = "detective's jumpsuit" icon_state = "det_corporate" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 46c340203b..bcca912dcc 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -572,6 +572,31 @@ icon_state = "countess" index = 1 +/obj/item/clothing/under/dress/goddess + name = "goddess dress" + desc = "A blue and orange dress fit for a goddess." + icon_state = "goddess" + index = 1 + +/obj/item/clothing/under/dress/alpine + name = "alpine dress" + desc = "A green and white dress that makes you want to yodel." + icon_state = "corsetdress" + index = 1 + +/obj/item/clothing/under/dress/goldwrap + name = "golden dress" + desc = "A dress so ostentatious that you feel poorer just looking at it." + icon_state = "golddress" + index = 1 + +/obj/item/clothing/under/dress/golddress + name = "golden wrap" + desc = "An outfit so ostentatious that you feel poorer just looking at it." + icon_state = "goldwrap" + index = 1 + + /* * wedding stuff */ @@ -813,6 +838,18 @@ Uniforms and such desc = "It is a dark blue cheongsam dress." icon_state = "cheongsam-darkblue" +/obj/item/clothing/under/qipao + name = "qipao" + desc = "A traditional Chinese women's garment, typically made from silk." + icon_state = "qipao" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + +/obj/item/clothing/under/qipao2 + name = "slim qipao" + desc = "A traditional Chinese women's garment, typically made from silk. This one is fairly slim." + icon_state = "qipao2" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + /obj/item/clothing/under/blazer name = "blue blazer" desc = "A bold but yet conservative outfit, red corduroys, navy blazer and a tie." @@ -865,6 +902,12 @@ Uniforms and such desc = "Jean shorts and a black halter top. Perfect for casual Fridays!" icon_state = "haltertop" +/obj/item/clothing/under/wednesday + name = "cropped sweater skirt" + desc = "A cropped green sweater and matching miniskirt." + icon_state = "wednesday" + index = 1 + /obj/item/clothing/under/rippedpunk name = "ripped punk jeans" desc = "Black ripped jeans and a fishnet top. How punk." @@ -969,6 +1012,26 @@ Uniforms and such desc = "No honest man would wear this abomination" icon_state = "mankini" +/obj/item/clothing/under/wetsuit + name = "wetsuit" + desc = "For when you need to scuba dive your way into an enemy base." + icon_state = "wetsuit" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + +/obj/item/clothing/under/wetsuit_skimpy + name = "tactical wetsuit" + desc = "For when you need to scuba dive your way into an enemy base but still want to show off a little skin." + icon_state = "wetsuit_skimpy" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + +/obj/item/clothing/under/wetsuit_rec + name = "recreational wetsuit" + desc = "For when you need to kayak your way into an enemy base." + icon_state = "wetsuit_rec" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + cold_protection = UPPER_TORSO|LOWER_TORSO + /* * pyjamas */ @@ -990,67 +1053,169 @@ Uniforms and such *Misc Uniforms */ -/obj/item/clothing/under/aether +/obj/item/clothing/under/relan + name = "\improper Free Relan uniform" + desc = "A military uniform belonging to the Free Relan Federation, an independent human government." + icon_state = "confed" + worn_state = "confed" + +/obj/item/clothing/under/corp/aether name = "\improper Aether jumpsuit" desc = "A jumpsuit belonging to Aether Atmospherics and Recycling, a Trans-Stellar that supplies recycling and atmospheric systems to colonies." icon_state = "aether" worn_state = "aether" -/obj/item/clothing/under/pcrc +/obj/item/clothing/under/corp/centauri + name = "\improper Centauri Provisions jumpsuit" + desc = "A jumpsuit belonging to Centauri Provisions, a Trans-Stellar best known for its food and drink products." + icon_state = "centauri" + worn_state = "centauri" + +/obj/item/clothing/under/corp/grayson + name = "\improper Grayson overalls" + desc = "A set of overalls belonging to Grayson Manufactories, a mining Trans-Stellar." + icon_state = "mechanic" + worn_state = "mechanic" + +/obj/item/clothing/under/corp/grayson_jump + name = "\improper Grayson jumpsuit" + desc = "A set of overalls belonging to Grayson Manufactories, a mining Trans-Stellar." + icon_state = "grayson" + worn_state = "grayson" + rolled_sleeves = 0 + +/obj/item/clothing/under/corp/hephaestus + name = "\improper Hephaestus jumpsuit" + desc = "A set of overalls belonging to Hephaestus, a Trans-Stellar best known for high-grade arms manufacturing." + icon_state = "heph" + worn_state = "heph" + rolled_sleeves = 0 + +/obj/item/clothing/under/corp/kaleidoscope + name = "\improper Kaleidoscope uniform" + desc = "A science uniform belonging to Kaleidoscope Cosmetics, a cosmetic and gene-modification trans-stellar." + icon_state = "kaleido" + worn_state = "kaleido" + rolled_sleeves = 0 + +/obj/item/clothing/under/corp/pcrc name = "\improper PCRC uniform" desc = "A uniform belonging to Proxima Centauri Risk Control, a private security firm." icon_state = "pcrc" item_state = "jensensuit" worn_state = "pcrc" -/obj/item/clothing/under/grayson - name = "\improper Grayson overalls" - desc = "A set of overalls belonging to Grayson Manufactories, a mining Trans-Stellar." - icon_state = "mechanic" - worn_state = "mechanic" - -/obj/item/clothing/under/wardt - name = "\improper Ward-Takahashi jumpsuit" - desc = "A jumpsuit belonging to Ward-Takahashi, a Trans-Stellar in the consumer goods market." - icon_state = "robotics2" - worn_state = "robotics2" - -/obj/item/clothing/under/mbill +/obj/item/clothing/under/corp/mbill name = "\improper Major Bill's uniform" desc = "A uniform belonging to Major Bill's Transportation, a shipping megacorporation." icon_state = "mbill" worn_state = "mbill" catalogue_data = list(/datum/category_item/catalogue/information/organization/major_bills) -/obj/item/clothing/under/confederacy - name = "\improper Confederacy uniform" - desc = "A military uniform belonging to the Confederacy of Man, an independent human government." - icon_state = "confed" - worn_state = "confed" +/obj/item/clothing/under/corp/mbill_flight + name = "\improper Major Bill's flight suit" + desc = "A pilot's suit belonging to Major Bill's Transportation, a shipping megacorporation." + icon_state = "mbill_flight" + worn_state = "mbill_flight" + catalogue_data = list(/datum/category_item/catalogue/information/organization/major_bills) + rolled_sleeves = 0 -/obj/item/clothing/under/saare +/obj/item/clothing/under/corp/morpheus + name = "\improper Morpheus jumpsuit" + desc = "A uniform belonging to Morpheus Cyberkinetics, a positronic-run cybernetics Trans-Stellar." + icon_state = "morpheus" + worn_state = "morpheus" + index = 1 + +/obj/item/clothing/under/corp/saare name = "\improper SAARE uniform" desc = "A dress uniform belonging to Stealth Assault Enterprises, a minor private military corporation." icon_state = "saare" worn_state = "saare" +/obj/item/clothing/under/corp/focal + name = "\improper Focal Point jumpsuit" + desc = "A jumpsuit belonging to Focal Point Energistics, an engineering megacorporation." + icon_state = "focal" + worn_state = "focal" + +/obj/item/clothing/under/corp/wulf + name = "\improper Wulf jumpsuit" + desc = "A jumpsuit belonging to Wulf Aeronautics, a ship-building and propulsion systems Trans-Stellar." + icon_state = "wulf" + worn_state = "wulf" + rolled_sleeves = 0 + +/obj/item/clothing/under/corp/veymed + name = "\improper Vey-Med uniform" + desc = "A uniform belonging to Vey-Medical, a Skrellian biomedical Trans-Stellar." + icon_state = "veymed" + worn_state = "veymed" + rolled_sleeves = 0 + +/obj/item/clothing/under/corp/wardt + name = "\improper Ward-Takahashi jumpsuit" + desc = "A jumpsuit belonging to Ward-Takahashi, a Trans-Stellar in the consumer goods market." + icon_state = "robotics2" + worn_state = "robotics2" + +/obj/item/clothing/under/corp/xion + name = "\improper Xion jumpsuit" + desc = "A jumpsuit belonging to Xion Manufacturing, an industrial equipment Trans-Stellar." + icon_state = "xion" + worn_state = "xion" + rolled_sleeves = 0 + +/obj/item/clothing/under/corp/zenghu + name = "\improper Zeng-Hu jumpsuit" + desc = "A jumpsuit belonging to Zeng-Hu Pharmaceuticals, a Trans-Stellar in the business of exactly what you'd expect.." + icon_state = "zenghu" + worn_state = "zenghu" + rolled_sleeves = 0 + +/obj/item/clothing/under/hedberg + name = "\improper Hedberg law enforcement uniform" + desc = "A sturdy civilian law enforcement uniform belonging to the Hedberg-Hammarstrom private security corporation." + icon_state = "hedberg" + worn_state = "hedberg" + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //Equivalent to security officer's jumpsuit + rolled_sleeves = 0 + +/obj/item/clothing/under/hedbergtech + name = "\improper Hedberg technician uniform" + desc = "A technician's uniform belonging to the Hedberg-Hammarstrom private security corporation. It is lightly shielded against radiation." + icon_state = "hedberg_tech" + worn_state = "hedberg_tech" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) // Equivalent to engineer's jumpsuit. + rolled_sleeves = 0 + +/obj/item/clothing/under/sifcop + name = "\improper SifGuard law enforcement uniform" + desc = "A sturdy law enforcement uniform typical of Vir's civilian law enforcement officers." + icon_state = "sifcop" + worn_state = "sifcop" + armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //Equivalent to security officer's jumpsuit + rolled_sleeves = 0 + +//Uniforms end above here. + /obj/item/clothing/under/frontier name = "frontier clothes" desc = "A rugged flannel shirt and denim overalls. A popular style among frontier colonists." icon_state = "frontier" worn_state = "frontier" -/obj/item/clothing/under/focal - name = "\improper Focal Point jumpsuit" - desc = "A jumpsuit belonging to Focal Point Energistics, an engineering megacorporation." - icon_state = "focal" - worn_state = "focal" +/obj/item/clothing/under/retrosweater + name = "retro sweater" + desc = "A rugged cableknit sweater and leather pants, fit for a dashing space adventurer." + icon_state = "retro_sweater" + worn_state = "retro_sweater" -/obj/item/clothing/under/hephaestus - name = "\improper Hephaestus jumpsuit" - desc = "A jumpsuit belonging to Hephaestus Industries, a Trans-Stellar best known for its arms production." - icon_state = "heph" - worn_state = "heph" +/obj/item/clothing/under/hightrousers + name = "high-waisted trousers" + desc = "A waistline this high is just made for ripping bodices, swashing buckles, or - just occasionally - sucking blood." + icon_state = "gayvampire" + worn_state = "gayvampire" /obj/item/clothing/under/rank/psych/turtleneck/sweater desc = "A warm looking sweater and a pair of dark blue slacks." @@ -1058,8 +1223,6 @@ Uniforms and such icon_state = "turtleneck" worn_state = "turtleneck" -//Uniforms end above here. - /obj/item/clothing/under/medigown name = "medical gown" desc = "A flimsy examination gown, the back ties never close." @@ -1119,8 +1282,6 @@ Uniforms and such This costume is instead made from genuine cotton fibre and is based on the season three uniform." icon = 'icons/obj/clothing/ranger.dmi' icon_state = "ranger_uniform" - rolled_down = 0 - rolled_sleeves = 0 /obj/item/clothing/under/color/ranger/Initialize() . = ..() diff --git a/code/modules/clothing/under/solgov.dm b/code/modules/clothing/under/solgov.dm index cd2c111098..b1531d7a22 100644 --- a/code/modules/clothing/under/solgov.dm +++ b/code/modules/clothing/under/solgov.dm @@ -469,7 +469,7 @@ permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 30, rad = 0) -//Terrans +//SAARE /obj/item/clothing/under/saare name = "master SAARE uniform" @@ -497,4 +497,21 @@ name = "SAARE command service uniform" desc = "The service uniform of Stealth Assault Enterprises, for high-ranking mercenaries." icon_state = "terranservice_comm" - worn_state = "terranservice_comm" \ No newline at end of file + worn_state = "terranservice_comm" + +//Galactic Survey + +/obj/item/clothing/under/gsa + name = "\improper Galactic Survey utility uniform" + desc = "A jumpsuit belonging to the Galactic Survey Administration, SolGov's scientific exploration division." + icon_state = "gsa" + worn_state = "gsa" + rolled_sleeves = 0 + +/obj/item/clothing/under/gsa_work + name = "\improper Galactic Survey worksuit" + desc = "A padded work suit belonging to the Galactic Survey Administration, SolGov's scientific exploration division. It has minor radiation shielding." + icon_state = "gsa_work" + worn_state = "gsa_work" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + rolled_sleeves = 0 diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 4907f905fe..03432980dc 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -98,12 +98,11 @@ if(!reagents.total_volume) to_chat(user, "The [initial(name)] is dry!") else - user.visible_message("\The [user] starts to wipe down [A] with [src]!") - //reagents.splash(A, 1) //get a small amount of liquid on the thing we're wiping. + user.visible_message("[user] starts to wipe [A] with [src].") update_name() if(do_after(user,30)) - user.visible_message("\The [user] finishes wiping off the [A]!") - A.clean_blood() + user.visible_message("[user] finishes wiping [A]!") + A.on_rag_wipe(src) /obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag) if(isliving(target)) //Leaving this as isliving. @@ -117,7 +116,7 @@ var/mob/living/carbon/human/H = target if(H.head && (H.head.body_parts_covered & FACE)) //Check human head coverage. to_chat(user, "Remove their [H.head] first.") - return + return else if(reagents.total_volume) //Final check. If the rag is not on fire and their face is uncovered, smother target. user.do_attack_animation(src) user.visible_message( diff --git a/code/modules/economy/price_list.dm b/code/modules/economy/price_list.dm index 23ce932f06..10199e9e46 100644 --- a/code/modules/economy/price_list.dm +++ b/code/modules/economy/price_list.dm @@ -216,6 +216,9 @@ /datum/reagent/ethanol/cuba_libre price_tag = 4 +/datum/reagent/ethanol/rum_and_cola + price_tag = 4 + /datum/reagent/ethanol/demonsblood price_tag = 4 diff --git a/code/modules/economy/vending.dm b/code/modules/economy/vending.dm index 9c2106adc0..c19b877a04 100644 --- a/code/modules/economy/vending.dm +++ b/code/modules/economy/vending.dm @@ -60,6 +60,7 @@ emagged = 0 //Ignores if somebody doesn't have card access to that machine. var/seconds_electrified = 0 //Shock customers like an airlock. var/shoot_inventory = 0 //Fire items at customers! We're broken! + var/shoot_inventory_chance = 1 var/scan_id = 1 var/obj/item/weapon/coin/coin @@ -662,7 +663,7 @@ GLOBAL_LIST_EMPTY(vending_products) speak(slogan) last_slogan = world.time - if(shoot_inventory && prob(2)) + if(shoot_inventory && prob(shoot_inventory_chance)) throw_item() return @@ -702,20 +703,20 @@ GLOBAL_LIST_EMPTY(vending_products) //Somebody cut an important wire and now we're following a new definition of "pitch." /obj/machinery/vending/proc/throw_item() - var/obj/throw_item = null + var/obj/item/throw_item = null var/mob/living/target = locate() in view(7,src) if(!target) return 0 - for(var/datum/stored_item/vending_product/R in product_records) + for(var/datum/stored_item/vending_product/R in shuffle(product_records)) throw_item = R.get_product(loc) if(!throw_item) continue break if(!throw_item) - return 0 - spawn(0) - throw_item.throw_at(target, 16, 3, src) + return FALSE + throw_item.vendor_action(src) + INVOKE_ASYNC(throw_item, /atom/movable.proc/throw_at, target, rand(3, 10), rand(1, 3), src) visible_message("\The [src] launches \a [throw_item] at \the [target]!") return 1 diff --git a/code/modules/food/drinkingglass/metaglass.dm b/code/modules/food/drinkingglass/metaglass.dm index c67f816419..4414e02363 100644 --- a/code/modules/food/drinkingglass/metaglass.dm +++ b/code/modules/food/drinkingglass/metaglass.dm @@ -23,7 +23,7 @@ icon = R.glass_icon_file else icon = initial(icon) - + if(R.glass_icon_state) icon_state = R.glass_icon_state else @@ -373,6 +373,10 @@ Drinks Data glass_icon_state = "martiniglass" glass_center_of_mass = list("x"=17, "y"=8) +/datum/reagent/ethanol/rum_and_cola + glass_icon_state = "rumcolaglass" + glass_center_of_mass = list("x"=16, "y"=8) + /datum/reagent/ethanol/cuba_libre glass_icon_state = "cubalibreglass" glass_center_of_mass = list("x"=16, "y"=8) diff --git a/code/modules/food/food/drinks.dm b/code/modules/food/food/drinks.dm index 1f7bbc23d1..16397de4e3 100644 --- a/code/modules/food/food/drinks.dm +++ b/code/modules/food/food/drinks.dm @@ -38,6 +38,9 @@ qdel(src) return +/obj/item/weapon/reagent_containers/food/drinks/on_rag_wipe(var/obj/item/weapon/reagent_containers/glass/rag/R) + clean_blood() + /obj/item/weapon/reagent_containers/food/drinks/attack_self(mob/user as mob) if(!is_open_container()) open(user) diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 733fae75df..1c83b7d940 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -825,23 +825,18 @@ /obj/item/weapon/reagent_containers/food/snacks/carpmeat/Initialize() . = ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent(toxin_type, toxin_amount) - -/obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif - desc = "A fillet of sivian fish meat." - filling_color = "#2c2cff" - color = "#2c2cff" - toxin_type = "neurotoxic_protein" - toxin_amount = 2 - -/obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif/murkfish - toxin_type = "murk_protein" + reagents.add_reagent("seafood", 3) + if(toxin_type && toxin_amount) + reagents.add_reagent(toxin_type, toxin_amount) /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish desc = "A fillet of fish meat." - toxin_type = "neurotoxic_protein" - toxin_amount = 1 + toxin_type = null + +/obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif + desc = "A fillet of sivian fish meat." + filling_color = "#2c2cff" + color = "#2c2cff" /obj/item/weapon/reagent_containers/food/snacks/fishfingers name = "Fish Fingers" @@ -853,7 +848,7 @@ /obj/item/weapon/reagent_containers/food/snacks/fishfingers/Initialize() . = ..() - reagents.add_reagent("protein", 4) + reagents.add_reagent("seafood", 4) /obj/item/weapon/reagent_containers/food/snacks/zestfish name = "Zesty Fish" @@ -865,11 +860,11 @@ /obj/item/weapon/reagent_containers/food/snacks/zestfish/Initialize() . = ..() - reagents.add_reagent("protein", 4) + reagents.add_reagent("seafood", 4) -/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice - name = "huge mushroom slice" - desc = "A slice from a huge mushroom." +/obj/item/weapon/reagent_containers/food/snacks/mushroomslice + name = "mushroom slice" + desc = "A slice of mushroom." icon_state = "hugemushroomslice" filling_color = "#E0D7C5" center_of_mass = list("x"=17, "y"=16) @@ -877,7 +872,7 @@ nutriment_desc = list("raw" = 2, "mushroom" = 2) bitesize = 6 -/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/Initialize() +/obj/item/weapon/reagent_containers/food/snacks/mushroomslice/Initialize() . = ..() reagents.add_reagent("psilocybin", 3) @@ -3572,19 +3567,6 @@ nutriment_amt = 3 nutriment_desc = list("bread" = 3) -// potato + knife = raw sticks -/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(obj/item/weapon/W, mob/user) - if(seed && seed.kitchen_tag && seed.kitchen_tag == "potato" && istype(W,/obj/item/weapon/material/knife)) - new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src)) - to_chat(user, "You cut the potato.") - qdel(src) - else if(seed && seed.kitchen_tag && seed.kitchen_tag == "sunflower" && istype(W,/obj/item/weapon/material/knife)) - new /obj/item/weapon/reagent_containers/food/snacks/rawsunflower(get_turf(src)) - to_chat(user, "You remove the seeds from the flower, slightly damaging them.") - qdel(src) - else - . = ..() - /obj/item/weapon/reagent_containers/food/snacks/rawsticks name = "raw potato sticks" desc = "Raw fries, not very tasty." @@ -3972,7 +3954,8 @@ /obj/item/weapon/reagent_containers/food/snacks/wormsickly/Initialize() . = ..() - reagents.add_reagent("fishbait", 10) + reagents.add_reagent("fishbait", 9) + reagents.add_reagent("protein", 3) /obj/item/weapon/reagent_containers/food/snacks/worm name = "strange worm" @@ -3985,7 +3968,8 @@ /obj/item/weapon/reagent_containers/food/snacks/worm/Initialize() . = ..() - reagents.add_reagent("fishbait", 20) + reagents.add_reagent("fishbait", 15) + reagents.add_reagent("protein", 5) /obj/item/weapon/reagent_containers/food/snacks/wormdeluxe name = "deluxe worm" @@ -3998,7 +3982,8 @@ /obj/item/weapon/reagent_containers/food/snacks/wormdeluxe/Initialize() . = ..() - reagents.add_reagent("fishbait", 40) + reagents.add_reagent("fishbait", 30) + reagents.add_reagent("protein", 10) /obj/item/weapon/reagent_containers/food/snacks/siffruit name = "pulsing fruit" diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index ff69fab758..10f79394e2 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -334,7 +334,7 @@ I said no! result = /obj/item/weapon/reagent_containers/food/snacks/candiedapple /datum/recipe/twobread - reagents = list("wine" = 5) + reagents = list("redwine" = 5) items = list( /obj/item/weapon/reagent_containers/food/snacks/slice/bread, /obj/item/weapon/reagent_containers/food/snacks/slice/bread, @@ -785,7 +785,7 @@ I said no! result = /obj/item/weapon/reagent_containers/food/snacks/chilicheesefries /datum/recipe/risotto - reagents = list("wine" = 5, "rice" = 10, "spacespice" = 1) + reagents = list("redwine" = 5, "rice" = 10, "spacespice" = 1) fruit = list("mushroom" = 1) reagent_mix = RECIPE_REAGENT_REPLACE //Get that rice and wine outta here result = /obj/item/weapon/reagent_containers/food/snacks/risotto diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 9070dfc29b..23fdf46cfa 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -191,13 +191,17 @@ pocell.charge = pocell.maxcharge qdel(src) return - else if(W.sharp) + + if(W.sharp) + if(seed.kitchen_tag == "pumpkin") // Ugggh these checks are awful. user.show_message("You carve a face into [src]!", 1) new /obj/item/clothing/head/pumpkinhead (user.loc) qdel(src) return - else if(seed.chems) + + if(seed.chems) + if(W.sharp && W.edge && !isnull(seed.chems["woodpulp"])) user.show_message("You make planks out of \the [src]!", 1) playsound(src, 'sound/effects/woodcutting.ogg', 50, 1) @@ -215,36 +219,49 @@ to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.amount] planks.") qdel(src) return - else if(!isnull(seed.chems["potato"])) + + if(seed.kitchen_tag == "sunflower") + new /obj/item/weapon/reagent_containers/food/snacks/rawsunflower(get_turf(src)) + to_chat(user, SPAN_NOTICE("You remove the seeds from the flower, slightly damaging them.")) + qdel(src) + return + + if(seed.kitchen_tag == "potato" || !isnull(seed.chems["potato"])) to_chat(user, "You slice \the [src] into sticks.") new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src)) qdel(src) return - else if(!isnull(seed.chems["carrotjuice"])) + + if(!isnull(seed.chems["carrotjuice"])) to_chat(user, "You slice \the [src] into sticks.") new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src)) qdel(src) return - else if(!isnull(seed.chems["pineapplejuice"])) + + if(!isnull(seed.chems["pineapplejuice"])) to_chat(user, "You slice \the [src] into rings.") new /obj/item/weapon/reagent_containers/food/snacks/pineapple_ring(get_turf(src)) qdel(src) return - else if(!isnull(seed.chems["soymilk"])) + + if(!isnull(seed.chems["soymilk"])) to_chat(user, "You roughly chop up \the [src].") new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src)) qdel(src) return - else if(seed.get_trait(TRAIT_FLESH_COLOUR)) + + if(seed.get_trait(TRAIT_FLESH_COLOUR)) to_chat(user, "You slice up \the [src].") var/slices = rand(3,5) var/reagents_to_transfer = round(reagents.total_volume/slices) for(var/i=1; i<=slices; i++) var/obj/item/weapon/reagent_containers/food/snacks/fruit_slice/F = new(get_turf(src),seed) - if(reagents_to_transfer) reagents.trans_to_obj(F,reagents_to_transfer) + if(reagents_to_transfer) + reagents.trans_to_obj(F,reagents_to_transfer) qdel(src) return - ..() + + . = ..() /obj/item/weapon/reagent_containers/food/snacks/grown/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) . = ..() diff --git a/code/modules/hydroponics/grown_predefined.dm b/code/modules/hydroponics/grown_predefined.dm index d8187fb24e..643d27030a 100644 --- a/code/modules/hydroponics/grown_predefined.dm +++ b/code/modules/hydroponics/grown_predefined.dm @@ -3,6 +3,3 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus plantname = "ambrosiadeus" - -/obj/item/weapon/reagent_containers/food/snacks/grown/sifpod - plantname = "sifbulb" diff --git a/code/modules/hydroponics/grown_sif.dm b/code/modules/hydroponics/grown_sif.dm new file mode 100644 index 0000000000..3075fc148f --- /dev/null +++ b/code/modules/hydroponics/grown_sif.dm @@ -0,0 +1,39 @@ +/obj/item/weapon/reagent_containers/food/snacks/grown/sif + var/seeds = 0 + +/obj/item/weapon/reagent_containers/food/snacks/grown/sif/Initialize(mapload, planttype) // Wild Sifplants have some seeds you can extract with a knife. + . = ..() + seeds = rand(1, 2) + +/obj/item/weapon/reagent_containers/food/snacks/grown/sif/examine(mob/user) + . = ..() + if(seeds) + to_chat(user, SPAN_NOTICE("You can see [seeds] seed\s in \the [src]. You might be able to extract them with a sharp object.")) + +/obj/item/weapon/reagent_containers/food/snacks/grown/sif/attackby(var/obj/item/weapon/W, var/mob/living/user) + if(seed && W.sharp && seeds > 0) + var/take_seeds = min(seeds, rand(1,2)) + seeds -= take_seeds + to_chat(user, SPAN_NOTICE("You stick \the [W] into \the [src] and lever out [take_seeds] seed\s.")) + for(var/i = 1 to take_seeds) + new /obj/item/seeds(get_turf(src), seed.name) + return + . = ..() + +/obj/item/weapon/reagent_containers/food/snacks/grown/sif/sifpod + plantname = "sifbulb" + +/obj/item/weapon/reagent_containers/food/snacks/grown/sif/wabback + plantname = "wabback" + +/obj/item/weapon/reagent_containers/food/snacks/grown/sif/blackwabback + plantname = "blackwabback" + +/obj/item/weapon/reagent_containers/food/snacks/grown/sif/wildwabback + plantname = "wildwabback" + +/obj/item/weapon/reagent_containers/food/snacks/grown/sif/eyebulbs + plantname = "eyebulbs" + +/obj/item/weapon/reagent_containers/food/snacks/grown/sif/cavebulbs + plantname = "cavebulbs" diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index af17253513..98973f22fb 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -13,7 +13,9 @@ GLOBAL_LIST_BOILERPLATE(all_seed_packs, /obj/item/seeds) var/datum/seed/seed var/modified = 0 -/obj/item/seeds/Initialize() +/obj/item/seeds/Initialize(var/ml, var/_seed_type) + if(_seed_type in plant_controller.seeds) + seed_type = _seed_type update_seed() . = ..() diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 66273144b7..64398ede2e 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -43,41 +43,46 @@ ..() wires = new(src) if(!contraband_seeds.len) - contraband_seeds = pick(list( - list( - /obj/item/seeds/ambrosiavulgarisseed = 3, - /obj/item/seeds/greengrapeseed = 3, - /obj/item/seeds/reishimycelium = 2, - /obj/item/seeds/bloodtomatoseed = 1 - ), - list( - /obj/item/seeds/ambrosiavulgarisseed = 3, - /obj/item/seeds/plastiseed = 3, - /obj/item/seeds/kudzuseed = 2, - /obj/item/seeds/rose/blood = 1 - ), - list( - /obj/item/seeds/ambrosiavulgarisseed = 3, - /obj/item/seeds/amanitamycelium = 3, - /obj/item/seeds/libertymycelium = 2, - /obj/item/seeds/glowshroom = 1 - ), - list( - /obj/item/seeds/ambrosiavulgarisseed = 3, - /obj/item/seeds/glowberryseed = 3, - /obj/item/seeds/icepepperseed = 2, - /obj/item/seeds/bluetomatoseed = 1 - ), - list( - /obj/item/seeds/durian = 2, - /obj/item/seeds/ambrosiadeusseed = 1, - /obj/item/seeds/killertomatoseed = 1 - ), - list( - /obj/item/seeds/ambrosiavulgarisseed = 3, - /obj/item/seeds/random = 6 - ) - )) + contraband_seeds = pick( /// Some form of ambrosia in all lists. + prob(30);list( /// General produce + /obj/item/seeds/ambrosiavulgarisseed = 3, + /obj/item/seeds/greengrapeseed = 3, + /obj/item/seeds/icepepperseed = 2, + /obj/item/seeds/kudzuseed = 1 + ), + prob(30);list( ///Mushroom batch + /obj/item/seeds/ambrosiavulgarisseed = 1, + /obj/item/seeds/glowberryseed = 2, + /obj/item/seeds/libertymycelium = 1, + /obj/item/seeds/reishimycelium = 2, + /obj/item/seeds/sporemycelium = 1 + ), + prob(15);list( /// Survivalist + /obj/item/seeds/ambrosiadeusseed = 2, + /obj/item/seeds/redtowermycelium = 2, + /obj/item/seeds/vale = 2, + /obj/item/seeds/siflettuce = 2 + ), + prob(20);list( /// Cold plants + /obj/item/seeds/ambrosiavulgarisseed = 2, + /obj/item/seeds/thaadra = 2, + /obj/item/seeds/icepepperseed = 2, + /obj/item/seeds/siflettuce = 1 + ), + prob(10);list( ///Poison party + /obj/item/seeds/ambrosiavulgarisseed = 3, + /obj/item/seeds/surik = 1, + /obj/item/seeds/telriis = 1, + /obj/item/seeds/nettleseed = 2, + /obj/item/seeds/poisonberryseed = 1 + ), + prob(5);list( /// Extra poison party! + /obj/item/seeds/ambrosiainfernusseed = 1, + /obj/item/seeds/amauri = 1, + /obj/item/seeds/surik = 1, + /obj/item/seeds/deathberryseed = 1 /// Very ow. + ) + ) return /obj/machinery/seed_storage/process() diff --git a/code/modules/hydroponics/seedtypes/apples.dm b/code/modules/hydroponics/seedtypes/apples.dm index 7044a0c6dc..4bd8a0bade 100644 --- a/code/modules/hydroponics/seedtypes/apples.dm +++ b/code/modules/hydroponics/seedtypes/apples.dm @@ -43,7 +43,7 @@ /datum/seed/apple/sif name = "sifbulb" - seed_name = "sivian tree" + seed_name = "sivian pod" display_name = "sivian pod" kitchen_tag = "apple" chems = list("nutriment" = list(1,5),"sifsap" = list(10,20)) diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index 76a3417645..4f5140a689 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -22,6 +22,16 @@ /obj/machinery/portable_atmospherics/hydroponics/soil/CanPass() return 1 +/obj/machinery/portable_atmospherics/hydroponics/soil/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/weapon/shovel) && user.a_intent == I_HURT) + user.visible_message(SPAN_NOTICE("\The [user] begins filling in \the [src].")) + if(do_after(user, 3 SECONDS) && !QDELETED(src)) + user.visible_message(SPAN_NOTICE("\The [user] fills in \the [src].")) + qdel(src) + return + . = ..() + + // Holder for vine plants. // Icons for plants are generated as overlays, so setting it to invisible wouldn't work. // Hence using a blank icon. diff --git a/code/modules/lore_codex/news_data/main.dm b/code/modules/lore_codex/news_data/main.dm index 3a89f5cf6e..16270733cf 100644 --- a/code/modules/lore_codex/news_data/main.dm +++ b/code/modules/lore_codex/news_data/main.dm @@ -112,6 +112,12 @@ /datum/lore/codex/page/about_news, ) + var/newsindex + +/datum/lore/codex/category/main_news/New() + ..() + newsindex = LAZYLEN(children) + /datum/lore/codex/page/about_news name = "About the Publisher" data = "The Daedalus Pocket Newscaster is produced and maintained by Occulum Broadcast, the foremost authority on media distribution \ diff --git a/code/modules/materials/materials/organic/wood.dm b/code/modules/materials/materials/organic/wood.dm index 2f44607e8b..129f8ecc18 100644 --- a/code/modules/materials/materials/organic/wood.dm +++ b/code/modules/materials/materials/organic/wood.dm @@ -42,7 +42,9 @@ new /datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE, recycle_material = "[name]"), new /datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), new /datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]"), - new /datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]") + new /datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]"), + new /datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("shovel", /obj/item/weapon/shovel/wood, 2, time = 10, on_floor = TRUE, supplied_material = "[name]") ) /datum/material/wood/sif diff --git a/code/modules/materials/sheets/organic/tanning/hide.dm b/code/modules/materials/sheets/organic/tanning/hide.dm index a8b229c9eb..e59d1e2d82 100644 --- a/code/modules/materials/sheets/organic/tanning/hide.dm +++ b/code/modules/materials/sheets/organic/tanning/hide.dm @@ -20,7 +20,7 @@ //visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message) user.visible_message("\The [user] starts cutting hair off \the [src]", "You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") var/scraped = 0 - while(amount > 0 && do_after(user, 2.5 SECONDS)) // 2.5s per hide + while(amount > 0 && do_after(user, 2.5 SECONDS, user)) //Try locating an exisitng stack on the tile and add to there if possible var/obj/item/stack/hairlesshide/H = null for(var/obj/item/stack/hairlesshide/HS in user.loc) // Could be scraping something inside a locker, hence the .loc, not get_turf diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 31dd9add81..eb15d3f6c5 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -128,6 +128,26 @@ edge = 1 var/digspeed = 40 +/obj/item/weapon/shovel/wood + icon_state = "whiteshovel" + item_state = "whiteshovel" + var/datum/material/material + +/obj/item/weapon/shovel/wood/Initialize(var/ml, var/_mat) + . = ..() + material = get_material_by_name(_mat) + if(!istype(material)) + material = null + else + name = "[material.display_name] shovel" + matter = list("[material.name]" = 50) + update_icon() + +/obj/item/weapon/shovel/wood/update_icon() + . = ..() + color = material ? material.icon_colour : initial(color) + alpha = min(max(255 * material.opacity, 80), 255) + /obj/item/weapon/shovel/spade name = "spade" desc = "A small tool for digging and moving dirt." diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index daa6e2710c..bef918a849 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -6,24 +6,25 @@ var/list/mining_overlay_cache = list() icon = 'icons/turf/walls.dmi' icon_state = "rock-dark" density = 1 - + /turf/simulated/mineral //wall piece name = "rock" icon = 'icons/turf/walls.dmi' icon_state = "rock" - var/rock_side_icon_state = "rock_side" - var/sand_icon_state = "asteroid" - var/rock_icon_state = "rock" - var/random_icon = 0 oxygen = 0 nitrogen = 0 opacity = 1 density = 1 blocks_air = 1 temperature = T0C - can_dirty = FALSE + var/floor_name = "sand" + var/rock_side_icon_state = "rock_side" + var/sand_icon_state = "asteroid" + var/rock_icon_state = "rock" + var/random_icon = 0 + var/ore/mineral var/sand_dug var/mined_ore = 0 @@ -65,6 +66,10 @@ var/list/mining_overlay_cache = list() has_resources = 1 +/turf/simulated/mineral/ChangeTurf(turf/N, tell_universe, force_lighting_update, preserve_outdoors) + clear_ore_effects() + . = ..() + // Alternative rock wall sprites. /turf/simulated/mineral/light icon_state = "rock-light" @@ -109,6 +114,14 @@ var/list/mining_overlay_cache = list() blocks_air = 0 can_build_into_floor = TRUE +/turf/simulated/mineral/floor/mud + icon_state = "mud" + sand_icon_state = "mud" + +/turf/simulated/mineral/floor/dirt + icon_state = "dirt" + sand_icon_state = "dirt" + //Alternative sand floor sprite. /turf/simulated/mineral/floor/light icon_state = "sand-light" @@ -140,6 +153,7 @@ var/list/mining_overlay_cache = list() opacity = 0 blocks_air = 0 can_build_into_floor = TRUE + clear_ore_effects() update_general() /turf/simulated/mineral/proc/make_wall() @@ -223,7 +237,7 @@ var/list/mining_overlay_cache = list() //We are a sand floor else - name = "sand" + name = floor_name icon = 'icons/turf/flooring/asteroid.dmi' icon_state = sand_icon_state diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 35df5ef8a1..4362320fc5 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -75,7 +75,7 @@ var/list/slot_equipment_priority = list( \ /mob/proc/equip_voidsuit_to_slot_or_del_with_refit(obj/item/clothing/suit/space/void/W as obj, slot, species = SPECIES_HUMAN) W.refit_for_species(species) return equip_to_slot_if_possible(W, slot, 1, 1, 0) - + /mob/proc/equip_voidhelm_to_slot_or_del_with_refit(obj/item/clothing/head/helmet/space/void/W as obj, slot, species = SPECIES_HUMAN) W.refit_for_species(species) return equip_to_slot_if_possible(W, slot, 1, 1, 0) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 5b97a9cf0a..7639edcf70 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -55,7 +55,7 @@ var/allergens = null // Things that will make this species very sick var/allergen_reaction = AG_TOX_DMG|AG_OXY_DMG|AG_EMOTE|AG_PAIN|AG_WEAKEN // What type of reactions will you have? These the 'main' options and are intended to approximate anaphylactic shock at high doses. var/allergen_damage_severity = 1.2 // How bad are reactions to the allergen? Touch with extreme caution. - var/allergen_disable_severity = 3 // Whilst this determines how long nonlethal effects last and how common emotes are. + var/allergen_disable_severity = 2.5 // Whilst this determines how long nonlethal effects last and how common emotes are. var/min_age = 17 var/max_age = 70 @@ -107,7 +107,7 @@ var/alcohol_mod = 1 // Multiplier to alcohol strength; 0.5 = half, 0 = no effect at all, 2 = double, etc. var/pain_mod = 1 // Multiplier to pain effects; 0.5 = half, 0 = no effect (equal to NO_PAIN, really), 2 = double, etc. var/spice_mod = 1 // Multiplier to spice/capsaicin/frostoil effects; 0.5 = half, 0 = no effect (immunity), 2 = double, etc. - var/trauma_mod = 1 // Affects traumatic shock (how fast pain crit happens). 0 = no effect (immunity to pain crit), 2 = double etc.Overriden by "can_feel_pain" var + var/trauma_mod = 1 // Affects traumatic shock (how fast pain crit happens). 0 = no effect (immunity to pain crit), 2 = double etc.Overriden by "can_feel_pain" var // set below is EMP interactivity for nonsynth carbons var/emp_sensitivity = 0 // bitflag. valid flags are: EMP_PAIN, EMP_BLIND, EMP_DEAFEN, EMP_CONFUSE, EMP_STUN, and EMP_(BRUTE/BURN/TOX/OXY)_DMG var/emp_dmg_mod = 1 // Multiplier to all EMP damage sustained by the mob, if it's EMP-sensitive diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 905bd3b564..da8a11a610 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -249,13 +249,13 @@ cold_discomfort_level = 215 has_organ = list( //No appendix. - O_HEART = /obj/item/organ/internal/heart, + O_HEART = /obj/item/organ/internal/heart/tajaran, O_LUNGS = /obj/item/organ/internal/lungs, O_VOICE = /obj/item/organ/internal/voicebox, O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, O_BRAIN = /obj/item/organ/internal/brain, - O_EYES = /obj/item/organ/internal/eyes, + O_EYES = /obj/item/organ/internal/eyes/tajaran, O_STOMACH = /obj/item/organ/internal/stomach, O_INTESTINE = /obj/item/organ/internal/intestine ) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index d5bc104add..ba41ff0f3d 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -301,7 +301,7 @@ if(istype(H.w_uniform, /obj/item/clothing/under)) suit = H.w_uniform - + var/list/slots = list() for(var/entry in H.species.hud.gear) var/list/slot_ref = H.species.hud.gear[entry] @@ -316,7 +316,7 @@ ))) data["slots"] = slots - + var/list/specialSlots = list() if(H.species.hud.has_hands) specialSlots.Add(list(list( diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 682c2a5077..f5d84973c5 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -234,36 +234,43 @@ /obj/item/robot_parts/robot_component/binary_communication_device name = "binary communication device" + desc = "A module used for binary communications over encrypted frequencies, commonly used by synthetic robots." icon_state = "binradio" icon_state_broken = "binradio_broken" /obj/item/robot_parts/robot_component/actuator name = "actuator" + desc = "A modular, hydraulic actuator used by exosuits and robots alike for movement and manipulation." icon_state = "motor" icon_state_broken = "motor_broken" /obj/item/robot_parts/robot_component/armour name = "armour plating" + desc = "A pair of flexible, adaptable armor plates, used to protect the internals of robots." icon_state = "armor" icon_state_broken = "armor_broken" /obj/item/robot_parts/robot_component/armour_platform name = "platform armour plating" + desc = "A pair of reinforced armor plates, used to protect the internals of robots." icon_state = "armor" icon_state_broken = "armor_broken" color = COLOR_GRAY80 /obj/item/robot_parts/robot_component/camera name = "camera" + desc = "A modified camera module used as a visual receptor for robots and exosuits, also serving as a relay for wireless video feed." icon_state = "camera" icon_state_broken = "camera_broken" /obj/item/robot_parts/robot_component/diagnosis_unit name = "diagnosis unit" + desc = "An internal computer and sensors used by robots and exosuits to accurately diagnose any system discrepancies on their components." icon_state = "analyser" icon_state_broken = "analyser_broken" /obj/item/robot_parts/robot_component/radio name = "radio" + desc = "A modular, multi-frequency radio used by robots and exosuits to enable communication systems. Comes with built-in subspace receivers." icon_state = "radio" icon_state_broken = "radio_broken" \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm index fe23b86bf7..2ce8d46af7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm @@ -129,7 +129,7 @@ catalogue_data = list(/datum/category_item/catalogue/fauna/javelin) - meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif + meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif /datum/category_item/catalogue/fauna/icebass name = "Sivian Fauna - Glitter Bass" @@ -156,7 +156,7 @@ catalogue_data = list(/datum/category_item/catalogue/fauna/icebass) - meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif + meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif var/max_red = 150 var/min_red = 50 @@ -245,7 +245,7 @@ var/image/head_image - meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif + meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif /mob/living/simple_mob/animal/passive/fish/rockfish/Initialize() . = ..() @@ -292,7 +292,7 @@ has_eye_glow = TRUE - meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif + meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif /datum/category_item/catalogue/fauna/murkin name = "Sivian Fauna - Murkfish" @@ -319,4 +319,4 @@ catalogue_data = list(/datum/category_item/catalogue/fauna/murkin) - meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif/murkfish + meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 76e269d49e..512df98a92 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -72,12 +72,20 @@ output += "

[href(src, list("give_feedback" = 1), "Give Feedback")]

" if(GLOB.news_data.station_newspaper) - output += "Show [using_map.station_name] News" + if(client.prefs.lastlorenews == GLOB.news_data.newsindex) + output += "

Show [using_map.station_name] News

" + else + output += "

Show [using_map.station_name] News (NEW!)

" output += "" - if(GLOB.news_data.station_newspaper && !client.seen_news) + if (client.prefs.lastlorenews == GLOB.news_data.newsindex) + client.seen_news = 1 + + if(GLOB.news_data.station_newspaper && !client.seen_news && client.is_preference_enabled(/datum/client_preference/show_lore_news)) show_latest_news(GLOB.news_data.station_newspaper) + client.prefs.lastlorenews = GLOB.news_data.newsindex + SScharacter_setup.queue_preferences_save(client.prefs) panel = new(src, "Welcome","Welcome", 500, 480, src) panel.set_window_options("can_close=0") diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 81744baa60..fa90e60a22 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1679,159 +1679,224 @@ shaved /////////////////////////////////// */ -/datum/sprite_accessory/hair/una_spines_long +//Unathi Head-Bits + +/datum/sprite_accessory/hair/una name = "Long Unathi Spines" icon_state = "soghun_longspines" species_allowed = list(SPECIES_UNATHI) -/datum/sprite_accessory/hair/una_spines_short +/datum/sprite_accessory/hair/una/spines_short name = "Short Unathi Spines" - icon_state = "soghun_shortspines" - species_allowed = list(SPECIES_UNATHI) -/datum/sprite_accessory/hair/una_frills_long +/datum/sprite_accessory/hair/una/frills_long name = "Long Unathi Frills" icon_state = "soghun_longfrills" - species_allowed = list(SPECIES_UNATHI) -/datum/sprite_accessory/hair/una_frills_short +/datum/sprite_accessory/hair/una/frills_short name = "Short Unathi Frills" icon_state = "soghun_shortfrills" - species_allowed = list(SPECIES_UNATHI) -/datum/sprite_accessory/hair/una_horns +/datum/sprite_accessory/hair/una/horns name = "Unathi Horns" icon_state = "soghun_horns" - species_allowed = list(SPECIES_UNATHI) -/datum/sprite_accessory/hair/una_bighorns +/datum/sprite_accessory/hair/una/bighorns name = "Unathi Big Horns" icon_state = "unathi_bighorn" - species_allowed = list(SPECIES_UNATHI) -/datum/sprite_accessory/hair/una_smallhorns +/datum/sprite_accessory/hair/una/smallhorns name = "Unathi Small Horns" icon_state = "unathi_smallhorn" - species_allowed = list(SPECIES_UNATHI) -/datum/sprite_accessory/hair/una_ramhorns +/datum/sprite_accessory/hair/una/ramhorns name = "Unathi Ram Horns" icon_state = "unathi_ramhorn" - species_allowed = list(SPECIES_UNATHI) -/datum/sprite_accessory/hair/una_sidefrills +/datum/sprite_accessory/hair/una/sidefrills name = "Unathi Side Frills" icon_state = "unathi_sidefrills" - species_allowed = list(SPECIES_UNATHI) //Skrell 'hairstyles' -/datum/sprite_accessory/hair/skr_tentacle_veryshort - name = "Skrell Short Tentacles" - icon_state = "skrell_hair_short" - species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) - gender = MALE -/datum/sprite_accessory/hair/skr_tentacle_short +/datum/sprite_accessory/hair/skr name = "Skrell Average Tentacles" icon_state = "skrell_hair_average" species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) -/datum/sprite_accessory/hair/skr_tentacle_average +/datum/sprite_accessory/hair/skr/tentacle_veryshort + name = "Skrell Short Tentacles" + icon_state = "skrell_hair_short" + gender = MALE + +/datum/sprite_accessory/hair/skr/tentacle_average name = "Skrell Long Tentacles" icon_state = "skrell_hair_long" - species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) -/datum/sprite_accessory/hair/skr_tentacle_verylong +/datum/sprite_accessory/hair/skr/tentacle_verylong name = "Skrell Very Long Tentacles" icon_state = "skrell_hair_verylong" - species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) //Tajaran hairstyles -/datum/sprite_accessory/hair/taj_ears +/datum/sprite_accessory/hair/taj name = "Tajaran Ears" icon_state = "ears_plain" species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_clean - name = "Tajaran Clean" - icon_state = "hair_clean" - species_allowed = list(SPECIES_TAJ) - -/datum/sprite_accessory/hair/taj_ears_bangs +/datum/sprite_accessory/hair/taj/bangs name = "Tajaran Bangs" icon_state = "hair_bangs" - species_allowed = list(SPECIES_TAJ) +/datum/sprite_accessory/hair/taj/bangs_alt + name = "Tajaran Bangs (Alt)" + icon_state = "hair_bangs_alt" -/datum/sprite_accessory/hair/taj_ears_braid +/datum/sprite_accessory/hair/taj/short_fringe + name = "Tajaran Short Fringe" + icon_state = "hair_shortfringe" + +/datum/sprite_accessory/hair/taj/braid name = "Tajaran Braid" icon_state = "hair_tbraid" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_shaggy +/datum/sprite_accessory/hair/taj/clean + name = "Tajaran Clean" + icon_state = "hair_clean" + +/datum/sprite_accessory/hair/taj/gman + name = "Tajaran G-Man" + icon_state = "hair_gman" + +/datum/sprite_accessory/hair/taj/greaser + name = "Tajaran Greaser" + icon_state = "hair_greaser" + +/datum/sprite_accessory/hair/taj/bun + name = "Tajaran Bun" + icon_state = "hair_tajbun" + +/datum/sprite_accessory/hair/taj/bunsmall + name = "Tajaran Bun (Small)" + icon_state = "hair_tajsmallbun" + +/datum/sprite_accessory/hair/taj/bunlow + name = "Tajaran Bun (Low)" + icon_state = "hair_tajbunlow" + +/datum/sprite_accessory/hair/taj/bunlowsmall + name = "Tajaran Bun (Low, Small)" + icon_state = "hair_tajbunlowsmall" + +/datum/sprite_accessory/hair/taj/_wedge + name = "Tajaran Wedge" + icon_state = "hair_wedge" + +/datum/sprite_accessory/hair/taj/shaggy name = "Tajaran Shaggy" icon_state = "hair_shaggy" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_mohawk +/datum/sprite_accessory/hair/taj/mohawk name = "Tajaran Mohawk" icon_state = "hair_mohawk" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_plait +/datum/sprite_accessory/hair/taj/plait name = "Tajaran Plait" icon_state = "hair_plait" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_straight +/datum/sprite_accessory/hair/taj/_sidepony + name = "Tajaran Side Ponytail" + icon_state = "hair_sidepony" + +/datum/sprite_accessory/hair/taj/straight name = "Tajaran Straight" icon_state = "hair_straight" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_long +/datum/sprite_accessory/hair/taj/long name = "Tajaran Long" icon_state = "hair_long" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_rattail +/datum/sprite_accessory/hair/taj/tresses + name = "Tajaran Tresses" + icon_state = "hair_tresses" + +/datum/sprite_accessory/hair/taj/shoulderparted + name = "Tajaran Shoulder Parted" + icon_state = "hair_shoulderparted" + +/datum/sprite_accessory/hair/taj/shoulderpartedsmall + name = "Tajaran Shoulder Parted (Small)" + icon_state = "hair_shoulderpartedsmall" + +/datum/sprite_accessory/hair/taj/shoulderpartedlong + name = "Tajaran Shoulder Parted (Long)" + icon_state = "hair_shoulderpartedlong" + +/datum/sprite_accessory/hair/taj/sidepartedleft + name = "Tajaran Side Parted (Left)" + icon_state = "hair_sidepartedleft" + +/datum/sprite_accessory/hair/taj/sidepartedright + name = "Tajaran Side Parted (Right)" + icon_state = "hair_sidepartedright" + +/datum/sprite_accessory/hair/taj/shoulderlength + name = "Tajaran Shoulder Length" + icon_state = "hair_shoulderlength" + +/datum/sprite_accessory/hair/taj/shoulderlengthalt + name = "Tajaran Shoulder Length (Alt)" + icon_state = "hair_shoulderlengthalt" + +/datum/sprite_accessory/hair/taj/cascading + name = "Tajaran Cascading" + icon_state = "hair_cascading" + +/datum/sprite_accessory/hair/taj/cascadingalt + name = "Tajaran Cascading (Alt)" + icon_state = "hair_cascadingalt" + +/datum/sprite_accessory/hair/taj/rattail name = "Tajaran Rat Tail" icon_state = "hair_rattail" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_spiky +/datum/sprite_accessory/hair/taj/spiky name = "Tajaran Spiky" icon_state = "hair_tajspiky" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_messy +/datum/sprite_accessory/hair/taj/fringeup + name = "Tajaran Fringe Spike" + icon_state = "hair_fringeup" + +/datum/sprite_accessory/hair/taj/messy name = "Tajaran Messy" icon_state = "hair_messy" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_curls +/datum/sprite_accessory/hair/taj/curls name = "Tajaran Curly" icon_state = "hair_curly" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_wife +/datum/sprite_accessory/hair/taj/curlsalt + name = "Tajaran Curly, alt" + icon_state = "hair_curlyalt" + +/datum/sprite_accessory/hair/taj/mane + name = "Tajaran Mane" + icon_state = "hair_mane" + +/datum/sprite_accessory/hair/taj/wife name = "Tajaran Housewife" icon_state = "hair_wife" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_victory +/datum/sprite_accessory/hair/taj/victory name = "Tajaran Victory Curls" icon_state = "hair_victory" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/hair/taj_ears_bob +/datum/sprite_accessory/hair/taj/bob name = "Tajaran Bob" icon_state = "hair_tbob" - species_allowed = list(SPECIES_TAJ) - -/datum/sprite_accessory/hair/taj_ears_fingercurl +/datum/sprite_accessory/hair/taj/fingercurl name = "Tajaran Finger Curls" icon_state = "hair_fingerwave" - species_allowed = list(SPECIES_TAJ) //Teshari things /datum/sprite_accessory/hair/teshari @@ -1891,8 +1956,6 @@ shaved name = "Teshari Mushroom" icon_state = "teshari_mushroom" -//Tesh things ported from Ark Station - /datum/sprite_accessory/hair/teshari/twies name = "Teshari Twies" icon_state = "teshari_twies" @@ -1914,102 +1977,89 @@ shaved icon_state = "teshari_fluffymohawk" // Vox things -/datum/sprite_accessory/hair/vox_braid_long +/datum/sprite_accessory/hair/vox name = "Long Vox braid" icon_state = "vox_longbraid" species_allowed = list(SPECIES_VOX) -/datum/sprite_accessory/hair/vox_braid_short +/datum/sprite_accessory/hair/vox/braid_short name = "Short Vox Braid" icon_state = "vox_shortbraid" - species_allowed = list(SPECIES_VOX) -/datum/sprite_accessory/hair/vox_quills_short +/datum/sprite_accessory/hair/vox/quills_short name = "Short Vox Quills" icon_state = "vox_shortquills" - species_allowed = list(SPECIES_VOX) -/datum/sprite_accessory/hair/vox_quills_kingly +/datum/sprite_accessory/hair/vox/quills_kingly name = "Kingly Vox Quills" icon_state = "vox_kingly" - species_allowed = list(SPECIES_VOX) -/datum/sprite_accessory/hair/vox_quills_mohawk +/datum/sprite_accessory/hair/vox/quills_mohawk name = "Quill Mohawk" icon_state = "vox_mohawk" - species_allowed = list(SPECIES_VOX) -/datum/sprite_accessory/facial_hair/taj_sideburns +//Tajaran Facial Hair + +/datum/sprite_accessory/facial_hair/taj name = "Tajaran Sideburns" icon_state = "facial_sideburns" species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/facial_hair/taj_mutton +/datum/sprite_accessory/facial_hair/taj/mutton name = "Tajaran Mutton" icon_state = "facial_mutton" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/facial_hair/taj_pencilstache +/datum/sprite_accessory/facial_hair/taj/pencilstache name = "Tajaran Pencilstache" icon_state = "facial_pencilstache" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/facial_hair/taj_moustache +/datum/sprite_accessory/facial_hair/taj/moustache name = "Tajaran Moustache" icon_state = "facial_moustache" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/facial_hair/taj_goatee +/datum/sprite_accessory/facial_hair/taj/goatee name = "Tajaran Goatee" icon_state = "facial_goatee" - species_allowed = list(SPECIES_TAJ) -/datum/sprite_accessory/facial_hair/taj_smallstache +/datum/sprite_accessory/facial_hair/taj/smallstache name = "Tajaran Smallsatche" icon_state = "facial_smallstache" - species_allowed = list(SPECIES_TAJ) //unathi horn beards and the like -/datum/sprite_accessory/facial_hair/una_chinhorn +/datum/sprite_accessory/facial_hair/una name = "Unathi Chin Horn" icon_state = "facial_chinhorns" species_allowed = list(SPECIES_UNATHI) -/datum/sprite_accessory/facial_hair/una_hornadorns +/datum/sprite_accessory/facial_hair/una/hornadorns name = "Unathi Horn Adorns" icon_state = "facial_hornadorns" - species_allowed = list(SPECIES_UNATHI) -/datum/sprite_accessory/facial_hair/una_spinespikes +/datum/sprite_accessory/facial_hair/una/spinespikes name = "Unathi Spine Spikes" icon_state = "facial_spikes" - species_allowed = list(SPECIES_UNATHI) -/datum/sprite_accessory/facial_hair/una_dorsalfrill +/datum/sprite_accessory/facial_hair/una/dorsalfrill name = "Unathi Dorsal Frill" icon_state = "facial_dorsalfrill" - species_allowed = list(SPECIES_UNATHI) -//Teshari things -/datum/sprite_accessory/facial_hair/teshari_beard +//Teshari face things +/datum/sprite_accessory/facial_hair/teshari name = "Teshari Beard" icon_state = "teshari_chin" species_allowed = list(SPECIES_TESHARI) gender = NEUTER -/datum/sprite_accessory/facial_hair/teshari_scraggly +/datum/sprite_accessory/facial_hair/teshari/scraggly name = "Teshari Scraggly" icon_state = "teshari_scraggly" - species_allowed = list(SPECIES_TESHARI) - gender = NEUTER -/datum/sprite_accessory/facial_hair/teshari_chops + +/datum/sprite_accessory/facial_hair/teshari/chops name = "Teshari Chops" icon_state = "teshari_gap" - species_allowed = list(SPECIES_TESHARI) - gender = NEUTER /* //////////////////////////// diff --git a/code/modules/mob/new_player/sprite_accessories_ear.dm b/code/modules/mob/new_player/sprite_accessories_ear.dm index 24e82043e4..a07b77500d 100644 --- a/code/modules/mob/new_player/sprite_accessories_ear.dm +++ b/code/modules/mob/new_player/sprite_accessories_ear.dm @@ -344,13 +344,43 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY +/datum/sprite_accessory/ears/elfs2 + name = "pointed ears" + desc = "" + icon_state = "ears_pointy" + do_colouration = 1 + species_allowed = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + /datum/sprite_accessory/ears/elfs - name = "elven ears" + name = "pointed ears (tall)" desc = "" icon_state = "elfs" do_colouration = 1 color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) +/datum/sprite_accessory/ears/elfs3 + name = "pointed ears (down)" + desc = "" + icon_state = "ears_pointy_down" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/elfs4 + name = "pointed ears (long)" + desc = "" + icon_state = "ears_pointy_long" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/elfs5 + name = "pointed ears (long, down)" + desc = "" + icon_state = "ears_pointy_long_down" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY species_allowed = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) /datum/sprite_accessory/ears/sleek diff --git a/code/modules/news/news_init.dm b/code/modules/news/news_init.dm index 33adc2d530..465f390729 100644 --- a/code/modules/news/news_init.dm +++ b/code/modules/news/news_init.dm @@ -7,6 +7,7 @@ GLOBAL_DATUM_INIT(news_data, /datum/lore/news, new) /datum/lore/news var/datum/feed_channel/station_newspaper var/datum/lore/codex/category/main_news/news_codex = new() + var/newsindex /datum/lore/news/New() ..() @@ -17,6 +18,10 @@ GLOBAL_DATUM_INIT(news_data, /datum/lore/news, new) break spawn(300) // Yes, again. fill_codex_news() + if (!news_codex.newsindex) + return + else + newsindex = news_codex.newsindex /datum/lore/news/proc/fill_codex_news() if(!news_network) diff --git a/code/modules/organs/subtypes/tajaran.dm b/code/modules/organs/subtypes/tajaran.dm new file mode 100644 index 0000000000..c46dde783b --- /dev/null +++ b/code/modules/organs/subtypes/tajaran.dm @@ -0,0 +1,7 @@ +/obj/item/organ/internal/eyes/tajaran + icon_state = "tajaran_eyes" + +/obj/item/organ/internal/heart/tajaran + icon_state = "tajaran_heart-on" + dead_icon = "tajaran_heart-off" + diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 50655315ad..70a2f01e3c 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -3,7 +3,7 @@ /obj/machinery/containment_field name = "Containment Field" desc = "An energy field." - icon = 'icons/obj/singularity.dmi' + icon = 'icons/obj/machines/field_generator.dmi' icon_state = "Contain_F" anchored = 1 density = 0 diff --git a/code/modules/projectiles/guns/projectile/boltaction.dm b/code/modules/projectiles/guns/projectile/boltaction.dm index 1aa8e83957..d90d27ab70 100644 --- a/code/modules/projectiles/guns/projectile/boltaction.dm +++ b/code/modules/projectiles/guns/projectile/boltaction.dm @@ -1,7 +1,8 @@ // For all intents and purposes, these work exactly the same as pump shotguns. It's unnecessary to make their own procs for them. +////////Base Rifle//////// /obj/item/weapon/gun/projectile/shotgun/pump/rifle - name = "bolt action rifle" + name = "bolt-action rifle" desc = "The Hedberg-Hammarstrom Volsung is a modern interpretation of an almost ancient weapon design. The model is popular among hunters and collectors due to its reliability. Uses 7.62mm rounds." description_fluff = "Sif’s largest home-grown firearms manufacturer, the Hedberg-Hammarstrom company offers a range of high-quality, high-cost hunting rifles and shotguns designed with the Sivian wilderness - and its wildlife - in mind. \ The company operates just one production plant in Kalmar, but their weapons have found popularity on garden worlds as far afield as the Tajaran homeworld due to their excellent build quality, precision, and stopping power." @@ -14,20 +15,25 @@ ammo_type = /obj/item/ammo_casing/a762 load_method = SINGLE_CASING|SPEEDLOADER action_sound = 'sound/weapons/riflebolt.ogg' - pump_animation = null + pump_animation = "boltaction-cycling" +////////Practice Rifle//////// /obj/item/weapon/gun/projectile/shotgun/pump/rifle/practice // For target practice + name = "practice bolt-action rifle" + icon_state = "boltaction_practice" desc = "A bolt-action rifle with a lightweight synthetic wood stock, designed for competitive shooting. Comes shipped with practice rounds pre-loaded into the gun. Popular among professional marksmen. Uses 7.62mm rounds." ammo_type = /obj/item/ammo_casing/a762/practice + pump_animation = "boltaction_practice-cycling" +////////Ceremonial Rifle//////// /obj/item/weapon/gun/projectile/shotgun/pump/rifle/ceremonial name = "ceremonial bolt-action rifle" desc = "A bolt-action rifle with a heavy, high-quality wood stock that has a beautiful finish. Clearly not intended to be used in combat. Uses 7.62mm rounds." - icon_state = "boltaction_c" item_state = "boltaction_c" + icon_state = "ceremonial_rifle" ammo_type = /obj/item/ammo_casing/a762/blank + pump_animation = "ceremonial_rifle-cycling" -// Stole hacky terrible code from doublebarrel shotgun. -Spades /obj/item/weapon/gun/projectile/shotgun/pump/rifle/ceremonial/attackby(var/obj/item/A as obj, mob/user as mob) if(istype(A, /obj/item/weapon/surgical/circular_saw) || istype(A, /obj/item/weapon/melee/energy) || istype(A, /obj/item/weapon/pickaxe/plasmacutter) && w_class != ITEMSIZE_NORMAL) to_chat(user, "You begin to shorten the barrel and stock of \the [src].") @@ -37,7 +43,7 @@ user.visible_message("[src] goes off!", "The rifle goes off in your face!") return if(do_after(user, 30)) - icon_state = "sawnrifle" + icon_state = "sawn_rifle" w_class = ITEMSIZE_NORMAL recoil = 2 // Owch accuracy = -15 // You know damn well why. @@ -46,11 +52,14 @@ slot_flags |= (SLOT_BELT|SLOT_HOLSTER) //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) - or in a holster, why not. name = "sawn-off rifle" desc = "The firepower of a rifle, now the size of a pistol, with an effective combat range of about three feet. Uses 7.62mm rounds." + pump_animation = "sawn_rifle-cycling" to_chat(user, "You shorten the barrel and stock of \the [src]!") else ..() //Lever actions are the same thing, but bigger. + +////////Standard Lever Action Rifle//////// /obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever name = "lever-action rifle" desc = "The Hedberg-Hammarstrom Edda is the latest version of an almost ancient weapon design from the 19th century, popular with some due to its simplistic design. This one uses a lever-action to move new rounds into the chamber. Uses 7.62mm rounds." @@ -61,10 +70,12 @@ max_shells = 5 caliber = "7.62mm" load_method = SINGLE_CASING + pump_animation = "leveraction-cycling" +////////Vintage Lever Action Rifle//////// /obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever/vintage name = "vintage repeater" desc = "An iconic manually operated lever action rifle, offering adequate stopping power due to it's still powerful cartridge while at the same time having a rather respectable firing rate due to it's mechanism. It is very probable this is a replica instead of a museum piece, but rifles of this pattern still see usage as colonist guns in some far off regions. Uses 7.62mm rounds." - item_state = "levercarabine" // That isn't how carbine is spelled ya knob! :U - icon_state = "levercarabine" - pump_animation = "levercarabine-cycling" + item_state = "levercarbine" + icon_state = "levercarbine" + pump_animation = "levercarbine-cycling" diff --git a/code/modules/projectiles/guns/projectile/semiauto.dm b/code/modules/projectiles/guns/projectile/semiauto.dm index 1c2fc8e0e1..31dcf48873 100644 --- a/code/modules/projectiles/guns/projectile/semiauto.dm +++ b/code/modules/projectiles/guns/projectile/semiauto.dm @@ -24,6 +24,8 @@ icon_state = "[initial(icon_state)]-e" //Bastard child of a revolver and a semi-auto rifle. + +//Standard Revolving Rifle /obj/item/weapon/gun/projectile/revolvingrifle name = "revolving rifle" desc = "The Gungnir is a novel, antique idea brought into the modern era by Hedberg-Hammarstrom. The semi-automatic revolving mechanism offers no real advantage, but some colonists swear by it. Uses .44 magnum revolver rounds." @@ -31,7 +33,7 @@ The company operates just one production plant in Kalmar, but their weapons have found popularity on garden worlds as far afield as the Tajaran homeworld due to their excellent build quality, \ precision, and stopping power." icon_state = "revolvingrifle" - item_state = "boltaction" + item_state = "rifle" w_class = ITEMSIZE_LARGE caliber = ".44" origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2) @@ -41,8 +43,9 @@ max_shells = 6 ammo_type = /obj/item/ammo_casing/a44/rifle -/obj/item/weapon/gun/projectile/revolvingrifle/update_icon() - if(ammo_magazine) - icon_state = initial(icon_state) - else - icon_state = "[initial(icon_state)]-e" \ No newline at end of file +//Vintage Revolving Rifle +/obj/item/weapon/gun/projectile/revolvingrifle/vintage + name = "vintage revolving rifle" + desc = "The Willhem is the Gungir's older cousin by Hedberg-Hammarstrom, the perfect collector piece. The semi-automatic revolving mechanism offers no real advantage, but some colonists swear by it. Uses .44 magnum revolver rounds." + icon_state = "vintagerevolvingrifle" + diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm index d36e7a80a1..a563f16c11 100644 --- a/code/modules/random_map/random_map.dm +++ b/code/modules/random_map/random_map.dm @@ -24,6 +24,9 @@ var/global/list/map_count = list() var/floor_type = /turf/simulated/floor var/target_turf_type + var/skip_dense = FALSE + var/keep_outside = FALSE + // Storage for the final iteration of the map. var/list/map = list() // Actual map. @@ -61,11 +64,16 @@ var/global/list/map_count = list() rand_seed(seed) priority_process = 1 + var/failed = FALSE for(var/i = 0;i[capitalize(name)] generation completed in [round(0.1*(world.timeofday-start_time),0.1)] seconds.", R_DEBUG) - return - if(!do_not_announce) admin_notice("[capitalize(name)] failed to generate ([round(0.1*(world.timeofday-start_time),0.1)] seconds): could not produce sane map.", R_DEBUG) + if(!generate()) + failed = TRUE + + if(!do_not_announce) + if(!failed) + admin_notice("[capitalize(name)] generation completed in [round(0.1*(world.timeofday-start_time),0.1)] seconds.", R_DEBUG) + else + admin_notice("[capitalize(name)] failed to generate ([round(0.1*(world.timeofday-start_time),0.1)] seconds): could not produce sane map.", R_DEBUG) /datum/random_map/proc/get_map_cell(var/x,var/y) if(!map) @@ -162,11 +170,11 @@ var/global/list/map_count = list() if(!current_cell) return 0 var/turf/T = locate((origin_x-1)+x,(origin_y-1)+y,origin_z) - if(!T || (target_turf_type && !istype(T,target_turf_type))) + if(!T || (skip_dense && T.density) || (target_turf_type && !istype(T,target_turf_type))) return 0 var/newpath = get_appropriate_path(map[current_cell]) if(newpath) - T.ChangeTurf(newpath) + T.ChangeTurf(newpath, preserve_outdoors = keep_outside) get_additional_spawns(map[current_cell],T,get_spawn_dir(x, y)) return T diff --git a/code/modules/reagents/reactions/instant/drinks.dm b/code/modules/reagents/reactions/instant/drinks.dm index 5630500d63..8af513f342 100644 --- a/code/modules/reagents/reactions/instant/drinks.dm +++ b/code/modules/reagents/reactions/instant/drinks.dm @@ -185,11 +185,18 @@ required_reagents = list("gin" = 2, "tonic" = 1) result_amount = 3 +/decl/chemical_reaction/instant/drinks/rum_and_cola + name = "Rum and Cola" + id = "rumandcola" + result = "rumandcola" + required_reagents = list("rum" = 2, "cola" = 1) + result_amount = 3 + /decl/chemical_reaction/instant/drinks/cuba_libre name = "Cuba Libre" id = "cubalibre" result = "cubalibre" - required_reagents = list("rum" = 2, "cola" = 1) + required_reagents = list("rumcola" = 3, "limejuice" = 1) result_amount = 3 /decl/chemical_reaction/instant/drinks/martini @@ -329,14 +336,14 @@ name = "Long Island Iced Tea" id = "longislandicedtea" result = "longislandicedtea" - required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 3) + required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "rumcoke" = 3) result_amount = 6 /decl/chemical_reaction/instant/drinks/icedtea name = "Long Island Iced Tea" id = "longislandicedtea" result = "longislandicedtea" - required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 3) + required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "rumcoke" = 3) result_amount = 6 /decl/chemical_reaction/instant/drinks/threemileisland @@ -399,7 +406,7 @@ name = "Singulo" id = "singulo" result = "singulo" - required_reagents = list("vodka" = 5, "radium" = 1, "wine" = 5) + required_reagents = list("vodka" = 5, "radium" = 1, "redwine" = 5) result_amount = 10 /decl/chemical_reaction/instant/drinks/alliescocktail @@ -505,14 +512,14 @@ name = "Acid Spit" id = "acidspit" result = "acidspit" - required_reagents = list("sacid" = 1, "wine" = 5) + required_reagents = list("sacid" = 1, "redwine" = 5) result_amount = 6 /decl/chemical_reaction/instant/drinks/amasec name = "Amasec" id = "amasec" result = "amasec" - required_reagents = list("iron" = 1, "wine" = 5, "vodka" = 5) + required_reagents = list("iron" = 1, "redwine" = 5, "vodka" = 5) result_amount = 10 /decl/chemical_reaction/instant/drinks/changelingsting @@ -661,7 +668,7 @@ name = "Melon Spritzer" id = "melonspritzer" result = "melonspritzer" - required_reagents = list("watermelonjuice" = 2, "wine" = 2, "applejuice" = 1, "limejuice" = 1) + required_reagents = list("watermelonjuice" = 2, "redwine" = 2, "applejuice" = 1, "limejuice" = 1) result_amount = 6 /decl/chemical_reaction/instant/drinks/fauxfizz @@ -915,7 +922,7 @@ name = "Wine brandy" id = "winebrandy" result = "winebrandy" - required_reagents = list("wine" = 10) + required_reagents = list("redwine" = 10) catalysts = list("enzyme" = 10) //10u enzyme so it requires more than is usually added. Stops overlap with wine recipe result_amount = 5 @@ -937,7 +944,7 @@ name = "Vesper" id = "vesper" result = "vesper" - required_reagents = list("gin" = 3, "vodka" = 1, "wine" = 1) + required_reagents = list("gin" = 3, "vodka" = 1, "redwine" = 1) result_amount = 4 /decl/chemical_reaction/instant/drinks/rotgut diff --git a/code/modules/reagents/reactions/instant/instant.dm b/code/modules/reagents/reactions/instant/instant.dm index 4a6c25898d..46c9c458be 100644 --- a/code/modules/reagents/reactions/instant/instant.dm +++ b/code/modules/reagents/reactions/instant/instant.dm @@ -1105,14 +1105,12 @@ name = "Neutralize Carpotoxin" id = "carpotoxin_neutral" result = "protein" - required_reagents = list("radium" = 1, "carpotoxin" = 1, "sifsap" = 1) - catalysts = list("sifsap" = 10) - result_amount = 2 + required_reagents = list("enzyme" = 1, "carpotoxin" = 1, "sifsap" = 1) + result_amount = 1 /decl/chemical_reaction/instant/neutralize_spidertoxin name = "Neutralize Spidertoxin" id = "spidertoxin_neutral" result = "protein" - required_reagents = list("radium" = 1, "spidertoxin" = 1, "sifsap" = 1) - catalysts = list("sifsap" = 10) - result_amount = 2 \ No newline at end of file + required_reagents = list("enzyme" = 1, "spidertoxin" = 1, "sifsap" = 1) + result_amount = 1 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/borghypo.dm b/code/modules/reagents/reagent_containers/borghypo.dm index 813a79431d..96bb210600 100644 --- a/code/modules/reagents/reagent_containers/borghypo.dm +++ b/code/modules/reagents/reagent_containers/borghypo.dm @@ -155,6 +155,7 @@ "milk", "mint", "orangejuice", + "redwine", "rum", "sake", "sodawater", @@ -172,8 +173,7 @@ "vodka", "water", "watermelonjuice", - "whiskey", - "wine") + "whiskey") /obj/item/weapon/reagent_containers/borghypo/service/attack(var/mob/M, var/mob/user) return diff --git a/code/modules/reagents/reagents/_reagents.dm b/code/modules/reagents/reagents/_reagents.dm index 3ffb7e58e5..f8c9dee396 100644 --- a/code/modules/reagents/reagents/_reagents.dm +++ b/code/modules/reagents/reagents/_reagents.dm @@ -25,7 +25,7 @@ var/affects_dead = 0 // Does this chem process inside a corpse? var/affects_robots = 0 // Does this chem process inside a Synth? - + var/allergen_type // What potential allergens does this contain? var/allergen_factor = 1 // If the potential allergens are mixed and low-volume, they're a bit less dangerous. Needed for drinks because they're a single reagent compared to food which contains multiple seperate reagents. @@ -162,17 +162,17 @@ affect_touch(M, alien, removed) if(overdose && (volume > overdose * M?.species.chemOD_threshold) && (active_metab.metabolism_class != CHEM_TOUCH && !can_overdose_touch)) overdose(M, alien, removed) - if(M.species.allergens & allergen_type) //uhoh, we can't handle this! + if(M.species.allergens & allergen_type) //uhoh, we can't handle this! var/damage_severity = M.species.allergen_damage_severity*allergen_factor - var/disable_severity = M.species.allergen_disable_severity*allergen_factor + var/disable_severity = M.species.allergen_disable_severity*allergen_factor if(M.species.allergen_reaction & AG_TOX_DMG) - M.adjustToxLoss(damage_severity) + M.adjustToxLoss(damage_severity * removed) if(M.species.allergen_reaction & AG_OXY_DMG) - M.adjustOxyLoss(damage_severity) - if(prob(2.5*disable_severity)) + M.adjustOxyLoss(damage_severity * removed) + if(prob(2*disable_severity)) M.emote(pick("cough","gasp","choke")) if(M.species.allergen_reaction & AG_EMOTE) - if(prob(2.5*disable_severity)) //this has a higher base chance, but not *too* high + if(prob(2*disable_severity)) M.emote(pick("pale","shiver","twitch")) if(M.species.allergen_reaction & AG_PAIN) M.adjustHalLoss(disable_severity) diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm index 3c85222c1b..16c7ad946b 100644 --- a/code/modules/reagents/reagents/food_drinks.dm +++ b/code/modules/reagents/reagents/food_drinks.dm @@ -297,13 +297,6 @@ color = "#FFFFAA" allergen_type = ALLERGEN_EGGS //Eggs contain egg -/datum/reagent/nutriment/protein/murk - name = "murkfin protein" - id = "murk_protein" - taste_description = "mud" - color = "#664330" - allergen_type = ALLERGEN_FISH //Murkfin is fish - /datum/reagent/nutriment/honey name = "Honey" id = "honey" @@ -2977,12 +2970,23 @@ /datum/reagent/ethanol/cuba_libre name = "Cuba Libre" id = "cubalibre" - description = "Rum, mixed with cola. Viva la revolucion." - taste_description = "cola" + description = "Rum, mixed with cola and a splash of lime. Viva la revolucion." + taste_description = "cola with lime" color = "#3E1B00" strength = 30 glass_name = "Cuba Libre" + glass_desc = "A classic mix of rum, cola, and lime." + +/datum/reagent/ethanol/rum_and_cola + name = "Rum and Cola" + id = "rumandcola" + description = "A classic mix of sugar with more sugar." + taste_description = "cola" + color = "#3E1B00" + strength = 30 + + glass_name = "rum and cola" glass_desc = "A classic mix of rum and cola." /datum/reagent/ethanol/demonsblood diff --git a/code/modules/reagents/reagents/other.dm b/code/modules/reagents/reagents/other.dm index a479b7ada5..2bb16dbbda 100644 --- a/code/modules/reagents/reagents/other.dm +++ b/code/modules/reagents/reagents/other.dm @@ -627,10 +627,11 @@ M.adjustToxLoss(2 * removed) M.adjustCloneLoss(2 * removed) -/datum/reagent/fishbait +/datum/reagent/nutriment/fishbait name = "Fish Bait" id = "fishbait" description = "A natural slurry that particularily appeals to fish." - taste_description = "earthy" + taste_description = "slimy dirt" reagent_state = LIQUID - color = "#62764E" \ No newline at end of file + color = "#62764E" + nutriment_factor = 15 diff --git a/code/modules/reagents/reagents/toxins.dm b/code/modules/reagents/reagents/toxins.dm index dde7bf21a9..b59be5c7d1 100644 --- a/code/modules/reagents/reagents/toxins.dm +++ b/code/modules/reagents/reagents/toxins.dm @@ -67,7 +67,7 @@ /datum/reagent/toxin/neurotoxic_protein name = "toxic protein" id = "neurotoxic_protein" - description = "A weak neurotoxic chemical commonly found in Sivian fish meat." + description = "A weak neurotoxic chemical." taste_description = "fish" reagent_state = LIQUID color = "#005555" diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 173c021d1d..31b1a68f0c 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -202,8 +202,8 @@ research holder datum. id = TECH_DATA /datum/tech/syndicate - name = "Illegal Technologies Research" - desc = "The study of technologies that violate standard government regulations." + name = "Transgressive Technologies Research" + desc = "The study of technologies that sit on the very boundaries of legality and ethics." id = TECH_ILLEGAL level = 0 diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index 40efd55ba1..9f83cdf933 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -275,7 +275,7 @@ newsign.data["vmask"] = 0 newsign.data["level"] = list() - var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub") + var/pass = S.relay_information(newsign, /obj/machinery/telecomms/hub) if(!pass) - S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters + S.relay_information(newsign, /obj/machinery/telecomms/broadcaster) // send this simple message to broadcasters diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index e5bbf365a3..964e2a87f1 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -473,11 +473,9 @@ if(clean_name) var/okay = alert(target,"New name will be '[clean_name]', ok?", "Confirmation","Cancel","Ok") if(okay == "Ok") - new_name = clean_name - - new_name = sanitizeName(new_name, allow_numbers = TRUE) - target.name = new_name - target.real_name = target.name + target.name = new_name + target.real_name = target.name + return /datum/surgery_step/robotics/install_mmi/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user]'s hand slips.", \ diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm index fee9550cbe..c9eb7dbbd0 100644 --- a/code/modules/tables/interactions.dm +++ b/code/modules/tables/interactions.dm @@ -60,14 +60,30 @@ return 1 -/obj/structure/table/MouseDrop_T(obj/O as obj, mob/user as mob) +/obj/structure/table/MouseDrop_T(obj/O, mob/user, src_location, over_location, src_control, over_control, params) + if(ismob(O.loc)) //If placing an item + if(!isitem(O) || user.get_active_hand() != O) + return ..() + if(isrobot(user)) + return + user.drop_item() + if(O.loc != src.loc) + step(O, get_dir(O, src)) - if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O)) - return ..() - if(isrobot(user)) - return - user.unEquip(O, 0, src.loc) - return + else if(isturf(O.loc) && isitem(O)) //If pushing an item on the tabletop + var/obj/item/I = O + if(I.anchored) + return + + if((isliving(user)) && (Adjacent(user)) && !(user.incapacitated())) + if(O.w_class <= user.can_pull_size) + O.forceMove(loc) + auto_align(I, params, TRUE) + else + to_chat(user, SPAN_WARNING("\The [I] is too big for you to move!")) + return + + return ..() /obj/structure/table/attackby(obj/item/W as obj, mob/user as mob, var/hit_modifier, var/click_parameters) @@ -159,7 +175,7 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen /obj/item/var/list/center_of_mass = list("x" = 16,"y" = 16) -/obj/structure/table/proc/auto_align(obj/item/W, click_parameters) +/obj/structure/table/proc/auto_align(obj/item/W, click_parameters, var/animate = FALSE) if(!W.center_of_mass) W.randpixel_xy() return @@ -176,8 +192,16 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen var/cell_x = max(0, min(CELLS-1, round(mouse_x/CELLSIZE))) var/cell_y = max(0, min(CELLS-1, round(mouse_y/CELLSIZE))) - W.pixel_x = (CELLSIZE * (0.5 + cell_x)) - W.center_of_mass["x"] - W.pixel_y = (CELLSIZE * (0.5 + cell_y)) - W.center_of_mass["y"] + var/target_x = (CELLSIZE * (cell_x + 0.5)) - W.center_of_mass["x"] + var/target_y = (CELLSIZE * (cell_y + 0.5)) - W.center_of_mass["y"] + if(animate) + var/dist_x = abs(W.pixel_x - target_x) + var/dist_y = abs(W.pixel_y - target_y) + var/dist = sqrt((dist_x*dist_x)+(dist_y*dist_y)) + animate(W, pixel_x=target_x, pixel_y=target_y,time=dist*0.5) + else + W.pixel_x = target_x + W.pixel_y = target_y #undef CELLS #undef CELLSIZE diff --git a/code/modules/tables/rack.dm b/code/modules/tables/rack.dm index 69a52dbac0..3577666691 100644 --- a/code/modules/tables/rack.dm +++ b/code/modules/tables/rack.dm @@ -24,3 +24,38 @@ /obj/structure/table/rack/holorack/dismantle(obj/item/weapon/tool/wrench/W, mob/user) to_chat(user, "You cannot dismantle \the [src].") return + +/obj/structure/table/rack/steel + color = "#666666" + +/obj/structure/table/rack/steel/New() + material = get_material_by_name(MAT_STEEL) + ..() + +//Shelves + +/obj/structure/table/rack/shelf + name = "shelving" + desc = "Some nice metal shelves." + icon_state = "shelf" + +/obj/structure/table/rack/shelf/steel + color = "#666666" + +/obj/structure/table/rack/shelf/steel/New() + material = get_material_by_name(MAT_STEEL) + ..() + +//Gunrack +// SOMEONE should add cool overlay stuff to this +/obj/structure/table/rack/gun_rack + name = "gun rack" + desc = "Seems like you could prop up some rifles here." + icon_state = "gunrack" + +/obj/structure/table/rack/gun_rack/steel + color = "#666666" + +/obj/structure/table/rack/gun_rack/steel/New() + material = get_material_by_name(MAT_STEEL) + ..() \ No newline at end of file diff --git a/code/modules/vchat/js/vchat.js b/code/modules/vchat/js/vchat.js index 0748ba0125..e5fc854c72 100644 --- a/code/modules/vchat/js/vchat.js +++ b/code/modules/vchat/js/vchat.js @@ -924,7 +924,7 @@ function get_cookie(key, deffo) { // Button Controls that need background-color and text-color set. var SKIN_BUTTONS = [ - /* Rpane */ "rpane.textb", "rpane.infob", "rpane.wikib", "rpane.forumb", "rpane.rulesb", "rpane.github", "rpane.mapb", "rpane.changelog", + /* Rpane */ "rpane.textb", "rpane.infob", "rpane.wikib", "rpane.forumb", "rpane.rulesb", "rpane.github", "rpane.discord", "rpane.mapb", "rpane.changelog", /* Mainwindow */ "mainwindow.saybutton", "mainwindow.mebutton", "mainwindow.hotkey_toggle" ]; diff --git a/config/example/config.txt b/config/example/config.txt index 62ffa22a95..18ad88df30 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -247,9 +247,13 @@ GUEST_BAN ## GitHub address # GITHUBURL https://github.com/example-user/example-repository + ## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. # BANAPPEALS http://example.com +## Discord address +#DISCORDURL https://discord.gg/someinvite + ## In-game features ## spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard # FEATURE_OBJECT_SPELL_SYSTEM diff --git a/html/changelog.html b/html/changelog.html index dc0b12ff83..567fb48096 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,14 @@ -->
+

31 August 2021

+

None updated:

+ +

12 July 2021

MoondancerPony updated: