diff --git a/code/datums/supplypacks/munitions_vr.dm b/code/datums/supplypacks/munitions_vr.dm index e6629435bf..1c3e3051e8 100644 --- a/code/datums/supplypacks/munitions_vr.dm +++ b/code/datums/supplypacks/munitions_vr.dm @@ -1,7 +1,8 @@ /datum/supply_pack/munitions/expeditionguns name = "Frontier phaser (station-locked) crate" contains = list( - /obj/item/weapon/gun/energy/frontier/locked = 2, + /obj/item/weapon/gun/energy/frontier/locked/basic = 2, + /obj/item/weapon/gun/energy/frontier/locked/holdout = 1, ) cost = 35 containertype = /obj/structure/closet/crate/secure diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 998b213ff4..b191c69818 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -142,18 +142,30 @@ . = buckle_mob(M, forced) if(.) + var/reveal_message = list("buckled_mob" = null, "buckled_to" = null) //VORE EDIT: This being a list and messages existing for the buckle target atom. if(!silent) if(M == user) + reveal_message["buckled_mob"] = "You come out of hiding and buckle yourself to [src]." //VORE EDIT + reveal_message["buckled_to"] = "You come out of hiding as [M.name] buckles themselves to you." //VORE EDIT M.visible_message(\ "[M.name] buckles themselves to [src].",\ "You buckle yourself to [src].",\ "You hear metal clanking.") else + reveal_message["buckled_mob"] = "You are revealed as you are buckled to [src]." //VORE EDIT + reveal_message["buckled_to"] = "You are revealed as [M.name] is buckled to you." //VORE EDIT M.visible_message(\ "[M.name] is buckled to [src] by [user.name]!",\ "You are buckled to [src] by [user.name]!",\ "You hear metal clanking.") + M.reveal(silent, reveal_message["buckled_mob"]) //Reveal people so they aren't buckled to chairs from behind. //VORE EDIT, list arg instead of simple message var for buckled mob + //Vore edit start + var/mob/living/L = src + if(istype(L)) + L.reveal(silent, reveal_message["buckled_to"]) + //Vore edit end + /atom/movable/proc/user_unbuckle_mob(mob/living/buckled_mob, mob/user) var/mob/living/M = unbuckle_mob(buckled_mob) if(M) @@ -193,4 +205,3 @@ riding_datum.handle_vehicle_layer() riding_datum.handle_vehicle_offsets() //VOREStation Add End - \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index beb00b8f81..445168777d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1560,9 +1560,8 @@ /mob/living/carbon/human/proc/update_icon_special() //For things such as teshari hiding and whatnot. if(status_flags & HIDING) // Hiding? Carry on. - if(stat == DEAD || paralysis || weakened || stunned || restrained()) //stunned/knocked down by something that isn't the rest verb? Note: This was tried with INCAPACITATION_STUNNED, but that refused to work. - reset_plane_and_layer() - status_flags &= ~HIDING + if(stat == DEAD || paralysis || weakened || stunned || restrained() || buckled || LAZYLEN(grabbed_by) || has_buckled_mobs()) //stunned/knocked down by something that isn't the rest verb? Note: This was tried with INCAPACITATION_STUNNED, but that refused to work. //VORE EDIT: Check for has_buckled_mobs() (taur riding) + reveal(null) else layer = HIDING_LAYER diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index f78f58d9de..a5da193678 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -1,5 +1,6 @@ /mob/living/death() clear_fullscreens() + reveal(TRUE) //Silently reveal the mob if they were hidden. //VOREStation Edit - Mob spawner stuff if(source_spawner) source_spawner.get_death_report(src) diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index 1442c80f9b..787dd31361 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -1,15 +1,20 @@ +/mob/living/proc/reveal(var/silent, var/message = "You have been revealed! You are no longer hidden.") + if(status_flags & HIDING) + status_flags &= ~HIDING + reset_plane_and_layer() + if(!silent && message) + to_chat(src, message) + /mob/living/proc/hide() set name = "Hide" set desc = "Allows to hide beneath tables or certain items. Toggled on or off." set category = "Abilities" - if(stat == DEAD || paralysis || weakened || stunned || restrained()) + if(stat == DEAD || paralysis || weakened || stunned || restrained() || buckled || LAZYLEN(grabbed_by) || has_buckled_mobs()) //VORE EDIT: Check for has_buckled_mobs() (taur riding) return if(status_flags & HIDING) - status_flags &= ~HIDING - reset_plane_and_layer() - to_chat(src,"You have stopped hiding.") + reveal("You have stopped hiding.") else status_flags |= HIDING layer = HIDING_LAYER //Just above cables with their 2.44 diff --git a/code/modules/mob/living/simple_animal/animals/giant_spider_vr.dm b/code/modules/mob/living/simple_animal/animals/giant_spider_vr.dm new file mode 100644 index 0000000000..50d653f63e --- /dev/null +++ b/code/modules/mob/living/simple_animal/animals/giant_spider_vr.dm @@ -0,0 +1,23 @@ +// Slightly placeholder, mostly to replace ion hivebots on V4 +/mob/living/simple_animal/hostile/giant_spider/ion + desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes and a hint of static discharge." + tt_desc = "X Brachypelma phorus ionus" + icon_state = "webslinger" + icon_living = "webslinger" + icon_dead = "webslinger_dead" + + maxHealth = 90 + health = 90 + + melee_damage_lower = 8 + melee_damage_upper = 15 + + ranged = 1 + projectilesound = 'sound/weapons/taser2.ogg' + projectiletype = /obj/item/projectile/ion/small + firing_lines = 1 + cooperative = 1 + + poison_chance = 15 + poison_per_bite = 2 + poison_type = "psilocybin" diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm index 96d460476f..718dfee55b 100644 --- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm +++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm @@ -14,6 +14,7 @@ var/vore_pounce_chance = 5 // Chance of this mob knocking down an opponent var/vore_standing_too = 0 // Can also eat non-stunned mobs var/vore_ignores_undigestable = 1 // Refuse to eat mobs who are undigestable by the prefs toggle. + var/swallowsound = null // What noise plays when you succeed in eating the mob. var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB) var/vore_default_flags = DM_FLAG_ITEMWEAK // Itemweak by default @@ -114,7 +115,9 @@ var/old_target = target_mob handle_stance(STANCE_BUSY) . = animal_nom(target_mob) + playsound(src, swallowsound, 50, 1) update_icon() + if(.) // If we succesfully ate them, lose the target LoseTarget() diff --git a/code/modules/mob/living/simple_animal/vore/hippo.dm b/code/modules/mob/living/simple_animal/vore/hippo.dm new file mode 100644 index 0000000000..bfd28aafb5 --- /dev/null +++ b/code/modules/mob/living/simple_animal/vore/hippo.dm @@ -0,0 +1,66 @@ +/mob/living/simple_animal/retaliate/hippo + name = "hippo" + desc = "Mostly know for the spectacular hit of the live action movie Hungry Hungry Hippos." + tt_desc = "Hippopotamus amphibius" + icon = 'icons/mob/vore64x64.dmi' + icon_state = "hippo" + icon_living = "hippo" + icon_dead = "hippo_dead" + icon_gib = "hippo_gib" + intelligence_level = SA_ANIMAL + + maxHealth = 200 + health = 200 + turns_per_move = 5 + see_in_dark = 3 + stop_when_pulled = 1 + speed = 5 + armor = list( + "melee" = 15,//They thick as fuck boi + "bullet" = 15, + "laser" = 15, + "energy" = 0, + "bomb" = 0, + "bio" = 0, + "rad" = 0) + + response_help = "pets the" + response_disarm = "gently pushes aside the" + response_harm = "hits the" + attacktext = list("bit") + retaliate = 1 + + melee_damage_upper = 25 + melee_damage_lower = 15 + attack_sharp = 1 + + old_x = -16 + old_y = 0 + default_pixel_x = -16 + pixel_x = -16 + pixel_y = 0 + + speak_chance = 0.1 + speak = list("UUUUUUH") + speak_emote = list("grunts","groans", "roars", "snorts") + emote_hear = list("groan") + emote_see = list("shakes its head") + + meat_amount = 10 //Infinite meat! + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + +// Activate Noms! +/mob/living/simple_animal/retaliate/hippo //I don't know why it's in a seperate line but everyone does it so i do it + vore_active = 1 + vore_capacity = 1 + vore_bump_chance = 15 + vore_bump_emote = "lazily wraps its tentacles around" + vore_standing_too = 1 + vore_ignores_undigestable = 0 + vore_default_mode = DM_HOLD + vore_digest_chance = 10 + vore_escape_chance = 20 + vore_pounce_chance = 35 //it's hippo sized it doesn't care it just eats you + vore_stomach_name = "rumen" //First stomach of a ruminant. It's where the pre digestion bacteria stuff happens. Very warm. + vore_stomach_flavor = "You are squeezed into the sweltering insides of the herbivore rumen." + vore_icons = SA_ICON_LIVING diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 897f7c58c9..0bf523a48e 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -47,6 +47,8 @@ return affecting.grabbed_by += src + affecting.reveal("You are revealed as [assailant] grabs you.") + assailant.reveal("You reveal yourself as you grab [affecting].") hud = new /obj/screen/grab(src) hud.icon_state = "reinforce" diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 26f3af2262..ea27828385 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -114,7 +114,7 @@ if(href_list["observe"]) - if(alert(src,"Are you sure you wish to observe? You will have to wait 1 minute before being able to respawn!","Player Setup","Yes","No") == "Yes") + if(alert(src,"Are you sure you wish to observe? You will have to wait 5 minute before being able to respawn!","Player Setup","Yes","No") == "Yes") //Vorestation edit if(!client) return 1 //Make a new mannequin quickly, and allow the observer to take the appearance diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm index 9c7b4fdcd8..6d0f63e95c 100644 --- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm @@ -11,7 +11,9 @@ else ridden.layer = initial(ridden.layer) else - ridden.layer = initial(ridden.layer) + var/mob/living/L = ridden + if(!(istype(L) && (L.status_flags & HIDING))) + ridden.layer = initial(ridden.layer) /datum/riding/taur/ride_check(mob/living/M) var/mob/living/L = ridden diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index bb798781bf..7942abb5fb 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -47,9 +47,13 @@ I.gurgle_contaminate(src, cont_flavor) items_preserved |= I else - digest_item(I) - to_update = TRUE - did_an_item = TRUE + I.gurgle_contaminate(src, cont_flavor) + if(I.digest_stage && I.digest_stage > 0) + digest_item(I) + else + digest_item(I) + did_an_item = TRUE + to_update = TRUE //Handle eaten mobs else if(isliving(A)) diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index cc247b5497..2641a43700 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -4,17 +4,38 @@ // Ye default implementation. /obj/item/proc/digest_act(var/atom/movable/item_storage = null) - for(var/obj/item/O in contents) - if(istype(O,/obj/item/weapon/storage/internal)) //Dump contents from dummy pockets. - for(var/obj/item/SO in O) - if(item_storage) - SO.forceMove(item_storage) - qdel(O) - else if(item_storage) - O.forceMove(item_storage) - - qdel(src) - return w_class + if(istype(item_storage,/obj/item/device/dogborg/sleeper)) + for(var/obj/item/O in contents) + if(istype(O,/obj/item/weapon/storage/internal)) //Dump contents from dummy pockets. + for(var/obj/item/SO in O) + if(item_storage) + SO.forceMove(item_storage) + qdel(O) + else if(item_storage) + O.forceMove(item_storage) + qdel(src) + return w_class + var/g_damage = 1 + if(digest_stage == null) + digest_stage = w_class + if(isbelly(item_storage)) + var/obj/belly/B = item_storage + g_damage = 0.25 * (B.digest_brute + B.digest_burn) + if(digest_stage > 0) + if(g_damage > digest_stage) + g_damage = digest_stage + digest_stage -= g_damage + else + for(var/obj/item/O in contents) + if(istype(O,/obj/item/weapon/storage/internal)) //Dump contents from dummy pockets. + for(var/obj/item/SO in O) + if(item_storage) + SO.forceMove(item_storage) + qdel(O) + else if(item_storage) + O.forceMove(item_storage) + qdel(src) + return g_damage ///////////// // Some indigestible stuff @@ -91,3 +112,7 @@ /obj/item/device/mmi/digital/posibrain/digest_act(var/atom/movable/item_storage = null) //Replace this with a VORE setting so all types of posibrains can/can't be digested on a whim return FALSE + +// Gradual damage measurement +/obj/item + var/digest_stage = null \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/custom_guns_vr.dm b/code/modules/vore/fluffstuff/custom_guns_vr.dm index d9ad9f3d0c..5330b80006 100644 --- a/code/modules/vore/fluffstuff/custom_guns_vr.dm +++ b/code/modules/vore/fluffstuff/custom_guns_vr.dm @@ -743,10 +743,6 @@ var/recharging = 0 projectile_type = /obj/item/projectile/beam - firemodes = list( - list(mode_name="normal", fire_delay=12, projectile_type=/obj/item/projectile/beam, charge_cost = 300), - list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60), - ) /obj/item/weapon/gun/energy/frontier/unload_ammo(var/mob/user) if(recharging) @@ -778,6 +774,13 @@ /obj/item/weapon/gun/energy/frontier/ex_act() //|rugged| return +//Needed to fix a bug with the holdout phaser +/obj/item/weapon/gun/energy/frontier/basic + firemodes = list( + list(mode_name="normal", fire_delay=12, projectile_type=/obj/item/projectile/beam, charge_cost = 300), + list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60), + ) + /obj/item/weapon/gun/energy/frontier/locked desc = "An extraordinarily rugged laser weapon, built to last and requiring effectively no maintenance. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility." req_access = list(access_armory) //for toggling safety @@ -808,6 +811,13 @@ return 0 return ..() +//Needed to fix a bug with the holdout phaser +/obj/item/weapon/gun/energy/frontier/locked/basic + firemodes = list( + list(mode_name="normal", fire_delay=12, projectile_type=/obj/item/projectile/beam, charge_cost = 300), + list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60), + ) + //Expeditionary Holdout Phaser /obj/item/weapon/gun/energy/frontier/locked/holdout name = "holdout frontier phaser" diff --git a/html/changelogs/KasparoVv - PR - 4130.yml b/html/changelogs/KasparoVv - PR - 4130.yml new file mode 100644 index 0000000000..6a46094651 --- /dev/null +++ b/html/changelogs/KasparoVv - PR - 4130.yml @@ -0,0 +1,6 @@ +author: KasparoVy +delete-after: True +changes: + - rscadd: "Hiding mobs are now revealed when grabbed, buckled and/or killed." + - rscadd: "You cannot hide if you grab something, are grabbed yourself or are buckled." + - rscadd: "Adds some fluff messages for when hiding mobs are revealed." diff --git a/icons/mob/human_races/r_tajaran_vr.dmi b/icons/mob/human_races/r_tajaran_vr.dmi index 8f3453df3f..ecd56f4816 100644 Binary files a/icons/mob/human_races/r_tajaran_vr.dmi and b/icons/mob/human_races/r_tajaran_vr.dmi differ diff --git a/icons/mob/vore64x64.dmi b/icons/mob/vore64x64.dmi index 1f5522139b..8454da40d7 100644 Binary files a/icons/mob/vore64x64.dmi and b/icons/mob/vore64x64.dmi differ diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index b0abd6ec61..7e37655180 100644 Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ diff --git a/maps/tether/submaps/beach/_beach.dm b/maps/tether/submaps/beach/_beach.dm index 321716e3ad..e58e678cc5 100644 --- a/maps/tether/submaps/beach/_beach.dm +++ b/maps/tether/submaps/beach/_beach.dm @@ -95,8 +95,7 @@ prob_fall = 25 //Chance goes down by this much each time it spawns one (not defining and prob_spawn 100 means they spawn as soon as one dies) guard = 40 //They'll stay within this range (not defining this disables them staying nearby and they will wander the map (and through step teleports)) mobs_to_pick_from = list( - /mob/living/simple_animal/hostile/giant_snake = 3, //Snakes are 3x more likely to spawn than, - /mob/living/simple_animal/hostile/frog = 1 //these frogs are, with these values + /mob/living/simple_animal/snake ) /obj/tether_away_spawner/beach_outside_friendly @@ -115,12 +114,14 @@ faction = "beach_cave" atmos_comp = TRUE prob_spawn = 100 - prob_fall = 10 + prob_fall = 40 guard = 20 mobs_to_pick_from = list( - /mob/living/simple_animal/hostile/deathclaw, - /mob/living/simple_animal/hostile/frog, - /mob/living/simple_animal/hostile/hivebot/range/ion + /mob/living/simple_animal/hostile/frog = 3, //Frogs are 3x more likely to spawn than, + /mob/living/simple_animal/hostile/deathclaw = 1, //these deathclaws are, with these values, + /mob/living/simple_animal/hostile/giant_spider = 3, + /mob/living/simple_animal/hostile/giant_snake = 1, + /mob/living/simple_animal/hostile/giant_spider/ion = 2 ) // These are step-teleporters, for map edge transitions diff --git a/maps/tether/tether_things.dm b/maps/tether/tether_things.dm index 859ef9667c..14d1b1bb81 100644 --- a/maps/tether/tether_things.dm +++ b/maps/tether/tether_things.dm @@ -395,7 +395,7 @@ var/global/list/latejoin_tram = list() /obj/structure/closet/secure_closet/guncabinet/excursion/New() ..() for(var/i = 1 to 4) - new /obj/item/weapon/gun/energy/frontier/locked(src) + new /obj/item/weapon/gun/energy/frontier/locked/basic(src) for(var/i = 1 to 4) new /obj/item/weapon/gun/energy/frontier/locked/holdout(src) diff --git a/vorestation.dme b/vorestation.dme index fff4857629..d92d18520b 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2261,6 +2261,7 @@ #include "code\modules\mob\living\simple_animal\animals\fluffy_vr.dm" #include "code\modules\mob\living\simple_animal\animals\fox_vr.dm" #include "code\modules\mob\living\simple_animal\animals\giant_spider.dm" +#include "code\modules\mob\living\simple_animal\animals\giant_spider_vr.dm" #include "code\modules\mob\living\simple_animal\animals\goose.dm" #include "code\modules\mob\living\simple_animal\animals\lizard.dm" #include "code\modules\mob\living\simple_animal\animals\miscellaneous.dm" @@ -2309,6 +2310,7 @@ #include "code\modules\mob\living\simple_animal\vore\fennix.dm" #include "code\modules\mob\living\simple_animal\vore\frog.dm" #include "code\modules\mob\living\simple_animal\vore\gaslamp.dm" +#include "code\modules\mob\living\simple_animal\vore\hippo.dm" #include "code\modules\mob\living\simple_animal\vore\horse.dm" #include "code\modules\mob\living\simple_animal\vore\jelly.dm" #include "code\modules\mob\living\simple_animal\vore\otie.dm"