mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 08:34:16 +01:00
Merge pull request #11169 from Arkatos1/Blob_QoL_Update
Blob QoL Update and Rebalance
This commit is contained in:
@@ -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.<br>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.<br>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
|
||||
@@ -32,4 +32,4 @@
|
||||
/mob/camera/blob/AltClickOn(atom/A) //Remove a blob
|
||||
var/turf/T = get_turf(A)
|
||||
if(T)
|
||||
revert(T)
|
||||
remove_blob(T)
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
/////////////////
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, "<span class='warning'>You now require a nearby node or core to place factory and resource blobs.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You no longer require a nearby node or core to place factory and resource blobs.</span>")
|
||||
|
||||
/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, "<span class='warning'>You need to place this blob closer to a node or core!</span>")
|
||||
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, "<span class='warning'>You need to place this blob closer to a node or core!</span>")
|
||||
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, "<span class='warning'>There is no blob there!</span>")
|
||||
return
|
||||
|
||||
if(istype(B, /obj/structure/blob/core))
|
||||
to_chat(src, "Unable to remove this blob.")
|
||||
if(B.point_return < 0)
|
||||
to_chat(src, "<span class='warning'>Unable to remove this blob.</span>")
|
||||
return
|
||||
|
||||
if(max_blob_points < B.point_return + blob_points)
|
||||
to_chat(src, "<span class='warning'>You have too many resources to remove this blob!</span>")
|
||||
return
|
||||
if(B.point_return)
|
||||
add_points(B.point_return)
|
||||
to_chat(src, "<span class='notice'>Gained [B.point_return] resources from removing \the [B].</span>")
|
||||
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, "<span class='warning'>You have already produced an offspring.</span>")
|
||||
return
|
||||
if(is_offspring)
|
||||
to_chat(src, "<span class='warning'>You cannot split as an offspring of another Blob.</span>")
|
||||
return
|
||||
if(!blob_nodes || !blob_nodes.len)
|
||||
to_chat(src, "<span class='warning'>A node is required to birth your offspring...</span>")
|
||||
return
|
||||
@@ -340,11 +373,12 @@
|
||||
if(!N)
|
||||
to_chat(src, "<span class='warning'>A node is required to birth your offspring...</span>")
|
||||
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: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> - [blob_reagent_datum.description]")
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -477,6 +477,9 @@
|
||||
else
|
||||
dat += "<tr><td><i>Blob not found!</i></td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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."
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 472 KiB After Width: | Height: | Size: 475 KiB |
Reference in New Issue
Block a user