Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions modular_oculis/modules/slime_rancher/code/feeding_flora.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/mob/living/basic/cockroach/rockroach
name = "rockroach"
desc = "This cockroach has decided to cosplay as a turtle and is carrying a rock shell on it's back."
icon = 'modular_oculis/modules/slime_rancher/icons/xenofauna.dmi'
icon_state = "rockroach"
health = 15
maxHealth = 15

/mob/living/basic/cockroach/rockroach/Initialize(mapload)
. = ..()
AddElement(/datum/element/death_drops, /obj/item/rockroach_shell)

/obj/item/rockroach_shell
name = "rockroach shell"
desc = "A rocky shell of some poor rockroach."
icon = 'modular_oculis/modules/slime_rancher/icons/xenofauna.dmi'
icon_state = "rockroach_shell"
w_class = WEIGHT_CLASS_SMALL
throw_speed = 2
throw_range = 7

/mob/living/basic/cockroach/iceroach
name = "iceroach"
desc = "This cockroach has decided to cosplay as a turtle and is carrying some ice shards on it's back."
icon = 'modular_oculis/modules/slime_rancher/icons/xenofauna.dmi'
icon_state = "rockroach"
health = 15
maxHealth = 15

/mob/living/basic/cockroach/recursive
name = "recursive roach"
desc = "I swear I've seen this one before but I can't remember where."
icon = 'modular_oculis/modules/slime_rancher/icons/xenofauna.dmi'
icon_state = "rockroach"
health = 15
maxHealth = 15

/mob/living/basic/xenofauna
desc = "Feed these to the slimes!"
icon = 'modular_oculis/modules/slime_rancher/icons/xenofauna.dmi'
ai_controller = /datum/ai_controller/basic_controller/cockroach
health = 40
maxHealth = 40
basic_mob_flags = DEL_ON_DEATH
mob_size = MOB_SIZE_SMALL
pass_flags = PASSMOB // otherwise these fuckers will be super annoying

/mob/living/basic/xenofauna/diyaab
name = "diyaab"
icon_state = "diyaab"

/mob/living/basic/xenofauna/lavadog
name = "lava dog"
icon_state = "lavadog"

/mob/living/basic/xenofauna/dron
name = "semi-organic bug"
icon_state = "dron"

/mob/living/basic/xenofauna/greeblefly
name = "greeblefly"
icon_state = "greeblefly"

/mob/living/basic/xenofauna/possum
name = "possum"
icon_state = "possum"

/mob/living/basic/xenofauna/thoom
name = "thoom"
icon_state = "thoom"

/mob/living/basic/xenofauna/meatbeast
name = "meat beast"
icon_state = "meatbeast"

/mob/living/basic/xenofauna/thinbug
name = "thin bug"
icon_state = "thinbug"

/mob/living/basic/xenofauna/voxslug
name = "strange slug"
icon_state = "voxslug"
123 changes: 123 additions & 0 deletions modular_oculis/modules/slime_rancher/code/slime_mutation.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
/// Slime mutation datum singletons: [type] = instance
GLOBAL_ALIST_INIT(slime_mutations, init_slime_mutations())

/datum/slime_mutation
abstract_type = /datum/slime_mutation
/// The slime type we pass on if we succeed
var/datum/slime_type/mutates_into
/// Items to feed the slime in order to mutate
var/list/needed_items
/// The mobs needed to be latch fed in order to mutate - stored in type = amount
var/alist/latch_needed
/// If TRUE, then you can't get this color from a random mutator syringe
var/syringe_blocked = FALSE

/datum/slime_mutation/Destroy(force)
if(!force)
. = QDEL_HINT_LETMELIVE
CRASH("why are you trying to delete a slime mutation, these are singletons")
return ..()

/datum/slime_mutation/metal
mutates_into = /datum/slime_type/metal
needed_items = list(/obj/item/stack/sheet/iron)

/datum/slime_mutation/orange
mutates_into = /datum/slime_type/orange
needed_items = list(/obj/item/stack/sheet/mineral/plasma)

/datum/slime_mutation/purple
mutates_into = /datum/slime_type/purple
needed_items = list(/obj/item/stack/medical/wrap/gauze)

/datum/slime_mutation/blue
mutates_into = /datum/slime_type/blue
latch_needed = alist(/mob/living/basic/cockroach/iceroach = 50)

/datum/slime_mutation/cerulean
mutates_into = /datum/slime_type/cerulean
latch_needed = alist(/mob/living/basic/cockroach/recursive = 40)

/datum/slime_mutation/dark_blue
mutates_into = /datum/slime_type/dark_blue
latch_needed = alist(/mob/living/basic/xenofauna/diyaab = 75)

/datum/slime_mutation/red
mutates_into = /datum/slime_type/red
latch_needed = alist(/mob/living/basic/xenofauna/lavadog = 50)

/datum/slime_mutation/oil
mutates_into = /datum/slime_type/oil
latch_needed = alist(/mob/living/basic/xenofauna/dron = 65)

/datum/slime_mutation/yellow
mutates_into = /datum/slime_type/yellow
needed_items = list(/obj/item/stock_parts/power_store/cell)

/datum/slime_mutation/green
mutates_into = /datum/slime_type/green
latch_needed = alist(/mob/living/basic/xenofauna/greeblefly = 65)

/datum/slime_mutation/sepia
mutates_into = /datum/slime_type/sepia
latch_needed = alist(/mob/living/basic/xenofauna/possum = 65)

/datum/slime_mutation/black
mutates_into = /datum/slime_type/black
latch_needed = alist(/mob/living/basic/xenofauna/thoom = 50)

/datum/slime_mutation/silver
mutates_into = /datum/slime_type/silver
latch_needed = alist(/mob/living/basic/xenofauna/meatbeast = 80)

/datum/slime_mutation/gold
mutates_into = /datum/slime_type/gold
needed_items = list(/obj/item/stack/sheet/mineral/gold)

/datum/slime_mutation/adamantine
mutates_into = /datum/slime_type/adamantine
needed_items = list(/obj/item/rockroach_shell)

/datum/slime_mutation/darkpurple
mutates_into = /datum/slime_type/darkpurple
needed_items = list(/obj/item/slime_extract/purple)

/datum/slime_mutation/pink
mutates_into = /datum/slime_type/pink
latch_needed = alist(/mob/living/basic/xenofauna/thinbug = 80)

/datum/slime_mutation/pyrite
mutates_into = /datum/slime_type/pyrite
needed_items = list(/obj/item/toy/crayon/rainbow)

/datum/slime_mutation/bluespace
mutates_into = /datum/slime_type/bluespace
needed_items = list(/obj/item/stack/ore/bluespace_crystal)

/datum/slime_mutation/lightpink
mutates_into = /datum/slime_type/lightpink
latch_needed = alist(/mob/living/basic/xenofauna/voxslug = 80)

/datum/slime_mutation/darkgrey
mutates_into = /datum/slime_type/unique/darkgrey
needed_items = list(/obj/item/crusher_trophy/legion_skull)
syringe_blocked = TRUE

/datum/slime_mutation/rainbow
mutates_into = /datum/slime_type/rainbow
needed_items = list(
/obj/item/slime_extract/orange,
/obj/item/slime_extract/purple,
/obj/item/slime_extract/blue,
/obj/item/slime_extract/metal,
/obj/item/slime_extract/yellow,
/obj/item/slime_extract/darkblue,
/obj/item/slime_extract/darkpurple,
/obj/item/slime_extract/silver,
)
syringe_blocked = TRUE

/proc/init_slime_mutations()
. = alist()
for(var/datum/slime_mutation/mutation_type as anything in valid_subtypesof(/datum/slime_mutation))
.[mutation_type] = new mutation_type
62 changes: 62 additions & 0 deletions modular_oculis/modules/slime_rancher/code/slime_pens/slime_pen.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/// handles a single slime pen and tracks the slimes in it
/datum/slime_pen
/// List of all slimes in the pen.
var/list/slimes
/// List of all turfs in the pen.
var/list/turf/turfs = list()

/datum/slime_pen/Destroy(force)
for(var/turf/turf as anything in turfs)
remove_turf(turf)
// cleaning up all turfs SHOULD remove all slimes, but this is BYOND, "should" doesn't mean jack shit, so better safe than sorry
for(var/mob/living/basic/slime/slime as anything in slimes)
stop_tracking_slime(slime)
turfs = null
return ..()

/datum/slime_pen/proc/track_slime(mob/living/basic/slime/slime)
SIGNAL_HANDLER
if(!isslime(slime))
CRASH("somehow tried to add something that isn't a slime as a slime in a pen")
if(QDELING(slime) || (slime in slimes) || !(slime.loc in turfs) || QDELETED(src))
return
LAZYADD(slimes, slime)
RegisterSignal(slime, COMSIG_QDELETING, PROC_REF(stop_tracking_slime))
RegisterSignal(slime, COMSIG_MOVABLE_MOVED, PROC_REF(slime_moved))

/datum/slime_pen/proc/stop_tracking_slime(mob/living/basic/slime/slime)
SIGNAL_HANDLER
if(isnull(slime) || !(slime in slimes))
return
UnregisterSignal(slime, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED))
LAZYREMOVE(slimes, slime)

/datum/slime_pen/proc/slime_moved(mob/living/basic/slime/slime, atom/old_loc, dir, forced, list/old_locs)
SIGNAL_HANDLER
if(!(slime.loc in turfs))
stop_tracking_slime(slime)

/datum/slime_pen/proc/add_turf(turf/new_turf)
if(!isturf(new_turf))
CRASH("somehow tried to add a non-turf as a slime pen turf")
if(new_turf in turfs)
return
RegisterSignals(new_turf, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON), PROC_REF(check_entered))
turfs += new_turf
for(var/mob/living/basic/slime/slime in new_turf)
track_slime(slime)

/datum/slime_pen/proc/remove_turf(turf/old_turf)
if(!isturf(old_turf))
CRASH("somehow tried to remove a non-turf from the slime pen turfs?")
if(!(old_turf in turfs))
return
UnregisterSignal(old_turf, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON))
turfs -= old_turf
for(var/mob/living/basic/slime/slime in old_turf)
stop_tracking_slime(slime)

/datum/slime_pen/proc/check_entered(datum/source, atom/movable/arrived)
SIGNAL_HANDLER
if(isslime(arrived))
track_slime(arrived)
100 changes: 100 additions & 0 deletions modular_oculis/modules/slime_rancher/code/slime_type.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/datum/slime_type
/// List of `/datum/slime_mutation`s this slime type is eligible for.
/// Use this instead of the `mutations` list, because modularity or whatever.
var/list/possible_mutations

/datum/slime_type/New()
. = ..()
// slimes with no further mutations can mutate into rainbow
if(isnull(possible_mutations))
possible_mutations = list(/datum/slime_mutation/rainbow)

/datum/slime_type/grey
possible_mutations = list(
/datum/slime_mutation/metal,
/datum/slime_mutation/orange,
/datum/slime_mutation/purple,
/datum/slime_mutation/blue,
)

/datum/slime_type/blue
possible_mutations = list(
/datum/slime_mutation/silver,
/datum/slime_mutation/dark_blue,
/datum/slime_mutation/pink,
)

/datum/slime_type/dark_blue
possible_mutations = list(
/datum/slime_mutation/blue,
/datum/slime_mutation/purple,
/datum/slime_mutation/cerulean,
)

/datum/slime_type/green
possible_mutations = list(
/datum/slime_mutation/black,
)

/datum/slime_type/metal
possible_mutations = list(
/datum/slime_mutation/silver,
/datum/slime_mutation/yellow,
/datum/slime_mutation/gold,
)

/datum/slime_type/purple
possible_mutations = list(
/datum/slime_mutation/green,
/datum/slime_mutation/dark_blue,
/datum/slime_mutation/darkpurple,
)

/datum/slime_type/orange
possible_mutations = list(
/datum/slime_mutation/darkpurple,
/datum/slime_mutation/yellow,
/datum/slime_mutation/red,
)

/datum/slime_type/pink
possible_mutations = list(
/datum/slime_mutation/lightpink,
)

/datum/slime_type/darkpurple
possible_mutations = list(
/datum/slime_mutation/sepia,
/datum/slime_mutation/purple,
/datum/slime_mutation/orange,
)

/datum/slime_type/red
possible_mutations = list(
/datum/slime_mutation/oil,
)

/datum/slime_type/yellow
possible_mutations = list(
/datum/slime_mutation/bluespace,
/datum/slime_mutation/metal,
/datum/slime_mutation/orange,
)

/datum/slime_type/gold
possible_mutations = list(
/datum/slime_mutation/adamantine,
)

/datum/slime_type/silver
possible_mutations = list(
/datum/slime_mutation/pyrite,
/datum/slime_mutation/metal,
/datum/slime_mutation/blue,
)

/datum/slime_type/black
possible_mutations = list(
/datum/slime_mutation/darkgrey,
/datum/slime_mutation/rainbow,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
xenofauna.dmi - https://github.com/SmArtKar
Binary file not shown.
4 changes: 4 additions & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -10479,6 +10479,10 @@
#include "modular_oculis\modules\saltmining\code\surplus_mining_crate.dm"
#include "modular_oculis\modules\slime_luxpens\code\hypospray.dm"
#include "modular_oculis\modules\slime_luxpens\code\medicine_reagents.dm"
#include "modular_oculis\modules\slime_rancher\code\feeding_flora.dm"
#include "modular_oculis\modules\slime_rancher\code\slime_mutation.dm"
#include "modular_oculis\modules\slime_rancher\code\slime_type.dm"
#include "modular_oculis\modules\slime_rancher\code\slime_pens\slime_pen.dm"
#include "modular_oculis\modules\species\ethereal\code\ethereal.dm"
#include "modular_oculis\modules\species\ethereal\code\ethereal_bodyparts.dm"
#include "modular_oculis\modules\species\ethereal\code\ethereal_eyes.dm"
Expand Down