From 324a8e85c354c4f0029b3cd08253ba75172ae84a Mon Sep 17 00:00:00 2001 From: Cyantime Date: Sun, 4 Feb 2018 17:06:22 -0500 Subject: [PATCH 01/20] Removes binocs from xenoarch --- code/modules/xenoarcheaology/misc_vr.dm | 9 --------- vorestation.dme | 1 - 2 files changed, 10 deletions(-) delete mode 100644 code/modules/xenoarcheaology/misc_vr.dm diff --git a/code/modules/xenoarcheaology/misc_vr.dm b/code/modules/xenoarcheaology/misc_vr.dm deleted file mode 100644 index 13f878e63e..0000000000 --- a/code/modules/xenoarcheaology/misc_vr.dm +++ /dev/null @@ -1,9 +0,0 @@ -/obj/structure/closet/excavation - name = "Excavation tools" - icon_state = "toolcloset" - icon_closed = "toolcloset" - icon_opened = "toolclosetopen" - - New() - ..() - new /obj/item/device/binoculars(src) diff --git a/vorestation.dme b/vorestation.dme index a5f8047f95..be1af5aa4e 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2674,7 +2674,6 @@ #include "code\modules\xenoarcheaology\manuals.dm" #include "code\modules\xenoarcheaology\master_controller.dm" #include "code\modules\xenoarcheaology\misc.dm" -#include "code\modules\xenoarcheaology\misc_vr.dm" #include "code\modules\xenoarcheaology\sampling.dm" #include "code\modules\xenoarcheaology\artifacts\artifact.dm" #include "code\modules\xenoarcheaology\artifacts\artifact_find.dm" From 12e2385dc1d0a572514349deb7d5ba5b041c43a5 Mon Sep 17 00:00:00 2001 From: Verkister Date: Sun, 11 Feb 2018 23:06:33 +0200 Subject: [PATCH 02/20] Fixes dead mobs finishing noms. -I thought someone would have fixed this already smh. --- code/modules/vore/eating/belly_vr.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm index e97310dd16..ea38982594 100644 --- a/code/modules/vore/eating/belly_vr.dm +++ b/code/modules/vore/eating/belly_vr.dm @@ -174,6 +174,8 @@ // The purpose of this method is to avoid duplicate code, and ensure that all necessary // steps are taken. /datum/belly/proc/nom_mob(var/mob/prey, var/mob/user) + if(owner.stat == DEAD) + return if (prey.buckled) prey.buckled.unbuckle_mob() From 48414f790f6e5a5fe0cf9eb7a01ae6fac024149d Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Sun, 11 Feb 2018 16:20:51 -0500 Subject: [PATCH 03/20] Update README.md for repo --- README.md | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 5249fc4160..7bef0d8b45 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ -# vorestation +# VOREStation -[Forums](http://forum.vore-station.net/) - [Wiki](http://wiki.vore-station.net/) +[![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](http://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/compatibility-club-penguin.svg)](http://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/no-ragrets.svg)](http://forthebadge.com) -VOREStation is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, for the game Spacestation13. +[Website](https://vore-station.net) - [Forums](https://forum.vore-station.net/) - [Wiki](https://wiki.vore-station.net/) + +Going to make a Pull Request? Make sure you read the [CONTRIBUTING.md](.github/CONTRIBUTING.md) first! + +VOREStation is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, for the game Space Station 13. --- @@ -20,7 +24,7 @@ See [here](https://www.gnu.org/licenses/why-affero-gpl.html) for more informatio All assets including icons and sound are under a [CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/) license unless otherwise indicated. ### GETTING THE CODE -The simplest way to obtain the code is using the github .zip feature. +The simplest way to obtain the code is using the github .zip feature. If you do this, you won't be able to make a Pull Request later, though. You'll need to use the git method. Click [here](https://github.com/VOREStation/VOREStation/archive/master.zip) to get the latest code as a .zip file, then unzip it to wherever you want. @@ -32,13 +36,6 @@ The more complicated and easier to update method is using git. You'll need to d This will take a while to download, but it provides an easier method for updating. -Once the repository is in place, run this command: -```bash -cd VOREStation -git update-index --assume-unchanged vorestation.int -``` -Now git will ignore changes to the file vorestation.int. - ### INSTALLATION First-time installation should be fairly straightforward. First, you'll need BYOND installed. You can get it from [here](http://www.byond.com/). @@ -53,7 +50,7 @@ If you see any errors or warnings, something has gone wrong - possibly a corrupt Once that's done, open up the config folder. You'll want to edit config.txt to set the probabilities for different gamemodes in Secret and to set your server location so that all your players don't get disconnected at the end of each round. It's recommended you don't turn on the gamemodes with probability 0, as they have various issues and aren't currently being tested, so they may have unknown and bizarre bugs. -You'll also want to edit admins.txt to remove the default admins and add your own. "Game Master" is the highest level of access, and the other recommended admin levels for now are "Game Admin" and "Moderator". The format is: +You'll also want to edit admins.txt to remove the default admins and add your own. "Host" is the highest level of access, and the other recommended admin levels for now are "Game Admin" and "Moderator". The format is: byondkey - Rank @@ -88,10 +85,4 @@ For a basic setup, simply copy every file from config/example to config. ### SQL Setup -The SQL backend for the library and stats tracking requires a MySQL server. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql. More detailed setup instructions arecoming soon, for now ask in our IRC channel. - ---- - -### IRC Bot Setup - -Included in the repo is an IRC bot capable of relaying adminhelps to a specified IRC channel/server (thanks to Skibiliano). Instructions for bot setup are included in the /bot/ folder along with the bot/relay script itself. +The SQL backend for the library and stats tracking requires a MySQL server. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql. More detailed setup instructions arecoming soon, for now ask in our Discord. From d9e15d68ec6e5a87697227df030a35191fa4e888 Mon Sep 17 00:00:00 2001 From: Verkister Date: Tue, 13 Feb 2018 12:03:13 +0200 Subject: [PATCH 04/20] Fixes Talon robohands. -I had been blaming Polaris for this but boy was I wrong then :v -Left hand no longer shows up on right side and vice versa. --- .../cyberlimbs/talon/talon_main.dmi | Bin 3650 -> 3631 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/human_races/cyberlimbs/talon/talon_main.dmi b/icons/mob/human_races/cyberlimbs/talon/talon_main.dmi index c6eb5b969a5d2c80a2e02fc3eb867c839d95732d..95a20f88ab4efecf20a17e6b48e17ad9bed6441d 100644 GIT binary patch delta 2880 zcmXX{2~?6<8-{+%NvCWvH8U+MGb@c;&>0miNKtbw_oX5u_kBz4b6UoINh-{ZEXy%b zQX_x2u`)$dz%3~qrP4$LHw00>;QOh6?m73~^PY3hyWHn}pXZGRMWbK>u)w0N&n1@5 zPdJ6(Si5PKeBWeMO~G>)k%6 z5y-W*&Ba3wHSRTxCNsJ)p zh@Fp&M=9)>6#(&K)Cg&#lVW>Y+cDv__86eTxuCQ2^!Du(kAgW(ATSV9On-`YIY__a z7N3yNo=<84MQiT@t}id=hlGUi-yNj@m&JAi;Y|d)C)&VwCe0(^I^Hog4+Am#T_JdzP6$0LY$>?m%;yge8f4t_#(UT@c8_R{M7 zc-d{DG?_bE`%v-or%(IlNSzA{bxkx!2q>l<69Ru(q@8(uCnH1VFC(L8c^RnhXEL)h zdUE$5(df%TLA^fv$L8ai;jGEYax$6RCSb37%LT1qHW|Ef&fYg6*=rQ9m=bp`%goGVZ*XcPH(dd{W=Tzc~X&j6GYsaW^`Wh_Kl2;kzi^$Fbt+@R|Fvh3kpQJk zlxTfBZlytMmVq)pJ|4|s?9F^+yYNr*0hu+a^mpY{RrW(4ce<+C_{tGw1y^0==}sR~ zfY4$xy~(npIFHqiR5>*USoDsAmTCI>TJg;^5Lqmm?Qj%Y@=sp+gyhd(8o>Q1Ke*OqbY&g`C# zuTggzaU14D6%NtR>FD>+9Vd+kGAyn%&Iw;JF+&rig4Wks<`8debv2%|+K6XX`s!!* zcpW%ZT5u@`J2XS=3rt$&d2#UL!1y@-^$PQhg7D%XLwm4ok}P< z)P^xh1SGMP2xqjUN13EPdI=JPz8n^I7R^u}3^hqE{_IxaJZnBlr5Yzmzb7#@aN8-Z zZv;RjbUNxIRIv&hB3Ppt3X>DxU8|=hyPgA}#OCJd@*U#I0OJcba?&@Y0zy5w zC(ReAd|F%c%*)R|l=X-qs^HDfV`W|caifM{u)qKrF?m;BNwdu;-R{W_-o6VW8|OK5 zP4mQoq(FYIRA~Xw)dx`{K53?TF`Or%8Z@(zT9%w+KL0v6-;|jV%Rs4`fu7%ltN>99 z7yMkyq(JMRfF^^MMSG_%mt6_ay_|Fq92y71l_V;`AbsIETV6n!aQz zy_~kERm-ng%B6WoR~OlBwtGnLp>2ib>f@m%Uqu}$(UPtXX_UJ5E%Yoz768+*fzWvx z;9u>VitO1r-=Gua*ciMc#Nu1&+Rc3jW({IhfCCzjfPSn`K_fX@I5CXuSih{_UKR(j zzt0ewT|lNL?4epR!CK)0P}B%}KB~j<`)zC&&fyEVW5kqwkcE0HF2S&TLn{Zb${kO6 zJZO9W{{5592OAMONwS*1f{PuC&1~wYwGwo*p1VPRp|dQTo;K2zW%C36bmB;aj- z;3pSrYnO@BQ~0grogd&!)4e-oL-OqXw;v9Isd_HTy@bO~H*yjN%}-g(V2e8|M^L-2 zN#aUw8=r`Wm6n&=)w&btbb1sr?np^ViEGXKX+dmdU&Zev`*wd1<8Ge^u_}a|v{3%lp3d^v}-aV%1mRO|NEEUtpEUt9|iGOEMN~OcjWE5E6k%NaQrzkfaKca|rqkK8`d`dp zc25fL_61h6xF^H^$U$J+{fW`d$0Vw!-|i;GJ?Iv<`U1q=A!BArX@W<$>!j|j|`=t=OOTWpuCS~-hI(IRdG3-fLiM+VY3PISu zRh{53??&*GiG24~*iX6UucydpAP13|ow-Gw_9Msjx8B^a(u*?$CdaVEDPdxG4AhJ$ z{6sZ?{+`mqv95$W(okxVqfjEtGLB3^b*G&+c{iR=<2K8PIzx z2AdI8RFN4jr!f~^q^}_-r+feg>pEk(X&`laPy{DpH3C}6T#|6D@lqx1ME60_B73oU zZ^LH7iR+?yvdRVb6x;W)5SjTRM-$J?OMEu0-X2!BjN*N2+MFckO-UY)q5k?>05>3ndasIk+kk z{T`!m#4kM8s&atI78c`( Kt~+(%#{U3Q$sA$; delta 2933 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 From c9f5d6f2345e2111d13d5ae778b19807e659db07 Mon Sep 17 00:00:00 2001 From: Screemonster Date: Tue, 13 Feb 2018 17:53:02 +0000 Subject: [PATCH 05/20] squashed commits for improved newspapering --- .../living/simple_animal/animals/cat_vr.dm | 75 ++++++------ .../living/simple_animal/animals/fox_vr.dm | 109 +++++++++--------- .../simple_animal/vore/zz_vore_overrides.dm | 28 +++++ code/modules/vore/eating/bellymodes_vr.dm | 3 +- code/modules/vore/eating/simple_animal_vr.dm | 32 ++++- 5 files changed, 152 insertions(+), 95 deletions(-) diff --git a/code/modules/mob/living/simple_animal/animals/cat_vr.dm b/code/modules/mob/living/simple_animal/animals/cat_vr.dm index ca645d5a37..f4c2644ad6 100644 --- a/code/modules/mob/living/simple_animal/animals/cat_vr.dm +++ b/code/modules/mob/living/simple_animal/animals/cat_vr.dm @@ -1,38 +1,39 @@ -/mob/living/simple_animal/cat/fluff/Runtime/New() - - if(!vore_organs.len) - var/datum/belly/B = new /datum/belly(src) - B.immutable = 1 - B.name = "Stomach" - B.inside_flavor = "The slimy wet insides of Runtime! Not quite as clean as the cat on the outside." - B.human_prey_swallow_time = swallowTime - B.nonhuman_prey_swallow_time = swallowTime - vore_organs[B.name] = B - vore_selected = B.name - - B.emote_lists[DM_HOLD] = list( - "Runtime's stomach kneads gently on you and you're fairly sure you can hear her start purring.", - "Most of what you can hear are slick noises, Runtime breathing, and distant purring.", - "Runtime seems perfectly happy to have you in there. She lays down for a moment to groom and squishes you against the walls.", - "The CMO's pet seems to have found a patient of her own, and is treating them with warm, wet kneading walls.", - "Runtime mostly just lazes about, and you're left to simmer in the hot, slick guts unharmed.", - "Runtime's master might let you out of this fleshy prison, eventually. Maybe. Hopefully?") - - B.emote_lists[DM_DIGEST] = list( - "Runtime's stomach is treating you rather like a mouse, kneading acids into you with vigor.", - "A thick dollop of bellyslime drips from above while the CMO's pet's gut works on churning you up.", - "Runtime seems to have decided you're food, based on the acrid air in her guts and the pooling fluids.", - "Runtime's stomach tries to claim you, kneading and pressing inwards again and again against your form.", - "Runtime flops onto their side for a minute, spilling acids over your form as you remain trapped in them.", - "The CMO's pet doesn't seem to think you're any different from any other meal. At least, their stomach doesn't.") - - B.digest_messages_prey = list( - "Runtime's stomach slowly melts your body away. Her stomach refuses to give up it's onslaught, continuing until you're nothing more than nutrients for her body to absorb.", - "After an agonizing amount of time, Runtime's stomach finally manages to claim you, melting you down and adding you to her stomach.", - "Runtime's stomach continues to slowly work away at your body before tightly squeezing around you once more, causing the remainder of your body to lose form and melt away into the digesting slop around you.", - "Runtime's slimy gut continues to constantly squeeze and knead away at your body, the bulge you create inside of her stomach growing smaller as time progresses before soon dissapearing completely as you melt away.", - "Runtime's belly lets off a soft groan as your body finally gives out, the cat's eyes growing heavy as it settles down to enjoy it's good meal.", - "Runtime purrs happily as you slowly slip away inside of her gut, your body's nutrients are then used to put a layer of padding on the now pudgy cat.", - "The acids inside of Runtime's stomach, aided by the constant motions of the smooth walls surrounding you finally manage to melt you away into nothing more mush. She curls up on the floor, slowly kneading the air as her stomach moves its contents — including you — deeper into her digestive system.", - "Your form begins to slowly soften and break apart, rounding out Runtime's swollen belly. The carnivorous cat rumbles and purrs happily at the feeling of such a filling meal.") +/mob/living/simple_animal/cat/fluff/Runtime/init_belly() ..() + var/datum/belly/B = vore_organs[vore_selected] + B.name = "Stomach" + B.inside_flavor = "The slimy wet insides of Runtime! Not quite as clean as the cat on the outside." + + B.emote_lists[DM_HOLD] = list( + "Runtime's stomach kneads gently on you and you're fairly sure you can hear her start purring.", + "Most of what you can hear are slick noises, Runtime breathing, and distant purring.", + "Runtime seems perfectly happy to have you in there. She lays down for a moment to groom and squishes you against the walls.", + "The CMO's pet seems to have found a patient of her own, and is treating them with warm, wet kneading walls.", + "Runtime mostly just lazes about, and you're left to simmer in the hot, slick guts unharmed.", + "Runtime's master might let you out of this fleshy prison, eventually. Maybe. Hopefully?") + + B.emote_lists[DM_DIGEST] = list( + "Runtime's stomach is treating you rather like a mouse, kneading acids into you with vigor.", + "A thick dollop of bellyslime drips from above while the CMO's pet's gut works on churning you up.", + "Runtime seems to have decided you're food, based on the acrid air in her guts and the pooling fluids.", + "Runtime's stomach tries to claim you, kneading and pressing inwards again and again against your form.", + "Runtime flops onto their side for a minute, spilling acids over your form as you remain trapped in them.", + "The CMO's pet doesn't seem to think you're any different from any other meal. At least, their stomach doesn't.") + + B.emote_lists[DM_ITEMWEAK] = list( + "Runtime's stomach is treating you rather like a mouse, kneading acids into you with vigor.", + "A thick dollop of bellyslime drips from above while the CMO's pet's gut works on churning you up.", + "Runtime seems to have decided you're food, based on the acrid air in her guts and the pooling fluids.", + "Runtime's stomach tries to claim you, kneading and pressing inwards again and again against your form.", + "Runtime flops onto their side for a minute, spilling acids over your form as you remain trapped in them.", + "The CMO's pet doesn't seem to think you're any different from any other meal. At least, their stomach doesn't.") + + B.digest_messages_prey = list( + "Runtime's stomach slowly melts your body away. Her stomach refuses to give up it's onslaught, continuing until you're nothing more than nutrients for her body to absorb.", + "After an agonizing amount of time, Runtime's stomach finally manages to claim you, melting you down and adding you to her stomach.", + "Runtime's stomach continues to slowly work away at your body before tightly squeezing around you once more, causing the remainder of your body to lose form and melt away into the digesting slop around you.", + "Runtime's slimy gut continues to constantly squeeze and knead away at your body, the bulge you create inside of her stomach growing smaller as time progresses before soon dissapearing completely as you melt away.", + "Runtime's belly lets off a soft groan as your body finally gives out, the cat's eyes growing heavy as it settles down to enjoy it's good meal.", + "Runtime purrs happily as you slowly slip away inside of her gut, your body's nutrients are then used to put a layer of padding on the now pudgy cat.", + "The acids inside of Runtime's stomach, aided by the constant motions of the smooth walls surrounding you finally manage to melt you away into nothing more mush. She curls up on the floor, slowly kneading the air as her stomach moves its contents — including you — deeper into her digestive system.", + "Your form begins to slowly soften and break apart, rounding out Runtime's swollen belly. The carnivorous cat rumbles and purrs happily at the feeling of such a filling meal.") diff --git a/code/modules/mob/living/simple_animal/animals/fox_vr.dm b/code/modules/mob/living/simple_animal/animals/fox_vr.dm index 76f4bb28c4..f7eb8c157a 100644 --- a/code/modules/mob/living/simple_animal/animals/fox_vr.dm +++ b/code/modules/mob/living/simple_animal/animals/fox_vr.dm @@ -39,33 +39,35 @@ var/turns_since_scan = 0 var/mob/flee_target -/mob/living/simple_animal/fox/New() - if(!vore_organs.len) - var/datum/belly/B = new /datum/belly(src) - B.immutable = 1 - B.name = "Stomach" - B.inside_flavor = "Slick foxguts. Cute on the outside, slimy on the inside!" - B.human_prey_swallow_time = swallowTime - B.nonhuman_prey_swallow_time = swallowTime - vore_organs[B.name] = B - vore_selected = B.name - - B.emote_lists[DM_HOLD] = list( - "The foxguts knead and churn around you harmlessly.", - "With a loud glorp, some air shifts inside the belly.", - "A thick drop of warm bellyslime drips onto you from above.", - "The fox turns suddenly, causing you to shift a little.", - "During a moment of relative silence, you can hear the fox breathing.", - "The slimey stomach walls squeeze you lightly, then relax.") - - B.emote_lists[DM_DIGEST] = list( - "The guts knead at you, trying to work you into thick soup.", - "You're ground on by the slimey walls, treated like a mouse.", - "The acrid air is hard to breathe, and stings at your lungs.", - "You can feel the acids coating you, ground in by the slick walls.", - "The fox's stomach churns hungrily over your form, trying to take you.", - "With a loud glorp, the stomach spills more acids onto you.") +/mob/living/simple_animal/fox/init_belly() ..() + var/datum/belly/B = vore_organs[vore_selected] + B.name = "Stomach" + B.inside_flavor = "Slick foxguts. Cute on the outside, slimy on the inside!" + + B.emote_lists[DM_HOLD] = list( + "The foxguts knead and churn around you harmlessly.", + "With a loud glorp, some air shifts inside the belly.", + "A thick drop of warm bellyslime drips onto you from above.", + "The fox turns suddenly, causing you to shift a little.", + "During a moment of relative silence, you can hear the fox breathing.", + "The slimey stomach walls squeeze you lightly, then relax.") + + B.emote_lists[DM_DIGEST] = list( + "The guts knead at you, trying to work you into thick soup.", + "You're ground on by the slimey walls, treated like a mouse.", + "The acrid air is hard to breathe, and stings at your lungs.", + "You can feel the acids coating you, ground in by the slick walls.", + "The fox's stomach churns hungrily over your form, trying to take you.", + "With a loud glorp, the stomach spills more acids onto you.") + + B.emote_lists[DM_ITEMWEAK] = list( + "The guts knead at you, trying to work you into thick soup.", + "You're ground on by the slimey walls, treated like a mouse.", + "The acrid air is hard to breathe, and stings at your lungs.", + "You can feel the acids coating you, ground in by the slick walls.", + "The fox's stomach churns hungrily over your form, trying to take you.", + "With a loud glorp, the stomach spills more acids onto you.") // All them complicated fox procedures. /mob/living/simple_animal/fox/Life() @@ -184,34 +186,35 @@ desc = "Renault, the Colony Director's trustworthy fox. I wonder what it says?" befriend_job = "Colony Director" -/mob/living/simple_animal/fox/fluff/Renault/New() - if(!vore_organs.len) - var/datum/belly/B = new /datum/belly(src) - B.immutable = 1 - B.name = "Stomach" - B.inside_flavor = "Slick foxguts. They seem somehow more regal than perhaps other foxes!" - B.human_prey_swallow_time = swallowTime - B.nonhuman_prey_swallow_time = swallowTime - vore_organs[B.name] = B - vore_selected = B.name - - B.emote_lists[DM_HOLD] = list( - "Renault's stomach walls squeeze around you more tightly for a moment, before relaxing, as if testing you a bit.", - "There's a sudden squeezing as Renault presses a forepaw against his gut over you, squeezng you against the slick walls.", - "The 'head fox' has a stomach that seems to think you belong to it. It might be hard to argue, as it kneads at your form.", - "If being in the captain's fox is a promotion, it might not feel like one. The belly just coats you with more thick foxslime.", - "It doesn't seem like Renault wants to let you out. The stomach and owner possessively squeeze around you.", - "Renault's stomach walls squeeze closer, as he belches quietly, before swallowing more air. Does he do that on purpose?") - - B.emote_lists[DM_DIGEST] = list( - "Renault's stomach walls grind hungrily inwards, kneading acids against your form, and treating you like any other food.", - "The captain's fox impatiently kneads and works acids against you, trying to claim your body for fuel.", - "The walls knead in firmly, squeezing and tossing you around briefly in disorienting aggression.", - "Renault belches, letting the remaining air grow more acrid. It burns your lungs with each breath.", - "A thick glob of acids drip down from above, adding to the pool of caustic fluids in Renault's belly.", - "There's a loud gurgle as the stomach declares the intent to make you a part of Renault.") - +/mob/living/simple_animal/fox/fluff/Renault/init_belly() ..() + var/datum/belly/B = vore_organs[vore_selected] + B.name = "Stomach" + B.inside_flavor = "Slick foxguts. They seem somehow more regal than perhaps other foxes!" + + B.emote_lists[DM_HOLD] = list( + "Renault's stomach walls squeeze around you more tightly for a moment, before relaxing, as if testing you a bit.", + "There's a sudden squeezing as Renault presses a forepaw against his gut over you, squeezing you against the slick walls.", + "The 'head fox' has a stomach that seems to think you belong to it. It might be hard to argue, as it kneads at your form.", + "If being in the captain's fox is a promotion, it might not feel like one. The belly just coats you with more thick foxslime.", + "It doesn't seem like Renault wants to let you out. The stomach and owner possessively squeeze around you.", + "Renault's stomach walls squeeze closer, as he belches quietly, before swallowing more air. Does he do that on purpose?") + + B.emote_lists[DM_DIGEST] = list( + "Renault's stomach walls grind hungrily inwards, kneading acids against your form, and treating you like any other food.", + "The captain's fox impatiently kneads and works acids against you, trying to claim your body for fuel.", + "The walls knead in firmly, squeezing and tossing you around briefly in disorienting aggression.", + "Renault belches, letting the remaining air grow more acrid. It burns your lungs with each breath.", + "A thick glob of acids drip down from above, adding to the pool of caustic fluids in Renault's belly.", + "There's a loud gurgle as the stomach declares the intent to make you a part of Renault.") + + B.emote_lists[DM_ITEMWEAK] = list( + "Renault's stomach walls grind hungrily inwards, kneading acids against your form, and treating you like any other food.", + "The captain's fox impatiently kneads and works acids against you, trying to claim your body for fuel.", + "The walls knead in firmly, squeezing and tossing you around briefly in disorienting aggression.", + "Renault belches, letting the remaining air grow more acrid. It burns your lungs with each breath.", + "A thick glob of acids drip down from above, adding to the pool of caustic fluids in Renault's belly.", + "There's a loud gurgle as the stomach declares the intent to make you a part of Renault.") /mob/living/simple_animal/fox/syndicate name = "syndi-fox" diff --git a/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm index c4ca05baf7..2f2868faab 100644 --- a/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm +++ b/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm @@ -155,6 +155,20 @@ return null return ..() +/mob/living/simple_animal/cat/fluff + vore_ignores_undigestable = 0 + vore_pounce_chance = 100 + vore_digest_chance = 0 // just use the toggle + vore_default_mode = DM_HOLD //can use the toggle if you wanna be catfood + +/mob/living/simple_animal/cat/fluff/EatTarget() + var/mob/living/TM = target_mob + prey_excludes += TM //so they won't immediately re-eat someone who struggles out (or gets newspapered out) as soon as they're ate + spawn(3600) // but if they hang around and get comfortable, they might get ate again + if(src && TM) + prey_excludes -= TM + ..() // will_eat check is carried out before EatTarget is called, so prey on the prey_excludes list isn't a problem. + /mob/living/simple_animal/fox vore_active = 1 // NO VORE SPRITES @@ -180,6 +194,20 @@ return null return ..() +/mob/living/simple_animal/fox/fluff + vore_ignores_undigestable = 0 + vore_pounce_chance = 100 + vore_digest_chance = 0 // just use the toggle + vore_default_mode = DM_HOLD //can use the toggle if you wanna be foxfood + +/mob/living/simple_animal/fox/fluff/EatTarget() + var/mob/living/TM = target_mob + prey_excludes += TM //so they won't immediately re-eat someone who struggles out (or gets newspapered out) as soon as they're ate + spawn(3600) // but if they hang around and get comfortable, they might get ate again + if(src && TM) + prey_excludes -= TM + ..() // will_eat check is carried out before EatTarget is called, so prey on the prey_excludes list isn't a problem. + /mob/living/simple_animal/hostile/goose vore_active = 1 // NO VORE SPRITES diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 1c24d2cbc0..b65381b437 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -9,7 +9,8 @@ spawn(emoteTime) var/list/EL = emote_lists[digest_mode] for(var/mob/living/M in internal_contents) - M << "[pick(EL)]" + if(M.digestable || !(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK)) // don't give digesty messages to indigestible people + M << "[pick(EL)]" src.emotePend = FALSE //////////////////////// Absorbed Handling //////////////////////// diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index 319592c5ea..a50e93e1d5 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -30,17 +30,17 @@ if(!istype(user) || user.stat) return var/datum/belly/B = vore_organs[vore_selected] - if(faction != user.faction) + if(retaliate || (hostile && faction != user.faction)) user << "This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you." return if(B.digest_mode == "Hold") - var/confirm = alert(user, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will disable itself after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel") + var/confirm = alert(user, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will reset after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel") if(confirm == "Enable") B.digest_mode = "Digest" spawn(12000) //12000=20 minutes - if(src) B.digest_mode = "Hold" + if(src) B.digest_mode = vore_default_mode else - var/confirm = alert(user, "This mob is currently set to digest all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel") + var/confirm = alert(user, "This mob is currently set to process all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel") if(confirm == "Disable") B.digest_mode = "Hold" @@ -75,3 +75,27 @@ mob/living/simple_animal/custom_emote() mob/living/simple_animal/say() if (away_from_players()) return . = ..() + +/mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user) + if (istype(O, /obj/item/weapon/newspaper) && !(ckey || (hostile && faction != user.faction)) && isturf(user.loc)) + if (retaliate && prob(vore_pounce_chance/2)) // This is a gamble! + user.Weaken(5) //They get tackled anyway whether they're edible or not. + user.visible_message("\the [user] swats \the [src] with \the [O] and promptly gets tackled!!") + if (will_eat(user)) + stop_automated_movement = 1 + animal_nom(user) + update_icon() + stop_automated_movement = 0 + else + user.visible_message("\the [user] swats \the [src] with \the [O]!!") + for(var/I in vore_organs) + var/datum/belly/B = vore_organs[I] + B.release_all_contents(include_absorbed = TRUE) // Until we can get a mob version of unsorbitol or whatever, release absorbed too + for(var/mob/living/L in range(1)) //add everyone on the tile to the do-not-eat list for a while + if(!(L in prey_excludes)) // Unless they're already on it, just to avoid fuckery. + prey_excludes += L + spawn(3600) + if(src && L) + prey_excludes -= L + else + ..() From bdb99ce7dc8e387d3cdb729d98cce0b51ddf7c3d Mon Sep 17 00:00:00 2001 From: Mewchild Date: Tue, 13 Feb 2018 17:13:25 -0600 Subject: [PATCH 06/20] Updates Fluff ring so gloves can be worn over it, and so it functions as a stamp (similar to normal signet ring) --- code/modules/vore/fluffstuff/custom_clothes_vr.dm | 6 +++--- config/custom_items.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 0edda7843a..5db631d013 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -1689,7 +1689,7 @@ Departamental Swimsuits, for general use species_restricted = null //Mewchild: Phi Vietsi -/obj/item/clothing/gloves/fluff/vietsi +/obj/item/clothing/gloves/ring/seal/fluff/vietsi name = "signet ring" desc = "A signet ring carved from the bones of something long extinct, as a ward against bad luck." @@ -1697,7 +1697,7 @@ Departamental Swimsuits, for general use icon_state = "vietsi_ring" var/nameset = 0 -/obj/item/clothing/gloves/fluff/vietsi/attack_self(mob/user) +/obj/item/clothing/gloves/ring/seal/fluff/vietsi/attack_self(mob/user) if(nameset) to_chat(user, "The [src] has already been claimed!") return @@ -1706,7 +1706,7 @@ Departamental Swimsuits, for general use change_name(user) nameset = 1 -/obj/item/clothing/gloves/fluff/vietsi/proc/change_name(var/signet_name = "Unknown") +/obj/item/clothing/gloves/ring/seal/fluff/vietsi/proc/change_name(var/signet_name = "Unknown") name = "[signet_name]'s Bone Signet Ring" desc = "A signet ring belonging to [signet_name], carved from the bones of something long extinct, as a ward against bad luck." diff --git a/config/custom_items.txt b/config/custom_items.txt index c7ee6a03f9..4e5847c033 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -498,7 +498,7 @@ item_path: /obj/item/weapon/implanter/reagent_generator/savannah { ckey: mewchild character_name: Phi Vietsi -item_path: /obj/item/clothing/gloves/fluff/vietsi +item_path: /obj/item/clothing/gloves/ring/seal/fluff/vietsi } { From b4b9cea3625b61438b923db1d8d807d22063387c Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 14 Feb 2018 20:56:53 -0500 Subject: [PATCH 07/20] Make light switches constructable Adds constructable light switches using Brown's construction stage icons. --- code/modules/examine/stat_icons.dm | 1 + code/modules/materials/material_recipes_vr.dm | 4 + code/modules/power/lightswitch_vr.dm | 173 ++++++++++++++++++ icons/obj/power_vr.dmi | Bin 2234 -> 2536 bytes vorestation.dme | 2 + 5 files changed, 180 insertions(+) create mode 100644 code/modules/materials/material_recipes_vr.dm create mode 100644 code/modules/power/lightswitch_vr.dm diff --git a/code/modules/examine/stat_icons.dm b/code/modules/examine/stat_icons.dm index 1ece266f0c..c2c566383a 100644 --- a/code/modules/examine/stat_icons.dm +++ b/code/modules/examine/stat_icons.dm @@ -16,6 +16,7 @@ var/global/list/description_icons = list( "wrench" = image(icon='icons/obj/tools.dmi',icon_state="wrench"), "crowbar" = image(icon='icons/obj/tools.dmi',icon_state="crowbar"), "multitool" = image(icon='icons/obj/device.dmi',icon_state="multitool"), + "cable coil" = image(icon='icons/obj/power.dmi',icon_state="coil"), // VOREStation Edit "metal sheet" = image(icon='icons/obj/items.dmi',icon_state="sheet-metal"), "plasteel sheet" = image(icon='icons/obj/items.dmi',icon_state="sheet-plasteel"), diff --git a/code/modules/materials/material_recipes_vr.dm b/code/modules/materials/material_recipes_vr.dm new file mode 100644 index 0000000000..9f8a323407 --- /dev/null +++ b/code/modules/materials/material_recipes_vr.dm @@ -0,0 +1,4 @@ + +/material/steel/generate_recipes() + . = ..() + recipes += new/datum/stack_recipe("light switch frame", /obj/item/frame/lightswitch, 2) diff --git a/code/modules/power/lightswitch_vr.dm b/code/modules/power/lightswitch_vr.dm new file mode 100644 index 0000000000..d617c5c1f7 --- /dev/null +++ b/code/modules/power/lightswitch_vr.dm @@ -0,0 +1,173 @@ +// +// Lightswitch Construction +// Note: This does not use the normal frame.dm approach becuase: +// 1) That requires circuits, and I don't want a circuit board instance in every lightswitch. +// 2) This is an experiment in modernizing construction steps and examine tabs. + +// The frame item in hand +/obj/item/frame/lightswitch + name = "light switch frame" + desc = "Used for building light switches." + icon = 'icons/obj/power_vr.dmi' + icon_state = "lightswitch-s1" + build_machine_type = /obj/structure/construction/lightswitch + refund_amt = 2 + +// The under construction light switch +/obj/structure/construction/lightswitch + name = "light switch frame" + desc = "A light switch under construction." + icon = 'icons/obj/power_vr.dmi' + icon_state = "lightswitch-s1" + base_icon = "lightswitch-s" + build_machine_type = /obj/machinery/light_switch + x_offset = 26 + y_offset = 26 + +// Attackby on the lightswitch for deconstruction steps. +/obj/machinery/light_switch/attackby(obj/item/W, mob/user, params) + src.add_fingerprint(user) + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + return ..() + +/obj/machinery/light_switch/dismantle() + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + var/obj/structure/construction/lightswitch/A = new(src.loc, src.dir) + A.stage = FRAME_WIRED + A.pixel_x = pixel_x + A.pixel_y = pixel_y + A.update_icon() + qdel(src) + return 1 + +// +// Simple Construction Frame - Simpler than the full frame system for circuitless construction. +// If this works out well for light switches we can use it for other lightweight constructables. +// + +/obj/structure/construction + name = "simple frame prototype" + desc = "This is a prototype object and you should not see it, report to a developer" + anchored = TRUE + var/base_icon = "something" + var/stage = FRAME_UNFASTENED + var/build_machine_type = null + var/x_offset = 26 + var/y_offset = 26 + +/obj/structure/construction/initialize(var/mapload, var/ndir, var/building = FALSE) + . = ..() + if(ndir) + set_dir(ndir) + if(x_offset) + pixel_x = (dir & 3) ? 0 : (dir == EAST ? -x_offset : x_offset) + if(y_offset) + pixel_y = (dir & 3) ? (dir == NORTH ? -y_offset : y_offset) : 0 + +/obj/structure/construction/examine(mob/user) + if(!..(user, 2)) + return + switch(stage) + if(FRAME_UNFASTENED) + to_chat(user, "It's an empty frame.") + if(FRAME_FASTENED) + to_chat(user, "It's fixed to the wall.") + if(FRAME_WIRED) + to_chat(user, "It's wired.") + +/obj/structure/construction/update_icon() + icon_state = "[base_icon][stage]" + +/obj/structure/construction/attackby(obj/item/weapon/W as obj, mob/user as mob) + add_fingerprint(user) + if(iswelder(W)) + if(stage == FRAME_UNFASTENED) + var/obj/item/weapon/weldingtool/WT = W + if(!WT.remove_fuel(0, user)) + to_chat(user, "\The [src] must be on to complete this task.") + return + playsound(src.loc, WT.usesound, 50, 1) + user.visible_message( \ + "\The [user] begins deconstructing \the [src].", \ + "You start deconstructing \the [src].") + if(do_after(user, 20 * WT.toolspeed, target = src) && WT.isOn()) + new /obj/item/stack/material/steel(get_turf(src), 2) + user.visible_message( \ + "\The [user] has deconstructed \the [src].", \ + "You deconstruct \the [src].") + playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1) + qdel(src) + else if (stage == FRAME_FASTENED) + to_chat(user, "You have to unscrew the case first.") + else if (stage == FRAME_WIRED) + to_chat(user, "You have to remove the wires first.") + return + + else if(iswirecutter(W)) + if (stage == FRAME_WIRED) + stage = FRAME_FASTENED + user.update_examine_panel(src) + new /obj/item/stack/cable_coil(get_turf(src), 1, "red") + user.visible_message("\The [user] removes the wiring from \the [src].", \ + "You remove the wiring from \the [src].", "You hear a snip.") + playsound(src.loc, W.usesound, 50, 1) + update_icon() + return + + else if(iscoil(W)) + if (stage == FRAME_FASTENED) + var/obj/item/stack/cable_coil/coil = W + if (coil.use(1)) + stage = FRAME_WIRED + user.update_examine_panel(src) + user.visible_message("\The [user] adds wires to \the [src].", \ + "You add wires to \the [src].", "You hear a noise.") + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + update_icon() + return + + else if(isscrewdriver(W)) + if (stage == FRAME_UNFASTENED) + stage = FRAME_FASTENED + user.update_examine_panel(src) + user.visible_message("\The [user] screws \the [src] i nplace.", \ + "You screw \the [src] in place.", "You hear a noise.") + playsound(src, W.usesound, 75, 1) + update_icon() + else if (stage == FRAME_FASTENED) + stage = FRAME_UNFASTENED + user.update_examine_panel(src) + user.visible_message("\The [user] unscrews \the [src].", \ + "You unscrew \the [src].", "You hear a noise.") + playsound(src, W.usesound, 75, 1) + update_icon() + else if (stage == FRAME_WIRED) + user.visible_message("\The [user] closes \the [src]'s casing.", \ + "You close \the [src]'s casing.", "You hear a click.") + playsound(src, W.usesound, 75, 1) + var/obj/newmachine = new build_machine_type(get_turf(src), src.dir) + newmachine.pixel_x = pixel_x + newmachine.pixel_y = pixel_y + transfer_fingerprints_to(newmachine) + qdel(src) + return + . = ..() + +/obj/structure/construction/get_description_interaction() + . = list() + switch(stage) + if(FRAME_UNFASTENED) + . += list( + "[desc_panel_image("screwdriver")]to continue construction.", + "[desc_panel_image("welder")]to deconstruct.") + if(FRAME_FASTENED) + . += list( + "[desc_panel_image("cable coil")]to continue construction.", + "[desc_panel_image("screwdriver")]to reverse construction.") + if(FRAME_WIRED) + . += list( + "[desc_panel_image("screwdriver")]to finish construction.", + "[desc_panel_image("wirecutters")]to reverse construction.") diff --git a/icons/obj/power_vr.dmi b/icons/obj/power_vr.dmi index 48869a2a5e16fcb55dff51c6ed985a7f830c3c9c..1971b2d531d889f2261e5d93c3d267ae6a512fcd 100644 GIT binary patch delta 2424 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 V70g1u>&p)Yb;QN~*?+tf{tFe2vV#Bs delta 2120 zcmYjQdpOj27yr(TOD;7batp0YsCBE5WJb9pVZw%l*(Dlszm?lhluNVT359YQyS=$Y zDAbPYY(y_vL?na3W-z(Wr5Vic)w6%J=bv*vpL5Q0&Uwx`^KwlxTA6r9+uf4Nk^q3+ zcIT{|0YL1S2(Syaqk^j4U3U~WTZ;t2Ff4DFt$uFA_{vPYEShon@Yex?Q~2Clg2va? zdyEW&AVmd*(?OLOO--jtGcz+67Z-g!y-RMFw6(Q8&!K&NeUp-sT3cI*L}IYBWJN`V zjg8HiolX3C^mHLcCt;84?4jL>Hx4p8_m5L)G}~7#a~XJzhaN-To{*9 z&TY*5YC;EmVPsoTj$Uv1(ng3+h*dyN|DTSBn03riU7aq&%+70yvu$q6!DfGy>psW|rbVQiR$-ooVceLc|rSQ<cPAReDb2R6Ni#)m?_z5X zka1WEf!%;pN|MpatD~2~NU2>>yBJ1a}q8%0Y+Qt_XR_oWe~sfh4^ z^jj|1ULNm#vXDnA^t3%I+4pGq{Spj6vNIkKsg9IB<6f|$wJ^lwAN4S^$hoy*dI!0) zfNv7klJOQ=-#T){rXPN-qi|qG#E}@?_&0t@t7nfQ6#~)1Mh@phDpTK7rLa(?Q=-V3 zdO?&nrY$jyx~DsVJwPaTtsH0~I3x;BRLU(`i+|8fM4Ev&eSy@Lr)so7>XnJ3j#Jnw zlAP;^o9lW{oV7H04=@2{I6fM@vTDc&`7?A#cF-G1$JmDEG!^2XI{d}pZ$O3LZuDPr z&VHmTGu$0&YiPXs!lD$fEjzNH%ILH0{<+VtOI54Sj@VYFSl-k+cd)*$y!gjx@KUv_ zM9;PAe$Pd^Utun{MHIm(MIBECVLBzRDWe`pRl4k;4^qeYWUdf0CrvvT@m`($S3OWC z5_`W|{CFrmA8Y>kv#c27r2T%-Kc&VPO=zFXI;jNoe?~yj58#*}q;%#0X?6)once5ZD?bBR4!Wbg{B7eXq<9|J4ST zd&MDKHlkLmQ-s6zu*A02T*sjHN+a(TA({t8VjjrRgTv!U?*s1GfP&KmlgqD%MNYO_ zFBs}L7y0&R5xTu-bWHa&zr(~b$zki5S~8#T#khMqD`(L3MF%Iy&|z&oe>tmk7p{XW z(OLEUHbQYO$*UzVO!WJ#$&ga205z;$#}O|p&Zmf7sD#Z4y2Y_2zizI?hyKDX8|Fco zW0dpER@+(O=42u2&*^M4AfA4|4cg)^{jWLK_bND7T#GeWZtq5zY8Wx*S2G59Q`Qxz zy}hpBtswQSMTnuW$uxP;^L(p1h!#^lpmui`UMVc%jHt$YvePhxC}p8%Bn)<9aGF42 z3DJ%bAuOyQ`CWN})OWaT#3C9GB@4b^L~=lw@aAOn2)4iZF9GxBs0Y(;jWZ>7=+xOF zsO_s@!Q)-!K)=2$3dd*W&j02ge{6^Ho9qDYYv;nuqTjr#xv@$pbQ_f!Zotf10XNO?&bDY>NP+j z6wCK+j&=nNm%K0FsOSxC2hH-mo5_c4T=*Z*i^`3 z`PoGDa(dJ!4j}==uu7UIsz+IUaV~3YQznHZ*Dy}`owDgzKJK6hYP&1glg$3p{2;6R zxrL6pq|#$$|f`NP>;|Zf?Ln|^}?ISZwblklB|W+ z?run*OeQZLseWwBL3K#a$K)VaJF!mhlF5m#ZaBAmH-nO7gqH}z@;VZIaT|9^2lcU; zmS~~|xkZacMb|4aLQUQrC{>yeHM5Hcvy@&5wv3EWaDte!z|ojCj+tUT4uq{JEv+$$ zvIBIP2_tqN~bCz^EfBHurTWWm+H=?=oSf0-( zDJEGQVGFT3Hozg5daCfmTi{3Itw`k`LrHILjCAl>)bx$fNHnvyKW_t)x(sjVUxqi; zFT>mwzgeACVdC=i)@DNXy<0^PCEgUa;D!A|(RVWW-5eBuzv&G~h+X^r4{ZaJoA%)< zgX%v|Z}UTEti$!ZNf|_FGD%^MAMe88$9D+LzyCS_?)GBx%7jV-Z%wQ5{C^zE0MH^f Yu$@a~o?kBiu=0(xvv#zqIYUVKKN>s Date: Thu, 15 Feb 2018 00:46:57 -0600 Subject: [PATCH 08/20] Ringfix --- code/modules/vore/fluffstuff/custom_clothes_vr.dm | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 5db631d013..bf3e1eba73 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -1697,19 +1697,6 @@ Departamental Swimsuits, for general use icon_state = "vietsi_ring" var/nameset = 0 -/obj/item/clothing/gloves/ring/seal/fluff/vietsi/attack_self(mob/user) - if(nameset) - to_chat(user, "The [src] has already been claimed!") - return - - to_chat(user, "You claim the [src] as your own!") - change_name(user) - nameset = 1 - -/obj/item/clothing/gloves/ring/seal/fluff/vietsi/proc/change_name(var/signet_name = "Unknown") - name = "[signet_name]'s Bone Signet Ring" - desc = "A signet ring belonging to [signet_name], carved from the bones of something long extinct, as a ward against bad luck." - //KotetsuRedwood:Latex Maid Dresses, for everyone to 'enjoy'. :3c /obj/item/clothing/under/fluff/latexmaid name = "latex maid dress" @@ -1723,4 +1710,4 @@ Departamental Swimsuits, for general use sprite_sheets = list( "Teshari" = 'icons/vore/custom_clothes_tesh_vr.dmi' ) - body_parts_covered = UPPER_TORSO|LOWER_TORSO \ No newline at end of file + body_parts_covered = UPPER_TORSO|LOWER_TORSO From 90446ec50233f16bad148edb47af0056ea58b4cd Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 15 Feb 2018 02:37:15 -0600 Subject: [PATCH 09/20] Fixes #3028 --- .../human/species/station/station_special_abilities_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index a56946030d..f684a04a43 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -845,6 +845,6 @@ /mob/living/proc/toggle_pass_table() set name = "Toggle Agility" //Dunno a better name for this. You have to be pretty agile to hop over stuff!!! set desc = "Allows you to start/stop hopping over things such as hydroponics trays, tables, and railings." - set category = "IC" + set category = "Abilities" pass_flags ^= PASSTABLE //I dunno what this fancy ^= is but Aronai gave it to me. to_chat(src, "You [pass_flags&PASSTABLE ? "will" : "will NOT"] move over tables/railings/trays!") From 6c9526cec644bd1fd0ccd3f2852e7e6aac0bf233 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 15 Feb 2018 02:42:00 -0600 Subject: [PATCH 10/20] Fixes #3022 --- code/modules/vore/eating/silicon_vr.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/vore/eating/silicon_vr.dm b/code/modules/vore/eating/silicon_vr.dm index a19cdaf05b..ef8b089777 100644 --- a/code/modules/vore/eating/silicon_vr.dm +++ b/code/modules/vore/eating/silicon_vr.dm @@ -14,6 +14,8 @@ /obj/effect/overlay/aiholo/Destroy() drop_prey() + for(var/mob/M in contents) + M.forceMove(loc) walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. return ..() @@ -99,7 +101,7 @@ . = ..(user) var/msg = "\n" - + //If you need an ooc_notes copy paste, this is NOT the one to use. var/ooc_notes = master.ooc_notes if(ooc_notes) From 2dffd17c39b541bb82fbb266348200cede56eaa1 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 15 Feb 2018 02:46:11 -0600 Subject: [PATCH 11/20] Fix #3010 --- code/modules/vore/fluffstuff/guns/nsfw.dm | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/code/modules/vore/fluffstuff/guns/nsfw.dm b/code/modules/vore/fluffstuff/guns/nsfw.dm index cbe0653117..9ed2b96600 100644 --- a/code/modules/vore/fluffstuff/guns/nsfw.dm +++ b/code/modules/vore/fluffstuff/guns/nsfw.dm @@ -218,7 +218,7 @@ // The Casing // /obj/item/ammo_casing/nsfw_batt - name = "\'NSFW\' microbattery - LETHAL" + name = "\'NSFW\' microbattery - UNKNOWN" desc = "A miniature battery for an energy weapon." icon = 'icons/obj/ammo_vr.dmi' icon_state = "nsfw_batt" @@ -230,8 +230,8 @@ leaves_residue = 0 caliber = "nsfw" var/shots_left = 4 - var/type_color = "#bf3d3d" - var/type_name = "LETHAL" + var/type_color = null + var/type_name = null projectile_type = /obj/item/projectile/beam /obj/item/ammo_casing/nsfw_batt/New() @@ -253,6 +253,12 @@ shots_left-- // Specific batteries // +/obj/item/ammo_casing/nsfw_batt/lethal + name = "\'NSFW\' microbattery - LETHAL" + type_color = "#bf3d3d" + type_name = "LETHAL" + projectile_type = /obj/item/projectile/beam + /obj/item/ammo_casing/nsfw_batt/stun name = "\'NSFW\' microbattery - STUN" type_color = "#0f81bc" @@ -377,7 +383,7 @@ ..() new /obj/item/weapon/gun/projectile/nsfw(src) new /obj/item/ammo_magazine/nsfw_mag(src) - for(var/path in typesof(/obj/item/ammo_casing/nsfw_batt)) + for(var/path in subtypesof(/obj/item/ammo_casing/nsfw_batt)) new path(src) /obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos @@ -389,8 +395,8 @@ ..() new /obj/item/weapon/gun/projectile/nsfw(src) new /obj/item/ammo_magazine/nsfw_mag(src) - new /obj/item/ammo_casing/nsfw_batt(src) - new /obj/item/ammo_casing/nsfw_batt(src) + new /obj/item/ammo_casing/nsfw_batt/lethal(src) + new /obj/item/ammo_casing/nsfw_batt/lethal(src) new /obj/item/ammo_casing/nsfw_batt/stun(src) new /obj/item/ammo_casing/nsfw_batt/stun(src) new /obj/item/ammo_casing/nsfw_batt/net(src) From 304edbce6950e3732e6055d190f5f9856e9bedd4 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 15 Feb 2018 02:50:59 -0600 Subject: [PATCH 12/20] Fixes #3005 --- code/game/machinery/doors/airlock.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a697f181eb..0988ceb879 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -446,6 +446,8 @@ desc = "It's an extra resilient airlock intended for spacefaring vessels." icon = 'icons/obj/doors/shuttledoors.dmi' explosion_resistance = 20 + opacity = 0 //VOREStation Edit - They have windows. + glass = 1 //VOREStation Edit - They have windows. assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft // Airlock opens from top-bottom instead of left-right. From f33a7b64c6005a7d8209dfee06728d3bff0f9a50 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 15 Feb 2018 03:03:01 -0600 Subject: [PATCH 13/20] Fixes #2979 --- maps/tether/tether-05-station1.dmm | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index b2d5bf42d3..30bf490039 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -5088,6 +5088,7 @@ id = "expshuttle_door_cargo"; name = "hatch bolt control"; pixel_x = -32; + req_one_access = list(19,43,67); specialfunctions = 4 }, /obj/machinery/door/airlock/multi_tile/metal{ @@ -21629,6 +21630,18 @@ }, /turf/simulated/shuttle/wall/voidcraft, /area/shuttle/excursion/tether) +"PYd" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 10 + }, +/turf/simulated/shuttle/wall/voidcraft, +/area/shuttle/excursion/tether) +"Qua" = ( +/obj/machinery/atmospherics/pipe/simple/visible/cyan{ + dir = 9 + }, +/turf/simulated/shuttle/wall/voidcraft, +/area/shuttle/excursion/tether) "RIb" = ( /obj/effect/floor_decal/steeldecal/steel_decals9, /obj/effect/floor_decal/steeldecal/steel_decals9{ @@ -21643,18 +21656,6 @@ /obj/structure/closet/secure_closet/guncabinet/excursion, /turf/simulated/floor/tiled/monotile, /area/tether/station/explorer_prep) -"PYd" = ( -/obj/machinery/atmospherics/pipe/simple/visible/cyan{ - dir = 10 - }, -/turf/simulated/shuttle/wall/voidcraft, -/area/shuttle/excursion/tether) -"Qua" = ( -/obj/machinery/atmospherics/pipe/simple/visible/cyan{ - dir = 9 - }, -/turf/simulated/shuttle/wall/voidcraft, -/area/shuttle/excursion/tether) "TpR" = ( /obj/structure/grille, /obj/structure/window/reinforced/full, From 76d105d3467eff444b24a33f7600f4e84a34180a Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 15 Feb 2018 03:28:56 -0600 Subject: [PATCH 14/20] Fixes #3039 --- maps/tether/tether-07-station3.dmm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm index 2c37976b56..8177dfffe6 100644 --- a/maps/tether/tether-07-station3.dmm +++ b/maps/tether/tether-07-station3.dmm @@ -6885,7 +6885,7 @@ dir = 1; id = "packageSort1" }, -/obj/structure/plasticflaps/mining, +/obj/structure/plasticflaps, /turf/simulated/floor, /area/quartermaster/delivery) "lR" = ( @@ -9328,7 +9328,7 @@ dir = 1; id = "packageSort1" }, -/obj/structure/plasticflaps/mining, +/obj/structure/plasticflaps, /turf/simulated/floor/plating, /area/quartermaster/delivery) "pG" = ( From cf7754a55ad7c270feee491f38d96af411ae98a3 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 15 Feb 2018 03:42:49 -0600 Subject: [PATCH 15/20] Fixes #2810 --- code/modules/nifsoft/software/05_health.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/nifsoft/software/05_health.dm b/code/modules/nifsoft/software/05_health.dm index de7ef184cb..2337d58029 100644 --- a/code/modules/nifsoft/software/05_health.dm +++ b/code/modules/nifsoft/software/05_health.dm @@ -203,8 +203,8 @@ proc/resp_breath() if(!active) return null - var/datum/gas_mixture/breath = new() - breath.adjust_gas("oxygen", 300) + var/datum/gas_mixture/breath = new(BREATH_VOLUME) + breath.adjust_gas("oxygen", BREATH_MOLES) breath.temperature = T20C return breath From b0a627463b1cfaf838aec66a5e7b462464ce3760 Mon Sep 17 00:00:00 2001 From: Heroman3003 Date: Fri, 16 Feb 2018 07:13:22 +1000 Subject: [PATCH 16/20] fix for crushing and taur stepping expanded More descriptions for different intents of stepping for different taurs + fixed harm trampling not dealing any damage --- code/modules/vore/resizing/resize_vr.dm | 116 ++++++++++++++++-------- 1 file changed, 79 insertions(+), 37 deletions(-) diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index d7f312ce09..795f549c03 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -146,7 +146,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 var/mob/living/carbon/human/H = src if(H.flying) return 1 //Silently pass without a message. - if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga)) + if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) src << "You carefully slither around [tmob]." tmob << "[src]'s huge tail slithers past beside you!" else @@ -154,9 +154,12 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 tmob << "[src] steps over you carefully!" if(tmob.get_effective_size() > src.get_effective_size()) var/mob/living/carbon/human/H = tmob - if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga)) + if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) src << "You jump over [tmob]'s thick tail." tmob << "[src] bounds over your tail." + else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) + src << "You run between [tmob]'s tentacles." + tmob << "[src] runs between your tentacles." else src << "You run between [tmob]'s legs." tmob << "[src] runs between your legs." @@ -188,9 +191,18 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 if(src.m_intent == "run") //Running down the hallway with disarm intent? tmob.resting = 1 //Force them down to the ground. var/mob/living/carbon/human/H = src - if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga)) + if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) src << "Your tail slides over [tmob], pushing them down to the ground!" tmob << "[src]'s tail slides over you, forcing you down to the ground!" + else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/spider) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/centipede) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/alraune))) + src << "You quickly push [tmob] to the ground with your leg!" + tmob << "[src] pushes you down to the ground with their leg!" + else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/cow))) + src << "You quickly push [tmob] to the ground with your hoof!" + tmob << "[src] pushes you down to the ground with their hoof!" + else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse)) + src << "You quickly push [tmob] to the ground with some of your tentacles!" + tmob << "[src] pushes you down to the ground with some of their tentacles!" else src << "You quickly push [tmob] to the ground with your foot!" tmob << "[src] pushes you down to the ground with their foot!" @@ -203,12 +215,21 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 tmob.resting = 1 var/mob/living/carbon/human/H = src admin_attack_log(src, tmob, "Pinned [tmob.name] under foot for [damage] HALLOSS.", "Was pinned under foot by [src.name] for [damage] HALLOSS.", "Pinned [tmob.name] under foot for [damage] HALLOSS.") - if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga)) + if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) src << "You push down on [tmob] with your tail, pinning them down under you!" tmob << "[src] pushes down on you with their tail, pinning you down below them!" + else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/spider) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/centipede) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/alraune))) + src << "You firmly push your leg down on [tmob], painfully but harmlessly pinning them to the ground!" + tmob << "[src] firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" + else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/cow))) + src << "You firmly push your hoof down on [tmob], painfully but harmlessly pinning them to the ground!" + tmob << "[src] firmly pushes their hoof down on you, quite painfully but harmlessly pinning you to the ground!" + else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) + src << "You push down on [tmob] with some of your tentacles, pinning them down firmly under you!" + tmob << "[src] pushes down on you with some of their tentacles, pinning you down firmly below them!" else src << "You firmly push your foot down on [tmob], painfully but harmlessly pinning them to the ground!" - tmob << "[src] firmly pushes their foot down on you, quite painfully but harmlessly pinning you do to the ground!" + tmob << "[src] firmly pushes their foot down on you, quite painfully but harmlessly pinning you to the ground!" if(src.a_intent == I_HURT && src.canmove && !src.buckled) @@ -221,47 +242,47 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 if(src.m_intent == "run") var/mob/living/carbon/human/H = src - if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga)) - src << "Your heavy tail carelessly slides past [tmob], crushing them!" + if(istype(tmob,/mob/living/carbon/human)) + var/mob/living/carbon/human/M = tmob + for(var/obj/item/organ/external/I in M.organs) + I.take_damage(calculated_damage, 0) // 5 damage min, 26.25 damage max, depending on size & RNG. If they're only stepped on once, the damage will heal over time. + M.drip(0.1) + admin_attack_log(src, M, "crushed [tmob.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.") + if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) + src << "Your heavy tail carelessly slides past [tmob], crushing them!" tmob << "[src] quickly goes over your body, carelessly crushing you with their heavy tail!" - if(istype(tmob,/mob/living/carbon/human)) - var/mob/living/carbon/human/M = tmob - M.drip(0.1) - for(var/obj/item/organ/I in M.organs) - tmob.take_overall_damage(calculated_damage, 0) //Due to the fact that this deals damage across random body parts, this should heal quite fast. - admin_attack_log(src, M, "trampled [tmob.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.") + else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) + src << "Your tentacles carelessly slide past [tmob], crushing them!" + tmob << "[src] quickly goes over your body, carelessly crushing you with their tentacles!" else - src << "You carelessly step down onto [tmob], crushing them!!" + src << "You carelessly step down onto [tmob], crushing them!" tmob << "[src] steps carelessly on your body, crushing you!" - if(istype(tmob,/mob/living/carbon/human)) - var/mob/living/carbon/human/M = tmob - for(var/obj/item/organ/I in M.organs) - tmob.take_overall_damage(calculated_damage, 0) // 5 damage min, 26.25 damage max, depending on size & RNG. If they're only stepped on once, the damage will heal over time. - M.drip(0.1) - admin_attack_log(src, M, "Crushed [tmob.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.") return 1 if(src.m_intent == "walk") //Oh my. damage = calculated_damage * 3.5 //Multiplies the above damage by 3.5. This means a min of 1.75 damage, or a max of 9.1875. damage to each limb, depending on size and RNG. var/mob/living/carbon/human/H = src - if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga)) + if(istype(tmob,/mob/living/carbon/human)) + var/mob/living/carbon/human/M = tmob + for(var/obj/item/organ/I in M.organs) + I.take_damage(calculated_damage, 0) + M.drip(3) + admin_attack_log(src, M, "Crushed [M.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.") + if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) src << "Your heavy tail slowly and methodically slides down upon [tmob], crushing against the floor below!" - tmob << "[src]'s thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below." - if(istype(tmob,/mob/living/carbon/human)) - var/mob/living/carbon/human/M = tmob - for(var/obj/item/organ/I in M.organs) - tmob.take_overall_damage(damage, 0) //17.5 damage min, 91.875 damage max. If they're only stepped on once, the damage will heal over time. - M.drip(3) //The least of your problems, honestly. - admin_attack_log(src, M, "Crushed [M.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.") + tmob << "[src]'s thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!" + else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/spider) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/centipede) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/alraune))) + src << "You methodically place your leg down upon [tmob]'s body, slowly applying pressure, crushing them against the floor below!" + tmob << "[src] methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" + else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/cow))) + src << "You methodically place your hoof down upon [tmob]'s body, slowly applying pressure, crushing them against the floor below!" + tmob << "[src] methodically places their hoof upon your body, slowly applying pressure, crushing you against the floor below!" + else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) + src << "Your tentacles methodically apply pressure on [tmob]'s body, crushing them against the floor below!" + tmob << "[src]'s thick tentacles methodically apply pressure on your body, crushing you into the floor below!" else src << "You methodically place your foot down upon [tmob]'s body, slowly applying pressure, crushing them against the floor below!" tmob << "[src] methodically places their foot upon your body, slowly applying pressure, crushing you against the floor below!" - if(istype(tmob,/mob/living/carbon/human)) - var/mob/living/carbon/human/M = tmob - for(var/obj/item/organ/I in M.organs) - tmob.take_overall_damage(damage, 0) - M.drip(3) - admin_attack_log(src, M, "Crushed [M.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.") return 1 if(src.a_intent == I_GRAB && src.canmove && !src.buckled) @@ -273,15 +294,36 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 if(istype(H) && !H.shoes) // User is a human (capable of scooping) and not wearing shoes! Scoop into foot slot! equip_to_slot_if_possible(tmob.get_scooped(H), slot_shoes, 0, 1) - if(istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga)) + if(istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug)) src << "You slither over [tmob] with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!" tmob << "[src] slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!" + else if(istype(H.tail_style, /datum/sprite_accessory/tail/taur/spider) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/centipede) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/alraune)) + src << "You pin [tmob] down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" + tmob << "[src] pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" + else if(istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/cow)) //this is placeholder till someone gets better idea + src << "You pin [tmob] to the ground before scooping them up with your hooves!" + tmob << "[src] pins you to the ground before scooping you up with their hooves!" + else if istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents) + src << "You slide over [tmob] with your tentacles, smushing them against the ground before wrapping one up around them, trapping them within the tight confines of your tentacles!" + tmob << "[src] slides over you with their tentacles, smushing you against the ground before wrapping one up around you, trapping you within the tight confines of their tentacles!" else src << "You pin [tmob] down onto the floor with your foot and curl your toes up around their body, trapping them inbetween them!" tmob << "[src] pins you down to the floor with their foot and curls their toes up around your body, trapping you inbetween them!" - else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga)) + else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) src << "You squish [tmob] under your large, thick tail, forcing them onto the ground!" - tmob << "[src] pins you under their large, thick tail, forcing you onto the ground!!" + tmob << "[src] pins you under their large, thick tail, forcing you onto the ground!" + tmob.resting = 1 + else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/spider) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/centipede) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/alraune))) + src << "You step down onto [tmob], squishing them and forcing them down to the ground!" + tmob << "[src] steps down and squishes you with their leg, forcing you down to the ground!" + tmob.resting = 1 + else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/cow))) + src << "You step down onto [tmob], squishing them and forcing them down to the ground!" + tmob << "[src] steps down and squishes you with their hoof, forcing you down to the ground!" + tmob.resting = 1 + else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) + src << "You step down onto [tmob] with one of your tentacles, forcing them onto the ground!" + tmob << "[src] steps down onto you with one of your tentacles, squishing you and forcing you onto the ground!" tmob.resting = 1 else src << "You step down onto [tmob], squishing them and forcing them down to the ground!" From 7b6ac1391f5a8eea0bfbfa7e6f3c2dc610f88baa Mon Sep 17 00:00:00 2001 From: Heroman3003 Date: Fri, 16 Feb 2018 07:24:05 +1000 Subject: [PATCH 17/20] fix for condition dumb error --- code/modules/vore/resizing/resize_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 795f549c03..54fc47392e 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -303,7 +303,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 else if(istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/cow)) //this is placeholder till someone gets better idea src << "You pin [tmob] to the ground before scooping them up with your hooves!" tmob << "[src] pins you to the ground before scooping you up with their hooves!" - else if istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents) + else if (istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) src << "You slide over [tmob] with your tentacles, smushing them against the ground before wrapping one up around them, trapping them within the tight confines of your tentacles!" tmob << "[src] slides over you with their tentacles, smushing you against the ground before wrapping one up around you, trapping you within the tight confines of their tentacles!" else From 61dc4f53fcb410ba265e10bd0c4cc85ba725f5d6 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 15 Feb 2018 21:43:48 -0600 Subject: [PATCH 18/20] Refactor step code, and taur messages --- .../vore/appearance/sprite_accessories_vr.dm | 227 +++++++++-- code/modules/vore/resizing/resize_vr.dm | 363 ++++++++++-------- 2 files changed, 404 insertions(+), 186 deletions(-) diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 30dfcf7d63..2ab40c46d7 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -1056,6 +1056,33 @@ do_colouration = 1 // Yes color, using tail color color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY + //Could do nested lists but it started becoming a nightmare. It'd be more fun for lookups of a_intent and m_intent, but then subtypes need to + //duplicate all the messages, and it starts getting awkward. These are singletons, anyway! + + //Messages to owner when stepping on/over + var/msg_owner_help_walk = "You carefully step over %prey." + var/msg_owner_help_run = "You carefully step over %prey." + var/msg_owner_harm_walk = "You methodically place your foot down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + var/msg_owner_harm_run = "You carelessly step down onto %prey, crushing them!" + var/msg_owner_disarm_walk = "You firmly push your foot down on %prey, painfully but harmlessly pinning them to the ground!" + var/msg_owner_disarm_run = "You quickly push %prey to the ground with your foot!" + var/msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + var/msg_owner_grab_success = "You pin %prey down onto the floor with your foot and curl your toes up around their body, trapping them inbetween them!" + + //Messages to prey when stepping on/over + var/msg_prey_help_walk = "%owner steps over you carefully!" + var/msg_prey_help_run = "%owner steps over you carefully!" + var/msg_prey_harm_walk = "%owner methodically places their foot upon your body, slowly applying pressure, crushing you against the floor below!" + var/msg_prey_harm_run = "%owner steps carelessly on your body, crushing you!" + var/msg_prey_disarm_walk = "%owner firmly pushes their foot down on you, quite painfully but harmlessly pinning you to the ground!" + var/msg_prey_disarm_run = "%owner pushes you down to the ground with their foot!" + var/msg_prey_grab_fail = "%owner steps down and squishes you with their foot, forcing you down to the ground!" + var/msg_prey_grab_success = "%owner pins you down to the floor with their foot and curls their toes up around your body, trapping you inbetween them!" + + //Messages for smalls moving under larges + var/msg_owner_stepunder = "%owner runs between your legs." //Weird becuase in the case this is used, %owner is the 'bumper' (src) + var/msg_prey_stepunder = "You run between %prey's legs." //Same, inverse + /datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 32x64 so it wouldn't fit in tails.dmi, and having it as a tail bugs up the sprite. name = "Long Lizard Tail (Roiz Lizden)" icon_state = "roiz_tail_s" @@ -1063,118 +1090,268 @@ ckeys_allowed = list("spoopylizz") /datum/sprite_accessory/tail/taur/wolf - name = "Wolf" + name = "Wolf (Taur)" icon_state = "wolf_s" /datum/sprite_accessory/tail/taur/wolf/wolf_2c - name = "Wolf dual-color" + name = "Wolf dual-color (Taur)" icon_state = "wolf_s" extra_overlay = "wolf_markings" /datum/sprite_accessory/tail/taur/wolf/synthwolf - name = "SynthWolf dual-color" + name = "SynthWolf dual-color (Taur)" icon_state = "synthwolf_s" extra_overlay = "synthwolf_markings" /datum/sprite_accessory/tail/taur/naga - name = "Naga" + name = "Naga (Taur)" icon_state = "naga_s" + msg_owner_help_walk = "You carefully slither around %prey." + msg_prey_help_walk = "%owner's huge tail slithers past beside you!" + + msg_owner_help_run = "You carefully slither around %prey." + msg_prey_help_run = "%owner's huge tail slithers past beside you!" + + msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!" + msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!" + + msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!" + msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!" + + msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!" + msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!" + + msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!" + msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!" + + msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!" + msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!" + + msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!" + msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!" + + msg_prey_stepunder = "You jump over %prey's thick tail." + msg_owner_stepunder = "%owner bounds over your tail." + /datum/sprite_accessory/tail/taur/naga/naga_2c - name = "Naga dual-color" + name = "Naga dual-color (Taur)" icon_state = "naga_s" extra_overlay = "naga_markings" /datum/sprite_accessory/tail/taur/horse - name = "Horse" + name = "Horse (Taur)" icon_state = "horse_s" + msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!" + + msg_owner_disarm_walk = "You firmly push your hoof down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their hoof down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your hoof down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their hoof upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey to the ground before scooping them up with your hooves!" + msg_prey_grab_success = "%owner pins you to the ground before scooping you up with their hooves!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their hoof, forcing you down to the ground!" + /datum/sprite_accessory/tail/taur/horse/synthhorse - name = "SynthHorse dual-color" + name = "SynthHorse dual-color (Taur)" icon_state = "synthhorse_s" extra_overlay = "synthhorse_markings" /datum/sprite_accessory/tail/taur/cow - name = "Cow" + name = "Cow (Taur)" icon_state = "cow_s" + msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!" + + msg_owner_disarm_walk = "You firmly push your hoof down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their hoof down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your hoof down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their hoof upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey to the ground before scooping them up with your hooves!" + msg_prey_grab_success = "%owner pins you to the ground before scooping you up with their hooves!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their hoof, forcing you down to the ground!" + /datum/sprite_accessory/tail/taur/lizard - name = "Lizard" + name = "Lizard (Taur)" icon_state = "lizard_s" /datum/sprite_accessory/tail/taur/lizard/lizard_2c - name = "Lizard dual-color" + name = "Lizard dual-color (Taur)" icon_state = "lizard_s" extra_overlay = "lizard_markings" /datum/sprite_accessory/tail/taur/lizard/synthlizard - name = "SynthLizard dual-color" + name = "SynthLizard dual-color (Taur)" icon_state = "synthlizard_s" extra_overlay = "synthlizard_markings" /datum/sprite_accessory/tail/taur/spider - name = "Spider" + name = "Spider (Taur)" icon_state = "spider_s" + msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" + + msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" + msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" + /datum/sprite_accessory/tail/taur/tents - name = "Tentacles" + name = "Tentacles (Taur)" icon_state = "tent_s" + msg_prey_stepunder = "You run between %prey's tentacles." + msg_owner_stepunder = "%owner runs between your tentacles." + + msg_owner_disarm_run = "You quickly push %prey to the ground with some of your tentacles!" + msg_prey_disarm_run = "%owner pushes you down to the ground with some of their tentacles!" + + msg_owner_disarm_walk = "You push down on %prey with some of your tentacles, pinning them down firmly under you!" + msg_prey_disarm_walk = "%owner pushes down on you with some of their tentacles, pinning you down firmly below them!" + + msg_owner_harm_run = "Your tentacles carelessly slide past %prey, crushing them!" + msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their tentacles!" + + msg_owner_harm_walk = "Your tentacles methodically apply pressure on %prey's body, crushing them against the floor below!" + msg_prey_harm_walk = "%owner's thick tentacles methodically apply pressure on your body, crushing you into the floor below!" + + msg_owner_grab_success = "You slide over %prey with your tentacles, smushing them against the ground before wrapping one up around them, trapping them within the tight confines of your tentacles!" + msg_prey_grab_success = "%owner slides over you with their tentacles, smushing you against the ground before wrapping one up around you, trapping you within the tight confines of their tentacles!" + + msg_owner_grab_fail = "You step down onto %prey with one of your tentacles, forcing them onto the ground!" + msg_prey_grab_fail = "%owner steps down onto you with one of their tentacles, squishing you and forcing you onto the ground!" + /datum/sprite_accessory/tail/taur/feline - name = "Feline" + name = "Feline (Taur)" icon_state = "feline_s" /datum/sprite_accessory/tail/taur/feline/feline_2c - name = "Feline dual-color" + name = "Feline dual-color (Taur)" icon_state = "feline_s" extra_overlay = "feline_markings" /datum/sprite_accessory/tail/taur/feline/synthfeline - name = "SynthFeline dual-color" + name = "SynthFeline dual-color (Taur)" icon_state = "synthfeline_s" extra_overlay = "synthfeline_markings" /datum/sprite_accessory/tail/taur/slug - name = "Slug" + name = "Slug (Taur)" icon_state = "slug_s" + msg_owner_help_walk = "You carefully slither around %prey." + msg_prey_help_walk = "%owner's huge tail slithers past beside you!" + + msg_owner_help_run = "You carefully slither around %prey." + msg_prey_help_run = "%owner's huge tail slithers past beside you!" + + msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!" + msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!" + + msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!" + msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!" + + msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!" + msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!" + + msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!" + msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!" + + msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!" + msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!" + + msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!" + msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!" + + msg_prey_stepunder = "You jump over %prey's thick tail." + msg_owner_stepunder = "%owner bounds over your tail." + /datum/sprite_accessory/tail/taur/frog - name = "Frog" + name = "Frog (Taur)" icon_state = "frog_s" /datum/sprite_accessory/tail/taur/drake //Enabling on request, no suit compatibility but then again see 2 above. - name = "Drake" + name = "Drake (Taur)" icon_state = "drake_s" extra_overlay = "drake_markings" -/datum/sprite_accessory/tail/taur/otie //Eh whatever. - name = "Otie" +/datum/sprite_accessory/tail/taur/otie + name = "Otie (Taur)" icon_state = "otie_s" extra_overlay = "otie_markings" //wickedtemp: Chakat Tempest /datum/sprite_accessory/tail/taur/feline/tempest - name = "Feline (wickedtemp)" + name = "Feline (wickedtemp) (Taur)" icon_state = "tempest_s" ckeys_allowed = list("wickedtemp") //silencedmp5a5: Serdykov Antoz /datum/sprite_accessory/tail/taur/wolf/serdy - name = "CyberSerdy (silencedmp5a5)" + name = "CyberSerdy (silencedmp5a5) (Taur)" icon_state = "serdy_s" ckeys_allowed = list("silencedmp5a5") //liquidfirefly: Ariana Scol /datum/sprite_accessory/tail/taur/centipede - name = "Centipede (liquidfirefly)" + name = "Centipede (liquidfirefly) (Taur)" icon_state = "ariana_s" ckeys_allowed = list("liquidfirefly") do_colouration = 0 + msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" + + msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" + msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" + //liquidfirefly: Ariana Scol /datum/sprite_accessory/tail/taur/alraune - name = "Alraune (natje)" + name = "Alraune (natje) (Taur)" icon_state = "alraune_s" ani_state = "alraune_closed_s" ckeys_allowed = list("natje") do_colouration = 0 + + msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" + + msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" + msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 54fc47392e..29e7d86fe1 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -129,6 +129,8 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 else return 0; // Unable to scoop, let other code run +#define STEP_TEXT_OWNER(x) "[replacetext(x,"%prey",tmob)]" +#define STEP_TEXT_PREY(x) "[replacetext(x,"%owner",src)]" /** * Handle bumping into someone with helping intent. * Called from /mob/living/Bump() in the 'brohugs all around' section. @@ -136,197 +138,236 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 * // TODO - can the now_pushing = 0 be moved up? What does it do anyway? */ /mob/living/proc/handle_micro_bump_helping(var/mob/living/tmob) + + //Both small! Go ahead and go. if(src.get_effective_size() <= RESIZE_A_SMALLTINY && tmob.get_effective_size() <= RESIZE_A_SMALLTINY) - // Both small! Go ahead and now_pushing = 0 return 1 - if(abs(src.get_effective_size() - tmob.get_effective_size()) >= 0.50) + + //Worthy of doing messages at all + if(abs(get_effective_size() - tmob.get_effective_size()) >= 0.50) now_pushing = 0 - if(src.get_effective_size() > tmob.get_effective_size()) + + //Smaller person being stepped onto + if(get_effective_size() > tmob.get_effective_size() && ishuman(src)) var/mob/living/carbon/human/H = src if(H.flying) return 1 //Silently pass without a message. - if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) - src << "You carefully slither around [tmob]." - tmob << "[src]'s huge tail slithers past beside you!" + if(isTaurTail(H.tail_style)) + var/datum/sprite_accessory/tail/taur/tail = H.tail_style + to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_help_run)) + to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_help_run)) else - src << "You carefully step over [tmob]." - tmob << "[src] steps over you carefully!" - if(tmob.get_effective_size() > src.get_effective_size()) + to_chat(src,"You carefully step over [tmob].") + to_chat(tmob,"[src] steps over you carefully!") + + //Smaller person stepping under larger person + else if(tmob.get_effective_size() > get_effective_size() && ishuman(tmob)) var/mob/living/carbon/human/H = tmob - if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) - src << "You jump over [tmob]'s thick tail." - tmob << "[src] bounds over your tail." - else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) - src << "You run between [tmob]'s tentacles." - tmob << "[src] runs between your tentacles." + if(isTaurTail(H.tail_style)) + var/datum/sprite_accessory/tail/taur/tail = H.tail_style + to_chat(src,STEP_TEXT_OWNER(tail.msg_prey_stepunder)) + to_chat(tmob,STEP_TEXT_PREY(tail.msg_owner_stepunder)) else - src << "You run between [tmob]'s legs." - tmob << "[src] runs between your legs." - return 1 + to_chat(src,"You run between [tmob]'s legs.") + to_chat(tmob,"[src] runs between your legs.") + return 1 /** * Handle bumping into someone without mutual help intent. * Called from /mob/living/Bump() - * NW was here, adding even more options for stomping! * * @return false if normal code should continue, 1 to prevent normal code. */ /mob/living/proc/handle_micro_bump_other(var/mob/living/tmob) - ASSERT(istype(tmob)) // Baby don't hurt me + ASSERT(istype(tmob)) + + //If they're flying, don't do any special interactions. if(ishuman(src)) var/mob/living/carbon/human/P = src - if(P.flying) //If they're flying, don't do any special interactions. + if(P.flying) return + + //If the prey is flying, don't smush them. if(ishuman(tmob)) var/mob/living/carbon/human/D = tmob - if(D.flying) //if the prey is flying, don't smush them. + if(D.flying) return - if(src.a_intent == I_DISARM && src.canmove && !src.buckled) - // If bigger than them by at least 0.75, move onto them and print message. - if((src.get_effective_size() - tmob.get_effective_size()) >= 0.75) - now_pushing = 0 - src.forceMove(tmob.loc) - if(src.m_intent == "run") //Running down the hallway with disarm intent? - tmob.resting = 1 //Force them down to the ground. - var/mob/living/carbon/human/H = src - if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) - src << "Your tail slides over [tmob], pushing them down to the ground!" - tmob << "[src]'s tail slides over you, forcing you down to the ground!" - else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/spider) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/centipede) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/alraune))) - src << "You quickly push [tmob] to the ground with your leg!" - tmob << "[src] pushes you down to the ground with their leg!" - else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/cow))) - src << "You quickly push [tmob] to the ground with your hoof!" - tmob << "[src] pushes you down to the ground with their hoof!" - else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse)) - src << "You quickly push [tmob] to the ground with some of your tentacles!" - tmob << "[src] pushes you down to the ground with some of their tentacles!" + //They can't be stepping on anyone + if(!canmove || buckled) + return + + //Test/set if human + var/mob/living/carbon/human/H + if(ishuman(src)) + H = src + + var/mob/living/carbon/human/Ht + if(ishuman(tmob)) + Ht = tmob + + //Depending on intent... + switch(a_intent) + + //src stepped on someone with disarm intent + if(I_DISARM) + // If bigger than them by at least 0.75, move onto them and print message. + if((get_effective_size() - tmob.get_effective_size()) >= 0.75) + now_pushing = 0 + forceMove(tmob.loc) + + //Running on I_DISARM + if(m_intent == "run") + tmob.resting = 1 //Force them down to the ground. + + //Log it for admins (as opposed to walk which logs damage) + admin_attack_log(src, tmob, "Pinned [tmob.name] under foot.", "Was pinned under foot by [src.name].", "Pinned [tmob.name] under foot.") + + //Not a human, or not a taur, generic message only + if(!H || !isTaurTail(H.tail_style)) + to_chat(src,"You quickly push [tmob] to the ground with your foot!") + to_chat(tmob,"[src] pushes you down to the ground with their foot!") + + //Human with taur tail, special messages are sent + else + var/datum/sprite_accessory/tail/taur/tail = H.tail_style + to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_disarm_run)) + to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_disarm_run)) + + //Walking on I_DISARM else - src << "You quickly push [tmob] to the ground with your foot!" - tmob << "[src] pushes you down to the ground with their foot!" - admin_attack_log(src, tmob, "Pinned [tmob.name] under foot.", "Was pinned under foot by [src.name].", "Pinned [tmob.name] under foot.") - return 1 - if(src.m_intent == "walk") //Most likely intentionally stepping on them. - var/size_damage_multiplier = (src.size_multiplier - tmob.size_multiplier) - var/damage = (rand(15,30)* size_damage_multiplier) //Since stunned is broken, let's do this. Rand 15-30 multiplied by 1 min or 1.75 max. 15 holo to 52.5 holo, depending on RNG and size differnece. - tmob.apply_damage(damage, HALLOSS) - tmob.resting = 1 - var/mob/living/carbon/human/H = src - admin_attack_log(src, tmob, "Pinned [tmob.name] under foot for [damage] HALLOSS.", "Was pinned under foot by [src.name] for [damage] HALLOSS.", "Pinned [tmob.name] under foot for [damage] HALLOSS.") - if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) - src << "You push down on [tmob] with your tail, pinning them down under you!" - tmob << "[src] pushes down on you with their tail, pinning you down below them!" - else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/spider) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/centipede) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/alraune))) - src << "You firmly push your leg down on [tmob], painfully but harmlessly pinning them to the ground!" - tmob << "[src] firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" - else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/cow))) - src << "You firmly push your hoof down on [tmob], painfully but harmlessly pinning them to the ground!" - tmob << "[src] firmly pushes their hoof down on you, quite painfully but harmlessly pinning you to the ground!" - else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) - src << "You push down on [tmob] with some of your tentacles, pinning them down firmly under you!" - tmob << "[src] pushes down on you with some of their tentacles, pinning you down firmly below them!" - else - src << "You firmly push your foot down on [tmob], painfully but harmlessly pinning them to the ground!" - tmob << "[src] firmly pushes their foot down on you, quite painfully but harmlessly pinning you to the ground!" + //Perform some HALLOSS damage to the smaller. + var/size_damage_multiplier = (src.size_multiplier - tmob.size_multiplier) + var/damage = (rand(15,30)* size_damage_multiplier) //Since stunned is broken, let's do this. Rand 15-30 multiplied by 1 min or 1.75 max. 15 holo to 52.5 holo, depending on RNG and size differnece. + tmob.apply_damage(damage, HALLOSS) + tmob.resting = 1 + //Log it for admins (as opposed to run which logs no damage) + admin_attack_log(src, tmob, "Pinned [tmob.name] under foot for [damage] HALLOSS.", "Was pinned under foot by [src.name] for [damage] HALLOSS.", "Pinned [tmob.name] under foot for [damage] HALLOSS.") - if(src.a_intent == I_HURT && src.canmove && !src.buckled) - if((src.get_effective_size() - tmob.get_effective_size()) >= 0.75) - now_pushing = 0 - src.forceMove(tmob.loc) - var/size_damage_multiplier = (src.size_multiplier - tmob.size_multiplier) - var/damage = (rand(1,3)* size_damage_multiplier) //Rand 1-3 multiplied by 1 min or 1.75 max. 1 min 5.25 max damage to each limb. - var/calculated_damage = damage/2 //This will sting, but not kill. Does .5 to 2.625 damage, randomly, to each limb. + //Not a human, or not a taur, generic message only + if(!H || !isTaurTail(H.tail_style)) + to_chat(src,"You firmly push your foot down on [tmob], painfully but harmlessly pinning them to the ground!") + to_chat(tmob,"[src] firmly pushes their foot down on you, quite painfully but harmlessly pinning you to the ground!") - if(src.m_intent == "run") - var/mob/living/carbon/human/H = src - if(istype(tmob,/mob/living/carbon/human)) - var/mob/living/carbon/human/M = tmob - for(var/obj/item/organ/external/I in M.organs) - I.take_damage(calculated_damage, 0) // 5 damage min, 26.25 damage max, depending on size & RNG. If they're only stepped on once, the damage will heal over time. - M.drip(0.1) - admin_attack_log(src, M, "crushed [tmob.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.") - if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) - src << "Your heavy tail carelessly slides past [tmob], crushing them!" - tmob << "[src] quickly goes over your body, carelessly crushing you with their heavy tail!" - else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) - src << "Your tentacles carelessly slide past [tmob], crushing them!" - tmob << "[src] quickly goes over your body, carelessly crushing you with their tentacles!" - else - src << "You carelessly step down onto [tmob], crushing them!" - tmob << "[src] steps carelessly on your body, crushing you!" - return 1 + //Human with taur tail, special messages are sent + else + var/datum/sprite_accessory/tail/taur/tail = H.tail_style + to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_disarm_walk)) + to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_disarm_walk)) - if(src.m_intent == "walk") //Oh my. - damage = calculated_damage * 3.5 //Multiplies the above damage by 3.5. This means a min of 1.75 damage, or a max of 9.1875. damage to each limb, depending on size and RNG. - var/mob/living/carbon/human/H = src - if(istype(tmob,/mob/living/carbon/human)) - var/mob/living/carbon/human/M = tmob - for(var/obj/item/organ/I in M.organs) - I.take_damage(calculated_damage, 0) - M.drip(3) - admin_attack_log(src, M, "Crushed [M.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.") - if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) - src << "Your heavy tail slowly and methodically slides down upon [tmob], crushing against the floor below!" - tmob << "[src]'s thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!" - else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/spider) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/centipede) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/alraune))) - src << "You methodically place your leg down upon [tmob]'s body, slowly applying pressure, crushing them against the floor below!" - tmob << "[src] methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" - else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/cow))) - src << "You methodically place your hoof down upon [tmob]'s body, slowly applying pressure, crushing them against the floor below!" - tmob << "[src] methodically places their hoof upon your body, slowly applying pressure, crushing you against the floor below!" - else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) - src << "Your tentacles methodically apply pressure on [tmob]'s body, crushing them against the floor below!" - tmob << "[src]'s thick tentacles methodically apply pressure on your body, crushing you into the floor below!" - else - src << "You methodically place your foot down upon [tmob]'s body, slowly applying pressure, crushing them against the floor below!" - tmob << "[src] methodically places their foot upon your body, slowly applying pressure, crushing you against the floor below!" - return 1 + //Return true, the sizediff was enough that we handled it. + return TRUE - if(src.a_intent == I_GRAB && src.canmove && !src.buckled) - if((src.get_effective_size() - tmob.get_effective_size()) >= 0.50) - now_pushing = 0 - src.forceMove(tmob.loc) - - var/mob/living/carbon/human/H = src - if(istype(H) && !H.shoes) - // User is a human (capable of scooping) and not wearing shoes! Scoop into foot slot! - equip_to_slot_if_possible(tmob.get_scooped(H), slot_shoes, 0, 1) - if(istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug)) - src << "You slither over [tmob] with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!" - tmob << "[src] slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!" - else if(istype(H.tail_style, /datum/sprite_accessory/tail/taur/spider) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/centipede) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/alraune)) - src << "You pin [tmob] down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" - tmob << "[src] pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" - else if(istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/cow)) //this is placeholder till someone gets better idea - src << "You pin [tmob] to the ground before scooping them up with your hooves!" - tmob << "[src] pins you to the ground before scooping you up with their hooves!" - else if (istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) - src << "You slide over [tmob] with your tentacles, smushing them against the ground before wrapping one up around them, trapping them within the tight confines of your tentacles!" - tmob << "[src] slides over you with their tentacles, smushing you against the ground before wrapping one up around you, trapping you within the tight confines of their tentacles!" - else - src << "You pin [tmob] down onto the floor with your foot and curl your toes up around their body, trapping them inbetween them!" - tmob << "[src] pins you down to the floor with their foot and curls their toes up around your body, trapping you inbetween them!" - else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/slug))) - src << "You squish [tmob] under your large, thick tail, forcing them onto the ground!" - tmob << "[src] pins you under their large, thick tail, forcing you onto the ground!" - tmob.resting = 1 - else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/spider) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/centipede) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/alraune))) - src << "You step down onto [tmob], squishing them and forcing them down to the ground!" - tmob << "[src] steps down and squishes you with their leg, forcing you down to the ground!" - tmob.resting = 1 - else if(istype(H) && (istype(H.tail_style, /datum/sprite_accessory/tail/taur/horse) || istype(H.tail_style, /datum/sprite_accessory/tail/taur/cow))) - src << "You step down onto [tmob], squishing them and forcing them down to the ground!" - tmob << "[src] steps down and squishes you with their hoof, forcing you down to the ground!" - tmob.resting = 1 - else if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/tents)) - src << "You step down onto [tmob] with one of your tentacles, forcing them onto the ground!" - tmob << "[src] steps down onto you with one of your tentacles, squishing you and forcing you onto the ground!" - tmob.resting = 1 + //Not enough sizediff for I_DISARM to do anything. else - src << "You step down onto [tmob], squishing them and forcing them down to the ground!" - tmob << "[src] steps down and squishes you with their foot, forcing you down to the ground!" + return FALSE + + //src stepped on someone with harm intent + if(I_HURT) + // If bigger than them by at least 0.75, move onto them and print message. + if((get_effective_size() - tmob.get_effective_size()) >= 0.75) + now_pushing = 0 + forceMove(tmob.loc) + + //Precalculate base damage + var/size_damage_multiplier = (src.size_multiplier - tmob.size_multiplier) + var/damage = (rand(1,3)* size_damage_multiplier) //Rand 1-3 multiplied by 1 min or 1.75 max. 1 min 5.25 max damage to each limb. + var/calculated_damage = damage/2 //This will sting, but not kill. Does .5 to 2.625 damage, randomly, to each limb. + + //Running on I_HURT + if(m_intent == "run") + + //Not a human, or not a taur, generic message only + if(!H || !isTaurTail(H.tail_style)) + to_chat(src,"You carelessly step down onto [tmob], crushing them!") + to_chat(tmob,"[src] steps carelessly on your body, crushing you!") + + //Human with taur tail, special messages are sent + else + var/datum/sprite_accessory/tail/taur/tail = H.tail_style + to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_harm_run)) + to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_harm_run)) + + //If they are a human, do damage (doesn't hurt other mobs...?) + if(Ht) + for(var/obj/item/organ/external/I in Ht.organs) + I.take_damage(calculated_damage, 0) // 5 damage min, 26.25 damage max, depending on size & RNG. If they're only stepped on once, the damage will (probably not...) heal over time. + Ht.drip(0.1) + admin_attack_log(src, Ht, "crushed [Ht] under foot for [calculated_damage * 11] damage.", "Was crushed under foot by [Ht] for [calculated_damage * 11] damage.", "Crushed [Ht] for [damage * 10] damage.") + + //Walking on I_HURT + else + //Multiplies the above damage by 3.5. This means a min of 1.75 damage, or a max of 9.1875. damage to each limb, depending on size and RNG. + calculated_damage *= 3.5 + + //If they are a human, do damage (doesn't hurt other mobs...?) + if(Ht) + for(var/obj/item/organ/I in Ht.organs) + I.take_damage(calculated_damage, 0) + Ht.drip(3) + admin_attack_log(src, Ht, "Crushed [Ht] under foot for [calculated_damage * 11] damage.", "Was crushed under foot by [Ht] for [calculated_damage * 11] damage.", "Crushed [Ht] for [calculated_damage * 11] damage.") + + //Not a human, or not a taur, generic message only + if(!H || !isTaurTail(H.tail_style)) + to_chat(src,"You methodically place your foot down upon [tmob]'s body, slowly applying pressure, crushing them against the floor below!") + to_chat(tmob,"[src] methodically places their foot upon your body, slowly applying pressure, crushing you against the floor below!") + + //Human with taur tail, special messages are sent + else + var/datum/sprite_accessory/tail/taur/tail = H.tail_style + to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_harm_walk)) + to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_harm_walk)) + + //Return true, the sizediff was enough that we handled it. + return TRUE + + //Not enough sizediff for I_HURT to do anything. + else + return FALSE + + //src stepped on someone with grab intent + if(I_GRAB) + // If bigger than them by at least 0.50, move onto them and print message. + if((get_effective_size() - tmob.get_effective_size()) >= 0.50) + now_pushing = 0 tmob.resting = 1 - return 1 + forceMove(tmob.loc) + + //Log it for admins (still a mechanical attack due to the pin) + admin_attack_log(src, tmob, "Pinned (grab w/ shoes) [tmob.name] under foot.", "Was pinned (grab w/ shoes) under foot by [src.name].", "Pinned (grab w/ shoes) [tmob.name] under foot.") + + //Not a human, or not a taur while wearing shoes = no grab + if(!H || (!isTaurTail(H.tail_style) && H.shoes)) + to_chat(src,"You step down onto [tmob], squishing them and forcing them down to the ground!") + to_chat(tmob,"[src] steps down and squishes you with their foot, forcing you down to the ground!") + + //Human, not a taur, but not wearing shoes = yes grab + else if(H && (!isTaurTail(H.tail_style) && !H.shoes)) + to_chat(src,"You pin [tmob] down onto the floor with your foot and curl your toes up around their body, trapping them inbetween them!") + to_chat(tmob,"[src] pins you down to the floor with their foot and curls their toes up around your body, trapping you inbetween them!") + equip_to_slot_if_possible(tmob.get_scooped(H), slot_shoes, 0, 1) + + //Human, taur, shoes = no grab, special message + else if(H.shoes) + var/datum/sprite_accessory/tail/taur/tail = H.tail_style + to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_grab_fail)) + to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_grab_fail)) + + //Human, taur, no shoes = yes grab, special message + else + var/datum/sprite_accessory/tail/taur/tail = H.tail_style + to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_grab_success)) + to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_grab_success)) + equip_to_slot_if_possible(tmob.get_scooped(H), slot_shoes, 0, 1) + + //Return true, the sizediff was enough that we handled it. + return TRUE + + //Not enough sizediff for I_GRAB to do anything. + else + return FALSE + +#undef STEP_TEXT_OWNER +#undef STEP_TEXT_PREY \ No newline at end of file From f3acd961d39bc2e7a1c6432cc988c27cc3d3910e Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 15 Feb 2018 21:44:59 -0600 Subject: [PATCH 19/20] POLARIS: Walking with nonshoes on feet causes runtimes --- code/modules/mob/living/carbon/human/human_movement.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 4103e96d7f..58e9dc8339 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -199,7 +199,7 @@ volume *= 0.5 else if(shoes) var/obj/item/clothing/shoes/feet = shoes - if(feet) + if(istype(feet)) volume *= feet.step_volume_mod if(!has_organ(BP_L_FOOT) && !has_organ(BP_R_FOOT)) From 33a384d5c3c54b4922219c1e5a138aba440f4148 Mon Sep 17 00:00:00 2001 From: Screemonster Date: Fri, 16 Feb 2018 10:19:12 +0000 Subject: [PATCH 20/20] makes them swat back, tweaks to exclude list --- code/modules/vore/eating/simple_animal_vr.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index a50e93e1d5..6cb42b1063 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -86,12 +86,16 @@ mob/living/simple_animal/say() animal_nom(user) update_icon() stop_automated_movement = 0 + else if (!target_mob) // no using this to clear a retaliate mob's target + target_mob = user //just because you're not tasty doesn't mean you get off the hook. A swat for a swat. + AttackTarget() + LoseTarget() // only make one attempt at an attack rather than going into full rage mode else user.visible_message("\the [user] swats \the [src] with \the [O]!!") for(var/I in vore_organs) var/datum/belly/B = vore_organs[I] B.release_all_contents(include_absorbed = TRUE) // Until we can get a mob version of unsorbitol or whatever, release absorbed too - for(var/mob/living/L in range(1)) //add everyone on the tile to the do-not-eat list for a while + for(var/mob/living/L in living_mobs(0)) //add everyone on the tile to the do-not-eat list for a while if(!(L in prey_excludes)) // Unless they're already on it, just to avoid fuckery. prey_excludes += L spawn(3600)