Files
Athena148andGitHub 03b83205eb The Void Horrors, Xenomorph Expansion (#6787)
<!-- 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
Expands upon the Xenomorph Rehaul project, beautifying the code,
separating it into its own category and sub-categories. Also adds a few
new Xenomorphs and re balances some of the older ones.
<!-- 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
Beautifies and cleans Xenomorph code, adds a few new gimmick xenomorphs
as well.
<!-- 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. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. 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. -->

🆑
add: Burster, Sprinter, Berserker and Inferno
qol: Made Xenomorph code prettier and easier to add/remove from
balance: Re balances some older Xenomorphs
imageadd: Adds sprites for the Burster, Sprinter, Berserker and Inferno
Xenomorphs
/🆑

<!-- 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. -->
2024-10-06 18:02:19 -04:00

156 lines
4.6 KiB
Plaintext

//////////////////////////////
// An asteroid object, could be spawned in, or not
// May or may not include phat lewt
//////////////////////////////
/turf/simulated/mineral/vacuum
initial_gas_mix = GAS_STRING_VACUUM
/turf/simulated/mineral/floor/vacuum
initial_gas_mix = GAS_STRING_VACUUM
/datum/rogue/asteroid
//Composition
var/type_wall = /turf/simulated/mineral/vacuum //Type of turf used to generate the asteroid
var/type_under = /turf/simulated/mineral/floor/vacuum //Type of turf that's under the normal one
//Dimensions
var/coresize = 3 //The size of the center square
var/width = 9
//Other Attribs
var/hollow = 0 //Might be hollow for loot injection purposes
var/spawned = 0 //Is this asteroid in-play right now
var/difficulty = 0 //Difficulty this asteroid was created at
//Locational stats
var/obj/landmark/asteroid_spawn/mylandmark //The landmark I'm spawned at, if any.
//Asteroid map
//The map struct is:
// map list()
// 0 = list()
// 1 = list() //These are x coordinates
// 2 = list()
// ^0 = list()
// 1 = list() //These are y coordinates at x2
// 2 = list()
// ^type1
// type2 //These are items/objects at the coordinate
// type3 //This would be object 3 at x2,y2
var/list/map
//Builds an empty map
/datum/rogue/asteroid/New(var/core, var/tw, var/tu)
rm_controller.dbg("A(n): New asteroid, with: C:[core], TW:[tw], TU:[tu].")
if(core)
coresize = core
if(tw)
type_wall = tw
if(tu)
type_under = tu
width = coresize*3
rm_controller.dbg("A(n): My width is [width].")
map = new/list(width,width,0)
rm_controller.dbg("A(n): Created empty map lists. Map now has [map.len] X-lists.")
//Adds something to a spot in the asteroid map
/datum/rogue/asteroid/proc/spot_add(var/x,var/y,var/thing)
if(!x || !y || !thing)
return
rm_controller.dbg("A(sa): Adding [thing] at [x],[y] in the map.")
var/list/work = map[x][y]
work.Add(thing)
rm_controller.dbg("A(n): [x],[y] now contains [work.len] items.")
//Removes something from a spot in the asteroid map
/datum/rogue/asteroid/proc/spot_remove(var/x,var/y,var/thing)
if(!x || !y || !thing)
return
var/list/work = map[x][y]
work.Add(thing)
//Just removes everything from a spot in the asteroid map
/datum/rogue/asteroid/proc/spot_clear(var/x,var/y)
if(!x || !y)
return
var/list/work = map[x][y]
work.Cut()
/////////////////////////////
// Predefined asteroid maps
/////////////////////////////
/datum/rogue/asteroid/predef
width = 3 //Small 1-tile room by default.
/datum/rogue/asteroid/predef/New() //Basically just ignore what we're told.
rm_controller.dbg("Ap(n): A predefined asteroid is created with width [width].")
map = new/list(width,width,0)
//Abandoned 1-tile hollow cargo box (pressurized).
/datum/rogue/asteroid/predef/cargo
type_wall = /turf/simulated/wall
type_under = /turf/simulated/floor/plating
/datum/rogue/asteroid/predef/cargo/New()
..()
spot_add(1,1,type_wall) //Bottom left corner
spot_add(1,2,type_wall)
spot_add(1,3,type_wall)
spot_add(2,1,type_wall)
spot_add(2,2,type_under) //Center floor
spot_add(2,2,/obj/random/roguemineloot) //Loot!
spot_add(2,3,type_wall)
spot_add(3,1,type_wall)
spot_add(3,2,type_wall)
spot_add(3,3,type_wall) //Bottom right corner
//Abandoned 1-tile hollow cargo box (ANGRY).
/datum/rogue/asteroid/predef/cargo/angry
type_wall = /turf/simulated/wall
type_under = /turf/simulated/floor/plating
/datum/rogue/asteroid/predef/cargo/angry/New()
..()
spot_add(2,2,/obj/random/roguemineloot) //EXTRA loot!
spot_add(2,2,/mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter) //GRRR
//Longer cargo container for higher difficulties
/datum/rogue/asteroid/predef/cargo_large
width = 5
type_wall = /turf/simulated/wall
type_under = /turf/simulated/floor/plating
/datum/rogue/asteroid/predef/cargo_large/New()
..()
spot_add(1,2,type_wall) //--
spot_add(1,3,type_wall) //Left end of cargo container
spot_add(1,4,type_wall) //--
spot_add(5,2,type_wall) //--
spot_add(5,3,type_wall) //Right end of cargo container
spot_add(5,4,type_wall) //--
spot_add(2,4,type_wall) //--
spot_add(3,4,type_wall) //Top and
spot_add(4,4,type_wall) //bottom of
spot_add(2,2,type_wall) //cargo
spot_add(3,2,type_wall) //container
spot_add(4,2,type_wall) //--
spot_add(2,3,type_under) //Left floor
spot_add(3,3,type_under) //Mid floor
spot_add(4,3,type_under) //Right floor
spot_add(2,3,/obj/random/roguemineloot) //Left loot
spot_add(3,3,/obj/random/roguemineloot) //Mid loot
spot_add(4,3,/obj/random/roguemineloot) //Right loot
if(prob(30))
spot_add(3,3,/mob/living/simple_mob/animal/space/xenomorph/warrior) //And maybe a big friend for big loot.