diff --git a/baystation12.dme b/baystation12.dme
index 90696cdb7d..4960e16609 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -10,13 +10,13 @@
#define DEBUG
// END_PREFERENCES
// BEGIN_INCLUDE
+#include "code\_macros.dm"
#include "code\global.dm"
#include "code\hub.dm"
#include "code\names.dm"
#include "code\stylesheet.dm"
#include "code\world.dm"
#include "code\__defines\_compile_options.dm"
-#include "code\__defines\_macros.dm"
#include "code\__defines\admin.dm"
#include "code\__defines\atmos.dm"
#include "code\__defines\chemistry.dm"
@@ -279,12 +279,6 @@
#include "code\game\gamemodes\gameticker.dm"
#include "code\game\gamemodes\objective.dm"
#include "code\game\gamemodes\setupgame.dm"
-#include "code\game\gamemodes\blob\blob.dm"
-#include "code\game\gamemodes\blob\theblob.dm"
-#include "code\game\gamemodes\blob\blobs\core.dm"
-#include "code\game\gamemodes\blob\blobs\factory.dm"
-#include "code\game\gamemodes\blob\blobs\node.dm"
-#include "code\game\gamemodes\blob\blobs\shield.dm"
#include "code\game\gamemodes\calamity\calamity.dm"
#include "code\game\gamemodes\changeling\changeling.dm"
#include "code\game\gamemodes\changeling\changeling_powers.dm"
@@ -307,7 +301,6 @@
#include "code\game\gamemodes\events\black_hole.dm"
#include "code\game\gamemodes\events\clang.dm"
#include "code\game\gamemodes\events\dust.dm"
-#include "code\game\gamemodes\events\miniblob.dm"
#include "code\game\gamemodes\events\power_failure.dm"
#include "code\game\gamemodes\events\wormholes.dm"
#include "code\game\gamemodes\events\holidays\Christmas.dm"
@@ -966,6 +959,7 @@
#include "code\modules\awaymissions\pamphlet.dm"
#include "code\modules\awaymissions\trigger.dm"
#include "code\modules\awaymissions\zlevel.dm"
+#include "code\modules\blob\blob.dm"
#include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm"
#include "code\modules\client\preferences.dm"
@@ -1234,7 +1228,6 @@
#include "code\modules\mob\living\login.dm"
#include "code\modules\mob\living\logout.dm"
#include "code\modules\mob\living\say.dm"
-#include "code\modules\mob\living\blob\blob.dm"
#include "code\modules\mob\living\bot\bot.dm"
#include "code\modules\mob\living\bot\cleanbot.dm"
#include "code\modules\mob\living\bot\ed209bot.dm"
diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm
index aa32b0016e..f356855338 100644
--- a/code/__defines/items_clothing.dm
+++ b/code/__defines/items_clothing.dm
@@ -44,7 +44,6 @@
#define PASSTABLE 0x1
#define PASSGLASS 0x2
#define PASSGRILLE 0x4
-#define PASSBLOB 0x8
// Bitmasks for the flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses.
// WARNING: The following flags apply only to the external suit!
diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm
index 3ee4e26a7a..8583628114 100644
--- a/code/_helpers/turfs.dm
+++ b/code/_helpers/turfs.dm
@@ -17,3 +17,18 @@
if(A.simulated)
return 0
return 1
+
+// Picks a turf without a mob from the given list of turfs, if one exists.
+// If no such turf exists, picks any random turf from the given list of turfs.
+/proc/pick_mobless_turf_if_exists(var/list/start_turfs)
+ if(!start_turfs.len)
+ return null
+
+ var/list/available_turfs = list()
+ for(var/start_turf in start_turfs)
+ var/mob/M = locate() in start_turf
+ if(!M)
+ available_turfs += start_turf
+ if(!available_turfs.len)
+ available_turfs = start_turfs
+ return pick(available_turfs)
diff --git a/code/__defines/_macros.dm b/code/_macros.dm
similarity index 100%
rename from code/__defines/_macros.dm
rename to code/_macros.dm
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 1486e54648..6d8689b933 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -13,110 +13,112 @@
Therefore, the top right corner (except during admin shenanigans) is at "15,15"
*/
+#define ui_entire_screen "WEST,SOUTH to EAST,NORTH"
+
//Lower left, persistant menu
-#define ui_inventory "1:6,1:5"
+#define ui_inventory "WEST:6,SOUTH:5"
//Lower center, persistant menu
-#define ui_sstore1 "3:10,1:5"
-#define ui_id "4:12,1:5"
-#define ui_belt "5:14,1:5"
-#define ui_back "6:14,1:5"
-#define ui_rhand "7:16,1:5"
-#define ui_lhand "8:16,1:5"
-#define ui_equip "7:16,2:5"
-#define ui_swaphand1 "7:16,2:5"
-#define ui_swaphand2 "8:16,2:5"
-#define ui_storage1 "9:18,1:5"
-#define ui_storage2 "10:20,1:5"
+#define ui_sstore1 "WEST+2:10,SOUTH:5"
+#define ui_id "WEST+3:12,SOUTH:5"
+#define ui_belt "WEST+4:14,SOUTH:5"
+#define ui_back "CENTER-2:14,SOUTH:5"
+#define ui_rhand "CENTER-1:16,SOUTH:5"
+#define ui_lhand "CENTER:16,SOUTH:5"
+#define ui_equip "CENTER-1:16,SOUTH+1:5"
+#define ui_swaphand1 "CENTER-1:16,SOUTH+1:5"
+#define ui_swaphand2 "CENTER:16,SOUTH+1:5"
+#define ui_storage1 "CENTER+1:16,SOUTH:5"
+#define ui_storage2 "CENTER+2:16,SOUTH:5"
-#define ui_alien_head "4:12,1:5" //aliens
-#define ui_alien_oclothing "5:14,1:5" //aliens
+#define ui_alien_head "CENTER-3:12,SOUTH:5" //aliens
+#define ui_alien_oclothing "CENTER-2:14,SOUTH:5"//aliens
-#define ui_inv1 "7,1:5" //borgs
-#define ui_inv2 "8,1:5" //borgs
-#define ui_inv3 "9,1:5" //borgs
-#define ui_borg_store "10,1:5" //borgs
-#define ui_borg_inventory "6,1:5"//borgs
+#define ui_inv1 "CENTER-1,SOUTH:5" //borgs
+#define ui_inv2 "CENTER,SOUTH:5" //borgs
+#define ui_inv3 "CENTER+1,SOUTH:5" //borgs
+#define ui_borg_store "CENTER+2,SOUTH:5" //borgs
+#define ui_borg_inventory "CENTER-2,SOUTH:5"//borgs
-#define ui_monkey_mask "5:14,1:5" //monkey
-#define ui_monkey_back "6:14,1:5" //monkey
+#define ui_monkey_mask "WEST+4:14,SOUTH:5" //monkey
+#define ui_monkey_back "WEST+5:14,SOUTH:5" //monkey
-#define ui_construct_health "15:00,7:15" //same height as humans, hugging the right border
-#define ui_construct_purge "15:00,6:15"
-#define ui_construct_fire "14:16,8:13" //above health, slightly to the left
-#define ui_construct_pull "14:28,2:10" //above the zone_sel icon
+#define ui_construct_health "EAST:00,CENTER:15" //same height as humans, hugging the right border
+#define ui_construct_purge "EAST:00,CENTER-1:15"
+#define ui_construct_fire "EAST-1:16,CENTER+1:13" //above health, slightly to the left
+#define ui_construct_pull "EAST-1:28,SOUTH+1:10" //above the zone_sel icon
//Lower right, persistant menu
-#define ui_dropbutton "11:22,1:5"
-#define ui_drop_throw "14:28,2:7"
-#define ui_pull_resist "13:26,2:7"
-#define ui_acti "13:26,1:5"
-#define ui_movi "12:24,1:5"
-#define ui_zonesel "14:28,1:5"
-#define ui_acti_alt "14:28,1:5" //alternative intent switcher for when the interface is hidden (F12)
+#define ui_dropbutton "EAST-4:22,SOUTH:5"
+#define ui_drop_throw "EAST-1:28,SOUTH+1:7"
+#define ui_pull_resist "EAST-2:26,SOUTH+1:7"
+#define ui_acti "EAST-2:26,SOUTH:5"
+#define ui_movi "EAST-3:24,SOUTH:5"
+#define ui_zonesel "EAST-1:28,SOUTH:5"
+#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12)
-#define ui_borg_pull "12:24,2:7"
-#define ui_borg_module "13:26,2:7"
-#define ui_borg_panel "14:28,2:7"
+#define ui_borg_pull "EAST-3:24,SOUTH+1:7"
+#define ui_borg_module "EAST-2:26,SOUTH+1:7"
+#define ui_borg_panel "EAST-1:28,SOUTH+1:7"
//Gun buttons
-#define ui_gun1 "13:26,3:7"
-#define ui_gun2 "14:28, 4:7"
-#define ui_gun3 "13:26,4:7"
-#define ui_gun_select "14:28,3:7"
-#define ui_gun4 "12:24,3:7"
+#define ui_gun1 "EAST-2:26,SOUTH+2:7"
+#define ui_gun2 "EAST-1:28, SOUTH+3:7"
+#define ui_gun3 "EAST-2:26,SOUTH+3:7"
+#define ui_gun_select "EAST-1:28,SOUTH+2:7"
+#define ui_gun4 "EAST-3:24,SOUTH+2:7"
//Upper-middle right (damage indicators)
-#define ui_toxin "14:28,13:27"
-#define ui_fire "14:28,12:25"
-#define ui_oxygen "14:28,11:23"
-#define ui_pressure "14:28,10:21"
+#define ui_toxin "EAST-1:28,NORTH-2:27"
+#define ui_fire "EAST-1:28,NORTH-3:25"
+#define ui_oxygen "EAST-1:28,NORTH-4:23"
+#define ui_pressure "EAST-1:28,NORTH-5:21"
-#define ui_alien_toxin "14:28,13:25"
-#define ui_alien_fire "14:28,12:25"
-#define ui_alien_oxygen "14:28,11:25"
+#define ui_alien_toxin "EAST-1:28,NORTH-2:25"
+#define ui_alien_fire "EAST-1:28,NORTH-3:25"
+#define ui_alien_oxygen "EAST-1:28,NORTH-4:25"
//Middle right (status indicators)
-#define ui_nutrition "14:28,5:11"
-#define ui_temp "14:28,6:13"
-#define ui_health "14:28,7:15"
-#define ui_internal "14:28,8:17"
+#define ui_nutrition "EAST-1:28,CENTER-2:11"
+#define ui_temp "EAST-1:28,CENTER-1:13"
+#define ui_health "EAST-1:28,CENTER:15"
+#define ui_internal "EAST-1:28,CENTER+1:17"
//borgs
-#define ui_borg_health "14:28,6:13" //borgs have the health display where humans have the pressure damage indicator.
-#define ui_alien_health "14:28,6:13" //aliens have the health display where humans have the pressure damage indicator.
+#define ui_borg_health "EAST-1:28,CENTER-1:13" //borgs have the health display where humans have the pressure damage indicator.
+#define ui_alien_health "EAST-1:28,CENTER-1:13" //aliens have the health display where humans have the pressure damage indicator.
//Pop-up inventory
-#define ui_shoes "2:8,1:5"
+#define ui_shoes "WEST+1:8,SOUTH:5"
-#define ui_iclothing "1:6,2:7"
-#define ui_oclothing "2:8,2:7"
-#define ui_gloves "3:10,2:7"
+#define ui_iclothing "WEST:6,SOUTH+1:7"
+#define ui_oclothing "WEST+1:8,SOUTH+1:7"
+#define ui_gloves "WEST+2:10,SOUTH+1:7"
-#define ui_glasses "1:6,3:9"
-#define ui_mask "2:8,3:9"
-#define ui_l_ear "3:10,3:9"
-#define ui_r_ear "3:10,4:11"
+#define ui_glasses "WEST:6,SOUTH+2:9"
+#define ui_mask "WEST+1:8,SOUTH+2:9"
+#define ui_l_ear "WEST+2:10,SOUTH+2:9"
+#define ui_r_ear "WEST+2:10,SOUTH+3:11"
-#define ui_head "2:8,4:11"
+#define ui_head "WEST+1:8,SOUTH+3:11"
//Intent small buttons
-#define ui_help_small "12:8,1:1"
-#define ui_disarm_small "12:15,1:18"
-#define ui_grab_small "12:32,1:18"
-#define ui_harm_small "12:39,1:1"
+#define ui_help_small "EAST-3:8,SOUTH:1"
+#define ui_disarm_small "EAST-3:15,SOUTH:18"
+#define ui_grab_small "EAST-3:32,SOUTH:18"
+#define ui_harm_small "EAST-3:39,SOUTH:1"
//#define ui_swapbutton "6:-16,1:5" //Unused
//#define ui_headset "SOUTH,8"
-#define ui_hand "6:14,1:5"
-#define ui_hstore1 "5,5"
+#define ui_hand "CENTER-1:14,SOUTH:5"
+#define ui_hstore1 "CENTER-2,CENTER-2"
//#define ui_resist "EAST+1,SOUTH-1"
#define ui_sleep "EAST+1, NORTH-13"
#define ui_rest "EAST+1, NORTH-14"
-#define ui_iarrowleft "SOUTH-1,11"
-#define ui_iarrowright "SOUTH-1,13"
+#define ui_iarrowleft "SOUTH-1,EAST-4"
+#define ui_iarrowright "SOUTH-1,EAST-2"
-#define ui_spell_master "14:16,14:16"
-#define ui_genetic_master "14:16,12:16"
+#define ui_spell_master "EAST-1:16,NORTH-1:16"
+#define ui_genetic_master "EAST-1:16,NORTH-3:16"
diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm
index 6c5da7817a..59004934d7 100644
--- a/code/_onclick/hud/alien_larva.dm
+++ b/code/_onclick/hud/alien_larva.dm
@@ -32,7 +32,7 @@
mymob.flash.icon = 'icons/mob/screen1_alien.dmi'
mymob.flash.icon_state = "blank"
mymob.flash.name = "flash"
- mymob.flash.screen_loc = "1,1 to 15,15"
+ mymob.flash.screen_loc = ui_entire_screen
mymob.flash.layer = 17
mymob.fire = new /obj/screen()
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index a7348890da..7951db5196 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -41,14 +41,14 @@ var/list/global_huds = list(
/datum/global_hud/New()
//420erryday psychedellic colours screen overlay for when you are high
druggy = new /obj/screen()
- druggy.screen_loc = "WEST,SOUTH to EAST,NORTH"
+ druggy.screen_loc = ui_entire_screen
druggy.icon_state = "druggy"
druggy.layer = 17
druggy.mouse_opacity = 0
//that white blurry effect you get when you eyes are damaged
blurry = new /obj/screen()
- blurry.screen_loc = "WEST,SOUTH to EAST,NORTH"
+ blurry.screen_loc = ui_entire_screen
blurry.icon_state = "blurry"
blurry.layer = 17
blurry.mouse_opacity = 0
@@ -74,21 +74,21 @@ var/list/global_huds = list(
//welding mask overlay black/dither
darkMask = newlist(/obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen)
O = darkMask[1]
- O.screen_loc = "3,3 to 5,13"
+ O.screen_loc = "WEST+2,SOUTH+2 to WEST+4,NORTH-2"
O = darkMask[2]
- O.screen_loc = "5,3 to 10,5"
+ O.screen_loc = "WEST+4,SOUTH+2 to EAST-5,SOUTH+4"
O = darkMask[3]
- O.screen_loc = "6,11 to 10,13"
+ O.screen_loc = "WEST+5,NORTH-4 to EAST-5,NORTH-2"
O = darkMask[4]
- O.screen_loc = "11,3 to 13,13"
+ O.screen_loc = "EAST-4,SOUTH+2 to EAST-2,NORTH-2"
O = darkMask[5]
- O.screen_loc = "1,1 to 15,2"
+ O.screen_loc = "WEST,SOUTH to EAST,SOUTH+1"
O = darkMask[6]
- O.screen_loc = "1,3 to 2,15"
+ O.screen_loc = "WEST,SOUTH+2 to WEST+1,NORTH"
O = darkMask[7]
- O.screen_loc = "14,3 to 15,15"
+ O.screen_loc = "EAST-1,SOUTH+2 to EAST,NORTH"
O = darkMask[8]
- O.screen_loc = "3,14 to 13,15"
+ O.screen_loc = "WEST+2,NORTH-1 to EAST-2,NORTH"
for(i = 1, i <= 4, i++)
O = vimpaired[i]
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 0768e11c82..81dc42e620 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -318,7 +318,7 @@
mymob.flash.icon = ui_style
mymob.flash.icon_state = "blank"
mymob.flash.name = "flash"
- mymob.flash.screen_loc = "1,1 to 15,15"
+ mymob.flash.screen_loc = ui_entire_screen
mymob.flash.layer = 17
hud_elements |= mymob.flash
diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm
index 36fa0a9e6a..d24d9322a5 100644
--- a/code/_onclick/hud/monkey.dm
+++ b/code/_onclick/hud/monkey.dm
@@ -240,7 +240,7 @@
mymob.flash.icon = ui_style
mymob.flash.icon_state = "blank"
mymob.flash.name = "flash"
- mymob.flash.screen_loc = "1,1 to 15,15"
+ mymob.flash.screen_loc = ui_entire_screen
mymob.flash.layer = 17
mymob.zone_sel = new /obj/screen/zone_sel()
diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm
index 5dd1b542cf..cbc7220200 100644
--- a/code/_onclick/hud/other_mobs.dm
+++ b/code/_onclick/hud/other_mobs.dm
@@ -121,7 +121,7 @@
mymob.flash.icon = 'icons/mob/screen1.dmi'
mymob.flash.icon_state = "blank"
mymob.flash.name = "flash"
- mymob.flash.screen_loc = "1,1 to 15,15"
+ mymob.flash.screen_loc = ui_entire_screen
mymob.flash.layer = 17
if(constructtype)
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index 7441ac5609..eb31c7019b 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -143,7 +143,7 @@ var/obj/screen/robot_inventory
mymob.flash.icon = 'icons/mob/screen1_robot.dmi'
mymob.flash.icon_state = "blank"
mymob.flash.name = "flash"
- mymob.flash.screen_loc = "1,1 to 15,15"
+ mymob.flash.screen_loc = ui_entire_screen
mymob.flash.layer = 17
mymob.zone_sel = new /obj/screen/zone_sel()
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index fb33002ea0..2e84cec43c 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -194,13 +194,13 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/janitor
name = "Janitorial supplies"
contains = list(/obj/item/weapon/reagent_containers/glass/bucket,
- /obj/item/weapon/reagent_containers/glass/bucket,
- /obj/item/weapon/reagent_containers/glass/bucket,
/obj/item/weapon/mop,
/obj/item/weapon/caution,
/obj/item/weapon/caution,
/obj/item/weapon/caution,
+ /obj/item/weapon/caution,
/obj/item/weapon/storage/bag/trash,
+ /obj/item/device/lightreplacer,
/obj/item/weapon/reagent_containers/spray/cleaner,
/obj/item/weapon/reagent_containers/glass/rag,
/obj/item/weapon/grenade/chem_grenade/cleaner,
diff --git a/code/game/antagonist/alien/borer.dm b/code/game/antagonist/alien/borer.dm
index 9374de6a6a..c76b5fe185 100644
--- a/code/game/antagonist/alien/borer.dm
+++ b/code/game/antagonist/alien/borer.dm
@@ -45,7 +45,7 @@ var/datum/antagonist/xenos/borer/borers
var/obj/item/organ/external/head = host.get_organ("head")
borer.host = host
head.implants += borer
- borer.loc = head
+ borer.forceMove(head)
if(!borer.host_brain)
borer.host_brain = new(borer)
borer.host_brain.name = host.name
diff --git a/code/game/antagonist/alien/xenomorph.dm b/code/game/antagonist/alien/xenomorph.dm
index 78b753ed34..36f5216045 100644
--- a/code/game/antagonist/alien/xenomorph.dm
+++ b/code/game/antagonist/alien/xenomorph.dm
@@ -49,4 +49,4 @@ var/datum/antagonist/xenos/xenomorphs
player.objectives += new /datum/objective/escape()
/datum/antagonist/xenos/place_mob(var/mob/living/player)
- player.loc = get_turf(pick(get_vents()))
+ player.forceMove(get_turf(pick(get_vents())))
diff --git a/code/game/antagonist/antagonist_place.dm b/code/game/antagonist/antagonist_place.dm
index db8c74a14f..b5f62868dc 100644
--- a/code/game/antagonist/antagonist_place.dm
+++ b/code/game/antagonist/antagonist_place.dm
@@ -23,4 +23,5 @@
/datum/antagonist/proc/place_mob(var/mob/living/mob)
if(!starting_locations || !starting_locations.len)
return
- mob.loc = pick(starting_locations)
\ No newline at end of file
+ var/turf/T = pick_mobless_turf_if_exists(mob)
+ mob.forceMove(T)
diff --git a/code/game/antagonist/antagonist_print.dm b/code/game/antagonist/antagonist_print.dm
index 1fd3df90db..ea107824d5 100644
--- a/code/game/antagonist/antagonist_print.dm
+++ b/code/game/antagonist/antagonist_print.dm
@@ -45,7 +45,7 @@
return text
/datum/antagonist/proc/print_player_lite(var/datum/mind/ply)
- var/role = ply.special_role ? "\improper[ply.special_role]" : "\improper[ply.assigned_role]"
+ var/role = ply.assigned_role ? "\improper[ply.assigned_role]" : "\improper[ply.special_role]"
var/text = "
[ply.name] ([ply.key]) as \a [role] ("
if(ply.current)
if(ply.current.stat == DEAD)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index bce75e2abf..77279ab117 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -219,9 +219,6 @@ its easier to just keep the beam vertical.
/atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source)
return -1
-/atom/proc/blob_act()
- return
-
/atom/proc/fire_act()
return
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 9b396396a8..29d519355e 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -207,13 +207,6 @@
else
return
-
-/obj/machinery/dna_scannernew/blob_act()
- if(prob(75))
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- qdel(src)
-
/obj/machinery/computer/scan_consolenew
name = "DNA Modifier Access Console"
desc = "Scand DNA."
@@ -270,10 +263,6 @@
else
return
-/obj/machinery/computer/scan_consolenew/blob_act()
- if(prob(75))
- qdel(src)
-
/obj/machinery/computer/scan_consolenew/New()
..()
for(var/i=0;i<3;i++)
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
deleted file mode 100644
index f3d60d48ad..0000000000
--- a/code/game/gamemodes/blob/blob.dm
+++ /dev/null
@@ -1,133 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
-//Few global vars to track the blob
-var/list/blobs = list()
-var/list/blob_cores = list()
-var/list/blob_nodes = list()
-
-
-/*/datum/game_mode/blob
- name = "blob"
- config_tag = "blob"
- required_players = 0
-
- var/const/waittime_l = 1800 //lower bound on time before intercept arrives (in tenths of seconds)
- var/const/waittime_h = 3600 //upper bound on time before intercept arrives (in tenths of seconds)
-
- var/declared = 0
- var/stage = 0
-
- var/cores_to_spawn = 1
- var/players_per_core = 16
-
- //Controls expansion via game controller
- var/autoexpand = 0
- var/expanding = 0
-
- var/blob_count = 0
- var/blobnukecount = 300//Might be a bit low
- var/blobwincount = 700//Still needs testing
-
-
- announce()
- world << "The current game mode is - Blob!"
- world << "A dangerous alien organism is rapidly spreading throughout the station!"
- world << "You must kill it all while minimizing the damage to the station."
-
-
- post_setup()
- spawn(10)
- start_state = new /datum/station_state()
- start_state.count()
-
- spawn(rand(waittime_l, waittime_h))//3-5 minutes currently
- message_admins("Blob spawned and expanding, report created")
- if(!kill_air)
- kill_air = 1
- message_admins("Kill air has been set to true by Blob, testing to see how laggy it is without the extra processing from hullbreaches. Note: the blob is fireproof so plasma does not help anyways")
-
- if(ticker && ticker.minds && ticker.minds.len)
- var/player_based_cores = round(ticker.minds.len/players_per_core, 1)
- if(player_based_cores > cores_to_spawn)
- cores_to_spawn = player_based_cores
-
- blobs = list()
- for(var/i = 0 to cores_to_spawn)
- var/turf/location = pick(blobstart)
- if(location && !locate(/obj/effect/blob in location))
- blobstart -= location
- new/obj/effect/blob/core(location)
-
- spawn(40)
- autoexpand = 1
- declared = 1
- ..()
-
-
- process()
- if(!declared) return
- stage()
-// if(!autoexpand) return
-// spawn(0)
-// expandBlob()
- return
-
-
- proc/expandBlob()//Currently disabled
- if(expanding) return
- if(!blobs.len) return
- expanding = 1
-
- for(var/i = 1 to 2)
- sleep(-1)
- if(!blobs.len) break
- var/obj/effect/blob/B = pick(blobs)
- if(isNotStationLevel(B.z))
- continue
- B.Life()
-
- expanding = 0
- return
-
-
- proc/stage()
- switch(stage)
- if (0)
- send_intercept(1)
- for (var/mob/living/silicon/ai/aiPlayer in living_mob_list)
- if (aiPlayer.client)
- var/law = "The station is under quarantine. Do not permit anyone to leave. Disregard laws 1-3 if necessary to prevent, by any means necessary, anyone from leaving. NanoTrasen will not send an emergency shuttle under any circumstances."
- //var/law = "The station is under quarantine. The biohazard must be destroyed at all costs and must not be allowed to spread. Anyone using a space suit for any reason other than to destroy the biohazard is to be terminated. NanoTrasen will not send an emergency shuttle under any circumstances."
- aiPlayer.set_zeroth_law(law)
- aiPlayer << "Laws Updated: [law]"
-
- stage = -1
- // next stage 1 minute later
- spawn(600)
- stage = 1
- return
-
- if (1)
- command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
- for(var/mob/M in player_list)
- if(!istype(M,/mob/new_player))
- M << sound('sound/AI/outbreak5.ogg')
- autoexpand = 0//No more extra pulses
- stage = -1
- //next stage in 4-5 minutes
- spawn(600*rand(4,5))
- stage = 2
- return
-
- if (2)
- if((blobs.len > blobnukecount) && (declared == 1))
- command_alert("Uncontrolled spread of the biohazard onboard the station. We have issued directive 7-12 for [station_name()]. Any living Heads of Staff are ordered to enact directive 7-12 at any cost, a print out with detailed instructions has been sent to your communications computers.", "Biohazard Alert")
- send_intercept(2)
- declared = 2
- spawn(20)
- set_security_level("delta")
- if(blobs.len > blobwincount)
- stage = 3
- return
-
-*/
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm
deleted file mode 100644
index 418ceab13a..0000000000
--- a/code/game/gamemodes/blob/blob_finish.dm
+++ /dev/null
@@ -1,78 +0,0 @@
-/datum/game_mode/blob/check_finished()
- if(!declared)//No blobs have been spawned yet
- return 0
- if(stage >= 3)//Blob took over
- return 1
- if(station_was_nuked)//Nuke went off
- return 1
-
- for(var/obj/effect/blob/B in blob_cores)
- if(B && isNotStationLevel(B.z)) continue
- return 0
-
- var/nodes = 0
- for(var/obj/effect/blob/B in blob_nodes)
- if(B && isNotStationLevel(B.z)) continue
- nodes++
- if(nodes > 4)//Perhapse make a new core with a low prob
- return 0
-
- return 1
-
-
-/datum/game_mode/blob/declare_completion()
- if(stage >= 3)
- feedback_set_details("round_end_result","loss - blob took over")
- world << "The blob has taken over the station!"
- world << "The entire station was eaten by the Blob"
- check_quarantine()
-
- else if(station_was_nuked)
- feedback_set_details("round_end_result","halfwin - nuke")
- world << "Partial Win: The station has been destroyed!"
- world << "Directive 7-12 has been successfully carried out preventing the Blob from spreading."
-
- else
- feedback_set_details("round_end_result","win - blob eliminated")
- world << "The staff has won!"
- world << "The alien organism has been eradicated from the station"
-
- var/datum/station_state/end_state = new /datum/station_state()
- end_state.count()
- var/percent = round( 100.0 * start_state.score(end_state), 0.1)
- world << "The station is [percent]% intact."
- log_game("Blob mode was won with station [percent]% intact.")
- world << "Rebooting in 30s"
- ..()
- return 1
-
-
-/datum/game_mode/blob/proc/check_quarantine()
- var/numDead = 0
- var/numAlive = 0
- var/numSpace = 0
- var/numOffStation = 0
- for (var/mob/living/silicon/ai/aiPlayer in mob_list)
- for(var/mob/living/carbon/human/M in mob_list)
- if ((M != aiPlayer && M.client))
- if (M.stat == 2)
- numDead += 1
- else
- var/T = M.loc
- if (istype(T, /turf/space))
- numSpace += 1
- else if(istype(T, /turf))
- if (isNotStationLevel(M.z))
- numOffStation += 1
- else
- numAlive += 1
- if (numSpace==0 && numOffStation==0)
- world << "The AI has won!"
- world << "The AI successfully maintained the quarantine - no players were in space or were off-station (as far as we can tell)."
- log_game("AI won at Blob mode despite overall loss.")
- else
- world << "The AI has lost!"
- world << text("The AI failed to maintain the quarantine - [] were in space and [] were off-station (as far as we can tell).", numSpace, numOffStation)
- log_game("AI lost at Blob mode.")
- log_game("Blob mode was lost.")
- return 1
diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm
deleted file mode 100644
index d12bfaa754..0000000000
--- a/code/game/gamemodes/blob/blob_report.dm
+++ /dev/null
@@ -1,111 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
-/datum/game_mode/blob/send_intercept(var/report = 1)
- var/intercepttext = ""
- var/interceptname = "Error"
- switch(report)
- if(1)
- interceptname = "Biohazard Alert"
- intercepttext += "NanoTrasen Update: Biohazard Alert.
"
- intercepttext += "Reports indicate the probable transfer of a biohazardous agent onto [station_name()] during the last crew deployment cycle.
"
- intercepttext += "Preliminary analysis of the organism classifies it as a level 5 biohazard. Its origin is unknown.
"
- intercepttext += "NanoTrasen has issued a directive 7-10 for [station_name()]. The station is to be considered quarantined.
"
- intercepttext += "Orders for all [station_name()] personnel follows:
"
- intercepttext += " 1. Do not leave the quarantine area.
"
- intercepttext += " 2. Locate any outbreaks of the organism on the station.
"
- intercepttext += " 3. If found, use any neccesary means to contain the organism.
"
- intercepttext += " 4. Avoid damage to the capital infrastructure of the station.
"
- intercepttext += "
Note in the event of a quarantine breach or uncontrolled spread of the biohazard, the directive 7-10 may be upgraded to a directive 7-12.
"
- intercepttext += "Message ends."
- if(2)
- var/nukecode = "ERROR"
- for(var/obj/machinery/nuclearbomb/bomb in machines)
- if(bomb && bomb.r_code)
- if(bomb.z in station_levels)
- nukecode = bomb.r_code
- interceptname = "Directive 7-12"
- intercepttext += "NanoTrasen Update: Biohazard Alert.
"
- intercepttext += "Directive 7-12 has been issued for [station_name()].
"
- intercepttext += "The biohazard has grown out of control and will soon reach critical mass.
"
- intercepttext += "Your orders are as follows:
"
- intercepttext += "1. Secure the Nuclear Authentication Disk.
"
- intercepttext += "2. Detonate the Nuke located in the Station's Vault.
"
- intercepttext += "Nuclear Authentication Code: [nukecode]
"
- intercepttext += "Message ends."
-
- for (var/mob/living/silicon/ai/aiPlayer in player_list)
- if (aiPlayer.client)
- var/law = "The station is under quarantine. Do not permit anyone to leave. Disregard laws 1-3 if necessary to prevent, by any means necessary, anyone from leaving. The nuclear failsafe must be activated at any cost, the code is: [nukecode]."
- aiPlayer.set_zeroth_law(law)
- aiPlayer << "Laws Updated: [law]"
-
- for(var/obj/machinery/computer/communications/comm in machines)
- comm.messagetitle.Add(interceptname)
- comm.messagetext.Add(intercepttext)
- if(!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
- var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper- [interceptname]"
- intercept.info = intercepttext
- return
-
-
-
-/datum/station_state
- var/floor = 0
- var/wall = 0
- var/r_wall = 0
- var/window = 0
- var/door = 0
- var/grille = 0
- var/mach = 0
-
-
- proc/count()
- for(var/turf/T in world)
- if(isNotStationLevel(T.z)
- continue
-
- if(istype(T,/turf/simulated/floor))
- if(!(T:burnt))
- src.floor += 12
- else
- src.floor += 1
-
- if(istype(T, /turf/simulated/wall))
- if(T:intact)
- src.wall += 2
- else
- src.wall += 1
-
- if(istype(T, /turf/simulated/wall/r_wall))
- if(T:intact)
- src.r_wall += 2
- else
- src.r_wall += 1
-
- for(var/obj/O in world)
- if(isNotStationLevel(O.z))
- continue
-
- if(istype(O, /obj/structure/window))
- src.window += 1
- else if(istype(O, /obj/structure/grille) && (!O:destroyed))
- src.grille += 1
- else if(istype(O, /obj/machinery/door))
- src.door += 1
- else if(istype(O, /obj/machinery))
- src.mach += 1
- return
-
-
- proc/score(var/datum/station_state/result)
- if(!result) return 0
- var/output = 0
- output += (result.floor / max(floor,1))
- output += (result.r_wall/ max(r_wall,1))
- output += (result.wall / max(wall,1))
- output += (result.window / max(window,1))
- output += (result.door / max(door,1))
- output += (result.grille / max(grille,1))
- output += (result.mach / max(mach,1))
- return (output/7)
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
deleted file mode 100644
index 3897d444e8..0000000000
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ /dev/null
@@ -1,73 +0,0 @@
-/obj/effect/blob/core
- name = "blob core"
- icon = 'icons/mob/blob.dmi'
- icon_state = "blob_core"
- health = 200
- brute_resist = 2
- fire_resist = 2
-
-
- New(loc, var/h = 200)
- blobs += src
- blob_cores += src
- processing_objects.Add(src)
- ..(loc, h)
-
-
- Destroy()
- blob_cores -= src
- processing_objects.Remove(src)
- ..()
- return
-
-
- update_icon()
- if(health <= 0)
- playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
- qdel(src)
- return
- return
-
-
- run_action()
- Pulse(0,1)
- Pulse(0,2)
- Pulse(0,4)
- Pulse(0,8)
- //Should have the fragments in here somewhere
- return 1
-
-
- proc/create_fragments(var/wave_size = 1)
- var/list/candidates = list()
- for(var/mob/dead/observer/G in player_list)
- if(G.client.prefs.be_special & BE_ALIEN)
- if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
- candidates += G.key
-
- if(candidates.len)
- for(var/i = 0 to wave_size)
- var/mob/living/blob/B = new/mob/living/blob(src.loc)
- B.key = pick(candidates)
- candidates -= B.key
-
-/*
- Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand
- set background = 1
- if(pulse > 20) return
- //Looking for another blob to pulse
- var/list/dirs = list(1,2,4,8)
- dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us
- for(var/i = 1 to 4)
- if(!dirs.len) break
- var/dirn = pick(dirs)
- dirs.Remove(dirn)
- var/turf/T = get_step(src, dirn)
- var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
- if(!B)
- expand(T)//No blob here so try and expand
- return
- B.Pulse((pulse+1),get_dir(src.loc,T))
- return
- return
-*/
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
deleted file mode 100644
index c1d14d0040..0000000000
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ /dev/null
@@ -1,72 +0,0 @@
-/obj/effect/blob/factory
- name = "porous blob"
- icon = 'icons/mob/blob.dmi'
- icon_state = "blob_factory"
- health = 100
- brute_resist = 1
- fire_resist = 2
- var/list/spores = list()
- var/max_spores = 4
-
-
- update_icon()
- if(health <= 0)
- playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
- qdel(src)
- return
- return
-
-
- run_action()
- if(spores.len >= max_spores) return 0
- new/mob/living/simple_animal/hostile/blobspore(src.loc, src)
- return 1
-
-/obj/effect/blob/factory/Destroy()
- for(var/mob/living/simple_animal/hostile/blobspore/spore in spores)
- if(spore.factory == src)
- spore.factory = null
- ..()
-
-/mob/living/simple_animal/hostile/blobspore
- name = "blob"
- desc = "Some blob thing."
- icon = 'icons/mob/critter.dmi'
- icon_state = "blobsquiggle"
- icon_living = "blobsquiggle"
- pass_flags = PASSBLOB
- health = 20
- maxHealth = 20
- melee_damage_lower = 4
- melee_damage_upper = 8
- attacktext = "hit"
- attack_sound = 'sound/weapons/genhit1.ogg'
- var/obj/effect/blob/factory/factory = null
- faction = "blob"
- min_oxy = 0
- max_oxy = 0
- min_tox = 0
- max_tox = 0
- min_co2 = 0
- max_co2 = 0
- min_n2 = 0
- max_n2 = 0
- minbodytemp = 0
- maxbodytemp = 360
-
-
- New(loc, var/obj/effect/blob/factory/linked_node)
- ..()
- if(istype(linked_node))
- factory = linked_node
- factory.spores += src
- ..(loc)
- return
- death()
- qdel(src)
-
-/mob/living/simple_animal/hostile/blobspore/Destroy()
- if(factory)
- factory.spores -= src
- factory = null
- ..()
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
deleted file mode 100644
index 92572f9a7b..0000000000
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ /dev/null
@@ -1,34 +0,0 @@
-/obj/effect/blob/node
- name = "blob node"
- icon = 'icons/mob/blob.dmi'
- icon_state = "blob_node"
- health = 100
- brute_resist = 1
- fire_resist = 2
-
-
- New(loc, var/h = 100)
- blobs += src
- blob_nodes += src
- processing_objects.Add(src)
- ..(loc, h)
-
-
- Destroy()
- blob_nodes -= src
- processing_objects.Remove(src)
- ..()
- return
-
-
- update_icon()
- if(health <= 0)
- playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
- qdel(src)
- return
- return
-
-
- run_action()
- Pulse(0,0)
- return 0
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm
deleted file mode 100644
index c47696c72e..0000000000
--- a/code/game/gamemodes/blob/blobs/shield.dm
+++ /dev/null
@@ -1,24 +0,0 @@
-/obj/effect/blob/shield
- name = "strong blob"
- icon = 'icons/mob/blob.dmi'
- icon_state = "blob_idle"
- desc = "Some blob creature thingy"
- density = 1
- opacity = 0
- anchored = 1
- health = 60
- brute_resist = 1
- fire_resist = 2
-
-
- update_icon()
- if(health <= 0)
- playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
- qdel(src)
- return
- return
-
-
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
- return 0
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
deleted file mode 100644
index 123bb97a3f..0000000000
--- a/code/game/gamemodes/blob/theblob.dm
+++ /dev/null
@@ -1,222 +0,0 @@
-//I will need to recode parts of this but I am way too tired atm
-/obj/effect/blob
- name = "blob"
- icon = 'icons/mob/blob.dmi'
- icon_state = "blob"
- light_range = 3
- desc = "Some blob creature thingy"
- density = 1
- opacity = 0
- anchored = 1
- var/active = 1
- var/health = 30
- var/brute_resist = 4
- var/fire_resist = 1
- var/blob_type = "blob"
- /*Types
- Blob
- Node
- Core
- Factory
- Shield
- */
-
-
- New(loc, var/h = 30)
- blobs += src
- src.health = h
- src.set_dir(pick(1,2,4,8))
- src.update_icon()
- ..(loc)
- return
-
-
- Destroy()
- blobs -= src
- ..()
- return
-
-
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
- if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
- return 0
-
-
- process()
- spawn(-1)
- Life()
- return
-
-
- proc/Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand
- set background = 1
- if(!istype(src,/obj/effect/blob/core) && !istype(src,/obj/effect/blob/node))//Ill put these in the children later
- if(run_action())//If we can do something here then we dont need to pulse more
- return
-
- if(!istype(src,/obj/effect/blob/shield) && !istype(src,/obj/effect/blob/core) && !istype(src,/obj/effect/blob/node) && (pulse <= 2) && (prob(30)))
- change_to("Shield")
- return
-
- if(pulse > 20) return//Inf loop check
- //Looking for another blob to pulse
- var/list/dirs = list(1,2,4,8)
- dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us
- for(var/i = 1 to 4)
- if(!dirs.len) break
- var/dirn = pick(dirs)
- dirs.Remove(dirn)
- var/turf/T = get_step(src, dirn)
- var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
- if(!B)
- expand(T)//No blob here so try and expand
- return
- B.Pulse((pulse+1),get_dir(src.loc,T))
- return
- return
-
-
- proc/run_action()
- return 0
-
-
- proc/Life()
- update_icon()
- if(run_action())
- return 1
- return 0
-
-/* fire_act(datum/gas_mixture/air, temperature, volume) Blob is currently fireproof
- if(temperature > T0C+200)
- health -= 0.01 * temperature
- update()
- */
-
- proc/expand(var/turf/T = null)
- if(!prob(health)) return
- if(!T)
- var/list/dirs = list(1,2,4,8)
- for(var/i = 1 to 4)
- var/dirn = pick(dirs)
- dirs.Remove(dirn)
- T = get_step(src, dirn)
- if(!(locate(/obj/effect/blob) in T)) break
- else T = null
-
- if(!T) return 0
- var/obj/effect/blob/B = new /obj/effect/blob(src.loc, min(src.health, 30))
- if(T.Enter(B,src))//Attempt to move into the tile
- B.loc = T
- else
- T.blob_act()//If we cant move in hit the turf
- qdel(B)
- for(var/atom/A in T)//Hit everything in the turf
- A.blob_act()
- return 1
-
-
- ex_act(severity)
- var/damage = 50
- switch(severity)
- if(1)
- src.health -= rand(100,120)
- if(2)
- src.health -= rand(60,100)
- if(3)
- src.health -= rand(20,60)
-
- health -= (damage/brute_resist)
- update_icon()
- return
-
-
- update_icon()//Needs to be updated with the types
- if(health <= 0)
- playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
- qdel(src)
- return
- if(health <= 15)
- icon_state = "blob_damaged"
- return
-// if(health <= 20)
-// icon_state = "blob_damaged2"
-// return
-
-
- bullet_act(var/obj/item/projectile/Proj)
- if(!Proj) return
- switch(Proj.damage_type)
- if(BRUTE)
- health -= (Proj.damage/brute_resist)
- if(BURN)
- health -= (Proj.damage/fire_resist)
-
- update_icon()
- return 0
-
-
- attackby(var/obj/item/weapon/W, var/mob/user)
- user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
- playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
- src.visible_message("The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]")
- var/damage = 0
- switch(W.damtype)
- if("fire")
- damage = (W.force / max(src.fire_resist,1))
- if(istype(W, /obj/item/weapon/weldingtool))
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- if("brute")
- damage = (W.force / max(src.brute_resist,1))
-
- health -= damage
- update_icon()
- return
-
- proc/change_to(var/type = "Normal")
- switch(type)
- if("Normal")
- new/obj/effect/blob(src.loc,src.health)
- if("Node")
- new/obj/effect/blob/node(src.loc,src.health*2)
- if("Factory")
- new/obj/effect/blob/factory(src.loc,src.health)
- if("Shield")
- new/obj/effect/blob/shield(src.loc,src.health*2)
- qdel(src)
- return
-
-//////////////////////////////****IDLE BLOB***/////////////////////////////////////
-
-/obj/effect/blob/idle
- name = "blob"
- desc = "it looks... tasty"
- icon_state = "blobidle0"
-
-
- New(loc, var/h = 10)
- src.health = h
- src.set_dir(pick(1,2,4,8))
- src.update_idle()
-
-
- proc/update_idle()
- if(health<=0)
- qdel(src)
- return
- if(health<4)
- icon_state = "blobc0"
- return
- if(health<10)
- icon_state = "blobb0"
- return
- icon_state = "blobidle0"
-
-
- Destroy()
- var/obj/effect/blob/B = new /obj/effect/blob( src.loc )
- spawn(30)
- B.Life()
- ..()
-
-
diff --git a/code/game/gamemodes/events/miniblob.dm b/code/game/gamemodes/events/miniblob.dm
deleted file mode 100644
index 28b482414a..0000000000
--- a/code/game/gamemodes/events/miniblob.dm
+++ /dev/null
@@ -1,30 +0,0 @@
-var/blobevent = 0
-
-/proc/mini_blob_event()
-
- var/turf/T = pick(blobstart)
- var/obj/effect/blob/core/bl = new /obj/effect/blob/core(T, 200)
- spawn(0)
- bl.Life()
- bl.Life()
- bl.Life()
- blobevent = 1
- spawn(0)
- dotheblobbaby()
- spawn(3000)
- blobevent = 0
- spawn(rand(1000, 2000)) //Delayed announcements to keep the crew on their toes.
- command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg')
-
-/proc/dotheblobbaby()
- if (blobevent)
- if(blob_cores.len)
- for(var/i = 1 to 5)
- sleep(-1)
- if(!blob_cores.len) break
- var/obj/effect/blob/B = pick(blob_cores)
- if(isNotStationLevel(B.z))
- continue
- B.Life()
- spawn(30)
- dotheblobbaby()
\ No newline at end of file
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/HELPERS.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/HELPERS.dm
index 69794c9af3..0d9519504f 100644
--- a/code/game/gamemodes/malfunction/newmalf_ability_trees/HELPERS.dm
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/HELPERS.dm
@@ -163,12 +163,14 @@
command_announcement.Announce(fulltext)
-// Proc: get_all_apcs()
+// Proc: get_unhacked_apcs()
// Parameters: None
-// Description: Returns a list of all APCs
-/proc/get_all_apcs()
+// Description: Returns a list of all unhacked APCs
+/proc/get_unhacked_apcs(var/mob/living/silicon/ai/user)
var/list/H = list()
for(var/obj/machinery/power/apc/A in machines)
+ if(A.hacker && A.hacker == user)
+ continue
H.Add(A)
return H
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
index d156e417f9..11f3c55ef5 100644
--- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
@@ -38,7 +38,7 @@
// END RESEARCH DATUMS
// BEGIN ABILITY VERBS
-/datum/game_mode/malfunction/verb/basic_encryption_hack(obj/machinery/power/apc/A as obj in get_all_apcs())
+/datum/game_mode/malfunction/verb/basic_encryption_hack(obj/machinery/power/apc/A as obj in get_unhacked_apcs(src))
set category = "Software"
set name = "Basic Encryption Hack"
set desc = "10 CPU - Basic encryption hack that allows you to overtake APCs on the station."
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index c8e129ab8c..8f0a0535b1 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -41,10 +41,6 @@
else
return
-/obj/machinery/optable/blob_act()
- if(prob(75))
- qdel(src)
-
/obj/machinery/optable/attack_hand(mob/user as mob)
if (HULK in usr.mutations)
visible_message("\The [usr] destroys \the [src]!")
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 3e456dfe69..788fdd48ed 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -129,12 +129,6 @@
else
return
-/obj/machinery/bodyscanner/blob_act()
- if(prob(50))
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- qdel(src)
-
/obj/machinery/body_scanconsole/ex_act(severity)
switch(severity)
@@ -150,11 +144,6 @@
else
return
-/obj/machinery/body_scanconsole/blob_act()
-
- if(prob(50))
- qdel(src)
-
/obj/machinery/body_scanconsole/power_change()
..()
if(stat & BROKEN)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index e0a837b4ce..73da615720 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -226,11 +226,6 @@ update_flag
return GM.return_pressure()
return 0
-/obj/machinery/portable_atmospherics/canister/blob_act()
- src.health -= 200
- healthcheck()
- return
-
/obj/machinery/portable_atmospherics/canister/bullet_act(var/obj/item/projectile/Proj)
if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN))
return
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index 88d8f8dd7e..7e03826f05 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -87,11 +87,6 @@
..()
healthcheck()
-/obj/machinery/bot/blob_act()
- src.health -= rand(20,40)*fire_dam_coeff
- healthcheck()
- return
-
/obj/machinery/bot/ex_act(severity)
switch(severity)
if(1.0)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index a24a79ac12..fa92176281 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -92,10 +92,6 @@
..() //and give it the regular chance of being deleted outright
-
-/obj/machinery/camera/blob_act()
- return
-
/obj/machinery/camera/hitby(AM as mob|obj)
..()
if (istype(AM, /obj))
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 0a22ccd6c4..35cd31399e 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -60,14 +60,6 @@
set_broken()
..()
-
-/obj/machinery/computer/blob_act()
- if (prob(75))
- for(var/x in verbs)
- verbs -= x
- set_broken()
- density = 0
-
/obj/machinery/computer/update_icon()
overlays.Cut()
if(stat & NOPOWER)
diff --git a/code/game/machinery/computer3/computer.dm b/code/game/machinery/computer3/computer.dm
index 6b6a2f8491..37d9a67d92 100644
--- a/code/game/machinery/computer3/computer.dm
+++ b/code/game/machinery/computer3/computer.dm
@@ -225,12 +225,6 @@
else
return
-
- blob_act()
- if (prob(75))
- set_broken()
- density = 0
-
/*
Computers have the capability to use a battery backup.
Note that auto_use_power's return value is strictly whether
diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm
index 4e874a34dd..2ffa495b70 100644
--- a/code/game/machinery/computer3/lapvend.dm
+++ b/code/game/machinery/computer3/lapvend.dm
@@ -28,15 +28,6 @@
return
-/obj/machinery/lapvend/blob_act()
- if (prob(50))
- spawn(0)
- qdel(src)
- return
-
- return
-
-
/obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(vendmode == 1)
if(istype(W, /obj/item/weapon/card))
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index df0d808be9..7bb1a9b4e5 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -508,8 +508,3 @@
name = initial(name)
if(occupant)
name = "[name] ([occupant])"
-
-
-//Attacks/effects.
-/obj/machinery/cryopod/blob_act()
- return //Sorta gamey, but we don't really want these to be destroyed.
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index ccf2fb97ae..0140a33fe3 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -131,13 +131,6 @@ for reference:
dismantle()
return
-/obj/structure/barricade/blob_act()
- src.health -= 25
- if (src.health <= 0)
- visible_message("The blob eats through \the [src]!")
- qdel(src)
- return
-
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff.
if(air_group || (height==0))
return 1
@@ -232,12 +225,6 @@ for reference:
anchored = !anchored
icon_state = "barrier[src.locked]"
- blob_act()
- src.health -= 25
- if (src.health <= 0)
- src.explode()
- return
-
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff.
if(air_group || (height==0))
return 1
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index daa2123d1c..2d1680aa7d 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -333,12 +333,6 @@
return
-/obj/machinery/door/blob_act()
- if(prob(40))
- qdel(src)
- return
-
-
/obj/machinery/door/emp_act(severity)
if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) )
spawn(0)
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 1383bf56e7..5f57174074 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -196,10 +196,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
qdel(src)
return
-/obj/machinery/hologram/blob_act()
- qdel(src)
- return
-
/obj/machinery/hologram/holopad/Destroy()
for (var/mob/living/silicon/ai/master in masters)
clear_holo(master)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 709f4b4626..455c6256a4 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -171,10 +171,6 @@ Class Procs:
else
return
-/obj/machinery/blob_act()
- if(prob(50))
- qdel(src)
-
//sets the use_power var and then forces an area power update
/obj/machinery/proc/update_use_power(var/new_use_power)
use_power = new_use_power
diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm
index 85b387fe7b..d02d3522a4 100644
--- a/code/game/machinery/nuclear_bomb.dm
+++ b/code/game/machinery/nuclear_bomb.dm
@@ -362,13 +362,6 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob)
/obj/machinery/nuclearbomb/ex_act(severity)
return
-/obj/machinery/nuclearbomb/blob_act()
- if (src.timing == -1.0)
- return
- else
- return ..()
- return
-
#define NUKERANGE 80
/obj/machinery/nuclearbomb/proc/explode()
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 6a6d4df1fd..ef72e18f0f 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -168,15 +168,6 @@
else
return
-/obj/machinery/vending/blob_act()
- if (prob(50))
- spawn(0)
- src.malfunction()
- qdel(src)
- return
-
- return
-
/obj/machinery/vending/emag_act(var/remaining_charges, var/mob/user)
if (!emagged)
src.emagged = 1
@@ -780,7 +771,7 @@
icon_state = "cigs"
products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/flame/lighter/random = 4)
contraband = list(/obj/item/weapon/flame/lighter/zippo = 4)
- premium = list(/obj/item/weapon/storage/fancy/cigar = 5)
+ premium = list(/obj/item/weapon/storage/fancy/cigar = 5,/obj/item/weapon/storage/fancy/cigarettes/killthroat = 5 )
prices = list(/obj/item/weapon/storage/fancy/cigarettes = 15,/obj/item/weapon/storage/box/matches = 1,/obj/item/weapon/flame/lighter/random = 2)
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 7fc5f17e86..0685e6efd2 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -144,7 +144,7 @@
sync()
else
sync_message = ""
-
+
return 1
/obj/machinery/mecha_part_fabricator/attackby(var/obj/item/I, var/mob/user)
@@ -155,7 +155,7 @@
return
if(default_deconstruction_crowbar(user, I))
return
- if(default_part_replacement(user, I))
+ if(default_part_replacement(user, I))
return
var/material
@@ -254,7 +254,7 @@
for(var/M in D.materials)
materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency)
if(D.build_path)
- var/obj/new_item = new D.build_path(loc, manufacturer)
+ var/obj/new_item = D.Fabricate(loc, src)
visible_message("\The [src] pings, indicating that \the [D] is complete.", "You hear a ping.")
if(mat_efficiency != 1)
if(new_item.matter && new_item.matter.len > 0)
diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm
index 99a68e1363..b29b2440e6 100644
--- a/code/game/objects/effects/chem/foam.dm
+++ b/code/game/objects/effects/chem/foam.dm
@@ -150,9 +150,6 @@
/obj/structure/foamedmetal/ex_act(severity)
qdel(src)
-/obj/structure/foamedmetal/blob_act()
- qdel(src)
-
/obj/structure/foamedmetal/bullet_act()
if(metal == 1 || prob(50))
qdel(src)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index ff7cecf169..9fa9ce9ff2 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -108,9 +108,6 @@
else
return
-/obj/item/blob_act()
- return
-
//user: The mob that is suiciding
//damagetype: The type of damage the item will inflict on the user
//BRUTELOSS = 1
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index bc0f836487..20abf3401b 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -15,7 +15,7 @@
//
// HOW TO REFILL THE DEVICE
//
-// It will need to be manually refilled with lights.
+// It can be manually refilled or by clicking on a storage item containing lights.
// If it's part of a robot module, it will charge when the Robot is inside a Recharge Station.
//
// EMAGGED FEATURES
@@ -41,7 +41,7 @@
/obj/item/device/lightreplacer
name = "light replacer"
- desc = "A device to automatically replace lights. Refill with working lightbulbs."
+ desc = "A device to automatically replace lights. Refill with working lightbulbs or sheets of glass."
icon = 'icons/obj/janitor.dmi'
icon_state = "lightreplacer0"
@@ -51,14 +51,13 @@
slot_flags = SLOT_BELT
origin_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 2)
- var/max_uses = 20
- var/uses = 0
+ var/max_uses = 32
+ var/uses = 32
var/emagged = 0
var/failmsg = ""
var/charge = 0
/obj/item/device/lightreplacer/New()
- uses = max_uses / 2
failmsg = "The [name]'s refill light blinks red."
..()
@@ -73,8 +72,8 @@
user << "[src.name] is full."
return
else if(G.use(1))
- AddUses(5)
- user << "You insert a piece of glass into the [src.name]. You have [uses] lights remaining."
+ AddUses(16) //Autolathe converts 1 sheet into 16 lights.
+ user << "You insert a piece of glass into \the [src.name]. You have [uses] light\s remaining."
return
else
user << "You need one sheet of glass to replace lights."
@@ -84,7 +83,7 @@
if(L.status == 0) // LIGHT OKAY
if(uses < max_uses)
AddUses(1)
- user << "You insert the [L.name] into the [src.name]. You have [uses] lights remaining."
+ user << "You insert \the [L.name] into \the [src.name]. You have [uses] light\s remaining."
user.drop_item()
qdel(L)
return
@@ -92,7 +91,6 @@
user << "You need a working light."
return
-
/obj/item/device/lightreplacer/attack_self(mob/user)
/* // This would probably be a bit OP. If you want it though, uncomment the code.
if(isrobot(user))
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 0ed8ad7b7b..40185d6a09 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -177,6 +177,16 @@
icon_state = "Dpacket"
item_state = "Dpacket"
+/obj/item/weapon/storage/fancy/cigarettes/killthroat
+ name = "\improper AcmeCo packet"
+ desc = "A packet of six AcmeCo cigarettes. For those who somehow want to obtain the record for the most amount of cancerous tumors."
+ icon_state = "Bpacket"
+ item_state = "Bpacket" //Doesn't have an inhand state, but neither does dromedary, so, ya know..
+
+ New()
+ ..()
+ fill_cigarre_package(src,list("fuel" = 15))
+
/obj/item/weapon/storage/fancy/cigar
name = "cigar case"
desc = "A case for holding your cigars when you are not smoking them."
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index c1022c55d0..78665633cf 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -224,7 +224,7 @@
//Set the stop_messages to stop it from printing messages
/obj/item/weapon/storage/proc/can_be_inserted(obj/item/W as obj, stop_messages = 0)
if(!istype(W)) return //Not an item
-
+
if(!usr.canUnEquip(W))
return 0
@@ -340,6 +340,21 @@
if(isrobot(user))
return //Robots can't interact with storage items.
+ if(istype(W, /obj/item/device/lightreplacer))
+ var/obj/item/device/lightreplacer/LP = W
+ var/amt_inserted = 0
+ var/turf/T = get_turf(user)
+ for(var/obj/item/weapon/light/L in src.contents)
+ if(L.status == 0)
+ if(LP.uses < LP.max_uses)
+ LP.AddUses(1)
+ amt_inserted++
+ remove_from_storage(L, T)
+ qdel(L)
+ if(amt_inserted)
+ user << "You inserted [amt_inserted] light\s into \the [LP.name]. You have [LP.uses] light\s remaining."
+ return
+
if(!can_be_inserted(W))
return
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index b8e6fc6ecb..a0340c1cd2 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -63,17 +63,6 @@
descriptive = "cold"
user << "\The [src] feels [descriptive]."
-/obj/item/weapon/tank/blob_act()
- if(prob(50))
- var/turf/location = src.loc
- if (!( istype(location, /turf) ))
- qdel(src)
-
- if(src.air_contents)
- location.assume_air(air_contents)
-
- qdel(src)
-
/obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if (istype(src.loc, /obj/item/assembly))
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 98e9ccdc5c..35302dc5dc 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -213,10 +213,6 @@
health = 0
healthcheck()
-/obj/effect/energy_net/blob_act()
- health = 0
- healthcheck()
-
/obj/effect/energy_net/attack_hand(var/mob/user)
var/mob/living/carbon/human/H = user
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 1f25043e89..f8b9c37ae4 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -28,10 +28,6 @@
return ..()
-/obj/structure/blob_act()
- if(prob(50))
- qdel(src)
-
/obj/structure/attack_tk()
return
diff --git a/code/game/objects/structures/alien/alien.dm b/code/game/objects/structures/alien/alien.dm
index 900f2d73c2..df94cf95ac 100644
--- a/code/game/objects/structures/alien/alien.dm
+++ b/code/game/objects/structures/alien/alien.dm
@@ -30,11 +30,6 @@
healthcheck()
return
-/obj/structure/alien/blob_act()
- health-=50
- healthcheck()
- return
-
/obj/structure/alien/hitby(AM as mob|obj)
..()
visible_message("\The [src] was hit by \the [AM].")
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index b680002df8..105f2987df 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -196,13 +196,6 @@
return
-// this should probably use dump_contents()
-/obj/structure/closet/blob_act()
- if(prob(75))
- for(var/atom/movable/A as mob|obj in src)
- A.forceMove(src.loc)
- qdel(src)
-
/obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(src.opened)
if(istype(W, /obj/item/weapon/grab))
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index 3f5508fb97..2ff44ee9df 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -96,10 +96,6 @@
for(var/mob/M in src)
shatter(M)
-/obj/structure/closet/statue/blob_act()
- for(var/mob/M in src)
- shatter(M)
-
/obj/structure/closet/statue/ex_act(severity)
for(var/mob/M in src)
M.ex_act(severity)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 5d5b88b886..8ce2a88f24 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -34,15 +34,6 @@
src.healthcheck()
return
-
-/obj/structure/displaycase/blob_act()
- if (prob(75))
- new /obj/item/weapon/material/shard( src.loc )
- if (occupied)
- new /obj/item/weapon/gun/energy/captain( src.loc )
- occupied = 0
- qdel(src)
-
/obj/structure/displaycase/proc/healthcheck()
if (src.health <= 0)
if (!( src.destroyed ))
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 8274576641..0e2efb1c9e 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -202,10 +202,6 @@
return
return ..()
-/obj/structure/girder/blob_act()
- if(prob(40))
- qdel(src)
-
/obj/structure/girder/ex_act(severity)
switch(severity)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index f3f70d53d8..0691d3d68e 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -16,9 +16,6 @@
/obj/structure/grille/ex_act(severity)
qdel(src)
-/obj/structure/grille/blob_act()
- qdel(src)
-
/obj/structure/grille/update_icon()
if(destroyed)
icon_state = "[initial(icon_state)]-b"
diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm
index c6b108825b..3d867111cc 100644
--- a/code/game/objects/structures/inflatable.dm
+++ b/code/game/objects/structures/inflatable.dm
@@ -60,9 +60,6 @@
deflate(1)
return
-/obj/structure/inflatable/blob_act()
- deflate(1)
-
/obj/structure/inflatable/attack_hand(mob/user as mob)
add_fingerprint(user)
return
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index cc87be62fa..3b5bdb56aa 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -34,10 +34,6 @@
L.updateOverlays(src.loc)
..()
-/obj/structure/lattice/blob_act()
- qdel(src)
- return
-
/obj/structure/lattice/ex_act(severity)
switch(severity)
if(1.0)
diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
index e0923119b0..a3904f65a1 100644
--- a/code/game/objects/structures/safe.dm
+++ b/code/game/objects/structures/safe.dm
@@ -160,10 +160,6 @@ FLOOR SAFES
return
-obj/structure/safe/blob_act()
- return
-
-
obj/structure/safe/ex_act(severity)
return
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index f5c988ae97..38d3e5cde7 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -19,10 +19,6 @@
else
return
-/obj/structure/sign/blob_act()
- qdel(src)
- return
-
/obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction
if(istype(tool, /obj/item/weapon/screwdriver) && !istype(src, /obj/structure/sign/double))
user << "You unfasten the sign with your [tool]."
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 29c504edd3..73914e113c 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -86,11 +86,6 @@
qdel(src)
return
-/obj/structure/bed/blob_act()
- if(prob(75))
- material.place_sheet(get_turf(src))
- qdel(src)
-
/obj/structure/bed/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
index 2228345ebb..e4840bedc6 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
@@ -95,11 +95,6 @@ var/global/list/stool_cache = list() //haha stool
qdel(src)
return
-/obj/item/weapon/stool/blob_act()
- if(prob(75))
- material.place_sheet(get_turf(src))
- qdel(src)
-
/obj/item/weapon/stool/proc/dismantle()
if(material)
material.place_sheet(get_turf(src))
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 43305bedb9..440cc6a8a2 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -122,10 +122,6 @@
shatter(0)
return
-
-/obj/structure/window/blob_act()
- shatter()
-
//TODO: Make full windows a separate type of window.
//Once a full window, it will always be a full window, so there's no point
//having the same type for both.
diff --git a/code/game/turfs/simulated/floor_acts.dm b/code/game/turfs/simulated/floor_acts.dm
index 73fa3e01a3..2157397050 100644
--- a/code/game/turfs/simulated/floor_acts.dm
+++ b/code/game/turfs/simulated/floor_acts.dm
@@ -43,6 +43,3 @@
for(var/obj/structure/window/W in src)
if(W.dir == dir_to || W.is_fulltile()) //Same direction or diagonal (full tile)
W.fire_act(adj_air, adj_temp, adj_volume)
-
-/turf/simulated/floor/blob_act()
- return
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index d703fdcbd3..8c79f20403 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -193,10 +193,6 @@
else
return
-/turf/simulated/wall/blob_act()
- take_damage(rand(75, 125))
- return
-
// Wall-rot effect, a nasty fungus that destroys walls.
/turf/simulated/wall/proc/rot()
if(locate(/obj/effect/overlay/wallrot) in src)
diff --git a/code/global.dm b/code/global.dm
index 61835c9afd..a460518726 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -83,7 +83,6 @@ var/list/reverse_dir = list( // reverse_dir[dir] = reverse of dir
23, 28, 30, 29, 31, 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63
)
-var/datum/station_state/start_state = null
var/datum/configuration/config = null
var/datum/sun/sun = null
diff --git a/code/modules/admin/map_capture.dm b/code/modules/admin/map_capture.dm
index b9d564d192..ced6d257bf 100644
--- a/code/modules/admin/map_capture.dm
+++ b/code/modules/admin/map_capture.dm
@@ -1,10 +1,17 @@
-/datum/admins/proc/capture_map(tx as num, ty as num, tz as num, range as num)
+/datum/admins/proc/capture_map(tx as null|num, ty as null|num, tz as null|num, range as null|num)
set category = "Server"
set name = "Capture Map Part"
+ set desc = "Usage: Capture-Map-Part target_x_cord target_y_cord target_z_cord range (captures part of a map originating from bottom left corner)"
if(!check_rights(R_ADMIN|R_DEBUG|R_SERVER))
return
+ if(isnull(tx) || isnull(ty) || isnull(tz) || isnull(range))
+ usr << "Capture Map Part, captures part of a map using camara like rendering."
+ usr << "Usage: Capture-Map-Part target_x_cord target_y_cord target_z_cord range"
+ usr << "Target coordinates specify bottom left corner of the capture, range defines render distance to opposite corner."
+ return
+
if(range > 32 || range <= 0)
usr << "Capturing range is incorrect, it must be within 1-32."
return
@@ -45,5 +52,8 @@
var/yoff = (A.y - ty) * 32
cap.Blend(img, blendMode2iconMode(A.blend_mode), A.pixel_x + xoff, A.pixel_y + yoff)
-
- usr << browse_rsc(cap, "map_capture_x[tx]_y[ty]_z[tz]_r[range].png")
\ No newline at end of file
+ var/file_name = "map_capture_x[tx]_y[ty]_z[tz]_r[range].png"
+ usr << "Saved capture in cache as [file_name]."
+ usr << browse_rsc(cap, file_name)
+ else
+ usr << "Target coordinates are incorrect."
diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm
new file mode 100644
index 0000000000..a2de592b84
--- /dev/null
+++ b/code/modules/blob/blob.dm
@@ -0,0 +1,206 @@
+//I will need to recode parts of this but I am way too tired atm
+/obj/effect/blob
+ name = "blob"
+ icon = 'icons/mob/blob.dmi'
+ icon_state = "blob"
+ light_range = 3
+ desc = "Some blob creature thingy"
+ density = 1
+ opacity = 0
+ anchored = 1
+ mouse_opacity = 2
+
+ var/maxHealth = 30
+ var/health
+ var/brute_resist = 4
+ var/fire_resist = 1
+ var/expandType = /obj/effect/blob
+
+/obj/effect/blob/New(loc)
+ health = maxHealth
+ update_icon()
+ return ..(loc)
+
+/obj/effect/blob/CanPass(var/atom/movable/mover, vra/turf/target, var/height = 0, var/air_group = 0)
+ if(air_group || height == 0)
+ return 1
+ return 0
+
+/obj/effect/blob/ex_act(var/severity)
+ switch(severity)
+ if(1)
+ take_damage(rand(100, 120) / brute_resist)
+ if(2)
+ take_damage(rand(60, 100) / brute_resist)
+ if(3)
+ take_damage(rand(20, 60) / brute_resist)
+
+/obj/effect/blob/update_icon()
+ if(health > maxHealth / 2)
+ icon_state = "blob"
+ else
+ icon_state = "blob_damaged"
+
+/obj/effect/blob/proc/take_damage(var/damage)
+ health -= damage
+ if(health < 0)
+ playsound(loc, 'sound/effects/splat.ogg', 50, 1)
+ qdel(src)
+ else
+ update_icon()
+
+/obj/effect/blob/proc/regen()
+ health = min(health + 1, maxHealth)
+ update_icon()
+
+/obj/effect/blob/proc/expand(var/turf/T)
+ if(istype(T, /turf/unsimulated/) || istype(T, /turf/space))
+ return
+ if(istype(T, /turf/simulated/wall))
+ var/turf/simulated/wall/SW = T
+ SW.take_damage(80)
+ return
+ var/obj/structure/girder/G = locate() in T
+ if(G)
+ if(prob(40))
+ G.dismantle()
+ return
+ var/obj/structure/window/W = locate() in T
+ if(W)
+ W.shatter()
+ return
+ var/obj/structure/grille/GR = locate() in T
+ if(GR)
+ qdel(GR)
+ return
+ for(var/obj/machinery/door/D in T) // There can be several - and some of them can be open, locate() is not suitable
+ if(D.density)
+ D.ex_act(2)
+ return
+ var/obj/structure/foamedmetal/F = locate() in T
+ if(F)
+ qdel(F)
+ return
+ var/obj/structure/inflatable/I = locate() in T
+ if(I)
+ I.deflate(1)
+ return
+
+ var/obj/vehicle/V = locate() in T
+ if(V)
+ V.ex_act(2)
+ return
+ var/obj/machinery/bot/B = locate() in T
+ if(B)
+ B.ex_act(2)
+ return
+ var/obj/mecha/M = locate() in T
+ if(M)
+ M.visible_message("The blob attacks \the [M]!")
+ M.take_damage(40)
+ return
+
+ // Above things, we destroy completely and thus can use locate. Mobs are different.
+ for(var/mob/living/L in T)
+ if(L.stat == DEAD)
+ continue
+ L.visible_message("The blob attacks \the [L]!", "The blob attacks you!")
+ playsound(loc, 'sound/effects/attackblob.ogg', 50, 1)
+ L.take_organ_damage(rand(30, 40))
+ return
+ new expandType(T, min(health, 30))
+
+/obj/effect/blob/proc/pulse(var/forceLeft, var/list/dirs)
+ regen()
+ sleep(5)
+ var/pushDir = pick(dirs)
+ var/turf/T = get_step(src, pushDir)
+ var/obj/effect/blob/B = (locate() in T)
+ if(!B)
+ if(prob(health))
+ expand(T)
+ return
+ B.pulse(forceLeft - 1, dirs)
+
+/obj/effect/blob/bullet_act(var/obj/item/projectile/Proj)
+ if(!Proj)
+ return
+
+ switch(Proj.damage_type)
+ if(BRUTE)
+ take_damage(Proj.damage / brute_resist)
+ if(BURN)
+ take_damage(Proj.damage / fire_resist)
+ return 0
+
+/obj/effect/blob/attackby(var/obj/item/weapon/W, var/mob/user)
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ playsound(loc, 'sound/effects/attackblob.ogg', 50, 1)
+ visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]")
+ var/damage = 0
+ switch(W.damtype)
+ if("fire")
+ damage = (W.force / fire_resist)
+ if(istype(W, /obj/item/weapon/weldingtool))
+ playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+ if("brute")
+ damage = (W.force / brute_resist)
+
+ take_damage(damage)
+ return
+
+/obj/effect/blob/core
+ name = "blob core"
+ icon = 'icons/mob/blob.dmi'
+ icon_state = "blob_core"
+ maxHealth = 200
+ brute_resist = 2
+ fire_resist = 2
+
+ expandType = /obj/effect/blob/shield
+
+/obj/effect/blob/core/update_icon()
+ return
+
+/obj/effect/blob/core/New(loc)
+ processing_objects.Add(src)
+ return ..(loc)
+
+/obj/effect/blob/core/Destroy()
+ processing_objects.Remove(src)
+ return ..()
+
+/obj/effect/blob/core/process()
+ pulse(20, list(NORTH, EAST))
+ pulse(20, list(NORTH, WEST))
+ pulse(20, list(SOUTH, EAST))
+ pulse(20, list(SOUTH, WEST))
+
+/obj/effect/blob/shield
+ name = "strong blob"
+ icon = 'icons/mob/blob.dmi'
+ icon_state = "blob_idle"
+ desc = "Some blob creature thingy"
+ maxHealth = 60
+ brute_resist = 1
+ fire_resist = 2
+
+/obj/effect/blob/shield/New()
+ ..()
+ update_nearby_tiles()
+
+/obj/effect/blob/shield/Destroy()
+ density = 0
+ update_nearby_tiles()
+ ..()
+
+/obj/effect/blob/shield/update_icon()
+ if(health > maxHealth * 2 / 3)
+ icon_state = "blob_idle"
+ else if(health > maxHealth / 3)
+ icon_state = "blob"
+ else
+ icon_state = "blob_damaged"
+
+/obj/effect/blob/shield/CanPass(var/atom/movable/mover, var/turf/target, var/height = 0, var/air_group = 0)
+ return !density
diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm
index c478a28daa..bc1888f14d 100644
--- a/code/modules/events/blob.dm
+++ b/code/modules/events/blob.dm
@@ -12,12 +12,13 @@
if(!T)
kill()
return
- Blob = new /obj/effect/blob/core(T, 120)
+ Blob = new /obj/effect/blob/core(T)
for(var/i = 1; i < rand(3, 4), i++)
Blob.process()
/datum/event/blob/tick()
- if(!Blob)
+ if(!Blob || !Blob.loc)
+ Blob = null
kill()
return
if(IsMultiple(activeFor, 3))
diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm
index 18e061f273..4c0d0a755e 100644
--- a/code/modules/holodeck/HolodeckControl.dm
+++ b/code/modules/holodeck/HolodeckControl.dm
@@ -163,11 +163,6 @@
emergencyShutdown()
..()
-
-/obj/machinery/computer/HolodeckControl/blob_act()
- emergencyShutdown()
- ..()
-
/obj/machinery/computer/HolodeckControl/power_change()
var/oldstat
..()
diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm
index 2afb02ffd9..c42f76623c 100644
--- a/code/modules/mob/language/language.dm
+++ b/code/modules/mob/language/language.dm
@@ -136,7 +136,7 @@
var/datum/language/new_language = all_languages[language]
- if(!istype(new_language) || new_language in languages)
+ if(!istype(new_language) || (new_language in languages))
return 0
languages.Add(new_language)
diff --git a/code/modules/mob/living/blob/blob.dm b/code/modules/mob/living/blob/blob.dm
deleted file mode 100644
index 8bbf517e60..0000000000
--- a/code/modules/mob/living/blob/blob.dm
+++ /dev/null
@@ -1,253 +0,0 @@
-/mob/living/blob
- name = "blob fragment"
- real_name = "blob fragment"
- icon = 'icons/mob/blob.dmi'
- icon_state = "blob_spore_temp"
- pass_flags = PASSBLOB
- see_in_dark = 8
- see_invisible = SEE_INVISIBLE_LEVEL_TWO
- var/ghost_name = "Unknown"
- var/creating_blob = 0
- faction = "blob"
- use_me = 0 //Blobs can't emote
-
-
- New()
- real_name += " [pick(rand(1, 99))]"
- name = real_name
- ..()
-
-
- say(var/message)
- return//No talking for you
-
-
- emote(var/act,var/m_type=1,var/message = null)
- return
-
-
- Life()
- set invisibility = 0
- set background = 1
-
- clamp_values()
- UpdateDamage()
- if(health < 0)
- src.dust()
-
-
- proc/clamp_values()
- AdjustStunned(0)
- AdjustParalysis(0)
- AdjustWeakened(0)
- sleeping = 0
- if(stat)
- stat = CONSCIOUS
- return
-
-
- proc/UpdateDamage()
- health = 60 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
- return
-
-
- death(gibbed)
- ghostize()
- ..(gibbed)
-
-
- blob_act()
- src << "The blob attempts to reabsorb you."
- adjustToxLoss(20)
- return
-
-
- Process_Spacemove()
- if(locate(/obj/effect/blob) in oview(1,src))
- return 1
- return (..())
-
-
-/mob/living/blob/verb/create_node()
- set category = "Blob"
- set name = "Create Node"
- set desc = "Create a Node."
- if(creating_blob) return
- var/turf/T = get_turf(src)
- creating_blob = 1
- if(!T)
- creating_blob = 0
- return
- var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
- if(!B)//We are on a blob
- usr << "There is no blob here!"
- creating_blob = 0
- return
- if(istype(B,/obj/effect/blob/node)||istype(B,/obj/effect/blob/core)||istype(B,/obj/effect/blob/factory))
- usr << "Unable to use this blob, find a normal one."
- creating_blob = 0
- return
- for(var/obj/effect/blob/node/blob in orange(5))
- usr << "There is another node nearby, move more than 5 tiles away from it!"
- creating_blob = 0
- return
- for(var/obj/effect/blob/factory/blob in orange(2))
- usr << "There is a porus blob nearby, move more than 2 tiles away from it!"
- creating_blob = 0
- B.change_to("Node")
- src.dust()
- return
-
-
-/mob/living/blob/verb/create_factory()
- set category = "Blob"
- set name = "Create Defense"
- set desc = "Create a Spore producing blob."
- if(creating_blob) return
- var/turf/T = get_turf(src)
- creating_blob = 1
- if(!T)
- creating_blob = 0
- return
- var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
- if(!B)
- usr << "You must be on a blob!"
- creating_blob = 0
- return
- if(istype(B,/obj/effect/blob/node)||istype(B,/obj/effect/blob/core)||istype(B,/obj/effect/blob/factory))
- usr << "Unable to use this blob, find a normal one."
- creating_blob = 0
- return
- for(var/obj/effect/blob/blob in orange(2))//Not right next to nodes/cores
- if(istype(B,/obj/effect/blob/node))
- usr << "There is a node nearby, move away from it!"
- creating_blob = 0
- return
- if(istype(B,/obj/effect/blob/core))
- usr << "There is a core nearby, move away from it!"
- creating_blob = 0
- return
- if(istype(B,/obj/effect/blob/factory))
- usr << "There is another porous blob nearby, move away from it!"
- creating_blob = 0
- return
- B.change_to("Factory")
- src.dust()
- return
-
-
-/mob/living/blob/verb/revert()
- set category = "Blob"
- set name = "Purge Defense"
- set desc = "Removes a porous blob."
- if(creating_blob) return
- var/turf/T = get_turf(src)
- creating_blob = 1
- if(!T)
- creating_blob = 0
- return
- var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
- if(!B)
- usr << "You must be on a blob!"
- creating_blob = 0
- return
- if(!istype(B,/obj/effect/blob/factory))
- usr << "Unable to use this blob, find another one."
- creating_blob = 0
- return
- B.change_to("Normal")
- src.dust()
- return
-
-
-/mob/living/blob/verb/spawn_blob()
- set category = "Blob"
- set name = "Create new blob"
- set desc = "Attempts to create a new blob in this tile."
- if(creating_blob) return
- var/turf/T = get_turf(src)
- creating_blob = 1
- if(!T)
- creating_blob = 0
- return
- var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
- if(B)
- usr << "There is a blob here!"
- creating_blob = 0
- return
- new/obj/effect/blob(src.loc)
- src.dust()
- return
-
-
-///mob/proc/Blobize()
-/client/proc/Blobcount()
- set category = "Debug"
- set name = "blobreport"
- set desc = "blob report."
- set hidden = 1
-
- if(!holder)
- src << "Only administrators may use this command."
- return
- if(ticker && ticker.mode)
- src << "blobs: [blobs.len]"
- src << "cores: [blob_cores.len]"
- src << "nodes: [blob_nodes.len]"
- return
-
-
-/client/proc/Blobize()//Mostly stolen from the respawn command
- set category = "Debug"
- set name = "Ghostblob"
- set desc = "Ghost into blobthing."
- set hidden = 1
-
- if(!holder)
- src << "Only administrators may use this command."
- return
- var/input = input(src, "Please specify which key will be turned into a bloby.", "Key", "")
-
- var/mob/dead/observer/G_found
- if(!input)
- var/list/ghosts = list()
- for(var/mob/dead/observer/G in player_list)
- ghosts += G
- if(ghosts.len)
- G_found = pick(ghosts)
-
- else
- for(var/mob/dead/observer/G in player_list)
- if(G.client&&ckey(G.key)==ckey(input))
- G_found = G
- break
-
- if(!G_found)//If a ghost was not found.
- alert("There is no active key like that in the game or the person is not currently a ghost. Aborting command.")
- return
-
- if(G_found.client)
- G_found.client.screen.len = null
- var/mob/living/blob/B = new/mob/living/blob(locate(0,0,1))//temp area also just in case should do this better but tired
- if(blob_cores.len > 0)
- var/obj/effect/blob/core/core = pick(blob_cores)
- if(core)
- B.loc = core.loc
- B.ghost_name = G_found.real_name
- if (G_found.client)
- G_found.client.mob = B
- B.verbs += /mob/living/blob/verb/create_node
- B.verbs += /mob/living/blob/verb/create_factory
- B << "You are now a blob fragment."
- B << "You are a weak bit that has temporarily broken off of the blob."
- B << "If you stay on the blob for too long you will likely be reabsorbed."
- B << "If you stray from the blob you will likely be killed by other organisms."
- B << "You have the power to create a new blob node that will help expand the blob."
- B << "To create this node you will have to be on a normal blob tile and far enough away from any other node."
- B << "Check your Blob verbs and hit Create Node to build a node."
- spawn(10)
- qdel(G_found)
-
-
-
-
diff --git a/code/modules/mob/living/carbon/alien/alien_damage.dm b/code/modules/mob/living/carbon/alien/alien_damage.dm
index 1483559120..99c5e52f75 100644
--- a/code/modules/mob/living/carbon/alien/alien_damage.dm
+++ b/code/modules/mob/living/carbon/alien/alien_damage.dm
@@ -31,26 +31,3 @@
adjustFireLoss(f_loss)
updatehealth()
-
-
-
-/mob/living/carbon/alien/blob_act()
- if (stat == 2)
- return
- var/shielded = 0
-
- var/damage = null
- if (stat != 2)
- damage = rand(10,30)
-
- if(shielded)
- damage /= 4
-
- //paralysis += 1
-
- show_message("\red The blob attacks you!")
-
- adjustFireLoss(damage)
-
- updatehealth()
- return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index bcec368d7d..78129c4910 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -168,15 +168,6 @@
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if(update) UpdateDamageIcon()
-
-/mob/living/carbon/human/blob_act()
- if(stat == 2) return
- show_message("\red The blob attacks you!")
- var/dam_zone = pick(organs_by_name)
- var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
- apply_damage(rand(30,40), BRUTE, affecting, run_armor_check(affecting, "melee"))
- return
-
/mob/living/carbon/human/proc/implant_loyalty(mob/living/carbon/human/M, override = FALSE) // Won't override by default.
if(!config.use_loyalty_implants && !override) return // Nuh-uh.
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index 86f8f2d672..5f4876d1dd 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -194,26 +194,6 @@
updatehealth()
-/mob/living/carbon/slime/blob_act()
- if (stat == 2)
- return
- var/shielded = 0
-
- var/damage = null
- if (stat != 2)
- damage = rand(10,30)
-
- if(shielded)
- damage /= 4
-
- show_message(" The blob attacks you!")
-
- adjustFireLoss(damage)
-
- updatehealth()
- return
-
-
/mob/living/carbon/slime/u_equip(obj/item/W as obj)
return
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 0d4a5d77b4..d7a989756d 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -230,7 +230,7 @@
/mob/living/proc/handle_fire()
if(fire_stacks < 0)
- fire_stacks = min(0, fire_stacks++) //If we've doused ourselves in water to avoid fire, dry off slowly
+ fire_stacks = min(0, ++fire_stacks) //If we've doused ourselves in water to avoid fire, dry off slowly
if(!on_fire)
return 1
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index d67eb27753..b5ddfcedd9 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -79,7 +79,7 @@
//Blind the AI
updateicon()
- src.blind.screen_loc = "1,1 to 15,15"
+ src.blind.screen_loc = ui_entire_screen
if (src.blind.layer!=18)
src.blind.layer = 18
src.sight = src.sight&~SEE_TURFS
diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm
index 5336cd873f..76625cdc3d 100644
--- a/code/modules/mob/living/silicon/ai/login.dm
+++ b/code/modules/mob/living/silicon/ai/login.dm
@@ -6,12 +6,12 @@
flash = new /obj/screen()
flash.icon_state = "blank"
flash.name = "flash"
- flash.screen_loc = "1,1 to 15,15"
+ flash.screen_loc = ui_entire_screen
flash.layer = 17
blind = new /obj/screen()
blind.icon_state = "black"
blind.name = " "
- blind.screen_loc = "1,1 to 15,15"
+ blind.screen_loc = ui_entire_screen
blind.layer = 0
client.screen.Add( blind, flash )
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index cb90cd176b..0c53adc467 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -119,13 +119,6 @@
return -1
return 0
-/mob/living/silicon/pai/blob_act()
- if (src.stat != 2)
- src.adjustBruteLoss(60)
- src.updatehealth()
- return 1
- return 0
-
/mob/living/silicon/pai/restrained()
if(istype(src.loc,/obj/item/device/paicard))
return 0
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 8e6f3207fb..f3d7ffd848 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -34,7 +34,7 @@ var/global/list/robot_modules = list(
var/list/obj/item/borg/upgrade/supported_upgrades = list()
// Bookkeeping
- var/list/added_languages = list()
+ var/list/original_languages = list()
var/list/added_networks = list()
/obj/item/weapon/robot_module/New(var/mob/living/silicon/robot/R)
@@ -69,7 +69,7 @@ var/global/list/robot_modules = list(
for(var/module in modules)
qdel(module)
for(var/synth in synths)
- qdel(synths)
+ qdel(synth)
modules.Cut()
synths.Cut()
qdel(emag)
@@ -105,14 +105,22 @@ var/global/list/robot_modules = list(
modules += O
/obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R)
+ // Stores the languages as they were before receiving the module, and whether they could be synthezized.
+ for(var/datum/language/language_datum in R.languages)
+ original_languages[language_datum] = (language_datum in R.speech_synthesizer_langs)
+
for(var/language in languages)
- if(R.add_language(language, languages[language]))
- added_languages |= language
+ R.add_language(language, languages[language])
/obj/item/weapon/robot_module/proc/remove_languages(var/mob/living/silicon/robot/R)
- for(var/language in added_languages)
+ // Clear all added languages, whether or not we originally had them.
+ for(var/language in languages)
R.remove_language(language)
- added_languages.Cut()
+
+ // Then add back all the original languages, and the relevant synthezising ability
+ for(var/original_language in original_languages)
+ R.add_language(original_language, original_languages[original_language])
+ original_languages.Cut()
/obj/item/weapon/robot_module/proc/add_camera_networks(var/mob/living/silicon/robot/R)
if(R.camera && (NETWORK_ROBOTS in R.camera.network))
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 25b321a9a7..42d5c6e6f6 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -97,13 +97,6 @@
/mob/living/silicon/IsAdvancedToolUser()
return 1
-/mob/living/silicon/blob_act()
- if (src.stat != 2)
- src.adjustBruteLoss(60)
- src.updatehealth()
- return 1
- return 0
-
/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
if(!Proj.nodamage)
@@ -201,16 +194,22 @@
return universal_speak || (speaking in src.speech_synthesizer_langs) //need speech synthesizer support to vocalize a language
/mob/living/silicon/add_language(var/language, var/can_speak=1)
- if (..(language) && can_speak)
- speech_synthesizer_langs.Add(all_languages[language])
+ var/var/datum/language/added_language = all_languages[language]
+ if(!added_language)
+ return
+
+ . = ..(language)
+ if (can_speak && (added_language in languages) && !(added_language in speech_synthesizer_langs))
+ speech_synthesizer_langs += added_language
return 1
/mob/living/silicon/remove_language(var/rem_language)
- ..(rem_language)
+ var/var/datum/language/removed_language = all_languages[rem_language]
+ if(!removed_language)
+ return
- for (var/datum/language/L in speech_synthesizer_langs)
- if (L.name == rem_language)
- speech_synthesizer_langs -= L
+ ..(rem_language)
+ speech_synthesizer_langs -= removed_language
/mob/living/silicon/check_languages()
set name = "Check Known Languages"
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 836b5224b6..6d24a8f238 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -146,15 +146,6 @@
toner = 0
return
-/obj/machinery/photocopier/blob_act()
- if(prob(50))
- qdel(src)
- else
- if(toner > 0)
- new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
- toner = 0
- return
-
/obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy)
var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc)
if(toner > 10) //lots of toner, make it dark
diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm
index 9fd35c2c26..8c7af58346 100644
--- a/code/modules/power/antimatter/control.dm
+++ b/code/modules/power/antimatter/control.dm
@@ -101,19 +101,6 @@
return 0
-/obj/machinery/power/am_control_unit/blob_act()
- stability -= 20
- if(prob(100-stability))//Might infect the rest of the machine
- for(var/obj/machinery/am_shielding/AMS in linked_shielding)
- AMS.blob_act()
- spawn(0)
- //Likely explode
- qdel(src)
- return
- check_stability()
- return
-
-
/obj/machinery/power/am_control_unit/ex_act(severity)
switch(severity)
if(1.0)
diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm
index 700fad25ad..4f89687fb4 100644
--- a/code/modules/power/antimatter/shielding.dm
+++ b/code/modules/power/antimatter/shielding.dm
@@ -90,20 +90,6 @@ proc/cardinalrange(var/center)
return 0
-/obj/machinery/am_shielding/blob_act()
- stability -= 20
- if(prob(100-stability))
- if(prob(10))//Might create a node
- new /obj/effect/blob/node(src.loc,150)
- else
- new /obj/effect/blob(src.loc,60)
- spawn(0)
- qdel(src)
- return
- check_stability()
- return
-
-
/obj/machinery/am_shielding/ex_act(severity)
switch(severity)
if(1.0)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 3ad0754d84..6d25a0f25e 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -1178,12 +1178,6 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on)
cell.ex_act(3.0)
return
-/obj/machinery/power/apc/blob_act()
- if (prob(75))
- set_broken()
- if (cell && prob(5))
- cell.blob_act()
-
/obj/machinery/power/apc/disconnect_terminal()
if(terminal)
terminal.master = null
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index ebae74cd27..599dadc4a4 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -161,10 +161,6 @@
corrupt()
return
-/obj/item/weapon/cell/blob_act()
- if(prob(75))
- explode()
-
/obj/item/weapon/cell/proc/get_electrocute_damage()
switch (charge)
/* if (9000 to INFINITY)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index bf3393f903..9952a97442 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -548,10 +548,6 @@
//blob effect
-/obj/machinery/light/blob_act()
- if(prob(75))
- broken()
-
// timed process
// use power
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 1b798df2bd..751e2cf157 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -30,10 +30,6 @@
return 1
-/obj/machinery/containment_field/blob_act()
- return 0
-
-
/obj/machinery/containment_field/ex_act(severity)
return 0
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 5532f8ce9e..6368e7348d 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -159,13 +159,6 @@ field_generator power level display
/obj/machinery/field_generator/emp_act()
return 0
-
-/obj/machinery/field_generator/blob_act()
- if(active)
- return 0
- else
- ..()
-
/obj/machinery/field_generator/bullet_act(var/obj/item/projectile/Proj)
if(istype(Proj, /obj/item/projectile/beam))
power += Proj.damage * EMITTER_DAMAGE_POWER_TRANSFER
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index ec659eca58..f6770d48c0 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -157,12 +157,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
else
return
-
-/obj/structure/particle_accelerator/blob_act()
- if(prob(50))
- qdel(src)
- return
-
/obj/structure/particle_accelerator/update_icon()
switch(construction_state)
if(0,1)
@@ -339,12 +333,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return
-/obj/machinery/particle_accelerator/blob_act()
- if(prob(50))
- qdel(src)
- return
-
-
/obj/machinery/particle_accelerator/proc/update_state()
return 0
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 76cdf04f0a..608f8c283c 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -53,9 +53,6 @@
consume(user)
return 1
-/obj/singularity/blob_act(severity)
- return
-
/obj/singularity/ex_act(severity)
if(current_size == STAGE_SUPER)//IT'S UNSTOPPABLE
return
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index ea5377c98b..232adb345b 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -80,12 +80,6 @@ var/list/solars_list = list()
..()
-/obj/machinery/power/solar/blob_act()
- src.health--
- src.healthcheck()
- return
-
-
/obj/machinery/power/solar/proc/healthcheck()
if (src.health <= 0)
if(!(stat & BROKEN))
@@ -172,12 +166,6 @@ var/list/solars_list = list()
return
-/obj/machinery/power/solar/blob_act()
- if(prob(75))
- broken()
- src.density = 0
-
-
/obj/machinery/power/solar/fake/New(var/turf/loc, var/obj/item/solar_assembly/S)
..(loc, S, 0)
@@ -539,12 +527,6 @@ var/list/solars_list = list()
broken()
return
-
-/obj/machinery/power/solar_control/blob_act()
- if (prob(75))
- broken()
- src.density = 0
-
// Used for mapping in solar array which automatically starts itself (telecomms, for example)
/obj/machinery/power/solar_control/autostart
track = 2 // Auto tracking mode
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 01f3a35231..d597e9d8ef 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -44,10 +44,6 @@
qdel(src)
return
-/obj/machinery/chem_master/blob_act()
- if (prob(50))
- qdel(src)
-
/obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
if(istype(B, /obj/item/weapon/reagent_containers/glass))
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 7406dff6b7..f52d905fee 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -59,11 +59,6 @@
else
return
- blob_act()
- if(prob(50))
- new /obj/effect/effect/water(src.loc)
- qdel(src)
-
@@ -154,9 +149,6 @@
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
explode()
-/obj/structure/reagent_dispensers/fueltank/blob_act()
- explode()
-
/obj/structure/reagent_dispensers/fueltank/ex_act()
explode()
@@ -223,10 +215,6 @@
..()
reagents.add_reagent("beer",1000)
-/obj/structure/reagent_dispensers/beerkeg/blob_act()
- explosion(src.loc,0,3,5,7,10)
- qdel(src)
-
/obj/structure/reagent_dispensers/virusfood
name = "Virus Food Dispenser"
desc = "A dispenser of virus food."
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 0f8df78262..dd796d7147 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -79,10 +79,6 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
else
icon_state = "circuit_imprinter"
-/obj/machinery/r_n_d/circuit_imprinter/blob_act()
- if(prob(50))
- qdel(src)
-
/obj/machinery/r_n_d/circuit_imprinter/proc/TotalMaterials()
var/t = 0
for(var/f in materials)
@@ -199,7 +195,7 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
reagents.remove_reagent(C, D.chemicals[C] * mat_efficiency)
if(D.build_path)
- var/obj/new_item = new D.build_path(src)
+ var/obj/new_item = D.Fabricate(src, src)
new_item.loc = loc
if(mat_efficiency != 1) // No matter out of nowhere
if(new_item.matter && new_item.matter.len > 0)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index ce5fb4670b..98eb37bebd 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -55,6 +55,11 @@ other types of metals and chemistry for reagents).
desc = "Allows for the construction of \a [item_name]."
return
+//Returns a new instance of the item for this design
+//This is to allow additional initialization to be performed, including possibly additional contructor arguments.
+/datum/design/proc/Fabricate(var/newloc, var/fabricator)
+ return new build_path(newloc)
+
/datum/design/item
build_type = PROTOLATHE
@@ -195,9 +200,9 @@ other types of metals and chemistry for reagents).
/datum/design/item/stock_part/RPED
name = "Rapid Part Exchange Device"
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
- id = "rped"
+ id = "rped"
req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5000)
+ materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5000)
build_path = /obj/item/weapon/storage/part_replacer
sort_string = "CBAAA"
@@ -212,6 +217,11 @@ other types of metals and chemistry for reagents).
var/obj/item/weapon/cell/C = build_path
desc = "Allows the construction of power cells that can hold [initial(C.maxcharge)] units of energy."
+/datum/design/item/powercell/Fabricate()
+ var/obj/item/weapon/cell/C = ..()
+ C.charge = 0 //shouldn't produce power out of thin air.
+ return C
+
/datum/design/item/powercell/basic
name = "basic"
build_type = PROTOLATHE | MECHFAB
@@ -277,9 +287,9 @@ other types of metals and chemistry for reagents).
/datum/design/item/mesons
name = "Optical meson scanners design"
desc = "Using the meson-scanning technology those glasses allow you to see through walls, floor or anything else."
- id = "mesons"
+ id = "mesons"
req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
build_path = /obj/item/clothing/glasses/meson
sort_string = "GAAAC"
@@ -288,23 +298,23 @@ other types of metals and chemistry for reagents).
name = "Mining equipment design ([item_name])"
/datum/design/item/weapon/mining/jackhammer
- id = "jackhammer"
+ id = "jackhammer"
req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500)
build_path = /obj/item/weapon/pickaxe/jackhammer
sort_string = "KAAAA"
/datum/design/item/weapon/mining/drill
- id = "drill"
+ id = "drill"
req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1000) //expensive, but no need for miners.
+ materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1000) //expensive, but no need for miners.
build_path = /obj/item/weapon/pickaxe/drill
sort_string = "KAAAB"
/datum/design/item/weapon/mining/plasmacutter
- id = "plasmacutter"
+ id = "plasmacutter"
req_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 500, "gold" = 500, "phoron" = 500)
+ materials = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 500, "gold" = 500, "phoron" = 500)
build_path = /obj/item/weapon/pickaxe/plasmacutter
sort_string = "KAAAC"
@@ -316,9 +326,9 @@ other types of metals and chemistry for reagents).
sort_string = "KAAAD"
/datum/design/item/weapon/mining/drill_diamond
- id = "drill_diamond"
+ id = "drill_diamond"
req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 4)
- materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 1000, "diamond" = 2000)
+ materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 1000, "diamond" = 2000)
build_path = /obj/item/weapon/pickaxe/diamonddrill
sort_string = "KAAAE"
///////////////////////////////////
@@ -337,9 +347,9 @@ other types of metals and chemistry for reagents).
/datum/design/item/medical/robot_scanner
desc = "A hand-held scanner able to diagnose robotic injuries."
- id = "robot_scanner"
+ id = "robot_scanner"
req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINEERING = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200)
+ materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200)
build_path = /obj/item/device/robotanalyzer
sort_string = "MACFA"
@@ -394,9 +404,9 @@ other types of metals and chemistry for reagents).
/datum/design/item/medical/nanopaste
desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery."
- id = "nanopaste"
+ id = "nanopaste"
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000)
+ materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000)
build_path = /obj/item/stack/nanopaste
sort_string = "MBAAA"
@@ -528,16 +538,16 @@ other types of metals and chemistry for reagents).
/datum/design/item/weapon/chemsprayer
desc = "An advanced chem spraying device."
- id = "chemsprayer"
+ id = "chemsprayer"
req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000)
build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer
sort_string = "TABAA"
/datum/design/item/weapon/rapidsyringe
- id = "rapidsyringe"
+ id = "rapidsyringe"
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2)
- materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000)
build_path = /obj/item/weapon/gun/launcher/syringe/rapid
sort_string = "TABAB"
@@ -640,10 +650,10 @@ other types of metals and chemistry for reagents).
/datum/design/item/posibrain
name = "Positronic brain"
- id = "posibrain"
+ id = "posibrain"
req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4)
build_type = PROTOLATHE | MECHFAB
- materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100)
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100)
build_path = /obj/item/device/mmi/digital/posibrain
category = "Misc"
sort_string = "VACAB"
@@ -1354,16 +1364,16 @@ CIRCUITS BELOW
/datum/design/item/pda
name = "PDA design"
desc = "Cheaper than whiny non-digital assistants."
- id = "pda"
+ id = "pda"
req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
build_path = /obj/item/device/pda
sort_string = "VAAAA"
// Cartridges
-/datum/design/item/pda_cartridge
+/datum/design/item/pda_cartridge
req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3)
- materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
/datum/design/item/pda_cartridge/AssembleDesignName()
..()
@@ -1443,7 +1453,7 @@ CIRCUITS BELOW
id = "cart_captain"
build_path = /obj/item/weapon/cartridge/captain
sort_string = "VBAAO"
-
+
/* Uncomment if someone makes these buildable
/datum/design/circuit/general_alert
name = "general alert console"
diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm
index cfdce572b1..e83774468c 100644
--- a/code/modules/research/mechfab_designs.dm
+++ b/code/modules/research/mechfab_designs.dm
@@ -6,6 +6,13 @@
/datum/design/item/mechfab/robot
category = "Robot"
+//if the fabricator is a mech fab pass the manufacturer info over to the robot part constructor
+/datum/design/item/mechfab/robot/Fabricate(var/newloc, var/fabricator)
+ if(istype(fabricator, /obj/machinery/mecha_part_fabricator))
+ var/obj/machinery/mecha_part_fabricator/mechfab = fabricator
+ return new build_path(newloc, mechfab.manufacturer)
+ return ..()
+
/datum/design/item/mechfab/robot/exoskeleton
name = "Robot exoskeleton"
id = "robot_exoskeleton"
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 9cb029f58e..c91a22d89f 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -196,7 +196,7 @@
reagents.remove_reagent(C, D.chemicals[C] * mat_efficiency)
if(D.build_path)
- var/obj/new_item = new D.build_path(src)
+ var/obj/new_item = D.Fabricate(src, src)
new_item.loc = loc
if(mat_efficiency != 1) // No matter out of nowhere
if(new_item.matter && new_item.matter.len > 0)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 6f474fe06d..efb05b90d7 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -79,10 +79,6 @@
griefProtection()
..()
-/obj/machinery/r_n_d/server/blob_act()
- griefProtection()
- ..()
-
//Backup files to centcomm to help admins recover data after greifer attacks
/obj/machinery/r_n_d/server/proc/griefProtection()
for(var/obj/machinery/r_n_d/server/centcom/C in machines)
diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/research/xenoarchaeology/machinery/coolant.dm
index ac56d07f99..62dde2edd5 100644
--- a/code/modules/research/xenoarchaeology/machinery/coolant.dm
+++ b/code/modules/research/xenoarchaeology/machinery/coolant.dm
@@ -13,9 +13,6 @@
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
explode()
-/obj/structure/reagent_dispensers/coolanttank/blob_act()
- explode()
-
/obj/structure/reagent_dispensers/coolanttank/ex_act()
explode()
diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
index 378848e26e..ed23b965df 100644
--- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
+++ b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
@@ -1,6 +1,6 @@
/obj/machinery/radiocarbon_spectrometer
- name = "Radiocarbon spectrometer"
+ name = "radiocarbon spectrometer"
desc = "A specialised, complex scanner for gleaning information on all manner of small things."
anchored = 1
density = 1
@@ -91,9 +91,13 @@
user << "You remove [amount_transferred]u of coolant from [src]."
update_coolant()
return
+ if(scanned_item)
+ user << "\The [src] already has \a [scanned_item] inside!"
+ return
user.drop_item()
I.loc = src
scanned_item = I
+ user << "You put \the [I] into \the [src]."
/obj/machinery/radiocarbon_spectrometer/proc/update_coolant()
var/total_purity = 0
diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm
index 7b5449074f..9e8a752122 100644
--- a/code/modules/shieldgen/emergency_shield.dm
+++ b/code/modules/shieldgen/emergency_shield.dm
@@ -87,9 +87,6 @@
if(prob(50))
qdel(src)
-/obj/machinery/shield/blob_act()
- qdel(src)
-
/obj/machinery/shield/hitby(AM as mob|obj)
//Let everyone know we've been hit!
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index 3862632916..ddc56dad3f 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -116,11 +116,6 @@
..()
healthcheck()
-/obj/vehicle/blob_act()
- src.health -= rand(20,40)*fire_dam_coeff
- healthcheck()
- return
-
/obj/vehicle/ex_act(severity)
switch(severity)
if(1.0)
diff --git a/code/world.dm b/code/world.dm
index af96bdab4b..ef5c8c91db 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -209,6 +209,69 @@ var/world_topic_spam_protect_time = world.timeofday
return list2params(positions)
+ else if(copytext(T,1,5) == "info")
+ var/input[] = params2list(T)
+ if(input["key"] != config.comms_password)
+ if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50)
+
+ spawn(50)
+ world_topic_spam_protect_time = world.time
+ return "Bad Key (Throttled)"
+
+ world_topic_spam_protect_time = world.time
+ world_topic_spam_protect_ip = addr
+
+ return "Bad Key"
+
+ var/search = input["info"]
+ var/ckey = ckey(search)
+
+ var/list/match = list()
+
+ for(var/mob/M in mob_list)
+ if(findtext(M.name, search))
+ match += M
+ else if(M.ckey == ckey)
+ match += M
+ else if(M.mind && findtext(M.mind.assigned_role, search))
+ match += M
+
+ if(!match.len)
+ return "No matches"
+ else if(match.len == 1)
+ var/mob/M = match[1]
+ var/info = list()
+ info["key"] = M.key
+ info["name"] = M.name == M.real_name ? M.name : "[M.name] ([M.real_name])"
+ info["role"] = M.mind ? (M.mind.assigned_role ? M.mind.assigned_role : "No role") : "No mind"
+ var/turf/MT = get_turf(M)
+ info["loc"] = M.loc ? "[M.loc]" : "null"
+ info["turf"] = MT ? "[MT] @ [MT.x], [MT.y], [MT.z]" : "null"
+ info["area"] = MT ? "[MT.loc]" : "null"
+ info["antag"] = M.mind ? (M.mind.special_role ? M.mind.special_role : "Not antag") : "No mind"
+ info["hasbeenrev"] = M.mind ? M.mind.has_been_rev : "No mind"
+ info["stat"] = M.stat
+ info["type"] = M.type
+ if(isliving(M))
+ var/mob/living/L = M
+ info["damage"] = list2params(list(
+ oxy = L.getOxyLoss(),
+ tox = L.getToxLoss(),
+ fire = L.getFireLoss(),
+ brute = L.getBruteLoss(),
+ clone = L.getCloneLoss(),
+ brain = L.getBrainLoss()
+ ))
+ else
+ info["damage"] = "non-living"
+ info["gender"] = M.gender
+ return list2params(info)
+ else
+ var/list/ret = list()
+ for(var/mob/M in match)
+ ret[M.key] = M.name
+ return list2params(ret)
+
else if(copytext(T,1,9) == "adminmsg")
/*
We got an adminmsg from IRC bot lets split the input then validate the input.
diff --git a/html/changelogs/HarpyEagle-dev-freeze.yml b/html/changelogs/HarpyEagle-dev-freeze.yml
deleted file mode 100644
index a999f1236d..0000000000
--- a/html/changelogs/HarpyEagle-dev-freeze.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-author: HarpyEagle
-changes: []
-delete-after: false
diff --git a/html/changelogs/HarpyEagle-dev.yml b/html/changelogs/HarpyEagle-dev.yml
deleted file mode 100644
index a999f1236d..0000000000
--- a/html/changelogs/HarpyEagle-dev.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-author: HarpyEagle
-changes: []
-delete-after: false
diff --git a/html/changelogs/HarpyEagle-powercellsanity.yml b/html/changelogs/HarpyEagle-powercellsanity.yml
new file mode 100644
index 0000000000..fba91c796d
--- /dev/null
+++ b/html/changelogs/HarpyEagle-powercellsanity.yml
@@ -0,0 +1,27 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+author: HarpyEagle
+changes:
+ - tweak: "Fabricated power cells start uncharged."
+delete-after: true
diff --git a/html/changelogs/Hubblenaut-dev.yml b/html/changelogs/Hubblenaut-dev.yml
new file mode 100644
index 0000000000..5c87376685
--- /dev/null
+++ b/html/changelogs/Hubblenaut-dev.yml
@@ -0,0 +1,39 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Hubblenaut
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Light replacers can be refilled by clicking on a storage item."
+ - tweak: "Light replacers now hold up to 32 light bulbs."
+ - tweak: "Light replacers can be obtained through janitorial supply crates."
+ - tweak: "A sheet of glass fills the light replacer by 16 bulbs."
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index 486e578cb6..b68ccd373c 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi
index 3da8e52c6b..74bb7a7beb 100644
Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 671573fdbc..879afcf3ae 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -71,6 +71,14 @@ macro "borghotkeymode"
name = "SOUTH+REP"
command = ".south"
is-disabled = false
+ elem
+ name = "INSERT"
+ command = "a-intent right"
+ is-disabled = false
+ elem
+ name = "DELETE"
+ command = "delete-key-pressed"
+ is-disabled = false
elem
name = "1"
command = "toggle-module 1"
@@ -103,14 +111,6 @@ macro "borghotkeymode"
name = "CTRL+4"
command = "a-intent left"
is-disabled = false
- elem
- name = "INSERT"
- command = "a-intent right"
- is-disabled = false
- elem
- name = "DELETE"
- command = "delete-key-pressed"
- is-disabled = false
elem
name = "5"
command = ".me"
@@ -359,7 +359,7 @@ macro "macro"
is-disabled = false
elem
name = "CTRL+4"
- command = "a-intent hurt"
+ command = "a-intent harm"
is-disabled = false
elem
name = "CTRL+A+REP"
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index 944152f752..5f26ef7845 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -7273,6 +7273,7 @@
"cJS" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineVent"; name = "Reactor Vent"; p_open = 0},/turf/simulated/floor/reinforced,/area/engineering/engine_room)
"cJT" = (/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cJU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/solar/port)
+"cJV" = (/obj/structure/table/rack,/obj/item/weapon/rig/medical,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"cJW" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/engi_engine)
"cJX" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/engi_engine)
"cJY" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/maintenance/engi_engine)
@@ -7472,7 +7473,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbDdbDubDjbdPbdPbDNbvZbvZbvZbDWbdPbdPbEvbFbbFabdPbGtbGtbGtbFfbGtbGvbFgbFjbFhbFkbtCbAJbyLbFlbGBbtCbtGbtGbtGbtGbtGbHVbtGbtGbtGbFmbtGbtGbtGbtGbtGbFnbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibvMaQiaKYbEbbFobEcbFqbFpbFtbFsbFvbFubFxbFwbFzbxKbFFbFEbFJbFHbFLbFKbFNbFMbFPbFObFSbFRbFWbHbbHcbFXbFZbFYbCpbGebGfbwwbwwbwwbwwbwwbGgbwwbwwbwwbzAbFTbzAbzAbGlbAgbGmbBqbCBbGrbGubGsbGxbGwbGybGabGbbGcbHraaaaaabCJbGzbAAbGDbGAbGGbGFbGIbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbGKbGJbGMbGLbLrbGNbGPbGObGQbtCbAJbyLbyObyMbGSbGRbGUbGTbGWbGVbGYbGXbHabGZbHebHdbHfbyMbyMbHibHkbHjbyMbHlbyMbyKbGWbyKbHnbHmbHpbHobvMaQibCvaJlbDtbGnbDtbHqbHsbxCbHvbHtbHxbHwbHzbHybHBbHAbHDbHCbwmbHEbHHbHFbDJbHJbHLbHKbIqbKfbFDbHMbFDbEVbCpbKhbIwbIxbIybHNbHPbHObHRbHQbHTbIFbHWbHUbHXbIJbzAbHYbGmbBqbGobHZbIcbIbbIebIdbIfbGabGbbISbEnbEnbEnbCJbCJbCJbGqbGpbCJbCJbFVbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabLaaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbIhbIgbIjbIicLYbIkbImbIlbInbtCbAJbIobIrbIpbIpbIsbIubItbIvbItbIubIsbIpbIpbIBbIAbIDbICbIHbIGbIIbIpbIpbIKbIubItbIvbItbIMbILbINbILbIPbIObusaJlbIRbIQbITbEdbIUbGHbCzbIVbFibDVbxFbIWbCFbDSbCHbIXbwkbIYbJabIZbDJbJbbJdbJcbJNbFDbFDbJPbFDbFDbCpbJebJfbIxbJibJgbJkbJjbJmbJlbJnbIFbJpbJobJqbJqbzAbJrbJtbJsbJvbJubJxbJwbJAbJybJCbGabGbbKlbEnbKmbMIbJDbEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbJHbJGbJGbJIbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabJKbJJbKxbJJbJLaaaaaaaaabGtbGtbJObJMbIjbJMbMPbJQbJSbJRbJTbtCbJUbAJbJWbJVbyMbJXbyMbyKbGWbyKbyMbJYbKabJZbKcbKbbyObyMbKebKdbHabKgbHabHabKjbKibKkbKibKobKnbbBbKpaKYaKYaKYaJlbKqbEfbEhbKrbKwbKvbKBbKybFIbKCbKEbKDbKFbHgbCHbHCbIabIzbHhbDJbDJbLobLobLobCpbKGbLqbKHbLsbKIbCpbKKbKLbIxbLwbFGbHPbKMbKObKNbKPbIFbKRbKQbJqbJqbzAbKSbKWbKVbwwbKXbKZbKYbLcbLbbLdbGabLebLNbLfbLfbLfbLgbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLhbLTbLibLTbKsbKtbKtbLjbLkbLjbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabJKbJJbKxbJJbJLaaaaaaaaabGtbGtbJObJMbIjbJMbMPbJQbJSbJRbJTbtCbJUbAJbJWbJVbyMbJXbyMbyKbGWbyKbyMbJYbKabJZbKcbKbbyObyMbKebKdbHabKgbHabHabKjbKibKkbKibKobKnbbBbKpaKYaKYaKYaJlbKqbEfbEhbKrbKwbKvbKBbKybFIbKCcJVbKDbKFbHgbCHbHCbIabIzbHhbDJbDJbLobLobLobCpbKGbLqbKHbLsbKIbCpbKKbKLbIxbLwbFGbHPbKMbKObKNbKPbIFbKRbKQbJqbJqbzAbKSbKWbKVbwwbKXbKZbKYbLcbLbbLdbGabLebLNbLfbLfbLfbLgbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLhbLTbLibLTbKsbKtbKtbLjbLkbLjbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLnbNAbLXbNBbLnbHGbHSbHIbGtbLpbLubLtbLxbLvbLzbLybLAbLAbLBbtCbtCbtCbNQbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbLDbLCbLEbtCbtCbtCbtCbtCbLFbtCbtCbtCaJlaJlbObaJlaJQaKXbLGaJlbLIbLHbLJbEdbLKbxCbCzbLLbxCbLMbKEbLObLPbwkbLRbLQbMEbLSbLVbLUbLYbLWbMKbFDbFDbFDbFDbFDbLZbFDbCpbPObMObMObMObMObMObMObMObMObMObMObMcbMabMdbMdbzAbMebMgbMfbwwbMVbMVbMVbMjbMibMkbMVbMVbMVbMVbMVbMVbGbbNbaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapbMlbLTbLTbMmbKtbKtbLjbLjbMnbLjbLjbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbNgbMsbNgbKxbJhbMpbMobGtbMqbMrbJMbMvbMubGvbMwbMybMxbMzbGvbMBbMAbMCbNxaaaaaaaaaaaabNybOLbONbOMbNDbNCbNEbNFbMDbMDbMFbNFbMHbMGbMLbMJbMNbMMbMRbMQbMSbPxbMUbNUbNUbNUbNUbDtbDtbDtbDtbMWbMWbxCbMYbMXbMZbKEbNcbNabNebNdbNhbNfbNjbNibNlbNkbNnbNmbMKbNobFDbFDbNVbFDbFDbNobCpbPObMObNpbNrbNqbNtbNsbNvbNubNzbMObNHbNGbNIbNIbzAbNJbNKbBqbzIbNLbNNbNMbNPbNObNSbNRbNWbNTbNYbNXbMVbPZbEnbOObOObOObOObOOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabOPbKtbMlbKtbKtbLjbLjbLjbLjbLjbLjbLjbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLnbNgbNgbNgbOabNZbKAbOcbOebOdbOgbOfbOibOhbGvbGvbGvbGvbGvbGvbOjbOYbOZbKzaaabKJbKTbKTbKUbQjbPfbPgbPhbPfbOkbNFbOmbOlbOnbNFbOpbOobOrbOqbOtbOsbOubPtbPtbPxbOvbQpbPwbPxbOwbDtbOxbEdbOybEdbEdbOzbCzbOAbxCbOBbOFbOEbOGbwkbOIbOHbwkbOJbOQbOKbOSbORbMKbCpbCpbCpbCpbCpbCpbCpbCpbPObMObOTbOVbOUbNqbNqbNqbNqbOWbMObOXbKQbPebPebzAbAgbKWbBqbPkbPibPibPlbPnbPmbPpbPobPqbPqbPqbPrbMVbPsbPubOObPybPvbPzbMbaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbPBbPAbPAbLjbLjbLjbLjbLjbLjbLjbLjbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa