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 +