diff --git a/__DEFINES/reagents.dm b/__DEFINES/reagents.dm index 8066dd7b9e8..2c1f2d438d6 100644 --- a/__DEFINES/reagents.dm +++ b/__DEFINES/reagents.dm @@ -3,7 +3,7 @@ #define REAGENT_STATE_GAS 3 #define FOOD_METABOLISM 0.4 #define REAGENTS_OVERDOSE 30 -#define REM REAGENTS_EFFECT_MULTIPLIER +#define REM REAGENTS_EFFECT_MULTIPLIER //0.5 // Use in chem.flags. #define CHEMFLAG_DISHONORABLE 1 @@ -524,6 +524,7 @@ #define CAFFEINE "caffeine" #define MIMOSA "mimosa" #define LEMONDROP "lemondrop" +#define FEVERFEW "feverfew" #define ACRYLIC "acrylic" #define ACETONE "acetone" diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index c9aaf567500..40f6ff2d957 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -203,6 +203,7 @@ var/list/global/id_cards = list() var/registered_name = "Unknown" // The name registered_name on the card slot_flags = SLOT_ID + var/show_biometrics = TRUE //Necessary to display the below stats var/blood_type = "\[UNSET\]" var/dna_hash = "\[UNSET\]" var/fingerprint_hash = "\[UNSET\]" @@ -236,12 +237,13 @@ var/list/global/id_cards = list() user.show_message(text("The current assignment on the card is [assignment]."),1) else user.show_message(text("No assignment has been set. Use an identification computer to edit."),1) - if (dna_hash == "\[UNSET\]") - user.show_message(text("No biometric data referenced. Use a body scanner at Medbay to imprint."),1) - else - user.show_message("Blood Type: [blood_type].",1) - user.show_message("DNA: [dna_hash].",1) - user.show_message("Fingerprint: [fingerprint_hash].",1) + if(show_biometrics) + if (dna_hash == "\[UNSET\]") + user.show_message(text("No biometric data referenced. Use a body scanner at Medbay to imprint."),1) + else + user.show_message("Blood Type: [blood_type].",1) + user.show_message("DNA: [dna_hash].",1) + user.show_message("Fingerprint: [fingerprint_hash].",1) if(dchip && dchip.stamped.len) to_chat(user,"It has a demotion modchip with the following stamps: [english_list(uniquenamelist(dchip.stamped))].") diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 9fc6e1cdc67..f83ba2890eb 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -735,6 +735,16 @@ block = HEADACHEBLOCK ..() +/obj/item/weapon/dnainjector/nofail/eat + name = "DNA-Injector (Eat)" + desc = "Now I am become gut, devourer of worlds." + datatype = DNA2_BUF_SE + value = 0xFFF + +/obj/item/weapon/dnainjector/nofail/eat/initialize() + block = EATBLOCK + ..() + /obj/item/weapon/dnainjector/nofail/antiepi name = "DNA-Injector (Anti-Epi.)" desc = "Will fix you up from shaking the room." diff --git a/code/game/objects/structures/docking_port.dm b/code/game/objects/structures/docking_port.dm index 7519e457cac..a91bdcc8f81 100644 --- a/code/game/objects/structures/docking_port.dm +++ b/code/game/objects/structures/docking_port.dm @@ -272,7 +272,8 @@ var/global/list/dockinglights = list() /obj/machinery/docklight/New() ..() - dockinglights += src + if(!triggered) //don't add the permanently-on lights + dockinglights += src /obj/machinery/docklight/Destroy() dockinglights -= src @@ -292,3 +293,10 @@ var/global/list/dockinglights = list() "} + +/obj/machinery/docklight/alwayson + triggered = 1 + +/obj/machinery/docklight/alwayson/New() + ..() + update_icon() \ No newline at end of file diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index c13363bd44f..fe3670c7710 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -221,6 +221,9 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 if(reagents.has_reagent(CLOTTING_AGENT) || reagents.has_reagent(BIOFOAM)) //Clotting agent and biofoam stop bleeding entirely blood_factor = 0 + if(reagents.has_reagent(FEVERFEW)) //A powerful anticoagulant that overrides clotting agents + blood_factor = 1 + if(bodytemperature < 170) //Cryo stops bleeding entirely blood_factor = 0 diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index f2455f91fb7..b2e251f04bf 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -90,6 +90,15 @@ max_shells = 3 silencer_offset = list(22,5) +/obj/item/weapon/gun/projectile/shotgun/pump/combat/pistol + name = "shotgun pistol" + desc = "Even shortier than the combat shorty." + icon_state = "scshotgun" + w_class = W_CLASS_SMALL + slot_flags = SLOT_BELT + max_shells = 1 + silencer_offset = list(22,5) + //this is largely hacky and bad :( -Pete /obj/item/weapon/gun/projectile/shotgun/doublebarrel name = "double-barreled shotgun" diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index a920dbb509b..168a4bbd53d 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -1263,3 +1263,14 @@ var/list/laser_tag_vests = list(/obj/item/clothing/suit/tag/redtag, /obj/item/cl smoke.set_up(3, 0, T) smoke.start() return 1 + +/obj/item/projectile/beam/armawhip + name = "bullwhip" + icon = 'icons/obj/projectiles.dmi' + icon_state = "whip" + fire_sound = 'sound/weapons/whip_crack.ogg' + travel_range = 5 + damage = 10 + damage_type = BRUTE + pass_flags = PASSTABLE + eyeblur = 0 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 56d4cba0182..8017ccc3c65 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -14,7 +14,11 @@ SHC = (for(components of recipe) total_SHC *= component SHC) -*///NO DON'T DO THAT, IF YOU'RE NOT SURE JUST KEEP IT AT WATER'S. IF YOU GET SOMETHING ABOVE 10 LET ALONE IN THE HUNDREDS YOU'RE PROBABLY DOING SOMETHING VERY WRONG + NO DON'T DO THAT, IF YOU'RE NOT SURE JUST KEEP IT AT WATER'S. IF YOU GET SOMETHING ABOVE 10 LET ALONE IN THE HUNDREDS YOU'RE PROBABLY DOING SOMETHING VERY WRONG + + It is very common to use REAGENTS_METABOLISM (0.2) or REM / REGEANTS_EFFECT_MULTIPLIER (0.5) in this file. + +*/ /datum/reagent var/name = "Reagent" @@ -6129,6 +6133,20 @@ var/procizine_tolerance = 0 color = "#D9C0E7" //rgb: 217, 192, 231 custom_metabolism = 0.1 +//Anticoagulant. Great for helping the body fight off viruses but makes one vulnerable to pain, bleeding, and brute damage. +/datum/reagent/antipathogenic/feverfew + name = "Feverfew" + id = FEVERFEW + description = "Feverfew is a natural anticoagulant useful in fending off viruses, but it leaves one vulnerable to pain and bleeding." + color = "#b5651d" + pain_resistance = -25 + data = list ("threshold" = 80) + +/datum/reagent/feverfew/on_mob_life(var/mob/living/M) + if(..()) + return 1 + M.adjustBruteLoss(5 * REM) //2.5 per tick, human healing is around 1.5~2 so this is just barely noticable + /datum/reagent/caffeine name = "Caffeine" id = CAFFEINE diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm index ddf71d78a43..38381de2409 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm @@ -545,3 +545,14 @@ var/global/list/valid_random_food_types = existing_typesof(/obj/item/weapon/reag desc = pick("Whichever nerves were keeping it wriggling have been ripped off by now.", "It's a lot more foul smelling once you bite into it.", "There's some slimy substance leaking out of it.", "Was this really a good idea?") else desc = pick("There's barely anything left of it.", "It could have lived happily in your brain, you know.", "It was only here to help.", "Poor thing.", "You monster.", "At least it's nutritious.") + +/obj/item/weapon/reagent_containers/food/snacks/meat/bullmeat + name = "carne de lidia" + desc = "En algunos lugares, la tauromaquia es incruenta. Aqui no." + icon_state = "bearmeat" + +/obj/item/weapon/reagent_containers/food/snacks/meat/bullmeat/New() + ..() + reagents.add_reagent(NUTRIMENT, 12) + reagents.add_reagent(BICARIDINE, 5) + bitesize = 3 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 3925daae71d..67d3d0e339e 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -515,6 +515,14 @@ ..() reagents.add_reagent(ARITHRAZINE, 10) +/obj/item/weapon/reagent_containers/pill/lithotorcrazine + name = "lithotorcrazine pill" + desc = "Shields the body against radiation buildup, but does not cure it. Lasts around 5 minutes." + icon_state = "pill38" + +/obj/item/weapon/reagent_containers/pill/lithotorcrazine/New() + ..() + reagents.add_reagent(LITHOTORCRAZINE, 30) /obj/item/weapon/reagent_containers/pill/nanofloxacin name = "nanofloxacin pill" diff --git a/icons/obj/candle.dmi b/icons/obj/candle.dmi index df5e5cf433e..770b91ea5b5 100644 Binary files a/icons/obj/candle.dmi and b/icons/obj/candle.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 896758a8929..19575f6db9f 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/flora/ausflora.dmi b/icons/obj/flora/ausflora.dmi index 33584c52c40..2f21f1354e2 100644 Binary files a/icons/obj/flora/ausflora.dmi and b/icons/obj/flora/ausflora.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index a878426dea8..52ad065014b 100755 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/turf/meat.dmi b/icons/turf/meat.dmi new file mode 100644 index 00000000000..98664fb8595 Binary files /dev/null and b/icons/turf/meat.dmi differ diff --git a/icons/turf/rock_overlay.dmi b/icons/turf/rock_overlay.dmi index f1e65b44393..06cb63a3128 100644 Binary files a/icons/turf/rock_overlay.dmi and b/icons/turf/rock_overlay.dmi differ diff --git a/maps/RandomZLevels/wildwest_props.dm b/maps/RandomZLevels/wildwest_props.dm new file mode 100644 index 00000000000..43a157000df --- /dev/null +++ b/maps/RandomZLevels/wildwest_props.dm @@ -0,0 +1,328 @@ +//Turf +/turf/unsimulated/wall/meat + name = "?" + desc = null + icon = 'icons/turf/meat.dmi' + icon_state = "meat255" + +/turf/unsimulated/wall/meat/canSmoothWith() + return null + +/turf/unsimulated/wall/guts + name = "guts" + desc = "Some kind of twisting intestinal layers." + icon = 'icons/turf/meat.dmi' + icon_state = "guts0" + walltype = "guts" + +/turf/unsimulated/wall/guts/canSmoothWith() + var/static/list/smoothables = list(/turf/unsimulated/wall/guts) + return smoothables + +/turf/simulated/floor/plating/flesh + name = "?" + desc = null + icon = 'icons/turf/meat.dmi' + icon_state = "flesh" + +/turf/simulated/floor/plating/flesh/New() + ..() + var/image/img = image('icons/turf/rock_overlay.dmi', "flesh_overlay",layer = SIDE_LAYER) + img.pixel_x = -4*PIXEL_MULTIPLIER + img.pixel_y = -4*PIXEL_MULTIPLIER + img.plane = relative_plane(ABOVE_TURF_PLANE) + overlays += img + +//Objects +/obj/item/voucher/free_item/scrip + name = "scrip" + desc = "Redeem at a Deepvein Trust vendor." + freebies = list() + vend_amount = 1 + single_items = 1 + shred_on_use = 1 + +/obj/item/voucher/free_item/scrip/liberator + name = "liberator scrip" + freebies = list(/obj/item/weapon/gun/energy/laser/liberator) + +/obj/item/voucher/free_item/scrip/drill + name = "drill scrip" + freebies = list(/obj/item/weapon/pickaxe/drill) + +/obj/item/voucher/free_item/scrip/lazarus + name = "lazarus scrip" + freebies = list(/obj/item/weapon/lazarus_injector) + +/obj/item/voucher/free_item/scrip/rifle + name = "rifle scrip" + freebies = list(/obj/item/weapon/gun/projectile/hecate/hunting) + +/obj/item/voucher/free_item/scrip/sausage + name = "sausage scrip" + freebies = list(/obj/item/weapon/reagent_containers/food/snacks/sausage) + +/obj/item/voucher/free_item/scrip/threefiftyseven + name = ".357 scrip" + freebies = list(/obj/item/ammo_storage/box/a357) + +/obj/machinery/vending/deepvein + name = "\improper Deepvein Trust Company Store" + desc = "Use your 'wages' here!" + product_slogans = list( + "Please have your scrip ready for vending." + ) + product_ads = list( + "Insert scrip." + ) + vend_reply = "Scrip, scip, lovely scrip!" + icon_state = "mining" + vouched = list( + /obj/item/weapon/pickaxe/drill = 10, + /obj/item/weapon/lazarus_injector = 10, + /obj/item/weapon/gun/energy/laser/liberator = 10, + /obj/item/weapon/gun/projectile/hecate/hunting = 10, + /obj/item/weapon/reagent_containers/food/snacks/sausage = 10, + /obj/item/ammo_storage/box/a357 = 20 + ) + +/obj/item/weapon/card/id/deputy + name = "deputy badge" + desc = "A metal star that signifies one as a friend of Old Zounds. You're my favorite deputy." + assignment = "Deputy" + icon_state = "deputystar" + //access = list(access_deputy) + show_biometrics = FALSE + +/obj/machinery/media/jukebox/folk + name = "Old Timey Jukebox" + + change_cost = 0 + + playlist_id="folk" + // Must be defined on your server. + playlists=list( + "folk" = "House Specials" + ) + +/obj/structure/uraninitecrystal + name = "glowing crystal" + icon = 'icons/obj/mining.dmi' + icon_state = "crystal" + light_color = "#00FF00" + anchored = TRUE + var/lit = 0 + +/obj/structure/uraninitecrystal/New() + ..() + set_light(2, l_color = light_color) + +/obj/structure/uraninitecrystal/bullet_act() + rad_pulse(10) + +/obj/structure/uraninitecrystal/kick_act() + shake(1, 3) + rad_pulse(10) + +/obj/structure/uraninitecrystal/ex_act() + rad_pulse(4) + ..() + +/obj/structure/uraninitecrystal/proc/rad_pulse(remaining) + lit += remaining + lit = clamp(0,lit,40) + if(!lit) + set_light(2, l_color = light_color) + return + set_light(6, l_color = light_color) + emitted_harvestable_radiation(get_turf(src), 20, range = 5) + for(var/mob/living/carbon/M in view(src,3)) + var/rads = 50 * sqrt( 1 / (get_dist(M, src) + 1) ) + M.apply_radiation(round(rads/2),RAD_EXTERNAL) + spawn(2 SECONDS) + rad_pulse(-2) //After 2 seconds, recurse with decrement + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/dorf/New() + ..() + reagents.add_reagent(MANLYDORF, 50) + on_reagent_change() + +/obj/structure/cartrail + name = "rail" + desc = "A hunk of shaped metal." + icon = 'icons/obj/mining.dmi' + icon_state = "rail" + +/obj/structure/rustycart + name = "rusty cart" + desc = "This isn't going anywhere fast." + //old icon and state in 'icons/obj/vehicles.dmi' "mining_cart" + icon = 'icons/obj/storage/storage.dmi' + icon_state = "miningcar" + anchored = TRUE + density = TRUE + +/obj/structure/flora/desert + icon = 'icons/obj/flora/ausflora.dmi' + shovelaway = TRUE + +/obj/structure/flora/desert/barrelcactus + name = "barrel cactus" + desc = "That's a barrel. Wait, no." + anchored = TRUE + icon_state = "barrelcactus_1" + +/obj/structure/flora/desert/barrelcactus/New() + ..() + icon_state = "barrelcactus_[rand(1,2)]" + +/obj/structure/flora/desert/barrelcactus/Crossed(atom/movable/AM) + ..() + if(iscarbon(AM)) + var/mob/living/carbon/L = AM + L.reagents.add_reagent(FEVERFEW,3) //This will take 15 ticks to clear, doing about 22 brute (but brute regens easily) + to_chat(L, "You prick yourself on \the [src].") + +/obj/structure/flora/desert/saguaro + name = "saguaro cactus" + desc = "The space saguaro gets its name from the Earth saguaro, which comes from an indigenous Opata word that refers to saguaros." + density = TRUE + pass_flags_self = PASSTABLE | PASSGLASS + anchored = TRUE + icon_state = "saguaro_1" + +/obj/structure/flora/desert/saguaro/Bumped(atom/movable/AM) + ..() + if(iscarbon(AM)) + var/mob/living/carbon/L = AM + L.reagents.add_reagent(FEVERFEW,3) + to_chat(L, "You prick yourself on \the [src].") + +/obj/structure/flora/desert/saguaro/New() + ..() + icon_state = "saguaro_[rand(1,2)]" + +/obj/structure/flora/desert/tumbleweed + name = "tumbleweed" + desc = "Please, just tumble away. You might need my help some day. Tumble away." + icon_state = "tumbleweed" + +/obj/structure/flora/desert/tumbleweed/New() + ..() + processing_objects += src + +/obj/structure/flora/desert/tumbleweed/Destroy() + processing_objects -= src + ..() + +/obj/structure/flora/desert/tumbleweed/process() + if(prob(98)) + return + throw_at(get_turf(pick(orange(7,src))), 10,2) + +/obj/structure/sarcophagus + name = "sarcophagus" + desc = "Although often associated with Egyptians, sarcophagus is a Greek word meaning 'eater of flesh'. It refers to any stone burial receptacle." + density = TRUE + anchored = TRUE + icon = 'icons/obj/stationobjs.dmi' + icon_state = "morguestone" + +///////////////Effects////////////// + +/obj/effect/floating_candle + name = "floating candle" + desc = "The ghost of a candle? This is extremely cursed." + icon = 'icons/obj/candle.dmi' + icon_state = "floatcandle" + anchored = TRUE + +/obj/effect/floating_candle/New() + ..() + set_light(4, 2, LIGHT_COLOR_CYAN) + +/obj/effect/tractorbeam + name = "tractor beam" + desc = "???" + icon = null + icon_state = null + anchored = TRUE + density = TRUE + var/turf/endpoint + +/obj/effect/tractorbeam/New() + ..() + set_light(4, 8, LIGHT_COLOR_HALOGEN) + for(var/obj/effect/landmark/L in landmarks_list) + if(L.name == "tractor beam") + endpoint = get_turf(L) + break + +/obj/effect/tractorbeam/Bumped(atom/movable/AM) + AM.forceMove(endpoint) + if(ismob(AM)) + AM << 'sound/music/xfiles.ogg' + to_chat(AM, "Gravity seems to lapse as you float into the sky!") + +//Landmarks +/obj/effect/landmark/respawner/desert + name = "Wild West respawner" + +///Spells +/mob/living/proc/mountup() + for(var/spell/mountup/M in spell_list) + M.cast(src,src) + return + +/spell/mountup + name = "Mount Up" + desc = "Mount a steed." + charge_max = 0 + spell_flags = 0 + cast_delay = 2 SECONDS + var/obj/effect/overlay/my_overlay + var/active = FALSE + var/remembered_speed + +/spell/mountup/New() + ..() + my_overlay = new /obj/effect/overlay/horsebroom_mount + +/spell/mountup/choose_targets(var/mob/user = usr) + return list(user) + +/spell/mountup/perform(mob/user = usr, skipcharge = 0, list/target_override) + cast_delay = active ? 0 : initial(cast_delay) + ..() + +/spell/mountup/cast(var/list/targets, var/mob/user) + if(!active) + var/choosefile = pick('sound/items/jinglebell1.ogg','sound/items/jinglebell2.ogg','sound/items/jinglebell3.ogg') + playsound(user, choosefile, 100, 1) + user.register_event(/event/damaged, src, nameof(src::dismount())) + user.overlays.Add(my_overlay) + active = TRUE + if(istype(user,/mob/living/simple_animal)) + var/mob/living/simple_animal/SA = user + remembered_speed = SA.speed + SA.speed = max(0.6, SA.speed-0.4) + else + dismount() + +/spell/mountup/proc/dismount(kind, amount) + var/mob/living/user = src.holder + playsound(user, 'sound/voice/cow.ogg', 100, 1) + user.overlays.Remove(my_overlay) + user.unregister_event(/event/damaged, src, nameof(src::dismount())) + active = FALSE + if(istype(user,/mob/living/simple_animal)) + var/mob/living/simple_animal/SA = user + SA.speed = remembered_speed + +/obj/effect/overlay/horsebroom_mount + name = "steed" + icon = 'icons/mob/in-hand/left/items_lefthand.dmi' + icon_state = "horsebroom0" + layer = VEHICLE_LAYER + plane = FLOAT_PLANE + 2 + mouse_opacity = 0 // Probably does nothing on overlays \ No newline at end of file diff --git a/sound/music/xfiles.ogg b/sound/music/xfiles.ogg new file mode 100644 index 00000000000..39d85338f39 Binary files /dev/null and b/sound/music/xfiles.ogg differ diff --git a/vgstation13.dme b/vgstation13.dme index 8271243b89a..47f5315af16 100644 --- a/vgstation13.dme +++ b/vgstation13.dme @@ -2916,5 +2916,6 @@ #include "maps\RandomZLevels\stationCollision.dm" #include "maps\RandomZLevels\tomb.dm" #include "maps\RandomZLevels\wildwest.dm" +#include "maps\RandomZLevels\wildwest_props.dm" #include "maps\wheelstation\areas.dm" // END_INCLUDE