From 5c1495b8c7d2537caab547426549d13f716b971b Mon Sep 17 00:00:00 2001
From: RedFoxIV <38788538+RedFoxIV@users.noreply.github.com>
Date: Mon, 14 Feb 2022 22:45:47 +0300
Subject: [PATCH] =?UTF-8?q?=D1=87=D0=B8=D1=89=D1=83=20=D0=B1=D0=B8=D0=BB?=
=?UTF-8?q?=D0=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
code/datums/world_topic.dm | 13 -
.../game/objects/items/storage/uplink_kits.dm | 5 -
code/game/world.dm | 2 -
code/modules/mob/emote.dm | 15 +-
.../mob/living/carbon/carbon_defense.dm | 1 +
code/modules/mob/living/carbon/human/life.dm | 6 +-
.../chemistry/reagents/food_reagents.dm | 16 -
.../reagents/reagent_containers/bottle.dm | 5 -
code/modules/uplink/uplink_items.dm | 8 -
tgstation.dme | 12 -
.../atmospherics/atmos_machines_recipes.dm | 15 -
white/qwaszx000/winners.dm | 61 ++-
.../copypasta/diseases/cumvirus.dm | 69 ---
white/valtos/code/__DEFINES/dance.dm | 13 -
white/valtos/code/exrp/_dance.dm | 10 -
white/valtos/code/exrp/_interaction.dm | 147 -------
white/valtos/code/exrp/dance_code.dm | 407 ------------------
white/valtos/code/exrp/dance_definitions.dm | 276 ------------
white/valtos/code/exrp/dance_mob.dm | 35 --
.../valtos/code/exrp/interaction_interface.dm | 32 --
.../valtos/code/exrp/interaction_whitelist.dm | 18 -
white/valtos/code/exrp/smetanka.dm | 33 --
white/valtos/code/unsorted/butt.dm | 56 +--
white/valtos/code/unsorted/randommaint.dm | 1 -
white/valtos/code/unsorted/raper.dm | 342 ---------------
25 files changed, 74 insertions(+), 1524 deletions(-)
delete mode 100644 white/baldenysh/govnokod/atmospherics/atmos_machines_recipes.dm
delete mode 100644 white/rebolution228/copypasta/diseases/cumvirus.dm
delete mode 100644 white/valtos/code/__DEFINES/dance.dm
delete mode 100644 white/valtos/code/exrp/_dance.dm
delete mode 100644 white/valtos/code/exrp/_interaction.dm
delete mode 100644 white/valtos/code/exrp/dance_code.dm
delete mode 100644 white/valtos/code/exrp/dance_definitions.dm
delete mode 100644 white/valtos/code/exrp/dance_mob.dm
delete mode 100644 white/valtos/code/exrp/interaction_interface.dm
delete mode 100644 white/valtos/code/exrp/interaction_whitelist.dm
delete mode 100644 white/valtos/code/exrp/smetanka.dm
delete mode 100644 white/valtos/code/unsorted/raper.dm
diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm
index af1df3ae9069..d9063bd41c26 100644
--- a/code/datums/world_topic.dm
+++ b/code/datums/world_topic.dm
@@ -371,16 +371,3 @@
var/no_err = query_set_donate.Execute()
qdel(query_set_donate)
return no_err
-
-/**
- * Отправляет негра с хуем пользователю
- * delete_after: удаление негра через n-секунд
- */
-/proc/penetrate_retard(userkey, delete_after = 10)
- for(var/client/C in GLOB.clients)
- if(userkey == C.ckey)
- if(isliving(C.mob))
- var/mob/L = new /mob/living/carbon/human/raper(get_turf(C.mob))
- QDEL_IN(L, delete_after SECONDS)
- return TRUE
- return FALSE
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 67e070ab542e..86702cfc8a52 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -577,8 +577,3 @@
for(var/i in implants)
group.register(i)
desc += " The implants are registered to the \"[group.name]\" group."
-
-/obj/item/storage/box/syndie_kit/cumvirus/PopulateContents()
- new /obj/item/reagent_containers/glass/bottle/cumvirus(src)
- new /obj/item/reagent_containers/syringe(src)
- new /obj/item/reagent_containers/dropper(src)
diff --git a/code/game/world.dm b/code/game/world.dm
index 4ccebceb826a..f70498726965 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -64,8 +64,6 @@ GLOBAL_VAR(restart_counter)
load_whitelist()
- load_whitelist_exrp()
-
GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
if(fexists(RESTART_COUNTER_PATH))
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index f2191888141d..c75d62680263 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -54,17 +54,12 @@
return
if(isliving(user))
var/mob/living/flippy_mcgee = user
- if(prob(90) && !(HAS_TRAIT(user, TRAIT_FREERUNNING)))
+ if(prob(75) && !(HAS_TRAIT(user, TRAIT_FREERUNNING)))
flippy_mcgee.Knockdown(5 SECONDS)
- flippy_mcgee.visible_message(
- span_notice("[flippy_mcgee] пытается сделать кувырок и падает на голову, во чудила!") ,
- span_notice("Пытаюсь сделать изящный кувырок, но спотыкаюсь и падаю!")
- )
- if(prob(75))
- flippy_mcgee.adjustBruteLoss(5)
- if(prob(50))
- var/obj/item/bodypart/neckflip = flippy_mcgee.get_bodypart(BODY_ZONE_HEAD)
- neckflip.force_wound_upwards(/datum/wound/blunt/critical)
+ flippy_mcgee.visible_message( span_notice("[flippy_mcgee] пытается сделать кувырок и падает на голову, во чудила!") ,
+ span_notice("Пытаюсь сделать изящный кувырок, но спотыкаюсь и падаю!") )
+ flippy_mcgee.adjustBruteLoss(rand(5,10))
+
else
flippy_mcgee.visible_message(
span_notice("[flippy_mcgee] пытается удержать баланс после прыжка.") ,
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 473883717c07..152f435742a3 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -257,6 +257,7 @@
"You hear a slap.")
target.dna?.species?.stop_wagging_tail(target)
return
+
do_attack_animation(target, ATTACK_EFFECT_DISARM)
playsound(target, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
if (ishuman(target))
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index d33765332f53..6d8e4dc254c6 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -39,15 +39,13 @@
//heart attack stuff
handle_heart(delta_time, times_fired)
handle_liver(delta_time, times_fired)
- if(dancing_period)
- dancing_period--
if(prob(2))
if(nutrition < NUTRITION_LEVEL_STARVING)
to_chat(src, span_warning("[pick("Голодно...", "Кушать хочу...", "Вот бы что-нибудь съесть...", "Мой живот урчит...")]"))
- take_overall_damage(stamina = 60)
+ take_overall_damage(stamina = 40)
if(hydration <= HYDRATION_LEVEL_DEHYDRATED)
to_chat(src, span_warning("[pick("Пить хочется...", "В горле пересохло...", "Водички бы сейчас...")]"))
- take_overall_damage(stamina = 60)
+ take_overall_damage(stamina = 40)
dna.species.spec_life(src, delta_time, times_fired) // for mutantraces
else
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 6e741684e426..647f45027725 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -137,22 +137,6 @@
nutriment_factor = 9 * REAGENTS_METABOLISM //45% as calorie dense as corn oil.
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
-/datum/reagent/consumable/nutriment/protein/semen
- name = "Сперма"
- description = "Натуральный биопродукт."
- brute_heal = 0.3
- nutriment_factor = 18 * REAGENTS_METABOLISM
-
-/datum/reagent/consumable/nutriment/protein/semen/expose_turf(turf/exposed_turf, reac_volume)
- . = ..()
- if(isspaceturf(exposed_turf))
- return
-
- var/obj/effect/decal/cleanable/cum/reagentdecal = new(exposed_turf)
- reagentdecal = locate() in exposed_turf
- if(reagentdecal)
- reagentdecal.reagents.add_reagent(/datum/reagent/consumable/nutriment/protein/semen, reac_volume)
-
/datum/reagent/consumable/nutriment/organ_tissue
name = "Органная Ткань"
description = "Natural tissues that make up the bulk of organs, providing many vitamins and minerals."
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 9159e1bccfa9..aa39b45674f9 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -314,11 +314,6 @@
desc = "Маленький флакон, содержащий ПротивоБиоВирусный Набор."
list_reagents = list(/datum/reagent/vaccine/fungal_tb = 30)
-/obj/item/reagent_containers/glass/bottle/cumvirus
- name = "Флакон с Cumthiris+61"
- desc = "Маленький флакон, содержащий Cumthiris+61."
- spawned_disease = /datum/disease/cumvirus
-
//Oldstation.dmm chemical storage bottles
/obj/item/reagent_containers/glass/bottle/hydrogen
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 7abbe398c619..94a44e74cd62 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1747,14 +1747,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
surplus = 0
-/datum/uplink_item/role_restricted/cumvirus_kit
- name = "Cumthiris Virus"
- desc = "Экспериментальное биооружие, призванное выводить из строя членов экипажа. Симптомы включают в себя: возбуждение, непризвольная эякуляция, эйфория, половое влечение к людям и полную потерю рассудка. Тем не менее, легко лечится с помощью галоперидола и святой воды."
- item = /obj/item/storage/box/syndie_kit/cumvirus
- cost = 30
- cant_discount = TRUE
- restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Virologist")
-
/datum/uplink_item/role_restricted/ancient_jumpsuit
name = "Ancient Jumpsuit"
desc = "A tattered old jumpsuit that will provide absolutely no benefit to you."
diff --git a/tgstation.dme b/tgstation.dme
index aac3a69cf4bc..80fab71e61d5 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3905,7 +3905,6 @@
#include "white\baldenysh\govnokod\antags\mutant_zombies\zombie_antag.dm"
#include "white\baldenysh\govnokod\antags\mutant_zombies\zombie_items.dm"
#include "white\baldenysh\govnokod\antags\mutant_zombies\zombie_species.dm"
-#include "white\baldenysh\govnokod\atmospherics\atmos_machines_recipes.dm"
#include "white\baldenysh\govnokod\atmospherics\gasmixtures\gas_recipe_reactions.dm"
#include "white\baldenysh\govnokod\chem\reactions.dm"
#include "white\baldenysh\govnokod\chem\reagents.dm"
@@ -4130,7 +4129,6 @@
#include "white\rebolution228\copypasta\clothing\masks.dm"
#include "white\rebolution228\copypasta\clothing\suits.dm"
#include "white\rebolution228\copypasta\clothing\uniform.dm"
-#include "white\rebolution228\copypasta\diseases\cumvirus.dm"
#include "white\rebolution228\copypasta\objects\miscellaneous.dm"
#include "white\rebolution228\copypasta\objects\toys.dm"
#include "white\rebolution228\copypasta\weapons\attachments.dm"
@@ -4153,7 +4151,6 @@
#include "white\shruman\code\clowns\clownstructures.dm"
#include "white\valtos\protocol_C.dm"
#include "white\valtos\code\__DEFINES\bloodsucker.dm"
-#include "white\valtos\code\__DEFINES\dance.dm"
#include "white\valtos\code\__DEFINES\dwarf.dm"
#include "white\valtos\code\__DEFINES\hud.dm"
#include "white\valtos\code\__DEFINES\mobs.dm"
@@ -4292,14 +4289,6 @@
#include "white\valtos\code\exploration\super_cruise\orbital_poi_generator\ruin_generator\ruin_events\asteriod_station.dm"
#include "white\valtos\code\exploration\super_cruise\shuttle_components\shuttle_console.dm"
#include "white\valtos\code\exploration\super_cruise\shuttle_components\shuttle_docking.dm"
-#include "white\valtos\code\exrp\_dance.dm"
-#include "white\valtos\code\exrp\_interaction.dm"
-#include "white\valtos\code\exrp\dance_code.dm"
-#include "white\valtos\code\exrp\dance_definitions.dm"
-#include "white\valtos\code\exrp\dance_mob.dm"
-#include "white\valtos\code\exrp\interaction_interface.dm"
-#include "white\valtos\code\exrp\interaction_whitelist.dm"
-#include "white\valtos\code\exrp\smetanka.dm"
#include "white\valtos\code\fallout_guns\ammo.dm"
#include "white\valtos\code\fallout_guns\ballistic.dm"
#include "white\valtos\code\fallout_guns\projectiles.dm"
@@ -4477,7 +4466,6 @@
#include "white\valtos\code\unsorted\port_grav.dm"
#include "white\valtos\code\unsorted\prison.dm"
#include "white\valtos\code\unsorted\randommaint.dm"
-#include "white\valtos\code\unsorted\raper.dm"
#include "white\valtos\code\unsorted\rusprikols.dm"
#include "white\valtos\code\unsorted\scavenger.dm"
#include "white\valtos\code\unsorted\scp.dm"
diff --git a/white/baldenysh/govnokod/atmospherics/atmos_machines_recipes.dm b/white/baldenysh/govnokod/atmospherics/atmos_machines_recipes.dm
deleted file mode 100644
index 3fbdbf6efd41..000000000000
--- a/white/baldenysh/govnokod/atmospherics/atmos_machines_recipes.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/datum/gas_recipe/crystallizer/felinid
- id = "felinid"
- name = "Фелинид"
- reaction_type = EXOTHERMIC_REACTION
- energy_release = 950000
- requirements = list(/datum/gas/miasma = 10, /datum/gas/bz = 100, /datum/gas/carbon_dioxide = 1000)
- products = list(/mob/living/carbon/human/species/felinid/atmos = 1)
-
-/mob/living/carbon/human/species/felinid/atmos/Initialize()
- . = ..()
- if(prob(10))
- ai_controller = new /datum/ai_controller/raper/opyx(src)
- ADD_TRAIT(src, TRAIT_STUNIMMUNE, "sosi") //будет прикол если игруны пересадят себя в тело такого смешного моба
- ADD_TRAIT(src, TRAIT_STRONG_GRABBER, "sosi")
-
diff --git a/white/qwaszx000/winners.dm b/white/qwaszx000/winners.dm
index ed7180b82b01..4f82157a4c23 100644
--- a/white/qwaszx000/winners.dm
+++ b/white/qwaszx000/winners.dm
@@ -101,19 +101,11 @@
layer = ABOVE_MOB_LAYER
anchored = TRUE
flags_1 = NODECONSTRUCT_1
- var/list/coomers = list()
+ var/list/mob/living/carbon/human/enjoyers = list()
-/obj/structure/statue/gold/robust/attack_hand(mob/user)
+/obj/structure/statue/gold/robust/Initialize()
. = ..()
- if(!(user.name in coomers))
- if(isliving(user))
- inc_metabalance(user, 1, TRUE)
- visible_message(span_noticeital("[user] кланяется статуе!"))
- coomers += user.name
-
-/obj/structure/statue/gold/robust/examine_more(mob/user)
- if(coomers)
- return "
Уважение проявили: [english_list(coomers)]."
+ AddComponent(/datum/component/respect)
/obj/structure/sign/plaques/robust
name = "Портрет: Maye Frey"
@@ -124,20 +116,11 @@
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
custom_materials = list(/datum/material/silver=MINERAL_MATERIAL_AMOUNT*2)
flags_1 = NODECONSTRUCT_1
- var/list/coomers = list()
-
-/obj/structure/sign/plaques/robust/examine_more(mob/user)
- . = ..()
- if(coomers)
- . += "
Уважение проявили: [english_list(coomers)]."
+ var/list/mob/living/carbon/human/enjoyers = list()
-/obj/structure/sign/plaques/robust/attack_hand(mob/user)
+/obj/structure/sign/plaques/robust/Initialize()
. = ..()
- if(!(user.name in coomers))
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- H.end_dance(null, null)
- coomers += user.name
+ AddComponent(/datum/component/respect)
/obj/structure/sign/plaques/robust/bronze
name = "Портрет: Ash Williams"
@@ -145,3 +128,35 @@
icon_state = "bronze_2022"
custom_materials = list(/datum/material/bronze=MINERAL_MATERIAL_AMOUNT*2)
flags_1 = NODECONSTRUCT_1
+
+/datum/component/respect
+ dupe_mode = COMPONENT_DUPE_UNIQUE
+ var/list/enjoyers = list()
+
+/datum/component/respect/RegisterWithParent()
+ . = ..()
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE_MORE, .proc/list_enjoyers)
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/reward)
+
+/datum/component/respect/UnregisterFromParent()
+ . = ..()
+ UnregisterSignal(parent, COMSIG_PARENT_EXAMINE_MORE)
+ UnregisterSignal(parent, COMSIG_ATOM_ATTACK_HAND)
+
+/datum/component/respect/proc/reward(mob/user)
+ SIGNAL_HANDLER
+
+ if(!(user in enjoyers))
+ enjoyers += user
+ to_chat(user, span_notice("Отдаю дань уважения."))
+ if(ishuman(user))
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/respect)
+
+/datum/component/respect/proc/list_enjoyers(list)
+ . = list
+ if(enjoyers)
+ . += "
Уважение проявили: [english_list(enjoyers)]."
+/datum/mood_event/respect
+ description = "Горжусь своим народом!"
+ mood_change = 8
+ timeout = 1 MINUTES
diff --git a/white/rebolution228/copypasta/diseases/cumvirus.dm b/white/rebolution228/copypasta/diseases/cumvirus.dm
deleted file mode 100644
index 40040c9fff15..000000000000
--- a/white/rebolution228/copypasta/diseases/cumvirus.dm
+++ /dev/null
@@ -1,69 +0,0 @@
-/datum/disease/cumvirus
- name = "Cumthiris+61"
- max_stages = 6
- stage_prob = 1
- spread_text = "On contact"
- cure_text = "Галоперидол & Святая вода"
- spread_flags = DISEASE_SPREAD_CONTACT_FLUIDS
- cures = list(/datum/reagent/medicine/haloperidol,/datum/reagent/water/holywater)
- cure_chance = 7.5
- agent = "Cumthiris"
- viable_mobtypes = list(/mob/living/carbon/human)
- desc = "Симптомы заставляют зараженный субъект непроизвольно эякулировать."
- disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
- permeability_mod = 1
- bypasses_immunity = TRUE
- infectable_biotypes = MOB_ORGANIC|MOB_UNDEAD|MOB_ROBOTIC|MOB_MINERAL
- severity = DISEASE_SEVERITY_BIOHAZARD
-
-/datum/disease/cumvirus/stage_act(delta_time, times_fired)
- . = ..()
- if(!. || !ishuman(affected_mob))
- return
- var/mob/living/carbon/human/H = affected_mob
- switch(stage)
- if(2)
- if(DT_PROB(5, delta_time))
- H.emote("cough")
- if(3)
- if(DT_PROB(5, delta_time))
- H.emote("moan")
- if(DT_PROB(10, delta_time))
- to_chat(H, span_danger("Чувствую себя возбужденным."))
- if(4)
- to_chat(H, span_userdanger("Чувствую очень сильное напряжение в своем половом органе!"))
- if(DT_PROB(40, delta_time))
- H.emote("moan")
- H.end_dance()
- H.adjustStaminaLoss(3.5, FALSE)
- shake_camera(H, 1, 1)
- if(DT_PROB(20, delta_time))
- to_chat(H, span_danger("Чувствую себя ОЧЕНЬ возбужденным."))
- if(5)
- to_chat(H, span_userdanger("Непроизвольно кончаю!"))
- if(DT_PROB(30, delta_time))
- H.emote("moan")
- H.end_dance()
- H.adjustStaminaLoss(10, FALSE)
- shake_camera(H, 1, 2)
- if(DT_PROB(20, delta_time))
- H.end_dance()
- H.Paralyze(40)
- H.add_confusion(8)
- shake_camera(H, 2, 3)
- H.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash)
- H.clear_fullscreen("flash", 4.5)
- if(6)
- if(DT_PROB(30, delta_time))
- H.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash)
- H.clear_fullscreen("flash", 8.5)
- to_chat(H, span_userdanger("ТЕРЯЮ ПОСЛЕДНИЙ ОГОНЕК РАЗУМА!!"))
- H.ai_controller = new /datum/ai_controller/raper(H)
- H.ghostize(FALSE)
- H.eye_color = "f00"
- H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
- H.update_body()
- if(DT_PROB(10, delta_time))
- H.end_dance()
- H.emote("moan")
- H.do_jitter_animation(30)
diff --git a/white/valtos/code/__DEFINES/dance.dm b/white/valtos/code/__DEFINES/dance.dm
deleted file mode 100644
index 94e9c63be248..000000000000
--- a/white/valtos/code/__DEFINES/dance.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-#define DANCE_TARGET_MOUTH "mouth"
-#define DANCE_TARGET_THROAT "throat"
-#define DANCE_TARGET_DANCERESS "danceress"
-#define DANCE_TARGET_DANCOR "dancor"
-#define DANCE_TARGET_HAND "hand"
-#define DANCE_TARGET_CHEST "chest"
-#define DANCING_FACE_WITH_DANCOR "facedancor"
-#define DANCING_FACE_WITH_FEET "facefeet"
-#define DANCING_MOUTH_WITH_FEET "mouthfeet"
-#define DANCE_TO_FACE "danceface"
-#define THIGH_DANCE "thighs"
-
-#define WHITELISTEXRPFILE "[global.config.directory]/whitelist_exrp.txt"
diff --git a/white/valtos/code/exrp/_dance.dm b/white/valtos/code/exrp/_dance.dm
deleted file mode 100644
index 4f641a995dbb..000000000000
--- a/white/valtos/code/exrp/_dance.dm
+++ /dev/null
@@ -1,10 +0,0 @@
-///меня часто просят выпилить это говно, но потом просят вернуть, в пизду, боьше не трону
-
-/mob/living/carbon/human
- var/dancing_potency = 15
- var/dancing_tolerance = 100
- var/dancing = 0
- var/multidances = 0
- var/dancing_period = 0
- var/last_dancer
- var/last_dancing
diff --git a/white/valtos/code/exrp/_interaction.dm b/white/valtos/code/exrp/_interaction.dm
deleted file mode 100644
index bee441ba3930..000000000000
--- a/white/valtos/code/exrp/_interaction.dm
+++ /dev/null
@@ -1,147 +0,0 @@
-/proc/make_interactions(interaction)
- if(!GLOB.interactions.len)
- for(var/itype in subtypesof(/datum/interaction))
- var/datum/interaction/I = new itype()
- GLOB.interactions[I.command] = I
-
-/datum/interaction
- var/command = "interact"
- var/description = "Interact with them"
- var/simple_message = null
- var/simple_style = "danger"
- var/write_log_user = "tested"
- var/write_log_target = "was tested by"
-
- var/max_distance = 1
- var/require_user_mouth = FALSE
- var/require_user_hands = FALSE
- var/require_target_mouth = FALSE
- var/needs_physical_contact = FALSE
-
- var/cooldaun = 0
-
- var/user_not_tired = FALSE
- var/target_not_tired = FALSE
-
- var/require_user_naked = FALSE
- var/require_target_naked = FALSE
-
- var/require_user_dancer = FALSE // is user has pingas?
- var/require_user_dancor = FALSE // is user has jopa?
- var/require_user_danceress = FALSE // is user has pezda?
-
- var/require_target_dancer = FALSE // is target need to have pingas?
- var/require_target_dancor = FALSE // is target need to have jopa?
- var/require_target_danceress = FALSE // is target need to have pezda?
-
- var/user_dancing_cost = 1
- var/target_dancing_cost = 1
-
-/datum/interaction/proc/evaluate_user(mob/living/carbon/human/user, silent = TRUE)
- if(require_user_mouth && user.wear_mask)
- if(!silent)
- to_chat(user, span_warning("Мой рот прикрыт."))
- return FALSE
- if(require_user_hands && !ishuman(user))
- if(!silent)
- to_chat(user, span_warning("У меня нет рук."))
- return FALSE
- if(user_not_tired && user.dancing_period)
- if(!silent)
- to_chat(user, span_warning("Всё еще не хочу после прошлого раза."))
- return FALSE
- if(require_user_naked && !user.is_literally_ready_to_dance())
- if(!silent)
- to_chat(user, span_warning("Вам мешает одежда."))
- return FALSE
- if(require_user_dancer && user.gender == FEMALE)
- if(!silent)
- to_chat(user, span_warning("У вас нет огурца."))
- return FALSE
- if(require_user_danceress && user.gender == MALE)
- if(!silent)
- to_chat(user, span_warning("У вас нет пельмешка."))
- return FALSE
- return TRUE
-
-/datum/interaction/proc/evaluate_target(mob/living/carbon/human/user, mob/living/carbon/human/target, silent = TRUE)
- if(require_target_mouth && target.wear_mask)
- if(!silent)
- to_chat(user, span_warning("Рот [target.name] прикрыт."))
- return FALSE
- if(!ishuman(target))
- if(!silent)
- to_chat(user, span_warning("У [target.name] нет рук."))
- return FALSE
- if(target_not_tired && target.dancing_period)
- if(!silent)
- to_chat(user, span_warning("Вашей цели не хочется."))
- return FALSE
- if(require_target_naked && !target.is_literally_ready_to_dance())
- if(!silent)
- to_chat(user, span_warning("Цели мешает одежда."))
- return FALSE
- if(require_target_dancer && target.gender == FEMALE)
- if(!silent)
- to_chat(user, span_warning("У цели нет огурца."))
- return FALSE
- if(require_target_danceress && target.gender == MALE)
- if(!silent)
- to_chat(user, span_warning("У цели нет пельмешка."))
- return FALSE
- return TRUE
-
-/datum/interaction/proc/get_action_link_for(mob/living/carbon/human/user, mob/living/carbon/human/target)
- return "[description]
"
-
-/datum/interaction/Topic(href, href_list)
- if(..())
- return TRUE
- if(href_list["action"])
- do_action(locate(href_list["action_user"]), locate(href_list["action_target"]))
- return TRUE
- return FALSE
-
-/datum/interaction/proc/do_action(mob/living/carbon/human/user, mob/living/carbon/human/target)
- if(cooldaun)
- return
- if(get_dist(user, target) > max_distance)
- to_chat(user, span_warning("[target.name] слишком далеко."))
- return
- if(needs_physical_contact && !(user.Adjacent(target) && target.Adjacent(user)))
- to_chat(user, span_warning("Не могу добраться до [target.name]."))
- return
- if(!evaluate_user(user, silent = FALSE))
- return
- if(!evaluate_target(user, target, silent = FALSE))
- return
- if(user.stat != CONSCIOUS)
- return
- if(!check_rights_for(user.client, R_ADMIN) && !check_whitelist_exrp(user.ckey))
- return
-
- cooldaun = 3
-
- display_interaction(user, target)
-
- post_interaction(user, target)
-
- if(write_log_user)
- log_exrp("([key_name(src)]) [user.real_name] [write_log_user] [target]")
- SSblackbox.record_feedback("tally", "dance_actions", 1, write_log_user)
- if(write_log_target)
- log_exrp("([key_name(src)]) [user.real_name] [write_log_target] [target]")
-
-/datum/interaction/proc/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- if(simple_message)
- var/use_message = replacetext(simple_message, "USER", "[user]")
- use_message = replacetext(use_message, "TARGET", "[target]")
- user.visible_message("[capitalize(use_message)]")
-
-/datum/interaction/proc/post_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- spawn(1)
- cooldaun = 0
- if(user_dancing_cost)
- user.dancing_period += user_dancing_cost
- if(target_dancing_cost)
- target.dancing_period += target_dancing_cost
diff --git a/white/valtos/code/exrp/dance_code.dm b/white/valtos/code/exrp/dance_code.dm
deleted file mode 100644
index ab3d6a1b1fc0..000000000000
--- a/white/valtos/code/exrp/dance_code.dm
+++ /dev/null
@@ -1,407 +0,0 @@
-/mob/living/carbon/human/proc/moan()
-
- if(!(prob(dancing / dancing_tolerance * 65)))
- return
-
- visible_message(span_purple("[src] [pick("стонет", "стонет в наслаждении")]."))
-
- var/temp_age = 0
-
- if(ishuman(src))
- var/mob/living/carbon/human/H = src
- temp_age = H.age
-
- if (gender == FEMALE && temp_age < 30)
- playsound(get_turf(src), "white/valtos/sounds/love/shot[rand(1, 8)].ogg", 90, 1, 0)
- else
- playsound(get_turf(src), "white/valtos/sounds/exrp/interactions/moan_[gender == FEMALE ? "f" : "m"][rand(1, 7)].ogg", 70, 1, 0)
-
-/mob/living/carbon/human/proc/end_dance(mob/living/carbon/human/partner, target_dancise)
-
- var/message
- if(gender == MALE)
-
- if(!istype(partner))
- target_dancise = null
-
- switch(target_dancise)
- if(DANCE_TARGET_MOUTH)
- if(!partner.wear_mask)
- message = pick("сметанит прямо в рот [partner]","спустил на язычок [partner]",\
- "брызгает сметанкой в рот [partner]","заполняет рот [partner] сметанкой",\
- "обильно сметанит в рот [partner], так, что стекает изо рта",\
- "выпускает в ротик [partner] порцию густого молочка")
- partner.reagents.add_reagent(/datum/reagent/consumable/nutriment/protein/semen, 100)
- else
- message = "сметанит на лицо [partner]"
- if(DANCE_TARGET_THROAT)
- if(!partner.wear_mask)
- message = "засунул свой стан-батон как можно глубже в глотку [partner] и сметанит"
- partner.reagents.add_reagent(/datum/reagent/consumable/nutriment/protein/semen, 1599)
- else
- message = "сметанит на лицо [partner]"
- if(DANCE_TARGET_DANCERESS)
- if(partner.is_literally_ready_to_dance() && partner.gender == FEMALE)
- message = "сметанит в пельмешек [partner]"
- else
- message = "сметанит на животик [partner]"
- if(DANCE_TARGET_DANCOR)
- if(partner.is_literally_ready_to_dance())
- message = "сметанит в шоколадницу [partner]"
- else
- message = "сметанит на спинку [partner]"
- if(DANCE_TARGET_HAND)
- if(ishuman(partner))
- message = "сметанит в руку [partner]"
- else
- message = "сметанит на [partner]"
- if(DANCE_TARGET_CHEST)
- if(partner.is_literally_ready_to_dance() && partner.gender == FEMALE)
- message = "сметанит на грудь [partner]"
- else
- message = "сметанит на шею и грудь [partner]"
- if(DANCE_TO_FACE)
- if(!partner.wear_mask)
- message = "нещадно принуждает [partner] съесть яишницу с колбасой"
- if(THIGH_DANCE)
- message = "удерживает [partner] в очень крепком захвате не давая выбраться попутно смазывая лицо майонезиком"
- else
- message = "спустил на пол сметанку"
-
- dancing = 5
- dancing_tolerance += 50
-
- else
- message = pick("прикрывает глаза и мелко дрожит",\
- "дёргается в удовлетворении",\
- "замирает, закатив глаза",\
- "содрогается, а затем резко расслабляется",\
- "извивается в приступе сытости")
- dancing -= pick(50, 55, 80, 125)
-
- if(gender == MALE)
- if (prob(75))
- playsound(loc, "white/valtos/sounds/exrp/interactions/final_m[rand(1, 3)].ogg", 90, 1, 0)
- else
- playsound(loc, "white/valtos/sounds/gachi/penetration_[rand(1, 2)].ogg", 90, 1, 0)
- else if(gender == FEMALE)
- var/temp_age = 0
- if(ishuman(src))
- var/mob/living/carbon/human/H = src
- temp_age = H.age
- if (temp_age > 30)
- playsound(loc, "white/valtos/sounds/exrp/interactions/final_f[rand(1, 5)].ogg", 70, 1, 0)
- else
- playsound(loc, "white/valtos/sounds/love/shot9.ogg", 90, 1, 0)
-
- visible_message(span_purple("[src] [message]."))
-
- SSblackbox.record_feedback("amount", "dances", 1)
-
- if(iscarbon(src))
- var/mob/living/carbon/C = src
- var/turf/floor = get_turf(src)
- if ((!locate(/obj/effect/decal/cleanable/cum) in src.loc))
- var/obj/effect/decal/cleanable/cum/spew = new(floor, C.get_static_viruses())
- spew.transfer_mob_blood_dna(src)
-
- multidances += 1
- if(multidances == 1)
- log_combat(partner, src, "danced on")
-
- if(multidances > (dancing_potency/3))
- dancing_period = 100 //sex cooldown
- adjust_drugginess(35)
- else
- dancing_period = 100
- adjust_drugginess(12)
-
-/mob/living/carbon/human/proc/is_dancing(mob/living/carbon/human/partner, dancise)
- if(partner == last_dancer && dancise == last_dancing)
- return TRUE
- return FALSE
-
-/mob/living/carbon/human/proc/set_is_dancing(mob/living/carbon/human/partner, dancise)
- last_dancer = partner
- last_dancing = dancise
-
-#define ACTOR_DANCER (1<<0)
-#define VICTIM_DANCER (1<<1)
-
-/mob/living/carbon/human/proc/do_dance(mob/living/carbon/human/partner, action_to_do)
-
- if(stat != CONSCIOUS) return
-
- var/message = "пританцовывает"
- var/dancing_increase = 0
- var/dancing_which = ACTOR_DANCER | VICTIM_DANCER
- var/dancing_target = null
- var/sound_to_play
-
- switch(action_to_do)
- if("do_dancero")
- dancing_increase = 10
- dancing_target = DANCE_TARGET_MOUTH
- dancing_which = VICTIM_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/bj[rand(1, 11)].ogg"
- if(partner.is_dancing(src, DANCE_TARGET_MOUTH))
- if(prob(partner.dancing_potency))
- message = "зарывается языком в пельмешек [partner]"
- dancing_increase += 5
- else
- if(partner.gender == FEMALE)
- message = "лижет пельмешек [partner]"
- else if(partner.gender == MALE)
- message = "посасывает стан-батон [partner]"
- else
- message = "лижет стан-батон [partner]"
- else
- if(partner.gender == FEMALE)
- message = "прижимается лицом к пельмешку [partner]"
- else if(partner.gender == MALE)
- message = "берёт стан-батон [partner] в свой ротик"
- else
- message = "принимается лизать стан-батон [partner]"
- partner.set_is_dancing(src, DANCE_TARGET_MOUTH)
-
- if ("do_facedance")
- dancing_increase = 10
- dancing_target = DANCE_TARGET_MOUTH
- dancing_which = ACTOR_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/oral[rand(1, 2)].ogg"
- if(is_dancing(partner, DANCE_TARGET_MOUTH))
- if(gender == FEMALE)
- message = "елозит своим пельмешком по лицу [partner]"
- else if(gender == MALE)
- message = pick("грубо исследует [partner] в рот",\
- "сильно прижимает голову [partner] к себе")
- else
- if(gender == FEMALE)
- message = "пихает [partner] лицом в свой пельмешек"
- else if(gender == MALE)
- if(is_dancing(partner, DANCE_TARGET_THROAT))
- message = "достал свой стан-батон из проруби [partner]"
- else
- message = "просовывает свой стан-батон еще глубже в прорубь [partner]"
- else
- message = "елозит пельмешком по лицу [partner]"
- set_is_dancing(partner, DANCE_TARGET_MOUTH)
-
- if ("do_throatdance")
- dancing_increase = 10
- dancing_target = DANCE_TARGET_MOUTH
- dancing_which = ACTOR_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/oral[rand(1, 2)].ogg"
- if(is_dancing(partner, DANCE_TARGET_THROAT))
- message = pick(list("невероятно сильно ловит клёв в проруби [partner]", "топит карпика в проруби [partner]"))
- if(rand(3) == 1) // 33%
- partner.manual_emote("задыхается в захвате [src]")
- if(iscarbon(partner))
- partner.adjustOxyLoss(1)
- else if(is_dancing(partner, DANCE_TARGET_MOUTH))
- message = "суёт стан-батон глубже, заходя уже в прорубь [partner]"
-
- else
- message = "силой запихивает свой стан-батон в прорубь [partner]"
- set_is_dancing(partner , DANCE_TARGET_THROAT)
-
- if ("do_dancor")
- dancing_increase = 10
- dancing_target = DANCE_TARGET_DANCOR
- sound_to_play = "white/valtos/sounds/exrp/interactions/bang[rand(1, 3)].ogg"
- if(is_dancing(partner, DANCE_TARGET_DANCOR))
- message = pick("исследует [partner] в шоколадницу",\
- "нежно исследует пещеру [partner]",\
- "всаживает стан-батон в шоколадницу [partner] по самые гренки",\
- "заходит в шоколадную фабрику [partner]")
- else
- message = "безжалостно прорывает шоколадницу [partner]"
- set_is_dancing(partner, DANCE_TARGET_DANCOR)
-
- if ("do_dance")
- dancing_increase = 10
- dancing_target = DANCE_TARGET_DANCERESS
- sound_to_play = "white/valtos/sounds/exrp/interactions/champ[rand(1, 2)].ogg"
- if(is_dancing(partner, DANCE_TARGET_DANCERESS))
- message = "проникает в пельмешек [partner]"
- else
- message = "резким движением погружается внутрь [partner]"
- set_is_dancing(partner, DANCE_TARGET_DANCERESS)
-
- if ("do_mount")
- dancing_increase = 10
- dancing_target = DANCE_TARGET_DANCERESS
- sound_to_play = "white/valtos/sounds/exrp/interactions/bang[rand(1, 3)].ogg"
- if(partner.is_dancing(src, DANCE_TARGET_DANCERESS))
- message = "скачет на стан-батоне [partner]"
- else
- message = "насаживает свой пельмешек на стан-батон [partner]"
- partner.set_is_dancing(src, DANCE_TARGET_DANCERESS)
-
- if ("do_assdance")
- dancing_increase = 10
- dancing_target = DANCE_TARGET_DANCOR
- sound_to_play = "white/valtos/sounds/exrp/interactions/bang[rand(1, 3)].ogg"
- if(partner.is_dancing(src, DANCE_TARGET_DANCOR))
- message = "по-сербски прыгает на стан-батоне [partner]"
- else
- message = "опускает свой шоколадный завод на стан-батон [partner]"
- partner.set_is_dancing(src, DANCE_TARGET_DANCOR)
-
- if ("do_dancering")
- dancing_increase = 10
- dancing_target = null
- dancing_which = VICTIM_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/champ_fingering.ogg"
- message = pick(list("анализирует пельмешек [partner]", \
- "измеряет глубину пельмешка [partner]", \
- "проверяет на прочность пельмешек [partner]"))
-
- if ("do_fingerdance")
- dancing_increase = 10
- dancing_target = null
- dancing_which = VICTIM_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/champ_fingering.ogg"
- message = pick(list("анализирует шоколадницу [partner]", \
- "измеряет глубину скважины [partner]", \
- "проверяет на прочность задний привод [partner]"))
-
- if ("do_rimdance")
- dancing_increase = 10
- dancing_target = null
- dancing_which = VICTIM_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/champ_fingering.ogg"
- message = "[src] вынюхивает след на заднем дворе [partner]"
-
- if ("do_handdance")
- dancing_increase = 10
- dancing_target = DANCE_TARGET_HAND
- dancing_which = VICTIM_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/bang[rand(1, 3)].ogg"
- if(partner.is_dancing(src, DANCE_TARGET_HAND))
- message = pick(list("шакалит [partner]", \
- "работает рукой с головкой стан-батона [partner]", \
- "включает и выключает стан-батон [partner] быстрее"))
- else
- message = "нежно обхватывает стан-батон [partner] рукой"
- partner.set_is_dancing(src, DANCE_TARGET_HAND)
-
- if ("do_breastdance")
- dancing_increase = 10
- dancing_target = DANCE_TARGET_CHEST
- dancing_which = ACTOR_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/bang[rand(1, 3)].ogg"
- if(is_dancing(partner, DANCE_TARGET_CHEST))
- message = pick(list("исследует [partner] между горок", \
- "прокатывается у [partner] между горок"))
- else
- message = "взял горки [partner] рукой и включает/выключает ими свой стан-батон"
- set_is_dancing(partner , DANCE_TARGET_CHEST)
-
- if ("do_mountdance")
- dancing_increase = 1
- dancing_target = null
- dancing_which = ACTOR_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/squelch[rand(1, 3)].ogg"
- if(is_dancing(partner, DANCING_FACE_WITH_DANCOR))
- message = pick(list("кормит булочками [partner]", \
- "даёт покушать булочек [partner]"))
- else
- message = pick(list("видит, что [partner] голоден и срочно принимается кормить булочками его", \
- "хочет накормить [partner] булочками"))
- set_is_dancing(partner , DANCING_FACE_WITH_DANCOR)
-
- if ("do_danceface")
- dancing_increase = 1
- dancing_target = null
- dancing_which = ACTOR_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/foot_dry[rand(1, 4)].ogg"
- if(src.get_item_by_slot(ITEM_SLOT_FEET) != null)
- message = pick(list("поставил [get_shoes()] подошвой на лицо [partner]", \
- "опускает свои [get_shoes()] на лицо [partner] и надавливает ими", \
- "грубо давит [get_shoes()] на лицо [partner]"))
- else
- message = pick(list("ставит свои оголённые ноги на лицо [partner]", \
- "опускает свои массивные ступни на лицо [partner], и мнёт ими его", \
- "выставляет ноги на лицо [partner]"))
- set_is_dancing(partner , DANCING_FACE_WITH_FEET)
-
- if ("do_dancemouth")
- dancing_increase = 1
- dancing_target = null
- dancing_which = ACTOR_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/foot_wet[rand(1, 3)].ogg"
- if(src.get_item_by_slot(ITEM_SLOT_FEET) != null)
- message = pick(list("заставляет [partner] попробовать [get_shoes()]", \
- "даёт слизать грязь с [get_shoes()] [partner]"))
- else
- message = pick(list("принуждает [partner] попробовать свой грязный палец на ноге", \
- "предлагает [partner] вкусить ступню", \
- "прикрывает рот и нос [partner] ступнёй, затем ждёт пока [partner] отключится и резко отпускает ступню"))
- set_is_dancing(partner , DANCING_MOUTH_WITH_FEET)
-
- if ("do_eggs")
- dancing_increase = 1
- dancing_target = DANCE_TARGET_MOUTH
- dancing_which = ACTOR_DANCER
- sound_to_play = "white/valtos/sounds/exrp/interactions/nuts[rand(1, 4)].ogg"
- if(is_dancing(partner, DANCE_TO_FACE))
- message = pick(list("хватает [partner] за голову и принуждает вкусить яишницы", \
- "умоляет [partner] попробовать ещё больше божественной яишенки", \
- "нещадно принимается кормить [partner] яишницей", \
- "вытаскивает всё то, что [partner] не скушал и ждёт пока тот проглотит остатки"))
- else
- message = pick(list("видит, что [partner] очень голоден и спешит накормить его яишницей", \
- "стоит в сантиметре от лица [partner] держа в руках омлетик, затем резко впихивает в рот [partner] благословлённый омлетик"))
- set_is_dancing(partner , DANCE_TO_FACE)
-
- if ("do_thighs")
- dancing_increase = 10
- dancing_target = THIGH_DANCE
- var file = pick(list("bj10", "bj3", "foot_wet1", "foot_dry3"))
- sound_to_play = "white/valtos/sounds/exrp/interactions/[file].ogg"
- if(is_dancing(partner, THIGH_DANCE))
- if(gender == FEMALE)
- message = pick(list("берёт в ещё более крепкий захват ногами голову [partner] блокируя его обзор целиком", \
- "обхватывает голову [partner] ногами принуждая вкусить пельменей"))
- else if(gender == MALE)
- message = pick(list("берёт в ещё более крепкий захват ногами голову [partner] блокируя его обзор целиком", \
- "обхватывает голову [partner] ногами ещё сильнее и начинает усиленно кормить яишницей", \
- "вставляет кусок омлетика в беспомощный рот [partner], удерживая его лицо ловким захватом ногой"))
- else
- message = "захватывает голову [partner] ногами"
- else
- message = pick(list("залезает на плечи [partner] и берёт в умелый захват своими ногами", \
- "хватает голову [partner] ногами"))
- set_is_dancing(partner , THIGH_DANCE)
- if(prob(15))
- partner.adjustOxyLoss(1)
-
- visible_message("[capitalize(src.name)] [message].")
- playsound(get_turf(src), sound_to_play, 50, 1, -1)
- if(dancing_which & ACTOR_DANCER)
- handle_post_dance(dancing_increase, dancing_target, partner)
- if(dancing_which & VICTIM_DANCER)
- partner.handle_post_dance(dancing_increase, dancing_target, src)
- partner.dir = get_dir(partner,src)
- do_dancing_animation(get_dir(src, partner))
-
-#undef ACTOR_DANCER
-#undef VICTIM_DANCER
-
-/mob/living/carbon/human/proc/get_shoes()
- var/obj/A = get_item_by_slot(ITEM_SLOT_FEET)
- if(findtext_char(A.name,"the"))
- return copytext_char(A.name, 3, (length(A.name)) + 1)
- else
- return A.name
-
-/mob/living/carbon/human/proc/handle_post_dance(amount, dancise, mob/living/carbon/human/partner)
- if(stat != CONSCIOUS)
- return
- if(amount)
- dancing += amount
- if (dancing >= dancing_tolerance)
- end_dance(partner, dancise)
- else
- moan()
diff --git a/white/valtos/code/exrp/dance_definitions.dm b/white/valtos/code/exrp/dance_definitions.dm
deleted file mode 100644
index 59e001070ba9..000000000000
--- a/white/valtos/code/exrp/dance_definitions.dm
+++ /dev/null
@@ -1,276 +0,0 @@
-/datum/interaction/assslap
- command = "assslap"
- description = "Шлёпнуть по заднице"
- simple_message = "USER шлёпает TARGET по заднице!"
- simple_style = "danger"
- needs_physical_contact = TRUE
- write_log_user = "ass-slapped"
- write_log_target = "was ass-slapped by"
-
-/datum/interaction/assslap/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- playsound(get_turf(target), 'white/valtos/sounds/exrp/interactions/slap.ogg', 50, 1, -1)
-
-/datum/interaction/dancero
- command = "dancero"
- description = "Отполировать пельмешку"
- require_user_mouth = TRUE
- require_target_danceress = TRUE
- write_log_user = "gave head to"
- write_log_target = "was given head by"
- user_not_tired = TRUE
- require_target_naked = TRUE
- write_log_user = "dancered"
- write_log_target = "was dancered by"
-
-/datum/interaction/dancero/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_dancero")
-
-/datum/interaction/dancero/dancejob
- command = "dancejob"
- description = "Отполировать огурец"
- require_target_dancer = TRUE
- target_not_tired = TRUE
- write_log_user = "dancejobed"
- write_log_target = "was dancejobed by"
-
-/datum/interaction/dance
- command = "dance"
- description = "Раскромсать вареник"
- require_user_dancer = TRUE
- require_target_danceress = TRUE
- write_log_user = "danced"
- write_log_target = "was danced by"
- user_not_tired = TRUE
- require_user_naked = TRUE
- require_target_naked = TRUE
- max_distance = 0
- write_log_user = "danced"
- write_log_target = "was danced by"
-
-/datum/interaction/dance/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_dance")
-
-/datum/interaction/dancor
- command = "danceass"
- description = "Пробить шоколадницу"
- write_log_user = "valerad"
- write_log_target = "was valerad by"
- write_log_user = "ass-danced"
- write_log_target = "was ass-danced by"
- require_user_naked = TRUE
- require_target_naked = TRUE
- require_target_dancor = TRUE
- user_not_tired = TRUE
- require_user_dancer = TRUE
- max_distance = 0
-
-/datum/interaction/dance/dancor/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_dancor")
-
-
-/datum/interaction/dancering
- command = "dancering"
- description = "Засунуть сигарету в пепельницу"
- require_user_hands = TRUE
- require_target_danceress = TRUE
- user_not_tired = TRUE
- require_target_naked = TRUE
- write_log_user = "dancered"
- write_log_target = "was dancered by"
-
-/datum/interaction/dancering/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_dancering")
-
-/datum/interaction/fingerdance
- command = "fingerdance"
- description = "Почесать шоколадный глаз"
- require_user_hands = TRUE
- require_target_dancor = TRUE
- user_not_tired = TRUE
- require_target_naked = TRUE
- write_log_user = "fingerdanced"
- write_log_target = "was fingerdanced by"
-
-/datum/interaction/fingerdance/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_fingerdance")
-
-
-/datum/interaction/facedance
- command = "facedance"
- description = "Проверить глубину проруби"
- require_target_mouth = TRUE
- user_not_tired = TRUE
- require_user_naked = TRUE
- max_distance = 0
- write_log_user = "face-danced"
- write_log_target = "was face-danced by"
-
-/datum/interaction/facedance/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_facedance")
-
-/datum/interaction/throatdance
- command = "throatdance"
- description = "Утопить муму в проруби"
- require_user_dancer = TRUE
- require_target_mouth = TRUE
- user_not_tired = TRUE
- require_user_naked = TRUE
- max_distance = 0
- write_log_user = "throat-danced"
- write_log_target = "was throat-danced by"
-
-/datum/interaction/throatdance/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_throatdance")
-
-/datum/interaction/handdance
- command = "handdance"
- description = "Потрогать ствол"
- require_user_hands = TRUE
- require_target_dancer = TRUE
- target_not_tired = TRUE
- require_target_naked = TRUE
- write_log_user = "danced-off"
- write_log_target = "was danced-off by"
-
-/datum/interaction/handdance/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_handdance")
-
-/datum/interaction/breastdance
- command = "breastdance"
- description = "Проскользить между двух горок"
- require_user_dancer = TRUE
- user_not_tired = TRUE
- require_user_naked = TRUE
- require_target_naked = TRUE
- require_target_danceress = TRUE
- max_distance = 0
- write_log_user = "breast-danced"
- write_log_target = "was breast-danced by"
-
-/datum/interaction/breastdance/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_breastdance")
-
-/datum/interaction/mount
- command = "mount"
- description = "Покататься на карусели"
- require_user_danceress = TRUE
- require_target_dancer = TRUE
- user_not_tired = TRUE
- target_not_tired = TRUE
- require_user_naked = TRUE
- require_target_naked = TRUE
- max_distance = 0
- write_log_user = "rode"
- write_log_target = "was rode by"
-
-/datum/interaction/mount/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_mount")
-
-/datum/interaction/assdance
- command = "assdance"
- description = "Присесть пончиком на выступ"
- require_user_dancor = TRUE
- require_target_dancer = TRUE
- user_not_tired = TRUE
- target_not_tired = TRUE
- require_user_naked = TRUE
- require_target_naked = TRUE
- max_distance = 0
- write_log_user = "assdance"
- write_log_target = "was assdance by"
-
-/datum/interaction/assdance/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_assdance")
-
-/datum/interaction/rimdance
- command = "rimdance"
- description = "Скушать шоколад"
- require_user_mouth = TRUE
- require_target_dancor = TRUE
- user_not_tired = TRUE
- require_target_naked = TRUE
- max_distance = 0
- write_log_user = "rimdanced"
- write_log_target = "was rimdanced by"
-
-/datum/interaction/rimdance/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_rimdance")
-
-/datum/interaction/mountdance
- command = "mountdance"
- description = "Промариновать лимончик"
- require_target_mouth = TRUE
- require_user_dancor = TRUE
- user_not_tired = TRUE
- require_user_naked = TRUE
- max_distance = 0
- write_log_user = "made-them-rim"
- write_log_target = "was made-to-rim by"
-
-/datum/interaction/mountdance/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_mountdance")
-
-/datum/interaction/danceface
- command = "danceface"
- description = "Дать понюхать ноги"
- require_target_mouth = TRUE
- max_distance = 0
- write_log_user = "feet-faced"
- write_log_target = "had feet grinded against their face by"
-
-/datum/interaction/danceface/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_danceface")
-
-/datum/interaction/dancemouth
- command = "dancemouth"
- description = "Угостить пальцами ног"
- require_target_mouth = TRUE
- max_distance = 0
- write_log_user = "feet-mouthed"
- write_log_target = "had feet grinding against their tongue by"
-
-/datum/interaction/dancemouth/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_dancemouth")
-
-/datum/interaction/eggs
- command = "eggs"
- description = "Накормить яишницей"
- require_user_naked = TRUE
- require_user_dancer = TRUE
- require_target_mouth = TRUE
- max_distance = 0
- write_log_user = "make-them-eat-some-eggs"
- write_log_target = "was made to eat eggs by"
-
-/datum/interaction/eggs/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_eggs")
-
-/datum/interaction/thighs
- command = "thighs"
- description = "Взять в захват ногами"
- max_distance = 0
- require_user_naked = TRUE
- require_target_mouth = TRUE
- write_log_user = "thigh-trapped"
- write_log_target = "was smothered by"
-
-/datum/interaction/thighs/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
- . = ..()
- user.do_dance(target, "do_thighs")
diff --git a/white/valtos/code/exrp/dance_mob.dm b/white/valtos/code/exrp/dance_mob.dm
deleted file mode 100644
index 6c262a7aff96..000000000000
--- a/white/valtos/code/exrp/dance_mob.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-/mob/living/carbon/human/Initialize()
- . = ..()
- dancing_potency = (prob(80) ? rand(9, 14) : pick(rand(5, 13), rand(15, 20)))
- dancing_tolerance = (prob(80) ? rand(150, 300) : pick(rand(10, 100), rand(350,600)))
-
-/mob/proc/do_dancing_animation(dancedir)
-
- dir = dancedir
-
- var/pixel_x_diff = 0
- var/pixel_y_diff = 0
- var/final_pixel_y = initial(pixel_y)
-
- if(dancedir & NORTH)
- pixel_y_diff = 8
- else if(dancedir & SOUTH)
- pixel_y_diff = -8
-
- if(dancedir & EAST)
- pixel_x_diff = 8
- else if(dancedir & WEST)
- pixel_x_diff = -8
-
- if(pixel_x_diff == 0 && pixel_y_diff == 0)
- pixel_x_diff = rand(-3,3)
- pixel_y_diff = rand(-3,3)
- animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
- animate(pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 2)
- return
-
- animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
- animate(pixel_x = initial(pixel_x), pixel_y = final_pixel_y, time = 2)
-
-/mob/living/carbon/human/proc/is_literally_ready_to_dance()
- return (!wear_suit || !(wear_suit.body_parts_covered)) && (!w_uniform || !(w_uniform.body_parts_covered))
diff --git a/white/valtos/code/exrp/interaction_interface.dm b/white/valtos/code/exrp/interaction_interface.dm
deleted file mode 100644
index 8b90b36ca9ae..000000000000
--- a/white/valtos/code/exrp/interaction_interface.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/mob/living/carbon/human/MouseDrop_T(mob/M, mob/user)
- . = ..()
-
- if(M == src || src == usr || M != usr)
- return
-
- if(HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED))
- return
-
- if(!ishuman(user))
- return
-
- var/mob/living/carbon/human/H = user
-
- H.try_interaction(src)
-
-/mob/living/carbon/human/proc/try_interaction(mob/partner)
-
- if (!check_rights_for(client, R_ADMIN) && !check_whitelist_exrp(ckey))
- return
-
- var/dat = ""
-
- make_interactions()
- for(var/interaction_key in GLOB.interactions)
- var/datum/interaction/I = GLOB.interactions[interaction_key]
- if(I.evaluate_user(src) && I.evaluate_target(src, partner))
- dat += I.get_action_link_for(src, partner)
-
- var/datum/browser/popup = new(usr, "interactions", "Взаимодействие с [partner]", 400, 300)
- popup.set_content(dat)
- popup.open()
diff --git a/white/valtos/code/exrp/interaction_whitelist.dm b/white/valtos/code/exrp/interaction_whitelist.dm
deleted file mode 100644
index c87dd6c0d5a2..000000000000
--- a/white/valtos/code/exrp/interaction_whitelist.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-/proc/load_whitelist_exrp()
- GLOB.whitelist_exrp = list()
- for(var/line in world.file2list(WHITELISTEXRPFILE))
- if(!line)
- continue
- if(findtextEx(line,"#",1,2))
- continue
- GLOB.whitelist_exrp += ckey(line)
-
- if(!GLOB.whitelist_exrp.len)
- GLOB.whitelist_exrp = null
-
-/proc/check_whitelist_exrp(var/ckey)
- if(!GLOB.whitelist_exrp)
- return FALSE
- . = (ckey in GLOB.whitelist_exrp)
-
-#undef WHITELISTEXRPFILE
diff --git a/white/valtos/code/exrp/smetanka.dm b/white/valtos/code/exrp/smetanka.dm
deleted file mode 100644
index 44b8c7ac40f6..000000000000
--- a/white/valtos/code/exrp/smetanka.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/obj/effect/decal/cleanable/cum
- name = "сметанка"
- desc = "Выглядит вкусно."
- density = 0
- layer = 3
- icon = 'white/valtos/icons/exrp/smetanka.dmi'
- anchored = 1
- random_icon_states = list("cum1", "cum3", "cum4", "cum5", "cum6", "cum7", "cum8", "cum9", "cum10", "cum11", "cum12")
- mergeable_decal = FALSE
-
-/obj/effect/decal/cleanable/cum/Initialize(mapload, list/datum/disease/diseases)
- . = ..()
- reagents.add_reagent(/datum/reagent/consumable/nutriment/protein/semen, 5)
- pixel_x = rand(-12, 12)
- pixel_y = rand(-12, 12)
-
-/obj/effect/decal/cleanable/cum/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- playsound(get_turf(src), 'sound/items/drink.ogg', 50, TRUE) //slurp
- H.visible_message(span_alert("[H] слизывает сметанку с пола."))
- if(reagents)
- for(var/datum/reagent/R in reagents.reagent_list)
- if (istype(R, /datum/reagent/consumable))
- var/datum/reagent/consumable/nutri_check = R
- if(nutri_check.nutriment_factor >0)
- H.adjust_nutrition(nutri_check.nutriment_factor * nutri_check.volume)
- reagents.remove_reagent(nutri_check.type,nutri_check.volume)
- reagents.trans_to(H, reagents.total_volume, transfered_by = user)
- qdel(src)
diff --git a/white/valtos/code/unsorted/butt.dm b/white/valtos/code/unsorted/butt.dm
index 305ae6e0e23d..2372fe34f1ee 100644
--- a/white/valtos/code/unsorted/butt.dm
+++ b/white/valtos/code/unsorted/butt.dm
@@ -124,40 +124,40 @@
X.Insert(src)
/mob/living/carbon/human/proc/checkbuttinspect(mob/living/carbon/user)
- if(user.zone_selected == "groin")
- var/obj/item/organ/butt/B = getorgan(/obj/item/organ/butt)
- if(!B)
- to_chat(user, span_warning("А задница-то отсутствует!"))
- return
- if(!w_uniform)
- var/datum/component/storage/STR = B.storage_handler.GetComponent(B.pocket_storage_component_path)
- if(B && STR)
- user.visible_message(span_warning("[user] начинает инспектировать [user == src ? "свою задницу" : "задницу [src]"]!") , span_warning("Начинаю инспектировать [user == src ? "свою задницу" : "задницу [src]"]!"))
- if(do_mob(user, src, 40))
- user.visible_message(span_warning("[user] инспектирует [user == src ? "свою задницу" : "задницу [src]"]!") , span_warning("Инспектирую [user == src ? "свою задницу" : "задницу [src]"]!"))
- if (user.active_storage)
- user.active_storage.close(user)
- STR.orient2hud(user)
- STR.show_to(user)
- return TRUE
- else
- user.visible_message(span_warning("[user] проваливает попытку инспекции [user == src ? "своей задницы" : "задницы [src]"]!") , span_warning("Не вышло проинспектировать [user == src ? "свою задницу" : "задницу [src]"]!"))
- return TRUE
+ var/obj/item/organ/butt/B = getorgan(/obj/item/organ/butt)
+ if(!B)
+ to_chat(user, span_warning("А задница-то отсутствует!"))
+ return
+ if(!w_uniform)
+ var/datum/component/storage/STR = B.storage_handler.GetComponent(B.pocket_storage_component_path)
+ if(B && STR)
+ user.visible_message(span_warning("[user] начинает инспектировать [user == src ? "свою задницу" : "задницу [src]"]!") , span_warning("Начинаю инспектировать [user == src ? "свою задницу" : "задницу [src]"]!"))
+ if(do_mob(user, src, 40))
+ user.visible_message(span_warning("[user] инспектирует [user == src ? "свою задницу" : "задницу [src]"]!") , span_warning("Инспектирую [user == src ? "свою задницу" : "задницу [src]"]!"))
+ if (user.active_storage)
+ user.active_storage.close(user)
+ STR.orient2hud(user)
+ STR.show_to(user)
+ return TRUE
else
- to_chat(user, span_warning("Задницы нет!"))
+ user.visible_message(span_warning("[user] проваливает попытку инспекции [user == src ? "своей задницы" : "задницы [src]"]!") , span_warning("Не вышло проинспектировать [user == src ? "свою задницу" : "задницу [src]"]!"))
return TRUE
else
- if(user == src)
- user.visible_message(span_warning("[user] хватает себя за зад!") , span_warning("Хватаю себя за зад!"))
- to_chat(user, span_warning("Надо бы снять одежду сперва!"))
- else
- user.visible_message(span_warning("[user] хватает [src] за задницу!") , span_warning("Хватаю задницу [src]!"))
- to_chat(user, span_warning("Надо бы снять с [src] одежду!"))
- to_chat(src, span_userdanger("Мой зад кто-то схватил!"))
+ to_chat(user, span_warning("Задницы нет!"))
return TRUE
+ else
+ if(user == src)
+ user.visible_message(span_warning("[user] хватает себя за зад!") , span_warning("Хватаю себя за зад!"))
+ to_chat(user, span_warning("Надо бы снять одежду сперва!"))
+ else
+ user.visible_message(span_warning("[user] хватает [src] за задницу!") , span_warning("Хватаю задницу [src]!"))
+ to_chat(user, span_warning("Надо бы снять с [src] одежду!"))
+ to_chat(src, span_userdanger("Мой зад кто-то схватил!"))
+ return TRUE
/mob/living/carbon/human/grabbedby(mob/living/user, supress_message = FALSE)
- if (checkbuttinspect(user))
+
+ if (checkbuttinspect(user) && user.zone_selected == BODY_ZONE_PRECISE_GROIN)
return FALSE
return ..()
diff --git a/white/valtos/code/unsorted/randommaint.dm b/white/valtos/code/unsorted/randommaint.dm
index c5fa76917e7d..e045bb12b1f2 100644
--- a/white/valtos/code/unsorted/randommaint.dm
+++ b/white/valtos/code/unsorted/randommaint.dm
@@ -29,7 +29,6 @@
/obj/effect/spawner/lootdrop/gross_decal_spawner = 25,
/mob/living/simple_animal/hostile/poison/giant_spider = 1,
/mob/living/simple_animal/hostile/cockroach = 1,
- /obj/effect/decal/cleanable/cum = 1,
/obj/effect/spawner/lootdrop/space/languagebook = 1,
/obj/effect/spawner/lootdrop/space/fancytool = 1,
/obj/effect/spawner/lootdrop/space/fancytech = 1,
diff --git a/white/valtos/code/unsorted/raper.dm b/white/valtos/code/unsorted/raper.dm
deleted file mode 100644
index 02c1a2bc67e5..000000000000
--- a/white/valtos/code/unsorted/raper.dm
+++ /dev/null
@@ -1,342 +0,0 @@
-/datum/ai_controller/raper
- blackboard = list(BB_RAPER_AGRESSIVE = FALSE,\
- BB_RAPER_ENEMIES = list(),\
- BB_RAPER_CURRENT_ATTACK_TARGET = null,\
- BB_RAPER_CURRENT_ATTACK_TARGET)
-
-/datum/ai_controller/raper/TryPossessPawn(atom/new_pawn)
- if(!ishuman(new_pawn))
- return AI_CONTROLLER_INCOMPATIBLE
- RegisterSignal(new_pawn, COMSIG_PARENT_ATTACKBY, .proc/on_attackby)
- RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand)
- RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_PAW, .proc/on_attack_paw)
- RegisterSignal(new_pawn, COMSIG_ATOM_BULLET_ACT, .proc/on_bullet_act)
- RegisterSignal(new_pawn, COMSIG_ATOM_HITBY, .proc/on_hitby)
- RegisterSignal(new_pawn, COMSIG_MOVABLE_CROSSED, .proc/on_Crossed)
- RegisterSignal(new_pawn, COMSIG_LIVING_START_PULL, .proc/on_startpulling)
- RegisterSignal(new_pawn, COMSIG_LIVING_TRY_SYRINGE, .proc/on_try_syringe)
- RegisterSignal(new_pawn, COMSIG_ATOM_HULK_ATTACK, .proc/on_attack_hulk)
- RegisterSignal(new_pawn, COMSIG_CARBON_CUFF_ATTEMPTED, .proc/on_attempt_cuff)
- blackboard[BB_RAPER_AGRESSIVE] = TRUE //Angry cunt
- return ..() //Run parent at end
-
-/datum/ai_controller/raper/UnpossessPawn(destroy)
- UnregisterSignal(pawn, list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_MOVABLE_CROSSED, COMSIG_LIVING_START_PULL,\
- COMSIG_LIVING_TRY_SYRINGE, COMSIG_ATOM_HULK_ATTACK, COMSIG_CARBON_CUFF_ATTEMPTED))
- return ..() //Run parent at end
-
-/datum/ai_controller/raper/able_to_run()
- var/mob/living/carbon/human/living_pawn = pawn
-
- if(IS_DEAD_OR_INCAP(living_pawn))
- return FALSE
- return ..()
-
-/datum/ai_controller/raper/SelectBehaviors(delta_time)
- current_behaviors = list()
- var/mob/living/carbon/human/living_pawn = pawn
-
- if(SHOULD_RESIST(living_pawn) && DT_PROB(MONKEY_RESIST_PROB, delta_time))
- current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/resist) //BRO IM ON FUCKING FIRE BRO
- return //IM NOT DOING ANYTHING ELSE BUT EXTUINGISH MYSELF, GOOD GOD HAVE MERCY.
-
- var/list/enemies = blackboard[BB_RAPER_ENEMIES]
-
- if(HAS_TRAIT(pawn, TRAIT_PACIFISM)) //Not a pacifist? lets try some combat behavior.
- return
-
- if(length(enemies) || blackboard[BB_RAPER_AGRESSIVE]) //We have enemies or are pissed
-
- var/mob/living/carbon/human/selected_enemy
-
- for(var/mob/living/carbon/human/possible_enemy in view(MONKEY_ENEMY_VISION, living_pawn))
- if(possible_enemy == living_pawn || (!enemies[possible_enemy] && (!blackboard[BB_RAPER_AGRESSIVE] || HAS_AI_CONTROLLER_TYPE(possible_enemy, /datum/ai_controller/raper)))) //Are they an enemy? (And do we even care?)
- continue
-
- selected_enemy = possible_enemy
- break
- if(selected_enemy)
- if(!selected_enemy.stat && !(HAS_TRAIT(selected_enemy, TRAIT_IMMOBILIZED)) && !(HAS_TRAIT(selected_enemy, TRAIT_FLOORED)) && !(HAS_TRAIT(selected_enemy, TRAIT_HANDS_BLOCKED))) //He's up, get him!
- blackboard[BB_RAPER_CURRENT_ATTACK_TARGET] = selected_enemy
- current_movement_target = selected_enemy
- current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/battle_screech/raper)
- current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/battle_shout/raper)
- current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/raper_attack_mob)
- return //Focus on this
- else //He's down, can we fuck him?
- blackboard[BB_RAPER_CURRENT_ATTACK_TARGET] = selected_enemy
- current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/fuck_mob)
- return
-
-//When idle just kinda fuck around.
-/datum/ai_controller/raper/PerformIdleBehavior(delta_time)
- var/mob/living/carbon/human/living_pawn = pawn
-
- if(DT_PROB(25, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby)
- step(living_pawn, pick(GLOB.cardinals))
- else if(DT_PROB(5, delta_time))
- INVOKE_ASYNC(living_pawn, /mob.proc/emote, pick("moan"))
- else if(DT_PROB(1, delta_time))
- INVOKE_ASYNC(living_pawn, /mob.proc/emote, pick("moan","spin","flip"))
-
-///Reactive events to being hit
-/datum/ai_controller/raper/proc/retaliate(mob/living/L)
- var/list/enemies = blackboard[BB_RAPER_ENEMIES]
- enemies[L] += MONKEY_HATRED_AMOUNT
-
-/datum/ai_controller/raper/proc/on_attackby(datum/source, obj/item/I, mob/user)
- SIGNAL_HANDLER
- if(I.force && I.damtype != STAMINA)
- retaliate(user)
-
-/datum/ai_controller/raper/proc/on_attack_hand(datum/source, mob/living/L)
- SIGNAL_HANDLER
- if(L.a_intent == INTENT_GRAB && prob(MONKEY_RETALIATE_HARM_PROB))
- retaliate(L)
- else if(L.a_intent == INTENT_DISARM && prob(MONKEY_RETALIATE_DISARM_PROB))
- retaliate(L)
-
-/datum/ai_controller/raper/proc/on_attack_paw(datum/source, mob/living/L)
- SIGNAL_HANDLER
- if(L.a_intent == INTENT_HARM && prob(MONKEY_RETALIATE_HARM_PROB))
- retaliate(L)
- else if(L.a_intent == INTENT_DISARM && prob(MONKEY_RETALIATE_DISARM_PROB))
- retaliate(L)
-
-/datum/ai_controller/raper/proc/on_bullet_act(datum/source, obj/projectile/Proj)
- SIGNAL_HANDLER
- var/mob/living/carbon/human/living_pawn = pawn
- if(istype(Proj , /obj/projectile/beam)||istype(Proj, /obj/projectile/bullet))
- if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
- if(!Proj.nodamage && Proj.damage < living_pawn.health && ishuman(Proj.firer))
- retaliate(Proj.firer)
-
-/datum/ai_controller/raper/proc/on_hitby(datum/source, atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
- SIGNAL_HANDLER
- if(istype(AM, /obj/item))
- var/mob/living/carbon/human/living_pawn = pawn
- var/obj/item/I = AM
- if(I.throwforce < living_pawn.health && ishuman(I.thrownby))
- var/mob/living/carbon/human/H = I.thrownby
- retaliate(H)
-
-/datum/ai_controller/raper/proc/on_Crossed(datum/source, atom/movable/AM)
- SIGNAL_HANDLER
- var/mob/living/carbon/human/living_pawn = pawn
- if(!IS_DEAD_OR_INCAP(living_pawn) && ishuman(AM))
- var/mob/living/carbon/human/in_the_way_mob = AM
- in_the_way_mob.knockOver(living_pawn)
- return
-
-/datum/ai_controller/raper/proc/on_startpulling(datum/source, atom/movable/puller, state, force)
- SIGNAL_HANDLER
- var/mob/living/carbon/human/living_pawn = pawn
- if(!IS_DEAD_OR_INCAP(living_pawn) && prob(MONKEY_PULL_AGGRO_PROB)) // nuh uh you don't pull me!
- retaliate(living_pawn.pulledby)
- return TRUE
-
-/datum/ai_controller/raper/proc/on_try_syringe(datum/source, mob/user)
- SIGNAL_HANDLER
- // chance of monkey retaliation
- if(prob(MONKEY_SYRINGE_RETALIATION_PROB))
- retaliate(user)
-
-/datum/ai_controller/raper/proc/on_attack_hulk(datum/source, mob/user)
- SIGNAL_HANDLER
- retaliate(user)
-
-/datum/ai_controller/raper/proc/on_attempt_cuff(datum/source, mob/user)
- SIGNAL_HANDLER
- // chance of monkey retaliation
- if(prob(MONKEY_CUFF_RETALIATION_PROB))
- retaliate(user)
-
-/datum/ai_behavior/battle_screech/raper
- screeches = list("scream", "moan")
-
-/datum/ai_behavior/battle_shout
- var/list/shouts
-
-/datum/ai_behavior/battle_shout/perform(delta_time, datum/ai_controller/controller)
- . = ..()
- var/mob/living/carbon/human/living_pawn = controller.pawn
- living_pawn.say(uppertext(pick(shouts)))
- finish_action(controller, TRUE)
-
-/datum/ai_behavior/battle_shout/raper
- shouts = list("СЕЙЧАС ТЕБЕ БУДЕТ ПРИЯТНО!!!",\
- "ИДИ СЮДА, СЛАДЕНЬКИЙ!!!",\
- "ОХ-ОХ-ОХ, Я СЕЙЧАС ОБКОНЧАЮСЬ!!!",\
- "ТЕБЕ ЭТО ОБЯЗАТЕЛЬНО ПОНРАВИТСЯ!!!")
-
-/datum/ai_behavior/raper_attack_mob
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM //performs to increase frustration
-
-/datum/ai_behavior/raper_attack_mob/perform(delta_time, datum/ai_controller/controller)
- . = ..()
-
- var/mob/living/carbon/human/target = controller.blackboard[BB_RAPER_CURRENT_ATTACK_TARGET]
- var/mob/living/carbon/human/living_pawn = controller.pawn
-
- if(!target || target.stat != CONSCIOUS || HAS_TRAIT(target, TRAIT_IMMOBILIZED) || HAS_TRAIT(target, TRAIT_FLOORED) || HAS_TRAIT(target, TRAIT_HANDS_BLOCKED))
- finish_action(controller, TRUE) //Target == owned
-
- if(living_pawn.Adjacent(target) && isturf(target.loc) && !IS_DEAD_OR_INCAP(living_pawn)) // if right next to perp
- // check if target has a weapon
- var/obj/item/W
- for(var/obj/item/I in target.held_items)
- if(!(I.item_flags & ABSTRACT))
- W = I
- break
-
- // if the target has a weapon, chance to disarm them
- if(W && DT_PROB(MONKEY_ATTACK_DISARM_PROB, delta_time))
- living_pawn.a_intent = INTENT_DISARM
- raper_attack(controller, target, delta_time)
- else
- living_pawn.a_intent = INTENT_GRAB
- raper_attack(controller, target, delta_time)
-
-
-/datum/ai_behavior/raper_attack_mob/finish_action(datum/ai_controller/controller, succeeded)
- . = ..()
- controller.blackboard[BB_RAPER_CURRENT_ATTACK_TARGET] = null
-
-/// attack using a held weapon otherwise bite the enemy, then if we are angry there is a chance we might calm down a little
-/datum/ai_behavior/raper_attack_mob/proc/raper_attack(datum/ai_controller/controller, mob/living/target, delta_time)
-
- var/mob/living/carbon/human/living_pawn = controller.pawn
-
- if(living_pawn.next_move > world.time)
- return
-
- living_pawn.changeNext_move(CLICK_CD_MELEE) //We play fair
-
- var/obj/item/weapon = living_pawn.held_items.len ? pick(living_pawn.held_items) : null
-
- living_pawn.face_atom(target)
-
- living_pawn.a_intent = INTENT_GRAB
- target.grabbedby(living_pawn)
- target.grippedby(living_pawn)
-
- // attack with weapon if we have one
- if(weapon)
- weapon.melee_attack_chain(living_pawn, target)
- else
- target.attack_hand(living_pawn)
-
- // no de-aggro
- if(controller.blackboard[BB_RAPER_AGRESSIVE])
- return
-
- if(DT_PROB(MONKEY_HATRED_REDUCTION_PROB, delta_time))
- controller.blackboard[BB_RAPER_ENEMIES][target]--
-
- // if we are not angry at our target, go back to idle
- if(controller.blackboard[BB_RAPER_ENEMIES][target] <= 0)
- var/list/enemies = controller.blackboard[BB_RAPER_ENEMIES]
- enemies.Remove(target)
- if(controller.blackboard[BB_RAPER_CURRENT_ATTACK_TARGET] == target)
- finish_action(controller, TRUE)
-
-/datum/ai_behavior/fuck_mob
- behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM //performs to increase frustration
-
-/datum/ai_behavior/fuck_mob/finish_action(datum/ai_controller/controller, succeeded)
- . = ..()
- controller.blackboard[BB_RAPER_CURRENT_ATTACK_TARGET] = null
- controller.blackboard[BB_RAPER_FUCKING] = FALSE
-
-/datum/ai_behavior/fuck_mob/perform(delta_time, datum/ai_controller/controller)
- . = ..()
-
- if(controller.blackboard[BB_RAPER_FUCKING])
- return
-
- var/mob/living/carbon/human/target = controller.blackboard[BB_RAPER_CURRENT_ATTACK_TARGET]
- var/mob/living/carbon/human/living_pawn = controller.pawn
-
- controller.current_movement_target = target
-
- if(target.pulledby != living_pawn && !HAS_AI_CONTROLLER_TYPE(target.pulledby, /datum/ai_controller/raper)) //Dont steal from my fellow monkeys.
- if(living_pawn.Adjacent(target) && isturf(target.loc))
- living_pawn.a_intent = INTENT_GRAB
- target.grabbedby(living_pawn)
- target.grippedby(living_pawn)
- return //Do the rest next turn
-
- controller.current_movement_target = target
-
- if(living_pawn.Adjacent(target))
- living_pawn.forceMove(get_turf(target))
- for(var/i in 1 to 30 step 2)
- addtimer(CALLBACK(src, .proc/try_fuck_mob, controller), i)
-
- else //This means we might be getting pissed!
- return
-
-/datum/ai_behavior/fuck_mob/proc/try_fuck_mob(datum/ai_controller/controller)
- var/mob/living/carbon/human/living_pawn = controller.pawn
- var/mob/living/carbon/human/target = controller.blackboard[BB_RAPER_CURRENT_ATTACK_TARGET]
-
- controller.blackboard[BB_RAPER_FUCKING] = TRUE
-
- if(target && ishuman(target))
- if(target.gender == FEMALE)
- target.dropItemToGround(target.wear_suit)
- target.dropItemToGround(target.w_uniform)
- target.drop_all_held_items()
- living_pawn.do_dance(target, pick("do_dance"))
- else
- target.dropItemToGround(target.wear_suit)
- target.dropItemToGround(target.w_uniform)
- target.drop_all_held_items()
- living_pawn.do_dance(target, pick("do_dancor"))
- finish_action(controller, TRUE)
-
-/mob/living/carbon/human/raper
- ai_controller = /datum/ai_controller/raper
-
-/mob/living/carbon/human/raper/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_STUNIMMUNE, "sosi")
- ADD_TRAIT(src, TRAIT_STRONG_GRABBER, "sosi")
-
-/datum/ai_controller/raper/opyx
- blackboard = list(BB_RAPER_AGRESSIVE = FALSE,\
- BB_RAPER_ENEMIES = list(),\
- BB_RAPER_CURRENT_ATTACK_TARGET = null,\
- BB_RAPER_CURRENT_ATTACK_TARGET)
-
-
-/datum/ai_behavior/battle_shout/raper/opyx
- shouts = list("СЕЙЧАС ТЕБЕ БУДЕТ ПРИЯТНО!!!",\
- "ИДИ СЮДА, СЛАДЕНЬКИЙ!!!",\
- "ОХ-ОХ-ОХ, Я СЕЙЧАС ОБКОНЧАЮСЬ!!!",\
- "Обязательно посмотрите главную страницу нашего сервера на вики!!!",\
- "На нашем сервере очень серьезно относятся к отыгрышу ролей!!!",\
- "Сборка нашего сервера: OnyxBay!!!",\
- "Baystation12 с классической картой космической станции и своими улучшениями!!!",\
- "Сообщить о найденных багах вы можете здесь!!!",\
- "И присоединяйтесь к нашему сообществу в Дискорде. Там вы сможете найти свежие новости, обсуждение раундов, предложить свои идеи по улучшению сервера, а также пожаловаться на другого игрока или оспорить свой бан!!!",\
- "Добро пожаловать на Chaotic Onyx!!!",\
- "Это основной сервер нашего сообщества с классическим духом бесконечного хаоса на космической станции 13!!!",\
- "Если вы хотите спокойной и размеренной игры с более серьезным подходом к отыгрышу, то заходите на наш второй сервер: Lawful Onyx!!!",\
- "Chaotic Onyx рассчитан в первую очередь на взрослых людей, которые отдают себе отчет в своих поступках и не будут специально ломать игру другим игрокам!!!",\
- "На нашем сервере запрещается играть!!!",\
- "Помните, что администраторы тоже люди и часто ошибаются!!!",\
- "Администраторы Chaotic Onyx будут выдавать баны за любые нарушения на свое усмотрение, с учетом неких внутренних норм, которые сложились со временем, предыдущих банов и дополнительных обстоятельств!!!",\
- "Срок бана, выбранный администратором может быть изменен на основании обсуждения нарушения сообществом с целью подобрать условия, наиболее удобные большинству игроков сервера!!!",\
- "Любые подобные действия караются достаточно строго!!!",\
- "Использование неприемлимых аудио-визуальных ресурсов ингейм!!!",\
- "ТЕБЕ ЭТО ОБЯЗАТЕЛЬНО ПОНРАВИТСЯ!!!")
-
-/mob/living/carbon/human/raper/opyx
- ai_controller = /datum/ai_controller/raper/opyx
-
-/mob/living/carbon/human/raper/opyx/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_STUNIMMUNE, "sosi")
- ADD_TRAIT(src, TRAIT_STRONG_GRABBER, "sosi")
- fully_replace_character_name(null, pick("Partingglass", "Rodial", "Tatarin", "K0b0ld", "Xmaebx", "Ucnahez", "Mrpersival", "Bulatm12", "Moji04nik", "Novan13", "Panchoys", "Primudsuka", "Amiclerick", "Epicus", "Polukarpovitch", "Antigolic", "Davidkameron", "Tapko4eb", "Mellondeluna", "Sholom", "Michael Shepard", "Clockrigger"))