Removes N.2 unholy ERP verbs. Add: new textures for doors and floors.

This commit is contained in:
ariaworld
2024-08-05 20:46:52 +02:00
parent 309e31d531
commit d2422de379
66 changed files with 299 additions and 625 deletions
+1
View File
@@ -400,3 +400,4 @@
icon_state = "smooth"
smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL|SMOOTH_BORDER
canSmoothWith = null
@@ -40,3 +40,4 @@ SUBSYSTEM_DEF(icon_smooth)
CHECK_TICK
return ..()
+2
View File
@@ -5,6 +5,8 @@
var/id_tag
var/frequency
var/datum/radio_frequency/radio_connection
/// The current state of the airlock, used to construct the airlock overlays
var/airlock_state
/obj/machinery/door/airlock/receive_signal(datum/signal/signal)
+231 -30
View File
@@ -24,6 +24,27 @@
#define AIRLOCK_DENY 5
#define AIRLOCK_EMAG 6
#define AIRLOCK_FRAME_CLOSED "closed"
#define AIRLOCK_FRAME_CLOSING "closing"
#define AIRLOCK_FRAME_OPEN "open"
#define AIRLOCK_FRAME_OPENING "opening"
#define AIRLOCK_LIGHT_BOLTS "bolts"
#define AIRLOCK_LIGHT_EMERGENCY "emergency"
#define AIRLOCK_LIGHT_DENIED "denied"
#define AIRLOCK_LIGHT_CLOSING "closing"
#define AIRLOCK_LIGHT_OPENING "opening"
#define AIRLOCK_LIGHT_POWER 1
#define AIRLOCK_LIGHT_RANGE 2
#define AIRLOCK_POWERON_LIGHT_COLOR "#3aa7c2"
#define AIRLOCK_BOLTS_LIGHT_COLOR "#c22323"
#define AIRLOCK_ACCESS_LIGHT_COLOR "#57e69c"
#define AIRLOCK_EMERGENCY_LIGHT_COLOR "#d1d11d"
#define AIRLOCK_ENGINEERING_LIGHT_COLOR "#fd8719"
#define AIRLOCK_DENY_LIGHT_COLOR "#c22323"
#define AIRLOCK_SECURITY_NONE 0 //Normal airlock //Wires are not secured
#define AIRLOCK_SECURITY_METAL 1 //Medium security airlock //There is a simple metal over wires (use welder)
#define AIRLOCK_SECURITY_PLASTEEL_I_S 2 //Sliced inner plating (use crowbar), jumps to 0
@@ -89,6 +110,7 @@
var/airlock_material //material of inner filling; if its an airlock with glass, this should be set to "glass"
var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
var/note_overlay_file = 'icons/obj/doors/airlocks/station/overlays.dmi' //Used for papers and photos pinned to the airlock
var/cutAiWire = FALSE
var/cyclelinkeddir = 0
var/obj/machinery/door/airlock/cyclelinkedairlock
@@ -105,6 +127,38 @@
/// sigh
var/unelectrify_timerid
var/advactivator_action = FALSE
/// For those airlocks you might want to have varying "fillings" for, without having to
/// have an icon file per door with a different filling.
var/fill_state_suffix = null
/// For the airlocks that use greyscale lights, set this to the color you want your lights to be.
var/greyscale_lights_color = null
/// For the airlocks that use a greyscale accent door color, set this color to the accent color you want it to be.
var/greyscale_accent_color = null
var/has_environment_lights = TRUE //Does this airlock emit a light?
var/light_color_poweron = AIRLOCK_POWERON_LIGHT_COLOR
var/light_color_bolts = AIRLOCK_BOLTS_LIGHT_COLOR
var/light_color_access = AIRLOCK_ACCESS_LIGHT_COLOR
var/light_color_emergency = AIRLOCK_EMERGENCY_LIGHT_COLOR
var/light_color_engineering = AIRLOCK_ENGINEERING_LIGHT_COLOR
var/light_color_deny = AIRLOCK_DENY_LIGHT_COLOR
var/door_light_range = AIRLOCK_LIGHT_RANGE
var/door_light_power = AIRLOCK_LIGHT_POWER
///Is this door external? E.g. does it lead to space? Shuttle docking systems bolt doors with this flag.
var/external = FALSE
/obj/machinery/door/airlock/external
external = TRUE
/obj/machinery/door/airlock/shuttle
external = TRUE
/obj/machinery/door/airlock/power_change()
..()
update_icon()
/obj/machinery/door/airlock/Initialize(mapload)
. = ..()
@@ -347,6 +401,17 @@
cyclelinkedairlock.delayed_close_requested = TRUE
else
addtimer(CALLBACK(cyclelinkedairlock, PROC_REF(close)), 2)
if(ishuman(user) && prob(5) && src.density)
var/mob/living/carbon/human/H = user
if((HAS_TRAIT(H, TRAIT_DUMB)) && Adjacent(user))
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
if(!istype(H.head, /obj/item/clothing/head/helmet))
H.visible_message("<span class='danger'>[user] headbutts the airlock.</span>", \
"<span class='userdanger'>You headbutt the airlock!</span>")
H.DefaultCombatKnockdown(100)
H.apply_damage(1, BRUTE, BODY_ZONE_HEAD)
else
visible_message("<span class='danger'>[user] headbutts the airlock. Good thing [user] is wearing a helmet.</span>")
..()
/obj/machinery/door/airlock/proc/isElectrified()
@@ -488,6 +553,9 @@
lights_overlay = get_airlock_overlay("lights_bolts", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE)
else if(emergency)
lights_overlay = get_airlock_overlay("lights_emergency", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE)
else
lights_overlay = get_airlock_overlay("lights_poweron", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE)
light_color = LIGHT_COLOR_BLUE
if(note)
note_overlay = get_airlock_overlay(notetype, note_overlay_file)
@@ -641,6 +709,129 @@
else
set_light(0)
/obj/machinery/door/airlock/update_overlays()
. = ..()
var/pre_light_range = 0
var/pre_light_power = 0
var/pre_light_color = ""
var/lights_overlay = ""
var/frame_state
var/light_state
switch(airlock_state)
if(AIRLOCK_CLOSED)
frame_state = AIRLOCK_FRAME_CLOSED
if(locked)
light_state = AIRLOCK_LIGHT_BOLTS
lights_overlay = "lights_bolts"
pre_light_color = light_color_bolts
else if(emergency)
light_state = AIRLOCK_LIGHT_EMERGENCY
lights_overlay = "lights_emergency"
pre_light_color = light_color_emergency
else
lights_overlay = "lights_poweron"
pre_light_color = light_color_poweron
if(AIRLOCK_DENY)
frame_state = AIRLOCK_FRAME_CLOSED
light_state = AIRLOCK_LIGHT_DENIED
lights_overlay = "lights_denied"
pre_light_color = light_color_deny
if(AIRLOCK_EMAG)
frame_state = AIRLOCK_FRAME_CLOSED
if(AIRLOCK_CLOSING)
frame_state = AIRLOCK_FRAME_CLOSING
light_state = AIRLOCK_LIGHT_CLOSING
lights_overlay = "lights_closing"
pre_light_color = light_color_access
if(AIRLOCK_OPEN)
frame_state = AIRLOCK_FRAME_OPEN
if(locked)
lights_overlay = "lights_bolts_open"
pre_light_color = light_color_bolts
else if(emergency)
lights_overlay = "lights_emergency_open"
pre_light_color = light_color_emergency
else
lights_overlay = "lights_poweron_open"
pre_light_color = light_color_poweron
if(AIRLOCK_OPENING)
frame_state = AIRLOCK_FRAME_OPENING
light_state = AIRLOCK_LIGHT_OPENING
lights_overlay = "lights_opening"
pre_light_color = light_color_access
. += get_airlock_overlay(frame_state, icon, targetlayer = FLOAT_LAYER, targetplane = FLOAT_PLANE)
if(airlock_material)
. += get_airlock_overlay("[airlock_material]_[frame_state]", overlays_file, targetlayer = FLOAT_LAYER, targetplane = FLOAT_PLANE)
else
. += get_airlock_overlay("fill_[frame_state + fill_state_suffix]", icon, targetlayer = FLOAT_LAYER, targetplane = FLOAT_PLANE)
if(greyscale_lights_color && !light_state)
lights_overlay += "_greyscale"
if(lights && hasPower())
. += get_airlock_overlay("lights_[light_state]", overlays_file, targetlayer = FLOAT_LAYER, targetplane = FLOAT_PLANE)
pre_light_range = door_light_range
pre_light_power = door_light_power
if(has_environment_lights)
set_light(pre_light_range, pre_light_power, pre_light_color, TRUE)
// if(multi_tile)
// filler.set_light(pre_light_range, pre_light_power, pre_light_color)
else
lights_overlay = ""
var/mutable_appearance/lights_appearance = mutable_appearance(overlays_file, lights_overlay, FLOAT_LAYER, src, ABOVE_LIGHTING_PLANE)
if(greyscale_lights_color && !light_state)
lights_appearance.color = greyscale_lights_color
// if(multi_tile)
// lights_appearance.dir = dir
. += lights_appearance
if(greyscale_accent_color)
. += get_airlock_overlay("[frame_state]_accent", overlays_file, targetlayer = FLOAT_LAYER, targetplane = FLOAT_PLANE)
if(panel_open)
. += get_airlock_overlay("panel_[frame_state][security_level ? "_protected" : null]", overlays_file, targetlayer = FLOAT_LAYER, targetplane = FLOAT_PLANE)
if(frame_state == AIRLOCK_FRAME_CLOSED && welded)
. += get_airlock_overlay("welded", overlays_file, targetlayer = FLOAT_LAYER, targetplane = FLOAT_PLANE)
if(airlock_state == AIRLOCK_EMAG)
. += get_airlock_overlay("sparks", overlays_file, targetlayer = FLOAT_LAYER, targetplane = FLOAT_PLANE)
if(hasPower())
if(frame_state == AIRLOCK_FRAME_CLOSED)
if(obj_integrity < integrity_failure * max_integrity)
. += get_airlock_overlay("sparks_broken", overlays_file, targetlayer = FLOAT_LAYER, targetplane = FLOAT_PLANE)
else if(obj_integrity < (0.75 * max_integrity))
. += get_airlock_overlay("sparks_damaged", overlays_file, targetlayer = FLOAT_LAYER, targetplane = FLOAT_PLANE)
else if(frame_state == AIRLOCK_FRAME_OPEN)
if(obj_integrity < (0.75 * max_integrity))
. += get_airlock_overlay("sparks_open", overlays_file, targetlayer = FLOAT_LAYER, targetplane = FLOAT_PLANE)
if(hasPower() && unres_sides)
for(var/heading in list(NORTH,SOUTH,EAST,WEST))
if(!(unres_sides & heading))
continue
var/mutable_appearance/floorlight = mutable_appearance('icons/obj/doors/airlocks/station/overlays.dmi', "unres_[heading]", FLOAT_LAYER, src, ABOVE_LIGHTING_PLANE)
switch (heading)
if (NORTH)
floorlight.pixel_x = 0
floorlight.pixel_y = 32
if (SOUTH)
floorlight.pixel_x = 0
floorlight.pixel_y = -32
if (EAST)
floorlight.pixel_x = 32
floorlight.pixel_y = 0
if (WEST)
floorlight.pixel_x = -32
floorlight.pixel_y = 0
. += floorlight
/obj/machinery/door/airlock/do_animate(animation)
switch(animation)
if("opening")
@@ -817,20 +1008,7 @@
if(isElectrified())
if(shock(user, 100))
return
if(ishuman(user) && prob(40) && src.density)
var/mob/living/carbon/human/H = user
if((HAS_TRAIT(H, TRAIT_DUMB)) && Adjacent(user))
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
if(!istype(H.head, /obj/item/clothing/head/helmet))
H.visible_message("<span class='danger'>[user] headbutts the airlock.</span>", \
"<span class='userdanger'>You headbutt the airlock!</span>")
H.DefaultCombatKnockdown(100)
H.apply_damage(10, BRUTE, BODY_ZONE_HEAD)
else
visible_message("<span class='danger'>[user] headbutts the airlock. Good thing [user.p_theyre()] wearing a helmet.</span>")
else
return ..()
return ..()
/obj/machinery/door/airlock/attempt_wire_interaction(mob/user)
if(security_level)
@@ -1051,9 +1229,9 @@
if(obj_integrity < max_integrity)
if(!W.tool_start_check(user, amount=0))
return
user.visible_message("[user] is welding the airlock.", \
"<span class='notice'>You begin repairing the airlock...</span>", \
"<span class='italics'>You hear welding.</span>")
user.visible_message("[user] чинит шлюз сваркой.", \
"<span class='notice'>Вы начинаете чинить шлюз...</span>", \
"<span class='italics'>Вы слышите звук сварки.</span>")
if(W.use_tool(src, user, 40, volume=50, extra_checks = CALLBACK(src, PROC_REF(weld_checks), W, user)))
obj_integrity = max_integrity
stat &= ~BROKEN
@@ -1107,7 +1285,7 @@
user.DefaultCombatKnockdown(60)
return
user.visible_message("<span class='notice'>[user] removes [charge] from [src].</span>", \
"<span class='notice'>You gently pry out [charge] from [src] and unhook its wires.</span>")
"<span class='notice'>You gently pry out [charge] from [src] and unhook its wires.</span>")
charge.forceMove(get_turf(user))
charge = null
return
@@ -1201,7 +1379,7 @@
update_freelook_sight()
sleep(4)
density = FALSE
air_update_turf(1)
air_update_turf(TRUE)
sleep(1)
layer = OPEN_DOOR_LAYER
update_icon(AIRLOCK_OPEN, 1)
@@ -1243,11 +1421,11 @@
layer = CLOSED_DOOR_LAYER
if(air_tight)
density = TRUE
air_update_turf(1)
air_update_turf(TRUE)
sleep(1)
if(!air_tight)
density = TRUE
air_update_turf(1)
air_update_turf(TRUE)
sleep(4)
if(!safe)
crush()
@@ -1265,6 +1443,7 @@
/obj/machinery/door/airlock/proc/prison_open()
if(obj_flags & EMAGGED)
return
log_admin("[key_name(usr)] emagged [src] at [AREACOORD(src)]")
locked = FALSE
src.open()
locked = TRUE
@@ -1305,6 +1484,7 @@
return
operating = TRUE
update_icon(AIRLOCK_EMAG, 1)
log_admin("[key_name(usr)] emagged [src] at [AREACOORD(src)]")
addtimer(CALLBACK(src, PROC_REF(open_sesame)), 6)
return TRUE
@@ -1402,6 +1582,16 @@
if(obj_integrity < (0.75 * max_integrity))
update_icon()
/obj/machinery/door/airlock/proc/prepare_deconstruction_assembly(obj/structure/door_assembly/assembly)
assembly.heat_proof_finished = heat_proof //tracks whether there's rglass in
assembly.set_anchored(TRUE)
assembly.glass = glass
assembly.state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS
assembly.created_name = name
assembly.previous_assembly = previous_airlock
assembly.update_name()
assembly.update_icon()
assembly.update_appearance()
/obj/machinery/door/airlock/deconstruct(disassembled = TRUE, mob/user)
if(!(flags_1 & NODECONSTRUCT_1))
@@ -1411,14 +1601,7 @@
else
A = new /obj/structure/door_assembly(loc)
//If you come across a null assemblytype, it will produce the default assembly instead of disintegrating.
A.heat_proof_finished = src.heat_proof //tracks whether there's rglass in
A.setAnchored(TRUE)
A.glass = src.glass
A.state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS
A.created_name = name
A.previous_assembly = previous_airlock
A.update_name()
A.update_icon()
prepare_deconstruction_assembly(A)
if(!disassembled)
if(A)
@@ -1526,6 +1709,8 @@
/obj/machinery/door/airlock/ui_act(action, params)
if(..())
return
if(params["ic_advactivator"])
advactivator_action = TRUE
if(!user_allowed(usr))
return
switch(action)
@@ -1574,9 +1759,10 @@
if("open-close")
user_toggle_open(usr)
. = TRUE
advactivator_action = FALSE
/obj/machinery/door/airlock/proc/user_allowed(mob/user)
return (hasSiliconAccessInArea(user) && canAIControl(user)) || IsAdminGhost(user)
return (hasSiliconAccessInArea(user) && canAIControl(user)) || IsAdminGhost(user) || advactivator_action
/obj/machinery/door/airlock/proc/shock_restore(mob/user)
if(!user_allowed(user))
@@ -1645,6 +1831,21 @@
#undef AIRLOCK_DENY
#undef AIRLOCK_EMAG
#undef AIRLOCK_LIGHT_BOLTS
#undef AIRLOCK_LIGHT_EMERGENCY
#undef AIRLOCK_LIGHT_DENIED
#undef AIRLOCK_LIGHT_CLOSING
#undef AIRLOCK_LIGHT_OPENING
#undef AIRLOCK_LIGHT_POWER
#undef AIRLOCK_LIGHT_RANGE
#undef AIRLOCK_POWERON_LIGHT_COLOR
#undef AIRLOCK_BOLTS_LIGHT_COLOR
#undef AIRLOCK_ACCESS_LIGHT_COLOR
#undef AIRLOCK_EMERGENCY_LIGHT_COLOR
#undef AIRLOCK_DENY_LIGHT_COLOR
#undef AIRLOCK_SECURITY_NONE
#undef AIRLOCK_SECURITY_METAL
#undef AIRLOCK_SECURITY_PLASTEEL_I_S
+35 -1
View File
@@ -285,10 +285,16 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
name = "Gateway Control"
desc = "Human friendly interface to the mysterious gate next to it."
var/obj/machinery/gateway/G
var/list/available_missions
var/cooldown_time = 30 MINUTES
var/next_use_time = 0
/obj/machinery/computer/gateway_control/Initialize(mapload, obj/item/circuitboard/C)
. = ..()
try_to_linkup()
available_missions = list()
for(var/mission_file in GLOB.potential_away_levels)
var/mission_name = copytext(mission_file, 1, -4) // Remove .dmm extension
available_missions[mission_name] = mission_file
/obj/machinery/computer/gateway_control/ui_interact(mob/user, datum/tgui/ui)
. = ..()
@@ -326,6 +332,34 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
if(G?.target)
G.deactivate()
return TRUE
if("load_mission")
if(next_use_time > world.time)
to_chat(usr, "<span class='warning'>The gateway is still recharging!</span>")
return
var/mission_name = params["mission"]
if(mission_name in available_missions)
load_mission(mission_name)
next_use_time = world.time + cooldown_time
return TRUE
/obj/machinery/computer/gateway_control/proc/load_mission(mission_name)
var/mission_file = available_missions[mission_name]
var/z_level = G.z
// Unload current mission
if(G.target)
G.deactivate()
for(var/turf/T in block(locate(1, 1, z_level), locate(world.maxx, world.maxy, z_level)))
T.empty()
// Load new mission
var/datum/map_template/away_mission = new(mission_file)
away_mission.load(locate(1, 1, z_level), centered = FALSE)
// Set up new gateway destination
var/datum/gateway_destination/point/new_destination = new
new_destination.target_turfs = list(locate(/obj/effect/landmark/awaystart) in GLOB.landmarks_list)
G.activate(new_destination)
/obj/machinery/computer/gateway_control/proc/try_to_linkup()
G = locate(/obj/machinery/gateway) in view(7,get_turf(src))
+12
View File
@@ -15,6 +15,18 @@
INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!")
GLOB.random_zlevels_generated[name] = TRUE
/proc/load_away_mission(mission_file, existing_z = null)
var/datum/map_template/away_mission = new(mission_file)
var/list/traits = list(ZTRAIT_AWAY = TRUE)
var/z
if(existing_z)
z = existing_z
traits[ZTRAIT_REEBE] = TRUE // This will prevent the z-level from being reset
else
z = createRandomZlevel(traits = traits)
away_mission.load(locate(1, 1, z), centered = FALSE)
return z
/obj/effect/landmark/awaystart
name = "away mission spawn"
desc = "Randomly picked away mission spawn points."
+2 -2
View File
@@ -139,14 +139,14 @@ ALLOW_AI_MULTICAM
## AWAY MISSIONS ###
## Uncomment to load one of the missions from awaymissionconfig.txt at roundstart.
#ROUNDSTART_AWAY
ROUNDSTART_AWAY
## Uncomment to load one of the virtual reality levels from vr_config at roundstart.
#ROUNDSTART_VR
## How long the delay is before the Away Mission gate opens. Default is half an hour.
## 600 is one minute.
GATEWAY_DELAY 18000
GATEWAY_DELAY 600
## ACCESS ###
Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -762,280 +762,6 @@
if(target.can_penetrating_genital_cum())
target.handle_post_sex(NORMAL_LUST, CUM_TARGET_THIGHS, src, ORGAN_SLOT_PENIS)
////////////////////////////////////////////////////////////////////////////////////////////////////////
///////// U N H O L Y /////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
/mob/living/proc/do_facefart(mob/living/carbon/target)
var/message
var/t_His = target.p_their()
var/u_His = p_their()
var/u_He = p_they()
var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
var/jiggle = "[u_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
var/list/braps = list(
"rips a [pick(list("massive", "fat", "engulfing", "breathtaking"))][pick(list(", [pick(stank)]", ""))] one",
"[pick(list("", "wetly", "loudly"))] [pick(list("braps", "farts", "rips ass"))]",
"lets out some of that [pick(stank)] [pick(list("gas", "flatulence", "anal hurricane"))]",
"lets [u_His] shitter drop a [pick(list("large", "fat", "greasy"))] gas bomb",
"allows [u_His] [pick(ass)] to rip an enormous, greasy gas cloud"
)
var/list/hell = list(
"'s asshole squints as she shoves \the <b>[target]</b>'s face in between [u_His] sweaty [pick(asscheeks)], letting hell go loose!",
" pushes [u_His] [pick(ass)] into \the <b>[target]</b>'s face, [pick(list("[t_His] nose shoved deep in [src]'s musky butthole", "[u_His] asshole squints"))] as [u_He] [pick(braps)][pick(list("", ", [jiggle]"))]",
" smothers \the [target]'s whole head in between [u_His][pick(list(" sweaty", "", " musky"))] [pick(asscheeks)], pushing out gallons of pure braps. [pick(list("", "[jiggle]"))]",
"'s [pick(ass)] claps against \the <b>[target]</b>'s nose, right before [u_He] [pick(braps)]"
)
message = span_lewd("\The <b>[src]</b>[pick(hell)]")
visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
if(!is_fucking(target, GRINDING_FACE_WITH_ANUS))
set_is_fucking(target, GRINDING_FACE_WITH_ANUS, null)
handle_post_sex(LOW_LUST, null, src)
/mob/living/proc/do_crotchfart(mob/living/carbon/target)
var/message
var/u_His = p_their()
var/genital_name = "crotch"
if(target.has_penis() == HAS_EXPOSED_GENITAL || target.has_strapon() == HAS_EXPOSED_GENITAL)
genital_name = target.get_penetrating_genital_name()
else if(target.has_vagina() == HAS_EXPOSED_GENITAL)
var/obj/item/organ/genital/vagina/genital = target.getorganslot(ORGAN_SLOT_VAGINA)
genital_name = genital.name
var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
var/jiggle = "[u_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
var/list/braps = list(
"rips a [pick(list("massive", "fat", "engulfing", "breathtaking"))][pick(list(", [pick(stank)]", ""))] one",
"[pick(list("", "wetly", "loudly"))] [pick(list("braps", "farts", "rips ass"))]",
"lets out some of that [pick(stank)] [pick(list("gas", "flatulence", "anal hurricane"))]",
"lets [u_His] shitter drop a [pick(list("large", "fat", "greasy"))] gas bomb",
"allows [u_His] [pick(ass)] to rip an enormous, greasy gas cloud."
)
var/list/hell = list(
" pushes [u_His] [pick(ass)] into \the <b>[target]</b>'s crotch, [pick(list("ripping a fat[pick(list("", " and [pick(stank)]"))] one", " and subsequently [pick(braps)]"))][pick(list("", ". [jiggle]"))]",
" and \the <b>[target]</b> can smell the [prob(50) ? pick(stank) : "flatulent"] gas fill the room ass it seeps in between \the <b>[target]</b>'s thighs!",
" [pick(braps)] into \the <b>[target]</b>'s [genital_name]"
)
message = span_lewd("\The <b>[src]</b>[pick(hell)]")
visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
if(!target.is_fucking(src, CUM_TARGET_ANUS))
var/obj/item/organ/genital/genital = target.has_penis() == HAS_EXPOSED_GENITAL ? target.getorganslot(ORGAN_SLOT_PENIS) : (target.has_vagina() == HAS_EXPOSED_GENITAL ? target.getorganslot(ORGAN_SLOT_VAGINA) : null)
target.set_is_fucking(src, CUM_TARGET_ANUS, genital)
if(!target.has_strapon() == HAS_EXPOSED_GENITAL)
target.handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, src)
handle_post_sex(NORMAL_LUST, null, target)
/mob/living/proc/do_fartfuck(mob/living/target)
var/message
var/list/hell
var/t_He = target.p_they()
var/t_His = target.p_their()
var/u_His = p_their()
var/u_He = p_they()
var/genital_name = get_penetrating_genital_name()
var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
var/jiggle = "[t_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "brapping", "noisy", "quaking", "musky")
var/list/braps = list(
"rips a [pick(list("massive", "fat", "engulfing", "breathtaking"))][pick(list(", [pick(stank)]", ""))] one",
"[pick(list("", "wetly", "loudly"))] [pick(list("braps", "farts", "rips ass"))]",
"lets out some of that [pick(stank)] [pick(list("gas", "flatulence", "anal hurricane"))]",
"lets [u_His] shitter drop a [pick(list("large", "fat", "greasy"))] gas bomb",
"allows [u_His] [pick(ass)] to rip an enormous, greasy gas cloud."
)
if(is_fucking(target, CUM_TARGET_ANUS))
hell = list(
"thrusts in and out of \the <b>[target]</b>'s [pick(stankhole)] pucker, making it [pick("fumigate <b>[src]</b>'s [genital_name] with farts", "push out an unholy amount of ass gas")].",
"pounds \the <b>[target]</b>'s ass. [t_He] [pick(braps)]",
"slams [u_His] hips up against \the <b>[target]</b>'s [pick(stankhole)] [pick(ass)] hard, causing a massive surge of [pick(list("farts", "butt methane", "brap", "ass gas", "shit winds", "thick flatulence"))] from [t_His] [pick(list("crack", "canyon"))][prob(50) ? ". [jiggle]" : ""]",
"goes balls deep into \the <b>[target]</b>'s [pick(ass)] over and over again. [t_He] can't stop pumping out [pick("", "[pick(stank)] ")] [pick(list("farts", "butt methane", "brap", "ass gas", "shit winds", "thick flatulence"))] from his wobbling [pick(asscheeks)]")
else
hell = list(
"can already smell the stench as [u_He] works [u_His] [genital_name] into \the <b>[target]</b>'s brap hole, being received by a long and warm backblast.",
"grabs the base of [u_His] twitching [genital_name] and presses the tip into \the <b>[target]</b>'s asshole, acting like a valve that unearths impossible amounts of pure, [pick(stank)] flatulence.",
"shoves [u_His] [genital_name] deep inside of \the <b>[target]</b>'s [pick(ass)], [t_He] [pick(braps)][pick("", ". [jiggle]")]")
set_is_fucking(target, CUM_TARGET_ANUS, getorganslot(ORGAN_SLOT_PENIS))
message = span_lewd("\The <b>[src]</b> [pick(hell)]")
visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
playlewdinteractionsound(target.loc, pick('modular_sand/sound/interactions/bang1.ogg',
'modular_sand/sound/interactions/bang2.ogg',
'modular_sand/sound/interactions/bang3.ogg',
'modular_sand/sound/interactions/bang4.ogg',
'modular_sand/sound/interactions/bang5.ogg',
'modular_sand/sound/interactions/bang6.ogg'), 70, 1, -1)
if(can_penetrating_genital_cum())
handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, target, ORGAN_SLOT_PENIS)
target.handle_post_sex(NORMAL_LUST, null, src)
/mob/living/proc/suck_fart(mob/living/target)
var/message
var/list/hell
var/t_His = target.p_their()
var/u_His = p_their()
var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "brapping", "noisy", "quaking", "musky")
if(is_fucking(target, GRINDING_FACE_WITH_ANUS))
hell = list(
"smooches and sucks \the <b>[target]</b>'s [pick(pick(stankhole) + " ", "")] pucker, gulping down a whole barrage of [pick(stank)] flatulence!",
"pierces \the <b>[target]</b>'s [pick(pick(stankhole) + " ", "")] butthole with [u_His] tongue, making a [pick(stank)] burst out!",
"sucks into \the <b>[target]</b>'s [pick(pick(stankhole) + " ", "")] asshole, gulping down [t_His] [pick(stank)] gas!"
)
else
hell = list(
"presses [u_His] face right into \the <b>[target]</b>'s [pick(list("musky ", "sweaty ", ""))] backside, spreading [t_His] butthole open to begin harvesting [t_His] [pick(stank) + " "] farts!",
"uses [u_His] lips to spread \the <b>[target]</b>'s [pick(stankhole) + " "] butthole, starting to suck the flatulence out of it!"
)
set_is_fucking(target, GRINDING_FACE_WITH_ANUS, null)
message = span_lewd("\The <b>[src]</b> [pick(hell)]")
visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
playlewdinteractionsound(target.loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
target.handle_post_sex(NORMAL_LUST, null, src)
/mob/living/proc/do_faceshit(mob/living/carbon/target)
var/message
var/u_His = p_their()
var/t_His = target.p_their()
var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
var/jiggle = "[u_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "shitting", "noisy", "quaking", "musky", "messy", "shitcaked", "nasty")
var/list/hell = list(
"presses [u_His] [pick(stankhole)] [pick(ass)] into \the <b>[target]</b>'s face, coating it in a [pick(stank)] layer of brown",
"makes sure \the <b>[target]</b>'s mouth is wide open, letting out a greasy, [pick(stank)] log of manure right into it. [jiggle]",
"smothers \the <b>[target]</b>'s face in between [u_His] musky, dirty asscheeks, [pick(list("", "letting out a [pick(stank)] fart and"))] sliding a monster turd right into [t_His] mouth"
)
message = span_lewd("\The <b>[src]</b> [pick(hell)]")
visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
if(!is_fucking(target, GRINDING_FACE_WITH_ANUS))
set_is_fucking(target, GRINDING_FACE_WITH_ANUS, null)
handle_post_sex(LOW_LUST, null, src)
/mob/living/proc/do_crotchshit(mob/living/carbon/target)
var/message
var/t_His = target.p_their()
var/u_His = p_their()
var/genital_name = "crotch"
if(target.has_penis() == HAS_EXPOSED_GENITAL || target.has_strapon() == HAS_EXPOSED_GENITAL)
genital_name = target.get_penetrating_genital_name()
else if(target.has_vagina() == HAS_EXPOSED_GENITAL)
var/obj/item/organ/genital/vagina/genital = target.getorganslot(ORGAN_SLOT_VAGINA)
genital_name = genital.name
var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
var/jiggle = "[u_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "shitting", "noisy", "quaking", "musky", "messy", "shitcaked", "nasty")
var/list/hell = list(
"presses [u_His] [pick(stankhole)] [pick(asscheeks)] right against \the <b>[target]</b>'s crotch, unleashing pounds of warm crap all over [t_His] [genital_name] [prob(50) ? ". [jiggle]" : ""]",
"shoves [u_His][pick(list("", " [pick(stank)],"))] shitting [pick(ass)] into \the <b>[target]</b>'s thighs and coats everything in between them with [pick("", "gas and ")] slick slop",
"shits uncontrollably all over \the <b>[target]</b>'s [genital_name][prob(50) ? "" : ". [jiggle]"]"
)
message = span_lewd("\The <b>[src]</b> [pick(hell)]")
visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
playlewdinteractionsound(loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
var/obj/item/organ/genital/G = target.has_penis() == HAS_EXPOSED_GENITAL ? target.getorganslot(ORGAN_SLOT_PENIS) : (target.has_vagina() == HAS_EXPOSED_GENITAL ? target.getorganslot(ORGAN_SLOT_VAGINA) : null)
if(!target.is_fucking(src, CUM_TARGET_ANUS))
target.set_is_fucking(src, CUM_TARGET_ANUS, G)
if(!target.has_strapon() == HAS_EXPOSED_GENITAL)
target.handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, src, G)
handle_post_sex(NORMAL_LUST, null, target)
/mob/living/proc/do_shitfuck(mob/living/carbon/target)
var/message
var/t_He = target.p_they()
var/t_His = target.p_their()
var/u_His = p_their()
var/u_He = p_they()
var/genital_name = get_penetrating_genital_name()
var/list/hell
var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks")
var/list/ass = list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump")
var/jiggle = "[t_His] [pick(asscheeks)] [pick(list("jiggle", "bounce", "bounce around", "wobble"))] like crazy!"
var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "shitting", "noisy", "quaking", "musky", "messy", "shitcaked", "nasty")
if(is_fucking(target, CUM_TARGET_ANUS))
hell = list(
"thrusts in and out of \the <b>[target]</b>'s [pick(stank)] shit-lubed pucker, making it squeak and expulse heavy gases and waste.",
"pounds \the <b>[target]</b>'s ass. [t_He] just can't stop pumping out slop!",
"slams [u_His] hips up against \the <b>[target]</b>'s [pick(stankhole)] [pick(ass)] hard, causing a massive surge of manure from [t_His] [pick(list("crack", "canyon"))][prob(50) ? ". [jiggle]" : ""]",
"goes balls deep into \the <b>[target]</b>'s dirty [pick(ass)] over and over again. [u_His] [genital_name] comes completely coated brown from in between the bouncing [pick(asscheeks)]")
else
hell = list(
"can already smell the stench as [u_He] works [u_His] [genital_name] into \the <b>[target]</b>'s dung hole, being received by warm, wet and nasty feeling all over it.",
"grabs the base of [u_His] twitching [genital_name] and presses the tip into \the <b>[target]</b>'s asshole, immediately shoving it right into a fat and moist log",
"shoves [genital_name] deep inside of \the <b>[target]</b>'s [pick(ass)], [t_He] releases a massive amount of mush to greet the rod[pick("", ". [jiggle]")]")
set_is_fucking(target, CUM_TARGET_ANUS, getorganslot(ORGAN_SLOT_PENIS))
message = span_lewd("\The <b>[src]</b> [pick(hell)]")
visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE), ignored_mobs = get_unconsenting(unholy = TRUE))
playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 70, 1, -1)
playlewdinteractionsound(target.loc, pick('modular_sand/sound/interactions/bang1.ogg',
'modular_sand/sound/interactions/bang2.ogg',
'modular_sand/sound/interactions/bang3.ogg',
'modular_sand/sound/interactions/bang4.ogg',
'modular_sand/sound/interactions/bang5.ogg',
'modular_sand/sound/interactions/bang6.ogg'), 70, 1, -1)
if(can_penetrating_genital_cum())
handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, target, ORGAN_SLOT_PENIS)
target.handle_post_sex(NORMAL_LUST, null, src)
/mob/living/proc/suck_shit(mob/living/target)
var/message
var/list/hell
var/t_His = target.p_their()
var/u_His = p_their()
var/list/stank = list("greasy", "rancid", "pungent", "rotten", "boiling hot", "wet", "nose-burning", "heavy", "dense", "thick", "stinky", "stenchy", "warm")
var/list/stankhole = list("greasy", "stinky", "dirty", "gassy", "brapping", "noisy", "quaking", "musky")
if(is_fucking(target, GRINDING_FACE_WITH_ANUS))
hell = list(
"smooches and sucks \the <b>[target]</b>'s [pick(pick(stankhole) + " ", "")] pucker, gulping down a whole log of [pick(stank)] shit!",
"pierces \the <b>[target]</b>'s [pick(pick(stankhole) + " ", "")] butthole with [u_His] tongue, forcing them to evacuate a [pick(stank)] right down [u_His] throat!",
"sucks into \the <b>[target]</b>'s [pick(pick(stankhole) + " ", "")] asshole, gulping down [t_His] [pick(stank)] scat!"
)
else
hell = list(
"presses [u_His] face right into \the <b>[target]</b>'s [pick(list("musky ", "sweaty ", ""))] backside, spreading [t_His] shithole open to begin harvesting [t_His] [pick(stank) + " "] manure!",
"uses [u_His] lips to spread \the <b>[target]</b>'s [pick(stankhole) + " "] butthole, forcing him to take a massive dump on [u_His] mouth!"
)
set_is_fucking(target, GRINDING_FACE_WITH_ANUS, null)
message = span_lewd("\The <b>[src]</b> [pick(hell)]")
visible_message(message, ignored_mobs = get_unconsenting(unholy = TRUE))
playlewdinteractionsound(target.loc, pick(GLOB.brap_noises), 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
playlewdinteractionsound(target.loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1, ignored_mobs = get_unconsenting(unholy = TRUE))
target.handle_post_sex(NORMAL_LUST, null, src, ORGAN_SLOT_ANUS)
/mob/living/proc/piss_over(mob/living/target)
var/message
var/u_His = p_their()
@@ -793,134 +793,6 @@
. = ..()
interaction_flags |= INTERACTION_FLAG_UNHOLY_CONTENT
/datum/interaction/lewd/unholy/do_facefart
description = "Fart on their face."
required_from_target_exposed = NONE
required_from_target_unexposed = NONE
required_from_user_exposed = INTERACTION_REQUIRE_ANUS
required_from_user_unexposed = NONE
max_distance = 1
interaction_sound = null
write_log_target = "got facefarted by"
write_log_user = "farted on the face of"
/datum/interaction/lewd/unholy/do_facefart/display_interaction(mob/living/user, mob/living/target)
user.do_facefart(target)
/datum/interaction/lewd/unholy/do_crotchfart
description = "Fart on their crotch."
required_from_target_exposed = NONE
required_from_target_unexposed = NONE
required_from_user_exposed = INTERACTION_REQUIRE_ANUS
required_from_user_unexposed = NONE
max_distance = 1
interaction_sound = null
write_log_target = "got crotchfarted by"
write_log_user = "farted on the crotch of"
/datum/interaction/lewd/unholy/do_crotchfart/display_interaction(mob/living/user, mob/living/target)
user.do_crotchfart(target)
/datum/interaction/lewd/unholy/do_fartfuck
description = "Fuck their ass + fart."
required_from_target_exposed = INTERACTION_REQUIRE_ANUS
required_from_target_unexposed = NONE
required_from_user_exposed = INTERACTION_REQUIRE_PENIS
required_from_user_unexposed = NONE
max_distance = 1
interaction_sound = null
write_log_target = "got fartfucked by"
write_log_user = "fartfucked"
/datum/interaction/lewd/unholy/do_fartfuck/display_interaction(mob/living/user, mob/living/target)
user.do_fartfuck(target)
if(!(isclownjob(target) || isclownjob(user)))
return
if(prob(50) && isclownjob(target))
target.visible_message(span_lewd("\The <b>[target]</b>'s fun hole honks[pick(" loudly", "")]!"))
playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1)
/datum/interaction/lewd/unholy/suck_fart
description = "Suck the farts out of their asshole."
required_from_target_exposed = INTERACTION_REQUIRE_ANUS
required_from_target_unexposed = NONE
required_from_user_exposed = INTERACTION_REQUIRE_MOUTH
required_from_user_unexposed = NONE
max_distance = 1
interaction_sound = null
write_log_target = "got their farts sucked out by"
write_log_user = "sucked farts"
/datum/interaction/lewd/unholy/suck_fart/display_interaction(mob/living/user, mob/living/target)
user.suck_fart(target)
/datum/interaction/lewd/unholy/do_faceshit
description = "Shit on their face."
required_from_target_exposed = NONE
required_from_target_unexposed = NONE
required_from_user_exposed = INTERACTION_REQUIRE_ANUS
required_from_user_unexposed = NONE
max_distance = 1
interaction_sound = null
write_log_target = "got shat in the face by"
write_log_user = "shat in the face of"
/datum/interaction/lewd/unholy/do_faceshit/display_interaction(mob/living/user, mob/living/target)
user.do_faceshit(target)
/datum/interaction/lewd/unholy/do_crotchshit/
description = "Shit on their crotch."
required_from_target_exposed = NONE
required_from_target_unexposed = NONE
required_from_user_exposed = INTERACTION_REQUIRE_ANUS
required_from_user_unexposed = NONE
max_distance = 1
interaction_sound = null
write_log_target = "got shat on the croch by"
write_log_user = "shat on the crotch of"
/datum/interaction/lewd/unholy/do_crotchshit/display_interaction(mob/living/user, mob/living/target)
user.do_crotchshit(target)
/datum/interaction/lewd/unholy/do_shitfuck
description = "Fuck their ass + shit."
required_from_target_exposed = INTERACTION_REQUIRE_ANUS
required_from_target_unexposed = NONE
required_from_user_exposed = INTERACTION_REQUIRE_PENIS
required_from_user_unexposed = NONE
max_distance = 1
interaction_sound = null
write_log_target = "got shitfucked by"
write_log_user = "shitfucked"
/datum/interaction/lewd/unholy/do_shitfuck/display_interaction(mob/living/user, mob/living/target)
user.do_shitfuck(target)
if(!(isclownjob(target) || isclownjob(user)))
return
if(prob(50) && isclownjob(target))
target.visible_message(span_lewd("\The <b>[target]</b>'s fun hole honks[pick(" loudly", "")]!"))
playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1)
/datum/interaction/lewd/unholy/suck_shit
description = "Suck the shit out of their asshole."
required_from_target_exposed = INTERACTION_REQUIRE_ANUS
required_from_target_unexposed = NONE
required_from_user_exposed = INTERACTION_REQUIRE_MOUTH
required_from_user_unexposed = NONE
max_distance = 1
interaction_sound = null
write_log_target = "got their shit sucked out by"
write_log_user = "sucked shit"
/datum/interaction/lewd/unholy/suck_shit/display_interaction(mob/living/user, mob/living/target)
user.suck_shit(target)
/datum/interaction/lewd/unholy/piss_over
description = "Piss all over them."
required_from_user = INTERACTION_REQUIRE_BOTTOMLESS
+1 -1
View File
@@ -282,7 +282,7 @@
H.adjustFireLoss(-0.25, forced = TRUE, only_organic = FALSE)
/* Doesn't heal robotic toxin damage (only_organic = FALSE not needed for tox),
another adjustToxLoss check with toxins_type = TOX_SYSCORRUPT,
(or just adding TOX_OMNI to the already existing one) could be added to heal robotic corruption,
(or just adding TOX_OMNI to the already existing one) could be added to heal robotic corruption,
but would make robotic species unbalanced.
*/
else if (H.getToxLoss() <= 90)
@@ -120,3 +120,7 @@
path = /obj/item/clothing/suit/invisijacket
subcategory = LOADOUT_SUBCATEGORY_SUIT_JACKETS
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
/datum/gear/suit/suspenders
name = "Suspenders"
path = /obj/item/clothing/suit/suspenders
@@ -129,17 +129,8 @@
if(tearSlot(M, ITEM_SLOT_MASK))
return
// 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)
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
I.display_interaction(src, M)
/mob/living/simple_animal/hostile/deathclaw/funclaw/cum(mob/living/M)
@@ -138,17 +138,8 @@
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)
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
I.display_interaction(src, M)
/mob/living/simple_animal/hostile/werewolf/funwolf/cum(mob/living/M)
@@ -351,17 +342,8 @@
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)
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
I.display_interaction(src, M)
/mob/living/simple_animal/hostile/ice_wolf/funwolf/cum(mob/living/M)
@@ -565,17 +547,8 @@
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)
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
I.display_interaction(src, M)
/mob/living/simple_animal/hostile/hellhound/funwolf/cum(mob/living/M)
@@ -779,17 +752,8 @@
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)
I = SSinteractions.interactions["/datum/interaction/lewd/throatfuck"]
I.display_interaction(src, M)
/mob/living/simple_animal/hostile/the_mosley/funwolf/cum(mob/living/M)
@@ -1,134 +0,0 @@
/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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 148 KiB