diff --git a/baystation12.dme b/baystation12.dme index 90696cdb7d8..4960e16609d 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 aa32b0016ec..f3568553389 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 3ee4e26a7a8..85836281143 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 1486e546481..6d8689b9336 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 6c5da7817ad..59004934d70 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 a7348890da4..7951db5196a 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 0768e11c820..81dc42e620f 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 36fa0a9e6aa..d24d9322a56 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 5dd1b542cfa..cbc72202000 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 7441ac56095..eb31c7019b5 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 fb33002ea06..2e84cec43ca 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 9374de6a6a7..c76b5fe1851 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 78b753ed34c..36f5216045a 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 db8c74a14f6..b5f62868dc5 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 1fd3df90db4..ea107824d5a 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 bce75e2abf8..77279ab1171 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 9b396396a8e..29d519355e8 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 f3d60d48ada..00000000000 --- 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 418ceab13ad..00000000000 --- 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 d12bfaa7541..00000000000 --- 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 3897d444e8e..00000000000 --- 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 c1d14d00402..00000000000 --- 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 92572f9a7b0..00000000000 --- 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 c47696c72e3..00000000000 --- 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 123bb97a3fe..00000000000 --- 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 28b482414a2..00000000000 --- 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 69794c9af33..0d9519504f1 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 d156e417f9a..11f3c55ef57 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 c8e129ab8cc..8f0a0535b14 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 3e456dfe699..788fdd48ed9 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 e0a837b4ce6..73da615720f 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 88d8f8dd7ec..7e03826f055 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 a24a79ac127..fa921762814 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 0a22ccd6c41..35cd31399ef 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 6b6a2f84914..37d9a67d924 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 4e874a34dd4..2ffa495b706 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 df0d808be95..7bb1a9b4e5a 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 ccf2fb97ae3..0140a33fe37 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 daa2123d1c6..2d1680aa7d4 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 1383bf56e7e..5f57174074a 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 709f4b46263..455c6256a4f 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 85b387fe7b9..d02d3522a4a 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 6a6d4df1fda..ef72e18f0ff 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 7fc5f17e86d..0685e6efd20 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 99a68e13634..b29b2440e6c 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 ff7cecf169c..9fa9ce9ff28 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 bc0f8364875..20abf3401be 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 0ed8ad7b7b2..40185d6a097 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 c1022c55d0f..78665633cfd 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 b8e6fc6ecb1..a0340c1cd2c 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 98e9ccdc5cd..35302dc5dcd 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 1f25043e894..f8b9c37ae46 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 900f2d73c21..df94cf95ac9 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 b680002df8f..105f2987df3 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 3f5508fb973..2ff44ee9dfe 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 5d5b88b886e..8ce2a88f244 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 82745766411..0e2efb1c9ec 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 f3f70d53d8f..0691d3d68e1 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 c6b108825b0..3d867111cce 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 cc87be62fab..3b5bdb56aaa 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 e0923119b01..a3904f65a1b 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 f5c988ae972..38d3e5cde77 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 29c504edd3e..73914e113cc 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 2228345ebbf..e4840bedc63 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 43305bedb9f..440cc6a8a28 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 73fa3e01a34..21573970503 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 d703fdcbd3a..8c79f20403c 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 61835c9afdd..a4605187260 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 b9d564d1925..ced6d257bf4 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 00000000000..a2de592b84c --- /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 c478a28daa2..bc1888f14df 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 18e061f2739..4c0d0a755e6 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 2afb02ffd95..c42f76623c4 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 8bbf517e60e..00000000000 --- 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 14835591203..99c5e52f75d 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 bcec368d7d4..78129c4910f 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 86f8f2d6722..5f4876d1dd2 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 0d4a5d77b48..d7a989756d0 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 d67eb277535..b5ddfcedd91 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 5336cd873f3..76625cdc3df 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 cb90cd176b4..0c53adc467c 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 8e6f3207fb2..f3d7ffd848e 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 25b321a9a7e..42d5c6e6f68 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 836b5224b6d..6d24a8f238d 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 9fd35c2c265..8c7af58346e 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 700fad25ad0..4f89687fb4e 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 3ad0754d849..6d25a0f25e1 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 ebae74cd274..599dadc4a4b 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 bf3393f9032..9952a974424 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 1b798df2bd2..751e2cf1578 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 5532f8ce9ea..6368e7348d6 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 ec659eca583..f6770d48c07 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 76cdf04f0ad..608f8c283cf 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 ea5377c98b7..232adb345b8 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 01f3a352311..d597e9d8efe 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 7406dff6b71..f52d905fee5 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 0f8df78262e..dd796d7147b 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 ce5fb4670bd..98eb37bebd4 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 cfdce572b11..e83774468c5 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 9cb029f58ef..c91a22d89f5 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 6f474fe06db..efb05b90d75 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 ac56d07f990..62dde2edd56 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 378848e26ea..ed23b965dfe 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 7b5449074fe..9e8a752122b 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 3862632916f..ddc56dad3f6 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 af96bdab4bc..ef5c8c91db7 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 a999f1236dc..00000000000 --- 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 a999f1236dc..00000000000 --- 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 00000000000..fba91c796d2 --- /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 00000000000..5c87376685a --- /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 486e578cb6d..b68ccd373c5 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 3da8e52c6ba..74bb7a7beb5 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 671573fdbc5..879afcf3aea 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 944152f7523..5f26ef7845f 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