Removes N.2 unholy ERP verbs. Add: new textures for doors and floors.
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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 ###
|
||||
|
||||
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 16 KiB |
|
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
|
||||
|
||||
@@ -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
|
||||
|
Before Width: | Height: | Size: 197 KiB After Width: | Height: | Size: 148 KiB |