diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm
index 09d076c0726..feb57d83c05 100644
--- a/code/_onclick/hud/blob_overmind.dm
+++ b/code/_onclick/hud/blob_overmind.dm
@@ -57,6 +57,16 @@
var/mob/camera/blob/B = usr
B.create_blobbernaut()
+/obj/screen/blob/StorageBlob
+ icon_state = "ui_storage"
+ name = "Produce Storage Blob (40)"
+ desc = "Produces a storage blob for 40 resources.
Storage blobs will raise your max resource cap by 50."
+
+/obj/screen/blob/StorageBlob/Click()
+ if(isovermind(usr))
+ var/mob/camera/blob/B = usr
+ B.create_storage()
+
/obj/screen/blob/ResourceBlob
icon_state = "ui_resource"
name = "Produce Resource Blob (40)"
@@ -113,6 +123,16 @@
var/mob/camera/blob/B = usr
B.relocate_core()
+/obj/screen/blob/Split
+ icon_state = "ui_split"
+ name = "Split consciousness (100)"
+ desc = "Creates another Blob Overmind at the nearest node. One use only.
Offsprings are be unable to use this ability."
+
+/obj/screen/blob/Split/Click()
+ if(isovermind(usr))
+ var/mob/camera/blob/B = usr
+ B.split_consciousness()
+
/datum/hud/blob_overmind/New(mob/user)
..()
var/obj/screen/using
@@ -143,6 +163,10 @@
static_inventory += using
using = new /obj/screen/blob/Blobbernaut()
+ using.screen_loc = ui_id
+ static_inventory += using
+
+ using = new /obj/screen/blob/StorageBlob()
using.screen_loc = ui_belt
static_inventory += using
@@ -165,4 +189,8 @@
using = new /obj/screen/blob/RelocateCore()
using.screen_loc = ui_storage2
+ static_inventory += using
+
+ using = new /obj/screen/blob/Split()
+ using.screen_loc = ui_acti
static_inventory += using
\ No newline at end of file
diff --git a/code/_onclick/overmind.dm b/code/_onclick/overmind.dm
index 612a5df2482..8ace273dd8f 100644
--- a/code/_onclick/overmind.dm
+++ b/code/_onclick/overmind.dm
@@ -32,4 +32,4 @@
/mob/camera/blob/AltClickOn(atom/A) //Remove a blob
var/turf/T = get_turf(A)
if(T)
- revert(T)
\ No newline at end of file
+ remove_blob(T)
\ No newline at end of file
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 0658c81d90f..b51cfbd4a68 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -1442,6 +1442,11 @@
ticker.mode.greet_changeling(src)
ticker.mode.update_change_icons_added(src)
+/datum/mind/proc/make_Overmind()
+ if(!(src in ticker.mode.blob_overminds))
+ ticker.mode.blob_overminds += src
+ special_role = SPECIAL_ROLE_BLOB_OVERMIND
+
/datum/mind/proc/make_Wizard()
if(!(src in ticker.mode.wizards))
ticker.mode.wizards += src
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 41068876a54..30934a07214 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -3,6 +3,8 @@ var/list/blobs = list()
var/list/blob_cores = list()
var/list/blob_nodes = list()
+/datum/game_mode
+ var/list/blob_overminds = list()
/datum/game_mode/blob
name = "blob"
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index b1ea3c199c4..9cd3ac5343f 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -135,9 +135,9 @@
..()
if(overmind && overmind.blob_reagent_datum)
- adjustcolors(overmind.blob_reagent_datum.color)
+ adjustcolors(overmind.blob_reagent_datum.complementary_color)
else
- adjustcolors(color) //to ensure zombie/other overlays update
+ adjustcolors(overmind.blob_reagent_datum.complementary_color) //to ensure zombie/other overlays update
/mob/living/simple_animal/hostile/blob/blobspore/adjustcolors(var/a_color)
@@ -147,8 +147,8 @@
overlays.Cut()
overlays = human_overlays
var/image/I = image('icons/mob/blob.dmi', icon_state = "blob_head")
- I.color = color
- color = initial(color)//looks better.
+ I.color = overmind.blob_reagent_datum.complementary_color
+ color = initial(overmind.blob_reagent_datum.complementary_color)//looks better.
overlays += I
/////////////////
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index 4bdc2cafddd..b0dc48aba93 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -4,6 +4,7 @@
icon_state = "blank_blob"
health = 200
fire_resist = 2
+ point_return = -1
var/mob/camera/blob/overmind = null // the blob core's overmind
var/overmind_get_delay = 0 // we don't want to constantly try to find an overmind, do it every 5 minutes
var/resource_delay = 0
@@ -117,10 +118,11 @@
src.overmind = B
color = overmind.blob_reagent_datum.color
if(B.mind && !B.mind.special_role)
- B.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND
+ B.mind.make_Overmind()
spawn(0)
if(is_offspring)
- B.verbs -= /mob/camera/blob/verb/split_consciousness
+ B.is_offspring = TRUE
+
/obj/structure/blob/core/proc/lateblobtimer()
addtimer(CALLBACK(src, .proc/lateblobcheck), 50)
@@ -129,7 +131,7 @@
if(overmind)
overmind.add_points(60)
if(overmind.mind)
- overmind.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND
+ overmind.mind.make_Overmind()
else
log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks a overmind.mind.")
else
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
index 81d3ab47493..fde2c9bf8a3 100644
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ b/code/game/gamemodes/blob/blobs/factory.dm
@@ -4,6 +4,7 @@
icon_state = "blob_factory"
health = 100
fire_resist = 2
+ point_return = 18
var/list/spores = list()
var/max_spores = 3
var/spore_delay = 0
@@ -27,7 +28,7 @@
return 0
spore_delay = world.time + 100 // 10 seconds
var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore(src.loc, src)
- BS.color = color
+ BS.color = overmind.blob_reagent_datum.complementary_color
BS.overmind = overmind
overmind.blob_mobs.Add(BS)
return 0
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
index 32b6ce1f408..e1a08555a10 100644
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ b/code/game/gamemodes/blob/blobs/node.dm
@@ -4,6 +4,7 @@
icon_state = "blank_blob"
health = 100
fire_resist = 2
+ point_return = 18
var/mob/camera/blob/overmind
/obj/structure/blob/node/New(loc, var/h = 100)
diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm
index f5d838fd0a2..7198d3ef081 100644
--- a/code/game/gamemodes/blob/blobs/resource.dm
+++ b/code/game/gamemodes/blob/blobs/resource.dm
@@ -4,6 +4,7 @@
icon_state = "blob_resource"
health = 30
fire_resist = 2
+ point_return = 12
var/mob/camera/blob/overmind = null
var/resource_delay = 0
diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm
index 696a33d94b9..8d13625acb9 100644
--- a/code/game/gamemodes/blob/blobs/shield.dm
+++ b/code/game/gamemodes/blob/blobs/shield.dm
@@ -5,6 +5,7 @@
desc = "Some blob creature thingy"
health = 75
fire_resist = 2
+ point_return = 4
var/maxHealth = 75
/obj/structure/blob/shield/update_icon()
@@ -27,6 +28,7 @@
brute_resist = 0
health = 50
maxHealth = 50
+ point_return = 9
flags_2 = CHECK_RICOCHET_1
var/reflect_chance = 80 //80% chance to reflect
diff --git a/code/game/gamemodes/blob/blobs/storage.dm b/code/game/gamemodes/blob/blobs/storage.dm
index 8c9da104edf..00f6d7b4e0c 100644
--- a/code/game/gamemodes/blob/blobs/storage.dm
+++ b/code/game/gamemodes/blob/blobs/storage.dm
@@ -4,6 +4,7 @@
icon_state = "blob_resource"
health = 30
fire_resist = 2
+ point_return = 12
var/mob/camera/blob/overmind = null
/obj/structure/blob/storage/update_icon()
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 382fc8dd953..ca1dffbfa74 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -15,6 +15,9 @@
var/blob_points = 0
var/max_blob_points = 100
var/last_attack = 0
+ var/nodes_required = TRUE //if the blob needs nodes to place resource and factory blobs
+ var/split_used = FALSE
+ var/is_offspring = FALSE
var/datum/reagent/blob/blob_reagent_datum = new/datum/reagent/blob()
var/list/blob_mobs = list()
var/ghostimage = null
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index a3c219fefdc..748823829b5 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -31,6 +31,16 @@
if(chosen_node)
src.loc = chosen_node.loc
+/mob/camera/blob/verb/toggle_node_req()
+ set category = "Blob"
+ set name = "Toggle Node Requirement"
+ set desc = "Toggle requiring nodes to place resource and factory blobs."
+ nodes_required = !nodes_required
+ if(nodes_required)
+ to_chat(src, "You now require a nearby node or core to place factory and resource blobs.")
+ else
+ to_chat(src, "You no longer require a nearby node or core to place factory and resource blobs.")
+
/mob/camera/blob/verb/create_shield_power()
set category = "Blob"
set name = "Create/Upgrade Shield Blob (15)"
@@ -103,6 +113,11 @@
to_chat(src, "There is a resource blob nearby, move more than 4 tiles away from it!")
return
+ if(nodes_required)
+ if(!(locate(/obj/structure/blob/node) in orange(3, T)) && !(locate(/obj/structure/blob/core) in orange(4, T)))
+ to_chat(src, "You need to place this blob closer to a node or core!")
+ return //handholdotron 2000
+
if(!can_buy(40))
return
@@ -174,6 +189,11 @@
to_chat(src, "There is a factory blob nearby, move more than 7 tiles away from it!")
return
+ if(nodes_required)
+ if(!(locate(/obj/structure/blob/node) in orange(3, T)) && !(locate(/obj/structure/blob/core) in orange(4, T)))
+ to_chat(src, "You need to place this blob closer to a node or core!")
+ return //handholdotron 2000
+
if(!can_buy(60))
return
@@ -210,7 +230,7 @@
var/mob/living/simple_animal/hostile/blob/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blob/blobbernaut (get_turf(B))
if(blobber)
qdel(B)
- blobber.color = blob_reagent_datum.color
+ blobber.color = blob_reagent_datum.complementary_color
blobber.overmind = src
blob_mobs.Add(blobber)
return
@@ -245,21 +265,28 @@
/mob/camera/blob/verb/revert()
set category = "Blob"
set name = "Remove Blob"
- set desc = "Removes a blob."
+ set desc = "Removes a blob. You will receive 30% cost refund for special Blob structures."
var/turf/T = get_turf(src)
- if(!T)
- return
+ remove_blob(T)
+
+/mob/camera/blob/proc/remove_blob(var/turf/T)
var/obj/structure/blob/B = locate(/obj/structure/blob) in T
+ if(!T)
+ return
if(!B)
- to_chat(src, "You must be on a blob!")
+ to_chat(src, "There is no blob there!")
return
-
- if(istype(B, /obj/structure/blob/core))
- to_chat(src, "Unable to remove this blob.")
+ if(B.point_return < 0)
+ to_chat(src, "Unable to remove this blob.")
return
-
+ if(max_blob_points < B.point_return + blob_points)
+ to_chat(src, "You have too many resources to remove this blob!")
+ return
+ if(B.point_return)
+ add_points(B.point_return)
+ to_chat(src, "Gained [B.point_return] resources from removing \the [B].")
qdel(B)
return
@@ -331,8 +358,14 @@
/mob/camera/blob/verb/split_consciousness()
set category = "Blob"
set name = "Split consciousness (100) (One use)"
- set desc = "Expend resources to attempt to produce another sentient overmind"
+ set desc = "Expend resources to attempt to produce another sentient overmind."
+ if(split_used)
+ to_chat(src, "You have already produced an offspring.")
+ return
+ if(is_offspring)
+ to_chat(src, "You cannot split as an offspring of another Blob.")
+ return
if(!blob_nodes || !blob_nodes.len)
to_chat(src, "A node is required to birth your offspring...")
return
@@ -340,11 +373,12 @@
if(!N)
to_chat(src, "A node is required to birth your offspring...")
return
-
+
if(!can_buy(100))
return
- verbs -= /mob/camera/blob/verb/split_consciousness //we've used our split_consciousness
+ split_used = TRUE
+
new /obj/structure/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring")
qdel(N)
@@ -423,7 +457,7 @@
BL.adjustcolors(blob_reagent_datum.color)
for(var/mob/living/simple_animal/hostile/blob/BLO)
- BLO.adjustcolors(blob_reagent_datum.color)
+ BLO.adjustcolors(blob_reagent_datum.complementary_color)
to_chat(src, "Your reagent is now: [blob_reagent_datum.name] - [blob_reagent_datum.description]")
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 68f0c12f6ba..bf56d1687c5 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -7,6 +7,7 @@
density = 0
opacity = 0
anchored = 1
+ var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed.
var/health = 30
var/health_timestamp = 0
var/brute_resist = 4
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 0a943e6a170..92cd3eb2803 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -477,6 +477,9 @@
else
dat += "