diff --git a/_maps/map_files/coyote_bayou/Newboston.dmm b/_maps/map_files/coyote_bayou/Newboston.dmm
index f4ca0bba91a..3e568de42e6 100644
--- a/_maps/map_files/coyote_bayou/Newboston.dmm
+++ b/_maps/map_files/coyote_bayou/Newboston.dmm
@@ -13103,6 +13103,10 @@
},
/turf/open/floor/carpet/red,
/area/f13/wasteland/city/newboston/chapel)
+"fzn" = (
+/obj/machinery/mineral/wasteland_vendor/ammo,
+/turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust,
+/area/f13/building/workshop/nash)
"fzD" = (
/turf/open/indestructible/ground/outside/desert,
/area/f13/building)
@@ -24968,6 +24972,13 @@
/obj/item/stack/crafting/electronicparts/three,
/turf/open/floor/plasteel/f13/vault_floor/dark/darksolid,
/area/f13/building)
+"knc" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/mineral/wasteland_vendor/ammo,
+/turf/open/floor/plasteel/f13/vault_floor/misc/vaultrust,
+/area/f13/building/workshop/nash)
"knl" = (
/obj/structure/closet/fridge,
/obj/effect/spawner/lootdrop/f13/foodspawner,
@@ -115584,11 +115595,11 @@ aDk
aDk
oHa
nJt
-cki
-wBU
-qpV
nIN
-rni
+nIN
+nIN
+nIN
+nIN
nIN
nIN
wgA
@@ -116041,12 +116052,12 @@ aDk
aDk
oHa
nJt
-nJt
-nJt
-nJt
-nJt
-nJt
-vLv
+cki
+wBU
+qpV
+knc
+fzn
+nIN
nIN
nIN
nIN
@@ -116498,13 +116509,13 @@ aDk
aDk
oHa
oXC
-oXC
-oXC
-oXC
-oXC
nJt
-oVf
-rni
+nJt
+nJt
+nJt
+vLv
+nIN
+nIN
nIN
nIN
hOw
@@ -116958,10 +116969,10 @@ oXC
oXC
oXC
oXC
-oXC
-nJt
-nJt
nJt
+oVf
+rni
+nIN
nIN
nIN
nJt
@@ -117415,10 +117426,10 @@ oXC
oXC
oXC
oXC
-oXC
+nJt
nJt
klH
-rBe
+klH
kvd
kvd
kvd
diff --git a/_maps/templates/splurt_templates/hilbertshotel.dmm b/_maps/templates/splurt_templates/hilbertshotel.dmm
index 1faaf317dbc..c9db16d50a1 100644
--- a/_maps/templates/splurt_templates/hilbertshotel.dmm
+++ b/_maps/templates/splurt_templates/hilbertshotel.dmm
@@ -64,14 +64,9 @@
},
/turf/open/indestructible/hoteltile,
/area/hilbertshotel)
-"ke" = (
-/obj/machinery/light_switch{
- pixel_x = -32
- },
-/turf/open/floor/wood_common/wood_common_dark,
-/area/hilbertshotel)
"kU" = (
/obj/machinery/telecomms/relay/preset/auto,
+/turf/open/indestructible/ground/outside/desert,
/area/hilbertshotel)
"kX" = (
/obj/structure/table/reinforced,
@@ -422,7 +417,7 @@ GW
"}
(7,1,1) = {"
GW
-GW
+kU
Si
zD
Rt
@@ -440,7 +435,7 @@ GW
"}
(8,1,1) = {"
GW
-kU
+GW
Si
Si
Si
@@ -463,7 +458,7 @@ wC
Uc
yh
MZ
-ke
+MZ
MZ
hz
wf
diff --git a/code/__DEFINES/_flags/item_flags.dm b/code/__DEFINES/_flags/item_flags.dm
index cc2c0da776a..31d1a815432 100644
--- a/code/__DEFINES/_flags/item_flags.dm
+++ b/code/__DEFINES/_flags/item_flags.dm
@@ -34,6 +34,8 @@
#define BEEN_JUICED (1<<16)
/// This thing should be deleted when dropped, BUT and this is important, only deletes when it is no longer in your inventory
#define PERSONAL_ITEM (1<<17)
+/// Dont turn when you click this on someone
+#define NO_TURN (1<<18)
/// This thing was clicked on, and something said not to pick it up (cus its gonna do something cool)
#define ITEM_CLICKED_NOPICKUP (1<<1)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 87a51e8dc1b..1d3bb418c7c 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -328,6 +328,7 @@
#define TRAIT_TACKLER "tackler"
#define TRAIT_TACKLERADV "Advanced Tackler"
#define TRAIT_TACKLERNONCONX "Apex Tackler"
+#define TRAIT_TACKLERAPEX "Apex Tackler"
#define TRAIT_NO_TELEPORT "no-teleport" //you just can't
#define TRAIT_NO_INTERNALS "no-internals"
#define TRAIT_NO_ALCOHOL "alcohol_intolerance"
@@ -353,12 +354,11 @@
#define TRAIT_DISTANT "distant"
#define TRAIT_HEADPAT_SLUT "headpat_sluuuuut"
#define TRAIT_ORAL_FIXATION "oral fixation"
-#define TRAIT_RISKY_BUSINESS "creampie fixation"
#define TRAIT_NOERP "no erp"
+#define TRAIT_SNUGGLER "snuggle rp"
#define TRAIT_VANILLAERP "vanilla erp"
#define TRAIT_ROUGHERP "rough erp"
#define TRAIT_EXTREMEERP "extreme erp"
-#define TRAIT_SNUGGLER "snuggle rp"
#define TRAIT_FERALERP "feral erp"
#define TRAIT_ROBOTERP "robot erp"
#define TRAIT_VOREERP "vore erp"
@@ -368,6 +368,7 @@
#define TRAIT_BIGBOOBS "big boobs"
#define TRAIT_BIGBALLS "big balls"
#define TRAIT_BIGWEENIE "big dick"
+#define TRAIT_RISKY_BUSINESS "creampie fixation"
//#define TRAIT_PACKRAT "packrat"
#define TRAIT_HYDRA_HEADS "hydra_heads"
#define TRAIT_SHELTERED "sheltered"
@@ -389,9 +390,14 @@
#define TRAIT_ENDLESS_RUNNER "endless_runner"
#define TRAIT_PANICKED_ATTACKER "panicked_attacker"
#define TRAIT_NOHIDEFACE "no hide face"
+#define TRAIT_SECURITYEXPERT "security-expert"
#define TRAIT_CLAM_TONGUE "clam_tongue"
#define TRAIT_CLAM_LOVER "clam_lover"
#define TRAIT_CLAM_FISHER "clam_fisher"
+#define TRAIT_PILLOW_CRIMINAL "pillow_crimes"
+
+#define TRAIT_NO_PVP_EVER "no_pvp_ever"
+#define TRAIT_NOCRITPAIN "no_crit_pain"
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
@@ -458,7 +464,6 @@
/// You're hooked on punga!
#define TRAIT_PUNGAPOWER "pungaful"
#define TRAIT_NO_SECOND_WIND "no_second_wind"
-#define TRAIT_NOCRITPAIN "no_crit_pain"
#define TRAIT_NO_MED_HVY_ARMOR "no_med_heavy_armor"
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index b407fcf08b5..4a80b91a528 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -177,7 +177,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_TASED_RESISTANCE" = TRAIT_TASED_RESISTANCE,
"TRAIT_TESLA_SHOCKIMMUNE" = TRAIT_TESLA_SHOCKIMMUNE,
"TRAIT_THERMAL_VISION" = TRAIT_THERMAL_VISION,
- "TRAIT_TACKLER" = TRAIT_TACKLER,
+ "TRAIT_TACKLER" = TRAIT_TACKLER,
"TRAIT_TACKLERADV" = TRAIT_TACKLERADV,
"TRAIT_TACKLERNONCONX" = TRAIT_TACKLERNONCONX,
"TRAIT_TOXINIMMUNE" = TRAIT_TOXINIMMUNE,
@@ -201,6 +201,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_HEAL_TEND" = TRAIT_HEAL_TEND,
"TRAIT_IMPROVED_HEALING" = TRAIT_IMPROVED_HEALING,
"TRAIT_ARTIFACT_IDENTIFY" = TRAIT_ARTIFACT_IDENTIFY,
+
),
/obj/item/bodypart = list(
"TRAIT_PARALYSIS" = TRAIT_PARALYSIS
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 4d181413515..a4c7755f730 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -18,7 +18,24 @@
*/
//Lower left, persistent menu
-#define ui_inventory "WEST:6,SOUTH:5"
+#define ui_inventory "WEST:6,SOUTH:3"
+
+//Pop-up inventory
+
+//top row
+#define ui_head "WEST+1:8,SOUTH+3:11"
+#define ui_glasses "WEST:6,SOUTH+3:11"
+#define ui_ears "WEST+2:10,SOUTH+3:11"
+
+//middle row
+#define ui_neck "WEST:6,SOUTH+2:9"
+#define ui_mask "WEST+1:8,SOUTH+2:9"
+#define ui_gloves "WEST+2:10,SOUTH+2:9"
+
+//bottom row
+#define ui_oclothing "WEST+1:8,SOUTH+1:7"
+#define ui_iclothing "WEST:6,SOUTH+1:7"
+#define ui_shoes "WEST+2:10,SOUTH+1:7"
//Middle left indicators
#define ui_lingchemdisplay "WEST,CENTER-1:15"
@@ -27,28 +44,53 @@
#define ui_devilsouldisplay "WEST:6,CENTER-1:15"
//Lower center, persistent menu
-#define ui_sstore1 "CENTER-5:10,SOUTH:5"
-#define ui_id "CENTER-4:12,SOUTH:5"
-#define ui_belt "CENTER-3:14,SOUTH:5"
-#define ui_back "CENTER-2:14,SOUTH:5"
+#define ui_sstore1 "WEST+1:6,SOUTH:3"
+#define ui_id "WEST+2:3,SOUTH:3"
+#define ui_belt "WEST+3:-1,SOUTH:3"
+#define ui_back "WEST+6:-13,SOUTH:3" //backpack
+#define ui_storage2 "WEST+4:-5,SOUTH:3" //left pocket
+#define ui_storage1 "WEST+5:-9,SOUTH:3" //right pocket
+#define ui_resistdelay "East-2:-4,SOUTH+0:36" //This is actually resist bar
+#define ui_overridden_resist "East-2:-4,SOUTH+0:20" //this is the actual resist button
+#define ui_combat_toggle "WEST+7:16,SOUTH:2"
+#define ui_zonesel "EAST-3:-5,SOUTH:3"
+#define ui_crafting "WEST+6:-15,SOUTH+1:1"
+#define ui_building "WEST+5:1,SOUTH+1:1"
+#define ui_language_menu "WEST+5:1,SOUTH+1:1"
+
+
+//Right side near hands
+#define ui_wield "CENTER+1:17,SOUTH:4"
+#define ui_acti "CENTER+1:33,SOUTH:3"
+#define ui_pull_resist "East-2:-4,SOUTH+0:4" //THIS IS ACTUALLY THE REST BUTTON? WHAT THE FUCK? ~TK
+#define ui_drop_throw "East-1:-4,SOUTH+0:4"
+#define ui_sprintbufferloc "East-0:-4,SOUTH:18" //buffer orbs
+#define ui_movi "East-0:-4,SOUTH:4"
+//#define ui_zonesel "Center+5:2,SOUTH:3:1"
+#define ui_mood "Center-1:5,South+1:11"
+#define ui_healthdoll "EAST-3:-7,SOUTH+1:17"
+#define ui_health "Right-3:28,South+2:-18"
+#define ui_stamina "Right-2:27,South+1:+3" // replacing internals button
+#define ui_questbook "EAST-3:-4,SOUTH+2:0"
+#define ui_questscanner "EAST-3:4,SOUTH+2:13"
+#define ui_pull_stop "CENTER+2:-4,SOUTH+1:+1"
/proc/ui_hand_position(i) //values based on old hand ui positions (CENTER:-/+16,SOUTH:5)
var/x_off = -(!(i % 2))
var/y_off = round((i-1) / 2)
- return"CENTER+[x_off]:16,SOUTH+[y_off]:5"
+ return"CENTER+[x_off]:16,SOUTH+[y_off]:3"
/proc/ui_equip_position(mob/M)
var/y_off = round((M.held_items.len-1) / 2) //values based on old equip ui position (CENTER: +/-16,SOUTH+1:5)
- return "CENTER:-16,SOUTH+[y_off+1]:5"
+ return "CENTER:-16,SOUTH+[y_off+1]:3"
/proc/ui_swaphand_position(mob/M, which = 1) //values based on old swaphand ui positions (CENTER: +/-16,SOUTH+1:5)
var/x_off = which == 1 ? -1 : 0
var/y_off = round((M.held_items.len-1) / 2)
- return "CENTER+[x_off]:16,SOUTH+[y_off+1]:5"
+ return "CENTER+[x_off]:16,SOUTH+[y_off+1]:3"
-#define ui_storage1 "CENTER+1:18,SOUTH:5"
-#define ui_storage2 "CENTER+2:20,SOUTH:5"
+//Totally unused
#define ui_borg_sensor "CENTER-3:15, SOUTH:5" //borgs
#define ui_borg_lamp "CENTER-4:15, SOUTH:5" //borgs
#define ui_borg_thrusters "CENTER-5:15, SOUTH:5" //borgs
@@ -76,20 +118,14 @@
#define ui_drone_head "CENTER-3:14,SOUTH:5" //maintenance drones
//Lower right, persistent menu
-#define ui_drop_throw "EAST-1:28,SOUTH+1:7"
-#define ui_pull_resist "EAST-2:26,SOUTH+1:7"
-#define ui_pull_stop "EAST-1:28,SOUTH+1:24"
-#define ui_questbook "EAST-3:24,SOUTH+1:5"
-#define ui_movi "EAST-2:26,SOUTH:5"
-#define ui_sprintbufferloc "EAST-2:26,SOUTH:18"
-#define ui_acti "EAST-3:24,SOUTH:5"
-#define ui_zonesel "EAST-1:28,SOUTH:5"
+
+
+
+
+
+
#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12)
-#define ui_crafting "EAST-5:20,SOUTH:5"
-#define ui_building "EAST-5:20,SOUTH:21"
-#define ui_language_menu "EAST-5:4,SOUTH:5"
-#define ui_wield "EAST-1:11,SOUTH+1:22"
-#define ui_questscanner "EAST-2:26,SOUTH+1:5"
+
#define ui_borg_pull "EAST-2:26,SOUTH+1:7"
#define ui_borg_radio "EAST-1:28,SOUTH+1:7"
@@ -105,17 +141,24 @@
//Middle right (status indicators)
-#define ui_pvpbuttons "EAST-4:22, SOUTH:22" //slut directory
-#define ui_healthdoll "EAST-1:28, CENTER-1:13"
-#define ui_health "EAST-1:28, CENTER-0:15"
-#define ui_internal "EAST-1:28, CENTER+2:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter
-#define ui_mood "EAST-1:28, CENTER-2:10"
-#define ui_character_actions "EAST-1:28, CENTER-3:10"
-#define ui_bayou "EAST-1:28, CENTER-4:10"
+#define ui_internal "EAST-1:28, SOUTH+3:11"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter
+
+#define ui_character_actions "EAST-1:28, SOUTH+1:2"
+#define ui_bayou "EAST-1:28, SOUTH+0:2" //Character directory
+#define ui_pvpbuttons "EAST-1:28, SOUTH+1:18" //slut directory
+#define ui_flirt "EAST-1:28, SOUTH+2:0" //slut directory
+#define ui_merp "EAST-1:4, SOUTH+2:0" //slut directory
+#define ui_vore "EAST-1:-11, SOUTH+2:12" //slut directory
+// #define ui_vore_b1 "EAST-1:4, SOUTH+2:7" //slut directory
+// #define ui_vore_b2 "EAST-1:4, SOUTH+2:18" //slut directory
+// #define ui_vore_b3 "EAST-1:4, SOUTH+2:29" //slut directory
+#define ui_touch "EAST-1:28, SOUTH+2:-4" //slut directory
+#define ui_lick "EAST-1:28, SOUTH+3:-10" //slut directory
+#define ui_kiss "EAST-1:28, SOUTH+3:-14" //slut directory
//living
#define ui_living_pull "EAST-1:28,CENTER-2:15"
-#define ui_living_health "EAST-1:28,CENTER:15"
+#define ui_living_health "Right-3:28,South+2:-18"
//borgs
#define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator.
@@ -149,18 +192,6 @@
#define ui_ai_multicam "SOUTH+1:6,WEST+13"
#define ui_ai_add_multicam "SOUTH+1:6,WEST+14"
-//Pop-up inventory
-#define ui_shoes "WEST+1:8,SOUTH:5"
-
-#define ui_iclothing "WEST:6,SOUTH+1:7"
-#define ui_oclothing "WEST+1:8,SOUTH+1:7"
-#define ui_gloves "WEST+2:10,SOUTH+1:7"
-
-#define ui_glasses "WEST:6,SOUTH+3:11"
-#define ui_mask "WEST+1:8,SOUTH+2:9"
-#define ui_ears "WEST+2:10,SOUTH+2:9"
-#define ui_neck "WEST:6,SOUTH+2:9"
-#define ui_head "WEST+1:8,SOUTH+3:11"
//Ghosts
@@ -175,14 +206,11 @@
#define ui_ghost_move_down "SOUTH:6,CENTER+1.75:24"
-//UI position overrides for 1:1 screen layout. (default is 7:5)
-#define ui_stamina "EAST-1:28,CENTER+1:17" // replacing internals button
-#define ui_overridden_resist "EAST-3:24,SOUTH+1:7"
#define ui_questbook_overridden "EAST-3:24,SOUTH+1:7"
#define ui_clickdelay "CENTER,SOUTH+1:-31"
-#define ui_resistdelay "EAST-3:24,SOUTH+1:4"
-#define ui_combat_toggle "EAST-4:22,SOUTH:5"
-#define ui_boxcraft "EAST-2:10,SOUTH+2:6"
-#define ui_boxarea "EAST-3:8,SOUTH+2:6"
-#define ui_boxlang "EAST-3:24,SOUTH+2:6"
+
+
+#define ui_boxcraft "EAST-4:24,SOUTH+1:6"
+#define ui_boxarea "EAST-4:6,SOUTH+1:6"
+#define ui_boxlang "EAST-5:22,SOUTH+1:6"
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index e66e6b9b5bb..b11fb7190cc 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -6,8 +6,8 @@
// The default UI style is the first one in the list
GLOBAL_LIST_INIT(available_ui_styles, list(
- "Fallout" = 'icons/fallout/UI/screen_fallout2.dmi', // Fallout 2 Pip-boy style UI. Walk the wasteland with style. -Pebbles
- "Darkout" = 'icons/fallout/UI/screen_fallout2_dark.dmi', // The original Fallout 2 pipboy UI, dark
+ // "Fallout" = 'icons/fallout/UI/screen_fallout2.dmi', // Fallout 2 Pip-boy style UI. Walk the wasteland with style. -Pebbles
+ // "Darkout" = 'icons/fallout/UI/screen_fallout2_dark.dmi', // The original Fallout 2 pipboy UI, dark
"Midnight" = 'icons/mob/screen_midnight.dmi',
"Retro" = 'icons/mob/screen_retro.dmi',
"Plasmafire" = 'icons/mob/screen_plasmafire.dmi',
@@ -15,7 +15,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
"Operative" = 'icons/mob/screen_operative.dmi',
"Clockwork" = 'icons/mob/screen_clockwork.dmi',
"Minimal" = 'icons/mob/screen_minimal.dmi',
- "Minimal ver. II" = 'icons/mob/screen_minimal2.dmi' // High speed, low drag, with design considerations for humans who play videogames. - Jaeger
))
/proc/ui_style2icon(ui_style)
@@ -69,10 +68,30 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
var/atom/movable/screen/sleep_hud_button
var/atom/movable/screen/triage
var/atom/movable/screen/aooc_hud_button
- var/atom/movable/screen/roll_hud_button
var/atom/movable/screen/newbie_hud_button
var/atom/movable/screen/chardir_hud_button
var/atom/movable/screen/pvp_focus_toggle/pvp_focus_toggle
+ var/atom/movable/screen/who
+ var/atom/movable/screen/flirt_hud_button
+ var/atom/movable/screen/merp_button
+ var/atom/movable/screen/erp_button
+ var/atom/movable/screen/vore_button
+ var/atom/movable/screen/touch_hud_button
+ var/atom/movable/screen/lick_hud_button
+ var/atom/movable/screen/kiss_hud_button
+ var/atom/movable/screen/roll_hud_button
+ var/atom/movable/screen/bite_hud_button
+ var/atom/movable/screen/claw_hud_button
+ var/atom/movable/screen/tail_hud_button
+ var/atom/movable/screen/cuphand_hud_button
+ var/atom/movable/screen/beans_hud_button
+ var/atom/movable/screen/private_panel_button
+ var/atom/movable/screen/give_button
+ var/atom/movable/screen/reload_button
+ var/atom/movable/screen/tend_hud_button
+ var/atom/movable/screen/butt_hud_button
+
+
// subtypes can override this to force a specific UI style
var/ui_style
@@ -129,11 +148,19 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
down = null
sleep_hud_button = null
triage = null
- roll_hud_button = null
aooc_hud_button = null
newbie_hud_button = null
chardir_hud_button = null
pvp_focus_toggle = null
+ flirt_hud_button = null
+ who = null
+ merp_button = null
+ erp_button = null
+ vore_button = null
+ touch_hud_button = null
+ lick_hud_button = null
+ kiss_hud_button = null
+ roll_hud_button = null
QDEL_LIST_ASSOC_VAL(plane_masters)
QDEL_LIST(screenoverlays)
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 8cf5756547f..ab1f76ddfee 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -91,12 +91,12 @@
var/atom/movable/screen/using
var/atom/movable/screen/inventory/inv_box
- using = new/atom/movable/screen/language_menu
- using.icon = ui_style
- if(!widescreenlayout) // CIT CHANGE
- using.screen_loc = ui_boxlang // CIT CHANGE
- using.hud = src
- static_inventory += using
+ // using = new/atom/movable/screen/language_menu
+ // using.icon = ui_style
+ // if(!widescreenlayout) // CIT CHANGE
+ // using.screen_loc = ui_boxlang // CIT CHANGE
+ // using.hud = src
+ // static_inventory += using
using = new /atom/movable/screen/area_creator
using.icon = ui_style
@@ -105,13 +105,6 @@
using.hud = src
static_inventory += using
- using = new /atom/movable/screen/craft
- using.icon = ui_style
- if(!widescreenlayout) // CIT CHANGE
- using.screen_loc = ui_boxcraft // CIT CHANGE
- using.hud = src
- static_inventory += using
-
action_intent = new /atom/movable/screen/act_intent/segmented
action_intent.icon_state = mymob.a_intent
action_intent.hud = src
@@ -389,10 +382,6 @@
triage.hud = src
infodisplay += triage
- roll_hud_button = new /atom/movable/screen/roll_hud_button()
- roll_hud_button.hud = src
- infodisplay += roll_hud_button
-
aooc_hud_button = new /atom/movable/screen/aooc_hud_button()
aooc_hud_button.hud = src
infodisplay += aooc_hud_button
@@ -401,13 +390,89 @@
newbie_hud_button.hud = src
infodisplay += newbie_hud_button
- chardir_hud_button = new /atom/movable/screen/chardir_hud_button()
- chardir_hud_button.hud = src
- infodisplay += chardir_hud_button
+ roll_hud_button = new /atom/movable/screen/roll_hud_button()
+ roll_hud_button.hud = src
+ infodisplay += roll_hud_button
+
+ // chardir_hud_button = new /atom/movable/screen/chardir_hud_button()
+ // chardir_hud_button.hud = src
+ // infodisplay += chardir_hud_button
+
+ // pvp_focus_toggle = new /atom/movable/screen/pvp_focus_toggle()
+ // pvp_focus_toggle.hud = src
+ // infodisplay += pvp_focus_toggle
- pvp_focus_toggle = new /atom/movable/screen/pvp_focus_toggle()
- pvp_focus_toggle.hud = src
- infodisplay += pvp_focus_toggle
+ who = new /atom/movable/screen/who()
+ who.hud = src
+ infodisplay += who
+
+ flirt_hud_button = new /atom/movable/screen/flirt_hud_button()
+ flirt_hud_button.hud = src
+ infodisplay += flirt_hud_button
+
+ merp_button = new /atom/movable/screen/merp_button()
+ merp_button.hud = src
+ infodisplay += merp_button
+
+ erp_button = new /atom/movable/screen/erp_button()
+ erp_button.hud = src
+ infodisplay += erp_button
+
+ vore_button = new /atom/movable/screen/foldout/vore_button()
+ vore_button.hud = src
+ infodisplay += vore_button
+
+ touch_hud_button = new /atom/movable/screen/touch_hud_button()
+ touch_hud_button.hud = src
+ infodisplay += touch_hud_button
+
+ lick_hud_button = new /atom/movable/screen/lick_hud_button()
+ lick_hud_button.hud = src
+ infodisplay += lick_hud_button
+
+ kiss_hud_button = new /atom/movable/screen/kiss_hud_button()
+ kiss_hud_button.hud = src
+ infodisplay += kiss_hud_button
+
+ bite_hud_button = new /atom/movable/screen/bite_hud_button()
+ bite_hud_button.hud = src
+ infodisplay += bite_hud_button
+
+ claw_hud_button = new /atom/movable/screen/claw_hud_button()
+ claw_hud_button.hud = src
+ infodisplay += claw_hud_button
+
+ tail_hud_button = new /atom/movable/screen/tail_hud_button()
+ tail_hud_button.hud = src
+ infodisplay += tail_hud_button
+
+ cuphand_hud_button = new /atom/movable/screen/cuphand_hud_button()
+ cuphand_hud_button.hud = src
+ infodisplay += cuphand_hud_button
+
+ private_panel_button = new /atom/movable/screen/private_panel_button()
+ private_panel_button.hud = src
+ infodisplay += private_panel_button
+
+ give_button = new /atom/movable/screen/give_button()
+ give_button.hud = src
+ infodisplay += give_button
+
+ reload_button = new /atom/movable/screen/reload_button()
+ reload_button.hud = src
+ infodisplay += reload_button
+
+ beans_hud_button = new /atom/movable/screen/beans_hud_button()
+ beans_hud_button.hud = src
+ infodisplay += beans_hud_button
+
+ tend_hud_button = new /atom/movable/screen/tend_hud_button()
+ tend_hud_button.hud = src
+ infodisplay += tend_hud_button
+
+ butt_hud_button = new /atom/movable/screen/butt_hud_button()
+ butt_hud_button.hud = src
+ infodisplay += butt_hud_button
pull_icon = new /atom/movable/screen/pull()
pull_icon.icon = ui_style
@@ -601,3 +666,4 @@
if(do_after(src, 3 SECONDS, target = src))
src.dna.features["hair_style_2"] = new_style
src.update_hair()
+
diff --git a/code/_onclick/hud/screen_objects/character_actions.dm b/code/_onclick/hud/screen_objects/character_actions.dm
index 960e7511576..3b8ae3cf5d9 100644
--- a/code/_onclick/hud/screen_objects/character_actions.dm
+++ b/code/_onclick/hud/screen_objects/character_actions.dm
@@ -30,14 +30,11 @@
screen_loc = ui_character_actions
/atom/movable/screen/up/Click(location,control,params)
- if(isliving(usr))
- var/mob/living/L = usr
- to_chat(L, span_danger("Double clicking on the same button will make you travel up, if possible."))
- L.lookup()
-
-/atom/movable/screen/up/DblClick(location,control,params)
- var/mob/L = usr
- L.up()
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.layershift_up()
/atom/movable/screen/down
name = "down"
@@ -45,8 +42,11 @@
screen_loc = ui_character_actions
/atom/movable/screen/down/Click(location,control,params)
- var/mob/L = usr
- L.down()
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.layershift_down()
/atom/movable/screen/sleep_hud_button
name = "sleep toggle"
@@ -58,43 +58,6 @@
var/mob/living/L = usr
L.toggle_mob_sleep()
-// Despite being defined, this doesn't render on screen in any capacity, didnt extensively test
-/atom/movable/screen/roll_hud_button
- name = "roll dice"
- icon_state = "skillcheck"
- screen_loc = ui_mood
-
-/atom/movable/screen/roll_hud_button/Click(location,control,params,)
-// This stuff needs to be changed because it was directly lifted from clothing
- var/static/list/choices = list(
- "Brawn" = image(icon = 'icons/obj/stationary.dmi', icon_state = "fitnessweight-w"),
- "Awareness" = image(icon = 'icons/obj/status_display.dmi', icon_state = "ai_friend"),
- "Toughness" = image(icon = 'modular_coyote/icons/objects/weapons.dmi', icon_state = "imperial_kite"),
- "Moxie" = image(icon = 'icons/mob/screen_gen.dmi', icon_state = "mood9"),
- "Smarts" = image(icon = 'modular_roguetown/items/books.dmi', icon_state = "ledger0"),
- "Deftness" = image(icon = 'icons/obj/implants.dmi', icon_state = "warp"),
- "Fate" = image(icon = 'icons/obj/economy.dmi', icon_state = "coin_iron_flip"),
- )
- var/mob/user = usr
- var/choice = show_radial_menu(user, src, choices, radius = 32,)
- switch(choice)
- if("Brawn")
- user.emote("special_strength")
- if("Awareness")
- user.emote("special_perception")
- if("Toughness")
- user.emote("special_endurance")
- if("Moxie")
- user.emote("special_charisma")
- if("Smarts")
- user.emote("special_intelligence")
- if("Deftness")
- user.emote("special_agility")
- if("Fate")
- user.emote("special_luck")
- else
- return
-
/atom/movable/screen/triage
name = "triage button"
icon_state = "triage"
@@ -158,14 +121,486 @@
/atom/movable/screen/chardir_hud_button/Click(location,control,params)
if(usr.client)
- usr.client.who()
+ usr.client.show_character_directory()
+
+/atom/movable/screen/who
+ name = "Who"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "who" // milhouse who
+ screen_loc = "EAST-3:-4, SOUTH+1:-13"
+
+/atom/movable/screen/who/Click(location,control,params)
+ SSwho.Who(usr.client)
+
+/atom/movable/screen/flirt_hud_button
+ name = "Flirt with people!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "flirt"
+ screen_loc = ui_flirt
+
+/atom/movable/screen/flirt_hud_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.emote("flirt")
+
+/atom/movable/screen/erp_button
+ name = "ERP with someone!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "erp"
+ screen_loc = "EAST-1:4, SOUTH+2:11"
+
+/atom/movable/screen/erp_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.emote("erp")
+
+/atom/movable/screen/merp_button
+ name = "Open mechanical ERP window!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "merp"
+ screen_loc = ui_merp
+
+/atom/movable/screen/merp_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(H))
+ to_chat(H, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ var/obj/item/hand_item/merp_doer/brick = new(H)
+
+ if(H.put_in_hands(brick))
+ to_chat(H, span_notice("Now click someone with this thing (or yourself)! Range is infinite, so you can totally interact with people across the bar!"))
+ else
+ qdel(brick)
+
+/// special cool button that turns into more buttons!
+/atom/movable/screen/foldout
+ name = "Cool Foldabutton"
+ icon = 'icons/mob/screen_gen_vore.dmi'
+ icon_state = "vore_off"
+ var/icon/closed_icon = 'icons/mob/screen_gen_vore.dmi'
+ var/closed_state = "vore_off"
+ var/closed_loc = "EAST-1:-11, SOUTH+2:12"
+ var/icon/open_icon = 'icons/mob/screen_gen_vore.dmi'
+ var/open_state = "vore_on"
+ var/open_loc = "EAST-1:-22, SOUTH+2:12"
+ var/list/foldies = list()
+ var/open = FALSE
+
+/atom/movable/screen/foldout/Initialize(mapload)
+ . = ..()
+ InitButtons()
+
+/atom/movable/screen/foldout/Click(location,control,params)
+ if(!usr.client || !ismob(usr))
+ return
+ if(open)
+ FoldUp(usr)
+ else
+ UnFold(usr)
+
+/atom/movable/screen/foldout/proc/UnFold(mob/user)
+ if(open)
+ return
+ open = TRUE
+ for(var/atom/movable/screen/sub_button/S in foldies)
+ S.Show()
+ icon = open_icon
+ icon_state = open_state
+ screen_loc = open_loc
+
+/atom/movable/screen/foldout/proc/FoldUp(mob/user)
+ if(!open)
+ return
+ open = FALSE
+ for(var/atom/movable/screen/sub_button/S in foldies)
+ S.Hide()
+ icon = closed_icon
+ icon_state = closed_state
+ screen_loc = closed_loc
+
+/atom/movable/screen/foldout/proc/InitButtons(mob/user)
+ var/list/inittedbuttons = list()
+ for(var/i in 1 to LAZYLEN(foldies))
+ var/atom/movable/screen/sub_button/S = foldies[i]
+ S = new S()
+ S.parent = src
+ S.hud = hud
+ S.Hide()
+ inittedbuttons += S
+ foldies = inittedbuttons
+
+////////////////////////////////////////////////////////////
+/atom/movable/screen/sub_button // aka, my cl-
+ name = "sub_button"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "sub_button"
+ // screen_loc = ui_vore_b1
+ var/atom/movable/screen/foldout/parent
+
+/atom/movable/screen/sub_button/Click(location,control,params)
+ parent.FoldUp(usr)
+
+/atom/movable/screen/sub_button/proc/Hide()
+ alpha = 0
+ mouse_opacity = 0
+ var/client/C = extract_client(usr)
+ if(C)
+ C.screen -= src
+
+/atom/movable/screen/sub_button/proc/Show()
+ alpha = 255
+ mouse_opacity = 1
+ var/client/C = extract_client(usr)
+ if(C)
+ C.screen |= src
+
+////////////////////////////////////////////////////////////
+/atom/movable/screen/foldout/vore_button
+ name = "Vore Menu Menu"
+ desc = "It's the menu for the vore menu!"
+ icon = 'icons/mob/screen_gen_vore.dmi'
+ icon_state = "vore_off"
+ screen_loc = "EAST-1:-11, SOUTH+2:23"
+ closed_icon = 'icons/mob/screen_gen_vore.dmi'
+ closed_state = "vore_off"
+ closed_loc = "EAST-1:-11, SOUTH+2:23"
+ open_icon = 'icons/mob/screen_gen_vore.dmi'
+ open_state = "vore_on" // no YOURE the voreon
+ open_loc = "EAST-1:-22, SOUTH+2:23"
+ foldies = list(
+ /atom/movable/screen/sub_button/vore_menu,
+ /atom/movable/screen/sub_button/vorer_thing,
+ /atom/movable/screen/sub_button/eater_thing,
+ /atom/movable/screen/sub_button/enabler,
+ )
+
+////////////////////////////////////////////////////////////
+//stat roller
+
+// Despite being defined, this doesn't render on screen in any capacity, didnt extensively test
+/atom/movable/screen/roll_hud_button
+ name = "roll dice"
+ icon_state = "skillcheck"
+ screen_loc = "RIGHT-2:-4,South+2:0"
+
+/atom/movable/screen/roll_hud_button/Click(location,control,params,)
+// This stuff needs to be changed because it was directly lifted from clothing
+ var/static/list/choices = list(
+ "Brawn" = image(icon = 'icons/obj/stationary.dmi', icon_state = "fitnessweight-w"),
+ "Awareness" = image(icon = 'icons/obj/status_display.dmi', icon_state = "ai_friend"),
+ "Toughness" = image(icon = 'modular_coyote/icons/objects/weapons.dmi', icon_state = "imperial_kite"),
+ "Moxie" = image(icon = 'icons/mob/screen_gen.dmi', icon_state = "mood9"),
+ "Smarts" = image(icon = 'modular_roguetown/items/books.dmi', icon_state = "ledger0"),
+ "Deftness" = image(icon = 'icons/obj/implants.dmi', icon_state = "warp"),
+ "Fate" = image(icon = 'icons/obj/economy.dmi', icon_state = "coin_iron_flip"),
+ )
+ var/mob/user = usr
+ var/choice = show_radial_menu(user, src, choices, radius = 32,)
+ switch(choice)
+ if("Brawn")
+ user.emote("special_strength")
+ if("Awareness")
+ user.emote("special_perception")
+ if("Toughness")
+ user.emote("special_endurance")
+ if("Moxie")
+ user.emote("special_charisma")
+ if("Smarts")
+ user.emote("special_intelligence")
+ if("Deftness")
+ user.emote("special_agility")
+ if("Fate")
+ user.emote("special_luck")
+ else
+ return
+
+////////////////////////////////////////////////////////////
+/atom/movable/screen/sub_button/vore_menu
+ name = "Open the Vore Options!"
+ icon = 'icons/mob/screen_gen_vore.dmi'
+ icon_state = "vore_options"
+ screen_loc = "EAST-1:-22, SOUTH+2:23"
+
+/atom/movable/screen/sub_button/vore_menu/Click(location,control,params)
+ . = ..()
+ var/mob/living/L = usr
+ if(!ishuman(L))
+ to_chat(L, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ L?.insidePanel()
+ to_chat(L, span_notice("You opened the vore options! Hopefully!"))
+
+////////////////////////////////////////////////////////////
+/atom/movable/screen/sub_button/vorer_thing
+ name = "Vore someone!"
+ desc = "This will either give you an item to vore someone with, or vore whoever youre grabbing!"
+ icon = 'icons/mob/screen_gen_vore.dmi'
+ icon_state = "vore_eat"
+ screen_loc = "EAST-1:-22, SOUTH+2:23"
+
+/atom/movable/screen/sub_button/vorer_thing/Click(location,control,params)
+ . = ..()
+ var/mob/living/L = usr
+ if(!ishuman(L))
+ to_chat(L, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ L.emote("vore")
+
+////////////////////////////////////////////////////////////
+
+/atom/movable/screen/sub_button/eater_thing
+ name = "Feed someone to someone!"
+ desc = "This will either give you an item to feed someone to someone with, or feed whoever youre grabbing to whoever youre grabbing!"
+ icon = 'icons/mob/screen_gen_vore.dmi'
+ icon_state = "vore_feed"
+ screen_loc = "EAST-1:-22, SOUTH+2:23"
+
+/atom/movable/screen/sub_button/eater_thing/Click(location,control,params)
+ . = ..()
+ var/mob/living/L = usr
+ if(!ishuman(L))
+ to_chat(L, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ L.emote("feed")
+
+/atom/movable/screen/sub_button/enabler
+ name = "Enable Vore!"
+ desc = "Looks like your vore is off, click here to enable it!"
+ icon = 'icons/mob/screen_gen_vore.dmi'
+ icon_state = "vore_enable"
+ screen_loc = "EAST-1:-22, SOUTH+2:23"
+
+/atom/movable/screen/sub_button/enabler/Show()
+ if(CHECK_PREFS(usr, VOREPREF_MASTER))
+ return // already enabled
+ . = ..() // WINDOWS G, ENABLE
+
+/atom/movable/screen/sub_button/enabler/Click(location,control,params)
+ . = ..()
+ var/mob/living/L = usr
+ if(!ishuman(L))
+ to_chat(L, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ var/datum/preferences/P = extract_prefs(L)
+ P.allow_eating_sounds = TRUE
+ P.allow_digestion_sounds = TRUE
+ P.allow_digestion_damage = TRUE
+ P.allow_digestion_death = TRUE
+ P.allow_vore_messages = TRUE
+ P.allow_death_messages = TRUE
+ P.allow_being_prey = TRUE
+ P.allow_being_fed_to_others = TRUE
+ P.allow_being_fed_prey = TRUE
+ P.allow_seeing_belly_descriptions = TRUE
+ P.allow_being_sniffed = TRUE
+ P.master_vore_toggle = TRUE
+ P.save_character()
+ to_chat(L, span_notice("Vore Core online! Be sure to set up your vore preferences!"))
+
+
+////////////////////////////////////////////////////////////
+/atom/movable/screen/touch_hud_button
+ name = "Touch on people!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "touch"
+ screen_loc = ui_touch
+
+/atom/movable/screen/touch_hud_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.emote("touch")
+
+/atom/movable/screen/lick_hud_button
+ name = "lick on people!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "lick"
+ screen_loc = ui_lick
+
+/atom/movable/screen/lick_hud_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.emote("lick")
+
+/atom/movable/screen/kiss_hud_button
+ name = "kiss on people!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "kiss"
+ screen_loc = ui_kiss
+
+/atom/movable/screen/kiss_hud_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.emote("kiss")
+
+////////////////////////////////////////////////////////////
+/// Private panel button
+/atom/movable/screen/private_panel_button
+ name = "fool with your privates!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "privatepanel"
+ screen_loc = "EAST-0:-4, SOUTH+3:-3"
+
+/atom/movable/screen/private_panel_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.toggle_genitals()
+
+////////////////////////////////////////////////////////////
+/// give button
+/atom/movable/screen/give_button
+ name = "give somebody something!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "give"
+ screen_loc = "CENTER+1:15,SOUTH+1:3"
+
+/atom/movable/screen/give_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.give()
+
+////////////////////////////////////////////////////////////
+/// reload button
+/atom/movable/screen/reload_button
+ name = "reload a firearm!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "reload"
+ screen_loc = "CENTER+2:11,SOUTH+1:3"
+
+/atom/movable/screen/reload_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.ReloadGun()
+
+////////////////////////////////////////////////////////////
+/// Bite button
+/atom/movable/screen/bite_hud_button
+ name = "bite on people!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "bite"
+ screen_loc = "EAST-1:28, SOUTH+5:-14"
+
+/atom/movable/screen/bite_hud_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.emote("bite")
+
+////////////////////////////////////////////////////////////
+/// Claw button
+/atom/movable/screen/claw_hud_button
+ name = "claw on people!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "claw"
+ screen_loc = "EAST-1:28, SOUTH+5:-9"
+
+/atom/movable/screen/claw_hud_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.emote("claw")
+
+////////////////////////////////////////////////////////////
+/// Tail button
+/atom/movable/screen/tail_hud_button
+ name = "tail on people!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "tail"
+ screen_loc = "EAST-1:28, SOUTH+4:-3"
+
+/atom/movable/screen/tail_hud_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.emote("tailer")
+
+////////////////////////////////////////////////////////////
+/// Cuphand button
+/atom/movable/screen/cuphand_hud_button
+ name = "cuphand on people!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "cuphand"
+ screen_loc = "EAST-1:4, SOUTH+4: 12"
+
+/atom/movable/screen/cuphand_hud_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.emote("cuphand")
+
+////////////////////////////////////////////////////////////
+/// Beans button
+/atom/movable/screen/beans_hud_button
+ name = "bean on people!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "beans"
+ screen_loc = "EAST-1:4, SOUTH+4:8"
+
+/atom/movable/screen/beans_hud_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.emote("beans")
+
+////////////////////////////////////////////////////////////
+/// Tend button
+/atom/movable/screen/tend_hud_button
+ name = "tend on people!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "tend"
+ screen_loc = "EAST-1:4, SOUTH+5:1"
+
+/atom/movable/screen/tend_hud_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ H.emote("tend")
+
+////////////////////////////////////////////////////////////
+/// Butt button
+/atom/movable/screen/butt_hud_button
+ name = "butt on people!"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "butt"
+ screen_loc = "EAST-1:28, SOUTH+4:-14"
+
+/atom/movable/screen/butt_hud_button/Click(location,control,params)
+ var/mob/living/carbon/human/H = usr
+ if(!ishuman(usr))
+ to_chat(usr, span_alert("Sorry! You've gotta be a fully spawned in character with hopes and dreams to use this!"))
+ return
+ if(!H.has_butt())
+ to_chat(H, span_alert("[H], you have no butt!"))
+ return
+ H.emote("butt")
/atom/movable/screen/pvp_focus_toggle
name = "PVP focus On/Off"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "pvp_blank"
screen_loc = ui_pvpbuttons
- var/mytobe = PVP_NEUTRAL
+ var/mytobe
/atom/movable/screen/pvp_focus_toggle/Initialize(mapload)
. = ..()
@@ -181,6 +616,9 @@
if(HAS_TRAIT(usr, TRAIT_PVPFOC))
changeto = PVP_NEUTRAL
else
+ if(HAS_TRAIT(usr, TRAIT_NO_PVP_EVER))
+ to_chat(usr, span_alert("My role/quirks/setup doesn't allow for PVP!"))
+ return
changeto = PVP_YES
else if(_y>=17) // PVP opt out on
if(HAS_TRAIT(usr, TRAIT_PVEFOC))
diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm
index 3b53c6d804f..289857ed536 100644
--- a/code/controllers/subsystem/chat.dm
+++ b/code/controllers/subsystem/chat.dm
@@ -60,7 +60,7 @@ SUBSYSTEM_DEF(chat)
priority = FIRE_PRIORITY_CHAT
init_order = INIT_ORDER_CHAT
- var/forbid_ghosting = FALSE
+ var/forbid_ghosting = TRUE
var/chat_display_plane = RUNECHAT_PLANE
/*
** Base
@@ -84,7 +84,6 @@ SUBSYSTEM_DEF(chat)
var/extended_exclaim_distance = 21
var/far_distance = 6 // how far until they're considered offscreen
- var/list/vines2spawn = list()
var/static/list/unconscious_allowed_modes = list(
MODE_CHANGELING = TRUE,
@@ -129,7 +128,7 @@ SUBSYSTEM_DEF(chat)
var/list/flirt_cooldowns = list()
/// how long between flirts can we flirt
var/flirt_cooldown_time = 5 SECONDS
- var/debug_character_directory = 75
+ var/debug_character_directory = 0
var/same_mode_timeout = 0 //1 MINUTES
var/max_horny_distance = 2
@@ -234,6 +233,8 @@ SUBSYSTEM_DEF(chat)
var/numbermal_max = 5
var/numbermal_default = 1
+ var/list/horny_message_cache = list()
+
/datum/controller/subsystem/chat/Initialize(start_timeofday)
setup_emoticon_cache()
build_flirt_datums()
@@ -244,12 +245,7 @@ SUBSYSTEM_DEF(chat)
to_chat(world, span_boldnotice("Initialized [LAZYLEN(flirts)] flirty messages! <3"))
to_chat(world, span_boldnotice("VisualChat engaged! Have a very visual day! <3"))
// to_chat(world, span_boldnotice("Initialized [LAZYLEN(stock_image_packs)] stock image packs! 'w'"))
- spawn(5 SECONDS)
- if(LAZYLEN(vines2spawn))
- for(var/atom/A in vines2spawn)
- message_admins("Trollvines spawned at [ADMIN_JMP(A)]. Fun!")
- // vines2spawn -= A
- // vines2spawn.Cut()
+
// /datum/controller/subsystem/chat/proc/build_stock_image_packs()
// stock_image_packs.Cut()
// for(var/paq in subtypesof(/datum/horny_image_pack))
@@ -1195,6 +1191,86 @@ SUBSYSTEM_DEF(chat)
chai.show_to(viewer)
return TRUE
+/datum/controller/subsystem/chat/proc/GetHornyThingDatum(mob/horny)
+ if(!istype(horny))
+ return
+ if(!horny.client)
+ return
+ var/quid = SSeconomy.extract_quid(horny)
+ if(!quid)
+ return
+ var/datum/horny_thing/thing = LAZYACCESS(horny_message_cache, quid)
+ if(!thing)
+ thing = new(horny)
+ horny_message_cache[quid] = thing
+ return thing
+
+/datum/controller/subsystem/chat/proc/GetHornyHistory(mob/horny)
+ if(!istype(horny))
+ return
+ if(!horny.client)
+ return
+ var/datum/horny_thing/thing = GetHornyThingDatum(horny)
+ if(!thing)
+ return
+ return thing.ShowHistory()
+
+/datum/controller/subsystem/chat/proc/StoreHornyMessage(mob/horny, message)
+ if(!istype(horny))
+ return
+ if(!horny.client)
+ return
+ var/datum/horny_thing/thing = GetHornyThingDatum(horny)
+ if(!thing)
+ return
+ thing.StoreMessage(message)
+
+/datum/controller/subsystem/chat/proc/StashHornyThing(mob/horny)
+ if(!istype(horny))
+ return
+ if(!horny.client)
+ return
+ var/datum/horny_thing/thing = GetHornyThingDatum(horny)
+ if(!thing)
+ return
+ thing.Stash()
+
+/datum/controller/subsystem/chat/proc/UnstashHornyThing(mob/horny)
+ if(!istype(horny))
+ return
+ if(!horny.client)
+ return
+ var/datum/horny_thing/thing = GetHornyThingDatum(horny)
+ if(!thing)
+ return
+ return thing.Unstash()
+
+/datum/horny_thing
+ var/quid = ""
+ var/obj/item/hand_item/subtle_catapult/sc
+ var/list/msgs = list()
+
+/datum/horny_thing/New(mob/horny)
+ . = ..()
+ quid = SSeconomy.extract_quid(horny)
+ sc = new()
+
+/datum/horny_thing/proc/StoreMessage(message)
+ msgs.Insert(1, message)
+ if(LAZYLEN(msgs) > 300)
+ msgs.len = 300 // juuuust in case
+
+/datum/horny_thing/proc/ShowHistory()
+ return msgs
+
+/datum/horny_thing/proc/Stash()
+ sc.moveToNullspace()
+
+/datum/horny_thing/proc/Unstash()
+ if(QDELETED(sc))
+ sc = new()
+ return sc
+
/datum/controller/subsystem/chat/proc/flirt_debug_toggle()
TOGGLE_VAR(flirt_debug)
build_flirt_datums()
@@ -1204,7 +1280,7 @@ SUBSYSTEM_DEF(chat)
if(!isliving(flirter))
return
if(flirter.get_active_held_item() && flirter.get_inactive_held_item())
- to_chat(flirter, span_warning("Your hands are too full to flirt! Yes, you need your hands to flirt."))
+ to_chat(flirter, span_warning("My hands are too full to flirt! Yes, you need your hands to flirt."))
return
var/obj/item/hand_item/flirt_targetter/hiya = new(flirter)
@@ -1229,7 +1305,7 @@ SUBSYSTEM_DEF(chat)
to_chat(usr, span_hypnophrase("They're not in the right mood for flirting."))
return
// if(A == usr)
- // to_chat(usr, span_hypnophrase("You take a deep breath and psyche yourself up to flirt with someone other than yourself for a change. You got this, tiger!"))
+ // to_chat(usr, span_hypnophrase("I take a deep breath and psyche yourself up to flirt with someone other than yourself for a change. You got this, tiger!"))
// return
return TRUE
@@ -1245,11 +1321,11 @@ SUBSYSTEM_DEF(chat)
/mob/verb/check_out(mob/A as mob in view())
set name = "Flirt with"
- set category = "Roleplaying"
+ set category = "IC"
if(!SSchat.can_usr_flirt_with_this(A))
return
- to_chat(src, span_notice("You get ready to flirt with [A]. What will you do?"))
+ to_chat(src, span_notice("I get ready to flirt with [A]. What will you do?"))
to_chat(src, span_notice("HOW TO USE: Click on the emote you want to use, and it'll direct a flirtatious message toward them! That's it! \
Be sure to respect their OOC preferences, don't be a creep (unless they like it), and have fun!"))
SSchat.add_flirt_target(src, A)
@@ -1272,7 +1348,7 @@ SUBSYSTEM_DEF(chat)
var/datum/flirt/F = LAZYACCESS(SSchat.flirtsByNumbers, whichm)
if(F)
return F.give_flirter(user)
- to_chat(user, span_notice("You get ready to flirt. What will you do? And who with?"))
+ to_chat(user, span_notice("I get ready to flirt. What will you do? And who with?"))
to_chat(user, span_notice("HOW TO USE: Click on the emote you want to use, and it'll give you a thing in your hand! Just click on whoever you want to send a flirtatious message to, or just use it in hand to send a message to everyone nearby. That's it! \
Be sure to respect their OOC preferences, don't be a creep (unless they like it), and have fun!"))
SSchat.ui_interact(user)
diff --git a/code/controllers/subsystem/datumrentals.dm b/code/controllers/subsystem/datumrentals.dm
index 0ff8631e264..0d9dec18f24 100644
--- a/code/controllers/subsystem/datumrentals.dm
+++ b/code/controllers/subsystem/datumrentals.dm
@@ -25,9 +25,8 @@ SUBSYSTEM_DEF(rentaldatums)
/// now for the rental mommies
var/list/chat_datums = list()
+ var/list/pda_datums = list()
var/chat_uses_mommy = TRUE // my code my names
- var/next_prune = 0
- var/prune_time = 30 SECONDS
/datum/controller/subsystem/rentaldatums/Initialize(start_timeofday)
init_datums()
@@ -36,14 +35,14 @@ SUBSYSTEM_DEF(rentaldatums)
/datum/controller/subsystem/rentaldatums/proc/init_datums()
chat_datums = list()
chat_datums += new /datum/rental_mommy/chat()
+ pda_datums = list()
+ pda_datums += new /datum/rental_mommy/pda()
/datum/controller/subsystem/rentaldatums/proc/CheckoutMommy(mom)
var/list/mymom = LAZYACCESS(vars, mom)
if(!mymom)
return null
- if(world.time > next_prune)
- Prune()
for(var/datum/rental_mommy/chat/mommy in mymom)
if(mommy.checkout())
return mommy
@@ -56,13 +55,8 @@ SUBSYSTEM_DEF(rentaldatums)
/datum/controller/subsystem/rentaldatums/proc/CheckoutChatMommy()
return CheckoutMommy("chat_datums")
-/datum/controller/subsystem/rentaldatums/proc/Prune()
- for(var/datum/rental_mommy/RM in chat_datums)
- if(RM.available)
- continue
- if(world.time > RM.checked_out_until)
- RM.checkin()
- next_prune = world.time + prune_time
+/datum/controller/subsystem/rentaldatums/proc/CheckoutPDAMommy()
+ return CheckoutMommy("pda_datums")
/datum/rental_mommy // hey isnt that your mom?
/// Is your mom available?
@@ -74,11 +68,12 @@ SUBSYSTEM_DEF(rentaldatums)
/datum/rental_mommy/proc/checkout()
if(!available)
- return
- checkin()
+ if(world.time < checked_out_until)
+ return
+ checkin()
available = FALSE
uses += 1
- checked_out_until = (world.time + (10 SECONDS))
+ checked_out_until = (world.time + 5 MINUTES)
return TRUE
/datum/rental_mommy/proc/checkin()
@@ -171,6 +166,13 @@ SUBSYSTEM_DEF(rentaldatums)
var/langtreated
var/cant_language
var/is_thing
+ var/is_loud
+ var/is_muffled
+ var/dots_distance
+ var/dots_maxdistance
+ var/dots_some_anyway
+ var/dots_please
+ var/list/exclusive_targets = list()
/datum/rental_mommy/chat/copy_mommy(datum/rental_mommy/chat/mommy)
if(!..())
@@ -242,6 +244,13 @@ SUBSYSTEM_DEF(rentaldatums)
langtreated = mommy.langtreated
cant_language = mommy.cant_language
is_thing = mommy.is_thing
+ is_loud = mommy.is_loud
+ is_muffled = mommy.is_muffled
+ dots_distance = mommy.dots_distance
+ dots_maxdistance = mommy.dots_maxdistance
+ dots_some_anyway = mommy.dots_some_anyway
+ dots_please = mommy.dots_please
+ exclusive_targets = mommy.exclusive_targets
/datum/rental_mommy/chat/wipe()
original_message = ""
@@ -311,46 +320,38 @@ SUBSYSTEM_DEF(rentaldatums)
langtreated = null
cant_language = null
is_thing = null
+ is_loud = null
+ is_muffled = null
+ dots_distance = null
+ dots_maxdistance = null
+ dots_some_anyway = null
+ dots_please = null
+ exclusive_targets = list()
-// /// Know what, know what? screw it, I'm compiling all the chat procs into this datum
-// /datum/rental_mommy/chat/proc/handle_say(
-// atom/speaker,
-// message,
-// bubble_type,
-// list/spans = list(),
-// sanitize,
-// language,
-// ignore_spam,
-// forced,
-// only_overhead,
-// direct_to_mob
-// )
-
-// src.original_message = message
-// src.message = message
-// src.source = speaker
-// src.message_mode = MODE_SAY
-// src.spans = spans.Copy()
-// src.sanitize = sanitize
-// src.bubble_type = bubble_type
-// src.language = language
-// src.only_overhead = only_overhead
-// src.source_quid = extract_quid(src)
-// src.source_ckey = ckey
-// src.direct_to_mob = direct_to_mob
-// src.ignore_spam = ignore_spam
-// src.forced = forced
-
-// if(ismob(source))
-// compile_from_mob(speaker)
-
-// var/talk_key = get_key(momchat.message)
-// momchat.message_key = talk_key
+/datum/rental_mommy/pda
+ var/name = ""
+ var/job = ""
+ var/message = ""
+ var/obj/sender_pda = null
+ var/senderquid = ""
+ var/senderckey = ""
+/datum/rental_mommy/pda/copy_mommy(datum/rental_mommy/pda/mommy)
+ if(!..())
+ CRASH("Tried to copy a mommy of a different type")
+ name = mommy.name
+ job = mommy.job
+ message = mommy.message
+ sender_pda = mommy.sender_pda
+ senderquid = mommy.senderquid
+ senderckey = mommy.senderckey
-// /mob/living/proc/get_key(message)
-// var/key = message[1]
-// if(key in GLOB.department_radio_prefixes)
-// return lowertext(message[1 + length(key)])
+/datum/rental_mommy/pda/wipe()
+ name = ""
+ job = ""
+ message = ""
+ sender_pda = null
+ senderquid = ""
+ senderckey = ""
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index f21772fc71d..3f6a1cb2f88 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -709,6 +709,8 @@ SUBSYSTEM_DEF(job)
SLOT_W_UNIFORM,\
)
+
+
/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, equipbackpackstuff, bypass_prereqs = FALSE, can_drop = TRUE)
var/mob/the_mob = N
if(!the_mob)
diff --git a/code/game/objects/hand_items.dm b/code/game/objects/hand_items.dm
index f1e30368905..d72869f1002 100644
--- a/code/game/objects/hand_items.dm
+++ b/code/game/objects/hand_items.dm
@@ -52,8 +52,8 @@
/obj/item/hand_item/tactile/toucher //being repurposed as a way to 'feel' the world around the player. Specifically other players though, lets be real.
name = "touch"
desc = "A finger, for touching things."
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "healinghand"
+ icon = 'icons/obj/in_hands.dmi'
+ icon_state = "feeder"
attack_verb = list("touched", "poked", "prodded")
pokesound = 'sound/items/tendingwounds.ogg'
healthing = /obj/item/stack/medical/bruise_pack/lick/touch
@@ -124,8 +124,8 @@
/obj/item/hand_item/tactile/proc/tend_hurt(mob/living/user, mob/living/target)
if(!isliving(user) || !isliving(target))
return
- //if(!HAS_TRAIT(user, needed_trait))
- // return FALSE
+ if(!HAS_TRAIT(user, needed_trait))
+ return FALSE
var/mob/living/mlemmed = target
if(iscarbon(mlemmed) && !mlemmed.get_bodypart(user.zone_selected))
return FALSE
@@ -152,17 +152,21 @@
if(isliving(licked))
user.visible_message(
span_notice("[user] [lick_words[LICK_INTENT]] [action_verb_s] [user == licked ? "[user.p_their()]" : "[licked]'s"] [lick_words[LICK_LOCATION]]."),
- span_notice("You [lick_words[LICK_INTENT]] [action_verb] [user == licked ? "your" : "[licked]'s"] [lick_words[LICK_LOCATION]]."),
- span_notice("You hear [action_verb_ing]."),
+ span_notice("I [lick_words[LICK_INTENT]] [action_verb] [user == licked ? "your" : "[licked]'s"] [lick_words[LICK_LOCATION]]."),
+ span_notice("I hear [action_verb_ing]."),
LICK_SOUND_TEXT_RANGE
)
else
user.visible_message(
span_notice("[user] [lick_words[LICK_INTENT]] [action_verb_s] [user == licked ? "[user.p_them()]self" : "[licked]"]."),
- span_notice("You [lick_words[LICK_INTENT]] [action_verb] [user == licked ? "yourself" : "[licked]"]."),
- span_notice("You hear [action_verb_ing]."),
+ span_notice("I [lick_words[LICK_INTENT]] [action_verb] [user == licked ? "yourself" : "[licked]"]."),
+ span_notice("I hear [action_verb_ing]."),
LICK_SOUND_TEXT_RANGE
)
+ var/list/sounds2play = list()
+ // sounds2play += hitsound
+ sounds2play += pokesound
+ playsound(licked, safepick(sounds2play), 85, TRUE)
if(can_taste && iscarbon(user))
lick_flavor(atom_licked = licked, licker = user)
@@ -270,10 +274,10 @@ touch + help + facing their rear = pat back
slot_flags = INV_SLOTBIT_GLOVES
w_class = WEIGHT_CLASS_TINY
flags_1 = CONDUCT_1
- force = 15
- backstab_multiplier = 1.8
+ force = 0
+ backstab_multiplier = 1.0
throwforce = 0
- wound_bonus = 4
+ wound_bonus = 0
sharpness = SHARP_POINTY
attack_speed = CLICK_CD_MELEE * 0.7
item_flags = PERSONAL_ITEM | ABSTRACT | HAND_ITEM
@@ -350,7 +354,7 @@ touch + help + facing their rear = pat back
/obj/item/hand_item/biter/spicy
name = "Spicy Biter"
- desc = "Your sickly little nibbler, good for dropping fools."
+ desc = "My sickly little nibbler, good for dropping fools."
color = "#44FF44"
force = 35
force_wielded = 45
@@ -455,7 +459,7 @@ touch + help + facing their rear = pat back
/obj/item/hand_item/clawer/spicy
name = "Spicy Clawer"
- desc = "Your gross little litter box rakes, good for puttings idiots on the ground."
+ desc = "My gross little litter box rakes, good for puttings idiots on the ground."
color = "#44FF44"
force = 30
force_wielded = 40
@@ -676,61 +680,213 @@ touch + help + facing their rear = pat back
damtype = BURN
attack_verb = list("seared", "zapped", "fried", "shocked")
-/* *
- *
- */
-
-
-
-
-// /obj/item/hand_item/tactile/licker/proc/bandage_wound(mob/living/licked, mob/living/carbon/user)
-// if(!iscarbon(licked))
-// return FALSE
-// var/obj/item/organ/tongue/our_tongue = user.getorganslot(ORGAN_SLOT_TONGUE)
-// if(!istype(our_tongue.lick_bandage))
-// return FALSE
-// var/obj/item/stack/medical/tongue_bandage = our_tongue.lick_bandage
-// var/mob/living/carbon/mlemmed = licked
-// var/obj/item/bodypart/target_bodypart = mlemmed.get_bodypart(user.zone_selected)
-// if(!target_bodypart)
-// return FALSE
-// if(target_bodypart.status != BODYPART_ORGANIC)
-// return FALSE
-// if(target_bodypart.bleed_dam <= 0)
-// return FALSE
-// var/has_bleeding_wound = FALSE
-// for(var/datum/wound/a_wound in target_bodypart.wounds)
-// if(istype(a_wound, /datum/wound/bleed))
-// has_bleeding_wound = TRUE
-// break
-// if(!has_bleeding_wound)
-// return FALSE
-// if(!target_bodypart.apply_gauze(tongue_bandage, 1, TRUE))
-// return FALSE
-// working = TRUE
-// user.visible_message(
-// span_notice("[user] starts carefully lapping at the wounds on [user == mlemmed ? "[mlemmed.p_their()]" : "[mlemmed]'s"] [target_bodypart.name]..."),
-// span_notice("You start running your tongue across the wounds on [user == mlemmed ? "your" : "[mlemmed]'s"] [target_bodypart.name]..."),
-// span_notice("You hear licking."),
-// LICK_SOUND_TEXT_RANGE
-// )
-// lick_flavor(atom_licked = licked, licker = user)
-// if(!do_mob(user, mlemmed, tongue_bandage.get_delay_time(user, mlemmed, 1), progress = TRUE))
-// user.visible_message(span_alert("[user] was interrupted!"))
-// working = FALSE
-// return LICK_CANCEL
-// working = FALSE
-// if(QDELETED(our_tongue))
-// user.visible_message(span_notice("[user]'s tongue went missing!"))
-// return LICK_CANCEL
-// if(target_bodypart.apply_gauze(tongue_bandage, 1, FALSE))
-// user.visible_message(
-// span_green("[user] applies a fresh coat of coagulating saliva on [user == mlemmed ? "[mlemmed.p_their()]" : "[mlemmed]'s"] [target_bodypart.name]!"),
-// span_green("You apply a fresh coat of coagulating saliva to [user == mlemmed ? "your" : "[mlemmed]'s"] [target_bodypart.name]!"),
-// span_notice("You hear licking."),
-// LICK_SOUND_TEXT_RANGE
-// )
-// lick_flavor(atom_licked = licked, licker = user)
-// return LICK_CANCEL
-// user.visible_message(span_alert("[user] was interrupted!"))
-// return LICK_CANCEL
+
+/obj/item/hand_item/merp_doer
+ name = "MERP doer"
+ desc = "Click someone with this thing to open the MERP interactions menu! From there, you can do all sorts of lewd or not-so-lewd things with them (or yourself!!)!"
+ icon = 'icons/obj/in_hands.dmi'
+ icon_state = "blushfox"
+
+/obj/item/hand_item/merp_doer/attack(mob/living/M, mob/living/user)
+ SEND_SIGNAL(user, COMSIG_CLICK_CTRL_SHIFT, M)
+ qdel(src)
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/obj/item/hand_item/subtle_catapult
+ name = "discrete action delivery system"
+ desc = "Do lewd things in public, without anyone (but whoever you're doing it to) knowing!"
+ icon = 'icons/obj/in_hands.dmi'
+ icon_state = "blushfox"
+ item_flags = ABSTRACT | HAND_ITEM | NO_TURN
+ max_reach = 70
+ var/message
+ var/aoe_range = 1
+
+/obj/item/hand_item/subtle_catapult/examine(mob/user)
+ . = ..()
+ // . += span_green("AOE range: Your tile, plus [aoe_range] tiles in every direction.")
+ . += span_green("Current message:")
+ . += span_notice(message ? message : "None.")
+ . += span_green("--")
+ . += span_green("HOW 2 USE:")
+ . += span_notice("1. Click it in hand to start writing a message.")
+ . += span_notice("2. Click this on someone to send that message to them.")
+ . += span_notice("3. Or CtrlShift click it to pick anyone in view")
+ . += span_notice("You can also alt-click it to view your previous messages, and even select them to send!")
+ . += span_notice("It will ask you to confirm before sending, so don't worry about accidentally sending something you didn't mean to!")
+ . += span_notice("Also dont worry about dropping it or anything, it should still take whatever you wrote with it!")
+ . += span_green("--")
+
+/obj/item/hand_item/subtle_catapult/pre_attack(atom/A, mob/living/user, params, attackchain_flags, damage_multiplier)
+ . = TRUE
+ if(!extract_client(A))
+ return
+ if(message)
+ StartSendMessage(user, A)
+ else
+ EditMessage(user, A)
+
+/obj/item/hand_item/subtle_catapult/attack_self(mob/user)
+ . = ..()
+ EditMessage(user)
+
+/obj/item/hand_item/subtle_catapult/AltClick(mob/user)
+ . = ..()
+ var/list/messages = SSchat.GetHornyHistory(user)
+ if(!LAZYLEN(messages))
+ to_chat(user, span_alert("You haven't made any messages yet!"))
+ return
+ var/selected = input(
+ user,
+ "Here's a list of the messages you've made with this! Pick one to load it into this tool!",
+ "Select a message to send!",
+ message,
+ ) as null|anything in messages
+ if(selected)
+ message = selected
+ to_chat(user, span_green("Message loaded!"))
+ else
+ to_chat(user, span_alert("Message selection cancelled!"))
+
+/obj/item/hand_item/subtle_catapult/CtrlShiftClick(mob/user)
+ . = ..()
+ var/list/ppl = hearers(10, user)
+ for(var/mob/M in ppl)
+ if(!extract_client(M))
+ ppl -= M
+ if(!isliving(M))
+ ppl -= M
+ if(M == user)
+ ppl -= M
+ var/mob/whomst = input(
+ user,
+ "Who would you like to send a message to?",
+ "Select a target!",
+ null
+ ) as null|anything in ppl
+ if(whomst)
+ if(message)
+ StartSendMessage(user, whomst)
+ else
+ EditMessage(user, whomst)
+ else
+ to_chat(user, span_alert("Message selection cancelled!"))
+
+/obj/item/hand_item/subtle_catapult/dropped(mob/user)
+ . = ..()
+ SSchat.StashHornyThing(user)
+
+/obj/item/hand_item/subtle_catapult/proc/EditMessage(mob/user, mob/living/M, and_send)
+ var/head = M ? "Prepare a message for [M]!" : "Prepare a message!"
+ var/msg = stripped_multiline_input_or_reflect(user, EMOTE_HEADER_TEXT, head, message, 99999)
+ if(msg)
+ to_chat(user, span_green("Message prepared:"))
+ to_chat(user, span_notice(msg))
+ to_chat(user, span_green("Click [M] to send it!"))
+ message = msg
+ SSchat.StoreHornyMessage(user, msg)
+ if(M)
+ StartSendMessage(user, M)
+ else
+ to_chat(user, span_alert("Message cancelled! Nothing's changed!!"))
+
+/obj/item/hand_item/subtle_catapult/proc/StartSendMessage(mob/user, mob/living/M)
+ if(!message)
+ return
+ if(!M || !user)
+ return
+ // if(M == user || !M.client)
+ // return
+ var/shomsg = message
+ if(LAZYLEN(shomsg) > 700)
+ shomsg = copytext(shomsg, 0, 700) + "..."
+ // first we ask em, you sure you wanna do this?
+ var/confirm = alert(user, "You are about to send this message to [M]:\n\n[message]\n\nAre you sure you want to do this?", "Send message?", "Yes", "No")
+ if(confirm != "Yes")
+ to_chat(user, span_alert("Okay nevermind!!"))
+ return
+ DeliverMessage(user, M)
+
+/obj/item/hand_item/subtle_catapult/proc/DeliverMessage(mob/user, mob/living/M)
+ var/original_message = message
+ var/to_send = message
+
+ user.log_message(to_send, LOG_SUBTLE)
+ var/msg_check = user.say_narrate_replace(to_send, user)
+ if(msg_check)
+ to_send = span_subtle("[msg_check]")
+ else
+ to_send = span_subtle("[user] " + "[user.say_emphasis(to_send)]")
+
+ var/datum/emote/E
+ E = E.emote_list["subtle"]
+
+ var/datum/rental_mommy/chat/mommy = E.BuildMommy(user, to_send)
+ mommy.original_message = original_message
+ mommy.exclusive_targets = list(M, user)
+
+ // Visible to_send, as in only visible to you and them
+ user.visible_message(
+ message = to_send,
+ data = list("mom" = mommy))
+
+ //broadcast to ghosts, if they have a client, are dead, arent in the lobby, allow ghostsight, and, if subtler, are admemes
+ user.emote_for_ghost_sight(mommy.message, TRUE, 0)
+ mommy.checkin()
+ user.playsound_local(get_turf(user), 'sound/f13effects/sunsetsounds/blush.ogg', 80, FALSE)
+ M.playsound_local(get_turf(M), 'sound/f13effects/sunsetsounds/blush.ogg', 80, FALSE)
+
+////////
+//Bite//
+////////
+/obj/item/hand_item/butt
+ name = "your butt"
+ desc = "Very smoochable."
+ icon = 'icons/obj/in_hands.dmi'
+ icon_state = "biter"
+ attack_verb = list("smecked", "bwapped", "bumped", "clapped", "quapped", "vooped", "whomped")
+ // hitsound = "sound/weapons/bite.ogg"
+ w_class = WEIGHT_CLASS_GIGANTIC // your butt is HUGE!!!!
+ flags_1 = CONDUCT_1
+ force = 0
+
+/obj/item/hand_item/butt/equipped(mob/user, slot)
+ . = ..()
+ buttify(user)
+
+/obj/item/hand_item/butt/pickup(mob/living/user)
+ . = ..()
+ buttify(user)
+
+/obj/item/hand_item/butt/proc/buttify(mob/user)
+ if(!iscarbon(user))
+ to_chat(user, span_alert("You aint got a butt!"))
+ return
+ var/mob/living/carbon/human/H = user
+ if(!H.has_butt())
+ to_chat(user, span_alert("[H], you have no butt!"))
+ H.emote("scream")
+ qdel(src)
+ return
+ var/obj/item/organ/genital/butt/B = H.getorganslot(ORGAN_SLOT_BUTT)
+ var/datum/sprite_accessory/sprite_acc = B.get_sprite_accessory()
+ icon = 'icons/obj/genitals/butt_onmob.dmi'
+ icon_state = B.get_icon_state(user, sprite_acc, FALSE, "FRONT")
+ dir = NORTH
+ var/datum/preferences/P = extract_prefs(user)
+ color = "#[P.features["butt_color"]]"
+ force = 6 * B.size
+ attack_speed = (CLICK_CD_MELEE / 3) * B.size
+ switch(B.size)
+ if(1 to 2)
+ w_class = WEIGHT_CLASS_TINY
+ if(3)
+ w_class = WEIGHT_CLASS_SMALL
+ if(4)
+ w_class = WEIGHT_CLASS_NORMAL
+ if(5)
+ w_class = WEIGHT_CLASS_BULKY
+ if(6 to 7)
+ w_class = WEIGHT_CLASS_HUGE
+ if(8 to INFINITY)
+ w_class = WEIGHT_CLASS_GIGANTIC
diff --git a/code/game/objects/objs_set_vars_verbs.dm b/code/game/objects/objs_set_vars_verbs.dm
index 1000de3a0b7..7c20f5b3922 100644
--- a/code/game/objects/objs_set_vars_verbs.dm
+++ b/code/game/objects/objs_set_vars_verbs.dm
@@ -6,14 +6,14 @@ GLOBAL_LIST_INIT(obj_vars_allowed_to_modify, list(
/mob/living/verb/objs_edit_vars(atom/A as obj in view(1))
- set name = "Edit Vars (Shift, Rotate, Layer)."
+ set name = "Adjust Object (Shift, Rotate, Layer)."
set category = "Object"
//Blacklist of stuff that isn't allowed to be modified, such as trees
if( istype(A, /obj/structure/flora) || \
istype(A, /obj/machinery/door/poddoor))
- to_chat(src, span_danger("You can't move that!"))
+ to_chat(src, span_danger("I can't move that!"))
return
var/do_after_delay = 1 SECONDS
diff --git a/code/modules/WVM/wvm.dm b/code/modules/WVM/wvm.dm
index f1b316a22f9..bca972d4606 100644
--- a/code/modules/WVM/wvm.dm
+++ b/code/modules/WVM/wvm.dm
@@ -761,59 +761,109 @@ GLOBAL_VAR_INIT(vendor_cash, 0)
name = "Wasteland Vending Machine - Ammunition"
icon_state = "nuammo_idle"
prize_list = list(
- new /datum/data/wasteland_equipment(".22lr Box (120 bullets)", /obj/item/ammo_box/m22, 15),
- new /datum/data/wasteland_equipment("9mm Box (90 bullets)", /obj/item/ammo_box/c9mm, 15),
- new /datum/data/wasteland_equipment("10mm Box (60 bullets)", /obj/item/ammo_box/c10mm, 15),
- new /datum/data/wasteland_equipment("5mm Box (60 bullets)", /obj/item/ammo_box/m5mmbox, 15),
- new /datum/data/wasteland_equipment("4.73mm Box (60 bullets)", /obj/item/ammo_box/m473, 15),
- new /datum/data/wasteland_equipment("5.56x45 Box (50 bullets)", /obj/item/ammo_box/a556, 15),
- new /datum/data/wasteland_equipment(".45 Box (50 bullets)", /obj/item/ammo_box/c45, 15),
- new /datum/data/wasteland_equipment(".357 Box (50 bullets)", /obj/item/ammo_box/a357box, 15),
- new /datum/data/wasteland_equipment(".44 Box (48 bullets)", /obj/item/ammo_box/m44box, 15),
- new /datum/data/wasteland_equipment(".308 Box (40 bullets)", /obj/item/ammo_box/a308box, 15),
- new /datum/data/wasteland_equipment("14mm Box (36 bullets)", /obj/item/ammo_box/m14mm, 15),
- new /datum/data/wasteland_equipment("Laser Batteries (36 batteries)", /obj/item/ammo_box/lasmusket, 15),
- new /datum/data/wasteland_equipment("Black Powder Minie Balls (32 balls)", /obj/item/ammo_box/flintlock, 15),
- new /datum/data/wasteland_equipment(".30-06 Box (30 bullets)", /obj/item/ammo_box/a3006box, 15),
- new /datum/data/wasteland_equipment("45-70 Box (30 bullets)", /obj/item/ammo_box/c4570box, 15),
- new /datum/data/wasteland_equipment("Plasma Canisters (24 canisters)", /obj/item/ammo_box/plasmamusket, 15),
- new /datum/data/wasteland_equipment(".50 BMG Box (24 bullets)", /obj/item/ammo_box/a50MG, 15),
- new /datum/data/wasteland_equipment("12 Gauge Buckshot box (24 shells)", /obj/item/ammo_box/shotgun/buck, 15),
- new /datum/data/wasteland_equipment("12 Gauge Slug box (24 shells)", /obj/item/ammo_box/shotgun/slug, 15),
- new /datum/data/wasteland_equipment("40mm HE (2 shells)", /obj/item/ammo_box/a40mm, 15),
- new /datum/data/wasteland_equipment("Energy Cell (SEC)", /obj/item/stock_parts/cell/ammo/ec, 20),
- new /datum/data/wasteland_equipment("Microfusion Cell (MFC)", /obj/item/stock_parts/cell/ammo/mfc, 25),
- new /datum/data/wasteland_equipment("Electron Charge Pack (ECP)", /obj/item/stock_parts/cell/ammo/ecp, 25),
- new /datum/data/wasteland_equipment("Ultracite Ammo Cell (UAC)", /obj/item/stock_parts/cell/ammo/ultracite, 75),
- new /datum/data/wasteland_equipment("Portable Cell Charger", /obj/item/storage/battery_box, 30),
+ new /datum/data/wasteland_equipment(".22lr BP Box (60 Bullets)", /obj/item/ammo_box/b22, 100),
+ new /datum/data/wasteland_equipment(".22lr SL Box (60 Bullets)", /obj/item/ammo_box/s22, 150),
+ new /datum/data/wasteland_equipment(".22lr BP Crate (240 Bullets)", /obj/item/ammo_box/b22/crate, 350),
+ new /datum/data/wasteland_equipment(".22lr SL Crate (240 Bullets)", /obj/item/ammo_box/s22/crate, 400),
+ new /datum/data/wasteland_equipment("9mm BP Box (60 Bullets)", /obj/item/ammo_box/b9mm, 100),
+ new /datum/data/wasteland_equipment("9mm SL Box (60 Bullets)", /obj/item/ammo_box/s9mm, 150),
+ new /datum/data/wasteland_equipment("9mm M Box (60 Bullets)", /obj/item/ammo_box/m9mm, 150),
+ new /datum/data/wasteland_equipment("9mm BP Crate (240 Bullets)", /obj/item/ammo_box/b9mm/crate, 350),
+ new /datum/data/wasteland_equipment("9mm SL Crate (240 Bullets)", /obj/item/ammo_box/s9mm/crate, 400),
+ new /datum/data/wasteland_equipment("9mm M Crate (240 Bullets)", /obj/item/ammo_box/m9mm/crate, 450),
+ new /datum/data/wasteland_equipment(".357 BP Box (60 Bullets)", /obj/item/ammo_box/b357, 100),
+ new /datum/data/wasteland_equipment(".357 SL Box (60 Bullets)", /obj/item/ammo_box/s357, 150),
+ new /datum/data/wasteland_equipment(".357 M Box (60 Bullets)", /obj/item/ammo_box/m357, 150),
+ new /datum/data/wasteland_equipment(".357 BP Crate (240 Bullets)", /obj/item/ammo_box/b357/crate, 350),
+ new /datum/data/wasteland_equipment(".357 SL Crate (240 Bullets)", /obj/item/ammo_box/s357/crate, 400),
+ new /datum/data/wasteland_equipment(".357 M Crate (240 Bullets)", /obj/item/ammo_box/m357/crate, 450),
+ new /datum/data/wasteland_equipment(".44 BP Box (60 Bullets)", /obj/item/ammo_box/b44, 100),
+ new /datum/data/wasteland_equipment(".44 SL Box (60 Bullets)", /obj/item/ammo_box/s44, 150),
+ new /datum/data/wasteland_equipment(".44 M Box (60 Bullets)", /obj/item/ammo_box/m44, 150),
+ new /datum/data/wasteland_equipment(".44 BP Crate (240 Bullets)", /obj/item/ammo_box/b44/crate, 350),
+ new /datum/data/wasteland_equipment(".44 SL Crate (240 Bullets)", /obj/item/ammo_box/s44/crate, 400),
+ new /datum/data/wasteland_equipment(".44 M Crate (240 Bullets)", /obj/item/ammo_box/m44/crate, 450),
+ new /datum/data/wasteland_equipment(".45 BP Box (60 Bullets)", /obj/item/ammo_box/b45, 100),
+ new /datum/data/wasteland_equipment(".45 SL Box (60 Bullets)", /obj/item/ammo_box/s45, 150),
+ new /datum/data/wasteland_equipment(".45 M Box (60 Bullets)", /obj/item/ammo_box/m45, 150),
+ new /datum/data/wasteland_equipment(".45 BP Crate (240 Bullets)", /obj/item/ammo_box/b45/crate, 350),
+ new /datum/data/wasteland_equipment(".45 SL Crate (240 Bullets)", /obj/item/ammo_box/s45/crate, 400),
+ new /datum/data/wasteland_equipment(".45 M Crate (240 Bullets)", /obj/item/ammo_box/m45/crate, 450),
+ new /datum/data/wasteland_equipment("5.56 SL Box (60 Bullets)", /obj/item/ammo_box/s556, 150),
+ new /datum/data/wasteland_equipment("5.56 M Box (60 Bullets)", /obj/item/ammo_box/m556, 150),
+ new /datum/data/wasteland_equipment("5.56 SL Crate (240 Bullets)", /obj/item/ammo_box/s556/crate, 400),
+ new /datum/data/wasteland_equipment("5.56 M Crate (240 Bullets)", /obj/item/ammo_box/m556/crate, 450),
+ new /datum/data/wasteland_equipment("7.62x39 SL Box (60 Bullets)", /obj/item/ammo_box/s762by39, 150),
+ new /datum/data/wasteland_equipment("7.62x39 M Box (60 Bullets)", /obj/item/ammo_box/m762by39, 150),
+ new /datum/data/wasteland_equipment("7.62x39 SL Crate (240 Bullets)", /obj/item/ammo_box/s762by39/crate, 400),
+ new /datum/data/wasteland_equipment("7.62x39 M Crate (240 Bullets)", /obj/item/ammo_box/m762by39/crate, 450),
+ new /datum/data/wasteland_equipment(".308 SL Box (60 Bullets)", /obj/item/ammo_box/s308, 150),
+ new /datum/data/wasteland_equipment(".308 M Box (60 Bullets)", /obj/item/ammo_box/m308, 150),
+ new /datum/data/wasteland_equipment(".308 SL Crate (240 Bullets)", /obj/item/ammo_box/s308/crate, 400),
+ new /datum/data/wasteland_equipment(".308 M Crate (240 Bullets)", /obj/item/ammo_box/m308/crate, 450),
+ new /datum/data/wasteland_equipment(".30-06 SL Box (60 Bullets)", /obj/item/ammo_box/s3006, 150),
+ new /datum/data/wasteland_equipment(".30-06 M Box (60 Bullets)", /obj/item/ammo_box/m3006, 150),
+ new /datum/data/wasteland_equipment(".30-06 SL Crate (240 Bullets)", /obj/item/ammo_box/s3006/crate, 400),
+ new /datum/data/wasteland_equipment(".30-06 M Crate (240 Bullets)", /obj/item/ammo_box/m3006/crate, 450),
+ new /datum/data/wasteland_equipment("Buckshot BP Box (60 Bullets)", /obj/item/ammo_box/bbuckshot, 100),
+ new /datum/data/wasteland_equipment("Buckshot SL Box (60 Bullets)", /obj/item/ammo_box/sbuckshot, 150),
+ new /datum/data/wasteland_equipment("Buckshot M Box (60 Bullets)", /obj/item/ammo_box/mbuckshot, 150),
+ new /datum/data/wasteland_equipment("Buckshot BP Crate (240 Bullets)", /obj/item/ammo_box/bbuckshot/crate, 350),
+ new /datum/data/wasteland_equipment("Buckshot SL Crate (240 Bullets)", /obj/item/ammo_box/sbuckshot/crate, 400),
+ new /datum/data/wasteland_equipment("Buckshot M Crate (240 Bullets)", /obj/item/ammo_box/mbuckshot/crate, 450),
new /datum/data/wasteland_equipment("Field Arrow (1 arrow)", /obj/item/ammo_casing/caseless/arrow/field, 3),
)
highpop_list = list(
- new /datum/data/wasteland_equipment(".22lr Box (120 bullets)", /obj/item/ammo_box/m22, 15),
- new /datum/data/wasteland_equipment("9mm Box (90 bullets)", /obj/item/ammo_box/c9mm, 15),
- new /datum/data/wasteland_equipment("10mm Box (60 bullets)", /obj/item/ammo_box/c10mm, 15),
- new /datum/data/wasteland_equipment("5mm Box (60 bullets)", /obj/item/ammo_box/m5mmbox, 15),
- new /datum/data/wasteland_equipment("4.73mm Box (60 bullets)", /obj/item/ammo_box/m473, 15),
- new /datum/data/wasteland_equipment("5.56x45 Box (50 bullets)", /obj/item/ammo_box/a556, 15),
- new /datum/data/wasteland_equipment(".45 Box (50 bullets)", /obj/item/ammo_box/c45, 15),
- new /datum/data/wasteland_equipment(".357 Box (50 bullets)", /obj/item/ammo_box/a357box, 15),
- new /datum/data/wasteland_equipment(".44 Box (48 bullets)", /obj/item/ammo_box/m44box, 15),
- new /datum/data/wasteland_equipment(".308 Box (40 bullets)", /obj/item/ammo_box/a308box, 15),
- new /datum/data/wasteland_equipment("14mm Box (36 bullets)", /obj/item/ammo_box/m14mm, 15),
- new /datum/data/wasteland_equipment("Laser Batteries (36 batteries)", /obj/item/ammo_box/lasmusket, 15),
- new /datum/data/wasteland_equipment("Black Powder Minie Balls (32 balls)", /obj/item/ammo_box/flintlock, 15),
- new /datum/data/wasteland_equipment(".30-06 Box (30 bullets)", /obj/item/ammo_box/a3006box, 15),
- new /datum/data/wasteland_equipment("45-70 Box (30 bullets)", /obj/item/ammo_box/c4570box, 15),
- new /datum/data/wasteland_equipment("Plasma Canisters (24 canisters)", /obj/item/ammo_box/plasmamusket, 15),
- new /datum/data/wasteland_equipment(".50 BMG Box (24 bullets)", /obj/item/ammo_box/a50MG, 15),
- new /datum/data/wasteland_equipment("12 Gauge Buckshot box (24 shells)", /obj/item/ammo_box/shotgun/buck, 15),
- new /datum/data/wasteland_equipment("12 Gauge Slug box (24 shells)", /obj/item/ammo_box/shotgun/slug, 15),
- new /datum/data/wasteland_equipment("40mm HE (2 shells)", /obj/item/ammo_box/a40mm, 15),
- new /datum/data/wasteland_equipment("Energy Cell (SEC)", /obj/item/stock_parts/cell/ammo/ec, 20),
- new /datum/data/wasteland_equipment("Microfusion Cell (MFC)", /obj/item/stock_parts/cell/ammo/mfc, 25),
- new /datum/data/wasteland_equipment("Electron Charge Pack (ECP)", /obj/item/stock_parts/cell/ammo/ecp, 25),
- new /datum/data/wasteland_equipment("Ultracite Ammo Cell (UAC)", /obj/item/stock_parts/cell/ammo/ultracite, 75),
- new /datum/data/wasteland_equipment("Portable Cell Charger", /obj/item/storage/battery_box, 30),
+ new /datum/data/wasteland_equipment(".22lr BP Box (60 Bullets)", /obj/item/ammo_box/b22, 100),
+ new /datum/data/wasteland_equipment(".22lr SL Box (60 Bullets)", /obj/item/ammo_box/s22, 150),
+ new /datum/data/wasteland_equipment(".22lr BP Crate (240 Bullets)", /obj/item/ammo_box/b22/crate, 350),
+ new /datum/data/wasteland_equipment(".22lr SL Crate (240 Bullets)", /obj/item/ammo_box/s22/crate, 400),
+ new /datum/data/wasteland_equipment("9mm BP Box (60 Bullets)", /obj/item/ammo_box/b9mm, 100),
+ new /datum/data/wasteland_equipment("9mm SL Box (60 Bullets)", /obj/item/ammo_box/s9mm, 150),
+ new /datum/data/wasteland_equipment("9mm M Box (60 Bullets)", /obj/item/ammo_box/m9mm, 150),
+ new /datum/data/wasteland_equipment("9mm BP Crate (240 Bullets)", /obj/item/ammo_box/b9mm/crate, 350),
+ new /datum/data/wasteland_equipment("9mm SL Crate (240 Bullets)", /obj/item/ammo_box/s9mm/crate, 400),
+ new /datum/data/wasteland_equipment("9mm M Crate (240 Bullets)", /obj/item/ammo_box/m9mm/crate, 450),
+ new /datum/data/wasteland_equipment(".357 BP Box (60 Bullets)", /obj/item/ammo_box/b357, 100),
+ new /datum/data/wasteland_equipment(".357 SL Box (60 Bullets)", /obj/item/ammo_box/s357, 150),
+ new /datum/data/wasteland_equipment(".357 M Box (60 Bullets)", /obj/item/ammo_box/m357, 150),
+ new /datum/data/wasteland_equipment(".357 BP Crate (240 Bullets)", /obj/item/ammo_box/b357/crate, 350),
+ new /datum/data/wasteland_equipment(".357 SL Crate (240 Bullets)", /obj/item/ammo_box/s357/crate, 400),
+ new /datum/data/wasteland_equipment(".357 M Crate (240 Bullets)", /obj/item/ammo_box/m357/crate, 450),
+ new /datum/data/wasteland_equipment(".44 BP Box (60 Bullets)", /obj/item/ammo_box/b44, 100),
+ new /datum/data/wasteland_equipment(".44 SL Box (60 Bullets)", /obj/item/ammo_box/s44, 150),
+ new /datum/data/wasteland_equipment(".44 M Box (60 Bullets)", /obj/item/ammo_box/m44, 150),
+ new /datum/data/wasteland_equipment(".44 BP Crate (240 Bullets)", /obj/item/ammo_box/b44/crate, 350),
+ new /datum/data/wasteland_equipment(".44 SL Crate (240 Bullets)", /obj/item/ammo_box/s44/crate, 400),
+ new /datum/data/wasteland_equipment(".44 M Crate (240 Bullets)", /obj/item/ammo_box/m44/crate, 450),
+ new /datum/data/wasteland_equipment(".45 BP Box (60 Bullets)", /obj/item/ammo_box/b45, 100),
+ new /datum/data/wasteland_equipment(".45 SL Box (60 Bullets)", /obj/item/ammo_box/s45, 150),
+ new /datum/data/wasteland_equipment(".45 M Box (60 Bullets)", /obj/item/ammo_box/m45, 150),
+ new /datum/data/wasteland_equipment(".45 BP Crate (240 Bullets)", /obj/item/ammo_box/b45/crate, 350),
+ new /datum/data/wasteland_equipment(".45 SL Crate (240 Bullets)", /obj/item/ammo_box/s45/crate, 400),
+ new /datum/data/wasteland_equipment(".45 M Crate (240 Bullets)", /obj/item/ammo_box/m45/crate, 450),
+ new /datum/data/wasteland_equipment("5.56 SL Box (60 Bullets)", /obj/item/ammo_box/s556, 150),
+ new /datum/data/wasteland_equipment("5.56 M Box (60 Bullets)", /obj/item/ammo_box/m556, 150),
+ new /datum/data/wasteland_equipment("5.56 SL Crate (240 Bullets)", /obj/item/ammo_box/s556/crate, 400),
+ new /datum/data/wasteland_equipment("5.56 M Crate (240 Bullets)", /obj/item/ammo_box/m556/crate, 450),
+ new /datum/data/wasteland_equipment("7.62x39 SL Box (60 Bullets)", /obj/item/ammo_box/s762by39, 150),
+ new /datum/data/wasteland_equipment("7.62x39 M Box (60 Bullets)", /obj/item/ammo_box/m762by39, 150),
+ new /datum/data/wasteland_equipment("7.62x39 SL Crate (240 Bullets)", /obj/item/ammo_box/s762by39/crate, 400),
+ new /datum/data/wasteland_equipment("7.62x39 M Crate (240 Bullets)", /obj/item/ammo_box/m762by39/crate, 450),
+ new /datum/data/wasteland_equipment(".308 SL Box (60 Bullets)", /obj/item/ammo_box/s308, 150),
+ new /datum/data/wasteland_equipment(".308 M Box (60 Bullets)", /obj/item/ammo_box/m308, 150),
+ new /datum/data/wasteland_equipment(".308 SL Crate (240 Bullets)", /obj/item/ammo_box/s308/crate, 400),
+ new /datum/data/wasteland_equipment(".308 M Crate (240 Bullets)", /obj/item/ammo_box/m308/crate, 450),
+ new /datum/data/wasteland_equipment(".30-06 SL Box (60 Bullets)", /obj/item/ammo_box/s3006, 150),
+ new /datum/data/wasteland_equipment(".30-06 M Box (60 Bullets)", /obj/item/ammo_box/m3006, 150),
+ new /datum/data/wasteland_equipment(".30-06 SL Crate (240 Bullets)", /obj/item/ammo_box/s3006/crate, 400),
+ new /datum/data/wasteland_equipment(".30-06 M Crate (240 Bullets)", /obj/item/ammo_box/m3006/crate, 450),
+ new /datum/data/wasteland_equipment("Buckshot BP Box (60 Bullets)", /obj/item/ammo_box/bbuckshot, 100),
+ new /datum/data/wasteland_equipment("Buckshot SL Box (60 Bullets)", /obj/item/ammo_box/sbuckshot, 150),
+ new /datum/data/wasteland_equipment("Buckshot M Box (60 Bullets)", /obj/item/ammo_box/mbuckshot, 150),
+ new /datum/data/wasteland_equipment("Buckshot BP Crate (240 Bullets)", /obj/item/ammo_box/bbuckshot/crate, 350),
+ new /datum/data/wasteland_equipment("Buckshot SL Crate (240 Bullets)", /obj/item/ammo_box/sbuckshot/crate, 400),
+ new /datum/data/wasteland_equipment("Buckshot M Crate (240 Bullets)", /obj/item/ammo_box/mbuckshot/crate, 450),
new /datum/data/wasteland_equipment("Field Arrow (1 arrow)", /obj/item/ammo_casing/caseless/arrow/field, 3),
)
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index cdb521c49e3..f131eba01ca 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -353,6 +353,17 @@
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug)
friendly_check = TRUE
+
+ if(friendly_check)
+ new /obj/effect/temp_visual/heart(get_turf(M))
+ new /obj/effect/temp_visual/heart(get_turf(src))
+ if(prob(1))
+ for(var/turf/T in view(src, 3))
+ if(prob(5))
+ new /obj/effect/temp_visual/heart(T)
+ to_chat(M, span_green("You really feel the love!"))
+ to_chat(src, span_green("You really feel the love!"))
+
if(friendly_check && HAS_TRAIT(M, TRAIT_FRIENDLY))
var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
if(mood)
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index f10b5b8e285..73fda5ca68b 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -160,6 +160,20 @@
key_third_person = "winks"
message = "winks."
+/datum/emote/living/carbon/erp
+ key = "erp"
+ key_third_person = "erps"
+
+/datum/emote/living/carbon/erp/run_emote(mob/user)
+ var/obj/item/hand_item/subtle_catapult/licky = SSchat.UnstashHornyThing(user)
+ if(!licky)
+ return
+ if(user.put_in_hands(licky))
+ to_chat(user, span_notice("You get ready to send someone a message."))
+ else
+ SSchat.StashHornyThing(user)
+
+
/datum/emote/living/carbon/lick
key = "lick"
key_third_person = "licks"
@@ -563,6 +577,24 @@
else
qdel(tentacle)
+/datum/emote/living/carbon/butt/run_emote(mob/user)
+ . = ..()
+ var/mob/living/carbon/human/H = user
+ if(!ishuman(H))
+ to_chat(H, span_alert("Hey! No dog butts allowed!"))
+ return
+ if(!H.has_butt())
+ to_chat(H, span_alert("[H], you have no butt!"))
+ return
+ if(user.get_active_held_item())
+ to_chat(user, span_warning("Your hands are too full to preform butt!"))
+ return
+ var/obj/item/hand_item/butt/butt = new(user)
+ if(user.put_in_hands(butt))
+ to_chat(user, span_notice("You get your butt."))
+ else
+ qdel(butt)
+
//Mage grab spell
/datum/emote/living/carbon/magegrab
key = "magegrab"
@@ -585,6 +617,30 @@
else
qdel(tentacle)
+//Mage grab spell
+/datum/emote/living/carbon/butt
+ key = "butt"
+ key_third_person = "butting you"
+ restraint_check = TRUE
+
+/datum/emote/living/carbon/butt/run_emote(mob/user)
+ . = ..()
+ var/mob/living/carbon/human/H = user
+ if(!ishuman(H))
+ to_chat(H, span_alert("Hey! No dog butts allowed!"))
+ return
+ if(!H.has_butt())
+ to_chat(H, span_alert("[H], you have no butt!"))
+ return
+ if(user.get_active_held_item())
+ to_chat(user, span_warning("Your hands are too full to preform butt!"))
+ return
+ var/obj/item/hand_item/butt/butt = new(user)
+ if(user.put_in_hands(butt))
+ to_chat(user, span_notice("You get your butt."))
+ else
+ qdel(butt)
+
//Rock throw//
/datum/emote/living/carbon/rocker
key = "rocks"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index c1eb6b8bfd5..ca0719d85fd 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1367,7 +1367,7 @@ GLOBAL_VAR_INIT(crotch_call_cooldown, 0)
return (istype(target) && target.stat == CONSCIOUS)
/mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target)
- return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND))
+ return (ishuman(target))
/mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target)
var/carrydelay = 50 //if you have latex you are faster at grabbing
diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi
index 7bb33923c6b..a67d64e03eb 100644
Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ
diff --git a/icons/mob/screen_gen_vore.dmi b/icons/mob/screen_gen_vore.dmi
new file mode 100644
index 00000000000..a328b460faf
Binary files /dev/null and b/icons/mob/screen_gen_vore.dmi differ
diff --git a/icons/obj/in_hands.dmi b/icons/obj/in_hands.dmi
index f1005cc991c..8dbad29449f 100644
Binary files a/icons/obj/in_hands.dmi and b/icons/obj/in_hands.dmi differ
diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/cb_does_it_better/coy_crotch.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/cb_does_it_better/coy_crotch.dm
index 9119a1bcc55..e84924eeee7 100644
--- a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/cb_does_it_better/coy_crotch.dm
+++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/cb_does_it_better/coy_crotch.dm
@@ -1344,16 +1344,16 @@
require_user_hands = TRUE
/// okay copy from here...
help_messages = list(
- "XU_NAME {carefully, gently, eagerly} {mlems, licks, laps at, slobbers on, slurps on, tastes, taste-tests, brushing} XU_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt}.",
+ "XU_NAME {carefully, gently, eagerly} {mlems, licks, laps at, slobbers on, slurps on, tastes, taste-tests, brushing} XT_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt}.",
)
disarm_messages = list(
- "XU_NAME {playfully, warmly} {mlems, licks, laps at, slobbers on, slurps on, tastes, taste-tests, brushing} XU_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt}.",
+ "XU_NAME {playfully, warmly} {mlems, licks, laps at, slobbers on, slurps on, tastes, taste-tests, brushing} XT_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt}.",
)
grab_messages = list(
- "XU_NAME {mlems, licks, laps at, slobbers on, slurps on, tastes, taste-tests, brushing} XU_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt} with {affection, love, vigor}.",
+ "XU_NAME {mlems, licks, laps at, slobbers on, slurps on, tastes, taste-tests, brushing} XT_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt} with {affection, love, vigor}.",
)
harm_messages = list(
- "XU_NAME {mlems, licks, laps at, slobbers on, slurps on, tastes, taste-tests, brushing} XU_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt} {possessively, deeply, greedily}.",
+ "XU_NAME {mlems, licks, laps at, slobbers on, slurps on, tastes, taste-tests, brushing} XT_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt} {possessively, deeply, greedily}.",
)
simple_sounds = list(
@@ -1380,16 +1380,16 @@
require_user_hands = TRUE
/// okay copy from here...
help_messages = list(
- "XU_NAME {carefully, gently, eagerly} {suckles, mouths} XU_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt}.",
+ "XU_NAME {carefully, gently, eagerly} {suckles, mouths} XT_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt}.",
)
disarm_messages = list(
- "XU_NAME {playfully, warmly} {suckles, mouths} XU_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt}.",
+ "XU_NAME {playfully, warmly} {suckles, mouths} XT_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt}.",
)
grab_messages = list(
- "XU_NAME {suckles, mouths} XU_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt} with {affection, love, vigor}.",
+ "XU_NAME {suckles, mouths} XT_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt} with {affection, love, vigor}.",
)
harm_messages = list(
- "XU_NAME {suckles, mouths} XU_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt} {possessively, deeply, greedily}.",
+ "XU_NAME {suckles, mouths} XT_NAME's {canine, doggy, puppy making, fortune cookie shaped, spadelike} {pussy, snatch, love hole, love tunnel, cunt} {possessively, deeply, greedily}.",
)
simple_sounds = list(
@@ -1472,3 +1472,38 @@
user_lust_mult = 1.2 // set this to how much lust should be given
target_lust_mult = 1.2
lust_go_to = LUST_USER | LUST_TARGET // and who should get the lust, its a bitfield! for both, it'd be LUST_USER | LUST_TARGET
+
+///////////////////////
+// Lick Shaft///
+///////////////////////
+/datum/interaction/lewd/partner/mutual/lick_shaft
+ description = "Partner/Crotch - Lick their shaft."
+ require_user_hands = TRUE
+ /// okay copy from here...
+ help_messages = list(
+ "XU_NAME {gently licks, lightly laps their tongue against} XT_NAME's {shaft, cockhead, dick, dipstick, cock, rod}.",
+ )
+ disarm_messages = list(
+ "XU_NAME {teasingly tongues, wetly slurps at} XT_NAME's {shaft, cock, rod}.",
+ )
+ grab_messages = list(
+ "XU_NAME {slobbers on, drools on, soaks} XT_NAME's {shaft, cock, rod}.",
+ )
+ harm_messages = list(
+ "XU_NAME presses their tongue firmly to the bottom of XT_NAME'S {shaft, cock, rod}.",
+ )
+
+ simple_sounds = list(
+ 'modular_coyote/sound/lewd/sexslide5.wav',
+ 'modular_coyote/sound/lewd/sexslide7.wav',
+ 'modular_coyote/sound/lewd/sexslide8.wav',
+ 'modular_coyote/sound/lewd/sexslide9.wav',
+ 'modular_coyote/sound/lewd/sexslide10.wav',
+ 'modular_coyote/sound/lewd/sexsuck1.wav',
+ 'modular_coyote/sound/lewd/sexsuck2.wav',
+ 'modular_coyote/sound/lewd/sexsuck3.wav',
+ ) // frumf, frumf
+ user_lust_mult = 0.2 // set this to how much lust should be given
+ target_lust_mult = 0.8
+ lust_go_to = LUST_USER | LUST_TARGET // and who should get the lust, its a bitfield! for both, it'd be LUST_USER | LUST_TARGET
+