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 += "Blob not found!" dat += "" + + if(ticker.mode.blob_overminds.len) + dat += check_role_table("Blob Overminds", ticker.mode.blob_overminds) if(ticker.mode.changelings.len) dat += check_role_table("Changelings", ticker.mode.changelings) diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 7ea71547123..6f23bbc5fcd 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -9,7 +9,7 @@ var/turf/T = pick(blobstart) if(!T) return kill() - var/list/candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1) + var/list/candidates = pollCandidates("Do you want to play as a blob infested mouse?", ROLE_BLOB, 1) if(!candidates.len) return kill() var/list/vents = list() diff --git a/code/modules/reagents/chemistry/reagents/blob.dm b/code/modules/reagents/chemistry/reagents/blob.dm index d06ab6443ad..1dcd414b702 100644 --- a/code/modules/reagents/chemistry/reagents/blob.dm +++ b/code/modules/reagents/chemistry/reagents/blob.dm @@ -104,21 +104,6 @@ M.adjustStaminaLoss(0.4*volume) M.reagents.add_reagent("frostoil", 0.4*volume) -/datum/reagent/blob/dark_matter - name = "Dark Matter" - description = "Deals High Brute damage and sucks everyone and everything closer, creating a vortex of death." - id = "dark_matter" - color = "#61407E" - complementary_color = "#8f7ca0" - message = "You feel a thrum as the blob strikes you, and everything flies at you" - -/datum/reagent/blob/dark_matter/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == TOUCH) - reagent_vortex(M, 0, volume) - volume = ..() - M.apply_damage(0.6*volume, BRUTE) - - /datum/reagent/blob/b_sorium name = "Sorium" description = "Deals High Brute damage, and sends people flying away." diff --git a/icons/mob/blob.dmi b/icons/mob/blob.dmi index ef70ac3155e..4797c79496e 100644 Binary files a/icons/mob/blob.dmi and b/icons/mob/blob.dmi differ