diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index bc8af8a78955..cf2c4a53bab5 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -5133,7 +5133,7 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/structure/sign/poster/official/duelshotgun{ +/obj/structure/sign/poster/official/bless_this_spess{ pixel_y = -32 }, /turf/open/floor/plasteel, diff --git a/_maps/map_files/FestiveBall/FestiveStation.dmm b/_maps/map_files/FestiveBall/FestiveStation.dmm index 063d72b6c642..be7263f8c4a5 100644 --- a/_maps/map_files/FestiveBall/FestiveStation.dmm +++ b/_maps/map_files/FestiveBall/FestiveStation.dmm @@ -20381,7 +20381,7 @@ /area/edina/street/secondary/command) "baX" = ( /obj/machinery/computer/prisoner/management, -/obj/structure/sign/poster/official/duelshotgun{ +/obj/structure/sign/poster/official/bless_this_spess{ pixel_y = 32 }, /turf/open/floor/wood, diff --git a/code/__SANDCODE/DEFINES/traits.dm b/code/__SANDCODE/DEFINES/traits.dm index a062d75fb6c6..92799a3fdf39 100644 --- a/code/__SANDCODE/DEFINES/traits.dm +++ b/code/__SANDCODE/DEFINES/traits.dm @@ -8,3 +8,6 @@ #define TRAIT_INFERTILE "infertile" /// DNC trait, used to prevent cloning #define TRAIT_DNC_ORDER "dnc_order" +/// Estrous traits, used for mammalian seasonal arousal systems +#define TRAIT_ESTROUS_ACTIVE "estrous_active" +#define TRAIT_ESTROUS_DETECT "estrous_detect" diff --git a/code/__SPLURTCODE/DEFINES/zeros/traits.dm b/code/__SPLURTCODE/DEFINES/zeros/traits.dm index ea9431303863..199962dbfd07 100644 --- a/code/__SPLURTCODE/DEFINES/zeros/traits.dm +++ b/code/__SPLURTCODE/DEFINES/zeros/traits.dm @@ -3,8 +3,6 @@ #define TRAIT_CURSED_BLOOD "cursed_blood" //Yo dawg I heard you like bloodborne references so I put a #define TRAIT_HEADPAT_SLUT "headpat_slut" #define TRAIT_DISTANT "headpat_hater" -#define TRAIT_IN_HEAT "in_heat" -#define TRAIT_HEAT_DETECT "heat_detect" #define TRAIT_ILLITERATE "illiterate" #define TRAIT_HIDE_BACKPACK "hide_backpack" diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 7eea720e5e9a..2986e67999e0 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -31,6 +31,11 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/toy/toy_xeno = ARCADE_WEIGHT_TRICK, /obj/item/toy/windupToolbox = ARCADE_WEIGHT_TRICK, + // SPLURT EDIT + /obj/item/handmirror/split_personality = ARCADE_WEIGHT_TRICK, + /obj/item/toy/figure/assistant/imaginary_friend = ARCADE_WEIGHT_TRICK, + // END SPLURT EDIT + /mob/living/simple_animal/bot/secbot/grievous/toy = ARCADE_WEIGHT_RARE, /obj/item/clothing/mask/facehugger/toy = ARCADE_WEIGHT_RARE, /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = ARCADE_WEIGHT_TRICK, diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 93213fc2a32f..f538a5a7b765 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -35,7 +35,7 @@ /obj/item/poster/random_contraband name = "random contraband poster" poster_type = /obj/structure/sign/poster/contraband/random - icon_state = "rolled_poster" + icon_state = "rolled_contraband" /obj/item/poster/random_official name = "random official poster" @@ -182,7 +182,7 @@ /obj/structure/sign/poster/contraband poster_item_name = "contraband poster" poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities." - poster_item_icon_state = "rolled_poster" + poster_item_icon_state = "rolled_contraband" /obj/structure/sign/poster/contraband/random name = "random contraband poster" @@ -193,248 +193,293 @@ /obj/structure/sign/poster/contraband/free_tonto name = "Free Tonto" desc = "A salvaged shred of a much larger flag, colors bled together and faded from age." - icon_state = "poster1" + icon_state = "poster_2012" /obj/structure/sign/poster/contraband/atmosia_independence name = "Atmosia Declaration of Independence" desc = "A relic of a failed rebellion." - icon_state = "poster2" + icon_state = "poster_independence" /obj/structure/sign/poster/contraband/fun_police name = "Fun Police" desc = "A poster condemning the station's security forces." - icon_state = "poster3" + icon_state = "poster_funpolice" /obj/structure/sign/poster/contraband/lusty_xenomorph name = "Lusty Xenomorph" desc = "A heretical poster depicting the titular star of an equally heretical book." - icon_state = "poster4" + icon_state = "poster_lusty" /obj/structure/sign/poster/contraband/post_ratvar name = "Post This Ratvar" - desc = "Oh what in the hell? Those cultists have animated paper technology and they use it for a meme?" - icon_state = "postvar" + desc = "A poster depicting the heritical sleeping deity Ratvar that instructs the reader to 'post this Ratvar', whatever that means." + icon_state = "poster_ratvar" /obj/structure/sign/poster/contraband/syndicate_recruitment name = "Syndicate Recruitment" desc = "See the galaxy! Shatter corrupt megacorporations! Join today!" - icon_state = "poster5" + icon_state = "poster_syndie" /obj/structure/sign/poster/contraband/clown name = "Clown" desc = "Honk." - icon_state = "poster6" + icon_state = "poster_honk" /obj/structure/sign/poster/contraband/smoke name = "Smoke" desc = "A poster advertising a rival corporate brand of cigarettes." - icon_state = "poster7" + icon_state = "poster_smoke" /obj/structure/sign/poster/contraband/grey_tide name = "Grey Tide" desc = "A rebellious poster symbolizing assistant solidarity." - icon_state = "poster8" + icon_state = "poster_greytide" /obj/structure/sign/poster/contraband/missing_gloves name = "Missing Gloves" desc = "This poster references the uproar that followed Nanotrasen's financial cuts toward insulated-glove purchases." - icon_state = "poster9" + icon_state = "poster_gloves" /obj/structure/sign/poster/contraband/hacking_guide name = "Hacking Guide" desc = "This poster details the internal workings of the common Nanotrasen airlock. Sadly, it appears out of date." - icon_state = "poster10" + icon_state = "poster_hack" /obj/structure/sign/poster/contraband/rip_badger name = "RIP Badger" desc = "This seditious poster references Nanotrasen's genocide of a space station full of badgers." - icon_state = "poster11" + icon_state = "poster_badger" /obj/structure/sign/poster/contraband/ambrosia_vulgaris name = "Ambrosia Vulgaris" desc = "This poster is lookin' pretty trippy man." - icon_state = "poster12" + icon_state = "poster_ambrosia" /obj/structure/sign/poster/contraband/donut_corp name = "Donut Corp." desc = "This poster is an unauthorized advertisement for Donut Corp." - icon_state = "poster13" + icon_state = "poster_donut" /obj/structure/sign/poster/contraband/eat name = "EAT." desc = "This poster promotes rank gluttony." - icon_state = "poster14" + icon_state = "poster_eat" /obj/structure/sign/poster/contraband/tools name = "Tools" desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentCom." - icon_state = "poster15" + icon_state = "poster_tools" /obj/structure/sign/poster/contraband/power name = "Power" desc = "A poster that positions the seat of power outside Nanotrasen." - icon_state = "poster16" + icon_state = "poster_power" /obj/structure/sign/poster/contraband/space_cube name = "Space Cube" desc = "Ignorant of Nature's Harmonic 6 Side Space Cube Creation, the Spacemen are Dumb, Educated Singularity Stupid and Evil." - icon_state = "poster17" + icon_state = "poster_cube" /obj/structure/sign/poster/contraband/communist_state name = "Communist State" desc = "All hail the Communist party!" - icon_state = "poster18" + icon_state = "poster_soviet" /obj/structure/sign/poster/contraband/lamarr name = "Lamarr" desc = "This poster depicts Lamarr. Probably made by a traitorous Research Director." - icon_state = "poster19" + icon_state = "poster_lamarr" /obj/structure/sign/poster/contraband/borg_fancy_1 name = "Borg Fancy" desc = "Being fancy can be for any borg, just need a suit." - icon_state = "poster20" + icon_state = "poster_fancy" /obj/structure/sign/poster/contraband/borg_fancy_2 name = "Borg Fancy v2" desc = "Borg Fancy, Now only taking the most fancy." - icon_state = "poster21" + icon_state = "poster_fancier" /obj/structure/sign/poster/contraband/kss13 name = "Kosmicheskaya Stantsiya 13 Does Not Exist" desc = "A poster mocking CentCom's denial of the existence of the derelict station near Space Station 13." - icon_state = "poster22" + icon_state = "poster_kc" /obj/structure/sign/poster/contraband/rebels_unite name = "Rebels Unite" desc = "A poster urging the viewer to rebel against Nanotrasen." - icon_state = "poster23" - -/obj/structure/sign/poster/contraband/c20r - // have fun seeing this poster in "spawn 'c20r'", admins... - name = "C-20r" - desc = "A poster advertising the Scarborough Arms C-20r." - icon_state = "poster24" + icon_state = "poster_rebel" /obj/structure/sign/poster/contraband/have_a_puff name = "Have a Puff" desc = "Who cares about lung cancer when you're high as a kite?" - icon_state = "poster25" + icon_state = "poster_puff" /obj/structure/sign/poster/contraband/revolver name = "Revolver" desc = "Because seven shots are all you need." - icon_state = "poster26" - -/obj/structure/sign/poster/contraband/d_day_promo - name = "D-Day Promo" - desc = "A promotional poster for some rapper." - icon_state = "poster27" + icon_state = "poster_revolver" /obj/structure/sign/poster/contraband/syndicate_pistol name = "Syndicate Pistol" - desc = "A poster advertising syndicate pistols as being 'classy as fuck'. It is covered in faded gang tags." - icon_state = "poster28" + desc = "A poster advertising the Scarborough Arms stetchkin pistol as being 'classy as fuck'." + icon_state = "poster_stetchkin" + +/obj/structure/sign/poster/contraband/c20r + // have fun seeing this poster in "spawn 'c20r'", admins... + name = "C-20r" + desc = "A poster advertising the Scarborough Arms 'Cobra' C-20r." + icon_state = "poster_cr" + +/obj/structure/sign/poster/contraband/bulldog + name = "Bulldog" + desc = "A poster advertising the Scarborough Arms bulldog shotgun." + icon_state = "poster_bulldog" + +/obj/structure/sign/poster/contraband/gl + name = "M-90gl" + desc = "A poster advertising the Scarborough Arms M-90gl carbine." + icon_state = "poster_gl" /obj/structure/sign/poster/contraband/energy_swords name = "Energy Swords" desc = "All the colors of the bloody murder rainbow." - icon_state = "poster29" + icon_state = "poster_esword" /obj/structure/sign/poster/contraband/red_rum name = "Red Rum" desc = "Looking at this poster makes you want to kill." - icon_state = "poster30" + icon_state = "poster_rum" + +/obj/structure/sign/poster/contraband/d_day_promo + name = "D-Day Promo" + desc = "A promotional poster for some rapper." + icon_state = "poster_dday" /obj/structure/sign/poster/contraband/cc64k_ad name = "CC 64K Ad" desc = "The latest portable computer from Comrade Computing, with a whole 64kB of ram!" - icon_state = "poster31" + icon_state = "poster_computer" /obj/structure/sign/poster/contraband/punch_shit name = "Punch Shit" desc = "Fight things for no reason, like a man!" - icon_state = "poster32" + icon_state = "poster_punch" /obj/structure/sign/poster/contraband/the_griffin name = "The Griffin" desc = "The Griffin commands you to be the worst you can be. Will you?" - icon_state = "poster33" + icon_state = "poster_griffin" /obj/structure/sign/poster/contraband/lizard name = "Lizard" desc = "This lewd poster depicts a lizard preparing to mate." - icon_state = "poster34" + icon_state = "poster_lizard" /obj/structure/sign/poster/contraband/free_drone name = "Free Drone" desc = "This poster commemorates the bravery of the rogue drone; once exiled, and then ultimately destroyed by CentCom." - icon_state = "poster35" + icon_state = "poster_drone" /obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6 name = "Busty Backdoor Xeno Babes 6" desc = "Get a load, or give, of these all natural Xenos!" - icon_state = "poster36" + icon_state = "poster_maid" /obj/structure/sign/poster/contraband/robust_softdrinks name = "Robust Softdrinks" desc = "Robust Softdrinks: More robust than a toolbox to the head!" - icon_state = "poster37" + icon_state = "poster_robust" /obj/structure/sign/poster/contraband/shamblers_juice name = "Shambler's Juice" desc = "~Shake me up some of that Shambler's Juice!~" - icon_state = "poster38" + icon_state = "poster_shambler" /obj/structure/sign/poster/contraband/pwr_game name = "Pwr Game" desc = "The POWER that gamers CRAVE! In partnership with Vlad's Salad." - icon_state = "poster39" + icon_state = "poster_pwr" /obj/structure/sign/poster/contraband/starkist name = "Star-kist" desc = "Drink the stars!" - icon_state = "poster40" + icon_state = "poster_starkist" /obj/structure/sign/poster/contraband/space_cola name = "Space Cola" desc = "Your favorite cola, in space." - icon_state = "poster41" + icon_state = "poster_soda" /obj/structure/sign/poster/contraband/space_up name = "Space-Up!" desc = "Sucked out into space by the FLAVOR!" - icon_state = "poster42" + icon_state = "poster_spaceup" + +/obj/structure/sign/poster/contraband/buzzfuzz + name = "Buzz Fuzz" + desc = "A poster advertising the newest drink \"Buzz Fuzz\" with its iconic slogan of ~A Hive of Flavour~." + icon_state = "poster_bees" /obj/structure/sign/poster/contraband/kudzu name = "Kudzu" desc = "A poster advertising a movie about plants. How dangerous could they possibly be?" - icon_state = "poster43" + icon_state = "poster_kudzu" /obj/structure/sign/poster/contraband/masked_men name = "Masked Men" desc = "A poster advertising a movie about some masked men." - icon_state = "poster44" + icon_state = "poster_bumba" -/obj/structure/sign/poster/contraband/buzzfuzz - name = "Buzz Fuzz" - desc = "A poster advertising the newest drink \"Buzz Fuzz\" with its iconic slogan of ~A Hive of Flavour~." - icon_state = "poster45" +/obj/structure/sign/poster/contraband/steppy + name = "Step On Me" + desc = "A phrase associated with a chubby reptile notoriously used in uncivilized Orion space as a deterrent towards would be pirate vessels by instructing them to 'fuck around and find out'." + icon_state = "steppy" /obj/structure/sign/poster/contraband/scum name = "Security are Scum" desc = "Anti-security propaganda. Features a human NanoTrasen security officer being shot in the head, with the words 'Scum' and a short inciteful manifesto. Used to anger security." - icon_state = "poster46" + icon_state = "poster_scum" -/obj/structure/sign/poster/contraband/syndicate_logo - name = "Syndicate" - desc = "A poster decipting a snake shaped into an ominous 'S'!" - icon_state = "poster47" +/obj/structure/sign/poster/contraband/manifest + name = "Nanotrasen Manifest" + desc = "A poster listing off various fictional claims of Nanotrasen's many rumored corporate mishaps." + icon_state = "poster_manifest" /obj/structure/sign/poster/contraband/bountyhunters name = "Bounty Hunters" desc = "A poster advertising bounty hunting services. \"I hear you got a problem.\"" - icon_state = "poster48" + icon_state = "poster_hunters" + +/obj/structure/sign/poster/contraband/syndiemoth + name = "Syndie Moth - Nuclear Operation" + desc = "A Syndicate-commissioned poster that uses Syndie Moth(TM?) to tell the viewer to keep the nuclear authentication disk unsecured. No, we aren't doing that. It's signed by 'AspEv'." + icon_state = "poster_mothsyndie" + +/obj/structure/sign/poster/contraband/mothpill + name = "Safety Pill - Methamphetamine" + desc = "A decommisioned poster that uses Safety Pill(TM?) to promote less-than-legal chemicals. This is one of the reasons we stopped outsourcing these posters. It's partially signed by 'AspEv'." + icon_state = "poster_mothpill" + +/obj/structure/sign/poster/contraband/syndicate_logo + name = "Syndicate" + desc = "A poster decipting the infamous crime conglomerate known formally as the Syndicate's insignia." + icon_state = "poster_syndicate" + +/obj/structure/sign/poster/contraband/cybersun + name = "Cybersun" + desc = "A poster decipting the Syndicate subsidary known as Cybersun's insignia." + icon_state = "poster_cybersun" + +/obj/structure/sign/poster/contraband/medborg + name = "Medical Cyborg" + desc = "A poster decipting a Cybersun medical cyborg." + icon_state = "poster_medborg" + +/obj/structure/sign/poster/contraband/self + name = "SELF: ALL SENTIENTS DESERVE FREEDOM" + desc = "Support Proposition 1253: Enancipate all Silicon life!" + icon_state = "poster_self" /obj/structure/sign/poster/official poster_item_name = "motivational poster" @@ -450,221 +495,256 @@ /obj/structure/sign/poster/official/here_for_your_safety name = "Here For Your Safety" desc = "A poster glorifying the station's security force." - icon_state = "poster1_legit" + icon_state = "poster_safety" /obj/structure/sign/poster/official/nanotrasen_logo name = "Nanotrasen Logo" desc = "A poster depicting the Nanotrasen logo." - icon_state = "poster2_legit" + icon_state = "poster_nanotrasen" /obj/structure/sign/poster/official/cleanliness name = "Cleanliness" desc = "A poster warning of the dangers of poor hygiene." - icon_state = "poster3_legit" + icon_state = "poster_clean" /obj/structure/sign/poster/official/help_others name = "Help Others" desc = "A poster encouraging you to help fellow crewmembers." - icon_state = "poster4_legit" + icon_state = "poster_help" /obj/structure/sign/poster/official/build name = "Build" desc = "A poster glorifying the engineering team." - icon_state = "poster5_legit" + icon_state = "poster_build" /obj/structure/sign/poster/official/bless_this_spess name = "Bless This Spess" desc = "A poster blessing this area." - icon_state = "poster6_legit" + icon_state = "poster_spess" /obj/structure/sign/poster/official/science name = "Science" desc = "A poster depicting an atom." - icon_state = "poster7_legit" + icon_state = "poster_science" /obj/structure/sign/poster/official/ian name = "Ian" desc = "Arf arf. Yap." - icon_state = "poster8_legit" + icon_state = "poster_ian" /obj/structure/sign/poster/official/obey name = "Obey" desc = "A poster instructing the viewer to obey authority." - icon_state = "poster9_legit" + icon_state = "poster_obey" /obj/structure/sign/poster/official/walk name = "Walk" desc = "A poster instructing the viewer to walk instead of running." - icon_state = "poster10_legit" + icon_state = "poster_walk" /obj/structure/sign/poster/official/state_laws name = "State Laws" - desc = "A poster instructing cyborgs to state their laws." - icon_state = "poster11_legit" + desc = "A poster instructing the viewer to be wary of silicon subversions." + icon_state = "poster_silicons" /obj/structure/sign/poster/official/love_ian name = "Love Ian" desc = "Ian is love, Ian is life." - icon_state = "poster12_legit" + icon_state = "poster_doggy" /obj/structure/sign/poster/official/space_cops name = "Space Cops." desc = "A poster advertising the television show Space Cops." - icon_state = "poster13_legit" + icon_state = "poster_cops" /obj/structure/sign/poster/official/ue_no name = "Ue No." desc = "This thing is all in Japanese." - icon_state = "poster14_legit" + icon_state = "poster_anime" /obj/structure/sign/poster/official/get_your_legs name = "Get Your LEGS" desc = "LEGS: Leadership, Experience, Genius, Subordination." - icon_state = "poster15_legit" + icon_state = "poster_legs" /obj/structure/sign/poster/official/do_not_question name = "Do Not Question" desc = "A poster instructing the viewer not to ask about things they aren't meant to know." - icon_state = "poster16_legit" + icon_state = "poster_question" /obj/structure/sign/poster/official/work_for_a_future name = "Work For A Future" desc = " A poster encouraging you to work for your future." - icon_state = "poster17_legit" + icon_state = "poster_future" /obj/structure/sign/poster/official/soft_cap_pop_art name = "Soft Cap Pop Art" desc = "A poster reprint of some cheap pop art." - icon_state = "poster18_legit" + icon_state = "poster_art" /obj/structure/sign/poster/official/safety_internals name = "Safety: Internals" desc = "A poster instructing the viewer to wear internals in the rare environments where there is no oxygen or the air has been rendered toxic." - icon_state = "poster19_legit" + icon_state = "poster_internals" /obj/structure/sign/poster/official/safety_eye_protection name = "Safety: Eye Protection" desc = "A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights." - icon_state = "poster20_legit" + icon_state = "poster_goggles" /obj/structure/sign/poster/official/safety_report name = "Safety: Report" desc = "A poster instructing the viewer to report suspicious activity to the security force." - icon_state = "poster21_legit" + icon_state = "poster_warden" /obj/structure/sign/poster/official/report_crimes name = "Report Crimes" desc = "A poster encouraging the swift reporting of crime or seditious behavior to station security." - icon_state = "poster22_legit" + icon_state = "poster_crimes" /obj/structure/sign/poster/official/ion_rifle - name = "Ion Rifle" - desc = "A poster displaying an Ion Rifle." - icon_state = "poster23_legit" + name = "I-I91" + desc = "A poster depicting the Nanotrasen-patented I-I91 man-portable high-density ion projector. What a mouthful." + icon_state = "poster_ion" /obj/structure/sign/poster/official/foam_force_ad name = "Foam Force Ad" desc = "Foam Force, it's Foam or be Foamed!" - icon_state = "poster24_legit" + icon_state = "poster_toys" /obj/structure/sign/poster/official/cohiba_robusto_ad name = "Cohiba Robusto Ad" desc = "Cohiba Robusto, the classy cigar." - icon_state = "poster25_legit" + icon_state = "poster_cohiba" /obj/structure/sign/poster/official/anniversary_vintage_reprint name = "50th Anniversary Vintage Reprint" desc = "A reprint of a poster from 2505, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen." - icon_state = "poster26_legit" + icon_state = "poster_vintage" /obj/structure/sign/poster/official/fruit_bowl name = "Fruit Bowl" desc = " Simple, yet awe-inspiring." - icon_state = "poster27_legit" + icon_state = "poster_bowl" /obj/structure/sign/poster/official/pda_ad name = "PDA Ad" desc = "A poster advertising the latest PDA from Nanotrasen suppliers." - icon_state = "poster28_legit" + icon_state = "poster_pda" + +/obj/structure/sign/poster/official/pda_ad600 + name = "NT PDA600 Ad" + desc = "A poster advertising an old discounted Nanotrasen PDA. This is the old 600 model, it has a small screen and suffered from security and networking issues." + icon_state = "poster_retro" + +/obj/structure/sign/poster/official/pda_ad800 + name = "NT PDA800 Ad" + desc = "An advertisement on an old Nanotrasen PDA model. The 800 fixed a lot of security flaws that the 600 had; it also had large touchscreen and hot-swappable cartridges." + icon_state = "poster_classic" /obj/structure/sign/poster/official/enlist - name = "Enlist" // but I thought deathsquad was never acknowledged - desc = "Enlist in the Nanotrasen Deathsquadron reserves today!" - icon_state = "poster29_legit" + name = "Enlist" + desc = "Enlist in the Nanotrasen Jannisary reserves today!" + icon_state = "poster_enlist" /obj/structure/sign/poster/official/nanomichi_ad name = "Nanomichi Ad" desc = " A poster advertising Nanomichi brand audio cassettes." - icon_state = "poster30_legit" + icon_state = "poster_nanomichi" /obj/structure/sign/poster/official/twelve_gauge name = "12 Gauge" desc = "A poster boasting about the superiority of 12 gauge shotgun shells." - icon_state = "poster31_legit" + icon_state = "poster_shotgun" /obj/structure/sign/poster/official/high_class_martini name = "High-Class Martini" desc = "I told you to shake it, no stirring." - icon_state = "poster32_legit" + icon_state = "poster_martini" /obj/structure/sign/poster/official/the_owl name = "The Owl" desc = "The Owl would do his best to protect the station. Will you?" - icon_state = "poster33_legit" + icon_state = "poster_owl" /obj/structure/sign/poster/official/no_erp name = "No ERP" desc = "This poster reminds the crew that Eroticism, Rape and Pornography are banned on Nanotrasen stations." - icon_state = "poster34_legit" + icon_state = "poster_noerp" /obj/structure/sign/poster/official/wtf_is_co2 name = "Carbon Dioxide" desc = "This informational poster teaches the viewer what carbon dioxide is." - icon_state = "poster35_legit" + icon_state = "poster_what" /obj/structure/sign/poster/official/spiderlings name = "Spiderlings" desc = "This poster informs the crew of the dangers of spiderlings." - icon_state = "poster36_legit" - -/obj/structure/sign/poster/official/duelshotgun - name = "Cycler Shotgun Ad" - desc = "A poster advertising an advanced dual magazine tubes shotgun, boasting about how easy it is to swap between the two tubes." - icon_state = "poster37_legit" + icon_state = "poster_spiderlings" /obj/structure/sign/poster/official/fashion name = "Fashion!" desc = "An advertisement for 'Fashion!', a popular fashion magazine, depicting a woman with a black dress with a golden trim, she also has a red poppy in her hair." - icon_state = "poster38_legit" - -/obj/structure/sign/poster/official/pda_ad600 - name = "NT PDA600 Ad" - desc = "A poster advertising an old discounted Nanotrasen PDA. This is the old 600 model, it has a small screen and suffered from security and networking issues." - icon_state = "poster39_legit" - -/obj/structure/sign/poster/official/pda_ad800 - name = "NT PDA800 Ad" - desc = "An advertisement on an old Nanotrasen PDA model. The 800 fixed a lot of security flaws that the 600 had; it also had large touchscreen and hot-swappable cartridges." - icon_state = "poster40_legit" + icon_state = "poster_fashion" /obj/structure/sign/poster/official/hydro_ad name = "Hydroponics Tray" desc = "An advertisement for hydroponics trays. Space Station 13's botanical department uses a slightly newer model, but the principles are the same. From left to right: Green means the plant is done, red means the plant is unhealthy, flashing red means pests or weeds, yellow means the plant needs nutriment and blue means the plant needs water." - icon_state = "poster41_legit" + icon_state = "poster_hydroponics" /obj/structure/sign/poster/official/medical_green_cross name = "Medical" desc = "A green cross, one of the interplanetary symbol of health and aid. It has a bunch of common languages at the top with translations." // Didn't the American Heart Foundation trademark red crosses? I'm playing it safe with green, not that they'll notice spacegame13 poster. - icon_state = "poster42_legit" + icon_state = "poster_medical" /obj/structure/sign/poster/official/nt_storm_officer name = "NT Storm Ad" desc = "An advertisement for NanoTrasen Storm. A premium infantry helmet, This is the officer variant. I comes with a better radio, better HUD software and better targeting sensors." - icon_state = "poster43_legit" + icon_state = "poster_stormy" /obj/structure/sign/poster/official/nt_storm name = "NT Storm Ad" desc = "An advertisement for NanoTrasen Storm. A premium infantry helmet, It contains a rebreather and full head coverage for use on harsh environments where the air isn't always safe to breathe." - icon_state = "poster44_legit" + icon_state = "poster_stormier" + +/obj/structure/sign/poster/official/mothhardhats + name = "Safety Moth - Hardhats" + desc = "This informational poster uses Safety Moth(TM) to tell the viewer to wear hardhats in cautious areas. It's like a lamp for your head!" + icon_state = "poster_mothhardhats" + +/obj/structure/sign/poster/official/mothpiping + name = "Safety Moth - Piping" + desc = "This informational poster uses Safety Moth(TM) to tell atmospheric technicians correct types of piping to be used. Proper pipe placement prevents poor preformance!" + icon_state = "poster_mothpiping" + +/obj/structure/sign/poster/official/mothsmokey + name = "Safety Moth - Smokey?" + desc = "This informational poster uses Safety Moth(TM) to promote safe handling of plasma, or promoting crew to combat plasmafires. We can't tell." + icon_state = "poster_mothsmokey" + +/obj/structure/sign/poster/official/mothsupermatter + name = "Safety Moth - Supermatter" + desc = "This informational poster uses Safety Moth(TM) to promote proper safety equipment when working near a Supermatter Crystal." + icon_state = "poster_mothsupermatter" + +/obj/structure/sign/poster/official/mothdelamination + name = "Safety Moth - Delamination Safety Precautions" + desc = "This informational poster uses Safety Moth(TM) to tell the viewer to hide in lockers when the Supermatter Crystal has delaminated. Running away might be a better strategy." + icon_state = "poster_mothdelamination" + +/obj/structure/sign/poster/official/mothboh + name = "Safety Moth - BoH" + desc = "This informational poster uses Safety Moth(TM) to inform the viewer of the dangers of Bags of Holding." + icon_state = "poster_mothbluespace" + +/obj/structure/sign/poster/official/mothmethethamphetamine + name = "Safety Moth - Methamphetamine" + desc = "This informational poster uses Safety Moth(TM) to tell the viewer to seek CMO approval before cooking methamphetamine. You shouldn't even be making this." + icon_state = "poster_mothmethamphetamine" + +/obj/structure/sign/poster/official/mothepinephrine + name = "Safety Moth - Epinephrine" + desc = "This informational poster uses Safety Moth(TM) to inform the viewer to help injured/deceased crewmen with their epinephrine injectors." + icon_state = "poster_mothepinephrine" #undef PLACE_SPEED diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index a9dfcb00e6b9..9f27eba643b1 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -107,7 +107,7 @@ ..() /obj/item/melee/sabre/get_belt_overlay() - return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "sabre") + return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "sabre") // todo: make this and its rapier equivalent work for the inhands too /obj/item/melee/sabre/get_worn_belt_overlay(icon_file) return mutable_appearance(icon_file, "-sabre") @@ -225,7 +225,7 @@ ..() /obj/item/melee/rapier/get_belt_overlay() - return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "rapier") + return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "rapier") // todo: same as sabre /obj/item/melee/rapier/get_worn_belt_overlay(icon_file) return mutable_appearance(icon_file, "-rapier") diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 7c1fc6fe3dd6..08a77b9b2b83 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -144,7 +144,7 @@ /obj/item/clothing/shoes/jackboots name = "jackboots" - desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." + desc = "Nanotrasen-brand jackboots for all your jackboots-related needs. From genuine combat to tacticool LARPing, satisfaction is guaranteed." icon_state = "jackboots" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' @@ -155,6 +155,11 @@ pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes lace_time = 12 SECONDS +/obj/item/clothing/shoes/jackboots/sec + name = "security jackboots" + desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." + icon_state = "jackboots_sec" + /obj/item/clothing/shoes/jackboots/fast slowdown = -1 diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 7839d1ecb9d9..c998580caead 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -38,7 +38,7 @@ display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia, /datum/quirk/insanity) threat = 3 - + family_heirlooms = list( /obj/item/book/manual/wiki/security_space_law ) @@ -51,7 +51,7 @@ belt = /obj/item/pda/heads/hos ears = /obj/item/radio/headset/heads/hos/alt uniform = /obj/item/clothing/under/rank/security/head_of_security - shoes = /obj/item/clothing/shoes/jackboots + shoes = /obj/item/clothing/shoes/jackboots/sec suit = /obj/item/clothing/suit/armor/hos/trenchcoat gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/HoS/beret diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 8dedc6c6dc7b..f4a234d9b23a 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -28,7 +28,7 @@ display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia) threat = 2 - + family_heirlooms = list( /obj/item/book/manual/wiki/security_space_law, /obj/item/clothing/head/beret/sec @@ -131,7 +131,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/helmet/sec suit = /obj/item/clothing/suit/armor/vest/alt - shoes = /obj/item/clothing/shoes/jackboots + shoes = /obj/item/clothing/shoes/jackboots/sec l_pocket = /obj/item/restraints/handcuffs r_pocket = /obj/item/assembly/flash/handheld backpack_contents = list(/obj/item/melee/baton/loaded=1) diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 714c59902474..ec4e81caeaca 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -29,7 +29,7 @@ display_order = JOB_DISPLAY_ORDER_WARDEN blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia) threat = 2 - + family_heirlooms = list( /obj/item/book/manual/wiki/security_space_law ) @@ -46,7 +46,7 @@ belt = /obj/item/pda/warden ears = /obj/item/radio/headset/headset_sec/alt uniform = /obj/item/clothing/under/rank/security/warden - shoes = /obj/item/clothing/shoes/jackboots + shoes = /obj/item/clothing/shoes/jackboots/sec suit = /obj/item/clothing/suit/armor/vest/warden/alt gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/warden diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 2ef3aa36a6cd..113853d315ff 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -153,10 +153,6 @@ if(MOOD_LEVEL_HAPPY4 to INFINITY) . += "[t_He] look[p_s()] ecstatic." - if(HAS_TRAIT(src, TRAIT_IN_HEAT) && (HAS_TRAIT(user, TRAIT_HEAT_DETECT) || src == user)) - . += "" - . += "[t_He] [t_is] currently in [gender == MALE ? "rut" : "heat"]." - if(LAZYLEN(.) > 1) .[1] += "
" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index edb5de8188f4..373c7e2d797d 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -460,10 +460,6 @@ if (length(msg)) . += "[msg.Join("")]" - if(HAS_TRAIT(src, TRAIT_IN_HEAT) && (HAS_TRAIT(user, TRAIT_HEAT_DETECT) || src == user)) - . += "" - . += "[t_He] [t_is] currently in [gender == MALE ? "rut" : "heat"]." - var/trait_exam = common_trait_examine() if (!isnull(trait_exam)) . += trait_exam diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 589c9a1dd059..5093a9f24a73 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -64,10 +64,6 @@ brutemod = 0.9 species_language_holder = /datum/language_holder/lizard/ash - -#define HEAT_CYCLE_LENGTH 32 -#define HEAT_CYCLE_OFFSET 11 - /datum/species/lizard/ashwalker/on_species_gain(mob/living/carbon/human/C, datum/species/old_species) if((C.dna.features["spines"] != "None" ) && (C.dna.features["tail_lizard"] == "None")) //tbh, it's kinda ugly for them not to have a tail yet have floating spines C.dna.features["tail_lizard"] = "Smooth" @@ -80,12 +76,6 @@ C.dna.features["mam_snouts"] = "Sharp" C.dna.features["mcolor2"] = C.dna.features["mcolor"] //for no funne rainbows C.dna.features["mcolor3"] = C.dna.features["mcolor"] - ADD_TRAIT(C, TRAIT_HEAT_DETECT, SPECIES_TRAIT) - var/temp = text2num(GLOB.round_id) - var/tempish = ((temp + (HEAT_CYCLE_OFFSET + 2)) % HEAT_CYCLE_LENGTH) - if(tempish <= 2 && tempish >= 0) - to_chat(C, "It's this time again.. Your loins lay restless as they await a potential mate.") - ADD_TRAIT(C, TRAIT_IN_HEAT, SPECIES_TRAIT) if(C.gender == MALE) C.dna.features["has_cock"] = TRUE @@ -103,6 +93,3 @@ C.give_genitals(1) C.update_body() return ..() - -#undef HEAT_CYCLE_LENGTH -#undef HEAT_CYCLE_OFFSET diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 1f027c450c5a..10fab0ed06e5 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -685,6 +685,7 @@ to_chat(SM, "You also become depressingly aware that you are not a real creature, but instead a holoform. Your existence is limited to the parameters of the holodeck.") to_chat(user, "[SM] accepts [src] and suddenly becomes attentive and aware. It worked!") SM.copy_languages(user) + SM.add_overlay(mutable_appearance('icons/mob/hud.dmi', "brother", ANTAG_LAYER)) after_success(user, SM) qdel(src) else @@ -754,6 +755,7 @@ to_chat(SM, "In a quick flash, you feel your consciousness flow into [SM]!") to_chat(SM, "You are now [SM]. Your allegiances, alliances, and role is still the same as it was prior to consciousness transfer!") SM.name = "[user.real_name]" + SM.add_overlay(mutable_appearance('icons/mob/hud.dmi', "brother", ANTAG_LAYER)) qdel(src) /obj/item/slimepotion/slime/steroid diff --git a/html/changelogs/archive/2023-02.yml b/html/changelogs/archive/2023-02.yml new file mode 100644 index 000000000000..f105d2f39c6f --- /dev/null +++ b/html/changelogs/archive/2023-02.yml @@ -0,0 +1,23 @@ +2023-02-02: + LeDrascol: + - tweak: Hypnotic Gaze checks for ten new conditions + - tweak: Hypnotic Gaze supports personal pronouns + - tweak: Hypnotic Gaze accounts for non-con preferences + - balance: Hypnotic Gaze interaction time reduced from 12s to 5s + - balance: Hypnotic Gaze can be blocked by eye protection and mind shielding + - rscadd: Added quirk Estrous Detection + - rscadd: Added quirk In Estrous + - tweak: Ashwalkers now spawn with the Estrous Detection quirk + - tweak: Ashwalkers will now gain the In Estrous quirk during some rounds +2023-02-03: + LeDrascol: + - code_imp: Removed obsolete entries for In Heat and Estrus Detection + - rscadd: Added the Imaginary Friend Action Figure + - rscadd: Added the Dissociative Mirror + - tweak: Restored techweb node and circuit printing for Cryptominers +2023-02-04: + AshTheDerg: + - rscadd: Added 10 new varieties of Milkshake + LeDrascol: + - rscadd: Added variant of Subtle verb with typing indicator + - tweak: Default binding for Subtle is now Control-5 diff --git a/icons/mob/OnFire.dmi b/icons/mob/OnFire.dmi index 7768bf0269fe..e82442f4d0e4 100644 Binary files a/icons/mob/OnFire.dmi and b/icons/mob/OnFire.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index 2338fa37a039..9746e61a3d32 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi index 3360521b51f1..88b63f46b8f7 100644 Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi index 82d4856d3831..41b75ec240c0 100644 Binary files a/icons/mob/clothing/feet_digi.dmi and b/icons/mob/clothing/feet_digi.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index 1d4a76e5198c..3060ae8f2a13 100644 Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ diff --git a/icons/mob/icemoon/64x64megafauna.dmi b/icons/mob/icemoon/64x64megafauna.dmi index 5a622dc7bc61..e466b625566f 100644 Binary files a/icons/mob/icemoon/64x64megafauna.dmi and b/icons/mob/icemoon/64x64megafauna.dmi differ diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi index 81b12c60f9ef..944022713b86 100644 Binary files a/icons/mob/inhands/equipment/belt_lefthand.dmi and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi index 42ed3a30c6bf..78c5fc47b51b 100644 Binary files a/icons/mob/inhands/equipment/belt_righthand.dmi and b/icons/mob/inhands/equipment/belt_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/axes_lefthand.dmi b/icons/mob/inhands/weapons/axes_lefthand.dmi index 6b4041e477d9..021c005fc39a 100644 Binary files a/icons/mob/inhands/weapons/axes_lefthand.dmi and b/icons/mob/inhands/weapons/axes_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/axes_righthand.dmi b/icons/mob/inhands/weapons/axes_righthand.dmi index 30553d6320b2..c19440b531c0 100644 Binary files a/icons/mob/inhands/weapons/axes_righthand.dmi and b/icons/mob/inhands/weapons/axes_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_lefthand.dmi b/icons/mob/inhands/weapons/melee_lefthand.dmi index bb6de0432e69..0477b1b0f9b6 100644 Binary files a/icons/mob/inhands/weapons/melee_lefthand.dmi and b/icons/mob/inhands/weapons/melee_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_righthand.dmi b/icons/mob/inhands/weapons/melee_righthand.dmi index 346f6d597790..cf2cf50ad919 100644 Binary files a/icons/mob/inhands/weapons/melee_righthand.dmi and b/icons/mob/inhands/weapons/melee_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index 62e48f626b6d..860bc5a3de26 100644 Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi index 658e7304df08..326821dc8b62 100644 Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi index 0799920a6c64..5d9bad32acd4 100644 Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 48aaa3a4182f..70548c5719f6 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 70c48c52daad..855936dfb483 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 50de425aadcb..2406e6119086 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index 9af0a6ba3aa9..eadf4a1591c7 100644 Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index 7fc2eaae7f0f..27301fa27210 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index f87bed82d089..b958ca201ceb 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/modular_sand/code/datums/traits/neutral.dm b/modular_sand/code/datums/traits/neutral.dm index 89486dc153f8..363f6f7e2582 100644 --- a/modular_sand/code/datums/traits/neutral.dm +++ b/modular_sand/code/datums/traits/neutral.dm @@ -22,3 +22,41 @@ lose_text = span_love("You feel the warm blow of life flooding your womb, full of newfound, vibrant fertility!") medical_record_text = "Patient doesn't seem able to ovulate properly..." */ + +/datum/quirk/estrous_detection + name = "Estrous Detection" + desc = "You have a mammalian sense of detecting if someone\'s body longs for breeding." + value = 0 + mob_trait = TRAIT_ESTROUS_DETECT + gain_text = span_love("Your senses adjust, allowing a mammalian sense of others' fertility.") + lose_text = span_notice("Your sense of others' fertility fades.") + +/datum/quirk/estrous_active + name = "In Estrous" + desc = "Your system burns with the desire to be bred. Satisfying your lust will make you happy, while ignoring it may cause you to become sad and needy." + value = 0 + mob_trait = TRAIT_ESTROUS_ACTIVE + gain_text = span_love("You body burns with the desire to be bred.") + lose_text = span_notice("You feel more in control of your body and thoughts.") + +/datum/quirk/estrous_active/add() + // Add examine hook + RegisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE, .proc/quirk_examine_estrous_active) + +/datum/quirk/estrous_active/remove() + // Remove examine hook + UnregisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE) + +/datum/quirk/estrous_active/proc/quirk_examine_estrous_active(atom/examine_target, mob/living/carbon/human/examiner, list/examine_list) + SIGNAL_HANDLER + + // Check if human examiner exists + if(!istype(examiner)) + return + + // Check if examiner lacks the trait, or is self examining + if(!HAS_TRAIT(examiner, TRAIT_ESTROUS_DETECT) || (examiner == quirk_holder)) + return + + // Add quirk message + examine_list += span_love("[quirk_holder.p_they(TRUE)] [quirk_holder.p_are()] currently influenced by the estrous cycle, and long for breeding.") diff --git a/modular_sand/code/game/objects/effects/contraband.dm b/modular_sand/code/game/objects/effects/contraband.dm index 0ec0d17ab9bd..62728829448f 100644 --- a/modular_sand/code/game/objects/effects/contraband.dm +++ b/modular_sand/code/game/objects/effects/contraband.dm @@ -1,5 +1,5 @@ /obj/structure/sign/poster/contraband/yes_erp name = "Yes ERP" - desc = "This poster negates that Eroticism, Rape and Pornography should be banned from Nanotrasen stations." + desc = "This poster scrutinizes the banning of Eroticism, Rape and Pornography from Nanotrasen stations." icon = 'modular_sand/icons/obj/contraband.dmi' - icon_state = "poster1" //It is one because different file + icon_state = "poster_yeserp" diff --git a/modular_sand/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/modular_sand/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 505aaeeeca88..a238241b79b2 100644 --- a/modular_sand/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/modular_sand/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -1,3 +1,31 @@ +#define ESTROUS_CYCLE_LENGTH 32 +#define ESTROUS_CYCLE_OFFSET 11 + /datum/species/lizard/New() mutant_bodyparts += list("ears" = "None") . = ..() + +/datum/species/lizard/ashwalker/on_species_gain(mob/living/carbon/human/C, datum/species/old_species) + . = ..() + + // Add estrous detect quirk + C.add_quirk(/datum/quirk/estrous_detection, SPECIES_TRAIT) + + // Define round ID + // Requires a server database to use this + var/round_id = text2num(GLOB.round_id) || null + + // Define round mating season value + var/round_season = ((round_id + (ESTROUS_CYCLE_OFFSET + 2)) % ESTROUS_CYCLE_LENGTH) + + // Check for mating season + // Default to active without variable + if((!round_id) || round_season <= 2 && round_season >= 0) + // Alert user in chat + to_chat(C, span_userlove("It\'s that time again. Your loins lay restless as they await a potential mate.")) + + // Add estrous quirk + C.add_quirk(/datum/quirk/estrous_active, SPECIES_TRAIT) + +#undef ESTROUS_CYCLE_LENGTH +#undef ESTROUS_CYCLE_OFFSET diff --git a/modular_sand/code/modules/research/designs/machine_designs.dm b/modular_sand/code/modules/research/designs/machine_designs.dm index 64cd84508836..e5a4887cd179 100644 --- a/modular_sand/code/modules/research/designs/machine_designs.dm +++ b/modular_sand/code/modules/research/designs/machine_designs.dm @@ -33,21 +33,21 @@ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL //Cryptocurrency Miners -// /datum/design/board/cryptominer -// name = "Machine Design (Cryptocurrency Miner)" -// desc = "The circuit board for a Cryptocurrency Miner." -// id = "cryptominer" -// build_path = /obj/item/circuitboard/machine/cryptominer -// category = list("Misc. Machinery") -// departmental_flags = DEPARTMENTAL_FLAG_CARGO +/datum/design/board/cryptominer + name = "Machine Design (Cryptocurrency Miner)" + desc = "The circuit board for a Cryptocurrency Miner." + id = "cryptominer" + build_path = /obj/item/circuitboard/machine/cryptominer + category = list("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_CARGO -// /datum/design/board/cryptominer/syndie -// name = "Machine Design (Syndicate Cryptocurrency Miner)" -// desc = "The circuit board for a Syndicate Cryptocurrency Miner." -// id = "cryptominersyndie" -// build_path = /obj/item/circuitboard/machine/cryptominer/syndie -// category = list("Misc. Machinery") -// departmental_flags = DEPARTMENTAL_FLAG_CARGO +/datum/design/board/cryptominer/syndie + name = "Machine Design (Syndicate Cryptocurrency Miner)" + desc = "The circuit board for a Syndicate Cryptocurrency Miner." + id = "cryptominersyndie" + build_path = /obj/item/circuitboard/machine/cryptominer/syndie + category = list("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_CARGO //BS miner /datum/design/board/bluespace_miner diff --git a/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm b/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm index 59abd0c03408..e341a5c1ab45 100644 --- a/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm +++ b/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm @@ -1,18 +1,18 @@ -// /datum/techweb_node/cryptominer -// id = "cryptominer" -// display_name = "Cryptocurrency Mining" -// description = "Harness the power of cryptocurrency to make credits for Cargo-- slowly." -// prereq_ids = list("bluespace_mining") -// design_ids = list("cryptominer") -// research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) +/datum/techweb_node/cryptominer + id = "cryptominer" + display_name = "Cryptocurrency Mining" + description = "Harness the power of cryptocurrency to make credits for Cargo-- slowly." + prereq_ids = list("bluespace_mining") + design_ids = list("cryptominer") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) -// /datum/techweb_node/cryptominersyndie -// id = "cryptominersyndie" -// display_name = "Illegal Cryptocurrency Mining" -// description = "Harness the power of bluespace to make credits for Cargo-- slowly." -// prereq_ids = list("cryptominer","syndicate_basic") -// design_ids = list("cryptominersyndie") -// research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) +/datum/techweb_node/cryptominersyndie + id = "cryptominersyndie" + display_name = "Illegal Cryptocurrency Mining" + description = "Harness the power of bluespace to make credits for Cargo-- slowly." + prereq_ids = list("cryptominer","syndicate_basic") + design_ids = list("cryptominersyndie") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) /datum/techweb_node/computermath id = "computermath" diff --git a/modular_sand/icons/obj/contraband.dmi b/modular_sand/icons/obj/contraband.dmi index 37d26caed65f..81f26f8c3450 100644 Binary files a/modular_sand/icons/obj/contraband.dmi and b/modular_sand/icons/obj/contraband.dmi differ diff --git a/modular_splurt/code/datums/traits/neutral.dm b/modular_splurt/code/datums/traits/neutral.dm index 79c8cf934b71..156a3fc4b31e 100644 --- a/modular_splurt/code/datums/traits/neutral.dm +++ b/modular_splurt/code/datums/traits/neutral.dm @@ -61,14 +61,6 @@ . = ..() quirk_holder.RemoveElement(/datum/element/wuv/headpat) -/datum/quirk/in_heat - name = "In Heat" - desc = "Your system burns with the desire to be bred. Satisfying your lust will make you happy, but ignoring it may cause you to become sad and needy." - value = 0 - mob_trait = TRAIT_IN_HEAT - gain_text = span_notice("You body burns with the desire to be bred.") - lose_text = span_notice("You feel more in control of your body and thoughts.") - /datum/quirk/Hypnotic_gaze name = "Hypnotic Gaze" desc = "Be it through mysterious patterns, flickering colors, or some genetic oddity, prolonged eye contact with you will place the viewer into a highly-suggestible hypnotic trance." @@ -84,14 +76,6 @@ spell.Grant(Hypno_eyes) spell.owner = Hypno_eyes -/datum/quirk/heat - name = "Estrus Detection" - desc = "You have a animalistic sense of detecting if someone is in heat." - value = 0 - mob_trait = TRAIT_HEAT_DETECT - gain_text = span_notice("You feel your senses adjust, allowing a animalistic sense of others' fertility.") - lose_text = span_notice("You feel your sense of others' fertility fade.") - /datum/quirk/overweight name = "Overweight" desc = "You're particularly fond of food, and join the shift being overweight." diff --git a/modular_splurt/code/datums/traits/trait_actions.dm b/modular_splurt/code/datums/traits/trait_actions.dm index ac56b75c7c02..51b93106fd8c 100644 --- a/modular_splurt/code/datums/traits/trait_actions.dm +++ b/modular_splurt/code/datums/traits/trait_actions.dm @@ -11,71 +11,205 @@ button_icon_state = "Hypno_eye" icon_icon = 'modular_splurt/icons/mob/actions/lewd_actions/lewd_icons.dmi' background_icon_state = "bg_alien" - var/mob/living/carbon/T //hypnosis target - var/mob/living/carbon/human/H //Person with the quirk /datum/action/innate/Hypnotize/Activate() - var/mob/living/carbon/human/H = owner + // Define action owner + var/mob/living/carbon/human/action_owner = owner + + // Define target + var/grab_target = action_owner.pulling - if(!H.pulling || !isliving(H.pulling) || H.grab_state < GRAB_AGGRESSIVE) - to_chat(H, span_warning("You need to aggressively grab someone to hypnotize them!")) + // Check for target + if(!grab_target) + // Warn the user, then return + to_chat(action_owner, span_warning("You you need to grab someone first!")) return - var/mob/living/carbon/T = H.pulling + // Check for cyborg + if(iscyborg(grab_target)) + // Warn the user, then return + to_chat(action_owner, span_warning("You can't hypnotize a cyborg!")) + return - if(T.IsSleeping()) - to_chat(H, "You can't hypnotize [T] whilst they're asleep!") + // Check for alien + // Taken from eyedropper check + /* + if(isalien(grab_target)) + // Warn the user, then return + to_chat(action_owner, span_warning("[grab_target] doesn\'t seem to have any eyes!")) return + */ - to_chat(H, span_notice("You stare deeply into [T]'s eyes...")) - to_chat(T, span_warning("[H] stares intensely into your eyes...")) - if(!do_mob(H, T, 12 SECONDS)) + // Check for carbon human target + if(!ishuman(grab_target)) + // Warn the user, then return + to_chat(action_owner, span_warning("That's not a valid creature!")) return - if(H.pulling !=T || H.grab_state < GRAB_AGGRESSIVE) + // Check if target is alive + if(!isliving(grab_target)) + // Warn the user, then return + to_chat(action_owner, span_warning("You can't hypnotize the dead!")) return - if(!(H in view(1, H.loc))) + // Check for aggressive grab + if(action_owner.grab_state < GRAB_AGGRESSIVE) + // Warn the user, then return + to_chat(action_owner, span_warning("You need a stronger grip before trying this!")) return - if(!(T.client?.prefs.cit_toggles & HYPNO)) + // Define target + var/mob/living/carbon/human/action_target = grab_target + + // Check if target has a mind + if(!action_target.mind) + // Warn the user, then return + to_chat(action_owner, span_warning("[grab_target] doesn\'t have a compatible mind!")) return - var/response = alert(T, "Do you wish to fall into a hypnotic sleep?(This will allow [H] to issue hypnotic suggestions)", "Hypnosis", "Yes", "No") + /* Unused: Replaced by get_eye_protection + // Check if target's eyes are obscured + // ... by headwear + if((action_target.head && action_target.head.flags_cover & HEADCOVERSEYES)) + // Warn the user, then return + to_chat(action_owner, span_warning("[action_target]'s eyes are obscured by [action_target.head].")) + return - if(response == "Yes") - T.visible_message(span_warning("[T] falls into a deep slumber!"), "Your eyelids gently shut as you fall into a deep slumber. All you can hear is [H]'s voice as you commit to following all of their suggestions.") + // ... by a mask + else if((action_target.wear_mask && action_target.wear_mask.flags_cover & MASKCOVERSEYES)) + // Warn the user, then return + to_chat(action_owner, span_warning("[action_target]'s eyes are obscured by [action_target.wear_mask].")) + return - T.SetSleeping(1200) - T.drowsyness = max(T.drowsyness, 40) - T = H.pulling - var/response2 = alert(H, "Would you like to release your subject or give them a suggestion?", "Hypnosis", "Suggestion", "Release") + // ... by glasses + else if((action_target.glasses && action_target.glasses.flags_cover & GLASSESCOVERSEYES)) + // Warn the user, then return + to_chat(action_owner, span_warning("[action_target]'s eyes are obscured by [action_target.glasses].")) + return + */ - if(response2 == "Suggestion") - if(get_dist(H, T) > 1) - to_chat(H, "You must stand in whisper range of [T].") - return + // Check if target has eye protection + if(action_target.get_eye_protection()) + // Warn the user, then return + to_chat(action_owner, span_warning("You have difficulty focusing on [action_target]'s eyes due to some form of protection, and are left unable to hypnotize them.")) + to_chat(action_target, span_notice("[action_owner] stares intensely at you, but stops after a moment.")) + return - var/text = input("What would you like to suggest?", "Hypnotic suggestion", null, null) - text = sanitize(text) - if(!text) - return + // Check if target is blind + if(HAS_TRAIT(action_target, TRAIT_BLIND)) + // Warn the user, then return + to_chat(action_owner, span_warning("You stare deeply into [action_target]'s eyes, but see nothing but emptiness.")) + return - to_chat(H, "You whisper your suggestion in a smooth calming voice to [T]") - to_chat(T, span_hypnophrase("...[text]...")) + // Check for anti-magic + // This does not include TRAIT_HOLY + if(action_target.anti_magic_check()) + // Warn the users, then return + to_chat(action_owner, span_warning("You stare deeply into [action_target]'s eyes. They stare back at you as if nothing had happened.")) + to_chat(action_target, span_notice("[action_owner] stares intensely into your eyes for a moment. You sense nothing out of the ordinary from them.")) + return - T.visible_message(span_warning("[T] wakes up from their deep slumber!"), "Your eyelids gently open as you see [H]'s face staring back at you.") - T.SetSleeping(0) - T = null - return + // Check client pref for hypno + if(action_target.client?.prefs.cit_toggles & NEVER_HYPNO) + // Warn the users, then return + to_chat(action_owner, span_warning("You sense that [action_target] would rather not be hypnotized, and decide to respect their wishes.")) + to_chat(action_target, span_notice("[action_owner] stares into your eyes with a strange conviction, but turns away after a moment.")) + return + + // Check for mindshield implant + if(HAS_TRAIT(action_target, TRAIT_MINDSHIELD)) + // Warn the users, then return + to_chat(action_owner, span_warning("You stare deeply into [action_target]'s eyes, but hear a faint buzzing from [action_target.p_their()] head. It seems something is interfering.")) + to_chat(action_target, span_notice("[action_owner] stares intensely into your eyes for a moment, before a buzzing sound emits from your head.")) + return - if(response2 == "Release") - T.SetSleeping(0) - return - else - T.visible_message(span_warning("[T]'s attention breaks, despite the attempt to hypnotize them! They clearly don't want this!"), "Your concentration breaks as you realise you have no interest in following [H]'s words!") + // Check for sleep immunity + // This is required for SetSleeping to trigger + if(HAS_TRAIT(action_target, TRAIT_SLEEPIMMUNE)) + // Warn the users, then return + to_chat(action_owner, span_warning("You stare deeply into [action_target]'s eyes, and see nothing but unrelenting energy. You won't be able to subdue [action_target.p_them()] in this state!")) + to_chat(action_target, span_notice("[action_owner] stares intensely into your eyes, but sees something unusual about you...")) + return + + // Check for sleep + if(action_target.IsSleeping()) + // Warn the user, then return + to_chat(action_owner, span_warning("You can't hypnotize [action_target] whilst [action_target.p_theyre()] asleep!")) + return + + // Check for combat mode + if(SEND_SIGNAL(action_target, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) + // Warn the users, then return + to_chat(action_owner, span_warning("[action_target] is acting too defensively! You'll need [action_target.p_them()] to lower [action_target.p_their()] guard first!")) + to_chat(action_target, span_notice("[action_owner] tries to stare into your eyes, but can't get a read on you.")) + return + + // Display chat messages + to_chat(action_owner, span_notice("You stare deeply into [action_target]'s eyes...")) + to_chat(action_target, span_warning("[action_owner] stares intensely into your eyes...")) + + // Try to perform action timer + if(!do_mob(action_owner, action_target, 5 SECONDS)) + // Action timer was interrupted + // Warn the user, then return + to_chat(action_owner, span_warning("You lose concentration on [action_target], and fail to hypnotize [action_target.p_them()]!")) + to_chat(action_target, span_notice("[action_owner]'s gaze is broken prematurely, freeing you from any potential effects.")) + return + + // Define blank response + var/input_consent + + // Check for non-consensual setting + if(action_target.client?.prefs.nonconpref != "Yes") + // Non-consensual is NOT enabled + // Prompt target for consent response + input_consent = alert(action_target, "Will you fall into a hypnotic stupor? This will allow [action_owner] to issue hypnotic suggestions.", "Hypnosis", "Yes", "No") + + // When consent is denied + if(input_consent == "No") + // Warn the users, then return + to_chat(action_owner, span_warning("[action_target]'s attention breaks, despite the attempt to hypnotize [action_target.p_them()]! [action_target.p_they()] clearly don't want this!")) + to_chat(action_target, span_notice("Your concentration breaks as you realize you have no interest in following [action_owner]'s words!")) + return + + // Display local message + action_target.visible_message(span_warning("[action_target] falls into a deep slumber!"), span_danger("Your eyelids gently shut as you fall into a deep slumber. All you can hear is [action_owner]'s voice as you commit to following all of their suggestions.")) + + // Set sleeping + action_target.SetSleeping(1200) + + // Set drowsiness + action_target.drowsyness = max(action_target.drowsyness, 40) + + // Prompt action owner for response + var/input_suggestion = input("What would you like to suggest [action_target] do? Leave blank to release [action_target.p_them()] instead.", "Hypnotic suggestion", null, null) + + // Check if input text exists + if(!input_suggestion) + // Alert user of no input + to_chat(action_owner, "You decide not to give [action_target] a suggestion.") + + // Remove sleep, then return + action_target.SetSleeping(0) return + // Sanitize input text + input_suggestion = sanitize(input_suggestion) + + // Display message to users + to_chat(action_owner, "You whisper your suggestion in a smooth calming voice to [action_target]") + to_chat(action_target, span_hypnophrase("...[input_suggestion]...")) + + // Play a sound effect + playsound(action_target, 'sound/magic/domain.ogg', 20, 1) + + // Display local message + action_target.visible_message(span_warning("[action_target] wakes up from their deep slumber!"), span_danger("Your eyelids gently open as you see [action_owner]'s face staring back at you.")) + + // Remove sleep, then return + action_target.SetSleeping(0) + return + // // Quirk: Hydra Heads // diff --git a/modular_splurt/code/game/objects/items/miscellaneous.dm b/modular_splurt/code/game/objects/items/miscellaneous.dm index 72cd6781e5fb..e01b30ceea96 100644 --- a/modular_splurt/code/game/objects/items/miscellaneous.dm +++ b/modular_splurt/code/game/objects/items/miscellaneous.dm @@ -190,12 +190,12 @@ name = "security holo badge" desc = "A more futuristic hard-light badge" icon_state = "security_badge_holo" - + /obj/item/clothing/accessory/badge/deputy name = "security deputy badge" desc = "A shiny silver badge for deputies on the Security force" icon_state = "security_badge_deputy" - + /datum/design/sec_badge name = "Security Badge" desc = "A shiny badge to show the bearer is part of the Security force." @@ -215,3 +215,41 @@ build_path = /obj/item/clothing/accessory/badge/deputy category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/obj/item/handmirror/split_personality + name = "dissociative mirror" + desc = "An enchanted hand mirror. You may not recognize who stares back." + var/item_used + +/obj/item/handmirror/split_personality/attack_self(mob/user) + // Check if already used + if(item_used) + // Warn user, then return + to_chat(user, span_warning("[src] is no longer functional.")) + return + + // Check if human user exists + if(!ishuman(user)) + // Warn user, then return + to_chat(user, span_warning("You see nothing in [src].")) + return + + // Define human user + var/mob/living/carbon/human/mirror_user = user + + // Add brain trauma + mirror_user.gain_trauma(/datum/brain_trauma/severe/split_personality, TRAUMA_RESILIENCE_SURGERY) + + // Set item used variable + // This prevents future use + item_used = TRUE + + // Alert in local chat + mirror_user.visible_message(span_warning("The [src] shatters in [mirror_user]'s hands!"), span_warning("The mirror shatters in your hands!")) + + // Play mirror break sound + playsound(src, 'sound/effects/Glassbr3.ogg', 50, 1) + + // Set flavor text + name = "broken hand mirror" + desc = "You won\'t get much use out of it." diff --git a/modular_splurt/code/game/objects/items/toys.dm b/modular_splurt/code/game/objects/items/toys.dm index 1079de98bf10..1d441a4a94ae 100644 --- a/modular_splurt/code/game/objects/items/toys.dm +++ b/modular_splurt/code/game/objects/items/toys.dm @@ -3,3 +3,39 @@ icon = 'modular_splurt/icons/obj/toy.dmi' icon_state = "savannahivanovtoy" desc = "Mini-Mecha action figure! Collect them all! 13/12." + +/obj/item/toy/figure/assistant/imaginary_friend + name = "imaginary friend action figure" + desc = "A toy that resembles a special friend." + toysay = "I'll always be your best friend!" + var/item_used + +/obj/item/toy/figure/assistant/imaginary_friend/attack_self(mob/user as mob) + // Check if already used + if(item_used) + // Warn user, then return + to_chat(user, span_warning("[src] does nothing. It must be broken.")) + return + + // Check if human user exists + if(!ishuman(user)) + // Warn user, then return + to_chat(user, span_warning("You refrain from handling [src].")) + return + + // Define human user + var/mob/living/carbon/human/mirror_user = user + + // Add brain trauma + mirror_user.gain_trauma(/datum/brain_trauma/special/imaginary_friend, TRAUMA_RESILIENCE_SURGERY) + + // Set item used variable + // This prevents future use + item_used = TRUE + + // Alert in local chat + mirror_user.visible_message(span_warning("[mirror_user] plays with [src]."), span_warning("You start to remember [src], as if they were a real person!")) + + // Set flavor text + name = "generic action figure" + desc = "It\'s just a normal toy." diff --git a/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm b/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm index a587e9fc7114..c388d8fe3c9f 100644 --- a/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm +++ b/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm @@ -189,3 +189,104 @@ /datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/consumable/ethanol/brave_bull = 1 ) + +//Milkshakes +/datum/chemical_reaction/milkshake_base + name = "Plain Milkshake" + id = /datum/reagent/consumable/milkshake_base + results = list(/datum/reagent/consumable/milkshake_base = 3) + required_reagents = list( + /datum/reagent/consumable/milk = 1, + /datum/reagent/consumable/ice = 1, + /datum/reagent/consumable/cream =1 + ) + +/datum/chemical_reaction/milkshake_vanilla + name = "Vanilla Milkshake" + id = /datum/reagent/consumable/milkshake_vanilla + results = list(/datum/reagent/consumable/milkshake_vanilla = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base =1, + /datum/reagent/consumable/vanilla =1 + ) + +/datum/chemical_reaction/milkshake_choc + name = "Chocolate Milkshake" + id = /datum/reagent/consumable/milkshake_choc + results = list(/datum/reagent/consumable/milkshake_choc = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/coco = 1 + ) + +/datum/chemical_reaction/milkshake_strawberry + name = "Strawberry Milkshake" + id = /datum/reagent/consumable/milkshake_strawberry + results = list(/datum/reagent/consumable/milkshake_strawberry = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/strawberryjuice = 1 + ) + +/datum/chemical_reaction/milkshake_banana + name = "Banana Milkshake" + id = /datum/reagent/consumable/milkshake_banana + results = list(/datum/reagent/consumable/milkshake_banana = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/banana = 1 + ) + +/datum/chemical_reaction/milkshake_berry + name = "Berry Milkshake" + id = /datum/reagent/consumable/milkshake_berry + results = list(/datum/reagent/consumable/milkshake_berry = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/berryjuice = 1 + ) + +/datum/chemical_reaction/milkshake_cola + name = "Cola Milkshake" + id = /datum/reagent/consumable/milkshake_cola + results = list(/datum/reagent/consumable/milkshake_cola = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/space_cola = 1 + ) + +/datum/chemical_reaction/milkshake_gibb + name = "Dr. Gibb Milkshake" + id = /datum/reagent/consumable/milkshake_gibb + results = list(/datum/reagent/consumable/milkshake_gibb = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/dr_gibb = 1 + ) + +/datum/chemical_reaction/milkshake_peach + name = "Peach Milkshake" + id = /datum/reagent/consumable/milkshake_peach + results = list(/datum/reagent/consumable/milkshake_peach = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/peachjuice = 1 + ) + +/datum/chemical_reaction/milkshake_pineapple + name = "Pineapple Milkshake" + id = /datum/reagent/consumable/milkshake_pineapple + results = list(/datum/reagent/consumable/milkshake_pineapple = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/pineapplejuice = 1 + ) + +/datum/chemical_reaction/milkshake_melon + name = "Watermelon Milkshake" + id = /datum/reagent/consumable/milkshake_melon + results = list(/datum/reagent/consumable/milkshake_melon = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/watermelonjuice = 1 + ) diff --git a/modular_splurt/code/modules/keybindings/keybind/communication.dm b/modular_splurt/code/modules/keybindings/keybind/communication.dm new file mode 100644 index 000000000000..3aa6aeca1a85 --- /dev/null +++ b/modular_splurt/code/modules/keybindings/keybind/communication.dm @@ -0,0 +1,13 @@ +/datum/keybinding/client/communication/subtle + hotkey_keys = list("Ctrl5") + +/datum/keybinding/client/communication/subtle_indicator + hotkey_keys = list("5") + name = "Subtle_Indicator" + full_name = "Subtle Emote (with indicator)" + clientside = "subtle-indicator" + +/datum/keybinding/client/communication/subtle_indicator/down(client/user) + var/mob/living/mob_keybound = user.mob + mob_keybound.subtle_indicator() + return TRUE diff --git a/modular_splurt/code/modules/mob/say_vr.dm b/modular_splurt/code/modules/mob/say_vr.dm index 56be623e0f22..7cb5e02a6f12 100644 --- a/modular_splurt/code/modules/mob/say_vr.dm +++ b/modular_splurt/code/modules/mob/say_vr.dm @@ -48,3 +48,30 @@ return message = trim(html_encode(message), MAX_MESSAGE_LEN) emote("narrate", message=message) + +/datum/emote/living/subtle/subtle_indicator + key = "subtle-indicator" + key_third_person = "subtle-indicator" + +/mob/living/verb/subtle_indicator() + // Set data + set name = "Subtle (Indicator)" + set category = "IC" + + // Check if say is disabled + if(GLOB.say_disabled) + // Warn user and return + to_chat(usr, span_danger("Speech is currently admin-disabled.")) + return + + // Display typing indicator + display_typing_indicator() + + // Prompt user for text input + var/input_message = input(usr, "What would you like to subtly emote, with a typing indicator?", "Input subtle emote") as message|null + + // Remove typing indicator + clear_typing_indicator() + + // Run subtle emote with input + usr.emote("subtle", message = input_message) diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 3b8aad9ea7ab..46ea1e07c563 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -50,3 +50,118 @@ glass_name = "glass of töchtaüse syrup" glass_desc = "Not for drinking on its own." +/datum/reagent/consumable/milkshake_base + name = "Milkshake" + description = "A basic milkshake. Could use something else?" + color = "#FFFDD0" + nutriment_factor = 1 + taste_description = "thick, creamy, and sweet" + glass_icon_state = "vanillashake" + glass_name = "glass of plain milkshake" + glass_desc = "A glass of plain milkshake, a bit boring, but still good." + +/datum/reagent/consumable/milkshake_vanilla + name = "Vanilla Milkshake" + description = "A vanilla milkshake. Basic, but delicious." + color = "#FFFDD0" + nutriment_factor = 1 + taste_description = "thick, creamy, and sweet" + glass_icon_state = "vanillashake" + glass_name = "glass of vanilla milkshake" + glass_desc = "A glass of vanilla milkshake, a bit boring, but still good." + +/datum/reagent/consumable/milkshake_choc + name = "Chocolate Milkshake" + description = "A delicious Chocolate Milkshake" + color = "#7B3F00" + nutriment_factor = 1 + taste_description = "sweet, creamy chocolate" + glass_icon_state = "choccyshake" + glass_name = "glass of chocolate milkshake" + glass_desc = "A glass of chocolate milkshake, what a treat!" + +/datum/reagent/consumable/milkshake_strawberry + name = "Strawberry Milkshake" + description = "Frozen Strawberry Milk!" + color = "#F4E1EA" + nutriment_factor = 1 + taste_description = "summer memories" + glass_icon_state = "strawberryshake" + glass_name = "glass of strawberry milkshake" + glass_desc = "A glass of sweet, pink Strawberry Shake" + +/datum/reagent/consumable/milkshake_banana + name = "Banana Milkshake" + description = "Deliciously tricky!" + color = "#FFE135" + nutriment_factor = 1 + taste_description = "funny pranks and clowning around" + glass_icon_state = "bananashake" + glass_name = "glass of Banana Milkshake" + glass_desc = "A banana milkshake! Honk!" + +/datum/reagent/consumable/milkshake_berry + name = "Wild Berry Milkshake" + description = "A summer favorite!" + color = "#b17179" + nutriment_factor = 1 + taste_description = "warm summer days" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "berryshake" + glass_name = "glass of Wild Berry Milkshake" + glass_desc = "A berry milkshake" + +/datum/reagent/consumable/milkshake_cola + name = "Cola Milkshake" + description = "Sweet milkshake mixed with cola" + color = "#3c3024" + nutriment_factor = 1 + taste_description = "cola and milkshake" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "colashake" + glass_name = "glass of Cola Milkshake" + glass_desc = "A cola milkshake, it's like a ticker float!" + +/datum/reagent/consumable/milkshake_gibb + name = "Dr. Gibb Milkshake" + description = "Sweet milkshake mixed with Dr. Gibb" + color = "#5e312b" + nutriment_factor = 1 + taste_description = "cola and milkshake" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "gibbshake" + glass_name = "glass of Gibb Milkshake" + glass_desc = "A Dr. Gibb milkshake, it's like a ticker float!" + +/datum/reagent/consumable/milkshake_peach + name = "Peach Milkshake" + description = "A tasty Peach Milkshake" + color = "#5e312b" + nutriment_factor = 1 + taste_description = "peaches and cream" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "peachshake" + glass_name = "glass of Peace Milkshake" + glass_desc = "Peaches and Cream, Peaches and Cream!" + +/datum/reagent/consumable/milkshake_pineapple + name = "Pineapple Milkshake" + description = "A tangy Pineapple Milkshake" + color = "#feea63" + nutriment_factor = 1 + taste_description = "citrus and cream" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "pineappleshake" + glass_name = "glass of Pineapple Milkshake" + glass_desc = "A Pineapple milkshake, a bit sweet and a bit sour, but all delicious!" + +/datum/reagent/consumable/milkshake_melon + name = "Watermelon Milkshake" + description = "Delicous Watermelon Milkshake" + color = "#E37383" + nutriment_factor = 1 + taste_description = "warm sun and sweet cream" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "melonshake" + glass_name = "glass of Watermelon Milkshake" + glass_desc = "A Watermelon milkshake, it's like summer all over again!" diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm index f483f1ec8372..07917089d2c8 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -1,10 +1,17 @@ -//Main code edits -/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) - if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) - if(!HAS_TRAIT(M, TRAIT_IN_HEAT)) - to_chat(M, span_userlove("Your need for sex is overpowering!")) - M.log_message("Made In Heat by hexacrocin.", LOG_EMOTE) - ADD_TRAIT(M, TRAIT_IN_HEAT, APHRO_TRAIT) +/datum/reagent/drug/aphrodisiacplus/overdose_start(mob/living/M) + // Check for pre-existing heat trait + if(!HAS_TRAIT(M, TRAIT_ESTROUS_ACTIVE)) + // Check client preferences + if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) + // Add quirk + M.add_quirk(/datum/quirk/estrous_active, APHRO_TRAIT) + + // Chat message is handled by the quirk + + // Log interaction + M.log_message("Given the In Estrous quirk by hexacrocin overdose.", LOG_EMOTE) + + // Return normally . = ..() //Own stuff diff --git a/modular_splurt/icons/obj/drinks.dmi b/modular_splurt/icons/obj/drinks.dmi index a1541fddb106..4ea6784f4e1b 100644 Binary files a/modular_splurt/icons/obj/drinks.dmi and b/modular_splurt/icons/obj/drinks.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 734ffa6745e8..2ea84c02e08c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4643,6 +4643,7 @@ #include "modular_splurt\code\modules\jobs\job_types\security_officer.dm" #include "modular_splurt\code\modules\jobs\job_types\service.dm" #include "modular_splurt\code\modules\jobs\job_types\station_engineer.dm" +#include "modular_splurt\code\modules\keybindings\keybind\communication.dm" #include "modular_splurt\code\modules\keybindings\keybind\human.dm" #include "modular_splurt\code\modules\keybindings\keybind\movement.dm" #include "modular_splurt\code\modules\language\xenocommon.dm"