mirror of
https://github.com/fulpstation/fulpstation.git
synced 2025-12-10 18:11:47 +00:00
🆑 Joan rscadd: Once the blob alert message is sent in the blob game mode, all mobs get to see how many tiles the blob has until it wins, via the Status tab. rscdel: Removed/merged a bunch of blob chems, you probably don't care about the specifics. tweak: The remaining blob chems should, overall, be more powerful. tweak: Shield blobs soak brute damage less well. tweak: Flashbangs do higher damage to blobs up close, but their damage falls off faster. experiment: Shield blobs now cost 15 resources to make instead of 10. Node blobs now cost 50 resources to make instead of 60. experiment: Expanding/attacking now costs 4 resources instead of 5, and blobs can now ATTACK DIAGONALLY. Diagonal attacks are weaker than normal attacks, especially against cyborgs(which may be entirely immune, depending), and they remain unable to expand diagonally. rscadd: Shield blobs no longer block atmos while under half health. Shield blobs are still immune to fire, even if they can't block atmos. tweak: Blobs should block explosions less well. rscadd: Blob cores and nodes are no longer immune to fire and no longer block atmos. rscadd: Blobs can only auto-expand one tile at a time per expanding thing, and should be easier to beat back in general. tweak: Blobbernauts now attack faster. tweak: Blob Overminds attack mobs slower but can attack non-mobs much faster. rscadd: Blob Overminds start with some amount of resources; in the gamemode, it's 80 divided by the number of overminds, in the event, it's 20 plus the number of active players, and otherwise, it's 60. bugfix: You can no longer move blob cores into space, onto the mining shuttle, white ship, gulag shuttle, or solars. bugfix: Blob rounds might be less laggy, if they were laggy? tweak: Blobs don't heal as fast, excluding the core. experiment: Blobs are marginally less destructive to their environment. /🆑 Objective: maybe possibly make blob something you can fight instead of wishing the blob didn't exist? but also make the blob lethal enough that it can still deal with the crew if it knows what it's doing(and still lose if the crew is good instead of snowballing forever)
187 lines
6.0 KiB
Plaintext
187 lines
6.0 KiB
Plaintext
/mob/camera/blob
|
|
name = "Blob Overmind"
|
|
real_name = "Blob Overmind"
|
|
desc = "The overmind. It controls the blob."
|
|
icon = 'icons/mob/blob.dmi'
|
|
icon_state = "marker"
|
|
mouse_opacity = 1
|
|
move_on_shuttle = 1
|
|
see_in_dark = 8
|
|
see_invisible = SEE_INVISIBLE_MINIMUM
|
|
invisibility = INVISIBILITY_OBSERVER
|
|
layer = FLY_LAYER
|
|
|
|
pass_flags = PASSBLOB
|
|
faction = list("blob")
|
|
|
|
var/obj/effect/blob/core/blob_core = null // The blob overmind's core
|
|
var/blob_points = 0
|
|
var/max_blob_points = 100
|
|
var/last_attack = 0
|
|
var/datum/reagent/blob/blob_reagent_datum = new/datum/reagent/blob()
|
|
var/list/blob_mobs = list()
|
|
var/list/resource_blobs = list()
|
|
var/ghostimage = null
|
|
var/free_chem_rerolls = 1 //one free chemical reroll
|
|
var/nodes_required = 1 //if the blob needs nodes to place resource and factory blobs
|
|
var/placed = 0
|
|
var/base_point_rate = 2 //for blob core placement
|
|
var/manualplace_min_time = 600 //in deciseconds //a minute, to get bearings
|
|
var/autoplace_max_time = 3600 //six minutes, as long as should be needed
|
|
|
|
/mob/camera/blob/New(loc, pre_placed = 0, mode_made = 0, starting_points = 60)
|
|
blob_points = starting_points
|
|
if(pre_placed) //we already have a core!
|
|
manualplace_min_time = 0
|
|
autoplace_max_time = 0
|
|
placed = 1
|
|
else
|
|
if(mode_made)
|
|
manualplace_min_time = world.time + BLOB_NO_PLACE_TIME
|
|
else
|
|
manualplace_min_time += world.time
|
|
autoplace_max_time += world.time
|
|
overminds += src
|
|
var/new_name = "[initial(name)] ([rand(1, 999)])"
|
|
name = new_name
|
|
real_name = new_name
|
|
last_attack = world.time
|
|
var/datum/reagent/blob/BC = pick((subtypesof(/datum/reagent/blob)))
|
|
blob_reagent_datum = new BC
|
|
color = blob_reagent_datum.complementary_color
|
|
if(blob_core)
|
|
blob_core.update_icon()
|
|
|
|
ghostimage = image(src.icon,src,src.icon_state)
|
|
ghost_darkness_images |= ghostimage //so ghosts can see the blob cursor when they disable darkness
|
|
updateallghostimages()
|
|
..()
|
|
|
|
/mob/camera/blob/Life()
|
|
if(!blob_core)
|
|
if(!placed)
|
|
if(manualplace_min_time && world.time >= manualplace_min_time)
|
|
src << "<b><span class='big'><font color=\"#EE4000\">You may now place your blob core.</font></span></b>"
|
|
src << "<span class='big'><font color=\"#EE4000\">You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.</font></span>"
|
|
manualplace_min_time = 0
|
|
if(autoplace_max_time && world.time >= autoplace_max_time)
|
|
place_blob_core(base_point_rate, 1)
|
|
else
|
|
qdel(src)
|
|
..()
|
|
|
|
/mob/camera/blob/Destroy()
|
|
for(var/BL in blobs)
|
|
var/obj/effect/blob/B = BL
|
|
if(B && B.overmind == src)
|
|
B.overmind = null
|
|
B.update_icon() //reset anything that was ours
|
|
for(var/BLO in blob_mobs)
|
|
var/mob/living/simple_animal/hostile/blob/BM = BLO
|
|
if(BM)
|
|
BM.overmind = null
|
|
BM.update_icons()
|
|
overminds -= src
|
|
if(ghostimage)
|
|
ghost_darkness_images -= ghostimage
|
|
qdel(ghostimage)
|
|
ghostimage = null
|
|
updateallghostimages()
|
|
return ..()
|
|
|
|
/mob/camera/blob/Login()
|
|
..()
|
|
sync_mind()
|
|
src << "<span class='notice'>You are the overmind!</span>"
|
|
blob_help()
|
|
update_health_hud()
|
|
add_points(0)
|
|
|
|
/mob/camera/blob/examine(mob/user)
|
|
..()
|
|
if(blob_reagent_datum)
|
|
user << "Its chemical is <font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</font>."
|
|
|
|
/mob/camera/blob/update_health_hud()
|
|
if(blob_core)
|
|
hud_used.healths.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#e36600'>[round(blob_core.health)]</font></div>"
|
|
for(var/mob/living/simple_animal/hostile/blob/blobbernaut/B in blob_mobs)
|
|
if(B.hud_used && B.hud_used.blobpwrdisplay)
|
|
B.hud_used.blobpwrdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#82ed00'>[round(blob_core.health)]</font></div>"
|
|
|
|
/mob/camera/blob/proc/add_points(points)
|
|
blob_points = Clamp(blob_points + points, 0, max_blob_points)
|
|
hud_used.blobpwrdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#82ed00'>[round(blob_points)]</font></div>"
|
|
|
|
/mob/camera/blob/say(message)
|
|
if (!message)
|
|
return
|
|
|
|
if (src.client)
|
|
if(client.prefs.muted & MUTE_IC)
|
|
src << "You cannot send IC messages (muted)."
|
|
return
|
|
if (src.client.handle_spam_prevention(message,MUTE_IC))
|
|
return
|
|
|
|
if (stat)
|
|
return
|
|
|
|
blob_talk(message)
|
|
|
|
/mob/camera/blob/proc/blob_talk(message)
|
|
log_say("[key_name(src)] : [message]")
|
|
|
|
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
|
|
|
if (!message)
|
|
return
|
|
|
|
var/message_a = say_quote(message, get_spans())
|
|
var/rendered = "<span class='big'><font color=\"#EE4000\"><b>\[Blob Telepathy\] [name](<font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</font>)</b> [message_a]</font></span>"
|
|
|
|
for(var/mob/M in mob_list)
|
|
if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob))
|
|
M << rendered
|
|
if(isobserver(M))
|
|
var/link = FOLLOW_LINK(M, src)
|
|
M << "[link] [rendered]"
|
|
|
|
/mob/camera/blob/emote(act,m_type=1,message = null)
|
|
return
|
|
|
|
/mob/camera/blob/blob_act(obj/effect/blob/B)
|
|
return
|
|
|
|
/mob/camera/blob/Stat()
|
|
..()
|
|
if(statpanel("Status"))
|
|
if(blob_core)
|
|
stat(null, "Core Health: [blob_core.health]")
|
|
stat(null, "Power Stored: [blob_points]/[max_blob_points]")
|
|
if(ticker && istype(ticker.mode, /datum/game_mode/blob))
|
|
var/datum/game_mode/blob/B = ticker.mode
|
|
stat(null, "Blobs to Win: [blobs_legit.len]/[B.blobwincount]")
|
|
else
|
|
stat(null, "Total Blobs: [blobs.len]")
|
|
if(free_chem_rerolls)
|
|
stat(null, "You have [free_chem_rerolls] Free Chemical Reroll\s Remaining")
|
|
if(!placed)
|
|
if(manualplace_min_time)
|
|
stat(null, "Time Before Manual Placement: [max(round((manualplace_min_time - world.time)*0.1, 0.1), 0)]")
|
|
stat(null, "Time Before Automatic Placement: [max(round((autoplace_max_time - world.time)*0.1, 0.1), 0)]")
|
|
|
|
/mob/camera/blob/Move(NewLoc, Dir = 0)
|
|
if(placed)
|
|
var/obj/effect/blob/B = locate() in range("3x3", NewLoc)
|
|
if(B)
|
|
loc = NewLoc
|
|
else
|
|
return 0
|
|
else
|
|
var/area/A = get_area(NewLoc)
|
|
if(istype(NewLoc, /turf/open/space) || istype(A, /area/shuttle)) //if unplaced, can't go on shuttles or space tiles
|
|
return 0
|
|
loc = NewLoc
|
|
return 1
|