mirror of
https://github.com/Skyrat-SS13/Skyrat-tg.git
synced 2026-07-21 12:53:53 +01:00
bb70889f6e
3591 individual conflicts Update build.js Update install_node.sh Update byond.js oh my fucking god hat slow huh holy shit we all fall down 2 more I missed 2900 individual conflicts 2700 Individual conflicts replaces yarn file with tg version, bumping us down to 2200-ish Down to 2000 individual conflicts 140 down mmm aaaaaaaaaaaaaaaaaaa not yt 575 soon 900 individual conflicts 600 individual conflicts, 121 file conflicts im not okay 160 across 19 files 29 in 4 files 0 conflicts, compiletime fix time some minor incap stuff missed ticks weird dupe definition stuff missed ticks 2 incap fixes undefs and pie fix Radio update and some extra minor stuff returns a single override no more dupe definitions, 175 compiletime errors Unticked file fix sound and emote stuff honk and more radio stuff
207 lines
7.9 KiB
Plaintext
207 lines
7.9 KiB
Plaintext
#define pet_carrier_full(carrier) carrier.occupants.len >= carrier.max_occupants || carrier.occupant_weight >= carrier.max_occupant_weight
|
|
|
|
//Used to transport little animals without having to drag them across the station.
|
|
//Comes with a handy lock to prevent them from running off.
|
|
/obj/item/pet_carrier
|
|
name = "pet carrier"
|
|
desc = "A big white-and-blue pet carrier. Good for carrying <s>meat to the chef</s> cute animals around."
|
|
icon = 'icons/obj/pet_carrier.dmi'
|
|
base_icon_state = "pet_carrier"
|
|
icon_state = "pet_carrier_open"
|
|
inhand_icon_state = "pet_carrier"
|
|
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
|
|
force = 5
|
|
attack_verb_continuous = list("bashes", "carries")
|
|
attack_verb_simple = list("bash", "carry")
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
throw_speed = 2
|
|
throw_range = 3
|
|
custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 7.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT)
|
|
interaction_flags_mouse_drop = NEED_DEXTERITY
|
|
|
|
var/open = TRUE
|
|
var/locked = FALSE
|
|
var/list/occupants = list()
|
|
var/occupant_weight = 0
|
|
var/max_occupants = 3 //Hard-cap so you can't have infinite mice or something in one carrier
|
|
var/max_occupant_weight = MOB_SIZE_SMALL //This is calculated from the mob sizes of occupants
|
|
|
|
/obj/item/pet_carrier/Destroy()
|
|
if(occupants.len)
|
|
for(var/V in occupants)
|
|
remove_occupant(V)
|
|
return ..()
|
|
|
|
/obj/item/pet_carrier/Exited(atom/movable/gone, direction)
|
|
. = ..()
|
|
if(isliving(gone) && (gone in occupants))
|
|
var/mob/living/living_gone = gone
|
|
occupants -= gone
|
|
occupant_weight -= living_gone.mob_size
|
|
|
|
/obj/item/pet_carrier/examine(mob/user)
|
|
. = ..()
|
|
if(occupants.len)
|
|
for(var/V in occupants)
|
|
var/mob/living/L = V
|
|
. += span_notice("It has [L] inside.")
|
|
else
|
|
. += span_notice("It has nothing inside.")
|
|
|
|
// At some point these need to be converted to contextual screentips
|
|
. += span_notice("Activate it in your hand to [open ? "close" : "open"] its door. Click-drag onto floor to release its occupants.")
|
|
if(!open)
|
|
. += span_notice("Alt-click to [locked ? "unlock" : "lock"] its door.")
|
|
|
|
/obj/item/pet_carrier/attack_self(mob/living/user)
|
|
if(open)
|
|
to_chat(user, span_notice("You close [src]'s door."))
|
|
playsound(user, 'sound/effects/bin_close.ogg', 50, TRUE)
|
|
open = FALSE
|
|
else
|
|
if(locked)
|
|
to_chat(user, span_warning("[src] is locked!"))
|
|
return
|
|
to_chat(user, span_notice("You open [src]'s door."))
|
|
playsound(user, 'sound/effects/bin_open.ogg', 50, TRUE)
|
|
open = TRUE
|
|
update_appearance()
|
|
|
|
/obj/item/pet_carrier/click_alt(mob/living/user)
|
|
if(open)
|
|
return CLICK_ACTION_BLOCKING
|
|
locked = !locked
|
|
to_chat(user, span_notice("You flip the lock switch [locked ? "down" : "up"]."))
|
|
if(locked)
|
|
playsound(user, 'sound/machines/boltsdown.ogg', 30, TRUE)
|
|
else
|
|
playsound(user, 'sound/machines/boltsup.ogg', 30, TRUE)
|
|
update_appearance()
|
|
return CLICK_ACTION_SUCCESS
|
|
|
|
/obj/item/pet_carrier/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
|
|
if(user.combat_mode || !isliving(interacting_with))
|
|
return NONE
|
|
if(!open)
|
|
to_chat(user, span_warning("You need to open [src]'s door!"))
|
|
return ITEM_INTERACT_BLOCKING
|
|
var/mob/living/target = interacting_with
|
|
if(target.mob_size > max_occupant_weight)
|
|
if(ishuman(target))
|
|
var/mob/living/carbon/human/H = target
|
|
if(isfeline(H)) // SKYRAT EDIT - FELINE TRAITS. Was: isfelinid(H)
|
|
to_chat(user, span_warning("You'd need a lot of catnip and treats, plus maybe a laser pointer, for that to work."))
|
|
else
|
|
to_chat(user, span_warning("Humans, generally, do not fit into pet carriers."))
|
|
else
|
|
to_chat(user, span_warning("You get the feeling [target] isn't meant for a [name]."))
|
|
return ITEM_INTERACT_BLOCKING
|
|
if(user == target)
|
|
to_chat(user, span_warning("Why would you ever do that?"))
|
|
return ITEM_INTERACT_BLOCKING
|
|
load_occupant(user, target)
|
|
return ITEM_INTERACT_SUCCESS
|
|
|
|
/obj/item/pet_carrier/relaymove(mob/living/user, direction)
|
|
if(open)
|
|
loc.visible_message(span_notice("[user] climbs out of [src]!"), \
|
|
span_warning("[user] jumps out of [src]!"))
|
|
remove_occupant(user)
|
|
return
|
|
else if(!locked)
|
|
loc.visible_message(span_notice("[user] pushes open the door to [src]!"), \
|
|
span_warning("[user] pushes open the door of [src]!"))
|
|
open = TRUE
|
|
update_appearance()
|
|
return
|
|
else if(user.client)
|
|
container_resist_act(user)
|
|
|
|
/obj/item/pet_carrier/container_resist_act(mob/living/user)
|
|
user.changeNext_move(CLICK_CD_BREAKOUT)
|
|
user.last_special = world.time + CLICK_CD_BREAKOUT
|
|
if(user.mob_size <= MOB_SIZE_SMALL)
|
|
to_chat(user, span_notice("You poke a limb through [src]'s bars and start fumbling for the lock switch... (This will take some time.)"))
|
|
to_chat(loc, span_warning("You see [user] reach through the bars and fumble for the lock switch!"))
|
|
if(!do_after(user, rand(300, 400), target = user) || open || !locked || !(user in occupants))
|
|
return
|
|
loc.visible_message(span_warning("[user] flips the lock switch on [src] by reaching through!"), null, null, null, user)
|
|
to_chat(user, span_boldannounce("Bingo! The lock pops open!"))
|
|
locked = FALSE
|
|
playsound(src, 'sound/machines/boltsup.ogg', 30, TRUE)
|
|
update_appearance()
|
|
else
|
|
loc.visible_message(span_warning("[src] starts rattling as something pushes against the door!"), null, null, null, user)
|
|
to_chat(user, span_notice("You start pushing out of [src]... (This will take about 20 seconds.)"))
|
|
if(!do_after(user, 20 SECONDS, target = user) || open || !locked || !(user in occupants))
|
|
return
|
|
loc.visible_message(span_warning("[user] shoves out of [src]!"), null, null, null, user)
|
|
to_chat(user, span_notice("You shove open [src]'s door against the lock's resistance and fall out!"))
|
|
locked = FALSE
|
|
open = TRUE
|
|
update_appearance()
|
|
remove_occupant(user)
|
|
|
|
/obj/item/pet_carrier/update_icon_state()
|
|
if(open)
|
|
icon_state = initial(icon_state)
|
|
return ..()
|
|
icon_state = "[base_icon_state]_[!occupants.len ? "closed" : "occupied"]"
|
|
return ..()
|
|
|
|
/obj/item/pet_carrier/update_overlays()
|
|
. = ..()
|
|
if(!open)
|
|
. += "[base_icon_state]_[locked ? "" : "un"]locked"
|
|
|
|
/obj/item/pet_carrier/mouse_drop_dragged(atom/over_atom, mob/user, src_location, over_location, params)
|
|
if(isopenturf(over_atom) && open && occupants.len)
|
|
user.visible_message(span_notice("[user] unloads [src]."), \
|
|
span_notice("You unload [src] onto [over_atom]."))
|
|
for(var/V in occupants)
|
|
remove_occupant(V, over_atom)
|
|
|
|
/obj/item/pet_carrier/proc/load_occupant(mob/living/user, mob/living/target)
|
|
if(pet_carrier_full(src))
|
|
to_chat(user, span_warning("[src] is already carrying too much!"))
|
|
return
|
|
user.visible_message(span_notice("[user] starts loading [target] into [src]."), \
|
|
span_notice("You start loading [target] into [src]..."), null, null, target)
|
|
to_chat(target, span_userdanger("[user] starts loading you into [user.p_their()] [name]!"))
|
|
if(!do_after(user, 3 SECONDS, target))
|
|
return
|
|
if(target in occupants)
|
|
return
|
|
if(pet_carrier_full(src)) //Run the checks again, just in case
|
|
to_chat(user, span_warning("[src] is already carrying too much!"))
|
|
return
|
|
user.visible_message(span_notice("[user] loads [target] into [src]!"), \
|
|
span_notice("You load [target] into [src]."), null, null, target)
|
|
to_chat(target, span_userdanger("[user] loads you into [user.p_their()] [name]!"))
|
|
add_occupant(target)
|
|
|
|
/obj/item/pet_carrier/proc/add_occupant(mob/living/occupant)
|
|
if(occupant in occupants || !istype(occupant))
|
|
return
|
|
occupant.forceMove(src)
|
|
occupants += occupant
|
|
occupant_weight += occupant.mob_size
|
|
|
|
/obj/item/pet_carrier/proc/remove_occupant(mob/living/occupant, turf/new_turf)
|
|
if(!(occupant in occupants) || !istype(occupant))
|
|
return
|
|
occupant.forceMove(new_turf ? new_turf : drop_location())
|
|
occupants -= occupant
|
|
occupant_weight -= occupant.mob_size
|
|
occupant.setDir(SOUTH)
|
|
|
|
/obj/item/pet_carrier/biopod
|
|
name = "biopod"
|
|
desc = "Alien device used for undescribable purpose. Or carrying pets."
|
|
base_icon_state = "biopod"
|
|
icon_state = "biopod_open"
|
|
inhand_icon_state = "biopod"
|
|
|
|
#undef pet_carrier_full
|