From 40b4bfee21d8e7edce2513ae1aee34bce004536f Mon Sep 17 00:00:00 2001 From: DeityLink Date: Sun, 8 May 2016 11:48:39 +0200 Subject: [PATCH] Blob HUD (#9948) * blob hud sprites * blob HUD * OOP is srs bsns * changelog 9948 * haha holy shit someone stop me * ghnazndjazhnfoizhioHNFAONHIOKZFNDZA --- code/_onclick/hud/_defines.dm | 14 ++ code/_onclick/hud/adminbus.dm | 72 ++++---- code/_onclick/hud/blob.dm | 157 ++++++++++++++++++ code/_onclick/hud/hud.dm | 6 - code/_onclick/hud/other_mobs.dm | 19 --- code/_onclick/hud/screen_objects.dm | 58 ++++++- code/datums/ui_icons.dm | 87 ++++++---- code/game/gamemodes/blob/blobs/core.dm | 14 +- code/game/gamemodes/blob/blobs/factory.dm | 2 + code/game/gamemodes/blob/blobs/node.dm | 4 +- code/game/gamemodes/blob/blobs/resource.dm | 4 + code/game/gamemodes/blob/blobs/shield.dm | 3 +- code/game/gamemodes/blob/overmind.dm | 82 ++++++++- code/game/gamemodes/blob/powers.dm | 6 + code/game/gamemodes/blob/theblob.dm | 3 + .../objects/structures/vehicles/adminbus.dm | 2 +- code/global.dm | 8 + code/modules/admin/admin_verbs.dm | 30 +++- html/changelogs/DeityLink_9948.yml | 6 + icons/mob/screen1_blob.dmi | Bin 0 -> 21270 bytes icons/mob/screen1_blob_bars.dmi | Bin 0 -> 391 bytes icons/mob/screen1_blob_fullscreen.dmi | Bin 0 -> 15524 bytes vgstation13.dme | 1 + 23 files changed, 465 insertions(+), 113 deletions(-) create mode 100644 code/_onclick/hud/blob.dm create mode 100644 html/changelogs/DeityLink_9948.yml create mode 100644 icons/mob/screen1_blob.dmi create mode 100644 icons/mob/screen1_blob_bars.dmi create mode 100644 icons/mob/screen1_blob_fullscreen.dmi diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index ffe718cca79..88e7dd8b429 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -194,3 +194,17 @@ #define ui_adminbus_tdarena "2:4,13:26" #define ui_adminbus_tdgreen "3:6,13:26" #define ui_adminbus_tdobs "2:4,14:28" + +//Blob HUD +#define ui_blob_bg "1:0,1:0" +#define ui_blob_powerbar "1:0,5:0" +#define ui_blob_healthbar "15:14,5:0" +#define ui_blob_spawnblob "1:18,5:5" +#define ui_blob_spawnstrong "1:18,6:9" +#define ui_blob_spawnresource "1:18,7:13" +#define ui_blob_spawnfactory "1:18,8:17" +#define ui_blob_spawnnode "1:18,9:21" +#define ui_blob_spawncore "1:18,10:25" +#define ui_blob_ping "14:24,11:21" +#define ui_blob_rally "14:24,12:25" +#define ui_blob_taunt "14:24,13:29" diff --git a/code/_onclick/hud/adminbus.dm b/code/_onclick/hud/adminbus.dm index 074509bc398..665458ec483 100644 --- a/code/_onclick/hud/adminbus.dm +++ b/code/_onclick/hud/adminbus.dm @@ -1,210 +1,210 @@ /datum/hud/proc/adminbus_hud() - mymob.gui_icons.adminbus_bg = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_bg = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_bg.icon = 'icons/adminbus/fullscreen.dmi' mymob.gui_icons.adminbus_bg.icon_state = "HUD" mymob.gui_icons.adminbus_bg.name = "HUD" mymob.gui_icons.adminbus_bg.layer = 19 mymob.gui_icons.adminbus_bg.screen_loc = ui_adminbus_bg - mymob.gui_icons.adminbus_delete = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_delete = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_delete.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_delete.icon_state = "icon_delete" mymob.gui_icons.adminbus_delete.name = "Delete Bus" mymob.gui_icons.adminbus_delete.screen_loc = ui_adminbus_delete - mymob.gui_icons.adminbus_delmobs = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_delmobs = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_delmobs.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_delmobs.icon_state = "icon_delmobs" mymob.gui_icons.adminbus_delmobs.name = "Delete Mobs" mymob.gui_icons.adminbus_delmobs.screen_loc = ui_adminbus_delmobs - mymob.gui_icons.adminbus_spclowns = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_spclowns = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_spclowns.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_spclowns.icon_state = "icon_spclown" mymob.gui_icons.adminbus_spclowns.name = "Spawn Clowns" mymob.gui_icons.adminbus_spclowns.screen_loc = ui_adminbus_spclowns - mymob.gui_icons.adminbus_spcarps = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_spcarps = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_spcarps.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_spcarps.icon_state = "icon_spcarp" mymob.gui_icons.adminbus_spcarps.name = "Spawn Carps" mymob.gui_icons.adminbus_spcarps.screen_loc = ui_adminbus_spcarps - mymob.gui_icons.adminbus_spbears = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_spbears = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_spbears.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_spbears.icon_state = "icon_spbear" mymob.gui_icons.adminbus_spbears.name = "Spawn Bears" mymob.gui_icons.adminbus_spbears.screen_loc = ui_adminbus_spbears - mymob.gui_icons.adminbus_sptrees = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_sptrees = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_sptrees.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_sptrees.icon_state = "icon_sptree" mymob.gui_icons.adminbus_sptrees.name = "Spawn Trees" mymob.gui_icons.adminbus_sptrees.screen_loc = ui_adminbus_sptrees - mymob.gui_icons.adminbus_spspiders = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_spspiders = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_spspiders.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_spspiders.icon_state = "icon_spspider" mymob.gui_icons.adminbus_spspiders.name = "Spawn Spiders" mymob.gui_icons.adminbus_spspiders.screen_loc = ui_adminbus_spspiders - mymob.gui_icons.adminbus_spalien = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_spalien = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_spalien.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_spalien.icon_state = "icon_spalien" mymob.gui_icons.adminbus_spalien.name = "Spawn Large Alien Queen" mymob.gui_icons.adminbus_spalien.screen_loc = ui_adminbus_spalien - mymob.gui_icons.adminbus_loadsids = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_loadsids = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_loadsids.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_loadsids.icon_state = "icon_loadsids" mymob.gui_icons.adminbus_loadsids.name = "Spawn Loads of Captain Spare IDs" mymob.gui_icons.adminbus_loadsids.screen_loc = ui_adminbus_loadsids - mymob.gui_icons.adminbus_loadsmoney = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_loadsmoney = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_loadsmoney.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_loadsmoney.icon_state = "icon_loadsmone" mymob.gui_icons.adminbus_loadsmoney.name = "Spawn Loads of Money" mymob.gui_icons.adminbus_loadsmoney.screen_loc = ui_adminbus_loadsmone - mymob.gui_icons.adminbus_massrepair = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_massrepair = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_massrepair.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_massrepair.icon_state = "icon_massrepair" mymob.gui_icons.adminbus_massrepair.name = "Repair Surroundings" mymob.gui_icons.adminbus_massrepair.screen_loc = ui_adminbus_massrepair - mymob.gui_icons.adminbus_massrejuv = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_massrejuv = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_massrejuv.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_massrejuv.icon_state = "icon_massrejuv" mymob.gui_icons.adminbus_massrejuv.name = "Mass Rejuvination" mymob.gui_icons.adminbus_massrejuv.screen_loc = ui_adminbus_massrejuv - mymob.gui_icons.adminbus_hook = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_hook = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_hook.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_hook.icon_state = "icon_hook" mymob.gui_icons.adminbus_hook.name = "Singularity Hook" mymob.gui_icons.adminbus_hook.screen_loc = ui_adminbus_hook - mymob.gui_icons.adminbus_juke = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_juke = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_juke.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_juke.icon_state = "icon_jukebox" mymob.gui_icons.adminbus_juke.name = "Adminbus-mounted Jukebox" mymob.gui_icons.adminbus_juke.screen_loc = ui_adminbus_juke - mymob.gui_icons.adminbus_tele = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_tele = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_tele.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_tele.icon_state = "icon_teleport" mymob.gui_icons.adminbus_tele.name = "Teleportation" mymob.gui_icons.adminbus_tele.screen_loc = ui_adminbus_tele - mymob.gui_icons.adminbus_bumpers_1 = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_bumpers_1 = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_bumpers_1.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_bumpers_1.icon_state = "icon_bumpers_1-on" mymob.gui_icons.adminbus_bumpers_1.name = "Capture Mobs" mymob.gui_icons.adminbus_bumpers_1.screen_loc = ui_adminbus_bumpers_1 - mymob.gui_icons.adminbus_bumpers_2 = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_bumpers_2 = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_bumpers_2.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_bumpers_2.icon_state = "icon_bumpers_2-off" mymob.gui_icons.adminbus_bumpers_2.name = "Hit Mobs" mymob.gui_icons.adminbus_bumpers_2.screen_loc = ui_adminbus_bumpers_2 - mymob.gui_icons.adminbus_bumpers_3 = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_bumpers_3 = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_bumpers_3.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_bumpers_3.icon_state = "icon_bumpers_3-off" mymob.gui_icons.adminbus_bumpers_3.name = "Gib Mobs" mymob.gui_icons.adminbus_bumpers_3.screen_loc = ui_adminbus_bumpers_3 - mymob.gui_icons.adminbus_door_0 = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_door_0 = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_door_0.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_door_0.icon_state = "icon_door_0-on" mymob.gui_icons.adminbus_door_0.name = "Close Door" mymob.gui_icons.adminbus_door_0.screen_loc = ui_adminbus_door_0 - mymob.gui_icons.adminbus_door_1 = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_door_1 = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_door_1.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_door_1.icon_state = "icon_door_1-off" mymob.gui_icons.adminbus_door_1.name = "Open Door" mymob.gui_icons.adminbus_door_1.screen_loc = ui_adminbus_door_1 - mymob.gui_icons.adminbus_roadlights_0 = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_roadlights_0 = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_roadlights_0.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_roadlights_0.icon_state = "icon_lights_0-on" mymob.gui_icons.adminbus_roadlights_0.name = "Turn Off Headlights" mymob.gui_icons.adminbus_roadlights_0.screen_loc = ui_adminbus_roadlights_0 - mymob.gui_icons.adminbus_roadlights_1 = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_roadlights_1 = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_roadlights_1.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_roadlights_1.icon_state = "icon_lights_1-off" mymob.gui_icons.adminbus_roadlights_1.name = "Dipped Headlights" mymob.gui_icons.adminbus_roadlights_1.screen_loc = ui_adminbus_roadlights_1 - mymob.gui_icons.adminbus_roadlights_2 = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_roadlights_2 = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_roadlights_2.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_roadlights_2.icon_state = "icon_lights_2-off" mymob.gui_icons.adminbus_roadlights_2.name = "Main Headlights" mymob.gui_icons.adminbus_roadlights_2.screen_loc = ui_adminbus_roadlights_2 - mymob.gui_icons.adminbus_free = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_free = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_free.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_free.icon_state = "icon_free" mymob.gui_icons.adminbus_free.name = "Release Passengers" mymob.gui_icons.adminbus_free.screen_loc = ui_adminbus_free - mymob.gui_icons.adminbus_home = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_home = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_home.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_home.icon_state = "icon_home" mymob.gui_icons.adminbus_home.name = "Send Passengers Back Home" mymob.gui_icons.adminbus_home.screen_loc = ui_adminbus_home - mymob.gui_icons.adminbus_antag = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_antag = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_antag.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_antag.icon_state = "icon_antag" mymob.gui_icons.adminbus_antag.name = "Antag Madness!" mymob.gui_icons.adminbus_antag.screen_loc = ui_adminbus_antag - mymob.gui_icons.adminbus_dellasers = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_dellasers = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_dellasers.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_dellasers.icon_state = "icon_delgiven" mymob.gui_icons.adminbus_dellasers.name = "Delete the given Infinite Laser Guns" mymob.gui_icons.adminbus_dellasers.screen_loc = ui_adminbus_dellasers - mymob.gui_icons.adminbus_givelasers = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_givelasers = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_givelasers.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_givelasers.icon_state = "icon_givelasers" mymob.gui_icons.adminbus_givelasers.name = "Give Infinite Laser Guns to the Passengers" mymob.gui_icons.adminbus_givelasers.screen_loc = ui_adminbus_givelasers - mymob.gui_icons.adminbus_delbombs = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_delbombs = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_delbombs.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_delbombs.icon_state = "icon_delgiven" mymob.gui_icons.adminbus_delbombs.name = "Delete the given Fuse-Bombs" mymob.gui_icons.adminbus_delbombs.screen_loc = ui_adminbus_delbombs - mymob.gui_icons.adminbus_givebombs = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_givebombs = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_givebombs.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_givebombs.icon_state = "icon_givebombs" mymob.gui_icons.adminbus_givebombs.name = "Give Fuse-Bombs to the Passengers" mymob.gui_icons.adminbus_givebombs.screen_loc = ui_adminbus_givebombs - mymob.gui_icons.adminbus_tdred = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_tdred = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_tdred.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_tdred.icon_state = "icon_tdred" mymob.gui_icons.adminbus_tdred.name = "Send Passengers to the Thunderdome's Red Team" mymob.gui_icons.adminbus_tdred.screen_loc = ui_adminbus_tdred - mymob.gui_icons.adminbus_tdarena = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_tdarena = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_tdarena.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_tdarena.icon_state = "icon_tdarena" mymob.gui_icons.adminbus_tdarena.name = "Split the Passengers between the two Thunderdome Teams" mymob.gui_icons.adminbus_tdarena.screen_loc = ui_adminbus_tdarena - mymob.gui_icons.adminbus_tdgreen = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_tdgreen = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_tdgreen.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_tdgreen.icon_state = "icon_tdgreen" mymob.gui_icons.adminbus_tdgreen.name = "Send Passengers to the Thunderdome's Green Team" mymob.gui_icons.adminbus_tdgreen.screen_loc = ui_adminbus_tdgreen - mymob.gui_icons.adminbus_tdobs = getFromPool(/obj/screen) + mymob.gui_icons.adminbus_tdobs = getFromPool(/obj/screen/adminbus) mymob.gui_icons.adminbus_tdobs.icon = 'icons/adminbus/32x32.dmi' mymob.gui_icons.adminbus_tdobs.icon_state = "icon_tdobs" mymob.gui_icons.adminbus_tdobs.name = "Send Passengers to the Thunderdome's Observers' Lodge" @@ -249,7 +249,7 @@ ) for(var/i=1;i<=16;i++) - var/obj/screen/S = getFromPool(/obj/screen) + var/obj/screen/adminbus/S = getFromPool(/obj/screen/adminbus) S.icon = 'icons/adminbus/32x32.dmi' S.icon_state = "" S.screen_loc = "[12-round(i/2)]:[16*((i-1)%2)],14:16" diff --git a/code/_onclick/hud/blob.dm b/code/_onclick/hud/blob.dm new file mode 100644 index 00000000000..c6ef3e5b540 --- /dev/null +++ b/code/_onclick/hud/blob.dm @@ -0,0 +1,157 @@ + +/datum/hud/proc/blob_hud() + mymob.gui_icons.blob_bgs = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_bgs.icon = 'icons/mob/screen1_blob_fullscreen.dmi' + mymob.gui_icons.blob_bgs.icon_state = "backgrounds" + mymob.gui_icons.blob_bgs.name = "Blob HUD" + mymob.gui_icons.blob_bgs.layer = 19 + mymob.gui_icons.blob_bgs.screen_loc = ui_blob_bg + mymob.gui_icons.blob_bgs.mouse_opacity = 0 + + mymob.gui_icons.blob_coverLEFT = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_coverLEFT.icon = 'icons/mob/screen1_blob_fullscreen.dmi' + mymob.gui_icons.blob_coverLEFT.icon_state = "coverLEFT" + mymob.gui_icons.blob_coverLEFT.name = "Points" + mymob.gui_icons.blob_coverLEFT.layer = 21 + mymob.gui_icons.blob_coverLEFT.screen_loc = ui_blob_bg + mymob.gui_icons.blob_coverLEFT.maptext_x = 1 + mymob.gui_icons.blob_coverLEFT.maptext_y = 126 + + mymob.gui_icons.blob_coverRIGHT = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_coverRIGHT.icon = 'icons/mob/screen1_blob_fullscreen.dmi' + mymob.gui_icons.blob_coverRIGHT.icon_state = "coverRIGHT" + mymob.gui_icons.blob_coverRIGHT.name = "Health" + mymob.gui_icons.blob_coverRIGHT.layer = 21 + mymob.gui_icons.blob_coverRIGHT.screen_loc = ui_blob_bg + mymob.gui_icons.blob_coverRIGHT.maptext_x = 464 + mymob.gui_icons.blob_coverRIGHT.maptext_y = 126 + + mymob.gui_icons.blob_powerbar = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_powerbar.icon = 'icons/mob/screen1_blob_bars.dmi' + mymob.gui_icons.blob_powerbar.icon_state = "points" + mymob.gui_icons.blob_powerbar.name = "Points" + mymob.gui_icons.blob_powerbar.layer = 20 + mymob.gui_icons.blob_powerbar.screen_loc = ui_blob_powerbar + + mymob.gui_icons.blob_healthbar = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_healthbar.icon = 'icons/mob/screen1_blob_bars.dmi' + mymob.gui_icons.blob_healthbar.icon_state = "health" + mymob.gui_icons.blob_healthbar.name = "Health" + mymob.gui_icons.blob_healthbar.layer = 20 + mymob.gui_icons.blob_healthbar.screen_loc = ui_blob_healthbar + + mymob.gui_icons.blob_spawnblob = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_spawnblob.icon = 'icons/mob/screen1_blob.dmi' + mymob.gui_icons.blob_spawnblob.icon_state = "blob1" + mymob.gui_icons.blob_spawnblob.name = "Spawn Blob" + mymob.gui_icons.blob_spawnblob.layer = 22 + mymob.gui_icons.blob_spawnblob.screen_loc = ui_blob_spawnblob + + mymob.gui_icons.blob_spawnstrong = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_spawnstrong.icon = 'icons/mob/screen1_blob.dmi' + mymob.gui_icons.blob_spawnstrong.icon_state = "strong1" + mymob.gui_icons.blob_spawnstrong.name = "Spawn Strong Blob" + mymob.gui_icons.blob_spawnstrong.layer = 22 + mymob.gui_icons.blob_spawnstrong.screen_loc = ui_blob_spawnstrong + + mymob.gui_icons.blob_spawnresource = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_spawnresource.icon = 'icons/mob/screen1_blob.dmi' + mymob.gui_icons.blob_spawnresource.icon_state = "resource1" + mymob.gui_icons.blob_spawnresource.name = "Spawn Resource Blob" + mymob.gui_icons.blob_spawnresource.layer = 22 + mymob.gui_icons.blob_spawnresource.screen_loc = ui_blob_spawnresource + + mymob.gui_icons.blob_spawnfactory = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_spawnfactory.icon = 'icons/mob/screen1_blob.dmi' + mymob.gui_icons.blob_spawnfactory.icon_state = "factory1" + mymob.gui_icons.blob_spawnfactory.name = "Spawn Factory Blob" + mymob.gui_icons.blob_spawnfactory.layer = 22 + mymob.gui_icons.blob_spawnfactory.screen_loc = ui_blob_spawnfactory + + mymob.gui_icons.blob_spawnnode = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_spawnnode.icon = 'icons/mob/screen1_blob.dmi' + mymob.gui_icons.blob_spawnnode.icon_state = "node1" + mymob.gui_icons.blob_spawnnode.name = "Spawn Node Blob" + mymob.gui_icons.blob_spawnnode.layer = 22 + mymob.gui_icons.blob_spawnnode.screen_loc = ui_blob_spawnnode + + mymob.gui_icons.blob_spawncore = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_spawncore.icon = 'icons/mob/screen1_blob.dmi' + mymob.gui_icons.blob_spawncore.icon_state = "core1" + mymob.gui_icons.blob_spawncore.name = "Spawn Blob Core" + mymob.gui_icons.blob_spawncore.layer = 22 + mymob.gui_icons.blob_spawncore.screen_loc = ui_blob_spawncore + + mymob.gui_icons.blob_ping = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_ping.icon = 'icons/mob/screen1_blob.dmi' + mymob.gui_icons.blob_ping.icon_state = "ping" + mymob.gui_icons.blob_ping.name = "Call Overminds" + mymob.gui_icons.blob_ping.layer = 22 + mymob.gui_icons.blob_ping.screen_loc = ui_blob_ping + + mymob.gui_icons.blob_rally = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_rally.icon = 'icons/mob/screen1_blob.dmi' + mymob.gui_icons.blob_rally.icon_state = "rally" + mymob.gui_icons.blob_rally.name = "Rally Spores" + mymob.gui_icons.blob_rally.layer = 22 + mymob.gui_icons.blob_rally.screen_loc = ui_blob_rally + + mymob.gui_icons.blob_taunt = getFromPool(/obj/screen/specialblob) + mymob.gui_icons.blob_taunt.icon = 'icons/mob/screen1_blob.dmi' + mymob.gui_icons.blob_taunt.icon_state = "taunt" + mymob.gui_icons.blob_taunt.name = "Psionic Message" + mymob.gui_icons.blob_taunt.layer = 22 + mymob.gui_icons.blob_taunt.screen_loc = ui_blob_taunt + + mymob.client.reset_screen() + + mymob.client.screen += list( + mymob.gui_icons.blob_bgs, + mymob.gui_icons.blob_coverLEFT, + mymob.gui_icons.blob_coverRIGHT, + mymob.gui_icons.blob_powerbar, + mymob.gui_icons.blob_healthbar, + mymob.gui_icons.blob_spawnblob, + mymob.gui_icons.blob_spawnstrong, + mymob.gui_icons.blob_spawnresource, + mymob.gui_icons.blob_spawnfactory, + mymob.gui_icons.blob_spawnnode, + mymob.gui_icons.blob_spawncore, + mymob.gui_icons.blob_ping, + mymob.gui_icons.blob_rally, + mymob.gui_icons.blob_taunt, + ) + + for(var/i=1;i<=24;i++) + var/obj/screen/specialblob/S = getFromPool(/obj/screen/specialblob) + S.icon = 'icons/mob/screen1_blob.dmi' + S.icon_state = "" + var/total_offset = -16 + (i * 20) + S.screen_loc = "[1 + round(total_offset/32)]:[total_offset%32],15:0" + mymob.gui_icons.specialblobs[i] = S + + for(var/i=1;i<=24;i++) + mymob.client.screen += mymob.gui_icons.specialblobs[i] + +/* +/datum/hud/proc/remove_blob_hud() + for(var/i=1;i<=24;i++) + mymob.client.screen -= mymob.gui_icons.specialblobs[i] + + mymob.client.screen -= list( + mymob.gui_icons.blob_bgs, + mymob.gui_icons.blob_coverLEFT, + mymob.gui_icons.blob_coverRIGHT, + mymob.gui_icons.blob_powerbar, + mymob.gui_icons.blob_healthbar, + mymob.gui_icons.blob_spawnblob, + mymob.gui_icons.blob_spawnstrong, + mymob.gui_icons.blob_spawnresource, + mymob.gui_icons.blob_spawnfactory, + mymob.gui_icons.blob_spawnnode, + mymob.gui_icons.blob_spawncore, + mymob.gui_icons.blob_ping, + mymob.gui_icons.blob_rally, + mymob.gui_icons.blob_taunt, + ) +*/ \ No newline at end of file diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 018084a75d5..b7a70f6ed04 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -19,8 +19,6 @@ var/global/obj/screen/clicker/catcher = new() var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) var/obj/screen/lingchemdisplay - var/obj/screen/blobpwrdisplay - var/obj/screen/blobhealthdisplay var/obj/screen/vampire_blood_display // /vg/ var/obj/screen/r_hand_hud_object var/obj/screen/l_hand_hud_object @@ -45,8 +43,6 @@ var/global/obj/screen/clicker/catcher = new() disarm_intent = null help_intent = null lingchemdisplay = null - blobpwrdisplay = null - blobhealthdisplay = null vampire_blood_display = null r_hand_hud_object = null l_hand_hud_object = null @@ -146,8 +142,6 @@ var/global/obj/screen/clicker/catcher = new() robot_hud() else if(isobserver(mymob)) ghost_hud() - else if(isovermind(mymob)) - blob_hud() else if(isshade(mymob)) shade_hud() else if(isconstruct(mymob)) diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index 065f5d8438a..22579e9d4cc 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -64,25 +64,6 @@ /datum/hud/proc/brain_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') -/datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') - - - blobpwrdisplay = getFromPool(/obj/screen) - blobpwrdisplay.name = "blob power" - blobpwrdisplay.icon_state = "block" - blobpwrdisplay.screen_loc = ui_health - blobpwrdisplay.layer = 20 - - blobhealthdisplay = getFromPool(/obj/screen) - blobhealthdisplay.name = "blob health" - blobhealthdisplay.icon_state = "block" - blobhealthdisplay.screen_loc = ui_internal - blobhealthdisplay.layer = 20 - - mymob.client.reset_screen() - - mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay) - /datum/hud/proc/shade_hud() diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index c487d698a2a..383597e1502 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -28,6 +28,11 @@ maptext_height = 480 maptext_width = 480 +/obj/screen/adminbus + +/obj/screen/specialblob + var/obj/effect/blob/linked_blob = null + /obj/screen/schematics var/datum/rcd_schematic/ourschematic @@ -666,8 +671,12 @@ M.wearglasses(null) else if (istype(M.get_active_hand(), /obj/item/clothing/glasses)) M.wearglasses(M.get_active_hand()) + else + return 0 + return 1 -////////////ADMINBUS HUD ICONS//////////// +/obj/screen/adminbus/Click() + switch(name) if("Delete Bus") if(usr.locked_to && istype(usr.locked_to, /obj/structure/bed/chair/vehicle/adminbus)) var/obj/structure/bed/chair/vehicle/adminbus/A = usr.locked_to @@ -804,8 +813,51 @@ if(usr.locked_to && istype(usr.locked_to, /obj/structure/bed/chair/vehicle/adminbus)) var/obj/structure/bed/chair/vehicle/adminbus/A = usr.locked_to A.toggle_lights(usr,2) - else - return 0 + +/obj/screen/specialblob/Click() + switch(name) + if("Spawn Blob") + if(isovermind(usr)) + var/mob/camera/blob/overmind = usr + overmind.expand_blob_power() + if("Spawn Strong Blob") + if(isovermind(usr)) + var/mob/camera/blob/overmind = usr + overmind.create_shield_power() + if("Spawn Resource Blob") + if(isovermind(usr)) + var/mob/camera/blob/overmind = usr + overmind.create_resource() + if("Spawn Factory Blob") + if(isovermind(usr)) + var/mob/camera/blob/overmind = usr + overmind.create_factory() + if("Spawn Node Blob") + if(isovermind(usr)) + var/mob/camera/blob/overmind = usr + overmind.create_node() + if("Spawn Blob Core") + if(isovermind(usr)) + var/mob/camera/blob/overmind = usr + overmind.create_core() + if("Call Overminds") + if(isovermind(usr)) + var/mob/camera/blob/overmind = usr + overmind.callblobs() + if("Rally Spores") + if(isovermind(usr)) + var/mob/camera/blob/overmind = usr + overmind.rally_spores_power() + if("Psionic Message") + if(isovermind(usr)) + var/mob/camera/blob/overmind = usr + var/message = input(overmind,"Send a message to the crew.","Psionic Message") as null|text + if(message) + overmind.telepathy(message) + if("Jump to Blob") + if(isovermind(usr) && linked_blob) + var/mob/camera/blob/overmind = usr + overmind.loc = linked_blob.loc return 1 /obj/screen/inventory/Click() diff --git a/code/datums/ui_icons.dm b/code/datums/ui_icons.dm index cf6fb1f07a3..9472b196091 100644 --- a/code/datums/ui_icons.dm +++ b/code/datums/ui_icons.dm @@ -3,38 +3,55 @@ //Adminbus HUD stuff var/list/rearviews[16] - var/obj/screen/adminbus_bg = null - var/obj/screen/adminbus_delete = null - var/obj/screen/adminbus_delmobs = null - var/obj/screen/adminbus_spclowns = null - var/obj/screen/adminbus_spcarps = null - var/obj/screen/adminbus_spbears = null - var/obj/screen/adminbus_sptrees = null - var/obj/screen/adminbus_spspiders = null - var/obj/screen/adminbus_spalien = null - var/obj/screen/adminbus_loadsids = null - var/obj/screen/adminbus_loadsmoney = null - var/obj/screen/adminbus_massrepair = null - var/obj/screen/adminbus_massrejuv = null - var/obj/screen/adminbus_hook = null - var/obj/screen/adminbus_juke = null - var/obj/screen/adminbus_tele = null - var/obj/screen/adminbus_bumpers_1 = null - var/obj/screen/adminbus_bumpers_2 = null - var/obj/screen/adminbus_bumpers_3 = null - var/obj/screen/adminbus_door_0 = null - var/obj/screen/adminbus_door_1 = null - var/obj/screen/adminbus_roadlights_0 - var/obj/screen/adminbus_roadlights_1 - var/obj/screen/adminbus_roadlights_2 - var/obj/screen/adminbus_free = null - var/obj/screen/adminbus_home = null - var/obj/screen/adminbus_antag = null - var/obj/screen/adminbus_dellasers = null - var/obj/screen/adminbus_givelasers = null - var/obj/screen/adminbus_delbombs = null - var/obj/screen/adminbus_givebombs = null - var/obj/screen/adminbus_tdred = null - var/obj/screen/adminbus_tdarena = null - var/obj/screen/adminbus_tdgreen = null - var/obj/screen/adminbus_tdobs = null + var/obj/screen/adminbus/adminbus_bg = null + var/obj/screen/adminbus/adminbus_delete = null + var/obj/screen/adminbus/adminbus_delmobs = null + var/obj/screen/adminbus/adminbus_spclowns = null + var/obj/screen/adminbus/adminbus_spcarps = null + var/obj/screen/adminbus/adminbus_spbears = null + var/obj/screen/adminbus/adminbus_sptrees = null + var/obj/screen/adminbus/adminbus_spspiders = null + var/obj/screen/adminbus/adminbus_spalien = null + var/obj/screen/adminbus/adminbus_loadsids = null + var/obj/screen/adminbus/adminbus_loadsmoney = null + var/obj/screen/adminbus/adminbus_massrepair = null + var/obj/screen/adminbus/adminbus_massrejuv = null + var/obj/screen/adminbus/adminbus_hook = null + var/obj/screen/adminbus/adminbus_juke = null + var/obj/screen/adminbus/adminbus_tele = null + var/obj/screen/adminbus/adminbus_bumpers_1 = null + var/obj/screen/adminbus/adminbus_bumpers_2 = null + var/obj/screen/adminbus/adminbus_bumpers_3 = null + var/obj/screen/adminbus/adminbus_door_0 = null + var/obj/screen/adminbus/adminbus_door_1 = null + var/obj/screen/adminbus/adminbus_roadlights_0 + var/obj/screen/adminbus/adminbus_roadlights_1 + var/obj/screen/adminbus/adminbus_roadlights_2 + var/obj/screen/adminbus/adminbus_free = null + var/obj/screen/adminbus/adminbus_home = null + var/obj/screen/adminbus/adminbus_antag = null + var/obj/screen/adminbus/adminbus_dellasers = null + var/obj/screen/adminbus/adminbus_givelasers = null + var/obj/screen/adminbus/adminbus_delbombs = null + var/obj/screen/adminbus/adminbus_givebombs = null + var/obj/screen/adminbus/adminbus_tdred = null + var/obj/screen/adminbus/adminbus_tdarena = null + var/obj/screen/adminbus/adminbus_tdgreen = null + var/obj/screen/adminbus/adminbus_tdobs = null + + //Blob HUD stuff + var/list/specialblobs[24] + var/obj/screen/specialblob/blob_bgs = null + var/obj/screen/specialblob/blob_coverLEFT = null + var/obj/screen/specialblob/blob_coverRIGHT = null + var/obj/screen/specialblob/blob_powerbar = null + var/obj/screen/specialblob/blob_healthbar = null + var/obj/screen/specialblob/blob_spawnblob = null + var/obj/screen/specialblob/blob_spawnstrong = null + var/obj/screen/specialblob/blob_spawnresource = null + var/obj/screen/specialblob/blob_spawnfactory = null + var/obj/screen/specialblob/blob_spawnnode = null + var/obj/screen/specialblob/blob_spawncore = null + var/obj/screen/specialblob/blob_ping = null + var/obj/screen/specialblob/blob_rally = null + var/obj/screen/specialblob/blob_taunt = null diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 79e5a3cdbc7..e205bde0121 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -92,7 +92,7 @@ if(blob_looks[looks] == 64) anim(target = loc, a_icon = icon, flick_anim = "corepulse", sleeptime = 15, lay = 12, offX = -16, offY = -16, alph = 200) for(var/mob/M in viewers(src)) - M.playsound_local(loc, 'sound/effects/blob_pulse.ogg', 50, 0, null, FALLOFF_SOUNDS, 0) + M.playsound_local(loc, adminblob_beat, 50, 0, null, FALLOFF_SOUNDS, 0) var/turf/T = get_turf(overmind) //The overmind's mind can expand the blob var/obj/effect/blob/O = locate() in T //As long as it is 'thinking' about a blob already @@ -145,6 +145,11 @@ B.key = C.key B.blob_core = src src.overmind = B + + B.special_blobs += src + B.hud_used.blob_hud() + B.update_specialblobs() + if(!B.blob_core.creator)//If this core is the first of its lineage (created by game mode/event/admins, instead of another overmind) it gets to choose its looks. var/new_name = "Blob Overmind ([rand(1, 999)])" B.name = new_name @@ -155,7 +160,8 @@ B.verbs += /mob/camera/blob/proc/create_core spawn() - var/chosen = input(B,"Select a blob looks", "Blob Looks", blob_looks[1]) as null|anything in blob_looks + var/can_choose_from = blob_looks - "adminbus" + var/chosen = input(B,"Select a blob looks", "Blob Looks", blob_looks[1]) as null|anything in can_choose_from if(chosen) for(var/obj/effect/blob/nearby_blob in range(src,5)) nearby_blob.looks = chosen @@ -164,10 +170,14 @@ var/new_name = "Blob Cerebrate ([rand(1, 999)])" B.name = new_name B.real_name = new_name + B.gui_icons.blob_spawncore.icon_state = "" + B.gui_icons.blob_spawncore.name = "" for(var/mob/camera/blob/O in blob_overminds) if(O != B) to_chat(O,"A new blob cerebrate has started thinking inside a blob core! [B] joins the blob! (JUMP)") + + if(istype(ticker.mode, /datum/game_mode/blob)) var/datum/game_mode/blob/mode = ticker.mode mode.infected_crew += B.mind diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index c1739e98619..5287979b936 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -52,6 +52,8 @@ S.Die() if(!manual_remove && overmind) to_chat(overmind,"A factory blob that you had created has been destroyed. (JUMP)") + overmind.special_blobs -= src + overmind.update_specialblobs() ..() /obj/effect/blob/factory/update_icon(var/spawnend = 0) diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index eb04dc2c43c..46e0f29253c 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -28,6 +28,8 @@ blob_nodes -= src if(!manual_remove && overmind) to_chat(overmind,"A node blob that you had created has been destroyed. (JUMP)") + overmind.special_blobs -= src + overmind.update_specialblobs() processing_objects.Remove(src) ..() @@ -37,7 +39,7 @@ if(blob_looks[looks] == 64) anim(target = loc, a_icon = icon, flick_anim = "nodepulse", sleeptime = 15, lay = 12, offX = -16, offY = -16, alph = 150) for(var/mob/M in viewers(src)) - M.playsound_local(loc, 'sound/effects/blob_pulse.ogg', 50, 0, null, FALLOFF_SOUNDS, 0) + M.playsound_local(loc, adminblob_beat, 50, 0, null, FALLOFF_SOUNDS, 0) for(var/i = 1; i < 8; i += i) Pulse(5, i) diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm index 829327b3c07..61855a72866 100644 --- a/code/game/gamemodes/blob/blobs/resource.dm +++ b/code/game/gamemodes/blob/blobs/resource.dm @@ -24,6 +24,8 @@ blob_resources -= src if(!manual_remove && overmind) to_chat(overmind,"You lost a resource blob. (JUMP)") + overmind.special_blobs -= src + overmind.update_specialblobs() ..() /obj/effect/blob/resource/update_health() @@ -40,6 +42,8 @@ if(B) to_chat(B,"You take control of the resource blob.") overmind = B + B.special_blobs += src + B.update_specialblobs() update_icon() ..() diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index c75ef4cc1f8..edc9997a679 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -29,7 +29,8 @@ /obj/effect/blob/shield/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0) if(istype(mover) && mover.checkpass(PASSBLOB)) return 1 - mover.Bump(src) //Only automatic for dense objects + if(mover) + mover.Bump(src) //Only automatic for dense objects return 0 /obj/effect/blob/shield/run_action() diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 741ffc4dccc..3a07cd59ac7 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -20,6 +20,8 @@ var/blob_warning = 0 + var/list/special_blobs = list() + /mob/camera/blob/New() blob_overminds += src ..() @@ -70,8 +72,14 @@ /mob/camera/blob/proc/update_health() - if(blob_core) - hud_used.blobhealthdisplay.maptext = "
[blob_core.health]
" + if(blob_core && hud_used) + var/matrix/M = matrix() + M.Scale(1,blob_core.health/blob_core.maxhealth) + var/total_offset = 60 + (100*(blob_core.health/blob_core.maxhealth)) + hud_used.mymob.gui_icons.blob_healthbar.transform = M + hud_used.mymob.gui_icons.blob_healthbar.screen_loc = "15:14,[round(total_offset/32)]:[total_offset%32]" + hud_used.mymob.gui_icons.blob_coverRIGHT.maptext = "[blob_core.health]" + var/severity = 0 switch(round(blob_core.health)) if(167 to 199) @@ -86,6 +94,12 @@ severity = 5 if(-INFINITY to 33) severity = 6 + + if(severity >= 5) + hud_used.mymob.gui_icons.blob_healthbar.icon_state = "healthcrit" + else + hud_used.mymob.gui_icons.blob_healthbar.icon_state = "health" + if(severity > 0) overlay_fullscreen("damage", /obj/screen/fullscreen/brute, severity) else @@ -94,9 +108,42 @@ /mob/camera/blob/proc/add_points(var/points) if(points != 0) blob_points = Clamp(blob_points + points, 0, max_blob_points) - //sanity for manual spawned blob cameras + + //Updating the HUD if(hud_used) - hud_used.blobpwrdisplay.maptext = "
[src.blob_points]
" + var/matrix/M = matrix() + M.Scale(1,blob_points/max_blob_points) + var/total_offset = 60 + (100*(blob_points/max_blob_points)) + hud_used.mymob.gui_icons.blob_powerbar.transform = M + hud_used.mymob.gui_icons.blob_powerbar.screen_loc = "1:0,[round(total_offset/32)]:[total_offset%32]" + hud_used.mymob.gui_icons.blob_coverLEFT.maptext = "[blob_points]" + hud_used.mymob.gui_icons.blob_coverLEFT.maptext_x = 4 + if(blob_points >= 100) + hud_used.mymob.gui_icons.blob_coverLEFT.maptext_x = 1 + + hud_used.mymob.gui_icons.blob_spawnblob.color = grayscale + hud_used.mymob.gui_icons.blob_spawnstrong.color = grayscale + hud_used.mymob.gui_icons.blob_spawnresource.color = grayscale + hud_used.mymob.gui_icons.blob_spawnfactory.color = grayscale + hud_used.mymob.gui_icons.blob_spawnnode.color = grayscale + hud_used.mymob.gui_icons.blob_spawncore.color = grayscale + hud_used.mymob.gui_icons.blob_rally.color = grayscale + hud_used.mymob.gui_icons.blob_taunt.color = grayscale + + if(blob_points >= 5) + hud_used.mymob.gui_icons.blob_spawnblob.color = null + hud_used.mymob.gui_icons.blob_rally.color = null + if(blob_points >= 10) + hud_used.mymob.gui_icons.blob_spawnstrong.color = null + if(blob_points >= 15) + hud_used.mymob.gui_icons.blob_taunt.color = null + if(blob_points >= 40) + hud_used.mymob.gui_icons.blob_spawnresource.color = null + if(blob_points >= 60) + hud_used.mymob.gui_icons.blob_spawnfactory.color = null + hud_used.mymob.gui_icons.blob_spawnnode.color = null + if(blob_points >= 100) + hud_used.mymob.gui_icons.blob_spawncore.color = null /mob/camera/blob/say(var/message) if (!message) @@ -191,3 +238,30 @@ // Update on_moved listeners. INVOKE_EVENT(on_moved,list("loc"=NewLoc)) + +/mob/camera/blob/proc/update_specialblobs() + if(client && gui_icons) + for(var/i=1;i<=24;i++) + client.screen -= gui_icons.specialblobs[i] + var/obj/screen/specialblob/S = gui_icons.specialblobs[i] + var/obj/effect/blob/B = null + if(i<=special_blobs.len) + B = special_blobs[i] + if(!B) + S.icon_state = "" + S.name = "" + S.linked_blob = null + else + switch(B.type) + if(/obj/effect/blob/core) + S.icon_state = "smallcore" + if(/obj/effect/blob/resource) + S.icon_state = "smallresource" + if(/obj/effect/blob/factory) + S.icon_state = "smallfactory" + if(/obj/effect/blob/node) + S.icon_state = "smallnode" + S.name = "Jump to Blob" + S.linked_blob = B + gui_icons.specialblobs[i] = S + client.screen += gui_icons.specialblobs[i] diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index d416d858402..33070875deb 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -94,6 +94,8 @@ var/obj/effect/blob/resource/R = locate() in T if(R) R.overmind = src + special_blobs += R + update_specialblobs() return /mob/camera/blob/proc/create_core() @@ -162,6 +164,8 @@ var/obj/effect/blob/node/N = locate() in T if(N) N.overmind = src + special_blobs += N + update_specialblobs() return @@ -196,6 +200,8 @@ var/obj/effect/blob/factory/F = locate() in T if(F) F.overmind = src + special_blobs += F + update_specialblobs() return diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index ffeba2dfd40..8a28ab9b4b2 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -261,6 +261,8 @@ var/list/blob_looks icon = 'icons/mob/blob_64x64.dmi' if("classic") icon = 'icons/mob/blob.dmi' + if("adminbus") + icon = adminblob_icon //<----------------------------------------------------------------------------DEAR SPRITERS, THIS IS WHERE YOU ADD YOUR NEW BLOB DMIs /*EXAMPLES if("fleshy") @@ -275,6 +277,7 @@ var/list/blob_looks var/list/blob_looks = list( "new" = 64, "classic" = 32, + "adminbus" = adminblob_size, ) //<---------------------------------------ALSO ADD THE NAME OF YOUR BLOB LOOKS HERE, AS WELL AS THE RESOLUTION OF THE DMIS (64 or 32) diff --git a/code/game/objects/structures/vehicles/adminbus.dm b/code/game/objects/structures/vehicles/adminbus.dm index 6ad5de7a17b..008510d2da8 100644 --- a/code/game/objects/structures/vehicles/adminbus.dm +++ b/code/game/objects/structures/vehicles/adminbus.dm @@ -387,7 +387,7 @@ for(var/i=1;i<=MAX_CAPACITY;i++) var/mob/living/M = occupant M.client.screen -= M.gui_icons.rearviews[i] - var/obj/screen/S = M.gui_icons.rearviews[i] + var/obj/screen/adminbus/S = M.gui_icons.rearviews[i] var/icon/passenger_img = null var/atom/A = null if(i<=passengers.len) diff --git a/code/global.dm b/code/global.dm index 4c9a5bf7764..7168b693cb2 100644 --- a/code/global.dm +++ b/code/global.dm @@ -404,3 +404,11 @@ var/global/hardcore_mode = 0 //Global list of all unsimulated mineral turfs for xenoarch var/global/list/mineral_turfs = list() var/global/list/static_list = list('sound/effects/static/static1.ogg','sound/effects/static/static2.ogg','sound/effects/static/static3.ogg','sound/effects/static/static4.ogg','sound/effects/static/static5.ogg',) + +//Used to set an atom's color var to "grayscale". The magic of color matrixes. +var/list/grayscale = list(0.3,0.3,0.3,0,0.59,0.59,0.59,0,0.11,0.11,0.11,0,0,0,0,1,0,0,0,0) + +//For adminbus blob looks +var/adminblob_icon = null +var/adminblob_size = 64 +var/adminblob_beat = 'sound/effects/blob_pulse.ogg' diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 47289ac0b49..7b13ac728f6 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1042,12 +1042,32 @@ var/list/admin_verbs_mod = list( set name = "Set Blob Looks" set category = "Fun" - var/chosen = input("This will change the looks of every blob currently in the world.", "Blob Looks", blob_looks[1]) as null|anything in blob_looks + var/to_choose_from = list("ADMINBUS (custom DMI upload)") + to_choose_from += blob_looks - "adminbus" + var/chosen = input("This will change the looks of every blob currently in the world.", "Blob Looks", blob_looks[1]) as null|anything in to_choose_from - if(chosen) - for(var/obj/effect/blob/B in blobs) - B.looks = chosen - B.update_looks(1) + if(!chosen) + return + + if(chosen == "ADMINBUS (custom DMI upload)") + adminblob_icon = input("Pick Icon:","Icon") as icon + if(!adminblob_icon) + return + adminblob_size = text2num(alert("Which size are those icons?","","64","32")) + + if((adminblob_size == 64) && (alert("Do you want to use a custom Pulse soundfile?","","Yes","No") == "Yes")) + adminblob_beat = input("Pick Soundfile (DO NOT USE AN OVERLY LONG SOUNDFILE UNLESS YOU ARE READY TO FACE THE CONSEQUENCES):","(DO NOT USE AN OVERLY LONG SOUNDFILE UNLESS YOU ARE READY TO FACE THE CONSEQUENCES)") as file + else + adminblob_beat = 'sound/effects/blob_pulse.ogg' + + blob_looks["adminbus"] = adminblob_size + chosen = "adminbus" + else + adminblob_icon = null + + for(var/obj/effect/blob/B in blobs) + B.looks = chosen + B.update_looks(1) log_admin("[key_name(src)] set all blobs to use the \"[chosen]\" look.") message_admins("[key_name_admin(src)] set all blobs to use the \"[chosen]\" look.") diff --git a/html/changelogs/DeityLink_9948.yml b/html/changelogs/DeityLink_9948.yml new file mode 100644 index 00000000000..e1a4538f43a --- /dev/null +++ b/html/changelogs/DeityLink_9948.yml @@ -0,0 +1,6 @@ +author: Deity Link +delete-after: true +changes: + - rscadd: (BLOB HUD) Blob Overminds now have their own amazing custom HUD. Points gauge on the left, Health gauge on the right. The health gauge start flashing when it gets low. + - rscadd: (BLOB HUD) Buttons that require more points than you currently have appear grayscale. + - rscadd: (BLOB HUD) You can always jump back to your core using the small button to the top left. The first 24 special blobs that you've created (not counting the ones that got destroyed) also appear at the top, and you can quickly teleport from one to another by clicking them. diff --git a/icons/mob/screen1_blob.dmi b/icons/mob/screen1_blob.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4fb5cb66da6320dcee19e768f5b490dc2582a6c6 GIT binary patch literal 21270 zcmV)pK%2jbP)V=-0C=2@(7_IZFboFZGkb~#?ncz>E(T&az&ng>z>=|=u4sIF52!b@-P+{K z-~6rM+TOYWn!XbcOVMEf375lB6i;V(0SV`mC>HDHh4&@0Vha+=QWVBf1PQe$CQ_^2 z=O55Wwoa;mCPPh1Gtw&!$wu5rXGBIO40GCz9>bnbb z`j^W4^kG(8;D4%uc4(mKJMjj;JFhc{cge2+03ZNKL_t(|oaDV}ux7_u=lRRbv%c%y z_u8vel1i#lY4vVw3^oQE+!(NNM2{z0?&+SUrw5wuhKc?#(=*X#CTMzMLNRQHSzs`> zg)M9h-X$Yhvi6cns(rh+?tbsPFK5ln`EahPBxIXr5JN?DM!a#i_q_i+=lSQe<@4kf zk38}SH{y8kf&1+b`ujh9%dXe`?l&L5`hDO3;a~Wacq8%ursGD%7dH|CUVYQQ_%Htr zkALe6?45BKUAPPV{8w@P5>8mg4azuPfKU!tgEbnRM&wCE77fVaA>95>YBRUdS$&aH zr(WVaPoKSp^Zg#itMM!E7~?JFMHU8qP~gOdug{IKwH-2hrNf;IA=`U@oFmi6aijzw z&QiX#_~)D%zQ~)xgtu;WdA3&J+gEl|I@9?Z;YU*$`|k_bb#DpB2s$Sc*8Y4zmMH9D zm$@HtxO%q4&mQ_1a$E9^tka?c<_Py z?LWEyV|3O|lFJ$EL)>i= zcUz=UA9?JDc=6ds*>m_l#>S`VZJy@;dFb)i3E{y9?zg}6%fAAEwU%d2JjBWMm#H5} zczYI8-y9H!4r^9%-rtYCvd*nXd|vKPakswF%$y|$WjV|cE+$rIZf zj8Ap=SP+v03MbQ?azdPT$eXhPL4S*Z^=VeBT%4R>HGpQC@{Y9)4s0av-C^di zPpK|hD8tk+=F}IeufhMNU;Y&~&V3yy2>55;KFMaIj|@Hhn>ELNq=s9Q^q)#uzZ8?N z`0V|_2uo_4?uKG?rp{0ev1bx^K1L~+eP@-$3w?SoW=zBmQcBbes98zllH|j`@G0T^ zeF^=qj^@>8NCr(t=Z`VE>uz>s1~F(7%p9URcQZkK66FO*VGvd$c(sYNSkIvR3M#0g z{0fd=#tF(qtqtyR8>}_Ev<8OxsXAe8_I3DA#*cAdKFO}Ij1&SPVAyJ4RGSuu%}{qn@*Wp zY;lU}Yw*(~!P?@U23f|68>7jn4mIj@jm1Wf{U56_{bMD96N<&prmTOxL%R~=k9kC` zCJZc6f)iWPdYO~Yv!Z99$`2U`gA|(iTAk6kqg1DE z1|E71z8|je>{f$F??!fpL{36yCT6nc;OQp2bH!WBP4>=bIF7~&K<3x37dg}?E%jc; z)YgFC=qsXw6=q73nl-$=+o$S#)EYxlPrdH`zx&A7@O2j~oNcW!Rx^0r0O0^SMsAf^ zIsu0#6n;EHxYc49_ZX{6)R@3TIreH!x#ZyZAuIg>DNU?c>PKKm|4!!0I-S!4)b(;G8QKIe|{p}0KH!j6r?{_ih1pv�VfMgl)mf0#X`4 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 literal 0 HcmV?d00001 diff --git a/icons/mob/screen1_blob_bars.dmi b/icons/mob/screen1_blob_bars.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8215eb4e3fca1d82dcbcdf1d5f338f316bbafe57 GIT binary patch literal 391 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

rl3Tu}Bx>;&$}a)!na1 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 E0Aj8EQ~&?~ literal 0 HcmV?d00001 diff --git a/vgstation13.dme b/vgstation13.dme index c62f0f26941..16781a339da 100644 --- a/vgstation13.dme +++ b/vgstation13.dme @@ -63,6 +63,7 @@ #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alien.dm" #include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\blob.dm" #include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\hud.dm" #include "code\_onclick\hud\human.dm"