mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2026-08-27 14:46:57 +01:00
undoes removals
This commit is contained in:
@@ -129,8 +129,17 @@
|
||||
if(tearSlot(M, ITEM_SLOT_MASK))
|
||||
return
|
||||
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
|
||||
I.display_interaction(src, M)
|
||||
// Abomination deathclaws do other stuff instead
|
||||
if(deathclaw_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
|
||||
if(prob(1))
|
||||
do_faceshit(M)
|
||||
else
|
||||
do_facefart(M)
|
||||
handle_post_sex(25, null, M)
|
||||
shake_camera(M, 6, 1)
|
||||
else
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
|
||||
I.display_interaction(src, M)
|
||||
|
||||
/mob/living/simple_animal/hostile/deathclaw/funclaw/cum(mob/living/M)
|
||||
|
||||
|
||||
+248
-6
@@ -138,8 +138,17 @@
|
||||
if(tearSlot(M, ITEM_SLOT_MASK))
|
||||
return
|
||||
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
|
||||
I.display_interaction(src, M)
|
||||
// Abomination deathclaws do other stuff instead
|
||||
if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
|
||||
if(prob(1))
|
||||
do_faceshit(M)
|
||||
else
|
||||
do_facefart(M)
|
||||
handle_post_sex(25, null, M)
|
||||
shake_camera(M, 6, 1)
|
||||
else
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
|
||||
I.display_interaction(src, M)
|
||||
|
||||
/mob/living/simple_animal/hostile/werewolf/funwolf/cum(mob/living/M)
|
||||
|
||||
@@ -342,8 +351,17 @@
|
||||
if(tearSlot(M, ITEM_SLOT_MASK))
|
||||
return
|
||||
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
|
||||
I.display_interaction(src, M)
|
||||
// Abomination deathclaws do other stuff instead
|
||||
if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
|
||||
if(prob(1))
|
||||
do_faceshit(M)
|
||||
else
|
||||
do_facefart(M)
|
||||
handle_post_sex(25, null, M)
|
||||
shake_camera(M, 6, 1)
|
||||
else
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
|
||||
I.display_interaction(src, M)
|
||||
|
||||
/mob/living/simple_animal/hostile/ice_wolf/funwolf/cum(mob/living/M)
|
||||
|
||||
@@ -547,8 +565,17 @@
|
||||
if(tearSlot(M, ITEM_SLOT_MASK))
|
||||
return
|
||||
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
|
||||
I.display_interaction(src, M)
|
||||
// Abomination deathclaws do other stuff instead
|
||||
if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
|
||||
if(prob(1))
|
||||
do_faceshit(M)
|
||||
else
|
||||
do_facefart(M)
|
||||
handle_post_sex(25, null, M)
|
||||
shake_camera(M, 6, 1)
|
||||
else
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
|
||||
I.display_interaction(src, M)
|
||||
|
||||
/mob/living/simple_animal/hostile/hellhound/funwolf/cum(mob/living/M)
|
||||
|
||||
@@ -612,3 +639,218 @@
|
||||
span_userdanger("\The [src]</b> tears off \the [M]'s clothes!"), null, COMBAT_MESSAGE_RANGE)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
//////////////////
|
||||
// //
|
||||
// The Mosley //
|
||||
// //
|
||||
//////////////////
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/funwolf
|
||||
name = "Fun Mosley"
|
||||
desc = "A massive, unknown creature with powerful muscles, glittering-purple claws, and aggression to match. This one seems to have a strange look in its eyes.."
|
||||
var/change_target_hole_cooldown = 0
|
||||
var/chosen_hole
|
||||
var/voremode = FALSE // Fixes runtime when grabbing victim
|
||||
gold_core_spawnable = NO_SPAWN // Admin only
|
||||
werewolf_mode = "rape"
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/funwolf/gentle
|
||||
name = "Gentle Mosley"
|
||||
desc = "A massive, unknown creature with powerful muscles, glittering-purple claws, and aggression to match. This one has the bedroom eyes.."
|
||||
werewolf_mode = "gentle"
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/funwolf/abomination
|
||||
name = "Exiled Mosley"
|
||||
desc = "A massive, unknown creature with powerful muscles, glittering-purple claws, and aggression to match. This one has a strange smell for some reason.."
|
||||
werewolf_mode = "abomination"
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/funwolf/AttackingTarget()
|
||||
var/mob/living/M = target
|
||||
|
||||
var/onLewdCooldown = FALSE
|
||||
var/wantsNoncon = FALSE
|
||||
|
||||
if(get_refraction_dif() > 0)
|
||||
onLewdCooldown = TRUE
|
||||
|
||||
if(M.client && M.client?.prefs.erppref == "Yes" && CHECK_BITFIELD(M.client?.prefs.toggles, VERB_CONSENT) && M.client?.prefs.nonconpref == "Yes")
|
||||
wantsNoncon = TRUE
|
||||
|
||||
switch(werewolf_mode)
|
||||
if("gentle")
|
||||
if(onLewdCooldown || !wantsNoncon)
|
||||
return // Do nothing
|
||||
if("abomination")
|
||||
if(onLewdCooldown || !wantsNoncon)
|
||||
return // Do nothing
|
||||
if("rape")
|
||||
if(onLewdCooldown || !wantsNoncon || M.health > 60)
|
||||
..() // Attack target
|
||||
return
|
||||
|
||||
if(!M.pulledby)
|
||||
if(!M.buckled && !M.density)
|
||||
M.forceMove(src.loc)
|
||||
|
||||
start_pulling(M, supress_message = TRUE)
|
||||
log_combat(src, M, "grabbed")
|
||||
M.visible_message(span_warning("[src] violently grabs [M]!"), \
|
||||
span_userdanger("[src] violently grabs you!"))
|
||||
setGrabState(GRAB_NECK) //Instant neck grab
|
||||
|
||||
return
|
||||
|
||||
if(get_refraction_dif() > 0)
|
||||
..()
|
||||
return
|
||||
|
||||
if(change_target_hole_cooldown < world.time)
|
||||
chosen_hole = null
|
||||
while (chosen_hole == null)
|
||||
pickNewHole(M)
|
||||
change_target_hole_cooldown = world.time + 100
|
||||
|
||||
|
||||
do_lewd_action(M)
|
||||
addtimer(CALLBACK(src, PROC_REF(do_lewd_action), M), rand(8, 12))
|
||||
|
||||
// Regular sex has an extra action per tick to seem less slow and robotic
|
||||
if(werewolf_mode != "abomination" || M.client?.prefs.unholypref != "Yes")
|
||||
addtimer(CALLBACK(src, PROC_REF(do_lewd_action), M), rand(12, 16))
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/funwolf/proc/pickNewHole(mob/living/M)
|
||||
switch(rand(2))
|
||||
if(0)
|
||||
chosen_hole = CUM_TARGET_ANUS
|
||||
if(1)
|
||||
if(M.has_vagina())
|
||||
chosen_hole = CUM_TARGET_VAGINA
|
||||
else
|
||||
chosen_hole = CUM_TARGET_ANUS
|
||||
if(2)
|
||||
chosen_hole = CUM_TARGET_THROAT
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/funwolf/proc/do_lewd_action(mob/living/M)
|
||||
if(get_refraction_dif() > 0)
|
||||
return
|
||||
|
||||
if(rand(1,7) == 7)
|
||||
playlewdinteractionsound(loc, "modular_splurt/sound/lewd/deathclaw_grunt[rand(1, 5)].ogg", 30, 1, -1)
|
||||
|
||||
var/datum/interaction/I
|
||||
switch(chosen_hole)
|
||||
if(CUM_TARGET_ANUS)
|
||||
if(tearSlot(M, ITEM_SLOT_OCLOTHING))
|
||||
return
|
||||
if(tearSlot(M, ITEM_SLOT_ICLOTHING))
|
||||
return
|
||||
|
||||
// Abomination deathclaws do other stuff instead
|
||||
if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
|
||||
if(prob(1))
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/grindmouth"]
|
||||
else
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/grindface"]
|
||||
handle_post_sex(25, null, M)
|
||||
else
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/fuck/anal"]
|
||||
I.display_interaction(src, M)
|
||||
|
||||
if(CUM_TARGET_VAGINA)
|
||||
if(tearSlot(M, ITEM_SLOT_OCLOTHING))
|
||||
return
|
||||
if(tearSlot(M, ITEM_SLOT_ICLOTHING))
|
||||
return
|
||||
|
||||
// Abomination deathclaws do other stuff instead
|
||||
if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/footjob/vagina"]
|
||||
handle_post_sex(10, null, M)
|
||||
else
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/fuck"]
|
||||
I.display_interaction(src, M)
|
||||
|
||||
if(CUM_TARGET_THROAT)
|
||||
if(tearSlot(M, ITEM_SLOT_HEAD))
|
||||
return
|
||||
if(tearSlot(M, ITEM_SLOT_MASK))
|
||||
return
|
||||
|
||||
// Abomination deathclaws do other stuff instead
|
||||
if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
|
||||
if(prob(1))
|
||||
do_faceshit(M)
|
||||
else
|
||||
do_facefart(M)
|
||||
handle_post_sex(25, null, M)
|
||||
shake_camera(M, 6, 1)
|
||||
else
|
||||
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
|
||||
I.display_interaction(src, M)
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/funwolf/cum(mob/living/M)
|
||||
|
||||
if(get_refraction_dif() > 0)
|
||||
return
|
||||
|
||||
var/message
|
||||
|
||||
if(!istype(M))
|
||||
chosen_hole = null
|
||||
|
||||
switch(chosen_hole)
|
||||
if(CUM_TARGET_THROAT)
|
||||
if(M.has_mouth() && M.mouth_is_free())
|
||||
message = "shoves their fat canine cock deep down \the [M]'s throat and cums."
|
||||
else
|
||||
message = "cums on \the [M]'s face."
|
||||
if(CUM_TARGET_VAGINA)
|
||||
if(M.is_bottomless() && M.has_vagina())
|
||||
message = "rams its meaty cock into \the [M]'s pussy and fills it with sperm."
|
||||
M.impregnate(src, M.getorganslot(ORGAN_SLOT_WOMB), src.type)
|
||||
else
|
||||
message = "cums on \the [M]'s belly."
|
||||
if(CUM_TARGET_ANUS)
|
||||
if(M.is_bottomless() && M.has_anus())
|
||||
message = "hilts its knot into \the [M]'s ass and floods it with Werewolf jizz."
|
||||
else
|
||||
message = "cums on \the [M]'s backside."
|
||||
else
|
||||
message = "cums on the floor!"
|
||||
|
||||
if(werewolf_mode == "abomination" && M.client?.prefs.unholypref == "Yes")
|
||||
message = "cums all over [M]'s body"
|
||||
|
||||
if(istype(M, /mob/living/carbon))
|
||||
M.reagents.add_reagent(/datum/reagent/consumable/semen, 30)
|
||||
new /obj/effect/decal/cleanable/semen(loc)
|
||||
|
||||
playlewdinteractionsound(loc, "modular_splurt/sound/lewd/deathclaw[rand(1, 2)].ogg", 30, 1, -1)
|
||||
visible_message("<font color=purple><b>\The [src]</b> [message]</font>")
|
||||
shake_camera(M, 6, 1)
|
||||
set_is_fucking(null ,null)
|
||||
|
||||
refractory_period = world.time + rand(100, 150) // Sex cooldown
|
||||
set_lust(0) // Nuts at 400
|
||||
|
||||
addtimer(CALLBACK(src, PROC_REF(slap), M), 15)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/funwolf/proc/slap(mob/living/M)
|
||||
playlewdinteractionsound(loc, "modular_sand/sound/interactions/slap.ogg", 30, 1, -1)
|
||||
visible_message(span_danger("\The [src]</b> slaps \the [M] right on the ass!"), \
|
||||
span_userdanger("\The [src]</b> slaps \the [M] right on the ass!"), null, COMBAT_MESSAGE_RANGE)
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/funwolf/proc/tearSlot(mob/living/M, slot)
|
||||
var/obj/item/W = M.get_item_by_slot(slot)
|
||||
if(W)
|
||||
M.dropItemToGround(W)
|
||||
playlewdinteractionsound(loc, "sound/items/poster_ripped.ogg", 30, 1, -1)
|
||||
visible_message(span_danger("\The [src]</b> tears off \the [M]'s clothes!"), \
|
||||
span_userdanger("\The [src]</b> tears off \the [M]'s clothes!"), null, COMBAT_MESSAGE_RANGE)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
/mob/living/simple_animal/hostile/the_mosley
|
||||
name = "The Mosley"
|
||||
desc = "A massive, unknown creature with powerful muscles, glittering-purple claws, and aggression to match."
|
||||
icon = 'modular_splurt/icons/mobs/werewolf.dmi'
|
||||
icon_state = "The_Mosley_idle"
|
||||
icon_living = "The_Mosley_idle"
|
||||
icon_dead = "The_Mosley_dead"
|
||||
icon_gib = "syndicate_gib"
|
||||
pixel_x = -16
|
||||
gender = MALE
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
|
||||
stat_attack = UNCONSCIOUS
|
||||
speak = list("ROAR!","Rawr!","GRRAAGH!","Growl!")
|
||||
speak_emote = list("growls", "snarls")
|
||||
emote_hear = list("grumbles.","snarls.")
|
||||
emote_taunt = list("bares its teeth", "stomps")
|
||||
speak_chance = 10
|
||||
taunt_chance = 25
|
||||
speed = 0
|
||||
see_in_dark = 8
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab= 4,
|
||||
/obj/item/stack/sheet/animalhide = 2,
|
||||
/obj/item/stack/sheet/bone = 4)
|
||||
attack_verb_continuous = "claws"
|
||||
attack_verb_simple = "claw"
|
||||
maxHealth = 500
|
||||
health = 500
|
||||
obj_damage = 60
|
||||
armour_penetration = 30
|
||||
melee_damage_lower = 56
|
||||
melee_damage_upper = 56
|
||||
attack_sound = 'modular_splurt/sound/misc/claw_rend.ogg'
|
||||
faction = list("werewolf")
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 5
|
||||
gold_core_spawnable = FALSE
|
||||
var/charging = FALSE
|
||||
has_penis = TRUE
|
||||
has_butt = TRUE
|
||||
|
||||
footstep_type = FOOTSTEP_MOB_HEAVY
|
||||
|
||||
//**werewolf_mode**
|
||||
// Hostile: Normal deathclaw murder machine
|
||||
// Friendly: Does not attack
|
||||
// Rape: Hurts and lewds people
|
||||
// Gentle: lewds people
|
||||
// Abomination: Hurts and does unspeakable lewd things to people
|
||||
var/werewolf_mode = "hostile"
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/pacifist
|
||||
name = "Friendly Mosley"
|
||||
desc = "A massive, unknown creature with powerful muscles, glittering-purple claws, and aggression to match."
|
||||
werewolf_mode = "friendly"
|
||||
friendly_verb_continuous = "howls at"
|
||||
friendly_verb_simple = "howl at"
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/bullet_act(obj/item/projectile/Proj)
|
||||
if(!Proj)
|
||||
return
|
||||
if(prob(10))
|
||||
visible_message(span_danger("\The [src] growls, enraged!"))
|
||||
sleep(3)
|
||||
Charge()
|
||||
if(prob(85) || Proj.damage > 26) //prob(x) = chance for proj to actually do something, adjust depending on how OP you want deathclaws to be
|
||||
return ..()
|
||||
else
|
||||
visible_message(span_danger("\The [Proj] bounces off \the [src]'s thick hide!"))
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
|
||||
if(!charging)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/AttackingTarget()
|
||||
if (werewolf_mode == "friendly")
|
||||
return // Do not attack
|
||||
|
||||
if(!charging)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/Goto(target, delay, minimum_distance)
|
||||
if(!charging)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/Move()
|
||||
if(charging)
|
||||
new /obj/effect/temp_visual/decoy/fading(loc,src)
|
||||
DestroySurroundings()
|
||||
. = ..()
|
||||
if(charging)
|
||||
DestroySurroundings()
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/proc/Charge()
|
||||
var/turf/T = get_turf(target)
|
||||
if(!T || T == loc)
|
||||
return
|
||||
charging = TRUE
|
||||
visible_message(span_danger("[src] charges!"))
|
||||
DestroySurroundings()
|
||||
walk(src, 0)
|
||||
setDir(get_dir(src, T))
|
||||
var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src)
|
||||
animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 1)
|
||||
sleep(3)
|
||||
throw_at(T, get_dist(src, T), 1, src, 0, callback = CALLBACK(src, PROC_REF(charge_end)))
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/charge_end(list/effects_to_destroy)
|
||||
charging = FALSE
|
||||
if(target)
|
||||
Goto(target, move_to_delay, minimum_distance)
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/Bump(atom/A)
|
||||
if(charging)
|
||||
if(isturf(A) || isobj(A) && A.density)
|
||||
A.ex_act(EXPLODE_HEAVY)
|
||||
DestroySurroundings()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/the_mosley/throw_impact(atom/A)
|
||||
if(!charging)
|
||||
return ..()
|
||||
|
||||
else if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.visible_message(span_danger("[src] slams into [L]!"), span_userdanger("[src] slams into you!"))
|
||||
L.apply_damage(melee_damage_lower/2, BRUTE)
|
||||
playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1)
|
||||
shake_camera(L, 4, 3)
|
||||
shake_camera(src, 2, 3)
|
||||
var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
|
||||
L.throw_at(throwtarget, 3)
|
||||
|
||||
charging = FALSE
|
||||
Reference in New Issue
Block a user