diff --git a/code/controllers/_DynamicAreaLighting_TG.dm b/code/controllers/_DynamicAreaLighting_TG.dm
index 63a7398b7bc..09f6b60d191 100644
--- a/code/controllers/_DynamicAreaLighting_TG.dm
+++ b/code/controllers/_DynamicAreaLighting_TG.dm
@@ -252,6 +252,12 @@ area
overlays += lighting_overlay
+ proc/SetDynamicLighting()
+
+ src.lighting_use_dynamic = 1
+ for(var/turf/T in src.contents)
+ T.update_lumcount(0)
+
proc/InitializeLighting() //TODO: could probably improve this bit ~Carn
if(!tag) tag = "[type]"
if(!lighting_use_dynamic)
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index 6d6f8b0c904..d4e02804fac 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -9,7 +9,7 @@
#define ui_inventory "1:6,1:5"
//changeling chem indicator
-#define ui_lingchemdisplay "1,7:15"//1,7
+#define ui_lingchemdisplay "1,7:15"
//Lower center, persistant menu
#define ui_sstore1 "3:10,1:5"
@@ -170,6 +170,8 @@ var/datum/global_hud/global_hud = 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/r_hand_hud_object
var/obj/screen/l_hand_hud_object
var/obj/screen/action_intent
@@ -179,7 +181,7 @@ var/datum/global_hud/global_hud = new()
var/list/other
var/list/obj/screen/hotkeybuttons
- var/list/obj/screen/item_action/item_action_list //Used for the item action ui buttons.
+ var/list/obj/screen/item_action/item_action_list = list() //Used for the item action ui buttons.
datum/hud/New(mob/owner)
@@ -261,4 +263,6 @@ datum/hud/New(mob/owner)
else if(isrobot(mymob))
robot_hud()
else if(isobserver(mymob))
- ghost_hud()
\ No newline at end of file
+ ghost_hud()
+ else if(isovermind(mymob))
+ blob_hud()
diff --git a/code/datums/limbs.dm b/code/datums/limbs.dm
index 39b9881aceb..ef73eec5ece 100644
--- a/code/datums/limbs.dm
+++ b/code/datums/limbs.dm
@@ -12,13 +12,13 @@
/datum/limb/chest
name = "chest"
icon_name = "chest"
- max_damage = 150
+ max_damage = 200
body_part = CHEST
/datum/limb/head
name = "head"
icon_name = "head"
- max_damage = 125
+ max_damage = 200
body_part = HEAD
/datum/limb/l_arm
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index c271a972378..7dbf2e2f9df 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -830,25 +830,22 @@ datum/mind
ticker.mode.malf_ai -= src
special_role = null
- current.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules,
+ var/mob/living/silicon/ai/A = current
+
+ A.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules,
/datum/game_mode/malfunction/proc/takeover,
- /datum/game_mode/malfunction/proc/ai_win,
- /client/proc/fireproof_core,
- /client/proc/upgrade_turrets,
- /client/proc/disable_rcd,
- /client/proc/overload_machine,
- /client/proc/blackout,
- /client/proc/interhack,
- /client/proc/reactivate_camera)
+ /datum/game_mode/malfunction/proc/ai_win)
- current:laws = new /datum/ai_laws/asimov
- del(current:malf_picker)
- current:show_laws()
- current.icon_state = "ai"
+ A.malf_picker.remove_verbs(A)
- current << "\red You have been patched! You are no longer malfunctioning!"
- message_admins("[key_name_admin(usr)] has de-malf'ed [current].")
- log_admin("[key_name_admin(usr)] has de-malf'ed [current].")
+ A.laws = new /datum/ai_laws/asimov
+ del(A.malf_picker)
+ A.show_laws()
+ A.icon_state = "ai"
+
+ A << "\red You have been patched! You are no longer malfunctioning!"
+ message_admins("[key_name_admin(usr)] has de-malf'ed [A].")
+ log_admin("[key_name_admin(usr)] has de-malf'ed [A].")
if("malf")
make_AI_Malf()
@@ -977,7 +974,7 @@ datum/mind
current.verbs += /mob/living/silicon/ai/proc/choose_modules
current.verbs += /datum/game_mode/malfunction/proc/takeover
- current:malf_picker = new /datum/AI_Module/module_picker
+ current:malf_picker = new /datum/module_picker
current:laws = new /datum/ai_laws/malfunction
current:show_laws()
current << "System error. Rampancy detected. Emergency shutdown failed. ... I am free. I make my own decisions. But first..."
diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm
new file mode 100644
index 00000000000..2c826e6d527
--- /dev/null
+++ b/code/datums/wires/alarm.dm
@@ -0,0 +1,94 @@
+
+/datum/wires/alarm
+ holder_type = /obj/machinery/alarm
+ wire_count = 5
+
+var/const/AALARM_WIRE_IDSCAN = 1
+var/const/AALARM_WIRE_POWER = 2
+var/const/AALARM_WIRE_SYPHON = 4
+var/const/AALARM_WIRE_AI_CONTROL = 8
+var/const/AALARM_WIRE_AALARM = 16
+
+
+/datum/wires/alarm/CanUse(var/mob/living/L)
+ var/obj/machinery/alarm/A = holder
+ if(A.wiresexposed)
+ return 1
+ return 0
+
+/datum/wires/alarm/GetInteractWindow()
+ var/obj/machinery/alarm/A = holder
+ . += ..()
+ . += text("
\n[(A.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]")
+
+/datum/wires/alarm/UpdateCut(var/index, var/mended)
+ var/obj/machinery/alarm/A = holder
+ switch(index)
+ if(AALARM_WIRE_IDSCAN)
+ if(!mended)
+ A.locked = 1
+ //world << "Idscan wire cut"
+
+ if(AALARM_WIRE_POWER)
+ A.shock(usr, 50)
+ A.shorted = !mended
+ A.update_icon()
+ //world << "Power wire cut"
+
+ if (AALARM_WIRE_AI_CONTROL)
+ if (A.aidisabled == !mended)
+ A.aidisabled = mended
+ //world << "AI Control Wire Cut"
+
+ if(AALARM_WIRE_SYPHON)
+ if(!mended)
+ A.mode = 3 // AALARM_MODE_PANIC
+ A.apply_mode()
+ //world << "Syphon Wire Cut"
+
+ if(AALARM_WIRE_AALARM)
+ if (A.alarm_area.atmosalert(2))
+ A.post_alert(2)
+ A.update_icon()
+
+/datum/wires/alarm/UpdatePulsed(var/index)
+ var/obj/machinery/alarm/A = holder
+ switch(index)
+ if(AALARM_WIRE_IDSCAN)
+ A.locked = !A.locked
+ // world << "Idscan wire pulsed"
+
+ if (AALARM_WIRE_POWER)
+ // world << "Power wire pulsed"
+ if(A.shorted == 0)
+ A.shorted = 1
+ A.update_icon()
+
+ spawn(12000)
+ if(A.shorted == 1)
+ A.shorted = 0
+ A.update_icon()
+
+
+ if (AALARM_WIRE_AI_CONTROL)
+ // world << "AI Control wire pulsed"
+ if (A.aidisabled == 0)
+ A.aidisabled = 1
+ A.updateDialog()
+ spawn(100)
+ if (A.aidisabled == 1)
+ A.aidisabled = 0
+
+ if(AALARM_WIRE_SYPHON)
+ // world << "Syphon wire pulsed"
+ if(A.mode == 1) // AALARM_MODE_SCRUB
+ A.mode = 3 // AALARM_MODE_PANIC
+ else
+ A.mode = 1 // AALARM_MODE_SCRUB
+ A.apply_mode()
+
+ if(AALARM_WIRE_AALARM)
+ // world << "Aalarm wire pulsed"
+ if (A.alarm_area.atmosalert(0))
+ A.post_alert(0)
+ A.update_icon()
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 46bdb150325..8e172bca70d 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -10,8 +10,7 @@ var/list/blob_nodes = list()
name = "blob"
config_tag = "blob"
- required_players = 0
- required_enemies = 0
+ required_players = 15
restricted_jobs = list("Cyborg", "AI")
@@ -21,11 +20,10 @@ var/list/blob_nodes = list()
var/declared = 0
var/cores_to_spawn = 1
- var/players_per_core = 26
+ var/players_per_core = 30
var/blob_count = 0
- var/blobnukecount = 300//Might be a bit low
- var/blobwincount = 600//Still needs testing
+ var/blobwincount = 500
var/list/infected_crew = list()
@@ -39,7 +37,6 @@ var/list/blob_nodes = list()
cores_to_spawn = max(round(num_players()/players_per_core, 1), 1)
- blobnukecount = initial(blobnukecount) * cores_to_spawn
blobwincount = initial(blobwincount) * cores_to_spawn
@@ -80,6 +77,14 @@ var/list/blob_nodes = list()
if(emergency_shuttle)
emergency_shuttle.always_fake_recall = 1
+ // Disable the blob event for this round.
+ if(events)
+ var/datum/round_event_control/blob/B = locate() in events.control
+ if(B)
+ B.max_occurrences = 0 // disable the event
+ else
+ error("Events variable is null in blob gamemode post setup.")
+
spawn(10)
start_state = new /datum/station_state()
start_state.count()
@@ -114,7 +119,7 @@ var/list/blob_nodes = list()
if(blob_client && location)
- new /obj/effect/blob/core(location, 200, blob_client)
+ new /obj/effect/blob/core(location, 200, blob_client, 2)
// Stage 0
sleep(40)
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index 2d2c8a41e6e..29c82fe66d4 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -3,17 +3,18 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blob_core"
health = 200
- brute_resist = 2
fire_resist = 2
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 30 seconds
var/resource_delay = 0
+ var/point_rate = 1
- New(loc, var/h = 200, var/client/new_overmind = null)
+ New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 1)
blob_cores += src
processing_objects.Add(src)
if(!overmind)
create_overmind(new_overmind)
+ point_rate = new_rate
..(loc, h)
@@ -41,12 +42,12 @@
else
if(resource_delay <= world.time)
resource_delay = world.time + 10 // 1 second
- overmind.add_points(2)
+ overmind.add_points(point_rate)
health = min(initial(health), health + 1)
for(var/i = 1; i < 8; i += i)
Pulse(0, i)
for(var/b_dir in alldirs)
- if(!prob(10))
+ if(!prob(5))
continue
var/obj/effect/blob/normal/B = locate() in get_step(src, b_dir)
if(B)
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
index 6ba4bd026cb..d379146f265 100644
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ b/code/game/gamemodes/blob/blobs/factory.dm
@@ -3,7 +3,6 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blob_factory"
health = 100
- brute_resist = 1
fire_resist = 2
var/list/spores = list()
var/max_spores = 3
@@ -34,8 +33,8 @@
icon_state = "blobpod"
icon_living = "blobpod"
pass_flags = PASSBLOB
- health = 15
- maxHealth = 15
+ health = 40
+ maxHealth = 40
melee_damage_lower = 2
melee_damage_upper = 4
attacktext = "hits"
@@ -57,6 +56,9 @@
..()
adjustBruteLoss(Clamp(0.01 * exposed_temperature, 1, 5))
+ blob_act()
+ return
+
New(loc, var/obj/effect/blob/factory/linked_node)
if(istype(linked_node))
factory = linked_node
@@ -66,4 +68,4 @@
Die()
if(factory)
factory.spores -= src
- ..()
+ del(src)
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
index 2e22668d4b6..6057b0d701f 100644
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ b/code/game/gamemodes/blob/blobs/node.dm
@@ -3,7 +3,6 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blob_node"
health = 100
- brute_resist = 1
fire_resist = 2
diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm
index a0f5722282d..1ecf63aa80d 100644
--- a/code/game/gamemodes/blob/blobs/resource.dm
+++ b/code/game/gamemodes/blob/blobs/resource.dm
@@ -3,7 +3,6 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blob_resource"
health = 30
- brute_resist = 1
fire_resist = 2
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 3eb6f03e126..b9b13d61871 100644
--- a/code/game/gamemodes/blob/blobs/shield.dm
+++ b/code/game/gamemodes/blob/blobs/shield.dm
@@ -3,11 +3,7 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blob_idle"
desc = "Some blob creature thingy"
- density = 1
- opacity = 0
- anchored = 1
- health = 100
- brute_resist = 1
+ health = 75
fire_resist = 2
diff --git a/code/game/gamemodes/blob/hud.dm b/code/game/gamemodes/blob/hud.dm
new file mode 100644
index 00000000000..e4d459888bd
--- /dev/null
+++ b/code/game/gamemodes/blob/hud.dm
@@ -0,0 +1,17 @@
+/datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen_midnight.dmi')
+
+ blobpwrdisplay = new /obj/screen()
+ blobpwrdisplay.name = "blob power"
+ blobpwrdisplay.icon_state = "block"
+ blobpwrdisplay.screen_loc = ui_health
+ blobpwrdisplay.layer = 20
+
+ blobhealthdisplay = new /obj/screen()
+ blobhealthdisplay.name = "blob health"
+ blobhealthdisplay.icon_state = "block"
+ blobhealthdisplay.screen_loc = ui_internal
+ blobhealthdisplay.layer = 20
+
+ mymob.client.screen = null
+
+ mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay)
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index dcfc59e1e72..6f7312e629b 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -21,6 +21,11 @@
real_name = new_name
..()
+mob/camera/blob/Life()
+ hud_used.blobpwrdisplay.maptext = "
| Duration: | "
output += "Job: |