Files
Athena148andGitHub 0e39e6c45c Xenomorph Monarch Fixes/Rebalance (#7418)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

Applies a nerf to Monarch's charge, no longer instantaneous.
Lowers Monarch's burn/energy resist, burn should work better against it
since Xenomorphs are weak to fire.
Axes **any** and all mentions of natural spawn positions, this should
never spawn naturally. It is a boss mob.

<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

## Why It's Good For The Game

This has been an issue for a while, but the natural spawn points for the
Monarch were the last straw. Oopsies.

<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Please note that
maintainers freely reserve the right to remove and add tags should they
deem it appropriate. You can attempt to finagle the system all you want,
but it's best to shoot for clear communication right off the bat. -->

🆑
balance: lowers Monarch's burn resist, makes charge not instant.
fix: Removes any reference to the Monarch spawning naturally, probable
or not.
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
2025-12-05 11:34:28 +01:00

291 lines
11 KiB
Plaintext

/obj/structure/largecrate
name = "large crate"
desc = "A hefty wooden crate."
icon = 'icons/obj/storage.dmi'
icon_state = "densecrate"
density = 1
worth_intrinsic = 200
var/list/starts_with
var/storage_capacity = 2 * MOB_LARGE //This is so that someone can't pack hundreds of items in a locker/crate
//then open it in a populated area to crash clients.
/obj/structure/largecrate/Initialize(mapload) //Shamelessly copied from closets.dm since the old Initializer didnt seem to function properly - Bloop
. = ..()
if(mapload)
addtimer(CALLBACK(src, PROC_REF(take_contents)), 0)
legacy_spawn_contents()
// Closets need to come later because of spawners potentially creating objects during init.
return INITIALIZE_HINT_LATELOAD
/obj/structure/largecrate/LateInitialize()
if(starts_with)
create_objects_in_loc(src, starts_with)
starts_with = null
update_icon()
/obj/structure/largecrate/proc/take_contents()
// if(istype(loc, /mob/living))
// return // No collecting mob organs if spawned inside mob
// I'll leave this out, if someone dies to this from voring someone who made a closet go yell at a coder to
// fix the fact you can build closets inside living people, not try to make it work you numbskulls.
var/obj/item/I
for(I in src.loc)
if(I.density || I.anchored || I == src) continue
I.forceMove(src)
// adjust locker size to hold all items with 5 units of free store room
var/content_size = 0
for(I in src.contents)
content_size += CEILING(I.w_class/2, 1)
if(content_size > storage_capacity-5)
storage_capacity = content_size + 5
/**
* The proc that fills the closet with its initial contents.
*/
/obj/structure/largecrate/proc/legacy_spawn_contents()
return
/* /// Doesnt work but im gonna leave this here commented out in case I broke something with the shameless copy pasta from above -Bloop
/obj/structure/largecrate/Initialize(mapload)
. = ..()
if(starts_with)
create_objects_in_loc(src, starts_with)
starts_with = null
for(var/obj/I in src.loc)
if(I.density || I.anchored || I == src || (I.atom_flags & ATOM_ABSTRACT))
continue
I.forceMove(src)
update_icon()
*/
/obj/structure/largecrate/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args)
to_chat(user, "<span class='notice'>You need a crowbar to pry this open!</span>")
return
/obj/structure/largecrate/attackby(obj/item/W as obj, mob/user as mob)
var/turf/T = get_turf(src)
if(!T)
to_chat(user, "<span class='notice'>You can't open this here!</span>")
if(W.is_crowbar())
new /obj/item/stack/material/wood(src)
for(var/atom/movable/AM in contents)
if(!(AM.atom_flags & ATOM_ABSTRACT))
AM.forceMove(T)
user.visible_message("<span class='notice'>[user] pries \the [src] open.</span>", \
"<span class='notice'>You pry open \the [src].</span>", \
"<span class='notice'>You hear splitting wood.</span>")
qdel(src)
else
return attack_hand(user)
/obj/structure/largecrate/mule
name = "MULE crate"
/obj/structure/largecrate/hoverpod
name = "\improper Hoverpod assembly crate"
desc = "It comes in a box for the fabricator's sake. Where does the wood come from? ... And why is it lighter?"
icon_state = "mulecrate"
/obj/structure/largecrate/hoverpod/attackby(obj/item/W as obj, mob/user as mob)
if(W.is_crowbar())
var/obj/item/vehicle_module/ME
var/obj/vehicle/sealed/mecha/working/hoverpod/H = new (loc)
ME = new /obj/item/vehicle_module/tool/hydraulic_clamp
ME.attach(H)
ME = new /obj/item/vehicle_module/tool/passenger
ME.attach(H)
..()
/obj/structure/largecrate/vehicle
name = "vehicle crate"
desc = "It comes in a box for the consumer's sake. ..How is this lighter?"
icon_state = "vehiclecrate"
/obj/structure/largecrate/vehicle/bike
name = "spacebike crate"
starts_with = list(/obj/structure/vehiclecage/spacebike)
/obj/structure/largecrate/vehicle/quadbike
name = "\improper ATV crate"
starts_with = list(/obj/vehicle/ridden/quadbike/random,
/obj/item/key/quadbike)
/obj/structure/largecrate/vehicle/quadtrailer
name = "\improper ATV trailer crate"
starts_with = list(/obj/structure/vehiclecage/quadtrailer)
/obj/structure/largecrate/animal
icon_state = "lisacrate"
/obj/structure/largecrate/animal/mulebot
name = "Mulebot crate"
icon_state = "mulecrate"
starts_with = list(/mob/living/bot/mulebot)
/obj/structure/largecrate/animal/corgi
name = "corgi carrier"
starts_with = list(/mob/living/simple_mob/animal/passive/dog/corgi)
/obj/structure/largecrate/animal/cow
name = "cow crate"
starts_with = list(/mob/living/simple_mob/animal/passive/cow)
/obj/structure/largecrate/animal/goat
name = "goat crate"
starts_with = list(/mob/living/simple_mob/animal/goat)
/obj/structure/largecrate/animal/horse
name = "horse crate"
starts_with = list(/mob/living/simple_mob/horse)
/obj/structure/largecrate/animal/cat
name = "cat carrier"
starts_with = list(/mob/living/simple_mob/animal/passive/cat)
/obj/structure/largecrate/animal/cat/bones
starts_with = list(/mob/living/simple_mob/animal/passive/cat/bones)
/obj/structure/largecrate/animal/chick
name = "chicken crate"
starts_with = list(/mob/living/simple_mob/animal/passive/chick = 5)
/obj/structure/largecrate/animal/carp
name = "space carp crate"
starts_with = list(/mob/living/simple_mob/animal/space/carp = 3)
/obj/structure/largecrate/animal/spiders
name = "spider crate"
starts_with = list(/mob/living/simple_mob/animal/giant_spider= 3)
//! ## VR FILE MERGE ## !//
/obj/structure/largecrate/birds //This is an awful hack, but it's the only way to get multiple mobs spawned in one crate.
name = "Bird crate"
desc = "You hear chirping and cawing inside the crate. It sounds like there are a lot of birds in there..."
/obj/structure/largecrate/birds/attackby(obj/item/W as obj, mob/user as mob)
if(W.is_crowbar())
new /obj/item/stack/material/wood(src)
new /mob/living/simple_mob/animal/passive/bird(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/kea(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/eclectus(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/white_caique(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen(src)
new /mob/living/simple_mob/animal/passive/bird/black_bird(src)
new /mob/living/simple_mob/animal/passive/bird/azure_tit(src)
new /mob/living/simple_mob/animal/passive/bird/european_robin(src)
new /mob/living/simple_mob/animal/passive/bird/goldcrest(src)
new /mob/living/simple_mob/animal/passive/bird/ringneck_dove(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo(src)
new /mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo(src)
var/turf/T = get_turf(src)
for(var/atom/movable/AM in contents)
if(!(AM.atom_flags & ATOM_ABSTRACT))
AM.forceMove(T)
user.visible_message("<span class='notice'>[user] pries \the [src] open.</span>", \
"<span class='notice'>You pry open \the [src].</span>", \
"<span class='notice'>You hear splitting wood.</span>")
qdel(src)
else
return attack_hand(user)
/*
/obj/structure/largecrate/animal/pred
name = "Predator carrier"
starts_with = list(/mob/living/simple_mob/vore/catgirl)
*/
/obj/structure/largecrate/animal/pred/Initialize(mapload) //This is nessesary to get a random one each time.
starts_with = list(pick(/mob/living/simple_mob/vore/bee,
/mob/living/simple_mob/vore/aggressive/frog,
/mob/living/simple_mob/vore/aggressive/panther,
/mob/living/simple_mob/vore/aggressive/giant_snake,
/mob/living/simple_mob/animal/wolf,
/mob/living/simple_mob/animal/space/bear;0.5,
/mob/living/simple_mob/animal/space/carp,
/mob/living/simple_mob/vore/aggressive/mimic,
/mob/living/simple_mob/vore/aggressive/rat,
/mob/living/simple_mob/vore/aggressive/rat/tame,
// /mob/living/simple_mob/otie;0.5
))
return ..()
/obj/structure/largecrate/animal/dangerous
name = "Dangerous Predator carrier"
starts_with = list(/mob/living/simple_mob/animal/space/xenomorph/warrior)
/obj/structure/largecrate/animal/dangerous/Initialize(mapload)
starts_with = list(pick(/mob/living/simple_mob/animal/space/carp/large,
/mob/living/simple_mob/vore/aggressive/deathclaw,
/mob/living/simple_mob/vore/aggressive/dino,
/mob/living/simple_mob/animal/space/xenomorph/drone,
/mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter,
/mob/living/simple_mob/vore/aggressive/corrupthound))
return ..()
/obj/structure/largecrate/animal/wolfgirl
name = "Wolfgirl Crate"
desc = "A sketchy looking crate with airholes that shakes and thuds every now and then. Someone seems to be demanding they be let out."
starts_with = list(/mob/living/simple_mob/vore/wolfgirl)
/obj/structure/largecrate/animal/fennec
name = "Fennec Crate"
desc = "Bounces around a lot. Looks messily packaged, were they in a hurry?"
starts_with = list(/mob/living/simple_mob/vore/fennec)
/obj/structure/largecrate/animal/fennec/Initialize(mapload)
starts_with = list(pick(/mob/living/simple_mob/vore/fennec,
/mob/living/simple_mob/vore/fennix;0.5))
return ..()
//Corporate Largecrates
/obj/structure/closet/crate/large/corporate/aether
desc = "A hefty metal crate, painted in Aether Atmospherics and Recycling colours."
icon_state = "aetherlarge"
icon_opened = "aetherlargeopen"
icon_closed = "aetherlarge"
/obj/structure/closet/crate/large/corporate/einstein
desc = "A hefty metal crate, with an Einstien Engines sticker, the company has since been bought out by Hephaestus Industries."
icon_state = "eelarge"
icon_opened = "eelargeopen"
icon_closed = "eelarge"
/obj/structure/closet/crate/large/corporate/nanotrasen
desc = "A hefty metal crate, painted in standard Nanotrasen livery."
icon_state = "ntlarge"
icon_opened = "ntlargeopen"
icon_closed = "ntlarge"
/obj/structure/closet/crate/large/corporate/xion
desc = "A hefty metal crate, painted in the orange of the former Xion Manufacturing Group, now a subsidiary of Aether Atmospherics and Recycling."
icon_state = "xionlarge"
icon_opened = "xionlargeopen"
icon_closed = "xionlarge"
/obj/structure/closet/crate/large/secure/corporate/heph
desc = "A hefty metal crate with an electronic locking system, marked with Hephaestus Industries colours."
icon_state = "hephlarge"
icon_opened = "hephlargeopen"
icon_closed = "hephlarge"
/obj/structure/closet/crate/large/secure/corporate/xion
desc = "A hefty metal crate with an electronic locking system, painted in the orange of the former Xion Manufacturing Group, now a subsidiary of Aether Atmospherics and Recycling."
icon_state = "xionlargesecure"
icon_opened = "xionlargesecureopen"
icon_closed = "xionlargesecure"