diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 9f9d1d15c94..2bdb3432f69 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -94,3 +94,7 @@
#define DEFAULT_ITEM_PUTON_DELAY 20 //time taken (in deciseconsd) to reverse-strip somebody
#define IGNORE_ACCESS -1
+
+#define CHEM_MOB_SPAWN_INVALID 0
+#define CHEM_MOB_SPAWN_HOSTILE 1
+#define CHEM_MOB_SPAWN_FRIENDLY 2
\ No newline at end of file
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
index 91a06fa4647..04abf50e362 100644
--- a/code/_globalvars/lists/mobs.dm
+++ b/code/_globalvars/lists/mobs.dm
@@ -24,53 +24,6 @@ var/global/list/dead_mob_list = list() //List of all dead mobs, including cli
var/global/list/respawnable_list = list() //List of all mobs, dead or in mindless creatures that still be respawned.
var/global/list/simple_animal_list = list() //List of all simple animals, including clientless
-//global var of unsafe-to-spawn-on-reaction mobs
-var/global/list/blocked_mobs = list(/mob/living/simple_animal,
- /mob/living/simple_animal/hostile,
- /mob/living/simple_animal/hostile/pirate,
- /mob/living/simple_animal/hostile/pirate/ranged,
- /mob/living/simple_animal/hostile/russian,
- /mob/living/simple_animal/hostile/russian/ranged,
- /mob/living/simple_animal/hostile/syndicate,
- /mob/living/simple_animal/hostile/syndicate/melee,
- /mob/living/simple_animal/hostile/syndicate/melee/space,
- /mob/living/simple_animal/hostile/syndicate/ranged,
- /mob/living/simple_animal/hostile/syndicate/ranged/space,
- /mob/living/simple_animal/hostile/alien/queen/large,
- /mob/living/simple_animal/hostile/retaliate,
- /mob/living/simple_animal/hostile/retaliate/clown,
- /mob/living/simple_animal/hostile/mushroom,
- /mob/living/simple_animal/hostile/asteroid,
- /mob/living/simple_animal/hostile/asteroid/basilisk,
- /mob/living/simple_animal/hostile/asteroid/goldgrub,
- /mob/living/simple_animal/hostile/asteroid/goliath,
- /mob/living/simple_animal/hostile/asteroid/hivelord,
- /mob/living/simple_animal/hostile/asteroid/hivelordbrood,
- /mob/living/simple_animal/hostile/carp/holocarp,
- /mob/living/simple_animal/hostile/mining_drone,
- /mob/living/simple_animal/hostile/spaceWorm,
- /mob/living/simple_animal/hostile/spaceWorm/wormHead,
- /mob/living/simple_animal/ascendant_shadowling,
- /mob/living/simple_animal/slaughter,
- /mob/living/simple_animal/hostile/retaliate/araneus,
- /mob/living/simple_animal/hostile/syndicate/ranged/orion,
- /mob/living/simple_animal/hostile/statue,
- /mob/living/simple_animal/hostile/guardian,
- /mob/living/simple_animal/hostile/guardian/fire,
- /mob/living/simple_animal/hostile/guardian/healer,
- /mob/living/simple_animal/hostile/guardian/punch,
- /mob/living/simple_animal/hostile/guardian/punch/sealpunch,
- /mob/living/simple_animal/hostile/guardian/healer/sealhealer,
- /mob/living/simple_animal/hostile/guardian/ranged,
- /mob/living/simple_animal/hostile/guardian/bomb,
- /mob/living/simple_animal/hostile/winter/santa,
- /mob/living/simple_animal/hostile/winter/santa/stage_1,
- /mob/living/simple_animal/hostile/winter/santa/stage_2,
- /mob/living/simple_animal/hostile/winter/santa/stage_3,
- /mob/living/simple_animal/hostile/winter/santa/stage_4,
- /mob/living/simple_animal/hostile/alien/maid
- )
-
var/global/list/med_hud_users = list()
var/global/list/sec_hud_users = list()
var/global/list/antag_hud_users = list()
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index bfaad382adf..a35505470fa 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -40,6 +40,7 @@
var/obj/effect/blob/factory/factory = null
var/list/human_overlays = list()
var/is_zombie = 0
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
@@ -160,6 +161,7 @@
maxbodytemp = 360
force_threshold = 10
environment_smash = 3
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/blob/blobbernaut/blob_act()
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 4bbdb4966c1..5e46a20dd6d 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -90,9 +90,12 @@
race = "Artificial Life"
else if(isslime(M)) // NT knows a lot about slimes, but not aliens. Can identify slimes
- race = "slime"
+ race = "Slime"
language = race
+ else if(isbot(M))
+ race = "Bot"
+
else if(isanimal(M))
race = "Domestic Animal"
language = race
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 8266c2a0ee8..81799f01115 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1252,7 +1252,7 @@
vend_delay = 15
icon_state = "artvend"
products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/device/camera = 4,/obj/item/device/camera_film = 6,
- /obj/item/weapon/storage/photo_album = 2,/obj/item/stack/wrapping_paper = 4,/obj/item/stack/packageWrap = 4,
+ /obj/item/weapon/storage/photo_album = 2,/obj/item/stack/wrapping_paper = 4,/obj/item/stack/tape_roll = 5,/obj/item/stack/packageWrap = 4,
/obj/item/weapon/storage/fancy/crayons = 4,/obj/item/weapon/hand_labeler = 4,/obj/item/weapon/paper = 10,
/obj/item/weapon/c_tube = 10,/obj/item/weapon/pen = 5,/obj/item/weapon/pen/blue = 5,
/obj/item/weapon/pen/red = 5)
diff --git a/code/modules/events/tear.dm b/code/modules/events/tear.dm
index 605c6d1705d..e409f6592d8 100644
--- a/code/modules/events/tear.dm
+++ b/code/modules/events/tear.dm
@@ -41,15 +41,17 @@
if(animation) qdel(animation)
spawn(rand(30,120))
- var/blocked = blocked_mobs //global variable for blocked mobs
+ var/list/tear_critters = list()
+ for(var/T in typesof(/mob/living/simple_animal))
+ var/mob/living/simple_animal/SA = T
+ if(initial(SA.gold_core_spawnable) == CHEM_MOB_SPAWN_HOSTILE)
+ tear_critters += T
- var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
-
- for(var/i = 1, i <= 5, i++)
- var/chosen = pick(critters)
- var/mob/living/simple_animal/hostile/C = new chosen
- C.faction = list("slimesummon")
- C.loc = src.loc
+ for(var/i in 1 to 5)
+ var/chosen = pick(tear_critters)
+ var/mob/living/simple_animal/C = new chosen
+ C.faction |= "chemicalsummon"
+ C.forceMove(get_turf(src))
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index a468913eda3..f1f317789b4 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -211,7 +211,7 @@
return ..()
/obj/item/device/mobcapsule/attack(var/atom/A, mob/user, prox_flag)
- if(!istype(A, /mob/living/simple_animal))
+ if(!istype(A, /mob/living/simple_animal) || isbot(A))
return ..()
capture(A, user)
return 1
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index f736a17af22..7162933349d 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -53,6 +53,8 @@
return 1
if (istype(other, /mob/living/silicon))
return 1
+ if (istype(other, /mob/living/simple_animal/bot))
+ return 1
if (istype(other, /mob/living/carbon/brain))
return 1
if (istype(other, /mob/living/carbon/slime))
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 07ea4bfa0bb..1eebe03d1ab 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -56,6 +56,8 @@
return 1
if (istype(other, /mob/living/silicon))
return 1
+ if (istype(other, /mob/living/simple_animal/bot))
+ return 1
if (istype(other, /mob/living/carbon/brain))
return 1
return ..()
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 2a53be92ee5..af39fbbd6f3 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -132,6 +132,13 @@
radio_config["[radio_channel]"] = 1
Radio.config(radio_config)
+ add_language("Galactic Common", 1)
+ add_language("Sol Common", 1)
+ add_language("Tradeband", 1)
+ add_language("Gutter", 1)
+ add_language("Trinary", 1)
+ default_language = all_languages["Galactic Common"]
+
bot_core = new bot_core_type(src)
spawn(30)
if(radio_controller && bot_filter)
diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
index 27df35c5bf9..60aad72ab36 100644
--- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm
+++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
@@ -18,6 +18,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = 2
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 0)
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/butterfly/New()
..()
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index b2a0c129b29..c77d117bad4 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -20,6 +20,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
//RUNTIME IS ALIVE! SQUEEEEEEEE~
/mob/living/simple_animal/pet/cat/Runtime
@@ -32,6 +33,7 @@
gender = FEMALE
var/turns_since_scan = 0
var/mob/living/simple_animal/mouse/movement_target
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
/mob/living/simple_animal/pet/cat/Runtime/handle_automated_action()
..()
@@ -96,4 +98,5 @@
flags = NO_BREATHE
faction = list("syndicate")
var/turns_since_scan = 0
- var/mob/living/simple_animal/mouse/movement_target
\ No newline at end of file
+ var/mob/living/simple_animal/mouse/movement_target
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index fa49d9bdffd..6463c830fed 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -26,6 +26,7 @@
var/obj/item/inventory_head
var/obj/item/inventory_back
var/facehugger
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/pet/corgi/New()
..()
@@ -398,6 +399,7 @@
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
/mob/living/simple_animal/pet/corgi/Ian/process_ai()
..()
@@ -554,6 +556,7 @@
response_harm = "kicks"
var/turns_since_scan = 0
var/puppies = 0
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
//Lisa already has a cute bow!
/mob/living/simple_animal/pet/corgi/Lisa/Topic(href, href_list)
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index f5880e5ba7d..31da301ce57 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -22,6 +22,7 @@
var/obj/item/inventory_mask
can_hide = 1
can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/crab/handle_automated_movement()
//CRAB movement
@@ -46,6 +47,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
//LOOK AT THIS - ..()??
/*/mob/living/simple_animal/crab/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
diff --git a/code/modules/mob/living/simple_animal/friendly/deer.dm b/code/modules/mob/living/simple_animal/friendly/deer.dm
index 0cc59c07f94..034fa07b6fb 100644
--- a/code/modules/mob/living/simple_animal/friendly/deer.dm
+++ b/code/modules/mob/living/simple_animal/friendly/deer.dm
@@ -14,4 +14,5 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
- can_collar = 1
\ No newline at end of file
+ can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index fd32aa4fd0c..fdf597b005e 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -111,6 +111,7 @@
health = 50
var/milk_content = 0
can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/cow/New()
..()
@@ -178,6 +179,7 @@
small = 1
can_hide = 1
can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/chick/New()
..()
@@ -220,6 +222,7 @@ var/global/chicken_count = 0
small = 1
can_hide = 1
can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/chicken/New()
..()
@@ -297,6 +300,7 @@ var/global/chicken_count = 0
attacktext = "kicks"
health = 50
can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/turkey
name = "turkey"
@@ -318,6 +322,7 @@ var/global/chicken_count = 0
attacktext = "pecks"
health = 50
can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/goose
name = "goose"
@@ -339,6 +344,7 @@ var/global/chicken_count = 0
attacktext = "kicks"
health = 50
can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/seal
name = "seal"
@@ -360,6 +366,7 @@ var/global/chicken_count = 0
attacktext = "kicks"
health = 50
can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/walrus
name = "walrus"
@@ -381,3 +388,4 @@ var/global/chicken_count = 0
attacktext = "kicks"
health = 50
can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm
index cd62ababfe7..5bf03f083a2 100644
--- a/code/modules/mob/living/simple_animal/friendly/fox.dm
+++ b/code/modules/mob/living/simple_animal/friendly/fox.dm
@@ -17,11 +17,13 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
//Captain fox
/mob/living/simple_animal/pet/fox/Renault
name = "Renault"
desc = "Renault, the Captain's trustworthy fox. I wonder what it says?"
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
//Syndi fox
/mob/living/simple_animal/pet/fox/Syndifox
@@ -33,3 +35,4 @@
icon_resting = "Syndifox_rest"
flags = NO_BREATHE
faction = list("syndicate")
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index 27cb2eb17cf..b5c0ccedeae 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -22,3 +22,4 @@
can_hide = 1
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 6e8ef064bd5..e6d48812842 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -31,6 +31,7 @@
can_hide = 1
holder_type = /obj/item/weapon/holder/mouse
can_collar = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/mouse/handle_automated_speech()
..()
@@ -144,3 +145,4 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "splats"
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm
index b4b6486b859..ec8a38509f1 100644
--- a/code/modules/mob/living/simple_animal/friendly/pug.dm
+++ b/code/modules/mob/living/simple_animal/friendly/pug.dm
@@ -17,6 +17,7 @@
response_disarm = "bops"
response_harm = "kicks"
see_in_dark = 5
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/pet/pug/process_ai()
..()
diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/friendly/tomato.dm
index f6d0bf9752e..ca135fe87be 100644
--- a/code/modules/mob/living/simple_animal/friendly/tomato.dm
+++ b/code/modules/mob/living/simple_animal/friendly/tomato.dm
@@ -14,4 +14,5 @@
response_harm = "smacks the"
harm_intent_damage = 5
pass_flags = PASSTABLE
- can_hide = 1
\ No newline at end of file
+ can_hide = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 47cfdd23984..80571d2eef8 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -29,6 +29,7 @@
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
heat_damage_per_tick = 20
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/alien/drone
@@ -127,6 +128,7 @@
move_to_delay = 4
maxHealth = 400
health = 400
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
/obj/item/projectile/neurotox
name = "neurotoxin"
@@ -151,6 +153,7 @@
icon_state = "maid"
icon_living = "maid"
icon_dead = "maid_dead"
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //no fun allowed
/mob/living/simple_animal/hostile/alien/maid/AttackingTarget()
if(istype(target, /atom/movable))
diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm
index 70c117860af..bbdf639c0f4 100644
--- a/code/modules/mob/living/simple_animal/hostile/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bat.dm
@@ -29,6 +29,7 @@
faction = list("scarybat")
var/mob/living/owner
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/scarybat/New(loc, mob/living/L as mob)
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 0171e960ed0..f55c4ce98d6 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -31,6 +31,7 @@
var/stance_step = 0
faction = list("russian")
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
//SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!!
/mob/living/simple_animal/hostile/bear/Hudson
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 2b13fadec8d..ddd302c3e8c 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -33,6 +33,7 @@
faction = list("carp")
flying = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/carp/Process_Spacemove(var/movement_dir = 0)
return 1 //No drifting in space for space carp! //original comments do not steal
@@ -53,6 +54,7 @@
icon_state = "holocarp"
icon_living = "holocarp"
maxbodytemp = INFINITY
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
/mob/living/simple_animal/hostile/carp/holocarp/death()
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm
index 9a3357e058a..50aa20b60d0 100644
--- a/code/modules/mob/living/simple_animal/hostile/creature.dm
+++ b/code/modules/mob/living/simple_animal/hostile/creature.dm
@@ -13,4 +13,5 @@
attacktext = "chomps"
attack_sound = 'sound/weapons/bite.ogg'
faction = list("creature")
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 380b332a7e4..a14efc6d279 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -25,6 +25,7 @@
speed = 4
faction = list("faithless")
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(var/movement_dir = 0)
return 1
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 9b1459027e4..5e25d37763d 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -49,6 +49,7 @@
move_to_delay = 6
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/poison/giant_spider/nurse
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index 9c9ec79fd34..8f1d95f6414 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -21,6 +21,7 @@
ventcrawler = 2
var/datum/mind/origin
var/egg_lain = 0
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index 44f5caa1609..3ccbb9abec2 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -21,6 +21,7 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
speak_emote = list("states")
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/hivebot/range
name = "Hivebot"
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm
index 6404ab29f21..85268dee619 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm
@@ -30,6 +30,7 @@
layer = 3.1 //so they can stay hidde under the /obj/structure/bush
var/stalk_tick_delay = 3
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/panther/ListTargets()
var/list/targets = list()
@@ -87,6 +88,7 @@
layer = 3.1 //so they can stay hidde under the /obj/structure/bush
var/stalk_tick_delay = 3
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/snake/ListTargets()
var/list/targets = list()
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 2f077249527..7cff96385e1 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -30,6 +30,7 @@
move_to_delay = 9
var/is_electronic = 0
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/mimic/FindTarget()
. = ..()
@@ -139,6 +140,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
var/mob/living/creator = null // the creator
var/destroy_objects = 0
var/knockdown_people = 0
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
/mob/living/simple_animal/hostile/mimic/copy/New(loc, var/obj/copy, var/mob/living/creator, var/destroy_original = 0)
..(loc)
diff --git a/code/modules/mob/living/simple_animal/hostile/poison_bees.dm b/code/modules/mob/living/simple_animal/hostile/poison_bees.dm
index b05ba13ccab..c8a6a79fb04 100644
--- a/code/modules/mob/living/simple_animal/hostile/poison_bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/poison_bees.dm
@@ -24,6 +24,7 @@
//Spaceborn beings don't get hurt by space
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(var/check_drift = 0)
return 1
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index e4285c98a0b..64803f06dad 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -132,6 +132,7 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
flying = 1
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/viscerator/death()
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 555386debcb..bd39b681978 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -28,6 +28,7 @@
minbodytemp = 0
faction = list("hostile", "winter")
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/tree/FindTarget()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm
index 0ecab13b44a..5710005846c 100644
--- a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm
@@ -33,6 +33,7 @@
bodytemperature = 73.0 //it's made of snow and hatred, so it's pretty cold.
maxbodytemp = 280.15 //at roughly 7 C, these will start melting (dying) from the warmth. Mind over matter or something.
heat_damage_per_tick = 10 //Now With Rapid Thawing Action!
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/winter/snowman/death()
@@ -63,6 +64,7 @@
melee_damage_lower = 5
melee_damage_upper = 10
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/winter/santa
maxHealth = 150 //if this seems low for a "boss", it's because you have to fight him multiple times, with him fully healing between stages
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 858ae10fc18..b4de1c94f40 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -82,6 +82,7 @@
//Parrots are kleptomaniacs. This variable ... stores the item a parrot is holding.
var/obj/item/held_item = null
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/parrot/New()
@@ -272,13 +273,13 @@
//Sprite and AI update for when a parrot gets pulled
if(pulledby && stat == CONSCIOUS)
- icon_state = "parrot_fly"
+ icon_state = "parrot_fly"
/mob/living/simple_animal/parrot/process_ai()
if(pulledby)
parrot_state = PARROT_WANDER
return
-
+
if(!isturf(src.loc) || !canmove || buckled)
return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove)
@@ -682,6 +683,7 @@
name = "Poly"
desc = "Poly the Parrot. An expert on quantum cracker theory."
speak = list("Poly wanna cracker!", ":eCheck the singlo, you chucklefucks!",":eCheck the tesla, you shits!",":eSTOP HOT-WIRING THE ENGINE, FUCKING CHRIST!",":eWire the solars, you lazy bums!",":eWHO TOOK THE DAMN HARDSUITS?",":eOH GOD ITS FREE CALL THE SHUTTLE")
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
/mob/living/simple_animal/parrot/Poly/New()
ears = new /obj/item/device/radio/headset/headset_eng(src)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index c9be5919f43..b86a034a69e 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -67,6 +67,8 @@
var/scan_ready = 1
var/simplespecies //Sorry, no spider+corgi buttbabies.
+ var/gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //if CHEM_MOB_SPAWN_HOSTILE can be spawned by plasma with gold core, CHEM_MOB_SPAWN_FRIENDLY are 'friendlies' spawned with blood
+
var/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions).
var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions
diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm
index c678a891fd8..90980c3a421 100644
--- a/code/modules/reagents/newchem/medicine.dm
+++ b/code/modules/reagents/newchem/medicine.dm
@@ -681,34 +681,6 @@ datum/reagent/life
/datum/chemical_reaction/life/on_reaction(var/datum/reagents/holder, var/created_volume)
chemical_mob_spawn(holder, 1, "Life")
-proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reaction_name, var/mob_faction = "chemicalsummon")
- if(holder && holder.my_atom)
- var/blocked = blocked_mobs //global variable for blocked mobs
-
- var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
- var/atom/A = holder.my_atom
- var/turf/T = get_turf(A)
- var/area/my_area = get_area(T)
- var/message = "A [reaction_name] reaction has occured in ([my_area.name])"
- var/mob/M = get(A, /mob)
- if(M)
- message += " - carried by: [key_name_admin(M)]"
- else
- message += " - last fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
-
- message_admins(message, 0, 1)
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/i = 1, i <= amount_to_spawn, i++)
- var/chosen = pick(critters)
- var/mob/living/simple_animal/hostile/C = new chosen
- C.faction |= mob_faction
- C.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(C, pick(NORTH,SOUTH,EAST,WEST))
-
/datum/reagent/mannitol/on_mob_life(mob/living/M as mob)
M.adjustBrainLoss(-3)
..()
diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm
index 8d10a449a18..97516f916c9 100644
--- a/code/modules/reagents/newchem/newchem_procs.dm
+++ b/code/modules/reagents/newchem/newchem_procs.dm
@@ -166,4 +166,47 @@
/datum/reagent/proc/reagent_deleted()
return
+var/list/chemical_mob_spawn_meancritters = list() // list of possible hostile mobs
+var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs
+/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon")
+ if(holder && holder.my_atom)
+ if(chemical_mob_spawn_meancritters.len <= 0 || chemical_mob_spawn_nicecritters.len <= 0)
+ for(var/T in typesof(/mob/living/simple_animal))
+ var/mob/living/simple_animal/SA = T
+ switch(initial(SA.gold_core_spawnable))
+ if(CHEM_MOB_SPAWN_HOSTILE)
+ chemical_mob_spawn_meancritters += T
+ if(CHEM_MOB_SPAWN_FRIENDLY)
+ chemical_mob_spawn_nicecritters += T
+ var/atom/A = holder.my_atom
+ var/turf/T = get_turf(A)
+ var/area/my_area = get_area(T)
+ var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)"
+ message += " (VV)"
+
+ var/mob/M = get(A, /mob)
+ if(M)
+ message += " - Carried By: [key_name_admin(M)](?) (FLW)"
+ else
+ message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
+
+ message_admins(message, 0, 1)
+
+ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
+ C.flash_eyes()
+ for(var/i = 1, i <= amount_to_spawn, i++)
+ var/chosen
+ if(reaction_name == "Friendly Gold Slime")
+ chosen = pick(chemical_mob_spawn_nicecritters)
+ else
+ chosen = pick(chemical_mob_spawn_meancritters)
+ var/mob/living/simple_animal/C = new chosen
+ C.faction |= mob_faction
+ C.forceMove(get_turf(holder.my_atom))
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(C, pick(NORTH,SOUTH,EAST,WEST))
+
#undef ADDICTION_TIME
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
index 09776677502..cbcb53a5689 100644
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
@@ -77,31 +77,16 @@
name = "Slime Crit"
id = "m_tele"
result = null
- required_reagents = list("plasma" = 5)
+ required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/gold
required_other = 1
on_reaction(var/datum/reagents/holder)
-
- var/blocked = blocked_mobs //global variable of blocked mobs
-
- var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
- C.flash_eyes()
-
- for(var/i = 1, i <= 5, i++)
- var/chosen = pick(critters)
- var/mob/living/simple_animal/hostile/C = new chosen
- C.faction |= "slimesummon"
- C.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(C, pick(NORTH,SOUTH,EAST,WEST))
-// for(var/mob/O in viewers(get_turf(holder.my_atom), null))
-// O.show_message(text("\red The slime core fizzles disappointingly,"), 1)
+ feedback_add_details("slime_cores_used","[type]")
+ var/turf/T = get_turf(holder.my_atom)
+ T.visible_message("The slime extract begins to vibrate violently !")
+ spawn(50)
+ chemical_mob_spawn(holder, 5, "Gold Slime")
slimecritlesser
@@ -113,26 +98,28 @@
required_container = /obj/item/slime_extract/gold
required_other = 1
on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The slime extract begins to vibrate violently!"), 1)
+ feedback_add_details("slime_cores_used","[type]")
+ var/turf/T = get_turf(holder.my_atom)
+ T.visible_message("The slime extract begins to vibrate violently !")
spawn(50)
+ chemical_mob_spawn(holder, 3, "Lesser Gold Slime", "neutral")
- if(holder && holder.my_atom)
- var/blocked = blocked_mobs
+ slimecritfriendly
+ name = "Slime Crit Friendly"
+ id = "m_tele5"
+ result = null
+ required_reagents = list("water" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/gold
+ required_other = 1
+ on_reaction(datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[type]")
+ var/turf/T = get_turf(holder.my_atom)
+ T.visible_message("The slime extract begins to vibrate adorably !")
+ spawn(50)
+ chemical_mob_spawn(holder, 1, "Friendly Gold Slime", "neutral")
- var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
- C.flash_eyes()
-
- var/chosen = pick(critters)
- var/mob/living/simple_animal/hostile/C = new chosen
- C.faction |= "neutral"
- C.loc = get_turf(holder.my_atom)
//Silver
slimebork
diff --git a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm
index 6fc2c277519..654b1a9ccde 100644
--- a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm
+++ b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm
@@ -17,6 +17,7 @@
speak = list("Hruuugh!","Hrunnph")
emote_see = list("paws the ground","shakes its mane","stomps")
emote_hear = list("snuffles")
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/diyaab
name = "diyaab"
@@ -37,6 +38,7 @@
speak = list("Awrr?","Aowrl!","Worrl")
emote_see = list("sniffs the air cautiously","looks around")
emote_hear = list("snuffles")
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/shantak
name = "shantak"
@@ -56,6 +58,7 @@
speak_chance = 5
speak = list("Shuhn","Shrunnph?","Shunpf")
emote_see = list("scratches the ground","shakes out it's mane","tinkles gently")
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/yithian
name = "yithian"
@@ -63,6 +66,7 @@
icon_state = "yithian"
icon_living = "yithian"
icon_dead = "yithian_dead"
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/tindalos
name = "tindalos"
@@ -70,3 +74,4 @@
icon_state = "tindalos"
icon_living = "tindalos"
icon_dead = "tindalos_dead"
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 0599d141c08..cf6927a6e0d 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -200,6 +200,7 @@
var/list/not_interested = list()
var/being_used = 0
w_class = 1
+ var/sentience_type = SENTIENCE_ORGANIC
/obj/item/weapon/sentience_potion/afterattack(mob/living/M, mob/user)
@@ -210,27 +211,30 @@
return ..()
if(M.stat)
to_chat(user, "[M] is dead!")
- return..()
+ return ..()
+ var/mob/living/simple_animal/SM = M
+ if(SM.sentience_type != sentience_type)
+ to_chat(user, "The potion won't work on [SM].")
+ return ..()
- to_chat(user, "You offer the sentience potion to [M]...")
+ to_chat(user, "You offer the sentience potion to [SM]...")
being_used = 1
- var/list/candidates = pollCandidates("Do you want to play as [M.name]?", ROLE_SENTIENT, 0, 100)
+ var/list/candidates = pollCandidates("Do you want to play as [SM.name]?", ROLE_SENTIENT, 0, 100)
if(!src)
return
if(candidates.len)
var/mob/C = pick(candidates)
- M.key = C.key
- M.universal_speak = 1
- M.faction |= "sentient"
- to_chat(M, "All at once it makes sense: you know what you are and who you are! Self awareness is yours!")
- to_chat(M, "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost.")
+ SM.key = C.key
+ SM.universal_speak = 1
+ SM.faction = user.faction
+ SM.master_commander = user
+ SM.sentience_act()
+ to_chat(SM, "All at once it makes sense: you know what you are and who you are! Self awareness is yours!")
+ to_chat(SM, "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost.")
to_chat(user, "[M] accepts the potion and suddenly becomes attentive and aware. It worked!")
- if(isanimal(M))
- var/mob/living/simple_animal/S = M
- S.master_commander = user
qdel(src)
else
to_chat(user, "[M] looks interested for a moment, but then looks back down. Maybe you should try again later.")
diff --git a/html/changelogs/AutoChangeLog-pr-4095.yml b/html/changelogs/AutoChangeLog-pr-4095.yml
new file mode 100644
index 00000000000..35d1abdf256
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4095.yml
@@ -0,0 +1,7 @@
+author: Fox McCloud
+delete-after: True
+changes:
+ - rscadd: "Can spawn friendly animals with a new gold core reaction by injection with water"
+ - tweak: "Hostile animal spawn increased from 3 to 5 for hostile gold cores"
+ - tweak: "Swarmers, revenants, and morphs no longer gold core spawnable"
+ - bugfix: "Fixes invisible animal spawns from gold core/life reactions"
diff --git a/html/changelogs/AutoChangeLog-pr-4096.yml b/html/changelogs/AutoChangeLog-pr-4096.yml
new file mode 100644
index 00000000000..9b8e42710d2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4096.yml
@@ -0,0 +1,4 @@
+author: Fox McCloud
+delete-after: True
+changes:
+ - rscadd: "Adds tape to the ArtVend"
diff --git a/html/changelogs/AutoChangeLog-pr-4097.yml b/html/changelogs/AutoChangeLog-pr-4097.yml
new file mode 100644
index 00000000000..2fd1635f900
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4097.yml
@@ -0,0 +1,5 @@
+author: Tastyfish
+delete-after: True
+changes:
+ - tweak: "Beepsky is no longer a pokemon."
+ - tweak: "pAI-controlled Bots now reliably speak human-understandable languages over the radio."
diff --git a/html/changelogs/AutoChangeLog-pr-4100.yml b/html/changelogs/AutoChangeLog-pr-4100.yml
new file mode 100644
index 00000000000..783667ec9bb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4100.yml
@@ -0,0 +1,4 @@
+author: Fox McCloud
+delete-after: True
+changes:
+ - tweak: "Can no longer use sentience potions on bots"
diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi
index 928163c75ec..c212261f9ec 100644
Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ