From b2ae8bac7eb1aca48c53c1ccdad799b9661eaed4 Mon Sep 17 00:00:00 2001 From: DerFlammenwerfer <7h3ph4nt0m@gmail.com> Date: Wed, 24 Sep 2025 08:49:42 -0400 Subject: [PATCH] Excises the 'Ponygirl' subclass of public servant --- code/__DEFINES/traits.dm | 2 - code/_globalvars/traits.dm | 1 - code/modules/clothing/head/_head.dm | 12 -- code/modules/clothing/rogueclothes/armor.dm | 6 - code/modules/clothing/rogueclothes/gloves.dm | 6 - code/modules/clothing/rogueclothes/pants.dm | 6 - .../roguetown/peasants/town slave.dm | 51 +---- code/modules/mob/living/carbon/human/human.dm | 52 +++-- .../mob/living/carbon/human/human_movement.dm | 180 ------------------ code/modules/mob/living/emote.dm | 14 -- code/modules/movespeed/modifiers/mobs.dm | 7 - code/modules/traits/neutral.dm | 7 - 12 files changed, 35 insertions(+), 309 deletions(-) delete mode 100644 code/modules/movespeed/modifiers/mobs.dm delete mode 100644 code/modules/traits/neutral.dm diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 3b1f2da06f6..fd5f2997bdf 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -521,5 +521,3 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_SLAVEBOURNE_EXAMINE "trait_slavebourne_examine" #define TRAIT_LOVESTRUCK "lovestruck" // For collar master's force love effect - -#define TRAIT_PONYGIRL_RIDEABLE "ponygirl_rider" diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index f4a66f1e6da..50b9d46755f 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -190,7 +190,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_LEARNMAGIC" = TRAIT_LEARNMAGIC, "TRAIT_ALCHEMYKNOWLEDGE" = TRAIT_ALCHEMYKNOWLEDGE, - "TRAIT_PONYGIRL_RIDEABLE" = TRAIT_PONYGIRL_RIDEABLE, ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 2ac07453576..d8e6a34be4e 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -105,15 +105,3 @@ armor_class = ARMOR_CLASS_LIGHT sewrepair = TRUE smeltresult = /obj/item/stack/sheet/leather - -/obj/item/clothing/head/hblinders/mob_can_equip(mob/living/M, slot, disable_warning = FALSE) - . = ..() - if(!HAS_TRAIT(M, TRAIT_PONYGIRL_RIDEABLE)) - to_chat(M, span_warning("You lack the proper training to wear this harness!")) - return FALSE - -/obj/item/clothing/head/hbit/mob_can_equip(mob/living/M, slot, disable_warning = FALSE) - . = ..() - if(!HAS_TRAIT(M, TRAIT_PONYGIRL_RIDEABLE)) - to_chat(M, span_warning("You lack the proper training to wear this harness!")) - return FALSE diff --git a/code/modules/clothing/rogueclothes/armor.dm b/code/modules/clothing/rogueclothes/armor.dm index 36ad3044146..1c5c96c7558 100644 --- a/code/modules/clothing/rogueclothes/armor.dm +++ b/code/modules/clothing/rogueclothes/armor.dm @@ -1002,9 +1002,3 @@ smeltresult = /obj/item/stack/sheet/leather boobed = TRUE flags_inv = 0 - -/obj/item/clothing/suit/roguetown/armor/hcorset/mob_can_equip(mob/living/M, slot, disable_warning = FALSE) - . = ..() - if(!HAS_TRAIT(M, TRAIT_PONYGIRL_RIDEABLE)) - to_chat(M, span_warning("You lack the proper training to wear this harness!")) - return FALSE diff --git a/code/modules/clothing/rogueclothes/gloves.dm b/code/modules/clothing/rogueclothes/gloves.dm index 07625661940..ff24a4d82e4 100644 --- a/code/modules/clothing/rogueclothes/gloves.dm +++ b/code/modules/clothing/rogueclothes/gloves.dm @@ -289,9 +289,3 @@ sewrepair = TRUE smeltresult = /obj/item/stack/sheet/leather sleeved = FALSE - -/obj/item/clothing/gloves/roguetown/armor/harms/mob_can_equip(mob/living/M, slot, disable_warning = FALSE) - . = ..() - if(!HAS_TRAIT(M, TRAIT_PONYGIRL_RIDEABLE)) - to_chat(M, span_warning("You lack the proper training to wear this harness!")) - return FALSE diff --git a/code/modules/clothing/rogueclothes/pants.dm b/code/modules/clothing/rogueclothes/pants.dm index 214c8a2ad4a..acee806d6ad 100644 --- a/code/modules/clothing/rogueclothes/pants.dm +++ b/code/modules/clothing/rogueclothes/pants.dm @@ -453,9 +453,3 @@ armor_class = ARMOR_CLASS_LIGHT sewrepair = TRUE smeltresult = /obj/item/stack/sheet/leather - -/obj/item/clothing/under/roguetown/armor/hlegs/mob_can_equip(mob/living/M, slot, disable_warning = FALSE) - . = ..() - if(!HAS_TRAIT(M, TRAIT_PONYGIRL_RIDEABLE)) - to_chat(M, span_warning("You lack the proper training to wear this harness!")) - return FALSE diff --git a/code/modules/jobs/job_types/roguetown/peasants/town slave.dm b/code/modules/jobs/job_types/roguetown/peasants/town slave.dm index 465c6010e5c..f290e861ca8 100644 --- a/code/modules/jobs/job_types/roguetown/peasants/town slave.dm +++ b/code/modules/jobs/job_types/roguetown/peasants/town slave.dm @@ -10,7 +10,7 @@ allowed_races = RACES_ALL_KINDSPLUS tutorial = "Though the title 'public servant' may sound like you are not a slave, matter of fact you are. Stripped of your rights to even your own body, you must work to try to pay off your debt you made previously so you may reclaim your freedom." - outfit = null // Let subclasses handle outfit + outfit = /datum/outfit/job/roguetown/prisonerd display_order = JDO_PRISONERD give_bank_account = 10 min_pq = -14 @@ -18,7 +18,6 @@ can_random = FALSE cmode_music = 'sound/music/combat_bum.ogg' - advsetup = 1 advclass_cat_rolls = list(CTAG_SERVANT = 100) @@ -46,27 +45,9 @@ post_equip(H) H.advjob = name -/datum/advclass/ponygirl - name = "Ponygirl" - tutorial = "Trained to serve as a mount and beast of burden, you are equipped with special gear and training." - outfit = /datum/outfit/job/roguetown/prisonerd/ponygirl - category_tags = list(CTAG_SERVANT) - allowed_sexes = list(MALE, FEMALE) - pickprob = 100 - traits_applied = list(TRAIT_PONYGIRL_RIDEABLE, TRAIT_CRITICAL_RESISTANCE, TRAIT_EMPATH, - TRAIT_NOPAIN, TRAIT_NOPAINSTUN, TRAIT_STABLELIVER, TRAIT_PACIFISM, - TRAIT_BOG_TREKKING, TRAIT_NASTY_EATER, TRAIT_GOODLOVER, TRAIT_BLOODLOSS_IMMUNE) - - /datum/advclass/ponygirl/equipme(mob/living/carbon/human/H) - . = ..() - if(!H) - return FALSE - H.equipOutfit(outfit) - post_equip(H) - H.advjob = name - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 9) - /datum/outfit/job/roguetown/prisonerd/servant/pre_equip(mob/living/carbon/human/H) + +/datum/outfit/job/roguetown/prisonerd/pre_equip(mob/living/carbon/human/H) ..() neck = /obj/item/clothing/neck/roguetown/gorget/servant if(H.gender == FEMALE) @@ -96,32 +77,6 @@ ADD_TRAIT(H, TRAIT_NASTY_EATER, TRAIT_GENERIC) ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC) -/datum/outfit/job/roguetown/prisonerd/ponygirl/pre_equip(mob/living/carbon/human/H) - ..() - mask = /obj/item/clothing/head/hbit - head = /obj/item/clothing/head/hblinders - armor = /obj/item/clothing/suit/roguetown/armor/hcorset - gloves = /obj/item/clothing/gloves/roguetown/armor/harms - pants = /obj/item/clothing/under/roguetown/armor/hlegs - H.change_stat("constitution", 10) - H.change_stat("speed", 10) - if(H.mind) - ADD_TRAIT(H, TRAIT_PONYGIRL_RIDEABLE, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_CRITICAL_RESISTANCE, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_EMPATH, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOPAIN, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NOPAINSTUN, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_STABLELIVER, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_PACIFISM, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_BOG_TREKKING, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_NASTY_EATER, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_GOODLOVER, TRAIT_GENERIC) - ADD_TRAIT(H, TRAIT_BLOODLOSS_IMMUNE, TRAIT_GENERIC) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/athletics, 6) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/climbing, 6) - H.mind.adjust_skillrank_up_to(/datum/skill/misc/swimming, 6) - /datum/job/roguetown/prisonerd/New() . = ..() new /datum/advclass/basic() - new /datum/advclass/ponygirl() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index cdd81c9d978..57af16b8845 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -846,32 +846,44 @@ //Target = what was clicked on, User = thing doing the clicking /mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user) - // Seelie shoulder sitting - if(isseelie(target) && user == target) - shoulder_ride(target) - return + // Seelies can sit on anyone's shoulders + if(isseelie(target) && !(HAS_TRAIT(src, TRAIT_TINY))) + if(can_piggyback(target)) + shoulder_ride(target) + return TRUE - // Ponygirl mounting - if(HAS_TRAIT(src, TRAIT_PONYGIRL_RIDEABLE)) - if(user == target && can_buckle && !buckled_mobs?.len) - if(user.incapacitated() || user.stat || user.restrained()) - return - user.visible_message(span_notice("[user] starts mounting [src]...")) - if(do_after(user, 15, target = src)) - if(user.incapacitated()) - return - if(buckle_mob(user, TRUE, FALSE)) - return TRUE - return - return ..() + // Anyone can sit on anthromorphbig's shoulders + if(istype(src.dna?.species, /datum/species/anthromorphbig)) + if(user == target && can_piggyback(target)) // Make sure the person dragging is the one trying to sit + shoulder_ride(target) + return TRUE + if(user == target) + return FALSE + //normal vore check. + if(user.pulling == target && user.grab_state && user.voremode) + if(ismob(user.pulling)) + user.vore_attack(user, target, src) // User, Pulled, Predator target (which can be user, pulling, or src) + return TRUE + if(pulling == target && stat == CONSCIOUS) + //If they dragged themselves and we're currently aggressively grabbing them try to piggyback + if(user == target && can_piggyback(target)) + piggyback(target) + return TRUE + //If you dragged them to you and you're aggressively grabbing try to carry them + else if(user != target && can_be_firemanned(target)) + var/obj/G = get_active_held_item() + if(G) + if(istype(G, /obj/item/grabbing)) + fireman_carry(target) + return TRUE + . = ..() /mob/living/carbon/human/proc/shoulder_ride(mob/living/carbon/target) - if(!isseelie(target)) - return buckle_mob(target, TRUE, TRUE, FALSE, 0, 0) visible_message(span_notice("[target] gently sits on [src]'s shoulder.")) - target.pixel_y += 6 // Adjust for proper visual alignment + if(istype(target.dna?.species, /datum/species/anthromorphbig)) + target.pixel_y += 6 // Adjust this value as needed for proper visual alignment /mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/target) return (istype(target) && target.stat == CONSCIOUS) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 6cbd6a0af28..81397895341 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -112,183 +112,3 @@ if(dna.species.space_move(src)) return TRUE return ..() - -/mob/living/carbon/human - var/pony_sprint = 0 - var/pony_sprint_cooldown = 0 - var/pony_max_sprint = 50 - var/spurred = FALSE - var/last_damage_data = null // to track damage - -/mob/living/carbon/human/proc/handle_pony_riding() - if(!HAS_TRAIT(src, TRAIT_PONYGIRL_RIDEABLE)) - return FALSE - - var/mob/living/carbon/human/rider = locate() in src.buckled_mobs - if(!rider) - return FALSE - - // Transfer damage from rider to ponygirl using Roguetown's damage system - if(rider.getBruteLoss() > 0) - var/damage = rider.getBruteLoss() - apply_damage(damage, BRUTE, null, 0) - rider.heal_overall_damage(damage, 0) - - if(rider.getFireLoss() > 0) - var/damage = rider.getFireLoss() - apply_damage(damage, BURN, null, 0) - rider.heal_overall_damage(0, damage) - - // Handle bleeding transfer - if(rider.bleed_rate > 0) - var/old_bleed = rider.bleed_rate - rider.bleed_rate = 0 - bleed_rate += old_bleed - to_chat(src, span_warning("You feel [rider]'s wounds transfer to you!")) - to_chat(rider, span_notice("Your wounds seem to transfer to [src]!")) - - // Reset sprint if cooldown passed - if(pony_sprint_cooldown && world.timeofday > pony_sprint_cooldown) - pony_sprint = initial(pony_sprint) - spurred = FALSE - change_stat("speed", -pony_sprint * 0.1) // Remove speed boost - ADD_TRAIT(src, TRAIT_NOROGSTAM, TRAIT_GENERIC) - - // Handle spanking speed boost - if(rider.a_intent == INTENT_HARM && rider.zone_selected == "groin") - pony_sprint = min(pony_sprint + 5, pony_max_sprint) - change_stat("speed", pony_sprint * 0.1) // Apply speed boost - spurred = TRUE - REMOVE_TRAIT(src, TRAIT_NOROGSTAM, TRAIT_GENERIC) - visible_message(span_notice("[rider] spurs [src], increasing their pace!"), \ - span_notice("The sharp sting drives you to move faster!"), \ - span_notice("You hear a sharp slap!")) - pony_sprint_cooldown = world.timeofday + 50 - - // Maintain speed boost while spurred - if(spurred) - change_stat("speed", pony_sprint * 0.1) // Maintain speed boost - REMOVE_TRAIT(src, TRAIT_NOROGSTAM, TRAIT_GENERIC) - - return TRUE - -/mob/living/carbon/human/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE) - if(!force && !HAS_TRAIT(src, TRAIT_PONYGIRL_RIDEABLE)) - return FALSE - - if(..()) // If parent buckle succeeds - var/datum/component/riding/human/riding_datum = LoadComponent(/datum/component/riding/human) - riding_datum.vehicle_move_delay = 2 // Base movement delay - - // Apply riding skill modifiers - if(M.mind) - var/riding_skill = M.mind.get_skill_level(/datum/skill/misc/riding) - if(riding_skill) - riding_datum.vehicle_move_delay = max(1, 2 - (riding_skill * 0.2)) - - // Set proper riding offsets - riding_datum.set_riding_offsets(RIDING_OFFSET_ALL, list( - TEXT_NORTH = list(0, 6), - TEXT_SOUTH = list(0, 6), - TEXT_EAST = list(-6, 4), - TEXT_WEST = list(6, 4) - )) - - // Set proper layering - riding_datum.set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER) - riding_datum.set_vehicle_dir_layer(NORTH, OBJ_LAYER) - riding_datum.set_vehicle_dir_layer(EAST, OBJ_LAYER) - riding_datum.set_vehicle_dir_layer(WEST, OBJ_LAYER) - - return TRUE - return FALSE - -/mob/living/carbon/human/unbuckle_mob(mob/living/M, force = FALSE) - . = ..() - if(.) - pony_sprint = initial(pony_sprint) - spurred = FALSE - ADD_TRAIT(src, TRAIT_NOROGSTAM, TRAIT_GENERIC) - -/mob/living/carbon/human/MouseDrop(atom/over_object) - if(HAS_TRAIT(src, TRAIT_PONYGIRL_RIDEABLE) && over_object == usr) - var/mob/living/user = usr - if(can_buckle && !buckled_mobs?.len) - if(user.incapacitated() || user.lying || user.restrained()) - return - user.visible_message(span_notice("[user] starts mounting [src]...")) - if(do_after(user, 15, target = src)) - if(user.incapacitated() || user.lying || user.restrained()) - return - if(buckle_mob(user, TRUE, FALSE)) - var/datum/component/riding/human/riding_datum = LoadComponent(/datum/component/riding/human) - riding_datum.vehicle_move_delay = 2 // Base movement delay - if(user.mind) - var/riding_skill = user.mind.get_skill_level(/datum/skill/misc/riding) - if(riding_skill) - riding_datum.vehicle_move_delay = max(1, 2 - (riding_skill * 0.2)) - return TRUE - return - return ..() - -/mob/living/carbon/human/relaymove(mob/user, direction) - if(HAS_TRAIT(src, TRAIT_PONYGIRL_RIDEABLE)) - var/datum/component/riding/riding_datum = GetComponent(/datum/component/riding) - if(riding_datum) - return riding_datum.handle_ride(user, direction) - return ..() - -/mob/living/carbon/human/Life() - . = ..() - if(HAS_TRAIT(src, TRAIT_PONYGIRL_RIDEABLE)) - handle_pony_riding() - -/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M) - // Check if target is riding a ponygirl - if(buckled && istype(buckled, /mob/living/carbon/human)) - var/mob/living/carbon/human/mount = buckled - if(HAS_TRAIT(mount, TRAIT_PONYGIRL_RIDEABLE)) - visible_message(span_warning("[M]'s attack is redirected to [mount]'s chest!")) - // Redirect the attack to the mount's chest - M.zone_selected = BODY_ZONE_CHEST // Force target chest - return mount.attack_hand(M) // Use normal attack_hand instead of secondary - return ..() - -/mob/living/carbon/human/attackby(obj/item/I, mob/living/user, params) - // Check if target is riding a ponygirl - if(buckled && istype(buckled, /mob/living/carbon/human)) - var/mob/living/carbon/human/mount = buckled - if(HAS_TRAIT(mount, TRAIT_PONYGIRL_RIDEABLE)) - visible_message(span_warning("[user]'s attack is redirected to [mount]'s chest!")) - // Redirect the attack to the mount's chest - user.zone_selected = BODY_ZONE_CHEST // Force target chest - return mount.attackby(I, user, params) // Use normal attackby instead of secondary - return ..() - -// Add these helper procs to handle the redirected attacks -/mob/living/carbon/human/proc/attack_hand_secondary(mob/living/carbon/human/M) - return ..() // Call parent attack_hand without redirection checks - -/mob/living/carbon/human/proc/attackby_secondary(obj/item/I, mob/living/user, params) - return ..() // Call parent attackby without redirection checks - -// Add these new procs to handle other attack types -/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M) - if(buckled && istype(buckled, /mob/living/carbon/human)) - var/mob/living/carbon/human/mount = buckled - if(HAS_TRAIT(mount, TRAIT_PONYGIRL_RIDEABLE)) - visible_message(span_warning("[M]'s attack is redirected to [mount]!")) - mount.attack_animal(M) - mount.handle_pony_riding() - return TRUE - return ..() - -/mob/living/carbon/human/bullet_act(obj/projectile/P) - if(buckled && istype(buckled, /mob/living/carbon/human)) - var/mob/living/carbon/human/mount = buckled - if(HAS_TRAIT(mount, TRAIT_PONYGIRL_RIDEABLE)) - visible_message(span_warning("The [P] is redirected to [mount]!")) - mount.bullet_act(P) - mount.handle_pony_riding() - return BULLET_ACT_HIT - return ..() diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 2f765995b37..bbb2284cb94 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -638,20 +638,6 @@ var/mob/living/carbon/human/H = user if(H.zone_selected == BODY_ZONE_PRECISE_GROIN) message_param = "slaps %t's ass!" - - // Handle spurring if target is a ponygirl being ridden - if(isliving(H.buckled) && istype(H.buckled, /mob/living/carbon/human)) - var/mob/living/carbon/human/mount = H.buckled - if(HAS_TRAIT(mount, TRAIT_PONYGIRL_RIDEABLE)) - mount.pony_sprint = min(mount.pony_sprint + 5, mount.pony_max_sprint) - mount.change_stat("speed", mount.pony_sprint * 0.1) - mount.spurred = TRUE - REMOVE_TRAIT(mount, TRAIT_NOROGSTAM, TRAIT_GENERIC) - mount.visible_message(span_notice("[H] spurs [mount], increasing their pace!"), \ - span_notice("The sharp sting drives you to move faster!"), \ - span_notice("You hear a sharp slap!")) - mount.pony_sprint_cooldown = world.timeofday + 50 - return ..() /mob/living/carbon/human/verb/emote_slap() diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm deleted file mode 100644 index 71b423af680..00000000000 --- a/code/modules/movespeed/modifiers/mobs.dm +++ /dev/null @@ -1,7 +0,0 @@ -#define MOVESPEED_ID_PONY_SPURRED "PONY_SPURRED" - -/datum/movespeed_modifier/pony_spurred - id = MOVESPEED_ID_PONY_SPURRED - multiplicative_slowdown = -0.5 - flags = IGNORE_NOSLOW - priority = 100 diff --git a/code/modules/traits/neutral.dm b/code/modules/traits/neutral.dm deleted file mode 100644 index 61dac768718..00000000000 --- a/code/modules/traits/neutral.dm +++ /dev/null @@ -1,7 +0,0 @@ -/datum/trait/ponygirl_rideable - name = "Ponygirl Training" - desc = "You've been trained to serve as a mount." - value = 0 - mob_trait = TRAIT_PONYGIRL_RIDEABLE - gain_text = "Your training allows you to serve as a mount." - lose_text = "You've forgotten your mount training."