From 765d0ddca9097fc2d09e66db5a5cfde856ed29cd Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Wed, 15 Jun 2016 02:55:48 +0300 Subject: [PATCH 01/99] goodies only pistols, no list yet --- code/modules/projectiles/ammunition/magazines.dm | 3 +++ code/modules/projectiles/guns/projectile/pistol.dm | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index c77dcc07595..a00f6f16747 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -180,6 +180,9 @@ max_ammo = 8 multiple_sprites = 2 +/obj/item/ammo_box/magazine/m10mm/empty //for maint drops + max_ammo = 1 + /obj/item/ammo_box/magazine/m45 name = "handgun magazine (.45)" icon_state = "45-8" diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index b2c0aa823be..a0858bbb9ad 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -26,6 +26,14 @@ mag_type = /obj/item/ammo_box/magazine/m45 can_suppress = 0 +/obj/item/weapon/gun/projectile/automatic/pistol/empty //empty stetchshit for maint spawns + desc = "A small, easily concealable 10mm handgun. Had a threaded barrel for suppressors." + can_suppress = 0 + +/obj/item/weapon/gun/projectile/automatic/pistol/empty/New() + magazine = new /obj/item/ammo_box/magazine/m10mm/empty(src) + ..() + /obj/item/weapon/gun/projectile/automatic/pistol/deagle name = "desert eagle" desc = "A robust .50 AE handgun." From 9e95dfcd17e07e094406c6900ae17ae17b8f480a Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Thu, 16 Jun 2016 00:09:13 +0300 Subject: [PATCH 02/99] added the actual items to the list --- .../game/objects/effects/spawners/lootdrop.dm | 141 +++++++++++------- 1 file changed, 84 insertions(+), 57 deletions(-) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index d88d5a309d1..136677fac75 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -58,65 +58,92 @@ //maintcentral: 2 items, 2 spots 0 extra (08/08/2014) //port: 5 items, 5 spots 0 extra (08/08/2014) loot = list( - /obj/item/bodybag = 1, - /obj/item/clothing/glasses/meson = 2, - /obj/item/clothing/glasses/sunglasses = 1, - /obj/item/clothing/gloves/color/yellow/fake = 1, - /obj/item/clothing/head/hardhat = 1, - /obj/item/clothing/head/hardhat/red = 1, - /obj/item/clothing/head/that{throwforce = 1; throwing = 1} = 1, - /obj/item/clothing/head/ushanka = 1, - /obj/item/clothing/head/welding = 1, - /obj/item/clothing/mask/gas = 15, - /obj/item/clothing/suit/storage/hazardvest = 1, - /obj/item/clothing/under/rank/vice = 1, - /obj/item/device/assembly/prox_sensor = 4, - /obj/item/device/assembly/timer = 3, - /obj/item/device/flashlight = 4, - /obj/item/device/flashlight/pen = 1, - /obj/item/device/multitool = 2, - /obj/item/device/radio/off = 2, - /obj/item/device/t_scanner = 6, - /obj/item/stack/cable_coil = 4, - /obj/item/stack/cable_coil{amount = 5} = 6, - /obj/item/stack/medical/advanced/bruise_pack = 1, - /obj/item/stack/rods{amount = 10} = 9, - /obj/item/stack/rods{amount = 23} = 1, - /obj/item/stack/rods{amount = 50} = 1, + /obj/item/bodybag = 10, + /obj/item/clothing/glasses/meson = 20, + /obj/item/clothing/glasses/sunglasses = 10, + /obj/item/clothing/gloves/color/yellow/fake = 10, + /obj/item/clothing/head/hardhat = 10, + /obj/item/clothing/head/hardhat/red = 10, + /obj/item/clothing/head/that{throwforce = 1; throwing = 1} = 10, + /obj/item/clothing/head/ushanka = 10, + /obj/item/clothing/head/welding = 10, + /obj/item/clothing/mask/gas = 150, + /obj/item/clothing/suit/storage/hazardvest = 10, + /obj/item/clothing/under/rank/vice = 10, + /obj/item/device/assembly/prox_sensor = 40, + /obj/item/device/assembly/timer = 30, + /obj/item/device/flashlight = 40, + /obj/item/device/flashlight/pen = 10, + /obj/item/device/multitool = 20, + /obj/item/device/radio/off = 20, + /obj/item/device/t_scanner = 60, + /obj/item/stack/cable_coil = 40, + /obj/item/stack/cable_coil{amount = 5} = 60, + /obj/item/stack/medical/advanced/bruise_pack = 10, + /obj/item/stack/rods{amount = 10} = 90, + /obj/item/stack/rods{amount = 23} = 10, + /obj/item/stack/rods{amount = 50} = 10, /obj/item/stack/sheet/cardboard = 2, - /obj/item/stack/sheet/metal{amount = 20} = 1, - /obj/item/stack/sheet/mineral/plasma{layer = 2.9} = 1, - /obj/item/stack/sheet/rglass = 1, - /obj/item/weapon/book/manual/engineering_construction = 1, - /obj/item/weapon/book/manual/engineering_hacking = 1, - /obj/item/clothing/head/cone = 1, - /obj/item/weapon/coin/silver = 1, - /obj/item/weapon/coin/twoheaded = 1, - /obj/item/weapon/contraband/poster = 1, - /obj/item/weapon/crowbar = 1, - /obj/item/weapon/crowbar/red = 1, - /obj/item/weapon/extinguisher = 11, + /obj/item/stack/sheet/metal{amount = 20} = 10, + /obj/item/stack/sheet/mineral/plasma{layer = 2.9} = 10, + /obj/item/stack/sheet/rglass = 10, + /obj/item/weapon/book/manual/engineering_construction = 10, + /obj/item/weapon/book/manual/engineering_hacking = 10, + /obj/item/clothing/head/cone = 10, + /obj/item/weapon/coin/silver = 10, + /obj/item/weapon/coin/twoheaded = 10, + /obj/item/weapon/contraband/poster = 10, + /obj/item/weapon/crowbar = 10, + /obj/item/weapon/crowbar/red = 10, + /obj/item/weapon/extinguisher = 110, //obj/item/weapon/gun/projectile/revolver/russian = 1, //disabled until lootdrop is a proper world proc. - /obj/item/weapon/hand_labeler = 1, - /obj/item/weapon/paper/crumpled = 1, - /obj/item/weapon/pen = 1, - /obj/item/weapon/plantspray/pests = 1, - /obj/item/weapon/stock_parts/cell = 3, - /obj/item/weapon/storage/belt/utility = 2, - /obj/item/weapon/storage/box = 2, - /obj/item/weapon/storage/box/cups = 1, - /obj/item/weapon/storage/box/donkpockets = 1, - /obj/item/weapon/storage/box/lights/mixed = 3, - /obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 1, - /obj/item/weapon/storage/toolbox/mechanical = 1, - /obj/item/weapon/screwdriver = 3, - /obj/item/weapon/tank/emergency_oxygen = 2, - /obj/item/weapon/vending_refill/cola = 1, - /obj/item/weapon/weldingtool = 3, - /obj/item/weapon/wirecutters = 1, - /obj/item/weapon/wrench = 4, - /obj/item/weapon/relic = 3, - "" = 11 + /obj/item/weapon/hand_labeler = 10, + /obj/item/weapon/paper/crumpled = 10, + /obj/item/weapon/pen = 10, + /obj/item/weapon/plantspray/pests = 10, + /obj/item/weapon/stock_parts/cell = 30, + /obj/item/weapon/storage/belt/utility = 20, + /obj/item/weapon/storage/box = 20, + /obj/item/weapon/storage/box/cups = 10, + /obj/item/weapon/storage/box/donkpockets = 10, + /obj/item/weapon/storage/box/lights/mixed = 30, + /obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 10, + /obj/item/weapon/storage/toolbox/mechanical = 10, + /obj/item/weapon/screwdriver = 30, + /obj/item/weapon/tank/emergency_oxygen = 20, + /obj/item/weapon/vending_refill/cola = 10, + /obj/item/weapon/weldingtool = 30, + /obj/item/weapon/wirecutters = 10, + /obj/item/weapon/wrench = 40, + /obj/item/weapon/relic = 30, + ////////////////CONTRABAND SHIT////////////////// + /obj/item/weapon/grenade/clown_grenade = 5, + /obj/item/seeds/ambrosiavulgarisseed/cruciatus = 5, + /obj/item/clothing/under/contortionist = 5, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/stimulants = 5, + /obj/item/weapon/gun/projectile/automatic/pistol/empty = 1, + /obj/item/ammo_box/magazine/m10mm = 10, + /obj/item/weapon/soap/syndie = 20, + /obj/item/weapon/gun/syringe/syndicate = 5, + /obj/item/weapon/suppressor = 10, + /obj/item/clothing/under/chameleon = 5, + /obj/item/weapon/stamp/chameleon = 5, + /obj/item/clothing/shoes/syndigaloshes = 15, + /obj/item/clothing/mask/gas/voice = 5, + /obj/item/weapon/dnascrambler = 3, + /obj/item/weapon/storage/backpack/satchel_flat = 5, + /obj/item/weapon/storage/toolbox/syndicate = 5, + /obj/item/weapon/storage/backpack/duffel/syndie/surgery = 5, + /obj/item/weapon/storage/belt/military = 5, + /obj/item/weapon/storage/box/syndie_kit/space = 5, + /obj/item/clothing/glasses/thermal/syndi = 1, + /obj/item/device/encryptionkey/binary = 1, + /obj/item/weapon/c4 = 3, + /obj/item/weapon/pinpointer/advpinpointer = 1, + /obj/item/device/multitool/ai_detect = 5, + /obj/item/weapon/implanter/freedom = 1, + /obj/item/weapon/implanter/storage = 1, + "" = 90 ) /obj/effect/spawner/lootdrop/trade_sol_rare From e712baf111b1bfdac98d3399a0f47698a6479f34 Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Thu, 16 Jun 2016 04:26:51 +0300 Subject: [PATCH 03/99] removed thermals, binary key and adrenal implants from the list --- code/game/objects/effects/spawners/lootdrop.dm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 136677fac75..ba0bb68f7b3 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -116,7 +116,7 @@ /obj/item/weapon/wirecutters = 10, /obj/item/weapon/wrench = 40, /obj/item/weapon/relic = 30, - ////////////////CONTRABAND SHIT////////////////// + ////////////////CONTRABAND SHIT////////////////// /obj/item/weapon/grenade/clown_grenade = 5, /obj/item/seeds/ambrosiavulgarisseed/cruciatus = 5, /obj/item/clothing/under/contortionist = 5, @@ -136,12 +136,8 @@ /obj/item/weapon/storage/backpack/duffel/syndie/surgery = 5, /obj/item/weapon/storage/belt/military = 5, /obj/item/weapon/storage/box/syndie_kit/space = 5, - /obj/item/clothing/glasses/thermal/syndi = 1, - /obj/item/device/encryptionkey/binary = 1, /obj/item/weapon/c4 = 3, - /obj/item/weapon/pinpointer/advpinpointer = 1, /obj/item/device/multitool/ai_detect = 5, - /obj/item/weapon/implanter/freedom = 1, /obj/item/weapon/implanter/storage = 1, "" = 90 ) From bbb94651088c29bfb5ac1385afd2155065dadf61 Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Thu, 16 Jun 2016 05:00:28 +0300 Subject: [PATCH 04/99] removes stimulants (oops) adds syndicards, regular brown shoes and syndicate briefcase to loot drop list (double oops) --- code/game/objects/effects/spawners/lootdrop.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index ba0bb68f7b3..bd0952a482b 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -80,7 +80,7 @@ /obj/item/stack/cable_coil = 40, /obj/item/stack/cable_coil{amount = 5} = 60, /obj/item/stack/medical/advanced/bruise_pack = 10, - /obj/item/stack/rods{amount = 10} = 90, + /obj/item/stack/rods{amount = 10} = 80, /obj/item/stack/rods{amount = 23} = 10, /obj/item/stack/rods{amount = 50} = 10, /obj/item/stack/sheet/cardboard = 2, @@ -95,7 +95,7 @@ /obj/item/weapon/contraband/poster = 10, /obj/item/weapon/crowbar = 10, /obj/item/weapon/crowbar/red = 10, - /obj/item/weapon/extinguisher = 110, + /obj/item/weapon/extinguisher = 90, //obj/item/weapon/gun/projectile/revolver/russian = 1, //disabled until lootdrop is a proper world proc. /obj/item/weapon/hand_labeler = 10, /obj/item/weapon/paper/crumpled = 10, @@ -116,11 +116,11 @@ /obj/item/weapon/wirecutters = 10, /obj/item/weapon/wrench = 40, /obj/item/weapon/relic = 30, - ////////////////CONTRABAND SHIT////////////////// + /obj/item/clothing/shoes/brown = 30, + ////////////////CONTRABAND STUFF////////////////// /obj/item/weapon/grenade/clown_grenade = 5, /obj/item/seeds/ambrosiavulgarisseed/cruciatus = 5, /obj/item/clothing/under/contortionist = 5, - /obj/item/weapon/reagent_containers/hypospray/autoinjector/stimulants = 5, /obj/item/weapon/gun/projectile/automatic/pistol/empty = 1, /obj/item/ammo_box/magazine/m10mm = 10, /obj/item/weapon/soap/syndie = 20, @@ -139,6 +139,8 @@ /obj/item/weapon/c4 = 3, /obj/item/device/multitool/ai_detect = 5, /obj/item/weapon/implanter/storage = 1, + /obj/item/toy/cards/deck/syndicate = 5, + /obj/item/weapon/storage/secure/briefcase/syndie = 5, "" = 90 ) From f7949d77e1218d85b79c62d89b4090034f96c79b Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Thu, 16 Jun 2016 21:42:58 +0300 Subject: [PATCH 05/99] i have no clue what i did here but it made me make a commit so --- code/modules/projectiles/guns/projectile/pistol.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index a0858bbb9ad..661a14a44b4 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -27,12 +27,10 @@ can_suppress = 0 /obj/item/weapon/gun/projectile/automatic/pistol/empty //empty stetchshit for maint spawns - desc = "A small, easily concealable 10mm handgun. Had a threaded barrel for suppressors." - can_suppress = 0 /obj/item/weapon/gun/projectile/automatic/pistol/empty/New() - magazine = new /obj/item/ammo_box/magazine/m10mm/empty(src) - ..() + magazine = new /obj/item/ammo_box/magazine/m10mm/empty(src) + ..() /obj/item/weapon/gun/projectile/automatic/pistol/deagle name = "desert eagle" From 950b7185513f3967dc1711789485fd77c76b0014 Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Fri, 17 Jun 2016 16:56:07 +0300 Subject: [PATCH 06/99] adds extended oxygen tank to list, also fixed indentation in last commit I think --- code/game/objects/effects/spawners/lootdrop.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index bd0952a482b..5a56fcc893d 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -67,7 +67,7 @@ /obj/item/clothing/head/that{throwforce = 1; throwing = 1} = 10, /obj/item/clothing/head/ushanka = 10, /obj/item/clothing/head/welding = 10, - /obj/item/clothing/mask/gas = 150, + /obj/item/clothing/mask/gas = 140, /obj/item/clothing/suit/storage/hazardvest = 10, /obj/item/clothing/under/rank/vice = 10, /obj/item/device/assembly/prox_sensor = 40, @@ -111,6 +111,7 @@ /obj/item/weapon/storage/toolbox/mechanical = 10, /obj/item/weapon/screwdriver = 30, /obj/item/weapon/tank/emergency_oxygen = 20, + /obj/item/weapon/tank/emergency_oxygen/engi = 10, /obj/item/weapon/vending_refill/cola = 10, /obj/item/weapon/weldingtool = 30, /obj/item/weapon/wirecutters = 10, From 5f74dacf6ac450bbb4601fa6109655646ad3200a Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Mon, 20 Jun 2016 01:19:06 +0300 Subject: [PATCH 07/99] Adds duct tape, makes everything rarer, adds a new surgery bag to replace the current one, adds regular shoes and black jumpsuits --- .../game/objects/effects/spawners/lootdrop.dm | 48 ++++++++++--------- .../objects/items/weapons/storage/backpack.dm | 19 ++++++++ 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 5a56fcc893d..542b673b325 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -67,7 +67,7 @@ /obj/item/clothing/head/that{throwforce = 1; throwing = 1} = 10, /obj/item/clothing/head/ushanka = 10, /obj/item/clothing/head/welding = 10, - /obj/item/clothing/mask/gas = 140, + /obj/item/clothing/mask/gas = 100, /obj/item/clothing/suit/storage/hazardvest = 10, /obj/item/clothing/under/rank/vice = 10, /obj/item/device/assembly/prox_sensor = 40, @@ -83,7 +83,7 @@ /obj/item/stack/rods{amount = 10} = 80, /obj/item/stack/rods{amount = 23} = 10, /obj/item/stack/rods{amount = 50} = 10, - /obj/item/stack/sheet/cardboard = 2, + /obj/item/stack/sheet/cardboard = 20, /obj/item/stack/sheet/metal{amount = 20} = 10, /obj/item/stack/sheet/mineral/plasma{layer = 2.9} = 10, /obj/item/stack/sheet/rglass = 10, @@ -118,30 +118,32 @@ /obj/item/weapon/wrench = 40, /obj/item/weapon/relic = 30, /obj/item/clothing/shoes/brown = 30, + /obj/item/seeds/ambrosiadeusseed = 10, + /obj/item/seeds/ambrosiavulgarisseed = 20, + /obj/item/clothing/under/color/black = 30, + /obj/item/stack/tape_roll = 10, ////////////////CONTRABAND STUFF////////////////// - /obj/item/weapon/grenade/clown_grenade = 5, - /obj/item/seeds/ambrosiavulgarisseed/cruciatus = 5, - /obj/item/clothing/under/contortionist = 5, + /obj/item/weapon/grenade/clown_grenade = 4, + /obj/item/seeds/ambrosiavulgarisseed/cruciatus = 4, /obj/item/weapon/gun/projectile/automatic/pistol/empty = 1, - /obj/item/ammo_box/magazine/m10mm = 10, - /obj/item/weapon/soap/syndie = 20, - /obj/item/weapon/gun/syringe/syndicate = 5, - /obj/item/weapon/suppressor = 10, - /obj/item/clothing/under/chameleon = 5, - /obj/item/weapon/stamp/chameleon = 5, - /obj/item/clothing/shoes/syndigaloshes = 15, - /obj/item/clothing/mask/gas/voice = 5, - /obj/item/weapon/dnascrambler = 3, - /obj/item/weapon/storage/backpack/satchel_flat = 5, - /obj/item/weapon/storage/toolbox/syndicate = 5, - /obj/item/weapon/storage/backpack/duffel/syndie/surgery = 5, - /obj/item/weapon/storage/belt/military = 5, - /obj/item/weapon/storage/box/syndie_kit/space = 5, - /obj/item/weapon/c4 = 3, - /obj/item/device/multitool/ai_detect = 5, + /obj/item/ammo_box/magazine/m10mm = 7, + /obj/item/weapon/soap/syndie = 10, + /obj/item/weapon/gun/syringe/syndicate = 3, + /obj/item/weapon/suppressor = 7, + /obj/item/clothing/under/chameleon = 3, + /obj/item/weapon/stamp/chameleon = 3, + /obj/item/clothing/shoes/syndigaloshes = 7, + /obj/item/clothing/mask/gas/voice = 3, + /obj/item/weapon/dnascrambler = 1, + /obj/item/weapon/storage/backpack/satchel_flat = 3, + /obj/item/weapon/storage/toolbox/syndicate = 3, + /obj/item/weapon/storage/backpack/duffel/syndie/surgery_fake = 3, + /obj/item/weapon/storage/belt/military = 3, + /obj/item/weapon/storage/box/syndie_kit/space = 3, + /obj/item/device/multitool/ai_detect = 3, /obj/item/weapon/implanter/storage = 1, - /obj/item/toy/cards/deck/syndicate = 5, - /obj/item/weapon/storage/secure/briefcase/syndie = 5, + /obj/item/toy/cards/deck/syndicate = 3, + /obj/item/weapon/storage/secure/briefcase/syndie = 3, "" = 90 ) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 6c59e98385f..904e7448583 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -322,6 +322,25 @@ new /obj/item/clothing/mask/muzzle(src) new /obj/item/device/mmi/syndie(src) +/obj/item/weapon/storage/backpack/duffel/syndie/surgery_fake //for maint spawns + name = "surgery dufflebag" + desc = "A suspicious looking dufflebag for holding surgery tools." + icon_state = "duffel-syndimed" + item_state = "duffle-syndimed" + +/obj/item/weapon/storage/backpack/duffel/syndie/surgery_fake/New() + ..() + new /obj/item/weapon/scalpel(src) + new /obj/item/weapon/hemostat(src) + new /obj/item/weapon/retractor(src) + new /obj/item/weapon/cautery(src) + new /obj/item/weapon/bonegel(src) + new /obj/item/weapon/bonesetter(src) + new /obj/item/weapon/FixOVein(src) + if(prob(50)) + new /obj/item/weapon/circular_saw(src) + new /obj/item/weapon/surgicaldrill(src) + /obj/item/weapon/storage/backpack/duffel/captain name = "captain's duffelbag" desc = "A duffelbag designed to hold large quantities of condoms." From d4216fbd3c591ad2f4cecb3ddf46415390f20f5e Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Wed, 22 Jun 2016 19:18:01 +0300 Subject: [PATCH 08/99] Adds a description to the magazine, emphasizing its uselessness. --- code/modules/projectiles/ammunition/magazines.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index a00f6f16747..1ed3483f1a0 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -181,6 +181,7 @@ multiple_sprites = 2 /obj/item/ammo_box/magazine/m10mm/empty //for maint drops + desc = "A gun magazine. Seems to be broken and can only hold one bullet. Pretty useless." max_ammo = 1 /obj/item/ammo_box/magazine/m45 From 9bb6a2f7dc397232608bfd03aa220e1cbafc3283 Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Sun, 3 Jul 2016 20:29:44 +0300 Subject: [PATCH 09/99] Tweaked probabilities, added black gloves, real insu gloves, mini hoe and botany tray to maint drops --- .../game/objects/effects/spawners/lootdrop.dm | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 542b673b325..4f58a38065f 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -61,13 +61,17 @@ /obj/item/bodybag = 10, /obj/item/clothing/glasses/meson = 20, /obj/item/clothing/glasses/sunglasses = 10, - /obj/item/clothing/gloves/color/yellow/fake = 10, + /obj/item/clothing/gloves/color/yellow/fake = 15, + /obj/item/clothing/gloves/color/fyellow = 10, + /obj/item/clothing/gloves/color/yellow = 5, + /obj/item/clothing/gloves/color/black = 20, + /obj/machinery/portable_atmospherics/hydroponics = 10, /obj/item/clothing/head/hardhat = 10, /obj/item/clothing/head/hardhat/red = 10, /obj/item/clothing/head/that{throwforce = 1; throwing = 1} = 10, /obj/item/clothing/head/ushanka = 10, /obj/item/clothing/head/welding = 10, - /obj/item/clothing/mask/gas = 100, + /obj/item/clothing/mask/gas = 10, /obj/item/clothing/suit/storage/hazardvest = 10, /obj/item/clothing/under/rank/vice = 10, /obj/item/device/assembly/prox_sensor = 40, @@ -81,7 +85,7 @@ /obj/item/stack/cable_coil{amount = 5} = 60, /obj/item/stack/medical/advanced/bruise_pack = 10, /obj/item/stack/rods{amount = 10} = 80, - /obj/item/stack/rods{amount = 23} = 10, + /obj/item/stack/rods{amount = 23} = 20, /obj/item/stack/rods{amount = 50} = 10, /obj/item/stack/sheet/cardboard = 20, /obj/item/stack/sheet/metal{amount = 20} = 10, @@ -100,6 +104,7 @@ /obj/item/weapon/hand_labeler = 10, /obj/item/weapon/paper/crumpled = 10, /obj/item/weapon/pen = 10, + /obj/item/weapon/minihoe = 10, /obj/item/weapon/plantspray/pests = 10, /obj/item/weapon/stock_parts/cell = 30, /obj/item/weapon/storage/belt/utility = 20, @@ -116,34 +121,34 @@ /obj/item/weapon/weldingtool = 30, /obj/item/weapon/wirecutters = 10, /obj/item/weapon/wrench = 40, - /obj/item/weapon/relic = 30, + /obj/item/weapon/relic = 35, /obj/item/clothing/shoes/brown = 30, /obj/item/seeds/ambrosiadeusseed = 10, /obj/item/seeds/ambrosiavulgarisseed = 20, /obj/item/clothing/under/color/black = 30, /obj/item/stack/tape_roll = 10, ////////////////CONTRABAND STUFF////////////////// - /obj/item/weapon/grenade/clown_grenade = 4, - /obj/item/seeds/ambrosiavulgarisseed/cruciatus = 4, + /obj/item/weapon/grenade/clown_grenade = 3, + /obj/item/seeds/ambrosiavulgarisseed/cruciatus = 3, /obj/item/weapon/gun/projectile/automatic/pistol/empty = 1, - /obj/item/ammo_box/magazine/m10mm = 7, - /obj/item/weapon/soap/syndie = 10, - /obj/item/weapon/gun/syringe/syndicate = 3, - /obj/item/weapon/suppressor = 7, - /obj/item/clothing/under/chameleon = 3, - /obj/item/weapon/stamp/chameleon = 3, - /obj/item/clothing/shoes/syndigaloshes = 7, - /obj/item/clothing/mask/gas/voice = 3, + /obj/item/ammo_box/magazine/m10mm = 4, + /obj/item/weapon/soap/syndie = 7, + /obj/item/weapon/gun/syringe/syndicate = 2, + /obj/item/weapon/suppressor = 4, + /obj/item/clothing/under/chameleon = 2, + /obj/item/weapon/stamp/chameleon = 2, + /obj/item/clothing/shoes/syndigaloshes = 5, + /obj/item/clothing/mask/gas/voice = 2, /obj/item/weapon/dnascrambler = 1, - /obj/item/weapon/storage/backpack/satchel_flat = 3, - /obj/item/weapon/storage/toolbox/syndicate = 3, - /obj/item/weapon/storage/backpack/duffel/syndie/surgery_fake = 3, - /obj/item/weapon/storage/belt/military = 3, - /obj/item/weapon/storage/box/syndie_kit/space = 3, - /obj/item/device/multitool/ai_detect = 3, + /obj/item/weapon/storage/backpack/satchel_flat = 2, + /obj/item/weapon/storage/toolbox/syndicate = 2, + /obj/item/weapon/storage/backpack/duffel/syndie/surgery_fake = 2, + /obj/item/weapon/storage/belt/military = 2, + /obj/item/weapon/storage/box/syndie_kit/space = 2, + /obj/item/device/multitool/ai_detect = 2, /obj/item/weapon/implanter/storage = 1, - /obj/item/toy/cards/deck/syndicate = 3, - /obj/item/weapon/storage/secure/briefcase/syndie = 3, + /obj/item/toy/cards/deck/syndicate = 2, + /obj/item/weapon/storage/secure/briefcase/syndie = 2, "" = 90 ) From 3605aa5e4de4093103b8e1b9836b51dfd462f5f4 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Mon, 27 Jun 2016 10:57:54 -0400 Subject: [PATCH 10/99] Re-Adds Instability --- code/__DEFINES/genetics.dm | 2 + code/game/dna/genes/disabilities.dm | 70 +++--- code/game/dna/genes/gene.dm | 9 +- code/game/dna/genes/goon_disabilities.dm | 207 ++++++++--------- code/game/dna/genes/goon_powers.dm | 225 ++++++++++--------- code/game/dna/genes/powers.dm | 132 ++++++----- code/game/dna/genes/vg_disabilities.dm | 33 +-- code/game/dna/genes/vg_powers.dm | 36 ++- code/modules/mob/living/carbon/human/life.dm | 7 +- 9 files changed, 379 insertions(+), 342 deletions(-) diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index e6988ca745e..5e04d288764 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -124,3 +124,5 @@ #define NUTRITION_LEVEL_HUNGRY 250 #define NUTRITION_LEVEL_STARVING 150 +//Used for calculations for negative effects of having genetics powers +#define DEFAULT_GENE_INSTABILITY -4 diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index f62268b621a..cb2ab29dae0 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -35,7 +35,7 @@ if(sdisability) M.sdisabilities|=sdisability if(activation_message) - to_chat(M, "\red [activation_message]") + to_chat(M, "[activation_message]") else testing("[name] has no activation message.") @@ -47,7 +47,7 @@ if(sdisability) M.sdisabilities &= ~sdisability if(deactivation_message) - to_chat(M, "\red [deactivation_message]") + to_chat(M, "[deactivation_message]") else testing("[name] has no deactivation message.") @@ -55,86 +55,95 @@ name="Hallucinate" activation_message="Your mind says 'Hello'." deactivation_message ="Sanity returns. Or does it?" + instability = -2 mutation=HALLUCINATE - New() - block=HALLUCINATIONBLOCK +/datum/dna/gene/disability/hallucinate/New() + block=HALLUCINATIONBLOCK /datum/dna/gene/disability/epilepsy name="Epilepsy" activation_message="You get a headache." deactivation_message ="Your headache is gone, at last." + instability = -2 disability=EPILEPSY - New() - block=EPILEPSYBLOCK +/datum/dna/gene/disability/epilepsy/New() + block=EPILEPSYBLOCK /datum/dna/gene/disability/cough name="Coughing" activation_message="You start coughing." deactivation_message ="Your throat stops aching." + instability = -1 disability=COUGHING - New() - block=COUGHBLOCK +/datum/dna/gene/disability/cough/New() + block=COUGHBLOCK /datum/dna/gene/disability/clumsy name="Clumsiness" activation_message="You feel lightheaded." deactivation_message ="You regain some control of your movements" + instability = -2 mutation=CLUMSY - New() - block=CLUMSYBLOCK +/datum/dna/gene/disability/clumsy/New() + block=CLUMSYBLOCK /datum/dna/gene/disability/tourettes name="Tourettes" activation_message="You twitch." deactivation_message ="Your mouth tastes like soap." + instability = -1 disability=TOURETTES - New() - block=TWITCHBLOCK +/datum/dna/gene/disability/tourettes/New() + block=TWITCHBLOCK /datum/dna/gene/disability/nervousness name="Nervousness" activation_message="You feel nervous." deactivation_message ="You feel much calmer." + instability = -1 disability=NERVOUS - New() - block=NERVOUSBLOCK +/datum/dna/gene/disability/nervousness/New() + block=NERVOUSBLOCK /datum/dna/gene/disability/blindness name="Blindness" activation_message="You can't seem to see anything." deactivation_message ="You can see now, in case you didn't notice..." + instability = -5 sdisability=BLIND - New() - block=BLINDBLOCK +/datum/dna/gene/disability/blindness/New() + block=BLINDBLOCK /datum/dna/gene/disability/deaf name="Deafness" activation_message="It's kinda quiet." deactivation_message ="You can hear again!" + instability = -4 sdisability=DEAF - New() - block=DEAFBLOCK +/datum/dna/gene/disability/deaf/New() + block=DEAFBLOCK - activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.ear_deaf = 1 +/datum/dna/gene/disability/deaf/activate(var/mob/M, var/connected, var/flags) + ..(M,connected,flags) + M.ear_deaf = 1 /datum/dna/gene/disability/nearsighted name="Nearsightedness" activation_message="Your eyes feel weird..." deactivation_message ="You can see clearly now" + instability = -3 disability=NEARSIGHTED - New() - block=GLASSESBLOCK +/datum/dna/gene/disability/nearsighted/New() + block=GLASSESBLOCK /datum/dna/gene/disability/lisp @@ -142,14 +151,15 @@ desc = "I wonder wath thith doeth." activation_message = "Thomething doethn't feel right." deactivation_message = "You now feel able to pronounce consonants." + instability = -1 mutation = LISP - New() - ..() - block=LISPBLOCK +/datum/dna/gene/disability/lisp/New() + ..() + block=LISPBLOCK - OnSay(var/mob/M, var/message) - return replacetext(message,"s","th") +/datum/dna/gene/disability/lisp/OnSay(var/mob/M, var/message) + return replacetext(message,"s","th") /datum/dna/gene/disability/comic name = "Comic" @@ -158,5 +168,5 @@ deactivation_message = "Well thank god that's over with." mutation=COMIC - New() - block = COMICBLOCK +/datum/dna/gene/disability/comic/New() + block = COMICBLOCK diff --git a/code/game/dna/genes/gene.dm b/code/game/dna/genes/gene.dm index a56be88082e..ad2b1f43c54 100644 --- a/code/game/dna/genes/gene.dm +++ b/code/game/dna/genes/gene.dm @@ -23,7 +23,10 @@ // Any of a number of GENE_ flags. var/flags=0 -/** + // Chance of the gene to cause adverse effects when active + var/instability=0 + +/* * Is the gene active in this mob's DNA? */ /datum/dna/gene/proc/is_active(var/mob/M) @@ -113,10 +116,10 @@ M.mutations.Add(mutation) if(activation_messages.len) var/msg = pick(activation_messages) - to_chat(M, "\blue [msg]") + to_chat(M, "[msg]") /datum/dna/gene/basic/deactivate(var/mob/M) M.mutations.Remove(mutation) if(deactivation_messages.len) var/msg = pick(deactivation_messages) - to_chat(M, "\red [msg]") + to_chat(M, "[msg]") diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 1cb70e2c236..5fa8d6bb10c 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -12,14 +12,15 @@ desc = "Completely shuts down the speech center of the subject's brain." activation_message = "You feel unable to express yourself at all." deactivation_message = "You feel able to speak freely again." + instability = -3 sdisability = MUTE - New() - ..() - block=MUTEBLOCK +/datum/dna/gene/disability/mute/New() + ..() + block=MUTEBLOCK - OnSay(var/mob/M, var/message) - return "" +/datum/dna/gene/disability/mute/OnSay(var/mob/M, var/message) + return "" //////////////////////////////////////// // Harmful to others as well as self @@ -30,24 +31,25 @@ desc = "The subject suffers from constant radiation sickness and causes the same on nearby organics." activation_message = "You feel a strange sickness permeate your whole body." deactivation_message = "You no longer feel awful and sick all over." + instability = -6 mutation = RADIOACTIVE - New() - ..() - block=RADBLOCK +/datum/dna/gene/disability/radioactive/New() + ..() + block=RADBLOCK - OnMobLife(var/mob/living/owner) - var/radiation_amount = abs(min(owner.radiation - 20,0)) - owner.apply_effect(radiation_amount, IRRADIATE) - for(var/mob/living/L in range(1, owner)) - if(L == owner) - continue - to_chat(L, "You are enveloped by a soft green glow emanating from [owner].") - L.apply_effect(5, IRRADIATE) - return +/datum/dna/gene/disability/radioactive/OnMobLife(var/mob/living/owner) + var/radiation_amount = abs(min(owner.radiation - 20,0)) + owner.apply_effect(radiation_amount, IRRADIATE) + for(var/mob/living/L in range(1, owner)) + if(L == owner) + continue + to_chat(L, "You are enveloped by a soft green glow emanating from [owner].") + L.apply_effect(5, IRRADIATE) + return - OnDrawUnderlays(var/mob/M,var/g,var/fat) - return "rads[fat]_s" +/datum/dna/gene/disability/radioactive/OnDrawUnderlays(var/mob/M,var/g,var/fat) + return "rads[fat]_s" //////////////////////////////////////// // Other disabilities @@ -59,12 +61,12 @@ desc = "Greatly slows the subject's metabolism, enabling greater buildup of lipid tissue." activation_message = "You feel blubbery and lethargic!" deactivation_message = "You feel fit!" - + instability = -2 mutation = OBESITY - New() - ..() - block=FATBLOCK +/datum/dna/gene/disability/fat/New() + ..() + block=FATBLOCK // WAS: /datum/bioEffect/chav /datum/dna/gene/disability/speech/chav @@ -72,38 +74,39 @@ desc = "Forces the language center of the subject's brain to construct sentences in a more rudimentary manner." activation_message = "Ye feel like a reet prat like, innit?" deactivation_message = "You no longer feel like being rude and sassy." + instability = -1 mutation = CHAV - New() - ..() - block=CHAVBLOCK +/datum/dna/gene/disability/speech/chav/New() + ..() + block=CHAVBLOCK - OnSay(var/mob/M, var/message) - // THIS ENTIRE THING BEGS FOR REGEX - message = replacetext(message,"dick","prat") - message = replacetext(message,"comdom","knob'ead") - message = replacetext(message,"looking at","gawpin' at") - message = replacetext(message,"great","bangin'") - message = replacetext(message,"man","mate") - message = replacetext(message,"friend",pick("mate","bruv","bledrin")) - message = replacetext(message,"what","wot") - message = replacetext(message,"drink","wet") - message = replacetext(message,"get","giz") - message = replacetext(message,"what","wot") - message = replacetext(message,"no thanks","wuddent fukken do one") - message = replacetext(message,"i don't know","wot mate") - message = replacetext(message,"no","naw") - message = replacetext(message,"robust","chin") - message = replacetext(message," hi ","how what how") - message = replacetext(message,"hello","sup bruv") - message = replacetext(message,"kill","bang") - message = replacetext(message,"murder","bang") - message = replacetext(message,"windows","windies") - message = replacetext(message,"window","windy") - message = replacetext(message,"break","do") - message = replacetext(message,"your","yer") - message = replacetext(message,"security","coppers") - return message +/datum/dna/gene/disability/speech/chav/OnSay(var/mob/M, var/message) + // THIS ENTIRE THING BEGS FOR REGEX + message = replacetext(message,"dick","prat") + message = replacetext(message,"comdom","knob'ead") + message = replacetext(message,"looking at","gawpin' at") + message = replacetext(message,"great","bangin'") + message = replacetext(message,"man","mate") + message = replacetext(message,"friend",pick("mate","bruv","bledrin")) + message = replacetext(message,"what","wot") + message = replacetext(message,"drink","wet") + message = replacetext(message,"get","giz") + message = replacetext(message,"what","wot") + message = replacetext(message,"no thanks","wuddent fukken do one") + message = replacetext(message,"i don't know","wot mate") + message = replacetext(message,"no","naw") + message = replacetext(message,"robust","chin") + message = replacetext(message," hi ","how what how") + message = replacetext(message,"hello","sup bruv") + message = replacetext(message,"kill","bang") + message = replacetext(message,"murder","bang") + message = replacetext(message,"windows","windies") + message = replacetext(message,"window","windy") + message = replacetext(message,"break","do") + message = replacetext(message,"your","yer") + message = replacetext(message,"security","coppers") + return message // WAS: /datum/bioEffect/swedish /datum/dna/gene/disability/speech/swedish @@ -111,18 +114,19 @@ desc = "Forces the language center of the subject's brain to construct sentences in a vaguely norse manner." activation_message = "You feel Swedish, however that works." deactivation_message = "The feeling of Swedishness passes." + instability = -1 mutation = SWEDISH - New() - ..() - block=SWEDEBLOCK +/datum/dna/gene/disability/speech/swedish/New() + ..() + block=SWEDEBLOCK - OnSay(var/mob/M, var/message) - // svedish - message = replacetext(message,"w","v") - if(prob(30)) - message += " Bork[pick("",", bork",", bork, bork")]!" - return message +/datum/dna/gene/disability/speech/swedish/OnSay(var/mob/M, var/message) + // svedish + message = replacetext(message,"w","v") + if(prob(30)) + message += " Bork[pick("",", bork",", bork, bork")]!" + return message // WAS: /datum/bioEffect/unintelligable /datum/dna/gene/disability/unintelligable @@ -130,34 +134,35 @@ desc = "Heavily corrupts the part of the brain responsible for forming spoken sentences." activation_message = "You can't seem to form any coherent thoughts!" deactivation_message = "Your mind feels more clear." + instability = -1 mutation = SCRAMBLED - New() - ..() - block=SCRAMBLEBLOCK +/datum/dna/gene/disability/unintelligable/New() + ..() + block=SCRAMBLEBLOCK - OnSay(var/mob/M, var/message) - var/prefix=copytext(message,1,2) - if(prefix == ";") - message = copytext(message,2) - else if(prefix in list(":","#")) - prefix += copytext(message,2,3) - message = copytext(message,3) - else - prefix="" +/datum/dna/gene/disability/unintelligable/OnSay(var/mob/M, var/message) + var/prefix=copytext(message,1,2) + if(prefix == ";") + message = copytext(message,2) + else if(prefix in list(":","#")) + prefix += copytext(message,2,3) + message = copytext(message,3) + else + prefix="" - var/list/words = splittext(message," ") - var/list/rearranged = list() - for(var/i=1;i<=words.len;i++) - var/cword = pick(words) - words.Remove(cword) - var/suffix = copytext(cword,length(cword)-1,length(cword)) - while(length(cword)>0 && suffix in list(".",",",";","!",":","?")) - cword = copytext(cword,1 ,length(cword)-1) - suffix = copytext(cword,length(cword)-1,length(cword) ) - if(length(cword)) - rearranged += cword - return "[prefix][uppertext(jointext(rearranged," "))]!!" + var/list/words = splittext(message," ") + var/list/rearranged = list() + for(var/i=1;i<=words.len;i++) + var/cword = pick(words) + words.Remove(cword) + var/suffix = copytext(cword,length(cword)-1,length(cword)) + while(length(cword)>0 && suffix in list(".",",",";","!",":","?")) + cword = copytext(cword,1 ,length(cword)-1) + suffix = copytext(cword,length(cword)-1,length(cword) ) + if(length(cword)) + rearranged += cword + return "[prefix][uppertext(jointext(rearranged," "))]!!" // WAS: /datum/bioEffect/toxic_farts /datum/dna/gene/disability/toxic_farts @@ -165,12 +170,11 @@ desc = "Causes the subject's digestion to create a significant amount of noxious gas." activation_message = "Your stomach grumbles unpleasantly." deactivation_message = "Your stomach stops acting up. Phew!" - mutation = TOXIC_FARTS - New() - ..() - block=TOXICFARTBLOCK +/datum/dna/gene/disability/toxic_farts/New() + ..() + block=TOXICFARTBLOCK ////////////////// // USELESS SHIT // @@ -183,12 +187,11 @@ desc = "Enhances the subject's ability to build and retain heavy muscles." activation_message = "You feel buff!" deactivation_message = "You feel wimpy and weak." - mutation = STRONG - New() - ..() - block=STRONGBLOCK +/datum/dna/gene/disability/strong/New() + ..() + block=STRONGBLOCK // WAS: /datum/bioEffect/horns /datum/dna/gene/disability/horns @@ -198,12 +201,12 @@ deactivation_message = "Your horns crumble away into nothing." mutation = HORNS - New() - ..() - block=HORNSBLOCK +/datum/dna/gene/disability/horns/New() + ..() + block=HORNSBLOCK - OnDrawUnderlays(var/mob/M,var/g,var/fat) - return "horns_s" +/datum/dna/gene/disability/horns/OnDrawUnderlays(var/mob/M,var/g,var/fat) + return "horns_s" //////////////////////////////////////////////////////////////////////// // WAS: /datum/bioEffect/immolate @@ -216,9 +219,9 @@ spelltype=/obj/effect/proc_holder/spell/targeted/immolate - New() - ..() - block = IMMOLATEBLOCK +/datum/dna/gene/basic/grant_spell/immolate/New() + ..() + block = IMMOLATEBLOCK /obj/effect/proc_holder/spell/targeted/immolate name = "Incendiary Mitochondria" @@ -241,6 +244,6 @@ /obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets) var/mob/living/carbon/L = usr L.adjust_fire_stacks(0.5) - L.visible_message("\red [L.name] suddenly bursts into flames!") + L.visible_message("[L.name] suddenly bursts into flames!") L.IgniteMob() playsound(L.loc, 'sound/effects/bamf.ogg', 50, 0) diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index c50c04860cf..7cc0731e3bb 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -8,8 +8,8 @@ mutation=SOBER - New() - block=SOBERBLOCK +/datum/dna/gene/basic/sober/New() + block=SOBERBLOCK //WAS: /datum/bioEffect/psychic_resist /datum/dna/gene/basic/psychic_resist @@ -20,24 +20,26 @@ mutation=PSY_RESIST - New() - block=PSYRESISTBLOCK +/datum/dna/gene/basic/psychic_resist/New() + block=PSYRESISTBLOCK ///////////////////////// // Stealth Enhancers ///////////////////////// /datum/dna/gene/basic/stealth - can_activate(var/mob/M, var/flags) - // Can only activate one of these at a time. - if(is_type_in_list(/datum/dna/gene/basic/stealth,M.active_genes)) - testing("Cannot activate [type]: /datum/dna/gene/basic/stealth in M.active_genes.") - return 0 - return ..(M,flags) + instability = 4 - deactivate(var/mob/M) - ..(M) - M.alpha=255 +/datum/dna/gene/basic/stealth/can_activate(var/mob/M, var/flags) + // Can only activate one of these at a time. + if(is_type_in_list(/datum/dna/gene/basic/stealth,M.active_genes)) + testing("Cannot activate [type]: /datum/dna/gene/basic/stealth in M.active_genes.") + return 0 + return ..(M,flags) + +/datum/dna/gene/basic/stealth/deactivate(var/mob/M) + ..(M) + M.alpha=255 // WAS: /datum/bioEffect/darkcloak /datum/dna/gene/basic/stealth/darkcloak @@ -48,23 +50,23 @@ activation_prob=10 mutation = CLOAK - New() - block=SHADOWBLOCK +/datum/dna/gene/basic/stealth/darkcloak/New() + block=SHADOWBLOCK - OnMobLife(var/mob/M) - var/turf/simulated/T = get_turf(M) - if(!istype(T)) - return - var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T - var/light_available - if(L) - light_available = L.get_clamped_lum()*10 - else - light_available = 5 - if(light_available <= 2) - M.alpha = round(M.alpha * 0.8) - else - M.alpha = 255 +/datum/dna/gene/basic/stealth/darkcloak/OnMobLife(var/mob/M) + var/turf/simulated/T = get_turf(M) + if(!istype(T)) + return + var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T + var/light_available + if(L) + light_available = L.get_clamped_lum()*10 + else + light_available = 5 + if(light_available <= 2) + M.alpha = round(M.alpha * 0.8) + else + M.alpha = 255 //WAS: /datum/bioEffect/chameleon /datum/dna/gene/basic/stealth/chameleon @@ -75,43 +77,43 @@ activation_prob=10 mutation = CHAMELEON - New() +/datum/dna/gene/basic/stealth/chameleon/New() block=CHAMELEONBLOCK - OnMobLife(var/mob/M) - if((world.time - M.last_movement) >= 30 && !M.stat && M.canmove && !M.restrained()) - M.alpha -= 25 - else - M.alpha = round(255 * 0.80) +/datum/dna/gene/basic/stealth/chameleon/OnMobLife(var/mob/M) + if((world.time - M.last_movement) >= 30 && !M.stat && M.canmove && !M.restrained()) + M.alpha -= 25 + else + M.alpha = round(255 * 0.80) ///////////////////////////////////////////////////////////////////////////////////////// /datum/dna/gene/basic/grant_spell var/obj/effect/proc_holder/spell/spelltype - activate(var/mob/M, var/connected, var/flags) - M.AddSpell(new spelltype(M)) - ..() - return 1 +/datum/dna/gene/basic/grant_spell/activate(var/mob/M, var/connected, var/flags) + M.AddSpell(new spelltype(M)) + ..() + return 1 - deactivate(var/mob/M, var/connected, var/flags) - for(var/obj/effect/proc_holder/spell/S in M.spell_list) - if(istype(S,spelltype)) - M.spell_list.Remove(S) - ..() - return 1 +/datum/dna/gene/basic/grant_spell/deactivate(var/mob/M, var/connected, var/flags) + for(var/obj/effect/proc_holder/spell/S in M.spell_list) + if(istype(S,spelltype)) + M.spell_list.Remove(S) + ..() + return 1 /datum/dna/gene/basic/grant_verb var/verbtype - activate(var/mob/M, var/connected, var/flags) - ..() - M.verbs += verbtype - return 1 +/datum/dna/gene/basic/grant_verb/activate(var/mob/M, var/connected, var/flags) + ..() + M.verbs += verbtype + return 1 - deactivate(var/mob/M, var/connected, var/flags) - ..() - M.verbs -= verbtype +/datum/dna/gene/basic/grant_verb/deactivate(var/mob/M, var/connected, var/flags) + ..() + M.verbs -= verbtype // WAS: /datum/bioEffect/cryokinesis /datum/dna/gene/basic/grant_spell/cryo @@ -119,13 +121,14 @@ desc = "Allows the subject to lower the body temperature of others." activation_messages = list("You notice a strange cold tingle in your fingertips.") deactivation_messages = list("Your fingers feel warmer.") + instability = 4 mutation = CRYO spelltype = /obj/effect/proc_holder/spell/targeted/cryokinesis - New() - ..() - block = CRYOBLOCK +/datum/dna/gene/basic/grant_spell/cryo/New() + ..() + block = CRYOBLOCK /obj/effect/proc_holder/spell/targeted/cryokinesis name = "Cryokinesis" @@ -153,11 +156,11 @@ var/mob/living/carbon/C = targets[1] if(!iscarbon(C)) - to_chat(usr, "\red This will only work on normal organic beings.") + to_chat(usr, "This will only work on normal organic beings.") return if (RESIST_COLD in C.mutations) - C.visible_message("\red A cloud of fine ice crystals engulfs [C.name], but disappears almost instantly!") + C.visible_message("A cloud of fine ice crystals engulfs [C.name], but disappears almost instantly!") return var/handle_suit = 0 if(ishuman(C)) @@ -166,12 +169,12 @@ if(istype(H.wear_suit, /obj/item/clothing/suit/space)) handle_suit = 1 if(H.internal) - H.visible_message("\red [usr] sprays a cloud of fine ice crystals, engulfing [H]!", + H.visible_message("[usr] sprays a cloud of fine ice crystals, engulfing [H]!", "[usr] sprays a cloud of fine ice crystals over your [H.head]'s visor.") log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] while wearing internals and a suit") msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]") else - H.visible_message("\red [usr] sprays a cloud of fine ice crystals engulfing, [H]!", + H.visible_message("[usr] sprays a cloud of fine ice crystals engulfing, [H]!", "[usr] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.") log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)]") msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]") @@ -200,12 +203,12 @@ desc = "" //layer = 15 - New(var/atom/location, var/icon/I, var/duration = 20, var/oname = "something") - src.name = oname - loc=location - src.icon = I - spawn(duration) - qdel(src) +/obj/effect/self_deleting/New(var/atom/location, var/icon/I, var/duration = 20, var/oname = "something") + src.name = oname + loc=location + src.icon = I + spawn(duration) + qdel(src) /////////////////////////////////////////////////////////////////////////////////////////// @@ -215,13 +218,14 @@ desc = "Allows the subject to eat just about anything without harm." activation_messages = list("You feel hungry.") deactivation_messages = list("You don't feel quite so hungry anymore.") + instability = 2 mutation = EATER spelltype=/obj/effect/proc_holder/spell/targeted/eat - New() - ..() - block = EATBLOCK +/datum/dna/gene/basic/grant_spell/mattereater/New() + ..() + block = EATBLOCK /obj/effect/proc_holder/spell/targeted/eat name = "Eat" @@ -356,13 +360,14 @@ //cooldown = 30 activation_messages = list("Your leg muscles feel taut and strong.") deactivation_messages = list("Your leg muscles shrink back to normal.") + instability = 2 mutation = JUMPY spelltype =/obj/effect/proc_holder/spell/targeted/leap - New() - ..() - block = JUMPBLOCK +/datum/dna/gene/basic/grant_spell/jumpy/New() + ..() + block = JUMPBLOCK /obj/effect/proc_holder/spell/targeted/leap name = "Jump" @@ -383,12 +388,10 @@ /obj/effect/proc_holder/spell/targeted/leap/cast(list/targets) var/failure = 0 if (istype(usr.loc,/mob/) || usr.lying || usr.stunned || usr.buckled || usr.stat) - to_chat(usr, "\red You can't jump right now!") + to_chat(usr, "You can't jump right now!") return if (istype(usr.loc,/turf/)) - - if(usr.restrained())//Why being pulled while cuffed prevents you from moving for(var/mob/M in range(usr, 1)) if(M.pulling == usr) @@ -400,12 +403,12 @@ if(usr.pinned.len) failure = 1 - usr.visible_message("\red [usr.name] takes a huge leap!") + usr.visible_message("[usr.name] takes a huge leap!") playsound(usr.loc, 'sound/weapons/thudswoosh.ogg', 50, 1) if(failure) usr.Weaken(5) usr.Stun(5) - usr.visible_message(" \the [usr] attempts to leap away but is slammed back down to the ground!", + usr.visible_message("[usr] attempts to leap away but is slammed back down to the ground!", "You attempt to leap away but are suddenly slammed back down to the ground!", "You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor.") return 0 @@ -422,7 +425,7 @@ usr.flying = prevFlying if (FAT in usr.mutations && prob(66)) - usr.visible_message("\red [usr.name] crashes due to their heavy weight!") + usr.visible_message("[usr.name] crashes due to their heavy weight!") //playsound(usr.loc, 'zhit.wav', 50, 1) usr.AdjustWeakened(10) usr.AdjustStunned(5) @@ -431,10 +434,10 @@ if (istype(usr.loc,/obj/)) var/obj/container = usr.loc - to_chat(usr, "\red You leap and slam your head against the inside of [container]! Ouch!") + to_chat(usr, "You leap and slam your head against the inside of [container]! Ouch!") usr.AdjustParalysis(3) usr.AdjustWeakened(5) - container.visible_message("\red [usr.loc] emits a loud thump and rattles a bit.") + container.visible_message("[usr.loc] emits a loud thump and rattles a bit.") playsound(usr.loc, 'sound/effects/bang.ogg', 50, 1) var/wiggle = 6 while(wiggle > 0) @@ -460,11 +463,12 @@ //cooldown = 1800 activation_messages = list("You don't feel entirely like yourself somehow.") deactivation_messages = list("You feel secure in your identity.") + instability = 3 mutation = POLYMORPH - New() - ..() - block = POLYMORPHBLOCK +/datum/dna/gene/basic/grant_spell/polymorph/New() + ..() + block = POLYMORPHBLOCK /obj/effect/proc_holder/spell/targeted/polymorph name = "Polymorph" @@ -483,13 +487,13 @@ /obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets) var/mob/living/M=targets[1] if(!ishuman(M)) - to_chat(usr, "\red You can only change your appearance to that of another human.") + to_chat(usr, "You can only change your appearance to that of another human.") return if(!ishuman(usr)) return - usr.visible_message("\red [usr]'s body shifts and contorts.") + usr.visible_message("[usr]'s body shifts and contorts.") spawn(10) if(M && usr) @@ -510,11 +514,12 @@ spelltype = /obj/effect/proc_holder/spell/targeted/empath activation_messages = list("You suddenly notice more about others than you did before.") deactivation_messages = list("You no longer feel able to sense intentions.") + instability = 1 mutation=EMPATH - New() - ..() - block = EMPATHBLOCK +/datum/dna/gene/basic/grant_spell/empath/New() + ..() + block = EMPATHBLOCK /obj/effect/proc_holder/spell/targeted/empath name = "Read Mind" @@ -544,21 +549,21 @@ for(var/mob/living/carbon/M in targets) if(!iscarbon(M)) - to_chat(usr, "\red You may only use this on other organic beings.") + to_chat(usr, "You may only use this on other organic beings.") return if (PSY_RESIST in M.mutations) - to_chat(usr, "\red You can't see into [M.name]'s mind at all!") + to_chat(usr, "You can't see into [M.name]'s mind at all!") return if (M.stat == 2) - to_chat(usr, "\red [M.name] is dead and cannot have their mind read.") + to_chat(usr, "[M.name] is dead and cannot have their mind read.") return if (M.health < 0) - to_chat(usr, "\red [M.name] is dying, and their thoughts are too scrambled to read.") + to_chat(usr, "[M.name] is dying, and their thoughts are too scrambled to read.") return - to_chat(usr, "\blue Mind Reading of [M.name]:") + to_chat(usr, "Mind Reading of [M.name]:") var/pain_condition = M.health // lower health means more pain var/list/randomthoughts = list("what to have for lunch","the future","the past","money", @@ -575,33 +580,33 @@ switch(pain_condition) if (81 to INFINITY) - to_chat(usr, "\blue Condition: [M.name] feels good.") + to_chat(usr, "Condition: [M.name] feels good.") if (61 to 80) - to_chat(usr, "\blue Condition: [M.name] is suffering mild pain.") + to_chat(usr, "Condition: [M.name] is suffering mild pain.") if (41 to 60) - to_chat(usr, "\blue Condition: [M.name] is suffering significant pain.") + to_chat(usr, "Condition: [M.name] is suffering significant pain.") if (21 to 40) - to_chat(usr, "\blue Condition: [M.name] is suffering severe pain.") + to_chat(usr, "Condition: [M.name] is suffering severe pain.") else - to_chat(usr, "\blue Condition: [M.name] is suffering excruciating pain.") + to_chat(usr, "Condition: [M.name] is suffering excruciating pain.") thoughts = "haunted by their own mortality" switch(M.a_intent) if (I_HELP) - to_chat(usr, "\blue Mood: You sense benevolent thoughts from [M.name].") + to_chat(usr, "Mood: You sense benevolent thoughts from [M.name].") if (I_DISARM) - to_chat(usr, "\blue Mood: You sense cautious thoughts from [M.name].") + to_chat(usr, "Mood: You sense cautious thoughts from [M.name].") if (I_GRAB) - to_chat(usr, "\blue Mood: You sense hostile thoughts from [M.name].") + to_chat(usr, "Mood: You sense hostile thoughts from [M.name].") if (I_HARM) - to_chat(usr, "\blue Mood: You sense cruel thoughts from [M.name].") + to_chat(usr, "Mood: You sense cruel thoughts from [M.name].") for(var/mob/living/L in view(7,M)) if (L == M) continue thoughts = "thinking about punching [L.name]" break else - to_chat(usr, "\blue Mood: You sense strange thoughts from [M.name].") + to_chat(usr, "Mood: You sense strange thoughts from [M.name].") if (istype(M,/mob/living/carbon/human)) var/numbers[0] @@ -610,13 +615,13 @@ numbers += H.mind.initial_account.account_number numbers += H.mind.initial_account.remote_access_pin if(numbers.len>0) - to_chat(usr, "\blue Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].") - to_chat(usr, "\blue Thoughts: [M.name] is currently [thoughts].") + to_chat(usr, "b>Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].") + to_chat(usr, "Thoughts: [M.name] is currently [thoughts].") if (EMPATH in M.mutations) - to_chat(M, "\red You sense [usr.name] reading your mind.") + to_chat(M, "You sense [usr.name] reading your mind.") else if (prob(5) || M.mind.assigned_role=="Chaplain") - to_chat(M, "\red You sense someone intruding upon your thoughts...") + to_chat(M, "You sense someone intruding upon your thoughts...") return //////////////////////////////////////////////////////////////////////// @@ -627,13 +632,13 @@ desc = "Vastly increases the gas capacity of the subject's digestive tract." activation_messages = list("You feel bloated and gassy.") deactivation_messages = list("You no longer feel gassy. What a relief!") - + instability = 2 mutation = SUPER_FART spelltype = /obj/effect/proc_holder/spell/aoe_turf/superfart - New() - ..() - block = SUPERFARTBLOCK +/datum/dna/gene/basic/grant_spell/superfart/New() + ..() + block = SUPERFARTBLOCK /obj/effect/proc_holder/spell/aoe_turf/superfart name = "Super Fart" diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm index eb33cef7ccf..4e3d77efb66 100644 --- a/code/game/dna/genes/powers.dm +++ b/code/game/dna/genes/powers.dm @@ -6,151 +6,163 @@ name="No Breathing" activation_messages=list("You feel no need to breathe.") deactivation_messages=list("You feel the need to breathe, once more.") + instability = 2 mutation=NO_BREATH activation_prob=10 - New() - block=NOBREATHBLOCK +/datum/dna/gene/basic/nobreath/New() + block=NOBREATHBLOCK /datum/dna/gene/basic/regenerate name="Regenerate" activation_messages=list("Your wounds start healing.") deactivation_messages=list("Your regenerative powers feel like they've vanished.") + instability = 1 mutation=REGEN - New() - block=REGENERATEBLOCK +/datum/dna/gene/basic/regenerate/New() + block=REGENERATEBLOCK /datum/dna/gene/basic/increaserun name="Super Speed" activation_messages=list("You feel swift and unencumbered.") deactivation_messages=list("You feel slow.") + instability = 2 mutation=RUN - New() - block=INCREASERUNBLOCK +/datum/dna/gene/basic/increaserun/New() + block=INCREASERUNBLOCK /datum/dna/gene/basic/heat_resist name="Heat Resistance" activation_messages=list("Your skin is icy to the touch.") deactivation_messages=list("Your skin no longer feels icy to the touch.") + instability = 2 mutation=RESIST_HEAT - New() - block=COLDBLOCK +/datum/dna/gene/basic/heat_resist/New() + block=COLDBLOCK - OnDrawUnderlays(var/mob/M,var/g,var/fat) - return "cold[fat]_s" +/datum/dna/gene/basic/heat_resist/OnDrawUnderlays(var/mob/M,var/g,var/fat) + return "cold[fat]_s" /datum/dna/gene/basic/cold_resist name="Cold Resistance" activation_messages=list("Your body is filled with warmth.") deactivation_messages=list("Your body is no longer filled with warmth.") + instability = 2 mutation=RESIST_COLD - New() - block=FIREBLOCK +/datum/dna/gene/basic/cold_resist/New() + block=FIREBLOCK - OnDrawUnderlays(var/mob/M,var/g,var/fat) - return "fire[fat]_s" +/datum/dna/gene/basic/cold_resist/OnDrawUnderlays(var/mob/M,var/g,var/fat) + return "fire[fat]_s" /datum/dna/gene/basic/noprints name="No Prints" activation_messages=list("Your fingers feel numb.") deactivation_messages=list("your fingers no longer feel numb.") + instability = 1 mutation=FINGERPRINTS - New() - block=NOPRINTSBLOCK +/datum/dna/gene/basic/noprints/New() + block=NOPRINTSBLOCK /datum/dna/gene/basic/noshock name="Shock Immunity" activation_messages=list("Your skin feels dry and unreactive.") deactivation_messages=list("Your skin no longer feels dry and unreactive.") + instability = 2 mutation=NO_SHOCK - New() - block=SHOCKIMMUNITYBLOCK +/datum/dna/gene/basic/noshock/New() + block=SHOCKIMMUNITYBLOCK /datum/dna/gene/basic/midget name="Midget" activation_messages=list("Everything around you seems bigger now...") deactivation_messages = list("Everything around you seems to shrink...") + instability = 1 mutation=DWARF - New() - block=SMALLSIZEBLOCK +/datum/dna/gene/basic/midget/New() + block=SMALLSIZEBLOCK - activate(var/mob/M, var/connected, var/flags) - ..(M,connected,flags) - M.pass_flags |= PASSTABLE - M.resize = 0.8 +/datum/dna/gene/basic/midget/activate(var/mob/M, var/connected, var/flags) + ..(M,connected,flags) + M.pass_flags |= PASSTABLE + M.resize = 0.8 - deactivate(var/mob/M, var/connected, var/flags) - ..() - M.pass_flags &= ~PASSTABLE - M.resize = 1.25 +/datum/dna/gene/basic/midget/deactivate(var/mob/M, var/connected, var/flags) + ..() + M.pass_flags &= ~PASSTABLE + M.resize = 1.25 // OLD HULK BEHAVIOR /datum/dna/gene/basic/hulk name="Hulk" activation_messages=list("Your muscles hurt.") deactivation_messages=list("Your muscles shrink.") + instability = 8 mutation=HULK activation_prob=5 - New() - block=HULKBLOCK +/datum/dna/gene/basic/hulk/New() + block=HULKBLOCK - activate(var/mob/M, var/connected, var/flags) - ..() - var/status = CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH - M.status_flags &= ~status +/datum/dna/gene/basic/hulk/activate(var/mob/M, var/connected, var/flags) + ..() + var/status = CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH + M.status_flags &= ~status - deactivate(var/mob/M, var/connected, var/flags) - ..() - M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH +/datum/dna/gene/basic/hulk/deactivate(var/mob/M, var/connected, var/flags) + ..() + M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH - OnDrawUnderlays(var/mob/M,var/g,var/fat) - if(HULK in M.mutations) - if(fat) - return "hulk_[fat]_s" - else - return "hulk_[g]_s" - return 0 +/datum/dna/gene/basic/hulk/OnDrawUnderlays(var/mob/M,var/g,var/fat) + if(HULK in M.mutations) + if(fat) + return "hulk_[fat]_s" + else + return "hulk_[g]_s" + return 0 - OnMobLife(var/mob/living/carbon/human/M) - if(!istype(M)) return - if ((HULK in M.mutations) && M.health <= 0) - M.mutations.Remove(HULK) - M.dna.SetSEState(HULKBLOCK,0) - genemutcheck(M, HULKBLOCK,null,MUTCHK_FORCED) - M.update_mutations() //update our mutation overlays - M.update_body() - M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH //temporary fix until the problem can be solved. - to_chat(M, "You suddenly feel very weak.") +/datum/dna/gene/basic/hulk/OnMobLife(var/mob/living/carbon/human/M) + if(!istype(M)) + return + if ((HULK in M.mutations) && M.health <= 0) + M.mutations.Remove(HULK) + M.dna.SetSEState(HULKBLOCK,0) + genemutcheck(M, HULKBLOCK,null,MUTCHK_FORCED) + M.update_mutations() //update our mutation overlays + M.update_body() + M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH //temporary fix until the problem can be solved. + to_chat(M, "You suddenly feel very weak.") /datum/dna/gene/basic/xray name="X-Ray Vision" activation_messages=list("The walls suddenly disappear.") deactivation_messages=list("the walls around you re-appear.") + instability = 8 mutation=XRAY activation_prob=10 - New() - block=XRAYBLOCK +/datum/dna/gene/basic/xray/New() + block=XRAYBLOCK /datum/dna/gene/basic/tk name="Telekenesis" activation_messages = list("You feel smarter.") deactivation_messages = list("You feel dumber.") + instability = 8 mutation=TK activation_prob=10 - New() - block=TELEBLOCK +/datum/dna/gene/basic/tk/New() + block=TELEBLOCK - OnDrawUnderlays(var/mob/M,var/g,var/fat) - return "telekinesishead[fat]_s" \ No newline at end of file +/datum/dna/gene/basic/tk/OnDrawUnderlays(var/mob/M,var/g,var/fat) + return "telekinesishead[fat]_s" diff --git a/code/game/dna/genes/vg_disabilities.dm b/code/game/dna/genes/vg_disabilities.dm index 3514a658c18..e3c6b9883c6 100644 --- a/code/game/dna/genes/vg_disabilities.dm +++ b/code/game/dna/genes/vg_disabilities.dm @@ -4,33 +4,36 @@ desc = "Forces the speaking centre of the subjects brain to yell every sentence." activation_message = "YOU FEEL LIKE YELLING!" deactivation_message = "You feel like being quiet.." + instability = -1 mutation = LOUD - New() - ..() - block=LOUDBLOCK +/datum/dna/gene/disability/speech/loud/New() + ..() + block=LOUDBLOCK - OnSay(var/mob/M, var/message) - message = replacetext(message,".","!") - message = replacetext(message,"?","?!") - message = replacetext(message,"!","!!") - return uppertext(message) +/datum/dna/gene/disability/speech/loud/OnSay(var/mob/M, var/message) + message = replacetext(message,".","!") + message = replacetext(message,"?","?!") + message = replacetext(message,"!","!!") + return uppertext(message) /datum/dna/gene/disability/dizzy name = "Dizzy" desc = "Causes the cerebellum to shut down in some places." activation_message = "You feel very dizzy..." deactivation_message = "You regain your balance." + instability = -2 mutation = DIZZY - New() - ..() - block=DIZZYBLOCK +/datum/dna/gene/disability/dizzy/New() + ..() + block=DIZZYBLOCK - OnMobLife(var/mob/living/carbon/human/M) - if(!istype(M)) return - if(DIZZY in M.mutations) - M.Dizzy(300) +/datum/dna/gene/disability/dizzy/OnMobLife(var/mob/living/carbon/human/M) + if(!istype(M)) + return + if(DIZZY in M.mutations) + M.Dizzy(300) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 08784b71a61..fd2061e66fb 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -3,17 +3,15 @@ /datum/dna/gene/basic/grant_spell/morph name = "Morphism" desc = "Enables the subject to reconfigure their appearance to that of any human." - spelltype =/obj/effect/proc_holder/spell/targeted/morph activation_messages=list("Your body feels if can alter its appearance.") deactivation_messages = list("Your body doesn't feel capable of altering its appearance.") - - + instability = 1 mutation=MORPH - New() - ..() - block = MORPHBLOCK +/datum/dna/gene/basic/grant_spell/morph/New() + ..() + block = MORPHBLOCK /obj/effect/proc_holder/spell/targeted/morph name = "Morph" @@ -34,7 +32,7 @@ if(!ishuman(usr)) return if (istype(usr.loc,/mob/)) - to_chat(usr, "\red You can't change your appearance right now!") + to_chat(usr, "You can't change your appearance right now!") return var/mob/living/carbon/human/M=usr var/obj/item/organ/external/head/head_organ = M.get_organ("head") @@ -146,19 +144,20 @@ M.regenerate_icons() M.update_dna() - M.visible_message("\blue \The [src] morphs and changes [M.get_visible_gender() == MALE ? "his" : M.get_visible_gender() == FEMALE ? "her" : "their"] appearance!", "\blue You change your appearance!", "\red Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!") + M.visible_message("[src] morphs and changes [M.get_visible_gender() == MALE ? "his" : M.get_visible_gender() == FEMALE ? "her" : "their"] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!") /datum/dna/gene/basic/grant_spell/remotetalk name="Telepathy" activation_messages=list("You feel you can project your thoughts.") deactivation_messages=list("You no longer feel you can project your thoughts.") + instability = 1 mutation=REMOTE_TALK spelltype =/obj/effect/proc_holder/spell/targeted/remotetalk - New() - ..() - block=REMOTETALKBLOCK +/datum/dna/gene/basic/grant_spell/remotetalk/New() + ..() + block=REMOTETALKBLOCK /obj/effect/proc_holder/spell/targeted/remotetalk name = "Project Mind" @@ -206,10 +205,10 @@ for(var/mob/living/target in targets) log_say("Project Mind: [key_name(usr)]->[key_name(target)]: [say]") if(REMOTE_TALK in target.mutations) - target.show_message("\blue You hear [usr.real_name]'s voice: [say]") + target.show_message("You hear [usr.real_name]'s voice: [say]") else - target.show_message("\blue You hear a voice that seems to echo around the room: [say]") - usr.show_message("\blue You project your mind into [target.real_name]: [say]") + target.show_message("You hear a voice that seems to echo around the room: [say]") + usr.show_message("You project your mind into [target.real_name]: [say]") for(var/mob/dead/observer/G in player_list) G.show_message("Telepathic message from [usr] ([ghost_follow_link(usr, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]") @@ -217,12 +216,13 @@ name="Remote Viewing" activation_messages=list("Your mind can see things from afar.") deactivation_messages=list("Your mind can no longer can see things from afar.") + instability = 1 mutation=REMOTE_VIEW spelltype =/obj/effect/proc_holder/spell/targeted/remoteview - New() - block=REMOTEVIEWBLOCK +/datum/dna/gene/basic/grant_spell/remoteview/New() + block=REMOTEVIEWBLOCK /obj/effect/proc_holder/spell/targeted/remoteview @@ -262,7 +262,7 @@ var/mob/target if(istype(user.l_hand, /obj/item/tk_grab) || istype(user.r_hand, /obj/item/tk_grab/)) - to_chat(user, "\red Your mind is too busy with that telekinetic grab.") + to_chat(user, "Your mind is too busy with that telekinetic grab.") user.remoteview_target = null user.reset_view(0) return @@ -285,5 +285,3 @@ else user.remoteview_target = null user.reset_view(0) - - diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a41f787a49c..d1c9b92c917 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -170,15 +170,16 @@ adjustCloneLoss(0.1) /mob/living/carbon/human/handle_mutations_and_radiation() + var/gene_instability = DEFAULT_GENE_INSTABILITY for(var/datum/dna/gene/gene in dna_genes) if(!gene.block) continue if(gene.is_active(src)) - /* if (prob(10) && prob(gene.instability)) - adjustCloneLoss(1) */ + gene_instability += gene.instability speech_problem_flag = 1 gene.OnMobLife(src) - + if(prob(10) && prob(max(gene_instability, 0))) + adjustCloneLoss(0.3 * gene_instability) if(!(species.flags & RADIMMUNE)) if (radiation) From 4bfd6ce95adc04f7b457042e5e1cef508e44135a Mon Sep 17 00:00:00 2001 From: TheDZD Date: Mon, 27 Jun 2016 13:12:50 -0400 Subject: [PATCH 11/99] Changes numbers --- code/__DEFINES/genetics.dm | 5 +++- code/game/dna/genes/disabilities.dm | 18 +++++++------- code/game/dna/genes/goon_disabilities.dm | 10 ++++---- code/game/dna/genes/goon_powers.dm | 14 +++++------ code/game/dna/genes/powers.dm | 22 ++++++++--------- code/game/dna/genes/vg_disabilities.dm | 3 +-- code/game/dna/genes/vg_powers.dm | 6 ++--- code/modules/mob/living/carbon/human/life.dm | 25 ++++++++++++++++---- 8 files changed, 59 insertions(+), 44 deletions(-) diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 5e04d288764..1baa779b492 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -125,4 +125,7 @@ #define NUTRITION_LEVEL_STARVING 150 //Used for calculations for negative effects of having genetics powers -#define DEFAULT_GENE_INSTABILITY -4 +#define DEFAULT_GENE_STABILITY 100 +#define GENE_INSTABILITY_MINOR 5 +#define GENE_INSTABILITY_MODERATE 10 +#define GENE_INSTABILITY_MAJOR 15 diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index cb2ab29dae0..4505dc1c1db 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -55,7 +55,7 @@ name="Hallucinate" activation_message="Your mind says 'Hello'." deactivation_message ="Sanity returns. Or does it?" - instability = -2 + instability = -GENE_INSTABILITY_MODERATE mutation=HALLUCINATE /datum/dna/gene/disability/hallucinate/New() @@ -65,7 +65,7 @@ name="Epilepsy" activation_message="You get a headache." deactivation_message ="Your headache is gone, at last." - instability = -2 + instability = -GENE_INSTABILITY_MODERATE disability=EPILEPSY /datum/dna/gene/disability/epilepsy/New() @@ -75,7 +75,7 @@ name="Coughing" activation_message="You start coughing." deactivation_message ="Your throat stops aching." - instability = -1 + instability = -GENE_INSTABILITY_MINOR disability=COUGHING /datum/dna/gene/disability/cough/New() @@ -85,7 +85,7 @@ name="Clumsiness" activation_message="You feel lightheaded." deactivation_message ="You regain some control of your movements" - instability = -2 + instability = -GENE_INSTABILITY_MINOR mutation=CLUMSY /datum/dna/gene/disability/clumsy/New() @@ -95,7 +95,7 @@ name="Tourettes" activation_message="You twitch." deactivation_message ="Your mouth tastes like soap." - instability = -1 + instability = -GENE_INSTABILITY_MODERATE disability=TOURETTES /datum/dna/gene/disability/tourettes/New() @@ -105,7 +105,6 @@ name="Nervousness" activation_message="You feel nervous." deactivation_message ="You feel much calmer." - instability = -1 disability=NERVOUS /datum/dna/gene/disability/nervousness/New() @@ -115,7 +114,7 @@ name="Blindness" activation_message="You can't seem to see anything." deactivation_message ="You can see now, in case you didn't notice..." - instability = -5 + instability = -GENE_INSTABILITY_MAJOR sdisability=BLIND /datum/dna/gene/disability/blindness/New() @@ -125,7 +124,7 @@ name="Deafness" activation_message="It's kinda quiet." deactivation_message ="You can hear again!" - instability = -4 + instability = -GENE_INSTABILITY_MAJOR sdisability=DEAF /datum/dna/gene/disability/deaf/New() @@ -139,7 +138,7 @@ name="Nearsightedness" activation_message="Your eyes feel weird..." deactivation_message ="You can see clearly now" - instability = -3 + instability = -GENE_INSTABILITY_MODERATE disability=NEARSIGHTED /datum/dna/gene/disability/nearsighted/New() @@ -151,7 +150,6 @@ desc = "I wonder wath thith doeth." activation_message = "Thomething doethn't feel right." deactivation_message = "You now feel able to pronounce consonants." - instability = -1 mutation = LISP /datum/dna/gene/disability/lisp/New() diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 5fa8d6bb10c..5ec04865591 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -12,7 +12,7 @@ desc = "Completely shuts down the speech center of the subject's brain." activation_message = "You feel unable to express yourself at all." deactivation_message = "You feel able to speak freely again." - instability = -3 + instability = -GENE_INSTABILITY_MODERATE sdisability = MUTE /datum/dna/gene/disability/mute/New() @@ -31,7 +31,7 @@ desc = "The subject suffers from constant radiation sickness and causes the same on nearby organics." activation_message = "You feel a strange sickness permeate your whole body." deactivation_message = "You no longer feel awful and sick all over." - instability = -6 + instability = -GENE_INSTABILITY_MAJOR mutation = RADIOACTIVE /datum/dna/gene/disability/radioactive/New() @@ -61,7 +61,7 @@ desc = "Greatly slows the subject's metabolism, enabling greater buildup of lipid tissue." activation_message = "You feel blubbery and lethargic!" deactivation_message = "You feel fit!" - instability = -2 + instability = -GENE_INSTABILITY_MINOR mutation = OBESITY /datum/dna/gene/disability/fat/New() @@ -74,7 +74,6 @@ desc = "Forces the language center of the subject's brain to construct sentences in a more rudimentary manner." activation_message = "Ye feel like a reet prat like, innit?" deactivation_message = "You no longer feel like being rude and sassy." - instability = -1 mutation = CHAV /datum/dna/gene/disability/speech/chav/New() @@ -114,7 +113,6 @@ desc = "Forces the language center of the subject's brain to construct sentences in a vaguely norse manner." activation_message = "You feel Swedish, however that works." deactivation_message = "The feeling of Swedishness passes." - instability = -1 mutation = SWEDISH /datum/dna/gene/disability/speech/swedish/New() @@ -134,7 +132,7 @@ desc = "Heavily corrupts the part of the brain responsible for forming spoken sentences." activation_message = "You can't seem to form any coherent thoughts!" deactivation_message = "Your mind feels more clear." - instability = -1 + instability = -GENE_INSTABILITY_MINOR mutation = SCRAMBLED /datum/dna/gene/disability/unintelligable/New() diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 7cc0731e3bb..8df3af9a834 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -28,7 +28,7 @@ ///////////////////////// /datum/dna/gene/basic/stealth - instability = 4 + instability = GENE_INSTABILITY_MODERATE /datum/dna/gene/basic/stealth/can_activate(var/mob/M, var/flags) // Can only activate one of these at a time. @@ -121,7 +121,7 @@ desc = "Allows the subject to lower the body temperature of others." activation_messages = list("You notice a strange cold tingle in your fingertips.") deactivation_messages = list("Your fingers feel warmer.") - instability = 4 + instability = GENE_INSTABILITY_MODERATE mutation = CRYO spelltype = /obj/effect/proc_holder/spell/targeted/cryokinesis @@ -218,7 +218,7 @@ desc = "Allows the subject to eat just about anything without harm." activation_messages = list("You feel hungry.") deactivation_messages = list("You don't feel quite so hungry anymore.") - instability = 2 + instability = GENE_INSTABILITY_MINOR mutation = EATER spelltype=/obj/effect/proc_holder/spell/targeted/eat @@ -360,7 +360,7 @@ //cooldown = 30 activation_messages = list("Your leg muscles feel taut and strong.") deactivation_messages = list("Your leg muscles shrink back to normal.") - instability = 2 + instability = GENE_INSTABILITY_MINOR mutation = JUMPY spelltype =/obj/effect/proc_holder/spell/targeted/leap @@ -463,7 +463,7 @@ //cooldown = 1800 activation_messages = list("You don't feel entirely like yourself somehow.") deactivation_messages = list("You feel secure in your identity.") - instability = 3 + instability = GENE_INSTABILITY_MODERATE mutation = POLYMORPH /datum/dna/gene/basic/grant_spell/polymorph/New() @@ -514,7 +514,7 @@ spelltype = /obj/effect/proc_holder/spell/targeted/empath activation_messages = list("You suddenly notice more about others than you did before.") deactivation_messages = list("You no longer feel able to sense intentions.") - instability = 1 + instability = GENE_INSTABILITY_MINOR mutation=EMPATH /datum/dna/gene/basic/grant_spell/empath/New() @@ -632,7 +632,7 @@ desc = "Vastly increases the gas capacity of the subject's digestive tract." activation_messages = list("You feel bloated and gassy.") deactivation_messages = list("You no longer feel gassy. What a relief!") - instability = 2 + instability = GENE_INSTABILITY_MINOR mutation = SUPER_FART spelltype = /obj/effect/proc_holder/spell/aoe_turf/superfart diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm index 4e3d77efb66..2f211f7a057 100644 --- a/code/game/dna/genes/powers.dm +++ b/code/game/dna/genes/powers.dm @@ -6,7 +6,7 @@ name="No Breathing" activation_messages=list("You feel no need to breathe.") deactivation_messages=list("You feel the need to breathe, once more.") - instability = 2 + instability = GENE_INSTABILITY_MODERATE mutation=NO_BREATH activation_prob=10 @@ -18,7 +18,7 @@ name="Regenerate" activation_messages=list("Your wounds start healing.") deactivation_messages=list("Your regenerative powers feel like they've vanished.") - instability = 1 + instability = GENE_INSTABILITY_MINOR mutation=REGEN /datum/dna/gene/basic/regenerate/New() @@ -28,7 +28,7 @@ name="Super Speed" activation_messages=list("You feel swift and unencumbered.") deactivation_messages=list("You feel slow.") - instability = 2 + instability = GENE_INSTABILITY_MINOR mutation=RUN /datum/dna/gene/basic/increaserun/New() @@ -39,7 +39,7 @@ name="Heat Resistance" activation_messages=list("Your skin is icy to the touch.") deactivation_messages=list("Your skin no longer feels icy to the touch.") - instability = 2 + instability = GENE_INSTABILITY_MODERATE mutation=RESIST_HEAT /datum/dna/gene/basic/heat_resist/New() @@ -52,7 +52,7 @@ name="Cold Resistance" activation_messages=list("Your body is filled with warmth.") deactivation_messages=list("Your body is no longer filled with warmth.") - instability = 2 + instability = GENE_INSTABILITY_MODERATE mutation=RESIST_COLD /datum/dna/gene/basic/cold_resist/New() @@ -65,7 +65,7 @@ name="No Prints" activation_messages=list("Your fingers feel numb.") deactivation_messages=list("your fingers no longer feel numb.") - instability = 1 + instability = GENE_INSTABILITY_MINOR mutation=FINGERPRINTS /datum/dna/gene/basic/noprints/New() @@ -75,7 +75,7 @@ name="Shock Immunity" activation_messages=list("Your skin feels dry and unreactive.") deactivation_messages=list("Your skin no longer feels dry and unreactive.") - instability = 2 + instability = GENE_INSTABILITY_MODERATE mutation=NO_SHOCK /datum/dna/gene/basic/noshock/New() @@ -85,7 +85,7 @@ name="Midget" activation_messages=list("Everything around you seems bigger now...") deactivation_messages = list("Everything around you seems to shrink...") - instability = 1 + instability = GENE_INSTABILITY_MINOR mutation=DWARF /datum/dna/gene/basic/midget/New() @@ -106,7 +106,7 @@ name="Hulk" activation_messages=list("Your muscles hurt.") deactivation_messages=list("Your muscles shrink.") - instability = 8 + instability = GENE_INSTABILITY_MAJOR mutation=HULK activation_prob=5 @@ -146,7 +146,7 @@ name="X-Ray Vision" activation_messages=list("The walls suddenly disappear.") deactivation_messages=list("the walls around you re-appear.") - instability = 8 + instability = GENE_INSTABILITY_MAJOR mutation=XRAY activation_prob=10 @@ -157,7 +157,7 @@ name="Telekenesis" activation_messages = list("You feel smarter.") deactivation_messages = list("You feel dumber.") - instability = 8 + instability = GENE_INSTABILITY_MAJOR mutation=TK activation_prob=10 diff --git a/code/game/dna/genes/vg_disabilities.dm b/code/game/dna/genes/vg_disabilities.dm index e3c6b9883c6..ece9cb1da5c 100644 --- a/code/game/dna/genes/vg_disabilities.dm +++ b/code/game/dna/genes/vg_disabilities.dm @@ -4,7 +4,6 @@ desc = "Forces the speaking centre of the subjects brain to yell every sentence." activation_message = "YOU FEEL LIKE YELLING!" deactivation_message = "You feel like being quiet.." - instability = -1 mutation = LOUD /datum/dna/gene/disability/speech/loud/New() @@ -24,7 +23,7 @@ desc = "Causes the cerebellum to shut down in some places." activation_message = "You feel very dizzy..." deactivation_message = "You regain your balance." - instability = -2 + instability = -GENE_INSTABILITY_MINOR mutation = DIZZY /datum/dna/gene/disability/dizzy/New() diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index fd2061e66fb..0affb14e014 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -6,7 +6,7 @@ spelltype =/obj/effect/proc_holder/spell/targeted/morph activation_messages=list("Your body feels if can alter its appearance.") deactivation_messages = list("Your body doesn't feel capable of altering its appearance.") - instability = 1 + instability = GENE_INSTABILITY_MINOR mutation=MORPH /datum/dna/gene/basic/grant_spell/morph/New() @@ -150,7 +150,7 @@ name="Telepathy" activation_messages=list("You feel you can project your thoughts.") deactivation_messages=list("You no longer feel you can project your thoughts.") - instability = 1 + instability = GENE_INSTABILITY_MINOR mutation=REMOTE_TALK spelltype =/obj/effect/proc_holder/spell/targeted/remotetalk @@ -216,7 +216,7 @@ name="Remote Viewing" activation_messages=list("Your mind can see things from afar.") deactivation_messages=list("Your mind can no longer can see things from afar.") - instability = 1 + instability = GENE_INSTABILITY_MINOR mutation=REMOTE_VIEW spelltype =/obj/effect/proc_holder/spell/targeted/remoteview diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d1c9b92c917..a7c5e8dc649 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -170,16 +170,33 @@ adjustCloneLoss(0.1) /mob/living/carbon/human/handle_mutations_and_radiation() - var/gene_instability = DEFAULT_GENE_INSTABILITY + var/gene_stability = DEFAULT_GENE_STABILITY for(var/datum/dna/gene/gene in dna_genes) if(!gene.block) continue if(gene.is_active(src)) - gene_instability += gene.instability + gene_stability -= gene.instability speech_problem_flag = 1 gene.OnMobLife(src) - if(prob(10) && prob(max(gene_instability, 0))) - adjustCloneLoss(0.3 * gene_instability) + if(mind && mind.special_role && mind.special_role == "Wizard") //magic + gene_instability = DEFAULT_GENE_STABILITY + if(gene_stability < 85)) + if(prob(5)) + adjustBurnLoss(2) + to_chat(src, "You feel like your skin is burning and bubbling off!") + if(gene_stability < 70) + if(prob(3)) + adjustCloneLoss(2) + to_chat(src, "You feel as if your body is warping.") + if(prob(5)) + adjustToxLoss(3) + to_chat(src, "You feel weak and nauseous.") + if(gene_stability < 40 && getCloneLoss() > 30) + to_chat(src, "You feel incredibly sick... Something isn't right!") + spawn(180) + if(getCloneLoss()) + gib() + if(!(species.flags & RADIMMUNE)) if (radiation) From 1573e9be7b39b747d42b9c521ae2d22d360b58f0 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Mon, 27 Jun 2016 13:27:22 -0400 Subject: [PATCH 12/99] There we go --- code/modules/mob/living/carbon/human/life.dm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a7c5e8dc649..88c7964c07c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -178,12 +178,10 @@ gene_stability -= gene.instability speech_problem_flag = 1 gene.OnMobLife(src) - if(mind && mind.special_role && mind.special_role == "Wizard") //magic - gene_instability = DEFAULT_GENE_STABILITY - if(gene_stability < 85)) + if(gene_stability < 85) if(prob(5)) - adjustBurnLoss(2) - to_chat(src, "You feel like your skin is burning and bubbling off!") + adjustFireLoss(2) + to_chat(src, "You feel like your skin is burning and bubbling off!") if(gene_stability < 70) if(prob(3)) adjustCloneLoss(2) @@ -191,10 +189,10 @@ if(prob(5)) adjustToxLoss(3) to_chat(src, "You feel weak and nauseous.") - if(gene_stability < 40 && getCloneLoss() > 30) + if(gene_stability < 40 && getCloneLoss() > 50 && prob(5)) to_chat(src, "You feel incredibly sick... Something isn't right!") spawn(180) - if(getCloneLoss()) + if(getCloneLoss() > 10) gib() if(!(species.flags & RADIMMUNE)) From 551b2aefbdee42a304c08909192502077e94497d Mon Sep 17 00:00:00 2001 From: TheDZD Date: Sat, 2 Jul 2016 19:17:17 -0400 Subject: [PATCH 13/99] Remove some shit from Life(), and fix wiznerd thing --- code/game/dna/genes/gene.dm | 6 ++++-- code/game/gamemodes/wizard/wizard.dm | 1 + code/modules/mob/living/carbon/human/human_defines.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 2 -- code/modules/mob/living/living_defines.dm | 4 +++- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/code/game/dna/genes/gene.dm b/code/game/dna/genes/gene.dm index ad2b1f43c54..a39da68c92e 100644 --- a/code/game/dna/genes/gene.dm +++ b/code/game/dna/genes/gene.dm @@ -38,14 +38,16 @@ return 0 // Called when the gene activates. Do your magic here. -/datum/dna/gene/proc/activate(var/mob/M, var/connected, var/flags) +/datum/dna/gene/proc/activate(var/mob/living/M, var/connected, var/flags) + M.gene_stability += instability return /** * Called when the gene deactivates. Undo your magic here. * Only called when the block is deactivated. */ -/datum/dna/gene/proc/deactivate(var/mob/M, var/connected, var/flags) +/datum/dna/gene/proc/deactivate(var/mob/living/M, var/connected, var/flags) + M.gene_stability -= instability return // This section inspired by goone's bioEffects. diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 6aa56d91c70..d98eae3135d 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -195,6 +195,7 @@ to_chat(wizard_mob, "In your pockets you will find a teleport scroll. Use it as needed.") wizard_mob.mind.store_memory("Remember: do not forget to prepare your spells.") wizard_mob.update_icons() + wizard_mob.gene_stability = 2 * DEFAULT_GENE_STABILITY //magic return 1 diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 6f106f5e125..3af93392326 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -80,4 +80,4 @@ var/global/default_martial_art = new/datum/martial_art var/fire_dmi = 'icons/mob/OnFire.dmi' var/fire_sprite = "Standing" - var/datum/body_accessory/body_accessory = null \ No newline at end of file + var/datum/body_accessory/body_accessory = null diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 88c7964c07c..9a56765bf67 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -170,12 +170,10 @@ adjustCloneLoss(0.1) /mob/living/carbon/human/handle_mutations_and_radiation() - var/gene_stability = DEFAULT_GENE_STABILITY for(var/datum/dna/gene/gene in dna_genes) if(!gene.block) continue if(gene.is_active(src)) - gene_stability -= gene.instability speech_problem_flag = 1 gene.OnMobLife(src) if(gene_stability < 85) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index ce73ae369c0..d4e6d613d9c 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -54,4 +54,6 @@ var/list/butcher_results = null - var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them. \ No newline at end of file + var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them. + + var/gene_stability = DEFAULT_GENE_STABILITY From c53eb8607df661fcda86b762982a54acb0edcce3 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 5 Jul 2016 04:15:51 -0400 Subject: [PATCH 14/99] Allows You To Pet pAIs --- code/modules/mob/living/silicon/pai/pai.dm | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 635efadcaba..c9ab50508f1 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -466,10 +466,15 @@ return /mob/living/silicon/pai/attack_hand(mob/user as mob) - if(stat == 2) return - visible_message("[user.name] boops [src] on the head.") - spawn(1) - close_up() + if(stat == DEAD) + return + if(user.a_intent == I_HELP) + user.visible_message("[user] pets [src].") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + else + visible_message("[user.name] boops [src] on the head.") + spawn(1) + close_up() //I'm not sure how much of this is necessary, but I would rather avoid issues. /mob/living/silicon/pai/proc/close_up() From c335840cfd6ab735061f91c53d3a4d8f8e2f896e Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Wed, 6 Jul 2016 19:40:56 +0100 Subject: [PATCH 15/99] Fixes AIs removing beakers from IV Drips Thanks to Krausus for the general idea on how to do this without adding an exception just for the AI. - AIs can no longer interact with IV Drips (unless their core is literally adjacent to it); - Human mobs and Robotics can still interact with IV Drips (robots can no longer interact with them at a distance :cl: tweak: AI can no longer interact with IV Drips at a distance tweak: Robots can no longer interact with IV Drips at a distance /:cl: --- code/game/machinery/iv_drip.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 5caff96d4ea..0fb74bc68ad 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -132,6 +132,8 @@ update_icon() /obj/machinery/iv_drip/attack_hand(mob/user as mob) + if((get_dist(src, user) > 1)) + return //stops the AI from removing beakers, still allows borgs if(src.beaker) src.beaker.loc = get_turf(src) src.beaker = null From 34a6960ef11c68e6950ecb3f4e0ae8dc75692338 Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Wed, 6 Jul 2016 19:50:47 +0100 Subject: [PATCH 16/99] Removes 2 extra parenthesis What the title says. --- code/game/machinery/iv_drip.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 0fb74bc68ad..2c1f4cb0059 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -132,7 +132,7 @@ update_icon() /obj/machinery/iv_drip/attack_hand(mob/user as mob) - if((get_dist(src, user) > 1)) + if(get_dist(src, user) > 1) return //stops the AI from removing beakers, still allows borgs if(src.beaker) src.beaker.loc = get_turf(src) From 9793fc4b18882b45821ed7c326cb30ce9dd44461 Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Wed, 6 Jul 2016 21:22:28 +0100 Subject: [PATCH 17/99] Resisting out of unwelded lockers is now possible Fixes #4880. Sorta. - Can now resist out of unwelded lockers instantaneously - By association, can now resist out of closed cardboard boxes You can also use Toggle Open, this is just faster. --- code/game/objects/structures/crates_lockers/closets.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 44048f5113c..80ba89ddbcf 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -388,6 +388,7 @@ L.forceMove(get_turf(src)) // Let's just be safe here return //Door's open... wait, why are you in it's contents then? if(!welded) + open() //for cardboard boxes return //closed but not welded... // else Meh, lets just keep it at 2 minutes for now // breakout_time++ //Harder to get out of welded lockers than locked lockers From 336d2eb7914035019325316f9c6d177317c905bb Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Wed, 6 Jul 2016 22:21:47 +0100 Subject: [PATCH 18/99] Fixed Clown/Mime Door Deconstruction Fixes #4689 - Deconstructing Clown Doors now gives Bananiums - Deconstructing Mime Doors now gives Tranquilite - Invisibility drives installed :cl: tweak: Deconstructing Clown Doors gives Bananium tweat: Deconstructing Mime Doors gives Tranquilite --- code/game/machinery/doors/airlock.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 9c361225866..56d9b421c37 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -257,14 +257,14 @@ /obj/machinery/door/airlock/clown name = "Bananium Airlock" icon = 'icons/obj/doors/Doorbananium.dmi' - mineral = "clown" + mineral = "bananium" doorOpen = 'sound/items/bikehorn.ogg' doorClose = 'sound/items/bikehorn.ogg' /obj/machinery/door/airlock/mime name = "Tranquillite Airlock" icon = 'icons/obj/doors/Doorfreezer.dmi' - mineral = "mime" + mineral = "tranquilite" doorOpen = null doorClose = null From c6ecdbbd11b58933e7508ac4786571a2bdc591a8 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 6 Jul 2016 17:45:58 -0400 Subject: [PATCH 19/99] Fixes Sechud Flash Protection --- code/modules/clothing/glasses/hud.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 8756290ad20..4c6fed0eec4 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -73,7 +73,6 @@ desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records." icon_state = "securityhud" var/global/list/jobs[0] - flash_protect = 1 HUDType = DATA_HUD_SECURITY_ADVANCED species_fit = list("Vox") sprite_sheets = list( @@ -84,11 +83,12 @@ /obj/item/clothing/glasses/hud/security/chameleon name = "Chamleon Security HUD" desc = "A stolen security HUD integrated with Syndicate chameleon technology. Toggle to disguise the HUD. Provides flash protection." + flash_protect = 1 /obj/item/clothing/glasses/hud/security/chameleon/attack_self(mob/user) chameleon(user) -/obj/item/clothing/glasses/hud/security/jensenshades +/obj/item/clothing/glasses/hud/security/sunglasses/jensenshades name = "augmented shades" desc = "Polarized bioneural eyewear, designed to augment your vision." icon_state = "jensenshades" @@ -109,6 +109,7 @@ desc = "Sunglasses with a HUD." icon_state = "sunhud" darkness_view = 1 + flash_protect = 1 tint = 1 prescription_upgradable = 1 From 092e42417511461f8ebd7f08486a2e594b633b00 Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Wed, 6 Jul 2016 23:08:26 +0100 Subject: [PATCH 20/99] Fixed Mime Doors It's not Tranquilite. It's not Tranqillite. It's Tranquillite. --- code/game/machinery/doors/airlock.dm | 2 +- icons/obj/doors/door_assembly.dmi | Bin 38036 -> 45559 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 56d9b421c37..5afe0e9c1a1 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -264,7 +264,7 @@ /obj/machinery/door/airlock/mime name = "Tranquillite Airlock" icon = 'icons/obj/doors/Doorfreezer.dmi' - mineral = "tranquilite" + mineral = "tranquillite" doorOpen = null doorClose = null diff --git a/icons/obj/doors/door_assembly.dmi b/icons/obj/doors/door_assembly.dmi index db174eb329f06f2eb698148f8dc0b7c848625fa7..2c927cb8047a4ab014d7d9e8244e4cbda8aa5b4a 100644 GIT binary patch literal 45559 zcma&N1zc2L+ckU!q(P+HQIKxwMo>_Yl#&hsX^@s01nCrzE|E~WySqV3q`Mn|fnnx5 z{O|jIp6C7EFW&jV#GVt^+2`7O)>_xvp{mOA1h~|=000oYdih)(03cc5KMWfaY}rex zaR30c@{bxiF3-)K%|2K;x>z~b1As?bda{xOHSdF<(Z<#eg%UL~nG$`rZ(*{h6ft{r zwuQ)-cCtIIM<$7+p$2Q74$o7VKSFIsBf4^~kQZi`k86$^k%+*WVZ+)txBVKU0Md2Bi;!gVr z#l-n_%N1p4shpvjd~|7vs|h1yzg;Akd-FLc&Yf{Bwaux^P4B`|xh>z7L{-8+$X)32 zWfogJDXl)7wU#^7JxeLJSTCvm34X9w8SFH#Nr|1CIK@sb-dwMNSQY%4gSluN*h%aD zybydOp(&3=;6q2pf8y#gRyQ;LtkRHqAjaq$KAiDiFXrY{M{Mka9@=l;_B0L*JYCde z>h4zxi%TVC7W#29FGp_vCxGT{yp@XmJGDHChS(QWa&CnLdp4PX9FoYGGD5mBATeU^ zka4ZXtG{mF@af@4yK~J9H#^K}-tUm9JW~wzS3yhiduf~mgK*j@Uzr(=8#RMB5qxHn zE~DN%8SqJov*G|7yt-d^(vvw6L^dlr)epNGmxdnp}A#v}=tvV3S?OW%n1 zO{cRwlYh4mO6;O=_ZG_>eEUJG_a5pAZ+6H|ApK900XIhZpWi8q2J8}-aerGv{l?3> zB*JQ=i+{HqUHd(bWa&xfe)_sc{83V}%c!W$vvnhW>*CINl&_*a<@IyKbJVM#sYx6Y5ET^# z0Q^pA<&Vt|0Un!a4h;pBmpTBOvQDU$RU>UBWbT08cq@Bd9_Drp zP8Yph^ONs@IwM+IBmvm41zr-Af};0m&qb7oiYoNt;zIf)&@c2%{uGhp?CcBym{l^m ze&s3>QP6~61>W;rtC`lSa(7wY9?#LKb9~G}j>pEvR_45=91ShE7^Y?t6{W7U7?!cJ zVm&=O^ZBz{mxgUbg(S0DLId2OVdsObC{gwduTdNkyPFrn!1An5m64u1_uj?t#N&jO zEh!HOQ05JHX}zJ9)Q{>8pJ*PDfJvaNt*s#dpT$+}U*ruV;`IEy?ShK4<=2Mxm)6rQ zcXVL8!2xk7o6jvH50^LPFYOW$LIuN+866t$>eqJUP7<@K}?l~DA z6?JiSI4HOhP0+$C7x1z<47F(H+CFb?dGO++=%De&KVKndjL?Ub0xkt!_2ZY+ndcU1qlJ5pzfF{-dLAd*(6WyBG{q`S-dWWlp;lSzjANf>n0X` z)}j5C+r`)a{mh7H(~W&GhtU8|7^BOlz)}t)9r(R(MW0)xuMq+j-aiyxa+olFM?-V> z1&jq#(HEx^17CwXLkrH(VY@v@q7}Ska3?9%Ei6E2i?Et^?2Qc53i}{o)hPtFh@2)` zaekeUc@Xl?L+%AcTe<~PFh~a6rL}YQ5yELGF=Ue&;nY<-_ffvvzK!gGkl{;KBJjrA zH$7O1R`G2>m0)zBAZPU_G7Ow8Xs52hcGbG@zj8TFzg1bu!4qA&1}~U69q;kIsj8U6 zVEa#-fu2|$vdwpvcMPH!_Tp;b)JJ0Fw_P*h8r$yEzMH>7->O65`A3N&t-{`PH$OkA z)~JaVpBunq3w`w){Z~%CO~{(9BQYPgpY5?(j+KiJ?L+rJ5?U1CX6dNeow(850HV3& zCl(KoznAm#E2Ca{M^YQY`!%iJx3Z-;$ zn*d&7{Zoxg~T8m zPp)&Dp$SR)CbNJNKAsJ@%#tXlUJ18cE8cuf==JdyrBLzrqr_rZ%b<;?hcZVL6n#Ld z_;}TQv=0JwXvbvw&pbJZtSV`=52f&fpQ;2@@TNsw#V!-dn1 zs=EwULwyPQ%K<&8$X{s2we6j56!(4TW}-o}w+L?G>`@?;+SkP7G2n(D z)BnyC9vU!rYX%>6Jg66v3uOJ;|L&9xmG5KlaPC1%1!6p&6pB3pAQ#&Y#x z*oM}~`&RKpKIe4hYV~x+TZ_EGN!o~3GGcnsP`IOG85{5HiZ@W|diUr^-qlqgOq;gX zKlRe{F9D>jx>2qd4)IUO1aC@oUeF-ap7J!;5GlQ0`04)oHB_lTAydvqoXhv;$zqPc zLkh{4=L0GGit29k3}*h*7J%K$kPsNUw2T^&?$$86ZjSjS1A=IixpIl`qCsB5Xz*#E zigc!gN3;<$3q>(SpD?2nyqlmO93OsF8?H#K>{x8shxh%SeCLNgFhD*2ssXopQuWy8 zRmw~ch1VY*D|5Vt)ECN}+ma#V@q*PR?L~~jwKf#gTV?54CdI{V>yS&|?3JaBjK73u zn=9JEgu!Wk8?KGzc7-JF&@t2AfNV~w{Lkj*b#giFCpM)R#D9SGKAQL#{RaW9P6~Km zJ)nL^Mq&+!^j^1eqfJOS>2i29Dz^{%^LvyZOSN(6hVd5oz zIFVY=nDrAC1zKH_G=0IznT)H~ZqQ<_!A^+rBa`iub=eK{Hi@O?&>7@SE7^*}+yEw> z?cAUMqyZ0CP?~ z3=6AmM?oPbo;+Oj6tWx%cVAn~MClVDH#u!}Z-@0J!;b5BDCrp(W?6(G4Be!dFgr}* z!p3bRVj{_WvzJh{*QLF}2o7$vpF%l$1Mw(psBAkHjD!tKxgdT8>{p#t zte+_Hb$?qdkxp8fHM8r9q;j<5s zmaITZ_*9t=$JjXkd(DTsTjk8g&b(gIGTlqZo2f}FAF|(%&~C$G&fFJQ@1-XOZ)Kpl zVB5hfD=MV_UIvU?k55bl6cuskbF_qD;2fDfGbQCAshg+>UOMtn6aps%-`Fdv81yFf zdqsmLD!OJ7n3wSF@CScpH9a}WtD2%6IDQ!R`aK)G0UkU>CNT2bdU~=vCmJN+HS$LE z-t)uuVV?*3ji0#Q5^DN26%y3mGSopw3{W*q;sER%JF$&_@-!TUQazP|ufGY&S*sF_0dV_|yY;Eg)q;jKzQX9xNj+(8)zIo>ka(5^GQl(8#i|pv2 z&oI)_S-0fwfLb9{`QyXnrh5Wkc*FIyZ^Mj^D$%HwrTl-(y?TXn&aN#}>nByD#U3Gw zx_lHU^}*Zk=kRe<&6>poZB(FO-6@nUb5GOvZc1mYkG*OSsWf>yyaumbYDqbk9fF3f zKYfhfFL$f$4R<~-_J+#}-e=+FCIqo>4Z?f-;wad6V?Z?<$1mc2_xTYSr_>62FE~=ctYvs=2pkYm!rF6?m$FYCITrR_=ZD;HE zCFtV6!Sq~BJ1Tlx3BbUpx7ae@R$8nC^>Yfl6w&n#HuxwL47>&ODBU+V*leB#Bc21;YC+|H`R%LNw^Yim&-Rhlv zFlPv!a+6C8l?)>7(z;K#BO=eT*G0<$`g?|yupZU;Olh`}Y2*7cdz)W@uCOiB_%z zq6`svmi;ni1q*T7cV(-@W|*cRw%l+|h~e38TdB%kBJ!9h)0uCQLfTHq$TMyo*V%!5 zVs&*D?HbZC`N;n_6Bvq&y!qExQ5-^{$=o=#gk2zP?Ywl+_~ky|Qo%9!s?O(84UQ32 zOWC)WLdUMSJ`DPmix%5LV3aje#A#4?%d%RRh>mVJis5%zyMtr>SVrsf&^u5kyiw^v zwT19jqT;lCv&**T?G(9S7`Ao|c@R2$+5UjtM-%6 z%vlpV&)>a!r^*asKRU_$sHi9y9FLr1*+ClQe;#`JRKSuDIGWt91XBr=^GTTEaF_>1 zOp(%5`^vadE#sdBxGPjj{1#uXP17xAE_uetMH7TfLTZmrn-4N>tg7BpHW_+TS&XKH zb#%xSOxd#WFv2IzXO@NmSk560hd~3WQ+as^#XD;|8@m@?@>o$1C2&Q3h(rgZzPPsO zlRh`v=tbJ)a-RS8YdSUa9m?C_Jz6|)hput^h5lSZ8Ge=8OV9=Y&1gyL7|!fF8pv5K z1_2rgcMylpC|51<%M21HC#T=_&iUGu926L}2X?qZ^Ns;3dae2^R4dP~298l4(w_&p zTWOal63rG6>iEL`fjVtF_vowIcBRUws!#|U>RROD%3seVS?kt0ggH9KAPko+7%zVp zM)>oL$Nj>^`{tk)$YRM%som8^-jHxuZ0F2EVmQ085TeVm(}c;HE=L5uwL6l257pwB z(E){-;(bb*f(!U z4LL>m{-6P?sut$PQ)Z(YoXn|#P!f}uv}qYtmAM#D4NZb@ng}~^K6Ho}?+a3pm&c@l zFn{Hq19KPkZq}+O)d;gWN~Y(@axq23*pDfm7ca7xx}#RYT!a$TfPH*)f)}rPs+_9n z(X)DY)-TavrJUqV&7C1)4+V3I{X2XT6ITS>l{FaQAT#XS{A0=;fG~bs{P2T`H}Z}d zR^H#ur7$}Gv+4hL@8p>#89lQlVe--cq>NBvAsv1ub&2NFN)HHV~@!;@#rQ$C95IuD2Lt+Z%c4nh#)s-ZvM5^f3wSBJ3C|G`*$@} zh)%|8dQ>Rd*cxS9W(3Za`~|5uj|kQcvvNBmbY`g{FMDpBuvAb65PBm248vINAqE9{ zRc#IHNdD&$p$F!i2nAN4=~OsQTmKC82H@{Y$4&fVOXfk=i}^!k(( zV5f6(>Nu}OR(SjQ5P_HQ?K*%^{BQ`Iw~*Bb0VCWGn*Zvde=Oq4+{$bP0R&%;V^h)G z+DO`Q!m7;!3Y@Nx5BP*U_#G^`q%eDVsr$<5QFs^_br0GcG>lxyw9+}{NsAM_6-@MD z0tt|r_jyl@Fzy|CL$YdH1(xl6UiHx)A*9oxK+{H)K2^#8V5@RF2w1y9-yJ2!M=vEe zEI*SnR0R?g$j0_OoR@^52Tilqq5i0sb599xA2fA9rr^0Sm4XpDB|TeuzIX* z+c^EtT9s5H_4PbG-5C5Y$&IlZQs(ByEd)FFKeS~{dkB0^Zfw^URX9aQ$|tzA1QNbT zhk}ZQ_AfXwa{F|GlXUfqcp@)gI!P`5tJ@-0ptiQ7;8)xJ2aiB88qKQSr_7zw2lkR{ zwlB44J~2OJgnN^ul?FO>ymReLCsK(LScETZjSku``5?txkt2iLP(h=A(PBn?GA4Gq z!-#?p939$G&^(CbN9}_tXb0d}XN2iWNlS_mpc_DWIS7Wx8Sc_5-?)^UCRGe!`inm; zt#AsrP9OAOYns?%A|d9&bCVN4`7ZZC>FruNRKT-Bn@`135f7xyW@nr5^>BtVVVbn{ zlrPvuZzU5?bUpHim6(|I$@e1)R$m?b(@rH>Ywf-@%n+?Z-e^$jUyPh~VFWdxCG zsCLMA|ML)mAjl*s1_4YgBNNTWi2FU+&0PHY8R~h@el7q@A(4ltzpqyQ@G#ieqKm`= z0M=70dc>f|_M5yGU%*Nq)a9UM52Y50dI?JLhGWD5qEas6F>AWVDC>|!`{ z(nt9Dy2jyh)ogb%%l67T4;RBvxPkO4ZH|5V3<}iS37fY`{ffN`UDSa6q!N z<4VuSH8dz^8;^N`xjY_##mL^arCn^QzS^-IgH67@<0^wu^E5<&a`{7jmiiCUEw9_P zoE2|K+q z->Ektrg!-yFCHOOPvgGCsSy~jwFgY%6>9Oy5UTj2p<~|f6Z5N^xwW5SlUrNNAeQK~ z759kwcvCZ%^nLwZsZYXcFh|uoc;fLtbAzJ+C*3QZFfL9FkB-DuZbRB*WG8{_LoUBM zT#Tg|)Wp(K^zN>8RjG|k|KwWT+4g92%}R>D+?ulfPeh)62bA60B;>49GObBUg1D_k zePvSNL{{{Hz~fH`sFy5kpBRR2h@y{sx%{4V#Bgt%M#n$BuwXb4`jss73mN%v%HomV z1~Vvc#AlA&#>SH>vbJbrbh-9KSCMnP{p8T0pcX>!Elh}Qlb~$Hmx54INe}4M{M1PJ zz87TSRmT0qU0=U;tgt~Ip-|CGs9g4vwnNXe#3*Cm=#UiskjP zYNIQ6Cw(Xcc);@7DqJ~I05AmPUR32aDlZuTg zB?56+>BcNqu!w;1ItTi)F{SryDQciAC^*1`vgSjXt_k)G1HBA- zFOc=cLn9lQte)jDIm67`mcd&+|JaloyF%re_~nxo9i4{*3d{IPL?vN^@JIU_@w%rE z-g1!Zzm@6yniwoYN`N6|iyYBQ%Q`zfo__+7gxbtnhS9G`bijGknLU z%QiM3ZDnXamXjDtq}x6sd4R zr;IzgHDflQk6S8ba<7x;B{-;wT_*D>@r@}ll^ZVswQLsL0*5{MpI%-+`WmB7KQ!I; ziKMZc9B(6WK=`+0`Jh9Uwzwz~C){{)2dt2wPXroa)E;4<@tTY?wnM{m;wodST-ire z{xl?j-0d>|JmqDnxvZ1R2SLI4$>Bu5PNl__rR??pkl>^Ce852Bb8G9f%8{gRuog*G zK^iFM=7$O;_giIV%0#>fu{Hk7`(?4_5rY^!To?V_7HbSgv?eBwfuBzj{1nqIO#~G zno7cOuq$Ufn0};Z9t@okLRMeuZXtVySzO5xpy)({r7Z=UuKF^jXq&gkXuy49~1L8k^js#L}(B; zixaMDg7M+>>@KdpQLGWg_4-E$HML*U#btF;XNU*ZO=k(@UNg56_n$c;>m`{H0=^22b`c^CgO3IkpzGg-r-5YUl zIxEERfgt(kZHK;!9R+eqL31(DSJ>MUO&@aOi8FM7B)&8WDPaqT^Wdg&gYtMjWfs@8 zb4oy{h)4js;DU07Q+3lW30J$6h%L}?MNK+Xvymixd{TGnF zdc5hJFp9o6!*I5SMk_iUwPwBmQ6iwT6|`V=8gb}e6$T!8W5E4TztF8c*WT{ZY4D~XnM(oqwSzOd7y+uGRbx}hK!=kG=fCXS|}y=#aK< zv)vE@k!l*jqK@JH|g9NBokJE;XM8WIBwr#{&E1f+;e|MHNJX*@Z$={?Q^XJT~y?5+>*Q zI_y5hI^NvrAWyxsbH1c_$<-nDtvtIx$;4YXj$QQtVSe z(S?GX-1Kms>i0$e>+McTjZ7?Z)OP|rzh6Png~g!6l++V-XTGn+yo$c$_BpSPzRYi4 zPjTv;PY6!x1M~vQwm0v{H%HR_L7ku*u3>2S5FG$T4enW>P8mQ(MuzZB<4mI7Iqm34VEy9z>0_dlaw2d23{B;~6u^Zm4CyRa90c|Gx?jR+Py9Avka* zBq;pH3-JFXJ^+mH?(S~jcVkMfVj?}4Aor4S+KqR-urUF-IqNJezw(VTK+OQM&rc` zj2|$t4%w5t9cP|jZtqKVE{aPP2dg#Yk;&KUBqjUo>z-uzz41o`nz1G2dlp>v1Er4G zDhXxgRw&?YSH65eCpUjmMrB7pdf3>6Us@lx%GOW#y&?pxUpGeTv}?#b2On!{YzYb& z`FN^7D4QBPv5OTV*}vsvXR|#2IrVU)byyTn)g&$m->V zNp&;R^9oK|$~VV-i!pM-RI8faW8DZ^XYtlq3Z?QSwcho=m=*+7)3~)PEt&B#1NPrU zcsvzVwwWoxn8C-wm&6D?crGs=$Nc23@42b7?kG5=gf>1%!RJL_4Rp7{!mgrRq@>F- zfZUX}!Dmg&K}L26VEiBc%?~{;BE|poJfY1PICfwIN6+;R4A&&IO=XTmYoaXJ~udx6y0 zxKundeSPTweu!IEZhbSIodw?z7Z$#Cr1qPndK&NC9DXB(oN*P|l*PLmHRcO+>4wiT z`d_wiF{LAP1LPZib9~&q(4y3&PBO?Kp`iM|ac#7%Qhq4qe&z~k*ub~SO6N(cyCg8v zzTUHIAM7t#j z^Ct*Wotux(3V$Q1bK%G*Mc&gT26)oGa?ec!@2$Lv*FX_keF1xudh{Cv_W#Ifcj?vs z#c3D5W7KHwG5;W0CjC3b1LT=+pX{F~d=Cm<%R?mmzPy+Nx+Tw8h6%Mk@X=rY^j=4M z&_@C$=eP$MLD{%@IVO5TdrRJ z8sD*AU-idtTxqM8_%0tASu$;Sk#03EQ(UN#p^i>S02bl>Imx^H$z}8X(*klz4fNk0 z$B+JY{M3vX>wJ^d2J=Th9f2OYw(3=fjn~!YKOg0xA$<6KvE@LJiB)9Q#wZtV8hM^X z7uO$nS4?g-YW9YQ{JER?8Ya86r8^#M1^Wnl`h9!?^U3Y_k+6x*a5>443vMcBKSZHwJ+Gk|} z5|yw%b+@@rI=XiX_IDEq`=6EX$KJjYc|*C!*CcX0_yHOL5UywPK4I-ZkjZk@jq>U% zHEAC`DfNXp#TUM=@ri2(@*^wyI05pPDge+8_kStO2v&F=1UjSb0AoMJf1d&duW+bB z6rMllFUdv2*xqGD+!B1`5pXktvZO{vlRJx~12Erw5|DZHETB5DuT3a}Oj`N=O+s4# zR}x|y9P!JWD)L>1V0iZ@FvU6wCLS|02SZV^|NQoxaF9{9ed#b>P{L0G3Xs0va)Iiv$ly9nURRM)zw?)T6h;-bSPXnLOey64Y3Ao0TO+sdvf)cLx z?`z{6N@o3yKoE=ieTHWzG*~s*DIaw|dqHHNWv!$&) z@iwI!?7>56w5mQnz>CLxVyOblhVEQKSgEyTD(tDX1=;MZL@Tp`!sc)!<46!E8Kf4p z)ydI9m`i@wSu}I%)x;p7|NJohp@b4e>Fc$&}5 z&Y04Kw1@CV11?okj6^Lwxk8Mb2?##AT)u3kT&Mk-%cprjUS1#dydR%`gk+ zJ%0XF3_YtB)z!9u*dm^n8+RSJ&U#&uT>tw5rwrckR6|p}&Mb%O=n$AUd){u&@qdDs z_w@nQcqv^7w*Mc-GsxXcqCE~edg>6TgK&kcYw^$BQda1|^Y{K!e#T-a|4RYMH&yAZ z>bK_PQT4Eqpz3x-p{ldL%=ezqe98XK`TB{IgW4sqc!Q8;4{K;>fYmB0D&oD@yZebf z;jrGF{1Gv+6WIT*BlJt9$9_tjV;xK2c-x=Eh5LU0hiKMaxcZBCdSiWQbF;*mTWeMHs-mE&HupRqVdGo%tMwp8k3*i4bj--VSosX7 zlSni<T6d zRx8kvc?CJurx8`L9ek!!k+?d}Q>ti9t*pMzUfSPveJViu;z#-dU40yrg=jJQ1y}0A z?A-Vy&snn&G6~gjajZPCR@r=){38UuW zweY`^EznOS?pwE-OBMMysWk8H)PI_(UBxclsUT$GvoAHk>Pjgw4OJ)B+s!DdBs402*V?+&Zm+^3 zUEIe$Otiyz+seiu8?CyozBoOVff8)xT97AFl1&wUtVt&;>ow4_?+)yFfR+KtAF%n;naL+E9kL0f zB0)WTe(=^sXB~&vT65_mqn&1JC@mw;20bVZN~m!HUN6Yx=2u(KX)j}qyY&8`l*_in1S$l#I)bO-y6t_Rl&3Ter^ zxF+9le!cKjl=o^)JJ^+*)s&o?m?9dV8lN6*Zn5HP21T7SFqLIKn=WQ6#!8v*PBzpu z?DAtu-_}>Wz*0oT&ovmP3cg~}LIf;C!%=a<$%X3ka+5GN6 z8RYb$yW0Rio`lS@$O2$;GQDsoupA`MUtcGOndp<`y_VAQtJx2`sv7!pw#5#Q^#I2O zR9Xt=Yw$gLWO{-sKb+rVqj|SX7_D1zV8i7c&*xo_f8ta4 z4&r`Rtg^S)(Nd_8b1M(`-+n7@VGqDVX zcm5gXU4rthx?4mfFOE=`mW$vFGm}c%IqTYobIVO-)VBAl@r2|FOGMlUk(V7@`VjQYfHZaIGv{rla~L1qRdoR(Xs^f;#OTz6+#~ z1}`kWoN)P4Uw=aS1;@w=?8l%iW6S3WxUV+(7K`79&?>n?pM^PxF*+u<`996kj(z*ggtZdfha3WXz?Q%)b+t!nYyxZaB#)ITH* zU#f{bUyqZ?A2bztDpK=~EvNEv7DF!_f<<~Mw)_cbF!>ONACYj)y@#l!pn)((syF%G z9_3B@Jw;S}_h-^1oy{x`&vWbusxOt&zuXGcf&zE1RK^u|()>j7BezezBq)sk*p#CT zQLSIRn+>CDza5?GKFlBqU+aYxydg8(GP=aCdHL_~sd2X0<3S7q61}sfQp1+C6d{RRgFM( zz++>!(f(@Ir;v)LFD2u~#MKiXNs_OE3i&48tI}7ncffNNItEt0TeyCWS;skkVqpDo zb~Mq#)uElF^69}nV);*z-&=&eDT|w%!HP*c5&5PQPmkDAOp=DBeSs1d%Vb8Oj-=Da z!6N9XPYeIt5)4bOOvnT7D!AFgkhLV0sI)c~yv?av+BiTgL1BUW)7>HQmwEBmX3+DENs7tH(Se&3CoA*e-xt#pJDUBd@pZ8 z21em3SGXsyFrJLPT>2ZHupISJ;jYxm5pld={j*S!H!p8yT02AU3$N>dJP;!wap^d< zQ#m+MQ7I*PHQ?;N;C|E$amJi?j`?nG>8I~{y?!Uop7{RGoW>qe4N)Mhla zduu;MlcF9{M0)90(If2i(h)bgJzL+y`T2GK=zVGMy7{>-tW_vbupt8%L*YoBd#gh} zzXW-7yO2pPXd9Izoo5XG!tI(UN`A%L6UgLjW^f&t#+s>_Dd~d_q)EA2!@K5x1WR2{ z6y6+yUA3L_4H1O;@GBvHxy9?K8>{rzY3Xi*(M+~R2w**u*78`uYhY`$=TFspGnuoO zXG^Lg$3X+x*nVf^0w~`fCn9gbu&xhAsEg&&9~<_*DoxDbm$4Vg$58zGsHTb(BxJzO zol0@= zgxEHHJ9`>oRgb!dF_83S(b(Qfnfetnh?u&yOFY^ftl>3v<`OZ%;4qm{NfB9NC_lT|k=Se9s!1H^v7OvG z{#9a-BoOBcD{Z-;K37w-XRg~zFG}W<{3&YSDV; z`))>dA7@26Z#Fc>)E{zjGuMIMY3s|wh4?fQj=Rb+uUOL4+~59z-{^e}3a()1f1zwG z^MCW7fRhr$x?nb|{uXprmT+X75YIDW@nKp%xmsl?kgxP6m~!8nx~SN z`goRrA`xw!+Jkb2^HL+*XX6KY_Uo>#n?5eM0sv?mzWc`OaMltlefiM9!E$5ds_t-p zwlMMs)n9UF8b2&$5DHUNHF10PHfL@4oYRT|hl%NRKZDk6(=9mnJ4 zXOym@>+9=TE5;J7`Z$t8NQ+M4X&9%n(jKlgH! z<*)1w3Vu%a_A9Q1G;oJ$RBY z=-rz_fbxC0eQ(KYXI6Xl%`X~mEzL6%={tK}$y#cvlC$utZP!l0!8}|@K;Tfj<1891 zc*WsjXD2iN?;6Jw?^^uO{;ef1D?N}4++K|srPcg4I1)0fJI)EjNv@_CF^Z2$dGIQK zYIPMJ9vVvWbdQ?b@G7>u-P`eO^iYb^<&)oSXPgiXaop%X5U+?tqdftmZz+~g9^GVI zCGDrZugorj0d$dkN0Tx3dCU+?&`?|YJ`%ukHR5|bo;uW)liw4SF?ZI;yJ>Fr#tPwUOxHXx(9Z+$z= zqNSpYB#r^7`d!`BMvAj5+w9;9>F3~CWH(;ey2A=*6L&)r%j1hza|K7z;|bF6<#RQ5 zPW$A^Y(=O%tYb=Z^<^ioL`UL)@&16_BW7NXh>H5^GTCksaA9uKbXL5u@X&p7JeG(q z{p-l$;D`Jqv5z;@26ARziS@j*Nipv);cFOAdzgO@7b}se^#p!;-^?V)=dPgOsuam3 zD%ybFb`RDZzV&P1!GF2JSH{ZSy8K+1CQg83Dw=`8+*1nnB-^31$U+9mg)nTuHczxj zhZf5@F&zb76i9)e#MG_%Jh8+e=$iIeClscYcHllIBJ%K9lWQtlOHKwX6zpz}dm;-; zOTL;f+fwc zZ$T~ysL#0?ThiLn__+V?-#Qr*8Ssuhl~+iQW+c}OU!LAS(9CJ2cbRvqWy@T4)VsQS z=na#8)K!xm(9sEhJZITHf3eMidO7X5nwAOyd=j8H)!k3ZMPlnt>H5hBmO=;z7{bgE(Hy7^azgO^{rTvZo*A={>B7^{jK7Tb^Z;FgsAEN#mp%@3ZdfX)7 z>v6tz3(lhw55X>bipYp7MF$qI2T&rF7Uk63(8K5Y`m~_VwL=zkdn9Fk>2;DR*ji(s zIx5#YPEAMi=|?}3C`yx8T2l-dm3R8rQrdTTTv~O6dh;L4L2tR_jNr|cH5PEm5&FsC z+mv)tcUZ6X9wZR*K+3{vFtPa63Cv31k^L=LB)@7{e+Lvzd{H+wr3W4R<}-@@iJZn| zvtnaD*na0%b`<+F@z^#4)NfJ~G?U!!*! zVSvu$s*jGJJFR3}1DX|oz4uWOTvutay_>aY%=jy^zl_Ir?y;SlryloWN(l%|F+A!u zEzio%h5#{NRs}q*R8Rl)6_+SJQA7J#(affFqd5RPAd_r58%?yMHm1{Xwkw~BdbQ&` zcC?LIJcUlFTbX$$0*NnC=Co&ikO_#*aziGn^XcC!MhWk zoSevhzo`W!sl{sBh(9(<4-_zZl9HYnbQiypgHvMX-O0I7$u^ zP$xF??LB${i5xbFex2lj@$p6?Qtmy;vg04sn+3z!_xvS%X>%~+3s~1j-NC4QEMH}%e&+AcWz3W@?pENfT`<8j{$0m#@V8!Dx{mGG^A}hxMe^sn zs4E5x0a;#BSrMze8*UZx^(>Ye94_^}-+yLiQkOr7+}^*pec(>m5#l(*dqV$0m z1ZwAl=?hUeI7XhxL;}9rUncY|uWR49nn^|Qwo82phc6Yp=H`yzeuCg_lbZScRw;Pr zn?Bc;G5NaVPQ;AmNZK=N>!0hQQV5>xTl<6tpD$_@TbmBKoh}(0P|p^5c%$ZSA~Tii zcLYG|dFfzhU!;s39kMzzs1&Cve@!>)I7o|6gpq2UrtP*EJeMKm|dH zbclk2D7_;kC;|df1eH#ZUZocy5Co<7E*+&8=~ARu>C(HD(0dU`B#?XXeZT*^&wsCv zhH(-yGiT16v)9^duTydV35}&i)v+_%Gt!`^FC#aK#)s>ubLP9l`5j+|0_KZg)?fe- zOg~b>z0aDZQx#=9ricjZ55G;?mTNq_dM~`CA#0rcVseF8!|B!qS-72>7?Ugb;15Mv z*=g{>wD#nrr1lWsm6=aG`SYuVSk`9tl>`pJWI@jBp39^b=L)FMSb~D$6B0>24oGw6 zu3t!bi|o{cgdVxtS0s1p`g8tEk5~&DI3Q=;Gozy0)1}eIiBKE#x*FlD4a8vMpB zj5@ZWV`4f&{CiIiEgE}ZHxTOHQ8s{}0!R5;oI4U?7s%*wj}fBAeY>q;Hsmkf6N2{J z%#a#46<1vzBoT8a)AUFtS~c!3sF91A|HmoGq>@MNcS*p;-&VWTV3=B6l$DjSOlZ(| z{d*#gkMzG|S=-rHP7hKG5&wv&DdV+tpJB=XVYZig`401zkY67^Ws9YLdlQ$$Eb)VB z+efzfX!mSM#AcJQmhRvqxmI(=&2MIIlRII8%Iu$$8B{I5OciwldK^QW@)-Ew@NO%>M3K7wn=;wUPIVl7*jVx&7o0lb|v~Uw;@) zd5lpgXn9KRp2FuN2hy=Pp_#{Uj{l^LSXiN&zdQCL*=5BY-dD`gA zjORm&-5WnQoZl1Kg z78hOt7UsE?tE+gLx#{majXy1T2kzfq^Gr8^FnhekXVyR0YDQerNhbO1Z*_DK-#w$q zA>}bQvFnPphY`HT)*LR{w7+=nzuT@fXn&XN zF@z988hnKbW_x#A2!1~h_YrML++s2qkU4>}eBoHi%HCEvWzbv4s_r8&e}{GWQhd*I zDZW>ZAO!#eR`h^yQ!tL^^5?-@ofM?J%}XhoDU4e^lOclk7bK(JC5Z;<(MkvS8JzZ_ z`SZa9@W8#c+=)#V>X@M(a|e8|fkS-wAwbW-S;oBjkObA9sbo5#MR)iwQUA zoEmzdMi(_)NHz~XTSs%>8j6P!F9R5yTtvOMivk+r**1b-esR z*g12yv+y+Hlgi|8SYKW)1l?gCBG#yh0VSo?E7j9<_L&o{ia)KOQNFfD}?@e3UpT96!*cJ76IzCDC-itt6d=iI+}qc&H~X*HAvIkjX8xwCwn_87Iw>)9G~&8`hG-%OF0<@+< zH3P_(JDlQixk`u%qw%{~A>0)KJ}~=PUmm5`v_3WPyERgQI*>$y4HS&-?usW9?$%Mm z1rE#|j@#FU1=j2lGOC*9N+zLq4}O-hu6tD9oLiG*QY-bk^)ludeWJy;Terepf`SgDG>*&#la0Q9!pzxYTW0UoND#&7jmv zT4?B@Gy@L`H|F~xZ?_d6a>|`MR;Z~Yd@Id!O#uY9I$UISDKf@)p1jia_xV3{_Mk$4 zz^vA`@F;o}6q$Qf$ViV5y9s{m8K!e@P!mYoAR)0O7yarkx7(UC_Y zc5g>E?S6k@7QjAFieHu=_A^$Uw((;hpNn#+5$9Kl=UKbD0z3;aKBos{_u(5jcyP&( zl|%{;dzh>Jw!CKlg1+1Cm`2no&P?%;3_Fhp3iW%KkRtPi*sm=_^%2Miy?ZDenF45H zkDDtmG4{jOgsjEZ;zT3T#c538MBhT2Z}v(&%8Up{JUu^JXCG~(9FB`bqn!|SJAESd z+6~sT-@!n{ENxCRBNbE-Q#w7_#fO|q1hx3iB*|}n8kI@Qk7T@lZ;?uLLG&>iX?p!8 zsARwKa=GRDZR8r4%CGnD-FG>p1AZmIgJHZS#FDvx46q;G>sveuZb_-)enDuDRrS)^ z7jR7l7CItGoyrDxCpMF}0Y8rRu;!bO9j*xkONT#~f z9gudlS;f)y?8D6csh67%A{qnNP9+0OLlPESKM@;rrElSLaKiRpUkm{Uh$bIs^uGdp za5B(2-9Wh@cIJ_7!B^uVi*@&FwIB;6IMGkK-V*o_@$Omp;6#WU-ohNspYGgTa)Boo ze>L%>K?j%VNvxZAq_6gC$)<89QCTjPR7_0FUX~X3V3utZTT4Fis7JF7`{6J_DlcA# zF;;abBy^s#k{{YzOhB^bauAeRz8{S97AQFngEcS$eF&1KlOLX#2i zg!>l*E1sZ@ljd1gKCYN8lgOoni82Z4H;WLeUy!fH9QMYh6HDCM>+Lst%;+GTq$IV5 zdA0REZ7_XNQa@GbZ{9kmbfX+|IAQCTbkWyy*h`f@I7lYEcGy^Qky2{$QIFk_yexYy zCR+7s+p=a_!MktwR-nl%d)4CBuk20n4ppDE4fSnl!ZQ1l);ek|`c*b==FAr!)R)QP_LTd3XfH?IM6j4Uj*VBo5UyC?G3{prTxs z0m&2|HHfcUPOVT@#K@oS5qzr@I=?7j3RN9rZOvMq5ZvZqbQdNA4Jf|ho8p7n-p;dx;e(>ujo!??&e zhPWtt`9f;=@peKpicf#Ov~~d$?q`5{R(6%wlGJ8_*szgVs&7i&e^~697Fx`VS4U0V zChG=Yt*0Dx<9jI=9VscAqvioObP?Pkbm=0{J&qsYHSDl*2Odk{zXc%!#RgQkB>Qnp zu~r{x4I3ci_>P1P*9KD6j=yKex-Hd@%w~;cn>>zrR>AG`?-11cJ9Fj_7eZBCmp8T6 zs)0%zvVe|=bMxiFJ=n(__U?C?Vzw?Y){GoB7r5YIGL-KAg2 z`dW)>=q`cP%lFZTYC3;s{e_jMvoPllp6~2-WgKHF#X3?3x5hMMJO|Gk?HpAb*JeEj zFy054N2lL*8h1M2ZW9RRbpG5)uA5h6+3s9rxS70Op5P>msGMK#Pn}5^Jtlw{I=m$m zO*p&poON_!>RiyMZ{2dW>*uJ)bjveiHetqormYXOhW7VuJ3ngM*Opu>p-U%iDlUXp z4^}Vv`R!=M9!`xs$MX?@WK55cve65amGQov_qYe@RMt;UFmEbdj*0*MN^U0J$_j#2 zP=IcN zgjk?-V*KinJQ>WE&>K2-Yy)KFA;%CO0pv&B+_t4wlFFGgw7h*5IR%-= z4@s4lC;nf&&B=_yt|!?DNa;&ier)&qJr|C5xu5h00|&KAjBRIbuN|$;G4US0@^f_KHdsdr8=rj=U!%?Z8#PSh>oVv(om0l7#ur2J?wiDPWtNg>%~S4pL=#W z<(ooK-f+9z(%po*y%#EmKmE6xk-v?-4l`nQ5Fww2O%+?DP} zmre*j?P;sP|E_mj+(4V&qk4cif$6@|m97$7Slm48ix{*a)?yoC^m{aiojqrVGpnso z5{b?lVWUv&CNOB}3tL+*N8stVAE7;pwz8IPy^RvMcz*CHpZ|?g%I2%ucJ#i{6--4x zy1ty9mY3VsV)bWsy!WU+35+)X&1Fvl^@rJyUkig`O3p^uOz0q55X0Ck{ zvdH^)YdGAE2+F}1_)S-+N~yY9I#6tK*BS0H`xNzNzWf0Cub20mH`EUwE=NUl8?}s% zj^5h%U@IVn8d=`zARTtIqX@8A3t<{P)(CBdLNX_c{CHHtaLc`iaYya`qbF%z`ajbQXrqqU$2BNpZeo<(jPA^< z+@m6HF)E=DbnTwq%cyCYy*{^CMoO+X2?07QpxRtl9nZcj8>ztg^8A#~2m%QHlD z=JrhB`-tx)Y$ekVvOBv})o!1-CNzB2KVCfTFbkOGUT@eWdq}U6CQzww;R^maR*sAO zaUIaYJe;E0K@<;=L8Qcoi))KuL7%~mwM%mJTm9>{)E*S+KKz$PV3+9WxiL6M2Tjfn zEr~z1ym^I7^W2()v#{=%GA2f444*;NxME^u1G;`xL!_7H?bov4RCsF#k+VL&KMI4L zu&U$e(hvMlF@!$}noR}SC&Yh<7t1+0HjMf-+22T74&UhT83@8l)ey;W+a&z6q+4UL zM)c~781_%!V&H*%EVT53fFW2mhj$Bh*+=)iR%yUD2!yRJ%bB~G=Q!KCmA0&BsoU3- z&(vG2ol$BBJXH#X9U>ggV|Iy!X|rFoj3YbEvCsEE$=hEgg)GCOM78EVI%_;1vB#n@#&UZfVW%R{nx~P_^ii*nfKKspoM?R=+5kY~&Qa6i` zu`00L+dU^rCXblB!?m@53r$N)E9q7ho5n!q+o(%wh|mNfCeWcTajs2>4J(9^-}4?r z#9u_!U-{^uAkXv`v-W$!v71l@co#ZUHDvJS?kmPy^T%uSoDb8uXP95e)$1d_JsGYk z<7GaZ6EOK5K@M`{rwfT*l}ABY;g)(jMN3u)p+@xwv4w4#|cqO0bhrDs&}dv{mVv{kL{Xny7lXQ&`+K}E*qI#KXPt2 z|53>ac~SL3o=GLMs_J#8s8_}nHb*_Y#^m~RlN5N`FwEKAL$Bjo5dXRMPA=vt3RE(50Tb+dSw$Mmi~$$4-m6w?W!h^2FZ%W@+?FI z1SoqaIAd%qQZh zwDQmz8M85qBFHVjy%C)DO2-h16FRnhAtK37)YS_O_TxEVAoh9B#U(9A!qN>dT|b?y z`Ry0CN4MW9^VJW^(a*)*nV(?r6vgSip{b{2g3s3n_JHDMTuuh0si3I+N0*tg_C-|S zf$2PqV9p&Y`YtG}BSBUc;^XH@W^@qC06~v8fz74jaoA!CN<1Cq$K+Sj>C6>b;CRli z8vX!&au&f0cRiOE!>z0 z=%f01cpk#g-5a3#fUQ%Q4o27d-Jf3Q#uhY?>}N^SZ>qwh50syc0?elMx1EVgdJjiCUyqrRf1gDwAUGwCOzfalxlz99{%wiwUus0=clHdIPZE(IYadC#JsVUy%{?^mC zfkF?)VKUol_^*+s78B*ZE9mz_JSHj`1qF(luU}_tIQcGZrN18ytK8fSJi^25!J-k_ zTS%e(m*+%_D?Rl*rH(5!1&AuSJ1JW*J%qIPd2K89z~Ys~!HuIXR9|+l)+-4nC%oI}XTU6M3kl7m zyNy-5r$3t~>-vL9E*w91P)6y=`b{-a>|wF)Vjn8q%_;&Wi9jUHY{6#1#g`C4WNiAL z-8b&V39FJ*ga(F%*6WUk^3n6TY`%)^_r$_GOj-KV`R%&%mI^tjRo+g(A)$M30H z9jkJ&n)0#;Kh4L1u!^;xMxv;2-swrihi$y|tx=tJd%>gcB**@n= zZ;_Qp@;Zo;rrXFT99N}I_%0rhhy7hUAW<$h2XlAJ8syH=;cowtH)fnIL1lsx-)?j2 z?`qn3NROW-<*@QopMJyGcu7eIqxiUy!6r=YppSe^UE?jIOj&VUvVcmzwir#HaKN#} zdO!u~BF}@4kL`EYdeKp+kk8MqYjVFcIBaf{I^MGx6YD@ZIy!!YM6^8D!L<(rfIyWx zT~{yh1BeR|7d;KuKkPgYCgz0FyK?(DT$N&cWAM<1U!PFwpEwTqN1QM;)HQ zoZNj7pS;zGe#wPcTSZFHT)qBp6^&WF+cX(-?Ek@Omj|r_ zZsR<_@vax&GCZs3&3xc|Xi2JSI4J)9G_xaTWMuSfZ4eE7bT;Vf1qE+`P;IPv&BGHj zX-3c_4Q_84wdJA z9ugc}U;Xc%@35ZC4b?b#n%~Y>g9CR#}ZbOgFYXkmNbI+lsRgCX!f%rm9HHmt2VM zh+Mx8@mV|m>+{`vdIaSJ!0sZB(#O~Liiw$7t5KODC<4=}s~qjx1tm1MXlRJO4h8Dk zos$QHt2#T~JH>SD%s0V73oPr`RZ;=pJBW`1s`L6;SJa;@06!w}g|r^yLKhwdrb6g?Gbdz0 zw7-k@;^$$<01pgDs8=UQWpRRi?>#qhJOPJBJ{m7GMs}1LH%el#ScX!sGuI-mvesO1 z;i%*n)Gv~SSs%v=-dtP)!p6$A)Yx_&wVln))*1&Cg7M26&^hk>Y4+NQ z>q)r-I0Z@0 z{3}z;H?e#QWqCyjWUX9ucCxyfuxKNrjFgr8rB|lR5Pz{dGu5p3@5|Ubx6R>eI%dpN z+nv7eNB==f8?F&cuOj^7qVXeKrPy76UGFGN+r@4YdmWO!V_cuAUYVc{k#)E@@j9Jb zdrcpxUttzzBg9#I#5>!toV{z;7_N}=xDelV2?TlnStFq2l;;O-1Hj1Uwk9+?B%{ZU zMl4UJ!p>`Y>Q#w|Stzt-<7ZcsaI(>_@v(>xwDXpgR#TA!3-$!9S-?^kvn4D<4nMIo;)tAncdA4 zG60oQU7*i6n;06@!8!A7`NVZFj1CvtBD0wKfg!8sbtgK_Q&%uI=}Q36YzDP2X`Z_W z4p)|s|6SgV?#S`Nk!0KzvvYrl0gfjdUYw@W&KK}uDjyLl}gN$P`4 z0psxp2B9nm2==tOL!g`%jDJ~KSBs0Ses^jz()bb63>Yo7cemE=OjXFsGd~GBEfjlO zrl^QUTMhNCL7D|u{EwBx)<%{nDezSYVGc`I%gcS!g@)`8Q(9=#C%+xF5|@zjp}hAu zn=#YyP{NCr?X3x?21!eN{4^izQJ6}o!VM|a7jByJzLOUT6aC(%yWOl!CWtyL(12q4 z;;+PdE_it%zOFkHstk`!OyuShsW7sF&abPXewBzZ?{v@A6Or=Bp)rO{*>~k{DbePK7$IvNsy-$NI64k(hg_Zr zN0-I^A@vc3vmo6dI?Q&mtm%T%+z{TRn61>g)X$elTSlEX)?Hf4vFlouyhz6Bm0RW# z89mVb8htEs)TylO^SPJT@o<~?+`D@Ld<-GHfq(cIQ4v=fhnXU^hMCb|NWQi~Pvrv- ze8}8;>$G`A_9;<`Nbc&hB15_KH^eZr`2svCp37K^VXIbcloD~ ztJY*>3VD%M1Q%^RtNS8yi^tgwe%^V&*a3EHl)$2vSJO zT04+sL$=HD2Wt|LlZzrs+pu?sE^XDTMtRdYrcCx1CfO$|l1YLFu(lQj}IZu{i zdDNRQ(99zIeDL?&{QOS`Jvm(s)I=5uxRa+RCq@(8^Fnvk=R6+4R2J+Asjm~T{{HT4 zng7e0y(`%B0E)!kjpybvMFeA8TNzA2Q6yn)Z3P}AfOO}S4&TzE1`^Ol8qz@$(gEC# zucFr>kgM#B1z&;&@tQM^5;npdSrx~7s)=IA_rNAE-G7OJU7ICYQ;Q?XG(6eHEuy*R z+~MU}Z+@ePFK{mB84P(u?;7nl>9UQ%^N1Wwn+rC+VHCua+*Cg7r5=#?%7Eh=9ZEhN zhrAg4`joER|GtQuFe%eCS;drZ^1FwvLtg{DQcAQqIE?MLiaT1*B4Dc{4d$lG?QxH| z9&mC}olMyX-($<0_7MlpRh0~Re8jBrQR!$8xUtm zadB~ZjDoTF1%RN~#f}2f@ZB?d6{^Ja^?Yy~^cM7})cI*JxBcS0bPB zgF9;>wMIHQrbFK}dha(`+ux|X?PI-bshc{||4?N8uRT74##yxi1-3$<7wiE** zga+@GU!Bh%+7^F~fmHHdJXjIn!;^7?Je!+yP3)&$ULEKJo#SoUJ$%~Wbh#8@2)ftS z_j$s&Gn5YaUWj^Q8A6$o2}17E37G%((co$L*r|=ZmsAr^owYK*eoAUmgSkzFL6|>) ztiD{}(fZ?Qqqo=6b4udAcvmc4yyo-{wd$gi8OdWDvHxUZ5YZ`fdoPEVw2Qkj?`s0= zmGat-j`En6FhG?_Z&{pVy*vZtc>xzu$gr+B&;r zq-}cj*2~69ez_!`vkQ4V=r3Wd9lIti9il!3?d&PtP^eg=J2j(2D0mjTltpgiL4Z3l z=XS#5w-8`nLfI(+k>X(ZOkf6BhL&?% zX%L$IijJ?QkwYEPT>U>M39s`tP*5Ztp0`5qkBLMY-=C7COJ{B>42dATV^D1*$abxw zxt*V$(om2sqxN&UMMXirtiYJ*r^KclIOWgsb2Y7FkZOJW zuY6C&uZ2=UA>kVs7iVHCmO&&opZ4+&03sv9s5WJg&giDpK>E*HkCHBQ&WSP>!2B$Z zzLJr(ESE0lQ_sy&J5)G&?Lk`KzdIn<^;Z=3<;9U&b8mqwrD75G>bs?d_=0D~1|IWX z27nqb4wV+-eW&*fInM4mu zcQip0TZxJu9U98GsBJGUX>y+W^!B#p-1H$o92~q&efx|2V)$1;Pvmtj)F@sr*uB74 z{Jq%bW^QV_*hW?r)&U4ik{54aVC?sT{>c>A{*C&5`UGn4$zKN}P+yQ9lb}?WT1z#| zu;^PV3ycwA$6wbd4vkuV^t$u;p(PThhy~J5bd~J0H{(P%h>Qj4hsMX(1y+)OnpI?e zmC;@I?2I63Dk<^Y7oArLiEmCFjvZAuHPOQ#aHq)0*LYif`c-Mkrz4_VE~#nM`=$>} z16AndO$s3?zWvLk>nhePa-?h$l{WG%xw;t zWIGkbw7fr)UHfr#bL$E3NEQ7{`XJLoyMMlQ3(;SGx})3w1W6zr2K({0uPJF?Vbt53 zV;;`?LfW&49}*Z5(RDnb8r5H}lwT~n$QrSbZ0Aoe!PO$##Dnlj|0^|(Zdt}>p%6EB zP_(i{f6mEqO7!Sr;@$myGdA8=fPRsB>bfv=@HA==51SaG&YBS)B}f|;nx!m+tN5G} zT2c8&)A-q2A&aB#=IYVw(V;1efhNn9^e)NDe%LKVCFF`B_GOEvV%Ht&DS3|toiBXA z0uJ!H&Bw=gv%kNgJv-Z0MLsQYv1xX`+SZL@`4-Qk2I&jAgY5U$n8daV7EReJx^H7z zW%R#><4{fKFV#pz)jCxVE~@!sfqoQj`cZh~%P|zaQ)5&jzbVf|?ppS`xwk&j$E-_ZbzH zpjE*sJRnf9R(_rSPk! z+$tK1KEHn(0H|$ZPy_K)48Ck~2N}tINl(|WU%y&D!wd(pM_mpC&7axR(R|bBi$gqx z`wjU2u7UiO!iU3yXZY#X78Vf8kA$R+$CcN8tf8=w7dtAfi58>n{)JY(9uR5NOGy0@ zJ4##-BMB6q{J(>H{<=~jk1!(;AGWlT@&8B+9FEFxix?U-=T)Un-A@NMK^A|$!dygM zo&QSC$MJ%#Z@nESn^v*PsW-Y5ys3W$QJNFXEHS%hp(|9{@8HSj9atj0K|V-@vFgvz zyXr1>RIcECmyFO%_52l75StVcB#WE{{{#XoY(GP!)h(>cl#}O$C$B}}S^K!@Et2@e zPz~!`N(wH5Z$G+(_kGDCWYX@&x1M1zA`3mYX());rIuskTOC#z?nN*JfOtC*#L_&s zwI3*?lsZS{z&OO<`7)Xz&u)bwRJQZR7^OJ=BOS=;pb>v46d?akC~(PakwO>5@3r3r zxc-(a86zZ|>FiNB6N>3=xCQmEa3=9mKz^kE@C4Vtx4r$!xo62%@hqDo|6I%!dG_V= zAYLO!Nf38PYgQNH2tW9j4eAAr_C*QfKF2J>F~7B3rDBpVbFkszxT8SZ(N0wwR?1h^TH z$R>1o_v{}DMSA+%6RCDg1_4YY-kk!>EcyUNq$=$>{NxH{y3YiI-f-*p@1)BsD_O{|TM-1$)r=uG!R-Ig2Txi9G zm5y4TCGd#+T!Ii-=YIP}3PZP$K_GCi`$5cjtpFgzz+8v#|dAXG5wBh%uz-+`V_ICay47{11JG;3syRt8>A#E!L^(SOnAO= zxI(DSTW7fK?CScZmJZadEKk=GJ$2J3occc=Z5&Y^jr>iih^dJY<_}m9`Tq zCPkO53s|r(#s5Dn*ju1{i0Oual@E`tolu=&qT9JgGJ>EA!RI^hgnOjB)B;p5QmhrJ zsTV|1v8w?genSM04Xl(nE2cP?i}29yDsyv)tZ6jbz27wsER2APAO-RTz-(bInXNUz zYzYH;$~wr3Me0rA)1dfPfZ2&}M#gu_Cge|0lpEF$WmH1^gyFrxwSq6b31RDN?lY;EI zZIjk;XV+rsnP}ejw#_0LZO_ui?c+4OV>(rEiJzuyPNw8+p4(20kGI+g3rLwZPCl7) znb2>AX8b-tzsUS(17wM*7qze5t=YWwp+tZ-2V+GJ8trWBExZw- zJqf&<1Xwu1ICv@|g(porI$lnzUfBKuJW-k?ygmYb2l%R zwi)q(zr-PGcv6qAK(cZpH2AkP!BQ}!0d2XtAd&si>zTOgHY6jB-01>~xqCc*$@OzA ziEVreswPM#*PM>g2nihk&3bVUB&MlC>5<^3Bnp^^^IC9!zZ*AhAccxxoHwVq@>wD> zS)2jj9eLXw@>yq%sL}{QDWmMH(3awAYGNc9T{3Dh6n$pI9-cFN#+@dMCDqk)dsMdh zs3g9PM;(qzKuva-9lo(RA5YYw*%SDvYH<+5C#B!`Cja1E3|0jL zZ9uc@lZ9yv>%3Ys$2>aDj0e$1fh%~Qd9bm)-5$j%e~ESbQr=63Lve%8m$4 zx;XX9uY#w6k`|)o8bH&mJr(d-96wR4k(jb57xDd!SfCQSs!?vMki!h=26gW;Z{KE? z&Y4w!ZI@|R)o7K`c<^WUMSXZK+W;%;95;|CjBijcQ0;FPmh_Q9IuW`k*Auy<3wQx)dD zJvsOHQSz2!WA2HiBUX`hwTE6X(5e>L&evgDRw1TV;x`+p$0MdbXJ(l2EIpLOH*n7*u*8V` zoyB|YO_)+IsO;JbW}uo;mkLfRetUyA@fH)gj^YR#eyQ0Pm$HZjhPHU$E1ggRAb+4i zeKS3bLyJp_AGE8cMHbh?oz%oel>i}eVfh&W2P-TI+e|j2zsB;6+n?5D8)1jKPCpaK z)BDQ=oDj#5g)=kJKZ^$ow)`3zVhhDU5bBTli3bdM4gU+Y?JX_se@IGcR3>mj9NBxj zNUgd$j9U6shgSAe8<~1&pV`{-uTs;XMwNIn9jI|pC>WEf)49 zYiN%7XiU1iJooR_U5o}ln#ZV+k-3tv9OzI+M;0Ldqi%3LXYEVy!hQAmr=^fPepJ%@ znOJX8^y06)TJQuAXHT8NZlGIPMIF8ZJbtZW;S!lgrb&^q#Spl9R^JMZ&01v!O{}d= z`RNcW@Du^-fW7ksxSQ76>Z5c#{@{B zG}rvE zQ*9M=dANPz?c8!IBhKi$jox$bu;>H*^1%<*>u_&L=Vb3qmU*i~)QwGJayzVPeJQi) zE{S(=+1$H;C=|HnU+TQC@Z7M~+(uXeA;y&V?@QmV%hM}(cQ}&O)Jxb*Lukn{gC*@e z4>{FCJL^FS>!_C}HLlu*3t~7IvQ@gf=mNwH=JWM#5iGiosSj|jHc!=G6f7O9hVsHU zfIjSBn_J&@2z6TRyKW^UB{uM`y6u|J$Xd(iE;!DxwV#9t?s3lApWu!A`T_b%>JEzo z>KXlAX=d--{0+tzZnJo(-MLaNBfd_HKU2^^uT{tO%%*H%Ag|@^v}hmA*8q$D(TtY0 z^~2+;qaOkxx61Ib{NqetoMS5oEl=-5UAP?sDAGwfaJpB?PTTqBy&OP&BQ8F{{nxVu5E?vUhb__q5nyA-A7>5#p z)jwmoHbu-FE*Z(3 zg8}k;yAk&1(d{mu(9Wyra?i1kfBmt^?v$U-P%!U}k_!x_fz+d-13nCKN6*Mz>JEC@ z!y?`1eCFPfSwm8mQ->~v;)g+5`15UI+?gHJDEYKOJVbA9EWd8OvSkyRJVl2N*@fR2 zuGqh*K$&eBRZ~w5BHsWW*H>1gJhAu8mJTmLDU)}enB^7AtZn{_{X?;Uw(!-}Ur(~g z6&2|4e@NEUqD;s+6;3%_b(W}x6sI2J&oDoPu3z>mc8;VD6{VE#+8ny(cY=C}9>;@Q zRQ0$3prihk&Io9y1WPFF3xXRcs)U59GSg@v*G5Ve6yFv1^!9dCg9QsNks#R?BgC+z z>G@|0?cz7-Ab}JBm!zdI7e!l-KajUN=>o#@$Jj6i5mJV9l1QSq%l{&nARWz)$!QO$ z4K%%l1ug1bw%%-mgun2$*C6H3_2`jbw~6nRjht<<-PiA6Ez^GXE+C~*P43K913vf= zNQq|IW0FGW$ElH7rPb952POPc4$S|fPVavr#@pFchf$2VHF_nMaLEaxrl#i8*Y^Ur z=Ge?PGCk7#_UHN#9HY$%RsQ~iAwuHt+NJD3oxKK$^Ja4JMHKO(Uu^Xc40Mhc>;A9O z;6?)+h+1$PPrV(Rb<>?5aBzGOx=)b*<#}x}7Zckb!v2Md(bMJ4fW9~v=b|;RRhNHDIup zzp0w40Y{+c%aE{;e8kRW#=q*RICRBU%mh1ig@O<2s0(gyIxIdyt^D2GV_Dsejg7qG z;@5K}_mJNqKubZ;DopAVam4U03eVyY;2AIyNI|r?9G>%%_V?^L)D6Ac!-w4KB)VOu zz=r%zhjiZ0rOjaxbIq%so|>m}Bm%mo|7Zbx1-^~Eb@02aw7_UTGSS$SS!HZlhIbPY_ss>P|Qg}Zc5R@IH4|{o^pz-hgNpgvPuV{r;JY^`i zy_DADov|kxCHA0WF-wF?-+t^;TtJRF4y_Q`+L7RGSFpH1d3kvT4>xx_Q&yIJC$p>9 zl582 zZ(Ujm$3hboRn#7qQG(<=!U6SF7T~a!8M~(9o(cZj@Y!n^`N)>o1Z!a0c;Q17vIrW>KEA(A{NpTq2C4w~4LVwJ!#bYU}Z|7_9jdOPK z;ssz1VLSZkZ(b4*bRyVt7N|y6)i z=7F~4v;08JcX1jI(4%0=5=82i_fAdbXW`*f2#oN_szYH=Q7g^N5X(ggcz?-7fdO>1hGv?dB+1c3_`%Gn;KiCJf;RUpP z04xU;HT8{^>`ZjF5#Tn{1lAz?k~Tu@@*eZut6DFfi)40foOm*S$ZEgDrIm?-uP@)? zN~5MqTFb0}NtowdzJWmE8F#c;IXODEs*Kz*a{$ZXx^HBkN3+P^)nW53FXxBQoYUXW zG;E(?e!om!qsJ}VWywo>X{!3Qs3`P+<4|*MAYe;DxT}Ye(!qJjwh3`80XYs0yvGA0JhKW11M*=UOInP-Ts_xhXw7h^V$Xsr zh!;h3?!-@)VIDo2V|NKuT!~vsx>V%bT{IDW;#cpg+!_=D%2a*V6dk!|`A4k6(VaJ6 ziy|YUK|{hf6QhksAfLw2R*3u~N*nZB-i!4`r9B_v1RV8g5!Xl`K$t&jvDFJ~U3vU9 z(gS4sdw*Ib!Q_2t+qL-;86QEjvVGc0+Y5D^+HHx*VK`W6iIG}K<~e;hZP|#p4rh*) zUrvqg$s}kVNV*4_pVYxt_(k}hA)*KSe4|e&y%(JmGo1^?_lx-Q6!BM-5o<4~gZX|g zT*+(~69=2n3HV|5t@&I3-d`I#o7m2HhUrT@slhe!GC;%qcudpu(z9hHcJ{>(t9%oU zF{QD|%;5J=A_I3`gXOj_LG2z5x3=#|$>1dx%*txVt!7C)i-dg=xCH};qPpJLHb2AeSk(*wM zs;LR0lPt?V_bz-V9Ug)e`o*02VriM{+MQNTFktIA}s?D>lIvMbP(mR^=8f~qe3 z%A0S_W_aSq@toA(Se}5GA{-_Z=Jz98`}^LJ6L(gv&X5Ike~NjVww)k^nK#Smodcgr z!ygKI^8>FmkV3x0N=QTs52bBdT2R7vUNK}QxbT&2>H@iyBE+B%4KqCx_PN3Vz-3M$ zAr3ghaaFLmhh|)yDBm{%u>_WiW{rch+zf^YXct#m8M-|08pPgy@5ws%&#ji07@~tW zTj}-#2dRT6hFw12`1Fah3iNQ@F)bj&@g52u9x6EUxoF zR4a8Ntt?1G;oWFr;V{ zktUS5o1DEUlR4fp%4ML8#`I{!L&>atnPGbMKhF{xWK<&SFBX?%e**Zq=?{LE~G<2hcl zmIi*-VBiBByGE{2FXM&C%SIRLc1-ymtQEU$^T*-xx*V99JNLczTKg9ZoGbg==tmWrQ2?eE-n}5J zJ~Riv{&kLEWOOvA+9Z;n;(2&WRaF&Bs?4v3J?YnFu9T3IQ97^~yKZVKM3JtO9&{7r z(13qm>4f;w$6TfENGB*Vq!}2Yq6Gjcc(Uz zU`J==bTjiegW^#6>l*njD3vwW`-EOnfjB86BW}9;N_UTe`OB4kaB^F2g?a*sjy)Vu z-nY@5oo8ADqjEB<>1`LD600>CsKdw43yfp$@4paiY2a_83rcX6V^y3n-z%q7ynvJoD^gmTKDti9Fvr?4jF0Kwm4 z(0nEQq`T9kj6587^`2NmR8e~*(X-{!i6(h&2f6f+#A7D#AL{|~QJeL1eQEY+r?j6R zVI4DdZu5IGv64NhKAe_vRvRyyuo$}^dEbyR zp7XyRugnsdw5w%YIhD%2+v{*H>ueStba)D!2)or9SBQnu!moiD&;%)(2I35LOl(s(_DTq+7AS6GApI5DqNK|MhJWh>; z>!PVH;)0#qFUa&$JT(MOgJFQ}6kOT{s7VDYcxHaf;&aWer3K}V=?4GfunD?T20a0T zx|#Sd6wDTeI!5f?e4n>Ln<#>&sJ&$3Oy1^F)1Sf8hCcIdGP}5iZnko8mp5*31l+ii zNU&p(D=8AK(AXY+4r)R(9If_WYyp{|o$LK?Nvulac3*UP`nk2?LXbX$pNpS;4Z!?WLNjG5{v4^YW#b&1PBTJfLSYo&tZcv$LCL zd(9|fGJi-?vlJT0r6x#9dH8{ZB$GWqzolvTpQ;I8YJtU4yq-G912xPsN-6r>>)#r< zskXB5DiB{s5q5n0Qv|cI0=aCSF6Fldz7$7eFb1%?!zba#Ogp@s5xAjOOp{r_hB>$BBb zJN$3Df5g9Z|74eMqjt;8W>)T#P5PJn~jEf?~?_vE{h|IDeX2# zv~9`6r-pPD@C5H;HbDjXme5LQ3^S1vGz0!P=oF^`|APW08!K=X>F z%m6bBa60+WDUX&EYxtSrHA^=B9n3L2Ank|BK#!LZ&Y%><`RujhFNWJ#9*Y+WiA4U? z0YgpxY@YA-qG9aLk`0~#_d5f5l$Qe^RnMd&t(v6fRxw;#*i6AJO4F6+t-)@gUQC9E zzY6zsU=q`;It>!?(jp?)Jl@^2v9Z~)6?=}?Z1*NfF|Chgla7Dg%5Z%`D8Ex601)~> zZ?rCG9W;d(ISw!XCF>`#yq{XQe3u#S)7BEsOh1t2G>N31Z+s2t_ISDX^$iQ{SJxT3 zs8J8J+H* zXvai12RW9?5mo5FDrFA5>^0+&xVw*8#-Cx=rNiQfBPSm%$7TgVFP@ZH?Rf8KUa zyOFIWg0Kt1R_!cWcr4ho-LSf_qJ5X^$x+tj(kTTF+B zJu(qrZ(9y7Qha5N_P*e}uG1B;TWuk|sFTS0HvAAsma zutMdR`K&>)HUD>GSzp}Np49pOl&R(5e84pbvz^55Vw)&XuqU35Q>IscQrq`yGW;D1gq%uPHeGV zyN{Wx7FMQek=4<;Bz6lT;VsW5ulprwKJA}4oEq@0*Y}+NG^#W$`PqyF{MTH6PAh6C!vTN}YhI=$`@1utv&gDWhcK7Q2?zq}&QN%V z=dU`9k08HMU@nf&y;-;9&)~YryMP@*s}>j-t!g=P4E&GUt-l*w{MAThsv~2A--0C zR{i)pI;+d%l+*0-b-INAyZnN|U0q zmPVmPoLFWf3%^%Ja`NW*Czhhyo!uLAkq$|`(zZ4>IS)&wsS!Bzm@aVV01LyK7`k!0 z<;Q@b8}>54EVZ*3SEK-bpnafe4;d!bI-p2 z57KY;U^6P|U#t#J$}%=|R#I+Z4xZ+5mWT*_%bGvn(`SOx;;tAL#No+}fw)f8Qp&g~ z^3F{{Xxz_L+_qeLczyg(pDZbvnJkRfc=$Ylbq=m;bUgRmNRF1-i`{+e@KrTz1CrBaQ4W>ECu}Pt*#UNn!6(si9#1hDnZ=ydm;sEpH zp{;GJqa4MYR`GeJ!iXQ@qqNFTTo1UyQbqO~ntGBEg`;p;L7|3IKp;laD6}9iogSn3 z0L(SKLO&89rJ1;o19M`v{yF+5GWP2S1pZ@TH1F@e;lKW;h}gC>Mlv6^}rN{q^54fKDYw>p#4FJ3ZxpsTpOoE)xI>`dT3 ze7Xfqw-T9iEYd>bZ|E3ijMI!MJ@}3DKLM3fwt}xLTalkH;i)~9qMzn-oNxbi1>Q!g z1T)Ph3k^rd$q!_2lz#@f{dTTD{#nOjMLA6p@7XY^iv@2MAD!Sxv14kF@WRvv1C884vaq zi2a?WZvXxTb;d7<=jUK>>jmGAe1o{Q2j02nHebA3O=-}b%C&{O4g6tvk&MnVD}nct zh-@DTbEYdZ)I{&{cHXue`ZL!AdQ0%dGljFoVIn)@0f0tcRJfbny$X;QfGzy35cIDR z&xghl7xC>a19%DsWIs!+a4oG9osYh?GWnppHf!bcsD1r&fgJyo7&_o(Pw(oZcYzO~ zbQ3U7JX@$iC%@2>C+5{NhhNr~VkjDj? z+9yIG(VF@IOcVbjG;G{?$@Cx5?+?#9*I;$JZolky&ky??97w$4*V%cSf&HNnPp~B3 zV5#<>+-QoJ?fmZRz?xQG8QScq?=t{H6Ud?m%?l78&Cc=%;@y{kcF$7F!=QcP=xIf< zfSb=BR%MnaaA~OpN??=6XnURS*gr~OGoPP+q<|#c0W7=DX_;Eg^0^s;^5!_5SRSUZy~i{(6cTN z==?m+C}kKZL_{$m((_TmfLu5q%f4!n=PY($I1TxzaHf4-c^%NSh#8xj>P5$LRUv06 zZoKg(m`Ay}{R>n9V%UFxs?)*sw*8ZnGP4q3kdvU_%3H~ux$nE%%5^$WTGF_^xvvP! zn3rm%flR5E3^*zcVTn>wQ;)|5JV7r!nW^y#YYJ)(B|<3H@ELC43UD$1`DryX=wKTd z@N{r^O=nNSW~-jkXdKUn(%4tv6R3qbb2Vlt;hPGuce=lBn~l4upFEe`hS~?JPJ=|T z9FdZfm#A}OYG3z4cTngTZK^nebAW)lh9&Sj`swYj!0bs*tW$jD!VT3uaTJLR%qa)K`T`>O)n6a@rAIk~y8 zxqxFaugwxXb#xT9=}V7Z>O{dHAVO7C!K~$W0km?W z66<7zM5_F3ICiezr{)?-RcHpsaRwS9c2VY_Ccz)qhYvDodIB=CvJbwbN!mF(o2c9d zbUEPdtl+c9XOO9~UU^cx`TmNZpR#YpMWOfg!>=y^Lb4j%>G`=ij)OB={*grQGpsdx zkDSNv&Ya(e0d;PFn*p(?C5%j4 zSGNVMs|qf zO^T8MEJs8_)?~RwcM6ey_AJ5XUG#}SfJk;+musGt!7h**Tdo#e zUBBi>_ZwD+FPN?Yo8ZB|RcNb^3+j_svi73RwllEIq2-E_%UT1>XfV*4fRYng?J`k8 z1Rl$?oFvc4i-*?%ftZUF721{b6F8$lkgu=rz{p5=W+o?4$e)4C?%uVwV)_T!YXY#n z$lWV+F+)Q`14BbC=-eOx_?>B5?^jBY>t>gmv)l^)ta^Uqh_099iR@Z=C+B`0?uBh8 zUHa>(tqu|{;7n~e=m*Fcyl^-dO7)PXr>6%yY4mEV9h{Dyp5C)$uv!PCw5@Nocd~p| z&W-qk52c|(V^OHvqV!$VP0D&5T>i+wvxY=(&f{TC!>cyfg+v>aLFH~V17d5CR^t1& zsKmO%Nr!NM-_NrJ>2SdA^*uV(7zUI_e>MG89C&QaXXZGF$plirxTPgMy7`qp`57kuVK6M;4!DuoKY-If*qBlV@;NZ>q6ZK?(WrF zJb(67 zVDnO)8tfU~Q-B-@6^_Ay`PJLXn~y($8x)vdg;)uT&Si9Qn5C!THcu9hBj)xPwU1Xb zI|>o(yWggK2r3g&<*#p8+Eu8*b4IVl4SnOvAN&sAZKGe?-o^(mKs~#6kr`@Qc5eoG z=N+nclqcr+Xn$z)K<#KoT1pCEvz(p=xU!P~khErsDt>AHiPC~+o!ep?*?A5L;FLwL z!*N4XGXfZBRbdJk$OU+LTW#s`8ntxr3&9>=y6G(k-ObGn;z}7}1bozs`+4*NQ588r zlLS;8@d&K1!hxpE8^iC9UVV*N4;_B}XkXrOJcwS{glc#FBP@SKTJD<^^GXjr^W-9(qALPP~qTg>02(=Ml|+ zp~1`>1rL|)b^)4OX5GuQcHj&AGg>zfc+}K5L3nBHxTdEU*1B-Xz#zU@Wr+qpX9G0E z6_u4nrlxDD@F8Q2TF5O0*luexjn=dIV>T`0cQntEhF0giq&^bQ>pH-n3+=T&V@05F zbF)XC8g6gguywsH7t3NO-lzAV+{^gmF7u6#cdWD(DYDwXyXUB$r?34Atu-9s`{q%u z{!4S3oOP~}^^Dz@MdfduwC(MuZkB{?-tp6a??&c|(Mopz7-hz8>UPJ3Ic4V9$|rK- zfsL1qm#60Z5g%L1gjeSFm%h4f>1~t`rv}@}yE)WutHt_!OU+!!t8@(^5sK{M;=xHAzL9-f3WC@nLq?mSx`%_i@>LqFT1x| zSKxmvVV`3pU2GyUIUE1p#NN-3_(llYP;;{p)FI<#4`A%nBqpWiam&4_t@c%x?JkPP^Wj(|ov^>FYd*{HK^8@?X^F}7yBBN%FWr?u@S-CnECUQ2B#8Wv#z=yw9#F`I ziAAhEZ3G-X&}(_H(VF6PVw$pOK|iPWb;hY-ne(-O77+QS!>K<$yrn z^{1PmqZq~9z16(V1H(L;HgjAs8+_xPxW~yVRWtu$|EEvrk2#k-WbA9E;$SXUQ#H7} zMPPD+5>bN~%B+5ptp3Q|T{jTm1ywkqu4L2GEzi30T3hFa=FzbNq2`nn3^d?Cojt}b zrGdcuZ$F4^(9zXPouVre}bu`gW;#a&aKYd@Bai^6{4z+8N9hpU>4oNN6Cs zx5YCsi%yZ?Ut6ibH;pYQZdx_}=i(e!mwDU(ur)6B|4+-3j(x=d$BYEyOn*C%W7| zxvuQ378)m5JrQ2(^tj~yjPzR*4;@xkp85UO)B|M?@>NzgBMFsaJA~>1eLf7zW0QN( zm3DaO3FvrS2;?qNsTbL$;IAE1hH@MP>mp+)+iQ=Mh(8JLjx=Sq1+M3(qPLe+H5zG# z#th--zVi?iRt0AYe=KH8sGK31dV9mp4#^bkFqfeAoIT`PM5>@*@T_^dgJam%H{sXi zbm#?=&)*r>xs;wn8BWv#fmCc<+yi_2m@F$hd;3MUYWZ1j7=%y4L7W1fvTBm75WA`` zLqoUMS}=`O(o43oC2OzyK{d zdCpVb@frEvJ~F7rc?M5MRAAQxwYMHGDI_K)ra)~m*WmxrbBi_Ipy0=S4iLZ)cklLY zix>2}r7sqzztyyw1udCpVLQ{0`=2!sVAS;^`d<|(h}gXweBFQVl$|QBKj+E-THM;d z_r}#DwC8xyI9XwwrWla}HtRynn^9R~oJjK_a9Voc>Pp+*-d;B0h#hK=ClwLU43g{X_wL1lbtj;i%PuOqw)asRu8JWdBC5b7CntY& zUyfPSyzV4pBW${K_s$(MD6h0q?XenoOQ=-x!E3>sk8~z%RA%I(=#()HeNk)w{qdPc zvvl{;)8-LDSRP1ru^cOUBbr#;~??X@RX7kU?_*l^1^>15T9GvuQgzzH`;``-6rZ=Hhd- z?(Ch7&=HxV>|h#xUp+m#-k;5fW&mG4AOTN0#2%`29c( z@)qRQyFX9!CGP_iv^-;EIc4X6s?gDq0Hk9e^fxWIT6lZ20M#nCz75=7M2c+4qOx0J zcUW_CvyayzI2e4`y&8^Wp&gRf%#sah5yA%xVf~=WrZip0#D;RrpyoJdhD4S%79*p8 zfaC-=>rDjCIPPeB>DS8Db zy@WSky(=o>g>HIy$vaK98Df1un}1(j-QNbe5(EWb;(kw6P17pm|9L-zmWD}GBl;z# zbE6N0A6oM8GRFz2k=CnkzXc8np0ww<_@Wmgd7GwZA|=|QpTp8#ya20^w>_XgQY#pg zP$*bA{n%{b^=|7Cz!LcV?wR4{c#rzHD9H-;Xm;IR92 z)#N!s_g)N)7GA+6tPx(OZ3_(zkNc{hRyvRN8Zvk=(W9rARuF6?q)VpE-pLeXNBPs} zfaDr2;bl=y^a~%`x7EEnVR^%HmuU&hCCVWq63GF20^c{5YNDm(q5J3sHY(w$j0^fa zQ}|5}wS7@0g+ND!%u@YF3*o2OJmc=DG%zBAGfC6)J>v{Qxk*Dz?b5>gw8)Aw z8zPGj)Fxu{+(9QE(hOSsUSuR;JsC96FWhmwK#RQ$SqOJjd*s9#41A3{MIeSFK|%%w zK6g1U#*!pYj)epNx-B%2TFAUf;XzsLP3cAcA>DAWencvf>Ke18fS2*rT!(jVZd#e# zdZL(7yFm|5jt|XA`_%hFnBvRm!AG+Xrqwdy-r_E%eu)yK?BuO()*d}_EFa^)Cp9)b zO$p%{bOex-lhZqo?+Rs3chygph(^;ITOVZEV8D4ljZ0%Evg|C&QMe(63Vj*tEfOPb z#i_2JzuKCfuzm$q>IPd*Vohg$ukJaJtV>GALa1&z!P~p@GWr?65X~^~HT2U9_ z>zmm7dK)m1Fa-M4F>d2Ne-miE%sA>JDx`MdUuoB6)(GhEm+bsh< z!&UEKMvuCz=#NrTt|JSt6}dyWNg3Bpx$V0J8HIc+)eiy|ITQ95!M+O|v_2@Q+-Xzg zmczlI6KQGWr;g5<^Fgd4t>oVHR`!&N=d8labn0 zuPoG59iZc*o_N|qXexW%fOdH~wvJmxZG+6ed_nu_v#E4y6nRyDE`z!U&6@M9e(}t? z=dlqpgM;VUsHV0&0b7+4kQK_Nwp{CGbU59Sr`MH3Up_|=KvUauhEF5d7fFl`M!`Kc z)#e+4#i-qTSz@2%{PRrhCyJbsPu*R;6@Wp1Wfjr34;LfmAOY7~o!gm4Xe2?|Yyv;# znYi3IXnSp5lADeH{WXau3cQdYl!nmtJ*$@Y3>9SPOmcPbkF1*LvaA5*FOB*Al?%Fw z{>M+`f*iZ;#)F<*GM4;ulr%OV{R)iNYm5}DySeopeah$0yHk*U(`dDkYpd>c(3@8| z&7*z^Hg1YGg@P2%FN6f|ZVn48lBWC?Fz%kDq2X*s5qfbHEzQTX_Wm<4y zC|!ZE#Z=mUbgKPj@&`Uu$7k^m23K#7axz$!9eb*>An3I^yYlt4U(LnIDGqA-Zvd>Y sQ+&X}dHE>qcO?j$4v&fPktF0hu2Rmn!y<@l5duFtR}D1Yt6PNpAAXtlZ2$lO literal 38036 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 From a1e84818aad9b64ae8887d83fa74fe849a0cb9eb Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Wed, 6 Jul 2016 23:21:32 +0100 Subject: [PATCH 21/99] Removes Borg/AI IV Drip access entirely Neither AIs nor Cyborgs can remove beakers from IV Drips. --- code/game/machinery/iv_drip.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 2c1f4cb0059..09350136bff 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -131,9 +131,9 @@ beaker.reagents.handle_reactions() update_icon() -/obj/machinery/iv_drip/attack_hand(mob/user as mob) - if(get_dist(src, user) > 1) - return //stops the AI from removing beakers, still allows borgs +/obj/machinery/iv_drip/attack_hand(mob/living/carbon/user) + if(!istype(user)) + return if(src.beaker) src.beaker.loc = get_turf(src) src.beaker = null From 3626342f8cd7b13ff2f6ac14e4482c2d5c7cd8b3 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 6 Jul 2016 20:19:54 -0400 Subject: [PATCH 22/99] Automatic changelog generation for PR #4900 --- html/changelogs/AutoChangeLog-pr-4900.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4900.yml diff --git a/html/changelogs/AutoChangeLog-pr-4900.yml b/html/changelogs/AutoChangeLog-pr-4900.yml new file mode 100644 index 00000000000..9cb1d0bae54 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4900.yml @@ -0,0 +1,5 @@ +author: TullyBurnalot +delete-after: True +changes: + - tweak: "AI can no longer interact with IV Drips" + - tweak: "Robots can no longer remove beakers/blood bags from IV Drips" From 2df88fcdb5437306a603f9f1e48353534b119984 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Wed, 6 Jul 2016 21:49:26 -0400 Subject: [PATCH 23/99] Fixes and changes --- code/game/dna/dna2_helpers.dm | 4 ---- code/game/dna/genes/disabilities.dm | 2 ++ code/game/dna/genes/gene.dm | 8 ++++--- code/game/dna/genes/goon_disabilities.dm | 10 ++++++++ code/game/dna/genes/powers.dm | 8 +++++++ code/game/gamemodes/wizard/wizard.dm | 2 +- code/game/objects/items/devices/scanners.dm | 12 +++++++--- .../objects/items/weapons/dna_injector.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 23 ++++++++++--------- 9 files changed, 48 insertions(+), 23 deletions(-) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 53f248d1e91..c15c0eebee4 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -196,7 +196,3 @@ return 1 else return 0 - -// Used below, simple injection modifier. -/proc/probinj(var/pr, var/inj) - return prob(pr+inj*pr) diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index 4505dc1c1db..bbad4a7912f 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -28,6 +28,7 @@ return 1 // Always set! /datum/dna/gene/disability/activate(var/mob/M, var/connected, var/flags) + ..() if(mutation && !(mutation in M.mutations)) M.mutations.Add(mutation) if(disability) @@ -40,6 +41,7 @@ testing("[name] has no activation message.") /datum/dna/gene/disability/deactivate(var/mob/M, var/connected, var/flags) + ..() if(mutation && (mutation in M.mutations)) M.mutations.Remove(mutation) if(disability) diff --git a/code/game/dna/genes/gene.dm b/code/game/dna/genes/gene.dm index a39da68c92e..a3781f9985d 100644 --- a/code/game/dna/genes/gene.dm +++ b/code/game/dna/genes/gene.dm @@ -39,7 +39,7 @@ // Called when the gene activates. Do your magic here. /datum/dna/gene/proc/activate(var/mob/living/M, var/connected, var/flags) - M.gene_stability += instability + M.gene_stability -= instability return /** @@ -47,7 +47,7 @@ * Only called when the block is deactivated. */ /datum/dna/gene/proc/deactivate(var/mob/living/M, var/connected, var/flags) - M.gene_stability -= instability + M.gene_stability += instability return // This section inspired by goone's bioEffects. @@ -112,15 +112,17 @@ if(flags & MUTCHK_FORCED) return 1 // Probability check - return probinj(activation_prob,(flags&MUTCHK_FORCED)) + return prob(activation_prob) /datum/dna/gene/basic/activate(var/mob/M) + ..() M.mutations.Add(mutation) if(activation_messages.len) var/msg = pick(activation_messages) to_chat(M, "[msg]") /datum/dna/gene/basic/deactivate(var/mob/M) + ..() M.mutations.Remove(mutation) if(deactivation_messages.len) var/msg = pick(deactivation_messages) diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 5ec04865591..2afb9b7bd83 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -38,6 +38,16 @@ ..() block=RADBLOCK + +/datum/dna/gene/disability/radioactive/can_activate(var/mob/M,var/flags) + if(!..()) + return 0 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && H.species.flags & RADIMMUNE && !(flags & MUTCHK_FORCED)) + return 0 + return 1 + /datum/dna/gene/disability/radioactive/OnMobLife(var/mob/living/owner) var/radiation_amount = abs(min(owner.radiation - 20,0)) owner.apply_effect(radiation_amount, IRRADIATE) diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm index 2f211f7a057..5600005271e 100644 --- a/code/game/dna/genes/powers.dm +++ b/code/game/dna/genes/powers.dm @@ -34,6 +34,14 @@ /datum/dna/gene/basic/increaserun/New() block=INCREASERUNBLOCK +/datum/dna/gene/basic/increaserun/can_activate(var/mob/M,var/flags) + if(!..()) + return 0 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && H.species.slowdown && !(flags & MUTCHK_FORCED)) + return 0 + return 1 /datum/dna/gene/basic/heat_resist name="Heat Resistance" diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index d98eae3135d..c5f8271ab63 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -195,7 +195,7 @@ to_chat(wizard_mob, "In your pockets you will find a teleport scroll. Use it as needed.") wizard_mob.mind.store_memory("Remember: do not forget to prepare your spells.") wizard_mob.update_icons() - wizard_mob.gene_stability = 2 * DEFAULT_GENE_STABILITY //magic + wizard_mob.gene_stability += DEFAULT_GENE_STABILITY //magic return 1 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 7138a4515be..7401a593e99 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -226,7 +226,7 @@ REAGENT SCANNER for(var/datum/wound/W in e.wounds) if(W.internal) user.show_message(text("\red Internal bleeding detected. Advanced scanner required for location."), 1) break - if(M:vessel) + if(H.vessel) var/blood_volume = round(M:vessel.get_reagent_amount("blood")) var/blood_percent = blood_volume / 560 blood_percent *= 100 @@ -246,7 +246,14 @@ REAGENT SCANNER if(implant_detect) user.show_message("Detected cybernetic modifications:") user.show_message("[implant_detect]") - + if(H.gene_stability < 40) + user.show_message("Subject's genes are quickly breaking down!") + else if(H.gene_stability < 70) + user.show_message("Subject's genes are showing signs of spontenous breakdown.") + else if(H.gene_stability < 85) + user.show_message("Subject's genes are showing minor signs of instability.") + else + user.show_message("Subject's genes are stable.") src.add_fingerprint(user) return @@ -523,4 +530,3 @@ REAGENT SCANNER if (T.cores > 1) user.show_message("Anomalious slime core amount detected", 1) user.show_message("Growth progress: [T.amount_grown]/10", 1) - diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 2fc12e812fe..f243e1a6ab9 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -93,7 +93,7 @@ M.dna.UpdateSE() else M.dna.SetSEValue(block,src.GetValue()) - domutcheck(M, null, block!=null) + domutcheck(M, null, 0) M.update_mutations() if(H) H.sync_organ_dna(assimilate = 0, old_ue = prev_ue) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 9a56765bf67..3a394e002d5 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -176,21 +176,22 @@ if(gene.is_active(src)) speech_problem_flag = 1 gene.OnMobLife(src) - if(gene_stability < 85) - if(prob(5)) - adjustFireLoss(2) + if(gene_stability < 85) + var/instability = DEFAULT_GENE_STABILITY - gene_stability + if(prob(instability / 10)) + adjustFireLoss(min(6, instability / 12)) to_chat(src, "You feel like your skin is burning and bubbling off!") if(gene_stability < 70) - if(prob(3)) - adjustCloneLoss(2) + if(prob(instability / 12)) + adjustCloneLoss(min(5, instability / 15)) to_chat(src, "You feel as if your body is warping.") - if(prob(5)) - adjustToxLoss(3) + if(prob(instability / 10)) + adjustToxLoss(min(6, instability / 12)) to_chat(src, "You feel weak and nauseous.") - if(gene_stability < 40 && getCloneLoss() > 50 && prob(5)) - to_chat(src, "You feel incredibly sick... Something isn't right!") - spawn(180) - if(getCloneLoss() > 10) + if(gene_stability < 40 && prob(1)) + to_chat(src, "You feel incredibly sick... Something isn't right!") + spawn(300) + if(gene_stability < 40) gib() if(!(species.flags & RADIMMUNE)) From e195b07eee09c13c83d3246cb0a360b893e46071 Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Thu, 7 Jul 2016 02:53:27 +0100 Subject: [PATCH 24/99] Revoked Botanist Access to Morgue - Botanists were given access to the Morgue because of Replicant Pods - Replicant pods no longer work as a cloning method - Ergo, botanists outta the morgue :cl: remove: Botanist access to the morgue revoked /:cl: --- code/game/jobs/job/support.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index c940e7f15dd..13370ae281d 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -81,8 +81,8 @@ spawn_positions = 2 supervisors = "the head of personnel" selection_color = "#dddddd" - access = list(access_hydroponics, access_bar, access_kitchen, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning. - minimal_access = list(access_hydroponics, access_morgue, access_maint_tunnels) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning. + access = list(access_hydroponics, access_bar, access_kitchen) + minimal_access = list(access_hydroponics, access_maint_tunnels) alt_titles = list("Hydroponicist", "Botanical Researcher") From 87b0e491006bf1a398809bf85422af1336f17597 Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Thu, 7 Jul 2016 04:17:25 +0100 Subject: [PATCH 25/99] Admin Fax Template Flair - Added custom messages to EvilFaxes, for extra schadenfreude - Fax body for Templates changed to more unique versions :cl: tweak: Added custom messages for evil faxes tweat: Added unique text body for each non-evil fax template /:cl: --- code/modules/admin/topic.dm | 26 +++++++++++++------------- code/modules/paperwork/paper.dm | 18 +++++++++++------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 59278124aa0..83da118202e 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1707,7 +1707,7 @@ if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return - var/etypes = list("borging","corgifying","firedeath","braindeath","honktumor","demotion") + var/etypes = list("Borgification","Corgification","Death By Fire","Total Brain Death","Honk Tumor","Demotion Notice") var/eviltype = input(src.owner, "Which type of evil fax do you wish to send [H]?","Its good to be baaaad...", "") as null|anything in etypes if(!(eviltype in etypes)) return @@ -1718,7 +1718,7 @@ var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) P.name = "Central Command - [customname]" - P.info = "A reminder: per the terms of your contract, stupid faxes will get you demoted, or worse." + P.info = "You really should've known better." P.myeffect = eviltype P.mytarget = H if(alert("Do you want the Evil Fax to activate automatically if [H] tries to ignore it?",,"Yes", "No") == "Yes") @@ -1758,19 +1758,19 @@ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(null) var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) P.name = "Central Command - paper" - var/stypes = list("handle it yourself","illegible","not signed","sorry, not right now","stop wasting our time") + var/stypes = list("Handle it yourselves!","Illegible fax","Fax not signed/stamped","Not Right Now","You are wasting our time") var/stype = input(src.owner, "Which type of standard reply do you wish to send to [H]?","Choose your paperwork", "") as null|anything in stypes var/tmsg = "



NanoTrasen Science Station Cyberiad


NAS Trurl Communications Department Report


" - if(stype == "handle it yourself") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention." - else if(stype == "illegible") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Your fax was too poorly written for our system to interpret." - else if(stype == "not signed") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Your fax was not properly signed and/or stamped." - else if(stype == "sorry, not right now") - tmsg += "Greetings, esteemed crewmember. Unfortunately, we are unable to spare the resources to assist you at this time." - else if(stype == "stop wasting our time") - tmsg += "Stop wasting our time." + if(stype == "Handle it yourselves!") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention.

This is an automatic message.

Do not reply.
" + else if(stype == "Illegible fax") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Your fax's grammar, syntax and/or typography are of a sub-par level and do not allow us to understand the contents of the message.

Please consult your nearest dictionary and/or thesaurus and try again.

This is an automatic message.

Do not reply.
" + else if(stype == "Fax not signed/stamped") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Your fax was not properly signed and/or stamped. Please stamp your fax in accordance with NanoTrasen Fax Communication Policy, Section 3, Paragraph 6, Line 9.

This is an automatic message.

Do not reply.
" + else if(stype == "Not Right Now") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Due to pressing concerns of a matter above your current paygrade, we are unable to provide assistance in whatever matter your fax referenced.

This can be either due to a power outage, bureaucratic audit, pest infestation, Ascendance Event, corgi outbreak, or any other situation that would affect the proper functioning of the NAS Trurl.

Please try again later.

This is an automatic message.

Do not reply.
" + else if(stype == "You are wasting our time") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

In the interest of preventing further mismanagement of company resources, please avoid wasting our time with such petty drivel.

Do kindly remember that we expect our workforce to maintain at least a semi-decent level of proffesionalism. Do not test our patience.

This is an automatic message.

Do not reply.
" else return tmsg += "
" diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index db7a054a693..2f0afc2e846 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -676,23 +676,27 @@ /obj/item/weapon/paper/evilfax/proc/evilpaper_specialaction(var/mob/living/carbon/target) spawn(30) if(istype(target,/mob/living/carbon)) - if(myeffect == "borging") + if(myeffect == "Borgification") + to_chat(target,"You seem to comprehend the AI a little better. Why are your muscles so stiff?") target.ForceContractDisease(new /datum/disease/transformation/robot(0)) - else if(myeffect == "corgifying") + else if(myeffect == "Corgification") + to_chat(target,"You hear distant howling as the world seems to grow bigger around you. Boy, that itch sure is getting worse!") target.ForceContractDisease(new /datum/disease/transformation/corgi(0)) - else if(myeffect == "firedeath") + else if(myeffect == "Death By Fire") + to_chat(target,"You feel hotter than usual. Maybe you should lowe-wait, is that your hand melting?") var/turf/simulated/T = get_turf(target) new /obj/effect/hotspot(T) target.adjustFireLoss(150) // hard crit, the burning takes care of the rest. - else if(myeffect == "braindeath") - to_chat(target,"A series of bright lights flash across your vision: COGNITOHAZARD YHWH-3 ACTIVATED") + else if(myeffect == "Total Brain Death") + to_chat(target,"You see a message appear in front of you in bright red letters: YHWH-3 MEMETIC KILL AGENT ACTIVATED") target.mutations.Add(NOCLONE) target.adjustBrainLoss(125) - else if(myeffect == "honktumor") + else if(myeffect == "Honk Tumor") if(!target.get_int_organ(/obj/item/organ/internal/honktumor)) var/obj/item/organ/internal/organ = new /obj/item/organ/internal/honktumor + to_chat(target,"Life seems funnier, somehow.") organ.insert(target) - else if(myeffect == "demotion") + else if(myeffect == "Demotion Notice") command_announcement.Announce("[mytarget] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order") else message_admins("Evil paper [src] was activated without a proper effect set! This is a bug.") From 4a84ced8fd65a96e00fd4dcb2c0061b73cf41517 Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Thu, 7 Jul 2016 04:34:44 +0100 Subject: [PATCH 26/99] Removed Stamps. Removed memes. - No more denying over lack of stamps. Just lack of signatures; - No one ever referenced Memetic Kill Agents. No one. --- code/modules/admin/topic.dm | 6 +++--- code/modules/paperwork/paper.dm | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 83da118202e..6dbb6359ebb 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1758,15 +1758,15 @@ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(null) var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) P.name = "Central Command - paper" - var/stypes = list("Handle it yourselves!","Illegible fax","Fax not signed/stamped","Not Right Now","You are wasting our time") + var/stypes = list("Handle it yourselves!","Illegible fax","Fax not signed","Not Right Now","You are wasting our time") var/stype = input(src.owner, "Which type of standard reply do you wish to send to [H]?","Choose your paperwork", "") as null|anything in stypes var/tmsg = "



NanoTrasen Science Station Cyberiad


NAS Trurl Communications Department Report


" if(stype == "Handle it yourselves!") tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention.

This is an automatic message.

Do not reply.
" else if(stype == "Illegible fax") tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Your fax's grammar, syntax and/or typography are of a sub-par level and do not allow us to understand the contents of the message.

Please consult your nearest dictionary and/or thesaurus and try again.

This is an automatic message.

Do not reply.
" - else if(stype == "Fax not signed/stamped") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Your fax was not properly signed and/or stamped. Please stamp your fax in accordance with NanoTrasen Fax Communication Policy, Section 3, Paragraph 6, Line 9.

This is an automatic message.

Do not reply.
" + else if(stype == "Fax not signed") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Your fax has not been correctly signed and, as such, we cannot verify your identity.

Please sign your faxes before sending them so that we may verify your identity.

This is an automatic message.

Do not reply.
" else if(stype == "Not Right Now") tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Due to pressing concerns of a matter above your current paygrade, we are unable to provide assistance in whatever matter your fax referenced.

This can be either due to a power outage, bureaucratic audit, pest infestation, Ascendance Event, corgi outbreak, or any other situation that would affect the proper functioning of the NAS Trurl.

Please try again later.

This is an automatic message.

Do not reply.
" else if(stype == "You are wasting our time") diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 2f0afc2e846..721d2e1122d 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -688,7 +688,7 @@ new /obj/effect/hotspot(T) target.adjustFireLoss(150) // hard crit, the burning takes care of the rest. else if(myeffect == "Total Brain Death") - to_chat(target,"You see a message appear in front of you in bright red letters: YHWH-3 MEMETIC KILL AGENT ACTIVATED") + to_chat(target,"You see a message appear in front of you in bright red letters: YHWH-3 ACTIVATED. TERMINATION IN 3 SECONDS") target.mutations.Add(NOCLONE) target.adjustBrainLoss(125) else if(myeffect == "Honk Tumor") From 783536d2784928e06f408e6c73938f9f204d672a Mon Sep 17 00:00:00 2001 From: Krausus Date: Thu, 7 Jul 2016 01:25:56 -0400 Subject: [PATCH 27/99] Replaces ID photos with bicons --- code/datums/datacore.dm | 2 ++ code/game/machinery/computer/medical.dm | 7 ++---- code/game/machinery/computer/security.dm | 8 ++----- code/game/machinery/computer/skills.dm | 8 ++----- code/game/objects/items/weapons/cards_ids.dm | 23 +++++++++----------- code/modules/computer3/computers/medical.dm | 7 ++---- code/modules/computer3/computers/security.dm | 8 ++----- 7 files changed, 22 insertions(+), 41 deletions(-) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index d07b6e3eb73..ff081676b43 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -66,6 +66,8 @@ G.fields["sex"] = capitalize(H.gender) G.fields["species"] = H.get_species() G.fields["photo"] = get_id_photo(H) + G.fields["photo-south"] = "'data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = SOUTH))]'" + G.fields["photo-west"] = "'data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = WEST))]'" if(H.gen_record && !jobban_isbanned(H, "Records")) G.fields["notes"] = H.gen_record else diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 6e331d46cf3..4727953e5df 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -54,10 +54,6 @@ if(3.0) dat += text("Records Maintenance
\nBackup To Disk
\nUpload From disk
\nDelete All Records
\n
\nBack", src, src, src, src) if(4.0) - var/icon/front = new(active1.fields["photo"], dir = SOUTH) - var/icon/side = new(active1.fields["photo"], dir = WEST) - user << browse_rsc(front, "front.png") - user << browse_rsc(side, "side.png") dat += "
Medical Record

" if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) dat += "
Name: [active1.fields["name"]] \ @@ -67,7 +63,8 @@ Fingerprint: [active1.fields["fingerprint"]]
\n \ Physical Status: [active1.fields["p_stat"]]
\n \ Mental Status: [active1.fields["m_stat"]]
\ - Photo:
" + Photo:
\ + " else dat += "General Record Lost!
" if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2))) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 6f285930ab7..f1c475a122b 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -165,10 +165,6 @@ if(3.0) dat += "
Security Record

" if ((istype(active1, /datum/data/record) && data_core.general.Find(active1))) - var/icon/front = new(active1.fields["photo"], dir = SOUTH) - var/icon/side = new(active1.fields["photo"], dir = WEST) - user << browse_rsc(front, "front.png") - user << browse_rsc(side, "side.png") dat += {"
Name: [active1.fields["name"]]
@@ -182,8 +178,8 @@
Photo:
- -
+ +
Print Photo
"} else diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index ddcfeed9a74..1d5e0ce53dd 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -87,10 +87,6 @@ if(3.0) dat += "
Employment Record

" if ((istype(active1, /datum/data/record) && data_core.general.Find(active1))) - var/icon/front = new(active1.fields["photo"], dir = SOUTH) - var/icon/side = new(active1.fields["photo"], dir = WEST) - user << browse_rsc(front, "front.png") - user << browse_rsc(side, "side.png") dat += text(" \ -
\ Name: [active1.fields["name"]]
\ ID: [active1.fields["id"]]
\n \ @@ -101,8 +97,8 @@ Physical Status: [active1.fields["p_stat"]]
\n \ Mental Status: [active1.fields["m_stat"]]

\n \ Employment/skills summary:
[active1.fields["notes"]]
Photo:
\ -
") + Photo:
\ + ") else dat += "General Record Lost!
" dat += text("\nDelete Record (ALL)

\nPrint Record
\nBack
", src, src, src) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 97f66ec6a72..85c25d2b98a 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -103,8 +103,6 @@ var/sex var/age var/photo - var/icon/front - var/icon/side var/dat var/stamped = 0 @@ -137,12 +135,6 @@ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper) assets.send(user) - if(!front) - front = new(photo, dir = SOUTH) - if(!side) - side = new(photo, dir = WEST) - user << browse_rsc(front, "front.png") - user << browse_rsc(side, "side.png") var/datum/browser/popup = new(user, "idcard", name, 600, 400) popup.set_content(dat) popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) @@ -170,6 +162,9 @@ dna_hash = H.dna.unique_enzymes fingerprint_hash = md5(H.dna.uni_identity) + var/photo_front = "'data:image/png;base64,[icon2base64(icon(photo, dir = SOUTH))]'" + var/photo_side = "'data:image/png;base64,[icon2base64(icon(photo, dir = WEST))]'" + dat = ("
") dat += text("Name: []
", registered_name) dat += text("Sex: []
\n", sex) @@ -178,8 +173,8 @@ dat += text("Fingerprint: []
\n", fingerprint_hash) dat += text("Blood Type: []
\n", blood_type) dat += text("DNA Hash: []

\n", dna_hash) - dat +="
Photo:
\ -
" + dat +="Photo:
\ + " /obj/item/weapon/card/id/GetAccess() if(!guest_pass) @@ -341,7 +336,7 @@ if("Show") return ..() if("Edit") - switch(input(user,"What would you like to edit on \the [src]?") in list("Name","Photo","Appearance","Sex","Age","Occupation","Money Account","Blood Type","DNA Hash","Fingerprint Hash","Reset Card")) + switch(input(user,"What would you like to edit on \the [src]?") in list("Name","Appearance","Sex","Age","Occupation","Money Account","Blood Type","DNA Hash","Fingerprint Hash","Reset Card")) if("Name") var/new_name = reject_bad_name(input(user,"What name would you like to put on this card?","Agent Card Name", ishuman(user) ? user.real_name : user.name)) if(!Adjacent(user)) @@ -350,13 +345,15 @@ UpdateName() to_chat(user, "Name changed to [new_name].") + // This option is now disabled. I had to comment out the front/side lines. + // It didn't work anyway, so nothing of value was lost! if("Photo") if(!Adjacent(user)) return photo = fake_id_photo(user) var/icon/photoside = fake_id_photo(user,1) - front = new(photo) - side = new(photoside) + // front = new(photo) + // side = new(photoside) if(photo && photoside) to_chat(user, "Photo changed.") diff --git a/code/modules/computer3/computers/medical.dm b/code/modules/computer3/computers/medical.dm index 5d283af5b53..b3feb23c6a5 100644 --- a/code/modules/computer3/computers/medical.dm +++ b/code/modules/computer3/computers/medical.dm @@ -86,10 +86,6 @@ if(3.0) dat += text("Records Maintenance
\nBackup To Disk
\nUpload From disk
\nDelete All Records
\n
\nBack", src, src, src, src) if(4.0) - var/icon/front = new(active1.fields["photo"], dir = SOUTH) - var/icon/side = new(active1.fields["photo"], dir = WEST) - usr << browse_rsc(front, "front.png") - usr << browse_rsc(side, "side.png") dat += "
Medical Record

" if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) dat += "
Name: [active1.fields["name"]] \ @@ -99,7 +95,8 @@ Fingerprint: [active1.fields["fingerprint"]]
\n \ Physical Status: [active1.fields["p_stat"]]
\n \ Mental Status: [active1.fields["m_stat"]]
\ - Photo:
" + Photo:
\ + " else dat += "General Record Lost!
" if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2))) diff --git a/code/modules/computer3/computers/security.dm b/code/modules/computer3/computers/security.dm index ebb218b5cee..57e8de72a79 100644 --- a/code/modules/computer3/computers/security.dm +++ b/code/modules/computer3/computers/security.dm @@ -127,10 +127,6 @@ if(3.0) dat += "
Security Record

" if ((istype(active1, /datum/data/record) && data_core.general.Find(active1))) - var/icon/front = new(active1.fields["photo"], dir = SOUTH) - var/icon/side = new(active1.fields["photo"], dir = WEST) - usr << browse_rsc(front, "front.png") - usr << browse_rsc(side, "side.png") dat += text(" \ -
\ Name: [active1.fields["name"]]
\ ID: [active1.fields["id"]]
\n \ @@ -140,8 +136,8 @@ Fingerprint: [active1.fields["fingerprint"]]
\n \ Physical Status: [active1.fields["p_stat"]]
\n \ Mental Status: [active1.fields["m_stat"]]
Photo:
\ -
") + Photo:
\ + ") else dat += "General Record Lost!
" if ((istype(active2, /datum/data/record) && data_core.security.Find(active2))) From 545401159397346c11eeecd5a49b8fcb158c44d6 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 6 Jul 2016 23:47:08 -0700 Subject: [PATCH 28/99] Fixes trialmin bug, adds ERT response reminder --- code/game/response_team.dm | 2 ++ code/modules/admin/topic.dm | 2 +- code/modules/admin/verbs/pray.dm | 6 ++++-- .../security_levels/keycard authentication.dm | 15 ++++++++++++--- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index d9b8cfcc375..c16c6475f8d 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -9,6 +9,7 @@ var/list/response_team_members = list() var/responseteam_age = 21 // Minimum account age to play as an ERT member var/datum/response_team/active_team = null var/send_emergency_team +var/ert_request_answered = 0 /client/proc/response_team() set name = "Dispatch CentComm Response Team" @@ -47,6 +48,7 @@ var/send_emergency_team if(!ert_type) return + ert_request_answered = 1 message_admins("[key_name_admin(usr)] is dispatching an Emergency Response Team", 1) log_admin("[key_name(usr)] used Dispatch Emergency Response Team..") trigger_armed_response_team(ert_type) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 59278124aa0..2be62321e71 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1854,7 +1854,7 @@ var/input = input(src.owner, "Please enter a reason for denying [key_name(H)]'s ERT request.","Outgoing message from CentComm", "") if(!input) return - + ert_request_answered = 1 to_chat(src.owner, "You sent [input] to [H] via a secure channel.") log_admin("[src.owner] denied [key_name(H)]'s ERT request with the message [input].") to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Your ERT request has been denied for the following reasons: [input]. Message ends.\"") diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index caed1de43af..a9562268fdd 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -50,9 +50,11 @@ if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' -/proc/ERT_Announce(var/text , var/mob/Sender) +/proc/ERT_Announce(var/text , var/mob/Sender, var/repeat_warning) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "\blue ERT REQUEST: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (REPLY): [msg]" + msg = "ERT REQUEST: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RESPOND): [msg]" + if (repeat_warning) + msg += "
WARNING: ERT request has gone 5 minutes with no reply!" for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm index d27820ac033..2220b85f361 100644 --- a/code/modules/security_levels/keycard authentication.dm +++ b/code/modules/security_levels/keycard authentication.dm @@ -155,12 +155,21 @@ if(is_ert_blocked()) to_chat(usr, "\red All Emergency Response Teams are dispatched and can not be called at this time.") return - to_chat(usr, "ERT request transmitted.") - if(admins.len) - ERT_Announce(ert_reason , event_triggered_by) + + + var/fullmin_count = 0 + for(var/client/C in admins) + if (check_rights(R_EVENT, 0, C.mob)) + fullmin_count++ + if(fullmin_count) + ert_request_answered = 0 + ERT_Announce(ert_reason , event_triggered_by, 0) ert_reason = "Reason for ERT" feedback_inc("alert_keycard_auth_ert",1) + spawn(3000) + if (!ert_request_answered) + ERT_Announce(ert_reason , event_triggered_by, 1) else trigger_armed_response_team(new /datum/response_team/amber) // No admins? No problem. Automatically send a code amber ERT. From d6dd9075f37c2cf10e47394a81b7f02d0349a94a Mon Sep 17 00:00:00 2001 From: Krausus Date: Thu, 7 Jul 2016 10:21:58 -0400 Subject: [PATCH 29/99] Fixes agent ID HTML not updating --- code/game/objects/items/weapons/cards_ids.dm | 74 +++++++++++--------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 85c25d2b98a..68efca49825 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -162,19 +162,22 @@ dna_hash = H.dna.unique_enzymes fingerprint_hash = md5(H.dna.uni_identity) + RebuildHTML() + +/obj/item/weapon/card/id/proc/RebuildHTML() var/photo_front = "'data:image/png;base64,[icon2base64(icon(photo, dir = SOUTH))]'" var/photo_side = "'data:image/png;base64,[icon2base64(icon(photo, dir = WEST))]'" - dat = ("
") - dat += text("Name: []
", registered_name) - dat += text("Sex: []
\n", sex) - dat += text("Age: []
\n", age) - dat += text("Rank: []
\n", assignment) - dat += text("Fingerprint: []
\n", fingerprint_hash) - dat += text("Blood Type: []
\n", blood_type) - dat += text("DNA Hash: []

\n", dna_hash) - dat +="
Photo:
\ -
" + dat = {"
+ Name: [registered_name]
+ Sex: [sex]
+ Age: [age]
+ Rank: [assignment]
+ Fingerprint: [fingerprint_hash]
+ Blood Type: [blood_type]
+ DNA Hash: [dna_hash]

+
Photo:
+
"} /obj/item/weapon/card/id/GetAccess() if(!guest_pass) @@ -287,27 +290,22 @@ to_chat(usr, "The card's microscanners activate as you pass it over \the [I], copying its access.") src.access |= I.access //Don't copy access if user isn't an antag -- to prevent metagaming -/obj/item/weapon/card/id/syndicate/proc/fake_id_photo(var/mob/living/carbon/human/H, var/side=0)//get_id_photo wouldn't work correctly +/obj/item/weapon/card/id/syndicate/proc/fake_id_photo(var/mob/living/carbon/human/H)//get_id_photo wouldn't work correctly if(!istype(H)) return var/storedDir = H.dir //don't want to lose track of this - var/icon/faked - if(!side) - if(!H.equip_to_slot_if_possible(src, slot_l_store, 0, 1)) - to_chat(H, "You need to empty your pockets before taking the ID picture.") - return + var/icon/faked = new() + if(!H.equip_to_slot_if_possible(src, slot_l_store, 0, 1)) + to_chat(H, "You need to empty your pockets before taking the ID picture.") + return - if(side) - H.dir = WEST //ensure the icon is actually the proper direction before copying it - faked = getFlatIcon(H) - H.dir = storedDir //reset the user back to their original direction, not even noticable they changed - H.equip_to_slot_if_possible(src, slot_l_hand, 0, 1) - - else - H.dir = SOUTH - faked = getFlatIcon(H) - H.dir = storedDir + H.dir = WEST //ensure the icon is actually the proper direction before copying it + faked.Insert(getFlatIcon(H), dir = WEST) + H.dir = SOUTH + faked.Insert(getFlatIcon(H), dir = SOUTH) + H.dir = storedDir + H.equip_to_slot_if_possible(src, slot_l_hand, 0, 1) return faked @@ -336,7 +334,7 @@ if("Show") return ..() if("Edit") - switch(input(user,"What would you like to edit on \the [src]?") in list("Name","Appearance","Sex","Age","Occupation","Money Account","Blood Type","DNA Hash","Fingerprint Hash","Reset Card")) + switch(input(user,"What would you like to edit on \the [src]?") in list("Name","Photo","Appearance","Sex","Age","Occupation","Money Account","Blood Type","DNA Hash","Fingerprint Hash","Reset Card")) if("Name") var/new_name = reject_bad_name(input(user,"What name would you like to put on this card?","Agent Card Name", ishuman(user) ? user.real_name : user.name)) if(!Adjacent(user)) @@ -344,18 +342,17 @@ src.registered_name = new_name UpdateName() to_chat(user, "Name changed to [new_name].") + RebuildHTML() - // This option is now disabled. I had to comment out the front/side lines. - // It didn't work anyway, so nothing of value was lost! if("Photo") if(!Adjacent(user)) return - photo = fake_id_photo(user) - var/icon/photoside = fake_id_photo(user,1) - // front = new(photo) - // side = new(photoside) - if(photo && photoside) - to_chat(user, "Photo changed.") + var/icon/newphoto = fake_id_photo(user) + if(!newphoto) + return + photo = newphoto + to_chat(user, "Photo changed.") + RebuildHTML() if("Appearance") var/list/appearances = list( @@ -400,6 +397,7 @@ return src.sex = new_sex to_chat(user, "Sex changed to [new_sex].") + RebuildHTML() if("Age") var/new_age = sanitize(stripped_input(user,"What age would you like to put on this card?","Agent Card Age","21", MAX_MESSAGE_LEN)) @@ -407,6 +405,7 @@ return src.age = new_age to_chat(user, "Age changed to [new_age].") + RebuildHTML() if("Occupation") var/new_job = sanitize(stripped_input(user,"What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation", "Civilian", MAX_MESSAGE_LEN)) @@ -415,6 +414,7 @@ src.assignment = new_job to_chat(user, "Occupation changed to [new_job].") UpdateName() + RebuildHTML() if("Money Account") var/new_account = input(user,"What money account would you like to link to this card?","Agent Card Account",12345) as num @@ -435,6 +435,7 @@ return src.blood_type = new_blood_type to_chat(user, "Blood type changed to [new_blood_type].") + RebuildHTML() if("DNA Hash") var/default = "\[UNSET\]" @@ -448,6 +449,7 @@ return src.dna_hash = new_dna_hash to_chat(user, "DNA hash changed to [new_dna_hash].") + RebuildHTML() if("Fingerprint Hash") var/default = "\[UNSET\]" @@ -461,6 +463,7 @@ return src.fingerprint_hash = new_fingerprint_hash to_chat(user, "Fingerprint hash changed to [new_fingerprint_hash].") + RebuildHTML() if("Reset Card") name = initial(name) @@ -477,6 +480,7 @@ registered_user = null to_chat(user, "All information has been deleted from \the [src].") + RebuildHTML() else ..() From f61225f3b314df6abb0308b219bfaab94fa204cf Mon Sep 17 00:00:00 2001 From: Chakirski Date: Thu, 7 Jul 2016 15:05:33 -0500 Subject: [PATCH 30/99] EMP-Binary --- code/modules/mob/living/silicon/robot/component.dm | 10 +++++++++- code/modules/mob/living/silicon/robot/robot.dm | 7 +++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index c6ae0f57ddf..a2529c99ee0 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -9,6 +9,7 @@ var/electronics_damage = 0 var/energy_consumption = 0 var/max_damage = 30 + var/component_disabled = 0 var/mob/living/silicon/robot/owner // The actual device object that has to be installed for this. @@ -95,6 +96,7 @@ external_type = /obj/item/robot_parts/robot_component/binary_communication_device energy_consumption = 0 max_damage = 30 + component_disabled = 0 /datum/robot_component/camera name = "camera" @@ -121,7 +123,13 @@ /mob/living/silicon/robot/proc/is_component_functioning(module_name) var/datum/robot_component/C = components[module_name] - return C && C.installed == 1 && C.toggled && C.is_powered() + return C && C.installed == 1 && C.toggled && C.is_powered() && !C.component_disabled + +/mob/living/silicon/robot/proc/disable_component(module_name, emp_duration) + var/datum/robot_component/D = get_component(module_name) + D.component_disabled = 1 + spawn (emp_duration) + D.component_disabled = 0 // Returns component by it's string name /mob/living/silicon/robot/proc/get_component(var/component_name) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 81c781b51ff..20e30ffc5c0 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1470,3 +1470,10 @@ var/list/robot_verbs_default = list( status_flags &= ~CANPUSH notify_ai(2) + +/mob/living/silicon/robot/emp_act(severity) + ..() + if(1) + disable_component("comms", 360) + if(2) + disable_component("comms", 60) From 147d485cb3ca1b79df168ab57bd6a57b4424c0a0 Mon Sep 17 00:00:00 2001 From: Krausus Date: Thu, 7 Jul 2016 16:25:46 -0400 Subject: [PATCH 31/99] Fixes alternate appearance clobbering --- code/game/alternate_appearance.dm | 12 +++++------- code/modules/mob/login.dm | 6 ++---- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index 005876e8ccc..53e7d6704fd 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -30,7 +30,7 @@ if(!M.viewing_alternate_appearances) M.viewing_alternate_appearances = list() viewers |= M - M.viewing_alternate_appearances[key] = src + M.viewing_alternate_appearances += src if(M.client) M.client.images |= img @@ -48,9 +48,7 @@ if(M.client) M.client.images -= img if(M.viewing_alternate_appearances && M.viewing_alternate_appearances.len) - M.viewing_alternate_appearances -= key - if(!M.viewing_alternate_appearances.len) - M.viewing_alternate_appearances = null + M.viewing_alternate_appearances -= src viewers -= M @@ -61,8 +59,6 @@ hide() if(owner && owner.alternate_appearances) owner.alternate_appearances -= key - if(!owner.alternate_appearances.len) - owner.alternate_appearances = null /datum/alternate_appearance/Destroy() @@ -74,7 +70,7 @@ /atom var/list/alternate_appearances //the alternate appearances we own var/list/viewing_alternate_appearances //the alternate appearances we're viewing, stored here to reestablish them after Logout()s - //these lists are built/destroyed as necessary, so atoms aren't all lugging around lists full of datums + //these lists are built as necessary, so atoms aren't all lugging around empty lists /* Builds an alternate_appearance datum for the supplied args, optionally displaying it straight away @@ -102,6 +98,8 @@ AA.key = key AA.owner = src + if(alternate_appearances[key]) + qdel(alternate_appearances[key]) alternate_appearances[key] = AA if(displayTo && displayTo.len) display_alt_appearance(key, displayTo) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 5cf956e610a..28886862c2f 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -74,10 +74,8 @@ add_click_catcher() if(viewing_alternate_appearances && viewing_alternate_appearances.len) - for(var/aakey in viewing_alternate_appearances) - var/datum/alternate_appearance/AA = viewing_alternate_appearances[aakey] - if(AA) - AA.display_to(list(src)) + for(var/datum/alternate_appearance/AA in viewing_alternate_appearances) + AA.display_to(list(src)) CallHook("Login", list("client" = src.client, "mob" = src)) From bea31f317965df298e2562175764f5ce1dacc150 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 7 Jul 2016 16:43:24 -0400 Subject: [PATCH 32/99] Automatic changelog generation for PR #4912 --- html/changelogs/AutoChangeLog-pr-4912.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4912.yml diff --git a/html/changelogs/AutoChangeLog-pr-4912.yml b/html/changelogs/AutoChangeLog-pr-4912.yml new file mode 100644 index 00000000000..865ac6931dc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4912.yml @@ -0,0 +1,5 @@ +author: Kyep +delete-after: True +changes: + - bugfix: "Fixed oversight in keycard authentication devices that incorrectly treated trialmins like fullmins, resulting in situations where calling an ERT became impossible." + - tweak: "If an ERT request gets no answer for 5 minutes, admins now get a one time reminder that it was sent." From bf97444085cf915fb2b95d6c052c3744223a5e64 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 7 Jul 2016 16:47:00 -0400 Subject: [PATCH 33/99] Automatic changelog generation for PR #4910 --- html/changelogs/AutoChangeLog-pr-4910.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4910.yml diff --git a/html/changelogs/AutoChangeLog-pr-4910.yml b/html/changelogs/AutoChangeLog-pr-4910.yml new file mode 100644 index 00000000000..94574d183cb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4910.yml @@ -0,0 +1,5 @@ +author: Krausus +delete-after: True +changes: + - bugfix: "Security and medical records should probably stop crashing people." + - bugfix: "Altering details on an Agent ID Card will now actually update what's seen when examining the card." From 5ca647b795f35a36b4e8f995184baacb812e1f29 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 7 Jul 2016 16:47:34 -0400 Subject: [PATCH 34/99] Automatic changelog generation for PR #4906 --- html/changelogs/AutoChangeLog-pr-4906.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4906.yml diff --git a/html/changelogs/AutoChangeLog-pr-4906.yml b/html/changelogs/AutoChangeLog-pr-4906.yml new file mode 100644 index 00000000000..89997172467 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4906.yml @@ -0,0 +1,5 @@ +author: TullyBurnalot +delete-after: True +changes: + - bugfix: "Fixed clown door deconstruction" + - bugfix: "Fixed mime door deconstruction" From 61e0d6cd5f58d0dd227e6c1947fdc5fcc123273d Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 7 Jul 2016 16:47:48 -0400 Subject: [PATCH 35/99] Automatic changelog generation for PR #4905 --- html/changelogs/AutoChangeLog-pr-4905.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4905.yml diff --git a/html/changelogs/AutoChangeLog-pr-4905.yml b/html/changelogs/AutoChangeLog-pr-4905.yml new file mode 100644 index 00000000000..ba85782c277 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4905.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes sechuds and nightvision sechuds having flash protection" From 6dcbbe3a47562cbac25576a5219374a3ab15b22f Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 7 Jul 2016 16:49:26 -0400 Subject: [PATCH 36/99] Automatic changelog generation for PR #4883 --- html/changelogs/AutoChangeLog-pr-4883.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4883.yml diff --git a/html/changelogs/AutoChangeLog-pr-4883.yml b/html/changelogs/AutoChangeLog-pr-4883.yml new file mode 100644 index 00000000000..d04e82d0b61 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4883.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Can now pet pAI's with help intent" From 598dd424d35a3dd3022b7c256198b4f587e3205a Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Thu, 7 Jul 2016 13:51:02 -0700 Subject: [PATCH 37/99] CHANGELOGGU --- html/changelog.html | 69 +++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 65 +++++++++++++++++++++ html/changelogs/AutoChangeLog-pr-4852.yml | 5 -- html/changelogs/AutoChangeLog-pr-4857.yml | 4 -- html/changelogs/AutoChangeLog-pr-4860.yml | 9 --- html/changelogs/AutoChangeLog-pr-4861.yml | 4 -- html/changelogs/AutoChangeLog-pr-4867.yml | 10 ---- html/changelogs/AutoChangeLog-pr-4869.yml | 7 --- html/changelogs/AutoChangeLog-pr-4870.yml | 4 -- html/changelogs/AutoChangeLog-pr-4874.yml | 4 -- html/changelogs/AutoChangeLog-pr-4875.yml | 4 -- html/changelogs/AutoChangeLog-pr-4883.yml | 4 -- html/changelogs/AutoChangeLog-pr-4887.yml | 4 -- html/changelogs/AutoChangeLog-pr-4892.yml | 4 -- html/changelogs/AutoChangeLog-pr-4896.yml | 7 --- html/changelogs/AutoChangeLog-pr-4900.yml | 5 -- html/changelogs/AutoChangeLog-pr-4905.yml | 4 -- html/changelogs/AutoChangeLog-pr-4906.yml | 5 -- html/changelogs/AutoChangeLog-pr-4910.yml | 5 -- html/changelogs/AutoChangeLog-pr-4912.yml | 5 -- 20 files changed, 134 insertions(+), 94 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4852.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4857.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4860.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4861.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4867.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4869.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4870.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4874.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4875.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4883.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4887.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4892.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4896.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4900.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4905.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4906.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4910.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4912.yml diff --git a/html/changelog.html b/html/changelog.html index d7c76ff989f..d6e55c2a642 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,75 @@ -->
+

07 July 2016

+

Ar3nn updated:

+
    +
  • Adds tech levels to RnD console main menu
  • +
+

FalseIncarnate updated:

+
    +
  • Chicks no longer lose their souls (literally) when becoming adults.
  • +
  • Intercoms, fire alarms, and air alarms no longer contain internal portals to a realm of infinite cables and circuit boards.
  • +
+

Fox McCloud updated:

+
    +
  • Space lube damage removed and duration reduced from 7 to 5
  • +
  • Azide and CLF3+Firefighting foam now play a bang sound when mixed
  • +
  • Can now pet pAI's with help intent
  • +
  • Fixes sechuds and nightvision sechuds having flash protection
  • +
+

FreeStylaLT updated:

+
    +
  • Added windows and a missing firelock to Genetics/Cloning
  • +
  • Tweaked layout of Genetics slightly
  • +
  • Added photocopier to R&D.
  • +
  • Tweaked RD's office layout slightly
  • +
  • Changed access on Tcomms' external airlocks' buttons to be same as general Tcomms access
  • +
  • fixed the airless tiles in Assembly Line's windows
  • +
+

KasparoVy updated:

+
    +
  • Adds improved Vox mask/goggle sprites.
  • +
  • Adds Vox-compatible versions of most suits.
  • +
  • Adds species-fitting and icon override handling to clothing accessories and suit collars.
  • +
  • You can now open/close Clown Officer and Soldier coats.
  • +
  • Adds by-species tail hiding.
  • +
  • Tidies up and refactors the way the Captain's space helmet shows Vox hair but hides every other species'.
  • +
  • Reactive armour's sprite will now update as soon as you turn it on/off or EMP it.
  • +
+

Krausus updated:

+
    +
  • Fixed borers dying in hosts who happened to be somewhere cold, such as space. Even if their host was in a space suit.
  • +
  • Fixed borers forgetting to detach from a host when it died.
  • +
  • Fixed borers being able to assume control of a dead host.
  • +
  • Fixed dead borers in a host being able to speak with the host and ghosts.
  • +
  • Fixed employees starting every shift at least 3 minutes late. You aren't getting paid to stand around, people!
  • +
  • Fixed animal beatdowns being twice as noisy as they should be.
  • +
  • Pod lock busters should now properly bust pod locks.
  • +
  • The late-stage effects of the "sensory destruction" disease symptom should now properly destroy your senses.
  • +
  • Autotraitor should now continue picking new in-game traitors, instead of picking one and dying.
  • +
  • Lacking a head no longer makes you immune to becoming a husk or skeleton.
  • +
  • Security and medical records should probably stop crashing people.
  • +
  • Altering details on an Agent ID Card will now actually update what's seen when examining the card.
  • +
+

Kyep updated:

+
    +
  • Fixes NT Special Ops Officer's headset so he can correctly hear, and talk on, the Special Ops (deathsquad) channel.
  • +
  • Fixed oversight in keycard authentication devices that incorrectly treated trialmins like fullmins, resulting in situations where calling an ERT became impossible.
  • +
  • If an ERT request gets no answer for 5 minutes, admins now get a one time reminder that it was sent.
  • +
+

TheDZD updated:

+
    +
  • Burst fire selection is now a proc, as it was meant to be, rather than a verb.
  • +
+

TullyBurnalot updated:

+
    +
  • AI can no longer interact with IV Drips
  • +
  • Robots can no longer remove beakers/blood bags from IV Drips
  • +
  • Fixed clown door deconstruction
  • +
  • Fixed mime door deconstruction
  • +
+

02 July 2016

Fethas updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index cecfb4eff2a..3c913da0a8d 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1999,3 +1999,68 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: There's a new tab in the character setup screen, "loadouts". This allows you to spawn with a limited number of preset items. - tweak: 'Character setup now uses #defines for the different tabs.' +2016-07-07: + Ar3nn: + - tweak: Adds tech levels to RnD console main menu + FalseIncarnate: + - bugfix: Chicks no longer lose their souls (literally) when becoming adults. + - bugfix: Intercoms, fire alarms, and air alarms no longer contain internal portals + to a realm of infinite cables and circuit boards. + Fox McCloud: + - tweak: Space lube damage removed and duration reduced from 7 to 5 + - tweak: Azide and CLF3+Firefighting foam now play a bang sound when mixed + - rscadd: Can now pet pAI's with help intent + - bugfix: Fixes sechuds and nightvision sechuds having flash protection + FreeStylaLT: + - rscadd: Added windows and a missing firelock to Genetics/Cloning + - tweak: Tweaked layout of Genetics slightly + - rscadd: Added photocopier to R&D. + - tweak: Tweaked RD's office layout slightly + - tweak: Changed access on Tcomms' external airlocks' buttons to be same as general + Tcomms access + - bugfix: fixed the airless tiles in Assembly Line's windows + KasparoVy: + - imageadd: Adds improved Vox mask/goggle sprites. + - imageadd: Adds Vox-compatible versions of most suits. + - rscadd: Adds species-fitting and icon override handling to clothing accessories + and suit collars. + - rscadd: You can now open/close Clown Officer and Soldier coats. + - rscadd: Adds by-species tail hiding. + - tweak: Tidies up and refactors the way the Captain's space helmet shows Vox hair + but hides every other species'. + - bugfix: Reactive armour's sprite will now update as soon as you turn it on/off + or EMP it. + Krausus: + - bugfix: Fixed borers dying in hosts who happened to be somewhere cold, such as + space. Even if their host was in a space suit. + - bugfix: Fixed borers forgetting to detach from a host when it died. + - bugfix: Fixed borers being able to assume control of a dead host. + - bugfix: Fixed dead borers in a host being able to speak with the host and ghosts. + - bugfix: Fixed employees starting every shift at least 3 minutes late. You aren't + getting paid to stand around, people! + - bugfix: Fixed animal beatdowns being twice as noisy as they should be. + - bugfix: Pod lock busters should now properly bust pod locks. + - bugfix: The late-stage effects of the "sensory destruction" disease symptom should + now properly destroy your senses. + - bugfix: Autotraitor should now continue picking new in-game traitors, instead + of picking one and dying. + - bugfix: Lacking a head no longer makes you immune to becoming a husk or skeleton. + - bugfix: Security and medical records should probably stop crashing people. + - bugfix: Altering details on an Agent ID Card will now actually update what's seen + when examining the card. + Kyep: + - tweak: Fixes NT Special Ops Officer's headset so he can correctly hear, and talk + on, the Special Ops (deathsquad) channel. + - bugfix: Fixed oversight in keycard authentication devices that incorrectly treated + trialmins like fullmins, resulting in situations where calling an ERT became + impossible. + - tweak: If an ERT request gets no answer for 5 minutes, admins now get a one time + reminder that it was sent. + TheDZD: + - bugfix: Burst fire selection is now a proc, as it was meant to be, rather than + a verb. + TullyBurnalot: + - tweak: AI can no longer interact with IV Drips + - tweak: Robots can no longer remove beakers/blood bags from IV Drips + - bugfix: Fixed clown door deconstruction + - bugfix: Fixed mime door deconstruction diff --git a/html/changelogs/AutoChangeLog-pr-4852.yml b/html/changelogs/AutoChangeLog-pr-4852.yml deleted file mode 100644 index ca5e7c360c0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4852.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: FalseIncarnate -delete-after: True -changes: - - bugfix: "Chicks no longer lose their souls (literally) when becoming adults." - - bugfix: "Intercoms, fire alarms, and air alarms no longer contain internal portals to a realm of infinite cables and circuit boards." diff --git a/html/changelogs/AutoChangeLog-pr-4857.yml b/html/changelogs/AutoChangeLog-pr-4857.yml deleted file mode 100644 index aa0932f40bb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4857.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "Space lube damage removed and duration reduced from 7 to 5" diff --git a/html/changelogs/AutoChangeLog-pr-4860.yml b/html/changelogs/AutoChangeLog-pr-4860.yml deleted file mode 100644 index a73d8e3e94e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4860.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: FreeStylaLT -delete-after: True -changes: - - rscadd: "Added windows and a missing firelock to Genetics/Cloning" - - tweak: "Tweaked layout of Genetics slightly" - - rscadd: "Added photocopier to R&D." - - tweak: "Tweaked RD's office layout slightly" - - tweak: "Changed access on Tcomms' external airlocks' buttons to be same as general Tcomms access" - - bugfix: "fixed the airless tiles in Assembly Line's windows" diff --git a/html/changelogs/AutoChangeLog-pr-4861.yml b/html/changelogs/AutoChangeLog-pr-4861.yml deleted file mode 100644 index a8b51ba3041..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4861.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "Azide and CLF3+Firefighting foam now play a bang sound when mixed" diff --git a/html/changelogs/AutoChangeLog-pr-4867.yml b/html/changelogs/AutoChangeLog-pr-4867.yml deleted file mode 100644 index a428215d37e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4867.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: KasparoVy -delete-after: True -changes: - - imageadd: "Adds improved Vox mask/goggle sprites." - - imageadd: "Adds Vox-compatible versions of most suits." - - rscadd: "Adds species-fitting and icon override handling to clothing accessories and suit collars." - - rscadd: "You can now open/close Clown Officer and Soldier coats." - - rscadd: "Adds by-species tail hiding." - - tweak: "Tidies up and refactors the way the Captain's space helmet shows Vox hair but hides every other species'." - - bugfix: "Reactive armour's sprite will now update as soon as you turn it on/off or EMP it." diff --git a/html/changelogs/AutoChangeLog-pr-4869.yml b/html/changelogs/AutoChangeLog-pr-4869.yml deleted file mode 100644 index 9ba17868790..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4869.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: Krausus -delete-after: True -changes: - - bugfix: "Fixed borers dying in hosts who happened to be somewhere cold, such as space. Even if their host was in a space suit." - - bugfix: "Fixed borers forgetting to detach from a host when it died." - - bugfix: "Fixed borers being able to assume control of a dead host." - - bugfix: "Fixed dead borers in a host being able to speak with the host and ghosts." diff --git a/html/changelogs/AutoChangeLog-pr-4870.yml b/html/changelogs/AutoChangeLog-pr-4870.yml deleted file mode 100644 index 536ce2068ce..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4870.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Kyep -delete-after: True -changes: - - tweak: "Fixes NT Special Ops Officer's headset so he can correctly hear, and talk on, the Special Ops (deathsquad) channel." diff --git a/html/changelogs/AutoChangeLog-pr-4874.yml b/html/changelogs/AutoChangeLog-pr-4874.yml deleted file mode 100644 index 82b0746382f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4874.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Krausus -delete-after: True -changes: - - bugfix: "Fixed employees starting every shift at least 3 minutes late. You aren't getting paid to stand around, people!" diff --git a/html/changelogs/AutoChangeLog-pr-4875.yml b/html/changelogs/AutoChangeLog-pr-4875.yml deleted file mode 100644 index 061bed841c5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4875.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Ar3nn -delete-after: True -changes: - - tweak: "Adds tech levels to RnD console main menu" diff --git a/html/changelogs/AutoChangeLog-pr-4883.yml b/html/changelogs/AutoChangeLog-pr-4883.yml deleted file mode 100644 index d04e82d0b61..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4883.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Can now pet pAI's with help intent" diff --git a/html/changelogs/AutoChangeLog-pr-4887.yml b/html/changelogs/AutoChangeLog-pr-4887.yml deleted file mode 100644 index e5316661cb2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4887.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Krausus -delete-after: True -changes: - - bugfix: "Fixed animal beatdowns being twice as noisy as they should be." diff --git a/html/changelogs/AutoChangeLog-pr-4892.yml b/html/changelogs/AutoChangeLog-pr-4892.yml deleted file mode 100644 index e75ed2e3253..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4892.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: TheDZD -delete-after: True -changes: - - bugfix: "Burst fire selection is now a proc, as it was meant to be, rather than a verb." diff --git a/html/changelogs/AutoChangeLog-pr-4896.yml b/html/changelogs/AutoChangeLog-pr-4896.yml deleted file mode 100644 index e7fff21c3d5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4896.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: Krausus -delete-after: True -changes: - - bugfix: "Pod lock busters should now properly bust pod locks." - - bugfix: "The late-stage effects of the \"sensory destruction\" disease symptom should now properly destroy your senses." - - bugfix: "Autotraitor should now continue picking new in-game traitors, instead of picking one and dying." - - bugfix: "Lacking a head no longer makes you immune to becoming a husk or skeleton." diff --git a/html/changelogs/AutoChangeLog-pr-4900.yml b/html/changelogs/AutoChangeLog-pr-4900.yml deleted file mode 100644 index 9cb1d0bae54..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4900.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: TullyBurnalot -delete-after: True -changes: - - tweak: "AI can no longer interact with IV Drips" - - tweak: "Robots can no longer remove beakers/blood bags from IV Drips" diff --git a/html/changelogs/AutoChangeLog-pr-4905.yml b/html/changelogs/AutoChangeLog-pr-4905.yml deleted file mode 100644 index ba85782c277..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4905.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes sechuds and nightvision sechuds having flash protection" diff --git a/html/changelogs/AutoChangeLog-pr-4906.yml b/html/changelogs/AutoChangeLog-pr-4906.yml deleted file mode 100644 index 89997172467..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4906.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: TullyBurnalot -delete-after: True -changes: - - bugfix: "Fixed clown door deconstruction" - - bugfix: "Fixed mime door deconstruction" diff --git a/html/changelogs/AutoChangeLog-pr-4910.yml b/html/changelogs/AutoChangeLog-pr-4910.yml deleted file mode 100644 index 94574d183cb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4910.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Krausus -delete-after: True -changes: - - bugfix: "Security and medical records should probably stop crashing people." - - bugfix: "Altering details on an Agent ID Card will now actually update what's seen when examining the card." diff --git a/html/changelogs/AutoChangeLog-pr-4912.yml b/html/changelogs/AutoChangeLog-pr-4912.yml deleted file mode 100644 index 865ac6931dc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4912.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Kyep -delete-after: True -changes: - - bugfix: "Fixed oversight in keycard authentication devices that incorrectly treated trialmins like fullmins, resulting in situations where calling an ERT became impossible." - - tweak: "If an ERT request gets no answer for 5 minutes, admins now get a one time reminder that it was sent." From cee0f4185f18e58b0c7ec4f8c3b119b29c7a67c5 Mon Sep 17 00:00:00 2001 From: Chakirski Date: Thu, 7 Jul 2016 15:58:05 -0500 Subject: [PATCH 38/99] I can see! --- code/modules/clothing/glasses/glasses.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index bad4a3dabc5..dcbde3533fc 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -220,6 +220,7 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi' ) + prescription_upgradable = 1 /obj/item/clothing/glasses/sunglasses desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes." @@ -424,6 +425,7 @@ desc = "Used for seeing walls, floors, and stuff through anything." icon_state = "meson" origin_tech = "magnets=3;syndicate=4" + prescription_upgradable = 1 /obj/item/clothing/glasses/thermal/monocle name = "Thermoncle" @@ -499,4 +501,4 @@ desc = "Just who the hell do you think I am?!" name = "gar glasses" icon_state = "gar" - item_state = "gar" \ No newline at end of file + item_state = "gar" From adbc85a56b4621f9ad9c2b5d8d59fb43bb53a4e2 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Thu, 7 Jul 2016 18:47:56 -0400 Subject: [PATCH 39/99] Buildable Deep Fryers Deep fryers can now be built and upgraded with some minor assistance from science. - Board requires programming 2, just like the microwave and such - 2 micro lasers + 5 cables - Upgrading the lasers decreases the cook time :cl: rscadd: Deepfryers are no longer arcane mysteries, and can be (de)constructed and upgraded. /:cl: --- code/game/machinery/constructable_frame.dm | 10 +++++++ code/modules/food/cooker.dm | 17 ++++++++++++ code/modules/food/deep_fryer.dm | 26 ++++++++++++++++++ .../research/designs/machine_designs.dm | 10 +++++++ icons/obj/cooking_machines.dmi | Bin 9309 -> 4317 bytes 5 files changed, 63 insertions(+) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 4c820d26857..fae97ee9d5b 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -386,6 +386,16 @@ to destroy them and players will be able to make replacements. /obj/item/stack/cable_coil = 5, /obj/item/weapon/stock_parts/console_screen = 1) +/obj/item/weapon/circuitboard/deepfryer + name = "circuit board (Deep Fryer)" + build_path = /obj/machinery/cooker/deepfryer + board_type = "machine" + origin_tech = "programming=2" + frame_desc = "Requires 2 Micro Lasers and 5 pieces of cable." + req_components = list( + /obj/item/weapon/stock_parts/micro_laser = 2, + /obj/item/stack/cable_coil = 5) + /obj/item/weapon/circuitboard/gibber name = "circuit board (Gibber)" build_path = /obj/machinery/gibber diff --git a/code/modules/food/cooker.dm b/code/modules/food/cooker.dm index 40e04817209..6d4bdd3cd99 100644 --- a/code/modules/food/cooker.dm +++ b/code/modules/food/cooker.dm @@ -9,12 +9,14 @@ var/on = 0 var/onicon = null var/officon = null + var/openicon = null var/thiscooktype = null var/burns = 0 // whether a machine burns something - if it does, you probably want to add the cooktype to /snacks/badrecipe var/firechance = 0 var/cooktime = 0 var/foodcolor = null var/has_specials = 0 //Set to 1 if the machine has specials to check, otherwise leave it at 0 + var/upgradeable = 0 //Set to 1 if the machine supports upgrades / deconstruction, or else it will ignore stuff like screwdrivers and parts exchangers // checks if the snack has been cooked in a certain way /obj/machinery/cooker/proc/checkCooked(obj/item/weapon/reagent_containers/food/snacks/D) @@ -91,8 +93,23 @@ return type /obj/machinery/cooker/attackby(obj/item/I, mob/user, params) + if(upgradeable) + //Not all cooker types currently support build/upgrade stuff, so not all of it will work well with this + //Until we decide whether or not we want to bring back the cereal maker or old grill/oven in some form, this initial check will have to suffice + if(isscrewdriver(I)) + default_deconstruction_screwdriver(user, openicon, officon, I) + return + if(iscrowbar(I)) + default_deconstruction_crowbar(I) + return + if(istype(I, /obj/item/weapon/storage/part_replacer)) + exchange_parts(user, I) + return if(stat & (NOPOWER|BROKEN)) return + if(panel_open) + to_chat(user, "Close the panel first!") + return if (!checkValid(I, user)) return if(!burns) diff --git a/code/modules/food/deep_fryer.dm b/code/modules/food/deep_fryer.dm index 96e5fb94c57..07459f6f8f5 100644 --- a/code/modules/food/deep_fryer.dm +++ b/code/modules/food/deep_fryer.dm @@ -10,8 +10,34 @@ foodcolor = "#FFAD33" officon = "fryer_off" onicon = "fryer_on" + openicon = "fryer_open" has_specials = 1 + upgradeable = 1 +/obj/machinery/cooker/deepfryer/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/deepfryer(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) + component_parts += new /obj/item/stack/cable_coil(null, 5) + RefreshParts() + +/obj/machinery/cooker/deepfryer/upgraded/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/deepfryer(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null) + component_parts += new /obj/item/stack/cable_coil(null, 5) + RefreshParts() + +/obj/machinery/cooker/deepfryer/RefreshParts() + var/E = 0 + for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts) + E += L.rating + E -= 2 //Standard parts is 0 (1+1-2), Tier 4 parts is 6 (4+4-2) + cooktime = (200 - (E * 20)) //Effectively each laser improves cooktime by 20 per rating beyond the first (200 base, 80 max upgrade) /obj/machinery/cooker/deepfryer/gettype() var/obj/item/weapon/reagent_containers/food/snacks/deepfryholder/type = new(get_turf(src)) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 385969c3f3f..1938b08dc20 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -432,6 +432,16 @@ build_path = /obj/item/weapon/circuitboard/candy_maker category = list("Misc. Machinery") +/datum/design/deepfryer + name = "Machine Board (Deep Fryer)" + desc = "The circuit board for a Deep Fryer." + id = "deepfryer" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/deepfryer + category = list("Misc. Machinery") + /datum/design/orion_trail name = "Machine Board (Orion Trail Arcade Machine)" desc = "Allows for the construction of circuit boards used to build a new Orion Trail machine." diff --git a/icons/obj/cooking_machines.dmi b/icons/obj/cooking_machines.dmi index 10fee80e60d03994b32f4c9b754b44ea1490492a..9b3031ed5f8238bd2e0e54aeda15772da2df7fe7 100644 GIT binary patch literal 4317 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 LNkvXXu0mjf)Op4& literal 9309 zcmZvCXH-*B(=Js&>Ah)Cs?s}xCZH4r=?VhUrAtxigakyS8<8SCDAJ?^q)G`Lq$3?E zp(8awCW;xz^DFgHRzo0n?$=Q)BO5iX;p_fa-HUlL4kt%z%rY3*vajHV z*7_`R3?mzPBYine?EP`K$`T%yDP+(icK^4wyx0eJ060U4Pf`9n>O$AQ0h zv+0sK)>3-BdtCICtGQorvQ&gWh>!?(tTSH9QrC0z$<2F9#dC+7L4c(OZdKaeI{pwt&<2ieCDF);Lt?L}9i{S;a9E{r2$AEsGSRCAI1WF#)GNS(^v-a`Af zwg@nuz`Q6~H}{23FM;Cb)PpA81P4e3IG(Ha#nK9z6*Va^P~97#q4BVI-J5o@!D!Pt zZ7C$^#$h;mq7w9~i$i8tkMcg0h>0Zao)%#CBp+;RY74K4|HNaoenCi4xY(MlVtn&S zlnfWq7;l6`fGYX|kiUrMukaDT3vx_}ls;zLaC*av)$Uz`soMOj?{t?G zL%pZgLO9a%XTK@52$3P%{@+vE=LI+;2ROWe;H)Yap!x3CUN2Dq4#wCOF?!H4h`ca z$goaM8bIP=EkIyh`9&wX27`Aq#}>7^k$gIz;2={aiQ97IEMe*S3YPQLFCT`(yRv43} z;A!&Im)I4R*tGE9J*6aYt5owl4_V&$M7HHGlNt*m{!&qye@x$%Uuf<9+T~E$8UIe0 z9n-v)_b2{L!|5)$2&3xS7?CFXVs0gqbum&;?f!D7hAVJZKip0rI!whAXmtyf*5roq z#|6~od~_y--E~4#M}ud{8ae<5FK@eev;YJWC$R-o(dLAM1!XWm`!EqN!V}B)7T(qB zG_L$jm0_J`xQBQDtc`7{?D$H`Ku-_qHp-WcU5`wHjyddC-B)RL>rvXl5q%SA5vQ^*kXqEe4|b~P@aBHZn^F8aurVLd7e7M=%I z;Ewn*d+dCb{qP{5Q<**YteLC&a3H`&;d%J{WfBi`c=h(-S*6Ip&dUBlKs$*eCwQN5d%O^u?-ZymS23%{(R-?5``36Cc@x^qgtPCNyaU%^uB_afDe#A|L2DGY!?bZ1{#HjZ=i85TMZ*${J{Aq~@1Ptg zxM{IO_(enO`If1lPjAeX5tHkZ+n?2p_%CJeU>{B&e`c<``;i#7tnu<(6Zhl7*<_*U?890r z^Ne}hG{a0+MG4BfcQ;mES~msC#sfeLpL}bnT)P2fF2gx}_)5o~hTvBNXH`KQkX?|| zE&iGDdCrHvf&lV*j=AHWyaCv0@N)BeZP?V}t1qiDd0ANu zl)V>9+24$>nj2<+&GS6y1dME3${2uOh6XNIkkuDh=?oJNRyTf6E``2l;L%s_!)n)A zY(6XW1xo~*)0>_B4n9Y}y%^P#?!D1|Q}JT6+vE7Lgl}2F>&KL%LmP)W7`ZfbGw2!* ztmr&TVN$cjjqc^lcc=1Qak`vZ@z&-hi6NfTHj*cm7&4h0)wd*8cu*41t zB?gMgl!XhwTo}^dRs{TLvsB+vUJht9EKd4qFLD300R~T=n zl0<o%1Igry!-?ezL9rTM^SE%m(NpZ3#^c7mrLG z&X7a8#E(NJpT|aQc6#>dLDkno`g^8!$&UuNA`)pk;|-@azY!}4yrHj{@#|qu6`G)a4WR; zMjUb@55$Lt`j0e9b)8GD@i7*$bCvhHQBQ*P4;4ahcNhXE!LQ=K51C&P%1ceEB}cuL zjD5tOpBk2+=^>^r2vw-j5OSj8Np&HFZr%ty5-JHX(q@PX|uUr=4NxC^~-g_ zSqT5E{fS{0s%CGla*c^rZ7d(8kC}icoC56nl5a{*H|5<-;CE+mj#f;{!kHRA8VTNi za?Gdn;zMRa|0n5BpbcKCmzk)oc{4IJS=Nt@_?yU_=+eoLVo!Y^n#9GYPO(<#LtA|T zZwmqsF~9zaU1$nA{Bzx)_(WJ)U$6M!PKw#?6LvnKd5&CKBkSAg4NvsFi2vemeZSkUXV$AxzZ|#vM&ny(e2(RQ zEYumt(+|#b8s8paO%c<5X;JgklkNlIV7Z42-c-MqI;4AD{hg4dvk?3EPL&{1X8)m# z(6u~K=~s$+*2Uy*u4x3^a@Q2Juc>W(Udg|Ui^|q*^s>H<@g3($Cn1wcgu7+f4vb40 z$mpPA%}HZCPED=|=ol!ZFpya7thQWc8OvXZ-jkc@|4wq_ClS{TJoL+4I56S1nZbm2 zkZFQ`^P`9$(%01nj1BCl;tSud6#OcH+X^viZb-NBAnY*x1n1w5G8L`)Fn>%n$VJoG zM6ZW_YY(l%ehtXm+<1Oh1Jmr@mSzD0u?)Ad*j13-R(Tr6&o80Q$jHbkK%+xX&7BP5 z#dNf7&}uMnzx_MysIy|OzlpCuVB1PssryGMtT>c_&s4lJy_bchGd|Y9=E;Hrkx2tv zTAeX)W6DcQux`=`Gocukdc9!ANZPybQY51bw zLqs>z8^aeFya)1B(Klq(%8Gn*46dd<954`l8 znc!cX&dd1YzL51H>wC?Cva+sxtl8TGbTWI2BT#&Q)&3$vBs0T{=<{a9*M1h72aIoU z?w`Q-|E%Z%)@I{&_q%@UFamI2_KSJk-I*_`Z4l0x%yoZ0Gkv!3P_?WroJg3;caNsK zU6>Bu-mJ!sTtL@$H4|4eV!>*g?X?#UDxvAgV?I$Jit^wsvuSfnUNR`vqsYsFq?9sD zD{0`Eywb6JFUxjfoN9vdlKT8)S%aE`a<!Ym%t^>i`oC$nmk7AGzgj-F^Y|AGxglbJ{M5xm2YH6rH(pYGOqZ%?A3M(rO4*SdWT8ynp8KLH-5;7+ltVoy!)jtSsl9jEg0UIMi{3s9-H; z-@MeXdw;0<`k-doZJkAr2WWtQ8?4#m{U7Oddo7A@BI!#lhbY9$!CGM&IFc-Wu&kWU z4sRNr!5TUuymnoA=clYUSyMU>E>z9#_gCZpzF6#{Yh{S0?9V$ zuG(p9!z}C$L)-rn=rmV8L_`SElD;JTm~=G2w(8PzsLHxL3IJ)}><(rbaDhC-zEc!9 z@1X9ty@=|P2|U7<4m;m#1_O65?xQXsudc!&6x3zX{bw&?5thUQTcTVtSfBj&flhxQ zN4nFifgLTK6gRNg8)P{EjeX9{`*`2MEt_IH=8PtpiFUa`8t>*}v)tbUXf(K8Y zn0v&2=u~!ptZ%c|VphPp5tDAKM|IXt%LUqSqE#l$48#tLBeQ8UVE1?fPmf3T;oeRY z5HaLggQ`Bu@`iWlIZaT@g=KmckT0e+28&-69Y}tQ`@_UV4Ov-G)dH()bs zQRpMiYsf6Fy-PUEpA295WOrZ&Bl6S+XZQl*kbHHXE&`Cnz~?{I+qi;wGRA$}R;~F4 zUPhmT9W-23#RlugK09gp16%*f^KqEy>$P7zxou`9d67`wyT@b#VAguDoCIqT0c z(}GZ(=5$LZ;R1<;%Sw(qA+~PCy9C;Kv<`8LY)QoT19Bx9y2zjPf``)36i5%vLV{ zx3QdQHc?%;%YD?)!daD~Eta8rBJkqHBGLC=a0yAudH|v{xloyd>wW+YKK_W4iaQ!) zr>(!<2`Fol^|+gA-bVBth)O%7d{@A<`jUH|y_Fa^z@!C`ad9|_as*Qra*Wij8@ecV~yG2fTj1 z$Ru{@yh9d_BkosGk@8Sdw5Suq&ho>o@?%anNhlF`S@cMkTzT;y`|KaeS3axmmO&|Q zE8Q;SubvKpuW(BI%mBHKe&qydGAjbFeCRM)&---p&GvqH`lttsX5ui#Y6XW^v%kz9 zm{TBXZ6vri3C?7w6Z4nO9+)|qChPdfNq2pg`Co)Gg%qJ!B0{f&JaUT;W&kp8@iH`f zGzk>3lq`_u?(6R06Pf|}%DJGa)l%NGF0LHOiiY_4R;!X~IV*Q|BR7q}C$k%rE&sPn z;(W@P%SCj(!X>4Ut>g-=&m|nlWt1@u8+ZC*M?z!>pLJ4DssVfS-YoJ(lFAf-O)aS4yqLoD;cvr0 z4)ye*-mb2qS4PWeWibpT-%OB*V#L(0UWhT<^_Hzsg%+YF7WCh(Z00XHA!J7sQ*X=ZkAl(fwDRtslK-q`04Hd^4D3C@ z7_Ls8>SI0&Jp+@DnW3M?$1eRG8rYS2Og4=rQpx{|1dx6FYQS7^^kvG(YJbnrci8w; zmaYKozP-8J=QAm2i*{gM_wdcuqVuZsVmiW6kKloQRaNcD6D_-~Kl6>S(E$ZZZ9}jc zvG$iS=tIuy4&p232s7g)(SdQG@rjGP={ar<7PZWG=c^^>l^EFD0**|j=IqxzmM}}O z%di5a&VJ(06x?x!uknFPzc8>_B!7w+XhR)~sHjNsBsT#>XV^VHTLHJ^Xh*Y>Li^>R z%UEn~GhGv>?XdJw)Vsk8NAZ<}QmMoi<<$X4YY3gL>CRE8v7rQxJFoi5M88U=6;fC*8e$+!#(iK{^Vp{CPob8`)f)h`!eX1DTN zL{f+el2(sC(L>Iv+_XlBfgRtp8>N7adGNIKit(QKfd3+BKaL6?MPt;r98MdF{rd}h zDI?(Wl4s)e!f%Q&#{}}oxDow?gjywH+&tCPfK&gY!nj6|fOesQ`Oi<+=b|ZTPSlY2 z-1jMdy^!PoqH04Q&^daZ=wc>vsaq#U{92I!E2z3MF64BN!8hckLiLwr)iwE8&+(!R z-?)3MukLqn&JwQWcN#K?IHG7gs0ZFEpX^canV>4A$MMFp>@{i(gFSIqr|#LWneOV$ zs-t%IX8K=91J5M7J^G!RDf7AN3>guNG) zZd3`<*G$7b-7faHFG0JrFSx|?hpXk=x69YEgPHCec7j{K9L()eJsaJYd`Qh9b6AsT z(f)*s*@iyFaWKlE!$%LiRrC*D<2A_#wkC`S3$i(^&juA~^aci29sUPilX3@7rF-fNJp>IBv~2)f=Le!t&-y;S%W!`D5UhYa%A16X(4 zW`Tp4)ZN`P;JY}u^B8-VOB8?ys@{T)y7Ww(0GEzq(xMf;_0`=q>9G*-V^!GxE!Qxu zohuDIPvaat7r?cdAA4nF@{HegxM3`OSw7Y}z8 zk4a~S(IlL>Tfbw`3Cae3W1|6{Q#SkzSg{uJYQEE(V5FS6`Skgo%YCzMN8}ZKBT`0` zV-U*P$(8~`Q%#6B5AMZ{(KxNNxaxew0(sjFOvMd|KK%S%TI~kwuqqHg zjgB2feBGjIpTt z6C3b9O@~XaMV+FtG`>*WjlabMuEw`|F7$L>RNAz$yiFD$e`!8X_2s?v_8z}D8)^%} z3hhBZanq{e6xPzaJO)PKvUNiF7|R2JafX<(Lr=O9eP}hw%g>V3l*^*FJo-ON2_qSW zJDzJ8Kr1fQG8)8^98OTfg0ay0H}qOxOAy?bLge;(KU(CW6J*u#U8`udtPhY_ZU7rR zD%uZuJbx)fDDfDed~eydcpoLXBQ@NEYF-T}J5$~Hq-h4+!E474doe2EY-Lv(MI=C|{x3 zF=e#a1pzbBBFRfUU?olmcTdo;)^JCFI3nwhwd^z-@crR8T;L%*81FJL?1(HYyzay6 z1XXdrXICc5RP-RUVSU{>P1T;`h5qp|BY#QKr>+QCglzSkZ*k0MS*dCXz&=V^DSUr* z1=&Y=eVaG=m(pq+28z#f#jJ&=oe5juSMh5(q&au7bkVx#hIGw<;nP9v%l#<92z}lM zZN|fqaVNJZB~`kB00xRgtWVHRa-8VMRxcNB3qtiCxJ*W?)Kc8pb<+uw1#kkshb)uP zGuB6gSph@dKvJ{qe^Mq{LH0_RoKP@p4m2IFtB0au$M;)QRAcf!7_WOvqIvJX`%Pj)7&S2N ziJbV!1!)(<^t8bT#dd;q=OmokuNEh*cV^xbzZ#2fQ1bk0iHy1vdOlvfTCKz6T2jea zhcoM70G?oOR%CwWx*L-4h%q(!Q%9*q)t#ld6{fA$*!Ekf$7~9H#203A441DY)Y|r_ zJ)`RPJS)%fK3(0;Z#-L$bE<4UBA$x;Q|NW z7)DQ)@u@osJ_^A(rTK*9d(?zkLE^m*WRu|1KkmJ@XvX1Mm4#dD&pR~S!?dzS6DEiA zsZRNoG$L_oCKSHnf&i(9C*d&N7cBQ?*R{I`?< z@;?%3k2G2Rk((l}S@@-Wa@}u1vZ=-H_2UDpLdQYrGBE9-9WNN?#pJhJuJcPm62bYv z!Ib4EPb}F5q|izz_xj$cZ*K9O>Ul8IhS=?%5thbj7KUW18}@zrbPha;+r?S4Uuxp{ z@B*jM&C&eCHNML-oMc$sFn^>#Lc}KCH zbTj>@65B;HNufjA8Kf0)ZfRxA=Lplazh?zC1Fqbyw82D7UkG?;NaN`8KDN5)e?)9{ zRht$(a;u!B@#%mY4Wh?t?!UvzcpTJ zG`#^Y4)e+0_;`-?qbJprMx=@;B7*v7TN}md;-Ve-E1$nOrOKPX)s8G^2yZk_>N)k` zRWOuX|D}vfh6URFhGkInm<{wF>g3^Y>%-mW02}0=o(J9{J?8h9kM3jr-+=@N13KWc zKIB`tJii9FJN&6~7N_1|4%OspQ~a+5JaT^eLNDD{)2JG(hyv{`?orA)JZ3K zis%@vXs7WoLwcyE*oqh*e#PicG!M~LS+j=(XoH%-)j=H;x$BvmmfVAeWZh0Ud4tS3 zp}5g2(C*fM#U)H0r0^GsA!!aqQM<0fM3^+25_e&#SuHAP{7m3QNB`8JOIG^Ub__9| zi_uIxwDn=q$GqI+_ZgKz!hbsg{Dcm2T7Dm9!Y?t*5`MkP^RVwfOV@xL*Tr1_?kv|= ztX(E}Bq%c#`vIYdy7HI57L@%2GC~CVdyF)Byy@~ksNGeLZqj=`S&F}RFEgv`r>f3gTCqV$jd7IKb|dXhqHXFL~7h|+`I Vu!+D9(r-g#548+5%kSB}`9Gfi0;K=| From 7972dbff3274bc9ec5199e2057d4311dddf6b243 Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Fri, 8 Jul 2016 00:37:37 +0100 Subject: [PATCH 40/99] Adds Posterior Burning - Photocopiers can now be emagged; - Photocopiers deal 20 Burn damage to any mob attempting to fax their posterior --- code/modules/paperwork/photocopier.dm | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index d4a2ad141cb..4096b139e78 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -228,7 +228,18 @@ var/icon/temp_img if(!check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. return - + if(emagged) + if(ishuman(ass)) + var/mob/living/carbon/human/H = ass + to_chat(ass,"Something smells toasty...") + var/obj/item/organ/external/G = H.get_organ("groin") + G.take_damage(0, 20) + sleep(20) + ass.emote("scream") + if(!ishuman(ass)) + var/mob/living/H = ass + to_chat(ass,"Something smells toasty...") + H.apply_damage(20, BURN) if(ishuman(ass)) //Suit checks are in check_ass var/mob/living/carbon/human/H = ass temp_img = icon('icons/obj/butts.dmi', H.species.butt_sprite) @@ -310,6 +321,13 @@ else return 1 +/obj/machinery/photocopier/emag_act(user as mob) + if(!emagged) + emagged = 1 + to_chat(user,"You overload the photocopier's laser printing mechanism.") + else + to_chat(user,"The photocopier's laser printing mechanism is already overloaded!") + /obj/item/device/toner name = "toner cartridge" icon_state = "tonercartridge" From ba8844af854dcccd882d7c1d515863cc58b7aa99 Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Fri, 8 Jul 2016 00:55:35 +0100 Subject: [PATCH 41/99] Fix to DZD's suggestions - Sleep(20) changed to Spawn(20) - Needless code removed - Damage upgraded to 30 Burn --- code/modules/paperwork/photocopier.dm | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 4096b139e78..a41c4d487f5 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -233,13 +233,12 @@ var/mob/living/carbon/human/H = ass to_chat(ass,"Something smells toasty...") var/obj/item/organ/external/G = H.get_organ("groin") - G.take_damage(0, 20) - sleep(20) - ass.emote("scream") - if(!ishuman(ass)) - var/mob/living/H = ass + G.take_damage(0, 30) + spawn(20) + ass.emote("scream") + else to_chat(ass,"Something smells toasty...") - H.apply_damage(20, BURN) + ass.apply_damage(30, BURN) if(ishuman(ass)) //Suit checks are in check_ass var/mob/living/carbon/human/H = ass temp_img = icon('icons/obj/butts.dmi', H.species.butt_sprite) From 94510342a52e1f8db05ec6eed2dcc021a84541f3 Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Fri, 8 Jul 2016 01:24:47 +0100 Subject: [PATCH 42/99] Fixed last line of templates Adding "Do Not Reply" could have been confusing to people receiving faxes, so it was stricken. Courtesy of Kyep/Kyet/Tzo(?) for pointing this out. --- code/modules/admin/topic.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 6dbb6359ebb..ddbcf3eb052 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1762,15 +1762,15 @@ var/stype = input(src.owner, "Which type of standard reply do you wish to send to [H]?","Choose your paperwork", "") as null|anything in stypes var/tmsg = "



    NanoTrasen Science Station Cyberiad


    NAS Trurl Communications Department Report


    " if(stype == "Handle it yourselves!") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

    Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention.

    This is an automatic message.

    Do not reply.
    " + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

    Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention.

    This is an automatic message." else if(stype == "Illegible fax") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

    Your fax's grammar, syntax and/or typography are of a sub-par level and do not allow us to understand the contents of the message.

    Please consult your nearest dictionary and/or thesaurus and try again.

    This is an automatic message.

    Do not reply.
    " + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

    Your fax's grammar, syntax and/or typography are of a sub-par level and do not allow us to understand the contents of the message.

    Please consult your nearest dictionary and/or thesaurus and try again.

    This is an automatic message." else if(stype == "Fax not signed") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

    Your fax has not been correctly signed and, as such, we cannot verify your identity.

    Please sign your faxes before sending them so that we may verify your identity.

    This is an automatic message.

    Do not reply.
    " + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

    Your fax has not been correctly signed and, as such, we cannot verify your identity.

    Please sign your faxes before sending them so that we may verify your identity.

    This is an automatic message." else if(stype == "Not Right Now") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

    Due to pressing concerns of a matter above your current paygrade, we are unable to provide assistance in whatever matter your fax referenced.

    This can be either due to a power outage, bureaucratic audit, pest infestation, Ascendance Event, corgi outbreak, or any other situation that would affect the proper functioning of the NAS Trurl.

    Please try again later.

    This is an automatic message.

    Do not reply.
    " + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

    Due to pressing concerns of a matter above your current paygrade, we are unable to provide assistance in whatever matter your fax referenced.

    This can be either due to a power outage, bureaucratic audit, pest infestation, Ascendance Event, corgi outbreak, or any other situation that would affect the proper functioning of the NAS Trurl.

    Please try again later.

    This is an automatic message." else if(stype == "You are wasting our time") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

    In the interest of preventing further mismanagement of company resources, please avoid wasting our time with such petty drivel.

    Do kindly remember that we expect our workforce to maintain at least a semi-decent level of proffesionalism. Do not test our patience.

    This is an automatic message.

    Do not reply.
    " + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

    In the interest of preventing further mismanagement of company resources, please avoid wasting our time with such petty drivel.

    Do kindly remember that we expect our workforce to maintain at least a semi-decent level of proffesionalism. Do not test our patience.

    This is an automatic message." else return tmsg += "
    " From dba4ed1f3aa954078f63f48f51f1c050da4f6978 Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Fri, 8 Jul 2016 01:31:06 +0100 Subject: [PATCH 43/99] Fixes Tiger's suggestions - 2 instances of "ass" changed to "H" --- code/modules/paperwork/photocopier.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index a41c4d487f5..6b970de4ca1 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -231,11 +231,11 @@ if(emagged) if(ishuman(ass)) var/mob/living/carbon/human/H = ass - to_chat(ass,"Something smells toasty...") + to_chat(H,"Something smells toasty...") var/obj/item/organ/external/G = H.get_organ("groin") G.take_damage(0, 30) spawn(20) - ass.emote("scream") + H.emote("scream") else to_chat(ass,"Something smells toasty...") ass.apply_damage(30, BURN) From 14cfc90ff9e507cb70eaeec9c279388987871c68 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 7 Jul 2016 21:17:03 -0400 Subject: [PATCH 44/99] TG Hit Reaction Port+Armor Fixes --- code/__DEFINES/combat.dm | 7 ++ code/__DEFINES/flags.dm | 7 +- .../gamemodes/changeling/powers/mutations.dm | 7 +- .../miniantags/abduction/abduction_gear.dm | 4 +- .../machinery/computer/HolodeckControl.dm | 10 +- code/game/objects/items.dm | 12 +- code/game/objects/items/toys.dm | 3 +- .../objects/items/weapons/alien_specific.dm | 1 - .../objects/items/weapons/flamethrower.dm | 14 ++- .../items/weapons/grenades/chem_grenade.dm | 5 + .../objects/items/weapons/holy_weapons.dm | 21 ++-- .../objects/items/weapons/melee/energy.dm | 11 +- code/game/objects/items/weapons/shields.dm | 24 ++-- code/game/objects/items/weapons/staff.dm | 4 +- code/game/objects/items/weapons/stunbaton.dm | 2 +- .../objects/items/weapons/swords_axes_etc.dm | 2 +- code/game/objects/items/weapons/twohanded.dm | 19 +-- code/game/objects/items/weapons/weaponry.dm | 14 +-- code/modules/clothing/suits/armor.dm | 107 ++++++++++++++--- code/modules/clothing/under/jobs/civilian.dm | 3 + code/modules/customitems/item_defines.dm | 2 +- code/modules/hydroponics/trays/tray_tools.dm | 3 +- code/modules/martial_arts/martial.dm | 9 +- .../carbon/alien/humanoid/caste/hunter.dm | 26 ++-- code/modules/mob/living/carbon/human/human.dm | 23 ++-- .../living/carbon/human/human_attackhand.dm | 5 +- .../mob/living/carbon/human/human_defense.dm | 113 +++++++----------- code/modules/mob/living/living_defense.dm | 51 ++++---- .../living/simple_animal/hostile/illusion.dm | 75 ++++++++++++ .../living/simple_animal/hostile/syndicate.dm | 1 + .../mob/living/simple_animal/simple_animal.dm | 1 + icons/effects/effects.dmi | Bin 322480 -> 332388 bytes paradise.dme | 1 + 33 files changed, 356 insertions(+), 231 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/hostile/illusion.dm diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index ca293307099..a05575f575d 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -54,6 +54,13 @@ #define AI_IDLE 2 #define AI_OFF 3 +//Attack types for checking shields/hit reactions + +#define MELEE_ATTACK 1 +#define UNARMED_ATTACK 2 +#define PROJECTILE_ATTACK 3 +#define THROWN_PROJECTILE_ATTACK 4 + //Gun Stuff #define SAWN_INTACT 0 #define SAWN_OFF 1 diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index e79d40f7176..0562d7086ab 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -4,10 +4,9 @@ #define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message with the default handler #define AIRTIGHT 8 // mask allows internals #define HANDSLOW 16 // If an item has this flag, it will slow you to carry it -#define NOSHIELD 32 // weapon not affected by shield -#define CONDUCT 64 // conducts electricity (metal etc.) -#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way -#define ON_BORDER 256 // item has priority to check when entering or leaving +#define CONDUCT 32 // conducts electricity (metal etc.) +#define ABSTRACT 64 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way +#define ON_BORDER 128 // item has priority to check when entering or leaving #define GLASSESCOVERSEYES 1024 #define MASKCOVERSEYES 1024 // get rid of some of the other retardation in these flags diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index f4d628deebd..765fbd0a5e1 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -206,6 +206,7 @@ flags = NODROP icon = 'icons/obj/weapons.dmi' icon_state = "ling_shield" + block_chance = 50 var/remaining_uses //Set by the changeling ability. @@ -217,17 +218,17 @@ /obj/item/weapon/shield/changeling/dropped() qdel(src) -/obj/item/weapon/shield/changeling/IsShield() +/obj/item/weapon/shield/changeling/hit_reaction() if(remaining_uses < 1) if(ishuman(loc)) var/mob/living/carbon/human/H = loc - H.visible_message("With a sickening crunch, [H] reforms his shield into an arm!", "We assimilate our shield into our body", "With a sickening crunch, [H] reforms his shield into an arm!", "We assimilate our shield into our body", "[owner] blocks [attack_text] with [src]!") + return 1 + return 0 + /obj/item/proc/talk_into(mob/M as mob, var/text, var/channel=null) return @@ -374,9 +383,6 @@ /obj/item/proc/ui_action_click() attack_self(usr) -/obj/item/proc/IsShield() - return 0 - /obj/item/proc/IsReflect(var/def_zone) //This proc determines if and at what% an object will reflect energy projectiles if it's in l_hand,r_hand or wear_suit return 0 diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 6c0cf78de6e..52fa28f58eb 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -141,7 +141,6 @@ item_state = "sword0" var/active = 0.0 w_class = 2.0 - flags = NOSHIELD attack_verb = list("attacked", "struck", "hit") /obj/item/toy/sword/attack_self(mob/user as mob) @@ -199,7 +198,7 @@ origin_tech = null attack_verb = list("attacked", "struck", "hit") -/obj/item/weapon/twohanded/dualsaber/toy/IsShield() +/obj/item/weapon/twohanded/dualsaber/toy/hit_reaction() return 0 /obj/item/weapon/twohanded/dualsaber/toy/IsReflect()//Stops Toy Dualsabers from reflecting energy projectiles diff --git a/code/game/objects/items/weapons/alien_specific.dm b/code/game/objects/items/weapons/alien_specific.dm index e4f6bcd7a75..c487af03cd6 100644 --- a/code/game/objects/items/weapons/alien_specific.dm +++ b/code/game/objects/items/weapons/alien_specific.dm @@ -14,7 +14,6 @@ throw_range = 5 w_class = 2 w_class_on = 2 - flags = NOSHIELD attack_verb = list("attacked", "slashed", "gored", "sliced", "torn", "ripped", "butchered", "cut") attack_verb_on = list() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 75c1b030ed4..10394b2e236 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -191,10 +191,10 @@ return -/obj/item/weapon/flamethrower/proc/ignite_turf(turf/target) +/obj/item/weapon/flamethrower/proc/ignite_turf(turf/target, release_amount = 0.05) //TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this... //Transfer 5% of current tank air contents to turf - var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(0.05) + var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount) air_transfer.toxins = air_transfer.toxins * 5 // This is me not comprehending the air system. I realize this is retarded and I could probably make it work without fucking it up like this, but there you have it. -- TLE target.assume_air(air_transfer) //Burn it based on transfered gas @@ -218,4 +218,12 @@ /obj/item/weapon/flamethrower/full/tank/New(var/loc) ..() ptank = new /obj/item/weapon/tank/plasma/full(src) - update_icon() \ No newline at end of file + update_icon() + +/obj/item/weapon/flamethrower/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type) + if(ptank && damage && attack_type == PROJECTILE_ATTACK && prob(15)) + owner.visible_message("[attack_text] hits the fueltank on [owner]'s [src], rupturing it! What a shot!") + var/target_turf = get_turf(owner) + ignite_turf(target_turf, 100) + qdel(ptank) + return 1 //It hit the flamethrower, not them \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index a951f1ade8f..f130f61b7a8 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -102,6 +102,11 @@ spawn(det_time) prime() +/obj/item/weapon/grenade/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type) + if(damage && attack_type == PROJECTILE_ATTACK && prob(15)) + owner.visible_message("[attack_text] hits [owner]'s [src], setting it off! What a shot!") + prime() + return 1 //It hit the grenade, not them /obj/item/weapon/grenade/chem_grenade/attackby(obj/item/I, mob/user, params) if(istype(I,/obj/item/weapon/hand_labeler)) diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index b56e103233e..ada15a3b108 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -76,9 +76,7 @@ w_class = 5 force = 5 slot_flags = SLOT_BACK - -/obj/item/weapon/nullrod/staff/IsShield() - return 1 + block_chance = 50 /obj/item/weapon/nullrod/staff/blue name = "blue holy staff" @@ -92,16 +90,16 @@ desc = "A weapon fit for a crusade!" w_class = 4 slot_flags = SLOT_BACK|SLOT_BELT + block_chance = 30 sharp = 1 edge = 1 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") -/obj/item/weapon/nullrod/claymore/IsShield() - if(prob(30)) - return 1 - else - return 0 +/obj/item/weapon/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type) + if(attack_type == PROJECTILE_ATTACK) + final_block_chance = 0 //Don't bring a sword to a gunfight + return ..() /obj/item/weapon/nullrod/claymore/darkblade icon_state = "cultblade" @@ -333,6 +331,7 @@ desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts, now used to harass the clown." w_class = 4 force = 15 + block_chance = 40 slot_flags = SLOT_BACK sharp = 0 edge = 0 @@ -342,12 +341,6 @@ icon_state = "bostaff0" item_state = "bostaff0" -/obj/item/weapon/nullrod/claymore/bostaff/IsShield() - if(prob(40)) - return 1 - else - return 0 - /obj/item/weapon/nullrod/tribal_knife icon_state = "crysknife" item_state = "crysknife" diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 45b2f1f7452..79cad015653 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -62,7 +62,7 @@ w_class = 3 w_class_on = 5 hitsound = "swing_hit" - flags = CONDUCT | NOSHIELD + flags = CONDUCT armour_penetration = 100 origin_tech = "combat=3" attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") @@ -83,9 +83,9 @@ throw_speed = 3 throw_range = 5 hitsound = "swing_hit" - flags = NOSHIELD armour_penetration = 35 origin_tech = "magnets=3;syndicate=4" + block_chance = 50 sharp = 1 edge = 1 var/hacked = 0 @@ -95,9 +95,9 @@ if(item_color == null) item_color = pick("red", "blue", "green", "purple") -/obj/item/weapon/melee/energy/sword/IsShield() +/obj/item/weapon/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance) if(active) - return 1 + return ..() return 0 /obj/item/weapon/melee/energy/sword/cyborg @@ -133,7 +133,7 @@ ..() item_color = null -/obj/item/weapon/melee/energy/sword/cyborg/saw/IsShield() +/obj/item/weapon/melee/energy/sword/cyborg/saw/hit_reaction() return 0 /obj/item/weapon/melee/energy/sword/saber @@ -206,7 +206,6 @@ throw_speed = 3 throw_range = 1 w_class = 4//So you can't hide it in your pocket or some such. - flags = NOSHIELD armour_penetration = 50 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/datum/effect/system/spark_spread/spark_system diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index a161755c285..809bf0d298d 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -1,5 +1,6 @@ /obj/item/weapon/shield name = "shield" + block_chance = 50 /obj/item/weapon/shield/riot name = "riot shield" @@ -17,8 +18,10 @@ attack_verb = list("shoved", "bashed") var/cooldown = 0 //shield bash cooldown. based on world.time -/obj/item/weapon/shield/riot/IsShield() - return 1 +/obj/item/weapon/shield/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type) + if(attack_type == THROWN_PROJECTILE_ATTACK) + final_block_chance += 30 + return ..() /obj/item/weapon/shield/riot/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/melee/baton)) @@ -41,12 +44,7 @@ icon_state = "buckler" item_state = "buckler" materials = list() - -/obj/item/weapon/shield/riot/buckler/IsShield() - if(prob(60)) - return 1 - else - return 0 + block_chance = 30 /obj/item/weapon/shield/energy name = "energy combat shield" @@ -62,8 +60,8 @@ attack_verb = list("shoved", "bashed") var/active = 0 -/obj/item/weapon/shield/energy/IsShield() - return (active) +/obj/item/weapon/shield/energy/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance) + return 0 /obj/item/weapon/shield/energy/IsReflect() return (active) @@ -109,8 +107,10 @@ w_class = 3 var/active = 0 -/obj/item/weapon/shield/riot/tele/IsShield() - return (active) +/obj/item/weapon/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance) + if(active) + return ..() + return 0 /obj/item/weapon/shield/riot/tele/attack_self(mob/living/user) active = !active diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index 049339a1b01..793f384126e 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -8,7 +8,6 @@ throw_speed = 1 throw_range = 5 w_class = 2.0 - flags = NOSHIELD armour_penetration = 100 attack_verb = list("bludgeoned", "whacked", "disciplined") @@ -73,5 +72,4 @@ throwforce = 5.0 throw_speed = 1 throw_range = 5 - w_class = 2.0 - flags = NOSHIELD \ No newline at end of file + w_class = 2.0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 0f2fd65475e..6ab787e519f 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -134,7 +134,7 @@ /obj/item/weapon/melee/baton/proc/baton_stun(mob/living/L, mob/user) if(ishuman(L)) var/mob/living/carbon/human/H = L - if(H.check_shields(0, "[user]'s [name]")) //No message; check_shields() handles that + if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) //No message; check_shields() handles that playsound(L, 'sound/weapons/Genhit.ogg', 50, 1) return user.lastattacked = L diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 6af34367d75..844a6f68d54 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -53,7 +53,7 @@ if(cooldown <= 0) if(ishuman(target)) var/mob/living/carbon/human/H = target - if(H.check_shields(0, "[user]'s [name]")) + if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) return 0 playsound(get_turf(src), 'sound/effects/woodhit.ogg', 75, 1, -1) target.Weaken(3) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 1f808939f17..cf43a0b7bf4 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -120,14 +120,6 @@ /obj/item/weapon/twohanded/offhand/wield() qdel(src) -/obj/item/weapon/twohanded/offhand/IsShield()//if the actual twohanded weapon is a shield, we count as a shield too! - var/mob/user = loc - if(!istype(user)) return 0 - var/obj/item/I = user.get_active_hand() - if(I == src) I = user.get_inactive_hand() - if(!I) return 0 - return I.IsShield() - ///////////Two hand required objects/////////////// //This is for objects that require two hands to even pick up /obj/item/weapon/twohanded/required/ @@ -205,10 +197,10 @@ force_wielded = 34 wieldsound = 'sound/weapons/saberon.ogg' unwieldsound = 'sound/weapons/saberoff.ogg' - flags = NOSHIELD armour_penetration = 35 origin_tech = "magnets=3;syndicate=4" attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + block_chance = 75 sharp = 1 edge = 1 no_embed = 1 // Like with the single-handed esword, this shouldn't be embedding in people. @@ -238,11 +230,10 @@ user.dir = i sleep(1) -/obj/item/weapon/twohanded/dualsaber/IsShield() +/obj/item/weapon/twohanded/dualsaber/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance) if(wielded) - return 1 - else - return 0 + return ..() + return 0 /obj/item/weapon/twohanded/dualsaber/green/New() blade_color = "green" @@ -296,7 +287,6 @@ throw_speed = 3 armour_penetration = 10 no_spin_thrown = 1 // Thrown spears that spin look dumb. -Fox - flags = NOSHIELD attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") /obj/item/weapon/twohanded/spear/update_icon() @@ -371,7 +361,6 @@ force_wielded = 40 //you'll gouge their eye out! Or a limb...maybe even their entire body! wieldsound = 'sound/weapons/chainsawstart.ogg' hitsound = null - flags = NOSHIELD armour_penetration = 35 origin_tech = "materials=6;syndicate=4" attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 8ff2f931159..908cc1e2d80 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -50,13 +50,11 @@ edge = 1 w_class = 3 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + block_chance = 50 - IsShield() - return 1 - - suicide_act(mob/user) - to_chat(viewers(user), "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.") - return(BRUTELOSS) +/obj/item/weapon/claymore/suicide_act(mob/user) + user.visible_message("[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.") + return(BRUTELOSS) /obj/item/weapon/claymore/ceremonial name = "ceremonial claymore" @@ -77,6 +75,7 @@ w_class = 3 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + block_chance = 50 /obj/item/weapon/katana/cursed slot_flags = null @@ -85,9 +84,6 @@ user.visible_message("[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") return(BRUTELOSS) -/obj/item/weapon/katana/IsShield() - return 1 - /obj/item/weapon/harpoon name = "harpoon" sharp = 1 diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index ea811f68be6..f99837df127 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -222,30 +222,27 @@ //Reactive armor -//When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!) /obj/item/clothing/suit/armor/reactive - name = "Reactive Teleport Armor" - desc = "Someone seperated our Research Director from his own head!" - var/active = 0.0 + name = "reactive armor" + desc = "Doesn't seem to do much for some reason." + var/active = 0 icon_state = "reactiveoff" item_state = "reactiveoff" blood_overlay_type = "armor" - action_button_name = "Toggle Reactive Armor" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + action_button_name = "Toggle Reactive Armor" + unacidable = 1 + hit_reaction_chance = 50 -/obj/item/clothing/suit/armor/reactive/IsShield() - if(active) - return 1 - return 0 -/obj/item/clothing/suit/armor/reactive/attack_self(mob/user as mob) +/obj/item/clothing/suit/armor/reactive/attack_self(mob/user) active = !(active) if(active) - to_chat(user, "The reactive armor is now active.") + to_chat(user, "[src] is now active.") icon_state = "reactive" item_state = "reactive" else - to_chat(user, "The reactive armor is now inactive.") + to_chat(user, "[src] is now inactive.") icon_state = "reactiveoff" item_state = "reactiveoff" add_fingerprint(user) @@ -255,11 +252,91 @@ active = 0 icon_state = "reactiveoff" item_state = "reactiveoff" - - var/mob/living/carbon/human/user = usr - user.update_inv_wear_suit() ..() +//When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!) +/obj/item/clothing/suit/armor/reactive/teleport + name = "reactive teleport armor" + desc = "Someone seperated our Research Director from his own head!" + var/tele_range = 6 + +/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + var/mob/living/carbon/human/H = owner + owner.visible_message("The reactive teleport system flings [H] clear of [attack_text], shutting itself off in the process!") + var/list/turfs = new/list() + for(var/turf/T in orange(tele_range, H)) + if(istype(T, /turf/space)) + continue + if(T.density) + continue + if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.yThe [src] blocks the [attack_text], sending out jets of flame!") + for(var/mob/living/carbon/C in range(6, owner)) + if(C != owner) + C.fire_stacks += 8 + C.IgniteMob() + owner.fire_stacks = -20 + return 1 + return 0 + + +/obj/item/clothing/suit/armor/reactive/stealth + name = "reactive stealth armor" + +/obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, attack_text) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + var/mob/living/simple_animal/hostile/illusion/escape/E = new(owner.loc) + E.Copy_Parent(owner, 50) + E.GiveTarget(owner) //so it starts running right away + E.Goto(owner, E.move_to_delay, E.minimum_distance) + owner.alpha = 0 + owner.visible_message("[owner] is hit by [attack_text] in the chest!") //We pretend to be hit, since blocking it would stop the message otherwise + spawn(40) + owner.alpha = initial(owner.alpha) + return 1 + +/obj/item/clothing/suit/armor/reactive/tesla + name = "reactive tesla armor" + +/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, attack_text) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + owner.visible_message("The [src] blocks the [attack_text], sending out arcs of lightning!") + for(var/mob/living/M in view(6, owner)) + if(M == owner) + continue + owner.Beam(M,icon_state="lightning[rand(1, 12)]",icon='icons/effects/effects.dmi',time=5) + M.adjustFireLoss(25) + playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1) + return 1 //All of the armor below is mostly unused diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 5a7017b353a..68307875b1b 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -70,6 +70,9 @@ item_color = "clown" flags_size = ONESIZEFITSALL +/obj/item/clothing/under/rank/clown/hit_reaction() + playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1) + return 0 /obj/item/clothing/under/rank/head_of_personnel desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"." diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index fd4864b7900..86b3728be3c 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -92,7 +92,7 @@ sharp = 0 edge = 0 -/obj/item/weapon/claymore/fluff/IsShield() +/obj/item/weapon/claymore/fluff/hit_reaction() return 0 /obj/item/weapon/crowbar/fluff/zelda_creedy_1 // Zomgponies: Griffin Rowley diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index 9cb59b4f296..3fae45bea2e 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -313,7 +313,7 @@ throw_range = 3 w_class = 4 var/extend = 1 - flags = NOSHIELD | CONDUCT + flags = CONDUCT armour_penetration = 20 slot_flags = SLOT_BACK origin_tech = "materials=2;combat=2" @@ -339,7 +339,6 @@ throw_range = 3 w_class = 2.0 extend = 0 - flags = NOSHIELD armour_penetration = 20 slot_flags = SLOT_BELT origin_tech = "materials=3;combat=3" diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm index d128e22c0f6..0ca98c921d8 100644 --- a/code/modules/martial_arts/martial.dm +++ b/code/modules/martial_arts/martial.dm @@ -181,7 +181,7 @@ attack_verb = list("smashed", "slammed", "whacked", "thwacked") icon = 'icons/obj/weapons.dmi' icon_state = "bostaff0" - + block_chance = 50 /obj/item/weapon/twohanded/bostaff/update_icon() icon_state = "bostaff[wielded]" @@ -239,8 +239,7 @@ return ..() return ..() -/obj/item/weapon/twohanded/bostaff/IsShield() +/obj/item/weapon/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance) if(wielded) - return 1 - else - return 0 \ No newline at end of file + return ..() + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index a5e72059ab8..aff7b82bd03 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -85,7 +85,7 @@ leaping = 0 update_icons() -/mob/living/carbon/alien/humanoid/hunter/throw_impact(A) +/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/A) if(!leaping) return ..() @@ -93,20 +93,26 @@ if(A) if(istype(A, /mob/living)) var/mob/living/L = A - L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") - if(ishuman(L)) - var/mob/living/carbon/human/H = L - H.apply_effect(5, WEAKEN, H.run_armor_check(null, "melee")) - else - L.Weaken(5) - sleep(2)//Runtime prevention (infinite bump() calls on hulks) - step_towards(src,L) + var/blocked = 0 + if(ishuman(A)) + var/mob/living/carbon/human/H = A + if(H.check_shields(90, "the [name]", src, attack_type = THROWN_PROJECTILE_ATTACK)) + blocked = 1 + if(!blocked) + L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.apply_effect(5, WEAKEN, H.run_armor_check(null, "melee")) + else + L.Weaken(5) + sleep(2)//Runtime prevention (infinite bump() calls on hulks) + step_towards(src,L) toggle_leap(0) pounce_cooldown = !pounce_cooldown spawn(pounce_cooldown_time) //3s by default pounce_cooldown = !pounce_cooldown - else + else if(A.density && !A.CanPass(src)) visible_message("[src] smashes into [A]!", "[src] smashes into [A]!") weakened = 2 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1bc79c16242..bbaa9e40da0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -203,15 +203,14 @@ now_pushing = 0 return - if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot)) - if(prob(99)) - now_pushing = 0 - return - if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot)) - if(prob(99)) - now_pushing = 0 - return + //anti-riot equipment is also anti-push + if(tmob.r_hand && (prob(tmob.r_hand.block_chance * 2)) && !istype(tmob.r_hand, /obj/item/clothing)) + now_pushing = 0 + return + if(tmob.l_hand && (prob(tmob.l_hand.block_chance * 2)) && !istype(tmob.l_hand, /obj/item/clothing)) + now_pushing = 0 + return if(!(tmob.status_flags & CANPUSH)) now_pushing = 0 @@ -414,16 +413,16 @@ M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])") src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])") var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - if(check_shields(damage, "the [M.name]")) + if(check_shields(damage, "the [M.name]", null, MELEE_ATTACK, M.armour_penetration)) return 0 var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) - var/armor = run_armor_check(affecting, "melee") + var/armor = run_armor_check(affecting, "melee", armour_penetration = M.armour_penetration) var/obj/item/organ/external/affected = src.get_organ(dam_zone) if(affected) affected.add_autopsy_data(M.name, damage) // Add the mob's name to the autopsy data - apply_damage(damage,M.melee_damage_type, affecting, armor, M.name) + apply_damage(damage, M.melee_damage_type, affecting, armor) updatehealth() /mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L as mob) @@ -461,7 +460,7 @@ else damage = rand(5, 25) - if(check_shields(damage, "the [M.name]")) + if(check_shields(damage, "the [M.name]", null, MELEE_ATTACK)) return 0 var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 33cb567ba4a..f7839568a03 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -18,10 +18,9 @@ ..() - if((M != src) && check_shields(0, M.name)) + if((M != src) && M.a_intent != "help" && check_shields(0, M.name, attack_type = UNARMED_ATTACK)) add_logs(src, M, "attempted to touch") - M.do_attack_animation(src) - visible_message("\red [M] attempted to touch [src]!") + visible_message("[M] attempted to touch [src]!") return 0 if(istype(M.gloves , /obj/item/clothing/gloves/boxing/hologlove)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 3a935e5e449..c8bc136103c 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -32,7 +32,7 @@ emp_act return -1 // complete projectile permutation //Shields - if(check_shields(P.damage, "the [P.name]", P)) + if(check_shields(P.damage, "the [P.name]", P, PROJECTILE_ATTACK, P.armour_penetration)) P.on_hit(src, 100, def_zone) return 2 @@ -132,40 +132,24 @@ emp_act //End Here -/mob/living/carbon/human/proc/check_shields(var/damage = 0, var/attack_text = "the attack", var/obj/item/O) - if(O) - if(O.flags & NOSHIELD) //weapon ignores shields altogether - return 0 - if(l_hand && istype(l_hand, /obj/item/weapon))//Current base is the prob(50-d/3) - var/obj/item/weapon/I = l_hand - if(I.IsShield() && (prob(50 - round(damage / 3)))) - visible_message("[src] blocks [attack_text] with [l_hand]!", \ - "[src] blocks [attack_text] with [l_hand]!") +/mob/living/carbon/human/proc/check_shields(damage = 0, attack_text = "the attack", atom/movable/AM, attack_type = MELEE_ATTACK, armour_penetration = 0) + var/block_chance_modifier = round(damage / -3) + + if(l_hand && !istype(l_hand, /obj/item/clothing)) + var/final_block_chance = l_hand.block_chance - (Clamp((armour_penetration-l_hand.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example + if(l_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type)) return 1 - if(r_hand && istype(r_hand, /obj/item/weapon)) - var/obj/item/weapon/I = r_hand - if(I.IsShield() && (prob(50 - round(damage / 3)))) - visible_message("[src] blocks [attack_text] with [r_hand]!", \ - "[src] blocks [attack_text] with [r_hand]!") + if(r_hand && !istype(r_hand, /obj/item/clothing)) + var/final_block_chance = r_hand.block_chance - (Clamp((armour_penetration-r_hand.armour_penetration)/2,0,100)) + block_chance_modifier //Need to reset the var so it doesn't carry over modifications between attempts + if(r_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type)) return 1 - if(wear_suit && istype(wear_suit, /obj/item/)) - var/obj/item/I = wear_suit - if(I.IsShield() && (prob(50))) - visible_message("The reactive teleport system flings [src] clear of [attack_text]!", \ - "The reactive teleport system flings [src] clear of [attack_text]!") - var/list/turfs = new/list() - for(var/turf/T in orange(6, src)) - if(istype(T,/turf/space)) continue - if(T.density) continue - if(T.x>world.maxx-6 || T.x<6) continue - if(T.y>world.maxy-6 || T.y<6) continue - turfs += T - if(!turfs.len) turfs += pick(/turf in orange(6, src)) - var/turf/picked = pick(turfs) - if(!isturf(picked)) return - if(buckled) - buckled.unbuckle_mob() - src.loc = picked + if(wear_suit) + var/final_block_chance = wear_suit.block_chance - (Clamp((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier + if(wear_suit.hit_reaction(src, attack_text, final_block_chance, damage, attack_type)) + return 1 + if(w_uniform) + var/final_block_chance = w_uniform.block_chance - (Clamp((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier + if(w_uniform.hit_reaction(src, attack_text, final_block_chance, damage, attack_type)) return 1 return 0 @@ -221,7 +205,7 @@ emp_act if(user != src) user.do_attack_animation(src) - if(check_shields(I.force, "the [I.name]", I)) + if(check_shields(I.force, "the [I.name]", I, MELEE_ATTACK, I.armour_penetration)) return 0 if(istype(I,/obj/item/weapon/card/emag)) @@ -315,59 +299,52 @@ emp_act //this proc handles being hit by a thrown atom /mob/living/carbon/human/hitby(atom/movable/AM as mob|obj,var/speed = 5) - if(istype(AM,/obj/)) - var/obj/O = AM + if(istype(AM, /obj/item)) + var/obj/item/I = AM if(in_throw_mode && !get_active_hand() && speed <= 5) //empty active hand and we're in throw mode if(canmove && !restrained()) - if(isturf(O.loc)) - put_in_active_hand(O) - visible_message("[src] catches [O]!") + if(isturf(I.loc)) + put_in_active_hand(I) + visible_message("[src] catches [I]!") throw_mode_off() return var/zone = ran_zone("chest", 65) var/dtype = BRUTE - if(istype(O,/obj/item/weapon)) - var/obj/item/weapon/W = O + if(istype(I, /obj/item/weapon)) + var/obj/item/weapon/W = I dtype = W.damtype - var/throw_damage = O.throwforce*(speed/5) + var/throw_damage = I.throwforce*(speed/5) - /* - if(!zone) - visible_message("\blue \The [O] misses [src] narrowly!") - return - */ - O.throwing = 0 //it hit, so stop moving + I.throwing = 0 //it hit, so stop moving - if ((O.thrower != src) && check_shields(throw_damage, "[O]")) + if((I.thrower != src) && check_shields(throw_damage, "\the [I.name]", I, THROWN_PROJECTILE_ATTACK)) return var/obj/item/organ/external/affecting = get_organ(zone) if(!affecting) - var/missverb = (O.gender == PLURAL) ? "whizz" : "whizzes" - visible_message("\The [O] [missverb] past [src]'s missing [parse_zone(zone)]!", - "\The [O] [missverb] past your missing [parse_zone(zone)]!") + var/missverb = (I.gender == PLURAL) ? "whizz" : "whizzes" + visible_message("\The [I] [missverb] past [src]'s missing [parse_zone(zone)]!", + "\The [I] [missverb] past your missing [parse_zone(zone)]!") return var/hit_area = affecting.name - src.visible_message("\red [src] has been hit in the [hit_area] by [O].") - var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here + src.visible_message("\red [src] has been hit in the [hit_area] by [I].") + var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", I.armour_penetration) //I guess "melee" is the best fit here + apply_damage(throw_damage, dtype, zone, armor, is_sharp(I), has_edge(I), I) - apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O) - - if(ismob(O.thrower)) - var/mob/M = O.thrower + if(ismob(I.thrower)) + var/mob/M = I.thrower if(M) - src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [key_name(M)]") - M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [O]") + src.attack_log += text("\[[time_stamp()]\] Has been hit with a [I], thrown by [key_name(M)]") + M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [I]") if(!istype(src,/mob/living/simple_animal/mouse)) - msg_admin_attack("[key_name_admin(src)] was hit by a [O], thrown by [key_name_admin(M)]") + msg_admin_attack("[key_name_admin(src)] was hit by a [I], thrown by [key_name_admin(M)]") //thrown weapon embedded object code. - if(dtype == BRUTE && istype(O,/obj/item)) - var/obj/item/I = O + if(dtype == BRUTE && istype(I)) if (!I.is_robot_module()) var/sharp = is_sharp(I) var/damage = throw_damage @@ -384,10 +361,10 @@ emp_act affecting.embed(I) // Begin BS12 momentum-transfer code. - if(O.throw_source && speed >= 15) - var/obj/item/weapon/W = O + if(I.throw_source && speed >= 15) + var/obj/item/weapon/W = I var/momentum = speed/2 - var/dir = get_dir(O.throw_source, src) + var/dir = get_dir(I.throw_source, src) visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!") src.throw_at(get_edge_target_turf(src,dir),1,momentum) @@ -399,9 +376,9 @@ emp_act if(T) src.loc = T - visible_message("[src] is pinned to the wall by [O]!","You are pinned to the wall by [O]!") + visible_message("[src] is pinned to the wall by [I]!","You are pinned to the wall by [I]!") src.anchored = 1 - src.pinned += O + src.pinned += I /mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index cc50408148e..2df5b32409b 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -62,49 +62,40 @@ //this proc handles being hit by a thrown atom /mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve - if(istype(AM,/obj/)) - var/obj/O = AM + if(istype(AM, /obj/item)) + var/obj/item/I = AM var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest var/dtype = BRUTE - if(istype(O,/obj/item/weapon)) - var/obj/item/weapon/W = O + if(istype(I, /obj/item/weapon)) + var/obj/item/weapon/W = I dtype = W.damtype if (W.hitsound && W.throwforce > 0) playsound(loc, W.hitsound, 30, 1, -1) //run to-hit check here - var/throw_damage = O.throwforce*(speed/5) + var/throw_damage = I.throwforce*(speed/5) - //var/miss_chance = 15 - //if (O.throw_source) - //var/distance = get_dist(O.throw_source, loc) - //miss_chance = min(15*(distance-2), 0) - /* - if (prob(miss_chance)) - visible_message("\blue \The [O] misses [src] narrowly!") - return - */ - src.visible_message("\red [src] has been hit by [O].") - var/armor = run_armor_check(zone, "melee") + src.visible_message("\red [src] has been hit by [I].") + var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].", I.armour_penetration) - apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O) + apply_damage(throw_damage, dtype, zone, armor, is_sharp(I), has_edge(I), I) - O.throwing = 0 //it hit, so stop moving + I.throwing = 0 //it hit, so stop moving - if(ismob(O.thrower)) - var/mob/M = O.thrower + if(ismob(I.thrower)) + var/mob/M = I.thrower if(M) - src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [key_name(M)]") - M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [O]") + attack_log += text("\[[time_stamp()]\] Has been hit with a [I], thrown by [key_name(M)]") + M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [I]") if(!istype(src,/mob/living/simple_animal/mouse)) - msg_admin_attack("[key_name_admin(src)] was hit by a [O], thrown by [key_name_admin(M)]") + msg_admin_attack("[key_name_admin(src)] was hit by a [I], thrown by [key_name_admin(M)]") // Begin BS12 momentum-transfer code. - if(O.throw_source && speed >= 15) - var/obj/item/weapon/W = O + if(I.throw_source && speed >= 15) + var/obj/item/weapon/W = I var/momentum = speed/2 - var/dir = get_dir(O.throw_source, src) + var/dir = get_dir(I.throw_source, src) visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!") src.throw_at(get_edge_target_turf(src,dir),1,momentum) @@ -113,16 +104,16 @@ if(W.sharp) //Projectile is suitable for pinning. //Handles embedding for non-humans and simple_animals. - O.loc = src - src.embedded += O + I.loc = src + embedded += I var/turf/T = near_wall(dir,2) if(T) src.loc = T - visible_message("[src] is pinned to the wall by [O]!","You are pinned to the wall by [O]!") + visible_message("[src] is pinned to the wall by [I]!","You are pinned to the wall by [I]!") src.anchored = 1 - src.pinned += O + src.pinned += I /mob/living/mech_melee_attack(obj/mecha/M) if(M.occupant.a_intent == I_HARM) diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm new file mode 100644 index 00000000000..c4a71cca618 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -0,0 +1,75 @@ +/mob/living/simple_animal/hostile/illusion + name = "illusion" + desc = "It's a fake!" + icon = 'icons/effects/effects.dmi' + icon_state = "static" + icon_living = "static" + icon_dead = "null" + melee_damage_lower = 5 + melee_damage_upper = 5 + a_intent = "harm" + attacktext = "gores" + maxHealth = 100 + health = 100 + speed = 0 + faction = list("illusion") + var/life_span = INFINITY //how long until they despawn + var/mob/living/parent_mob + var/multiply_chance = 0 //if we multiply on hit + + +/mob/living/simple_animal/hostile/illusion/Life() + ..() + if(world.time > life_span) + death() + +/mob/living/simple_animal/hostile/illusion/death(gibbed) + ..() + visible_message("\The [src] vanishes into thin air! It was a fake!") + ghostize() + qdel(src) + +/mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 50, health = 100, damage = 0, replicate = 0 ) + appearance = original.appearance + parent_mob = original + dir = original.dir + life_span = world.time+life + melee_damage_lower = damage + melee_damage_upper = damage + multiply_chance = replicate + faction -= "neutral" + transform = initial(transform) + pixel_y = initial(pixel_y) + pixel_x = initial(pixel_x) + +/mob/living/simple_animal/hostile/illusion/examine(mob/user) + if(parent_mob) + parent_mob.examine(user) + else + return ..() + + +/mob/living/simple_animal/hostile/illusion/AttackingTarget() + ..() + if(istype(target, /mob/living) && prob(multiply_chance)) + var/mob/living/L = target + if(L.stat == DEAD) + return + var/mob/living/simple_animal/hostile/illusion/M = new(loc) + M.faction = faction.Copy() + M.Copy_Parent(parent_mob, 80, health/2, melee_damage_upper, multiply_chance/2) + M.GiveTarget(L) + +///////Actual Types///////// + +/mob/living/simple_animal/hostile/illusion/escape + retreat_distance = 10 + minimum_distance = 10 + melee_damage_lower = 0 + melee_damage_upper = 0 + speed = -1 + environment_smash = 0 + + +/mob/living/simple_animal/hostile/illusion/escape/AttackingTarget() + return diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 32bdf5fc772..fe04470c60c 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -39,6 +39,7 @@ icon_living = "syndicatemelee" attacktext = "slashes" attack_sound = 'sound/weapons/bladeslice.ogg' + armour_penetration = 28 status_flags = 0 loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier, /obj/item/weapon/melee/energy/sword/saber/red, /obj/item/weapon/shield/energy) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 93e72a96707..f1818153974 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -49,6 +49,7 @@ //LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly var/melee_damage_lower = 0 var/melee_damage_upper = 0 + var/armour_penetration = 0 //How much armour they ignore, as a flat reduction from the targets armour value var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage. var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) // 1 for full damage , 0 for none , -1 for 1:1 heal from that source var/attacktext = "attacks" diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 695d701dba35bd337c733c0e37fd10d5c365122f..725d97ce21bc24dca242f19132fdcc63aadebf09 100644 GIT binary patch delta 24084 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 diff --git a/paradise.dme b/paradise.dme index 3f06e7152d2..9817e7c4db0 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1628,6 +1628,7 @@ #include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" +#include "code\modules\mob\living\simple_animal\hostile\illusion.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle_animals.dm" #include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" From 65edca101009aef4c07529696e38996ce929ca19 Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Fri, 8 Jul 2016 02:19:25 +0100 Subject: [PATCH 45/99] Adds spaces - Adds spaces in to_chat(H) --- code/modules/paperwork/photocopier.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 6b970de4ca1..c0a8a7721bd 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -231,13 +231,13 @@ if(emagged) if(ishuman(ass)) var/mob/living/carbon/human/H = ass - to_chat(H,"Something smells toasty...") + to_chat(H, "Something smells toasty...") var/obj/item/organ/external/G = H.get_organ("groin") G.take_damage(0, 30) spawn(20) H.emote("scream") else - to_chat(ass,"Something smells toasty...") + to_chat(ass, "Something smells toasty...") ass.apply_damage(30, BURN) if(ishuman(ass)) //Suit checks are in check_ass var/mob/living/carbon/human/H = ass @@ -323,9 +323,9 @@ /obj/machinery/photocopier/emag_act(user as mob) if(!emagged) emagged = 1 - to_chat(user,"You overload the photocopier's laser printing mechanism.") + to_chat(user, "You overload the photocopier's laser printing mechanism.") else - to_chat(user,"The photocopier's laser printing mechanism is already overloaded!") + to_chat(user, "The photocopier's laser printing mechanism is already overloaded!") /obj/item/device/toner name = "toner cartridge" From 52e6df894eb19d1f13dda011d702880d58299f85 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Thu, 7 Jul 2016 21:35:19 -0400 Subject: [PATCH 46/99] The Honkening --- code/datums/spells/cluwne.dm | 86 ++++++++++++++++++ code/datums/spells/touch_attacks.dm | 10 +- code/game/gamemodes/wizard/godhand.dm | 36 +++++++- code/game/gamemodes/wizard/spellbook.dm | 7 +- code/modules/clothing/gloves/miscellaneous.dm | 9 +- code/modules/clothing/masks/miscellaneous.dm | 25 +++++ code/modules/clothing/shoes/miscellaneous.dm | 10 ++ code/modules/clothing/suits/miscellaneous.dm | 2 +- code/modules/clothing/under/miscellaneous.dm | 12 +++ code/modules/surgery/organs/organ_internal.dm | 21 +++-- icons/goonstation/mob/clothing/feet.dmi | Bin 0 -> 357 bytes icons/goonstation/mob/clothing/mask.dmi | Bin 0 -> 930 bytes icons/goonstation/mob/clothing/uniform.dmi | Bin 0 -> 718 bytes .../mob/inhands/clothing_lefthand.dmi | Bin 0 -> 656 bytes .../mob/inhands/clothing_righthand.dmi | Bin 0 -> 653 bytes icons/goonstation/objects/clothing/feet.dmi | Bin 0 -> 292 bytes icons/goonstation/objects/clothing/mask.dmi | Bin 0 -> 307 bytes .../goonstation/objects/clothing/uniform.dmi | Bin 0 -> 346 bytes icons/mob/actions.dmi | Bin 65567 -> 65769 bytes icons/mob/inhands/items_lefthand.dmi | Bin 169798 -> 170128 bytes icons/mob/inhands/items_righthand.dmi | Bin 167219 -> 167946 bytes icons/obj/weapons.dmi | Bin 56276 -> 56877 bytes paradise.dme | 1 + 23 files changed, 200 insertions(+), 19 deletions(-) create mode 100644 code/datums/spells/cluwne.dm create mode 100644 icons/goonstation/mob/clothing/feet.dmi create mode 100644 icons/goonstation/mob/clothing/mask.dmi create mode 100644 icons/goonstation/mob/clothing/uniform.dmi create mode 100644 icons/goonstation/mob/inhands/clothing_lefthand.dmi create mode 100644 icons/goonstation/mob/inhands/clothing_righthand.dmi create mode 100644 icons/goonstation/objects/clothing/feet.dmi create mode 100644 icons/goonstation/objects/clothing/mask.dmi create mode 100644 icons/goonstation/objects/clothing/uniform.dmi diff --git a/code/datums/spells/cluwne.dm b/code/datums/spells/cluwne.dm new file mode 100644 index 00000000000..c0336b26149 --- /dev/null +++ b/code/datums/spells/cluwne.dm @@ -0,0 +1,86 @@ +/obj/effect/proc_holder/spell/targeted/touch/cluwne + name = "Curse of the Cluwne" + desc = "Turns the target into a fat and cursed monstrosity of a clown." + hand_path = /obj/item/weapon/melee/touch_attack/cluwne + + school = "transmutation" + + charge_max = 600 + clothes_req = 1 + cooldown_min = 200 //100 deciseconds reduction per rank + + action_icon_state = "clown" + +/mob/living/carbon/human/proc/makeCluwne() + to_chat(src, "You feel funny.") + adjustBrainLoss(80) + nutrition = 9000 + confused = 120 + if(mind) + mind.assigned_role = "Cluwne" + + var/obj/item/organ/internal/honktumor/cursed/tumor = new + tumor.insert(src) + mutations.Add(NERVOUS) + dna.SetSEState(NERVOUSBLOCK, 1, 1) + genemutcheck(src, NERVOUSBLOCK, null, MUTCHK_FORCED) + + animate_clownspell(src) + + unEquip(w_uniform, 1) + unEquip(shoes, 1) + unEquip(gloves, 1) + if(!istype(wear_mask, /obj/item/clothing/mask/cursedclown)) //Infinite loops otherwise + unEquip(wear_mask, 1) + equip_to_slot_if_possible(new /obj/item/clothing/under/cursedclown, slot_w_uniform, 1, 1, 1) + equip_to_slot_if_possible(new /obj/item/clothing/gloves/cursedclown, slot_gloves, 1, 1, 1) + equip_to_slot_if_possible(new /obj/item/clothing/mask/cursedclown, slot_wear_mask, 1, 1, 1) + equip_to_slot_if_possible(new /obj/item/clothing/shoes/cursedclown, slot_shoes, 1, 1, 1) + real_name = "cluwne" + +/mob/living/carbon/human/proc/makeAntiCluwne() + to_chat(src, "You don't feel very funny.") + adjustBrainLoss(-120) + nutrition = NUTRITION_LEVEL_STARVING + confused = 0 + jitteriness = 0 + if(mind) + mind.assigned_role = "Lawyer" + + var/obj/item/organ/internal/honktumor/cursed/tumor = get_int_organ(/obj/item/organ/internal/honktumor/cursed) + if(tumor) + tumor.remove(src, clean_remove = 1) + qdel(tumor) + else + mutations.Remove(CLUMSY) + mutations.Remove(COMICBLOCK) + dna.SetSEState(CLUMSYBLOCK,0) + dna.SetSEState(COMICBLOCK,0) + genemutcheck(src, CLUMSYBLOCK, null, MUTCHK_FORCED) + genemutcheck(src, COMICBLOCK, null, MUTCHK_FORCED) + mutations.Remove(NERVOUS) + dna.SetSEState(NERVOUSBLOCK, 0) + genemutcheck(src, NERVOUSBLOCK, null, MUTCHK_FORCED) + + animate_clownspell(src) + + var/obj/item/clothing/under/U = w_uniform + unEquip(w_uniform, 1) + if(U) + qdel(U) + + var/obj/item/clothing/shoes/S = shoes + unEquip(shoes, 1) + if(S) + qdel(S) + + if(istype(wear_mask, /obj/item/clothing/mask/cursedclown)) + unEquip(wear_mask, 1) + + if(istype(gloves, /obj/item/clothing/gloves/cursedclown)) + var/obj/item/clothing/gloves/G = gloves + unEquip(gloves, 1) + qdel(G) + + equip_to_slot_if_possible(new /obj/item/clothing/under/lawyer/black, slot_w_uniform, 1, 1, 1) + equip_to_slot_if_possible(new /obj/item/clothing/shoes/black, slot_shoes, 1, 1, 1) diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm index 1262730fd45..6f659e5e98d 100644 --- a/code/datums/spells/touch_attacks.dm +++ b/code/datums/spells/touch_attacks.dm @@ -1,5 +1,5 @@ -/obj/effect/proc_holder/spell/targeted/touch/ - var/hand_path = "/obj/item/weapon/melee/touch_attack" +/obj/effect/proc_holder/spell/targeted/touch + var/hand_path = /obj/item/weapon/melee/touch_attack var/obj/item/weapon/melee/touch_attack/attached_hand = null invocation_type = "none" //you scream on connecting, not summoning include_user = 1 @@ -47,7 +47,7 @@ /obj/effect/proc_holder/spell/targeted/touch/disintegrate name = "Disintegrate" desc = "This spell charges your hand with vile energy that can be used to violently explode victims." - hand_path = "/obj/item/weapon/melee/touch_attack/disintegrate" + hand_path = /obj/item/weapon/melee/touch_attack/disintegrate school = "evocation" charge_max = 600 @@ -59,11 +59,11 @@ /obj/effect/proc_holder/spell/targeted/touch/flesh_to_stone name = "Flesh to Stone" desc = "This spell charges your hand with the power to turn victims into inert statues for a long period of time." - hand_path = "/obj/item/weapon/melee/touch_attack/fleshtostone" + hand_path = /obj/item/weapon/melee/touch_attack/fleshtostone school = "transmutation" charge_max = 600 clothes_req = 1 cooldown_min = 200 //100 deciseconds reduction per rank - action_icon_state = "statue" \ No newline at end of file + action_icon_state = "statue" diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm index 8a5ba06f36f..ab5ba426106 100644 --- a/code/game/gamemodes/wizard/godhand.dm +++ b/code/game/gamemodes/wizard/godhand.dm @@ -33,7 +33,7 @@ qdel(src) /obj/item/weapon/melee/touch_attack/disintegrate - name = "\improper disintegrating touch" + name = "disintegrating touch" desc = "This hand of mine glows with an awesome power!" catchphrase = "EI NATH!!" on_use_sound = "sound/magic/Disintegrate.ogg" @@ -51,7 +51,7 @@ ..() /obj/item/weapon/melee/touch_attack/fleshtostone - name = "\improper petrifying touch" + name = "petrifying touch" desc = "That's the bottom line, because flesh to stone said so!" catchphrase = "STAUN EI!!" on_use_sound = "sound/magic/FleshToStone.ogg" @@ -78,10 +78,38 @@ item_state = "disintegrate" /obj/item/weapon/melee/touch_attack/fake_disintegrate/afterattack(atom/target, mob/living/carbon/user, proximity) - if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //exploding after touching yourself would be bad + if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //not exploding after touching yourself would be bad return var/datum/effect/system/spark_spread/sparks = new sparks.set_up(4, 0, target.loc) //no idea what the 0 is sparks.start() playsound(target.loc, 'sound/goonstation/effects/gib.ogg', 50, 1) - ..() \ No newline at end of file + ..() + +/obj/item/weapon/melee/touch_attack/cluwne + name = "cluwne touch" + desc = "It's time to start clowning around." + catchphrase = "NWOLC EGNEVER" + on_use_sound = "sound/misc/sadtrombone.ogg" + icon_state = "cluwnecurse" + item_state = "cluwnecurse" + +/obj/item/weapon/melee/touch_attack/cluwne/afterattack(atom/target, mob/living/carbon/user, proximity) + if(!proximity || target == user || !ishuman(target) || !iscarbon(user) || user.lying || user.handcuffed) //clowning around after touching yourself would unsurprisingly, be bad + return + + if(iswizard(target)) + to_chat(user, "The spell has no effect on [target].") + return + + var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread + s.set_up(5, 0, target) + s.start() + + var/mob/living/carbon/human/H = target + if(H.mind) + if(H.mind.assigned_role != "Cluwne") + H.makeCluwne() + else + H.makeAntiCluwne() + ..() diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index ac487a8e703..65c50382532 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -233,6 +233,11 @@ category = "Assistance" cost = 1 +/datum/spellbook_entry/cluwne + name = "Curse of the Cluwne" + spell_type = /obj/effect/proc_holder/spell/targeted/touch/cluwne + log_name = "CC" + /datum/spellbook_entry/item name = "Buy Item" refundable = 0 @@ -857,4 +862,4 @@ spell = /obj/effect/proc_holder/spell/targeted/touch/fake_disintegrate spellname = "disintegrate" icon_state ="bookfireball" - desc = "This book feels like it will rip stuff apart." \ No newline at end of file + desc = "This book feels like it will rip stuff apart." diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 060dd1ca47c..d98ee1d0154 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -47,4 +47,11 @@ name = "batgloves" icon_state = "bmgloves" item_state = "bmgloves" - item_color="bmgloves" \ No newline at end of file + item_color="bmgloves" + +/obj/item/clothing/gloves/cursedclown + name = "cursed white gloves" + desc = "These things smell terrible, and they're all lumpy. Gross." + icon_state = "latex" + item_state = "lgloves" + flags = NODROP diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 3e99b277db3..ca5a267c6a4 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -275,3 +275,28 @@ obj/item/clothing/mask/bandana/purple icon_state = "bandblack" item_color = "black" desc = "It's a black bandana." + +/obj/item/clothing/mask/cursedclown + name = "cursed clown mask" + desc = "This is a very, very odd looking mask." + icon = 'icons/goonstation/objects/clothing/mask.dmi' + icon_state = "cursedclown" + item_state = "cclown_hat" + icon_override = 'icons/goonstation/mob/clothing/mask.dmi' + lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi' + righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi' + flags = NODROP + +/obj/item/clothing/mask/cursedclown/equipped(mob/user, slot) + ..() + var/mob/living/carbon/human/H = user + if(istype(H) && slot == slot_wear_mask) + to_chat(H, "[src] grips your face!") + if(H.mind && H.mind.assigned_role != "Cluwne") + H.makeCluwne() + +/obj/item/clothing/mask/cursedclown/suicide_act(mob/user) + user.visible_message("[user] gazes into the eyes of [src]. [src] gazes back!") + spawn(10) + user.gib() + return BRUTELOSS diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index af361951f3d..bc62c5d71d4 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -207,3 +207,13 @@ item_color = "fancysandal" species_restricted = null +/obj/item/clothing/shoes/cursedclown + name = "cursed clown shoes" + desc = "Moldering clown flip flops. They're neon green for some reason." + icon = 'icons/goonstation/objects/clothing/feet.dmi' + icon_state = "cursedclown" + item_state = "cclown_shoes" + icon_override = 'icons/goonstation/mob/clothing/feet.dmi' + lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi' + righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi' + flags = NODROP diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index a88fdd6f970..badf323d804 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -657,4 +657,4 @@ if(user.reagents.get_reagent_amount("syndicate_nanites") < 15) user.reagents.add_reagent("syndicate_nanites", 15) else - processing_objects.Remove(src) \ No newline at end of file + processing_objects.Remove(src) diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 769e388f546..d912a2e289d 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -709,3 +709,15 @@ to_chat(user,"You can't fit inside while wearing that \the [user.get_item_by_slot(slot_id)].") return 0 return 1 + +/obj/item/clothing/under/cursedclown + name = "cursed clown suit" + desc = "It wasn't already?" + icon = 'icons/goonstation/objects/clothing/uniform.dmi' + icon_state = "cursedclown" + item_state = "cclown_uniform" + item_color = "cursedclown" + icon_override = 'icons/goonstation/mob/clothing/uniform.dmi' + lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi' + righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi' + flags = NODROP diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index f4a47c595cb..27b7120b63a 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -476,13 +476,21 @@ var/mob/living/carbon/human/H = owner if(isobj(H.shoes)) var/thingy = H.shoes - H.unEquip(H.shoes) - walk_away(thingy,H,15,2) - spawn(20) - if(thingy) - walk(thingy,0) + if(H.unEquip(H.shoes)) + walk_away(thingy,H,15,2) + spawn(20) + if(thingy) + walk(thingy,0) ..() +/obj/item/organ/internal/honktumor/cursed + +/obj/item/organ/internal/honktumor/cursed/remove(mob/living/carbon/M, special = 0, clean_remove = 0) + ..() + if(!clean_remove) + insert(M) //You're not getting away that easily! + else + qdel(src) /obj/item/organ/internal/beard name = "beard organ" @@ -493,7 +501,6 @@ parent_organ = "head" slot = "hair_organ" - /obj/item/organ/internal/beard/on_life() if(!owner) @@ -516,4 +523,4 @@ head_organ.r_facial = 216 head_organ.g_facial = 192 head_organ.b_facial = 120 - H.update_fhair() \ No newline at end of file + H.update_fhair() diff --git a/icons/goonstation/mob/clothing/feet.dmi b/icons/goonstation/mob/clothing/feet.dmi new file mode 100644 index 0000000000000000000000000000000000000000..73549581095c9a6220edd164c34efbc30e1c38e8 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=>VS)SD(y6hMC3;XVU)9G&cU9 z#_-?x|9|5%X$%Z$#zs=t8-U6fOM?7@862M7017e`RE0#8xTF>*7iAWdWaj5FFjUM5 z4l5`s{r)Am;N#aPTHd-^=gyoD-VkbV(fGk5o%24LCmD)*dUseD2N_>B_EMPhXws2M zAqv5oJGZQ`Fjciw-*4mJ*=?-4d4iL9eua*dTgv2%U+H<)b)Q~vR;OWT}x**V#G1RdmY4Rr4p6fYF7%s(ML>X$;odsw6$O)~r~%!<;OXk;vd$@?2>{lC BgscDn literal 0 HcmV?d00001 diff --git a/icons/goonstation/mob/clothing/mask.dmi b/icons/goonstation/mob/clothing/mask.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c4392fb8de79c36f717d33d7412d1f73b0b603d5 GIT binary patch literal 930 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=WmO>&B`&GO$wiq3C7Jno3=9=> zRF50-H5>4-Ua+(~Dt=SjD{}7wg(-~h8ic01Xek`c+*!wd@0(6r;V14pZ(gdqey(h| zXdh)1-e=nQ@zn{HlhLcnx2y|2ka1}HiX$H^*DqESE)F!PGJ3!1-J%4WlSwf$KwbQ7 zEHc}3r1p9;Ffcv$ba4!+nDchl#_Zb;BJKONTX}ewN@l$f$ZxC4ay;hTuBTd($=RAG z@}rMqqrP+LznA zAOHD!p#SVlvvY2$woHM-%r~yQ-u`P}<$dMiC#DDIP3g5gXku8nq>5!%31dV8V}tLt z%J;R8rUajwVtJwZ&1U`ss?#5T4vX}iY&UI-@M`vbU0rXtm!CBemQ$6r;TH>?uE%|t ztzf}-28-b34N`S+-*0bpUC%74wK06F+>cdGs>SDAnB6+{cjhsKo=?6xh4Jtv&ET(l zPJA|6-FY%la+}GGjjgs!=0c_h3`?UpOL`}TH+^_@VfBOJhuZbFAFj?XtFNivA6b{j z$IpM?_t@GsYySKbU2fSJ!scUiVU_{U%Bxu|i64GBTVE5p@86BT`S1UP9X1bqeDte-avJkH?qKnQzx#|Gq8d!jF=R4c zvS41q>hYLof|x=tF@naI&s~VsYB{l5^|P!%sDWU(yMh0rV{={I)tD!7sl8ddsq%8x z54BYu%$sIU$mYEvZ?^yg7Y&{^VL<(494Td12x9T9fU&7i_Ohu_}o$K6_$Ok4En0 z6ML=iWc^t7s#0UAK}F4-3hV3Jo$`O5&@eeB!4~!W-Yoqm^#>f{IfKq@4`4bluSW2R zSwaabTU4=7+fPy7heuXi(7g06#9dczim%sGsgn3fc>;T4?4o`1kz Y(_F+Xy{6$CFw-%3y85}Sb4q9e014Zl=Kufz literal 0 HcmV?d00001 diff --git a/icons/goonstation/mob/clothing/uniform.dmi b/icons/goonstation/mob/clothing/uniform.dmi new file mode 100644 index 0000000000000000000000000000000000000000..522e83854ecd9f2d36635189fd314b93f79fdc4a GIT binary patch literal 718 zcmV;<0x|uGP)^Ydf=1T+6FVaha1ngvP&12ke0=7#2o0|Y2rDg>PXOOXII006I& ztj+)c00DGTPE!Ct=GbNc0044&R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo` zEh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+xwNP_H6=MGzdSF# zSc!`>C9|j)q?wB|ttc@!6~s2=QdV&Fa{(I<08EJ;iO{kfq5uE^$Vo&&R9J=Wmf>!L zFbsr=9fDcdpzr^(J0~ecU}xI2AJfEDibl`=a!|B*7;fGAYYN0znS$#RR&srcOyf8b zM{@kYM8v`KlNO9xkgN)tVwhARPNvTskr4`!`C3tYR@puRAVE?gff0eGLjofL;r8|& zaHHpnuY3fcVNX!5&H>bK3Ch*EfV80PP_Dk`7rheLdL?jFH^3I2-x4^!{(vFI7=j(J z_(hhF?0Ggzbsr+F8im%Ho4uGme85W??XXpYL z=9ym7qU%F~=BJFuI9G&F-QwaO+R1s3cKo&b5W?$Ly+L*PnSblnt>07j{-Ylha;HBr z>|O!3;N%u$W}MI+g7(M6>=ht@0`lSkmRtaCgq%_?=c5NG2d7qf0EE*M*iWEGbMD;& z5~O~D)J*`TrJrDV*DA;V$n9wCC4hXu0&zb9YmEn3RXQVh039CmkaPg0A7?C9yCCZb zATD8T5`0WT#t>2alSR-@ZI{9@2-+`F#|Mj00qXVuZA365H z0RR6pVQbDw00001bW%=J06^y0W&i*HfqGO}bVOxyV{&P5bZKvH004NLQ&wyrk6&1 zZ16$9B&pk~>y5x_@R5KZ$=5wTJ~(e6OB%Mg!D-SZ0RR910002MwP}7ZO%}i8o@HS( z3jH(zqM+~y+ogLuOClf&3cLR9Vj2Na5V?{{KoUfKN~yjAQBe3I1c=!=0YT97wg06w quV)$oNzmU5P=6IoB7t;47vUQSq7Yw(?*Wnk0000wJ^000302wxBXXU`8|IZx|Hi)?0*Ut?|7N55P~x+R2@(77W|H8t7Lb;*05x{hoq zV#4>6<*BANTP7*SnCO;GkLlczS7t*f!!FT3@MeRdyI+9M*%_+Vq&t9eHIo4@1t&L9K0iOsOod z&gT3)DDkStwTkiwvW=d6D@T5n1poj5007`)7{}$%$Db>QT7GU$)8yQw-5r*~?Cu>}AC0000006@d}a8lpUa&hje z4qt0tKUZ~LZu;GlC2hI6(!e0VJcpZWTMtJK6~wab6&&tpm%j`GOxDuTaK1m(*~gv! n!*TP^5O8OM0P`Gf4kW$-0K5=-$H^&&00000NkvXXu0mjfrcW!( literal 0 HcmV?d00001 diff --git a/icons/goonstation/objects/clothing/feet.dmi b/icons/goonstation/objects/clothing/feet.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e6d37e10132d3b55af62de6300d3c967a2585b95 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvSD(y6hMC3;XVU)9G&cU9 z#_-?x|9|5%X$;5yywd`zVJr#q3ubV5b|VeQ$*&5DC~-+GPAM56C74h zRQml(aKXo~Pqe&swa%S6AG{&d;G*$^M>^+yG*2=V_4MwrFb*=lZ0w~l=h37ilR^}N zHFs`VVPUFjslMOFzq8v|b@K`djjR(#XNFCgF`Fw;$&!#b1A%v}%nT=GIC^)^K4}Rwiow&>&t;ucLK6V^vusiT literal 0 HcmV?d00001 diff --git a/icons/goonstation/objects/clothing/mask.dmi b/icons/goonstation/objects/clothing/mask.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f5c4f97c2556f5e70e3c0032d6c3cd903f11e9c7 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvSD(znwEqm(&Ya5 z9~0BR@7>-1nT!QYibR2G7)yfuf*Bm1-ADs+@~c83N?cNllZ!G7N;32F7#J$%1cwzA zm45#cT=4Ph6D@CDt#fD22X6>9xM=*~ks_(b)@9Z{K-Mm6VBkRP`nPF3A%;rke*52`JX9F)g1M41{Ee(4YNCU0* z^K@|x(U_Q=Ad%J(DB$MMxL|?81bvN$00oUDOIUGBr=>eHbM% zqc_yWWlHbFw}GDifesrZPM+lqZE)o5wHIMzD9vKaJ!LX`KG0+aPgg&ebxsLQ0LkfY A!TVS)SD(znHLIDd3nl*__`iDf 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 Za{8cho0(#(LS74?L`_*+saydb{2zY(LRtU- delta 7676 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 diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 61c176bd08a8e979d616e56e0e94c39ac530bca9..27168c30865c02390c40fc9245727008257a34c8 100644 GIT binary patch delta 22190 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 delta 21871 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 diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 652996f8d8c786ab475ad7b722a0523e7b75205f..2f7154777fd1ecba7247944a731c2e22da662e39 100644 GIT binary patch delta 19240 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 I+k5ol-*C7@6#xJL delta 18705 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�ZiDlHN0pQlqrb8E{b1rgt5verw_l_3Ut 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 delta 14087 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 BBL4sY diff --git a/paradise.dme b/paradise.dme index 3f06e7152d2..7f315ddd7c0 100644 --- a/paradise.dme +++ b/paradise.dme @@ -274,6 +274,7 @@ #include "code\datums\spells\area_teleport.dm" #include "code\datums\spells\bloodcrawl.dm" #include "code\datums\spells\charge.dm" +#include "code\datums\spells\cluwne.dm" #include "code\datums\spells\conjure.dm" #include "code\datums\spells\construct_spells.dm" #include "code\datums\spells\dumbfire.dm" From adab2c06e018bfe3dc7a48b7e900a3e5d76e385b Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Fri, 8 Jul 2016 02:49:15 +0100 Subject: [PATCH 47/99] Fixes Comfy Chair Deconstruction - Deconstructing Comfy Chairs now yields 2 metal sheets --- .../objects/structures/stool_bed_chair_nest/chairs.dm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 621f3a9d78e..f3fe67f9874 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -140,6 +140,15 @@ anchored = 0 movable = 1 +/obj/structure/stool/bed/chair/comfy/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/weapon/wrench)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + new /obj/item/stack/sheet/metal(get_turf(src)) + new /obj/item/stack/sheet/metal(get_turf(src)) + qdel(src) + else + ..() + /obj/structure/stool/bed/chair/office/Bump(atom/A) ..() if(!buckled_mob) return From 9cfb3dc64459ddcef3bafe7f0ca0c09d6e30a636 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Thu, 7 Jul 2016 21:58:34 -0400 Subject: [PATCH 48/99] Overeating is bad for you --- code/datums/spells/cluwne.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/datums/spells/cluwne.dm b/code/datums/spells/cluwne.dm index c0336b26149..d3e05de4198 100644 --- a/code/datums/spells/cluwne.dm +++ b/code/datums/spells/cluwne.dm @@ -15,6 +15,7 @@ to_chat(src, "You feel funny.") adjustBrainLoss(80) nutrition = 9000 + overeatduration = 9000 confused = 120 if(mind) mind.assigned_role = "Cluwne" @@ -42,6 +43,7 @@ to_chat(src, "You don't feel very funny.") adjustBrainLoss(-120) nutrition = NUTRITION_LEVEL_STARVING + overeatduration = 0 confused = 0 jitteriness = 0 if(mind) From 0b94dc3a542cd92d9dadef47435a3800751ebfda Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Fri, 8 Jul 2016 03:03:37 +0100 Subject: [PATCH 49/99] Fied Tiger's recommendations - Removed needles src. Again. - Replaced istype(W, /obj/item/weapon/wrench) with iswrench(W) --- code/game/objects/structures/stool_bed_chair_nest/chairs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index f3fe67f9874..b9aa8d21fc2 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -141,8 +141,8 @@ movable = 1 /obj/structure/stool/bed/chair/comfy/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + if(iswrench(W)) + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) new /obj/item/stack/sheet/metal(get_turf(src)) new /obj/item/stack/sheet/metal(get_turf(src)) qdel(src) From ce11da030441b405d26165284ba69922ce585f9b Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 7 Jul 2016 22:14:57 -0400 Subject: [PATCH 50/99] Automatic changelog generation for PR #4907 --- html/changelogs/AutoChangeLog-pr-4907.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4907.yml diff --git a/html/changelogs/AutoChangeLog-pr-4907.yml b/html/changelogs/AutoChangeLog-pr-4907.yml new file mode 100644 index 00000000000..b71cfbda7b6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4907.yml @@ -0,0 +1,4 @@ +author: TullyBurnalot +delete-after: True +changes: + - rscdel: "Botanist access to the morgue revoked" From af5987918c6b61f70564966c5d9fe7dd5314275d Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 7 Jul 2016 22:26:59 -0400 Subject: [PATCH 51/99] Automatic changelog generation for PR #4797 --- html/changelogs/AutoChangeLog-pr-4797.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4797.yml diff --git a/html/changelogs/AutoChangeLog-pr-4797.yml b/html/changelogs/AutoChangeLog-pr-4797.yml new file mode 100644 index 00000000000..3476b7eb826 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4797.yml @@ -0,0 +1,6 @@ +author: TheDZD +delete-after: True +changes: + - bugfix: "DNA injectors no longer always activate powers that are supposed to have a chance to activate." + - tweak: "Dionae can no longer activate the radiation disability, nor the run superpower except via adminbus." + - rscadd: "Adds genetic instability, which causes a variety of negative effects, including toxin damage, burn damage, cloneloss, and even gibbing. Effects get worse as stability gets lower, burn damage starts below 85 stability, tox and clone below 70, and gibbing once you're below 40." From edc7b921ff9c70cf09ef2d9e8fb2430693b4eafc Mon Sep 17 00:00:00 2001 From: TullyBurnalot Date: Fri, 8 Jul 2016 03:28:58 +0100 Subject: [PATCH 52/99] Fixes boxes in evidence bags in boxes - Boxes no longer allowed inside evidence bags --- code/modules/detective_work/evidence.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/detective_work/evidence.dm b/code/modules/detective_work/evidence.dm index 4654e0ab665..6f62a7eecac 100644 --- a/code/modules/detective_work/evidence.dm +++ b/code/modules/detective_work/evidence.dm @@ -21,6 +21,10 @@ if(!istype(I) || I.anchored == 1) return + if(istype(I, /obj/item/weapon/storage/box)) + to_chat(user, "This box is too big to fit in the evidence bag.") + return + if(istype(I, /obj/item/weapon/evidencebag)) to_chat(user, "You find putting an evidence bag in another evidence bag to be slightly absurd.") return 1 //now this is podracing From dc408f090d9338ebe21598c28bb4f1971608de07 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 19 Jun 2016 10:46:57 -0700 Subject: [PATCH 53/99] Contributing guidelines --- .github/CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index cc17a9975c7..0e5b5ad3208 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -58,6 +58,9 @@ actual development. be a new proc that they both can use. - No magic numbers/strings. If you have a number or text that is important and used in your code, make a `#DEFINE` statement with a name that clearly indicates it's use. + - `if(condition)` must be used over `if (condition)` or any other variation. + - The same applies for `while` and `for` loops, they must have no space between the + keyword and condition brackets. `while(condition)`, `for(condition)` - If you want to output a message to a player's chat (this includes text sent to `world`), use `to_chat(mob/client/world, "message")`. Do not use `mob/client/world << "message"`. From 71e5344a983c85cd9bc315868ec9f869770f28b7 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Thu, 7 Jul 2016 19:34:02 -0700 Subject: [PATCH 54/99] Mass replace --- code/ATMOSPHERICS/atmospherics.dm | 8 +- .../binary_devices/binary_atmos_base.dm | 4 +- .../components/binary_devices/dp_vent_pump.dm | 6 +- .../components/binary_devices/passive_gate.dm | 4 +- .../components/binary_devices/pump.dm | 4 +- .../components/binary_devices/valve.dm | 2 +- .../components/binary_devices/volume_pump.dm | 4 +- .../components/omni_devices/filter.dm | 2 +- .../components/omni_devices/mixer.dm | 2 +- .../components/omni_devices/omni_base.dm | 2 +- .../components/trinary_devices/filter.dm | 6 +- .../unary_devices/outlet_injector.dm | 2 +- .../components/unary_devices/thermal_plate.dm | 8 +- .../components/unary_devices/unary_base.dm | 2 +- .../components/unary_devices/vent_pump.dm | 22 +- .../components/unary_devices/vent_scrubber.dm | 38 +- code/ATMOSPHERICS/pipes/cap.dm | 2 +- code/ATMOSPHERICS/pipes/manifold.dm | 4 +- code/ATMOSPHERICS/pipes/manifold4w.dm | 4 +- code/ATMOSPHERICS/pipes/simple/pipe_simple.dm | 4 +- .../pipes/simple/pipe_simple_he.dm | 10 +- .../pipes/simple/pipe_simple_hidden.dm | 4 +- .../pipes/simple/pipe_simple_visible.dm | 4 +- code/LINDA/LINDA_fire.dm | 2 +- code/LINDA/LINDA_system.dm | 16 +- code/LINDA/LINDA_turf_tile.dm | 6 +- code/__DEFINES/tick.dm | 2 +- code/__HELPERS/AnimationLibrary.dm | 2 +- code/__HELPERS/experimental.dm | 14 +- code/__HELPERS/game.dm | 4 +- code/__HELPERS/global_lists.dm | 4 +- code/__HELPERS/icons.dm | 10 +- code/__HELPERS/lists.dm | 50 +-- code/__HELPERS/logging.dm | 26 +- code/__HELPERS/mobs.dm | 18 +- code/__HELPERS/names.dm | 22 +- code/__HELPERS/sanitize_values.dm | 2 +- code/__HELPERS/text.dm | 18 +- code/__HELPERS/timed_alerts.dm | 8 +- code/__HELPERS/type2type.dm | 2 +- code/__HELPERS/unsorted.dm | 94 ++--- code/_hooks/hooks.dm | 16 +- code/_onclick/hud/screen_objects.dm | 14 +- code/_onclick/item_attack.dm | 12 +- code/_onclick/oldcode.dm | 78 ++-- .../ProcessScheduler/core/process.dm | 18 +- .../ProcessScheduler/core/processScheduler.dm | 52 +-- code/controllers/communications.dm | 24 +- code/controllers/configuration.dm | 160 ++++---- code/controllers/failsafe.dm | 4 +- code/controllers/verbs.dm | 2 +- code/controllers/voting.dm | 2 +- code/datums/ai_laws.dm | 10 +- code/datums/browser.dm | 20 +- code/datums/cache/apc.dm | 2 +- code/datums/cache/crew.dm | 2 +- code/datums/datacore.dm | 6 +- code/datums/datumvars.dm | 48 +-- .../diseases/advance/symptoms/oxygen.dm | 2 +- .../diseases/advance/symptoms/stimulant.dm | 2 +- .../diseases/advance/symptoms/vision.dm | 2 +- code/datums/diseases/berserker.dm | 8 +- code/datums/diseases/dna_spread.dm | 2 +- code/datums/diseases/kuru.dm | 2 +- code/datums/diseases/retrovirus.dm | 20 +- code/datums/diseases/transformation.dm | 22 +- .../helper_datums/construction_datum.dm | 2 +- code/datums/mind.dm | 276 +++++++------- code/datums/progressbar.dm | 16 +- code/datums/recipe.dm | 36 +- code/datums/spell.dm | 2 +- code/datums/spells/ethereal_jaunt.dm | 2 +- code/datums/spells/inflict_handler.dm | 4 +- code/datums/uplink_item.dm | 6 +- code/datums/wires/airlock.dm | 2 +- code/datums/wires/alarm.dm | 16 +- code/datums/wires/apc.dm | 10 +- code/datums/wires/nuclearbomb.dm | 4 +- code/datums/wires/robot.dm | 16 +- code/datums/wires/syndicatebomb.dm | 12 +- code/defines/procs/announce.dm | 6 +- code/defines/procs/radio.dm | 2 +- code/game/area/Space Station 13 areas.dm | 2 +- code/game/area/ai_monitored.dm | 6 +- code/game/area/areas.dm | 30 +- code/game/atoms.dm | 8 +- code/game/atoms_movable.dm | 44 +-- code/game/data_huds.dm | 4 +- code/game/dna/dna2.dm | 32 +- code/game/dna/dna2_helpers.dm | 16 +- code/game/dna/dna_modifier.dm | 168 ++++----- code/game/dna/genes/goon_powers.dm | 44 +-- code/game/dna/genes/monkey.dm | 2 +- code/game/dna/genes/powers.dm | 2 +- code/game/dna/genes/vg_powers.dm | 8 +- .../game/gamemodes/autotraitor/autotraitor.dm | 16 +- code/game/gamemodes/blob/blob.dm | 8 +- code/game/gamemodes/blob/blob_report.dm | 4 +- code/game/gamemodes/blob/overmind.dm | 14 +- code/game/gamemodes/borer/borer.dm | 4 +- code/game/gamemodes/changeling/changeling.dm | 14 +- .../gamemodes/changeling/evolution_menu.dm | 4 +- code/game/gamemodes/cult/cult.dm | 22 +- code/game/gamemodes/cult/ritual.dm | 48 +-- code/game/gamemodes/cult/runes.dm | 70 ++-- code/game/gamemodes/cult/talisman.dm | 22 +- code/game/gamemodes/game_mode.dm | 4 +- code/game/gamemodes/gameticker.dm | 46 +-- code/game/gamemodes/intercept_report.dm | 6 +- .../gamemodes/malfunction/Malf_Modules.dm | 6 +- .../game/gamemodes/malfunction/malfunction.dm | 40 +- code/game/gamemodes/meteor/meteors.dm | 2 +- .../miniantags/abduction/abduction.dm | 2 +- .../miniantags/abduction/abduction_gear.dm | 2 +- code/game/gamemodes/miniantags/borer/borer.dm | 14 +- .../miniantags/bot_swarm/swarmer_event.dm | 2 +- .../gamemodes/miniantags/guardian/guardian.dm | 20 +- .../miniantags/slaughter/bloodcrawl.dm | 2 +- code/game/gamemodes/mutiny/auth_key.dm | 6 +- .../directives/alien_fraud_directive.dm | 4 +- .../bluespace_contagion_directive.dm | 2 +- .../directives/financial_crisis_directive.dm | 2 +- .../mutiny/directives/ipc_virus_directive.dm | 10 +- .../research_to_ripleys_directive.dm | 6 +- .../tau_ceti_needs_women_directive.dm | 4 +- .../directives/terminations_directive.dm | 10 +- code/game/gamemodes/mutiny/key_pinpointer.dm | 8 +- code/game/gamemodes/mutiny/mutiny.dm | 30 +- code/game/gamemodes/mutiny/mutiny_fluff.dm | 8 +- code/game/gamemodes/mutiny/mutiny_hooks.dm | 8 +- code/game/gamemodes/nations/nations.dm | 2 +- code/game/gamemodes/nations/nationsprocs.dm | 8 +- code/game/gamemodes/newobjective.dm | 32 +- code/game/gamemodes/nuclear/nuclear.dm | 34 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 88 ++--- code/game/gamemodes/objective.dm | 16 +- code/game/gamemodes/revolution/revolution.dm | 16 +- code/game/gamemodes/scoreboard.dm | 6 +- code/game/gamemodes/setupgame.dm | 36 +- code/game/gamemodes/shadowling/shadowling.dm | 2 +- code/game/gamemodes/traitor/traitor.dm | 26 +- code/game/gamemodes/vampire/vampire.dm | 10 +- code/game/gamemodes/wizard/artefact.dm | 6 +- code/game/gamemodes/wizard/raginmages.dm | 4 +- code/game/gamemodes/wizard/rightandwrong.dm | 8 +- code/game/gamemodes/wizard/soulstone.dm | 14 +- code/game/gamemodes/wizard/spellbook.dm | 2 +- code/game/gamemodes/wizard/wizard.dm | 18 +- code/game/jobs/access.dm | 4 +- code/game/jobs/job/medical.dm | 4 +- code/game/jobs/job/support_chaplain.dm | 4 +- code/game/jobs/job_controller.dm | 4 +- code/game/jobs/whitelist.dm | 6 +- code/game/machinery/Freezer.dm | 18 +- code/game/machinery/OpTable.dm | 16 +- code/game/machinery/Sleeper.dm | 82 ++-- code/game/machinery/adv_med.dm | 52 +-- code/game/machinery/ai_slipper.dm | 30 +- code/game/machinery/alarm.dm | 86 ++--- code/game/machinery/atmoalter/canister.dm | 84 ++--- code/game/machinery/atmoalter/meter.dm | 10 +- .../atmoalter/portable_atmospherics.dm | 8 +- code/game/machinery/atmoalter/pump.dm | 8 +- code/game/machinery/atmoalter/scrubber.dm | 14 +- code/game/machinery/atmoalter/zvent.dm | 10 +- code/game/machinery/autolathe.dm | 26 +- code/game/machinery/bees_apiary.dm | 2 +- code/game/machinery/biogenerator.dm | 56 +-- code/game/machinery/buttons.dm | 6 +- code/game/machinery/camera/camera.dm | 12 +- code/game/machinery/camera/motion.dm | 34 +- code/game/machinery/camera/presets.dm | 4 +- code/game/machinery/camera/tracking.dm | 32 +- code/game/machinery/chiller.dm | 4 +- code/game/machinery/cloning.dm | 64 ++-- .../machinery/computer/HolodeckControl.dm | 16 +- code/game/machinery/computer/Operating.dm | 34 +- code/game/machinery/computer/ai_core.dm | 6 +- code/game/machinery/computer/aifixer.dm | 20 +- code/game/machinery/computer/arcade.dm | 28 +- code/game/machinery/computer/camera.dm | 4 +- .../machinery/computer/camera_advanced.dm | 6 +- code/game/machinery/computer/card.dm | 52 +-- code/game/machinery/computer/cloning.dm | 84 ++--- .../game/machinery/computer/communications.dm | 14 +- code/game/machinery/computer/computer.dm | 12 +- code/game/machinery/computer/hologram.dm | 36 +- code/game/machinery/computer/honkputer.dm | 16 +- code/game/machinery/computer/law.dm | 6 +- code/game/machinery/computer/medical.dm | 166 ++++---- code/game/machinery/computer/message.dm | 36 +- .../computer/pod_tracking_console.dm | 2 +- code/game/machinery/computer/robot.dm | 10 +- code/game/machinery/computer/security.dm | 154 ++++---- code/game/machinery/computer/skills.dm | 86 ++--- .../machinery/computer/specops_shuttle.dm | 22 +- code/game/machinery/computer/store.dm | 2 +- .../computer/syndicate_specops_shuttle.dm | 22 +- code/game/machinery/cryo.dm | 24 +- code/game/machinery/cryopod.dm | 12 +- code/game/machinery/deployable.dm | 38 +- code/game/machinery/door_control.dm | 8 +- code/game/machinery/doors/airlock.dm | 42 +-- code/game/machinery/doors/airlock_control.dm | 8 +- .../machinery/doors/airlock_electronics.dm | 36 +- code/game/machinery/doors/brigdoors.dm | 4 +- code/game/machinery/doors/poddoor.dm | 10 +- code/game/machinery/doors/windowdoor.dm | 28 +- code/game/machinery/dye_generator.dm | 2 +- .../airlock_controllers.dm | 6 +- .../airlock_docking_controller.dm | 10 +- .../airlock_docking_controller_multi.dm | 10 +- .../embedded_controller/airlock_program.dm | 6 +- .../embedded_controller/docking_program.dm | 92 ++--- .../docking_program_multi.dm | 82 ++-- .../embedded_program_base.dm | 2 +- .../simple_docking_controller.dm | 8 +- code/game/machinery/firealarm.dm | 42 +-- code/game/machinery/flasher.dm | 26 +- code/game/machinery/floodlight.dm | 10 +- code/game/machinery/guestpass.dm | 56 +-- code/game/machinery/hologram.dm | 8 +- code/game/machinery/holosign.dm | 8 +- code/game/machinery/igniter.dm | 20 +- code/game/machinery/iv_drip.dm | 6 +- code/game/machinery/kitchen/gibber.dm | 4 +- code/game/machinery/kitchen/icecream_vat.dm | 2 +- code/game/machinery/kitchen/juicer.dm | 44 +-- .../game/machinery/kitchen/kitchen_machine.dm | 92 ++--- code/game/machinery/kitchen/monkeyrecycler.dm | 6 +- code/game/machinery/kitchen/processor.dm | 20 +- code/game/machinery/kitchen/smartfridge.dm | 4 +- code/game/machinery/lightswitch.dm | 2 +- code/game/machinery/machinery.dm | 20 +- code/game/machinery/mass_driver.dm | 2 +- code/game/machinery/navbeacon.dm | 4 +- code/game/machinery/newscaster.dm | 22 +- code/game/machinery/pipe/construction.dm | 60 +-- code/game/machinery/pipe/pipe_dispenser.dm | 18 +- code/game/machinery/podmen.dm | 16 +- code/game/machinery/portable_tag_turret.dm | 2 +- code/game/machinery/portable_turret.dm | 16 +- code/game/machinery/programmable_unloader.dm | 12 +- code/game/machinery/recharger.dm | 2 +- code/game/machinery/rechargestation.dm | 16 +- code/game/machinery/recycler.dm | 4 +- code/game/machinery/requests_console.dm | 34 +- code/game/machinery/robot_fabricator.dm | 44 +-- code/game/machinery/shieldgen.dm | 22 +- code/game/machinery/slotmachine.dm | 20 +- code/game/machinery/spaceheater.dm | 4 +- code/game/machinery/suit_storage_unit.dm | 72 ++-- code/game/machinery/syndicatebomb.dm | 2 +- code/game/machinery/telecomms/broadcaster.dm | 68 ++-- code/game/machinery/telecomms/logbrowser.dm | 6 +- code/game/machinery/telecomms/telemonitor.dm | 6 +- .../machinery/telecomms/traffic_control.dm | 6 +- code/game/machinery/teleporter.dm | 34 +- code/game/machinery/transformer.dm | 2 +- code/game/machinery/turret_control.dm | 8 +- code/game/machinery/turrets.dm | 48 +-- code/game/machinery/vending.dm | 36 +- code/game/machinery/washing_machine.dm | 30 +- code/game/mecha/combat/durand.dm | 2 +- code/game/mecha/combat/gygax.dm | 2 +- code/game/mecha/combat/honker.dm | 4 +- code/game/mecha/combat/marauder.dm | 6 +- code/game/mecha/combat/phazon.dm | 4 +- code/game/mecha/equipment/tools/tools.dm | 6 +- code/game/mecha/equipment/weapons/weapons.dm | 8 +- code/game/mecha/mech_bay.dm | 2 +- code/game/mecha/mech_fabricator.dm | 4 +- code/game/mecha/mecha.dm | 40 +- code/game/mecha/mecha_construction_paths.dm | 6 +- code/game/mecha/mecha_control_console.dm | 2 +- code/game/mecha/mecha_wreckage.dm | 2 +- code/game/mecha/medical/odysseus.dm | 2 +- code/game/mecha/working/ripley.dm | 12 +- code/game/objects/buckling.dm | 2 +- code/game/objects/effects/aliens.dm | 4 +- .../effects/decals/Cleanable/humans.dm | 18 +- .../effects/decals/Cleanable/robots.dm | 10 +- code/game/objects/effects/decals/cleanable.dm | 2 +- code/game/objects/effects/effect_system.dm | 72 ++-- code/game/objects/effects/glowshroom.dm | 4 +- code/game/objects/effects/landmarks.dm | 4 +- code/game/objects/effects/portals.dm | 4 +- .../objects/effects/spawners/bombspawner.dm | 8 +- code/game/objects/effects/spiders.dm | 4 +- code/game/objects/explosion.dm | 4 +- code/game/objects/items.dm | 28 +- code/game/objects/items/ashtray.dm | 28 +- code/game/objects/items/blueprints.dm | 38 +- code/game/objects/items/bodybag.dm | 8 +- code/game/objects/items/changestone.dm | 2 +- code/game/objects/items/crayons.dm | 6 +- code/game/objects/items/devices/aicard.dm | 12 +- code/game/objects/items/devices/camera_bug.dm | 2 +- code/game/objects/items/devices/flashlight.dm | 2 +- .../objects/items/devices/laserpointer.dm | 4 +- code/game/objects/items/devices/megaphone.dm | 4 +- code/game/objects/items/devices/modkit.dm | 12 +- code/game/objects/items/devices/paicard.dm | 4 +- .../objects/items/devices/pipe_painter.dm | 2 +- code/game/objects/items/devices/powersink.dm | 2 +- .../objects/items/devices/radio/beacon.dm | 4 +- .../objects/items/devices/radio/headset.dm | 12 +- .../objects/items/devices/radio/intercom.dm | 4 +- .../game/objects/items/devices/radio/radio.dm | 88 ++--- code/game/objects/items/devices/scanners.dm | 50 +-- .../objects/items/devices/transfer_valve.dm | 10 +- code/game/objects/items/devices/uplinks.dm | 8 +- code/game/objects/items/devices/whistle.dm | 2 +- .../items/mountable_frames/apc_frame.dm | 4 +- .../objects/items/mountable_frames/frames.dm | 6 +- .../objects/items/mountable_frames/lights.dm | 2 +- .../items/mountable_frames/mountables.dm | 4 +- .../mountable_frames/newscaster_frame.dm | 4 +- code/game/objects/items/policetape.dm | 20 +- code/game/objects/items/robot/robot_items.dm | 2 +- code/game/objects/items/robot/robot_parts.dm | 4 +- code/game/objects/items/shooting_range.dm | 4 +- code/game/objects/items/stacks/medical.dm | 36 +- code/game/objects/items/stacks/nanopaste.dm | 10 +- code/game/objects/items/stacks/rods.dm | 10 +- .../game/objects/items/stacks/sheets/glass.dm | 12 +- .../objects/items/stacks/sheets/sheets.dm | 4 +- code/game/objects/items/stacks/stack.dm | 98 ++--- code/game/objects/items/toys.dm | 12 +- code/game/objects/items/weapons/AI_modules.dm | 22 +- code/game/objects/items/weapons/RCD.dm | 10 +- code/game/objects/items/weapons/RSF.dm | 90 ++--- code/game/objects/items/weapons/cards_ids.dm | 6 +- .../game/objects/items/weapons/clown_items.dm | 4 +- code/game/objects/items/weapons/defib.dm | 2 +- .../objects/items/weapons/dna_injector.dm | 12 +- .../objects/items/weapons/dnascrambler.dm | 2 +- code/game/objects/items/weapons/explosives.dm | 12 +- .../objects/items/weapons/extinguisher.dm | 6 +- code/game/objects/items/weapons/fireworks.dm | 4 +- .../objects/items/weapons/gift_wrappaper.dm | 6 +- .../items/weapons/grenades/flashbang.dm | 4 +- .../objects/items/weapons/grenades/grenade.dm | 12 +- code/game/objects/items/weapons/handcuffs.dm | 2 +- .../items/weapons/implants/implant_chem.dm | 2 +- .../weapons/implants/implant_death_alarm.dm | 4 +- .../items/weapons/implants/implant_misc.dm | 2 +- .../items/weapons/implants/implantchair.dm | 4 +- .../items/weapons/implants/implanter.dm | 2 +- .../items/weapons/implants/implantpad.dm | 6 +- code/game/objects/items/weapons/kitchen.dm | 4 +- code/game/objects/items/weapons/legcuffs.dm | 8 +- .../objects/items/weapons/melee/energy.dm | 2 +- code/game/objects/items/weapons/paint.dm | 2 +- code/game/objects/items/weapons/scissors.dm | 2 +- code/game/objects/items/weapons/scrolls.dm | 12 +- code/game/objects/items/weapons/shards.dm | 2 +- code/game/objects/items/weapons/soap.dm | 2 +- .../items/weapons/storage/artistic_toolbox.dm | 2 +- .../objects/items/weapons/storage/backpack.dm | 6 +- .../objects/items/weapons/storage/bags.dm | 18 +- .../objects/items/weapons/storage/belt.dm | 24 +- .../objects/items/weapons/storage/bible.dm | 10 +- .../objects/items/weapons/storage/boxes.dm | 2 +- .../objects/items/weapons/storage/fancy.dm | 2 +- .../objects/items/weapons/storage/firstaid.dm | 22 +- .../objects/items/weapons/storage/internal.dm | 14 +- .../objects/items/weapons/storage/lockbox.dm | 2 +- .../objects/items/weapons/storage/secure.dm | 46 +-- .../objects/items/weapons/storage/storage.dm | 82 ++-- .../objects/items/weapons/storage/toolbox.dm | 2 +- .../items/weapons/storage/uplink_kits.dm | 2 +- .../objects/items/weapons/swords_axes_etc.dm | 2 +- .../objects/items/weapons/table_rack_parts.dm | 2 +- .../objects/items/weapons/tanks/tank_types.dm | 4 +- .../game/objects/items/weapons/tanks/tanks.dm | 42 +-- .../objects/items/weapons/tanks/watertank.dm | 8 +- .../objects/items/weapons/teleportation.dm | 24 +- code/game/objects/items/weapons/tools.dm | 22 +- code/game/objects/items/weapons/twohanded.dm | 4 +- code/game/objects/items/weapons/wires.dm | 4 +- code/game/objects/objs.dm | 12 +- code/game/objects/random/random.dm | 2 +- code/game/objects/structures.dm | 14 +- code/game/objects/structures/barsign.dm | 4 +- code/game/objects/structures/coathanger.dm | 14 +- .../structures/crates_lockers/closets.dm | 10 +- .../crates_lockers/closets/fireaxe.dm | 10 +- .../closets/secure/guncabinet.dm | 16 +- .../crates_lockers/closets/secure/medical.dm | 6 +- .../crates_lockers/closets/secure/personal.dm | 6 +- .../closets/secure/secure_closets.dm | 2 +- .../crates_lockers/closets/statue.dm | 4 +- .../crates_lockers/closets/utility_closets.dm | 16 +- .../structures/crates_lockers/crates.dm | 6 +- .../structures/crates_lockers/walllocker.dm | 2 +- code/game/objects/structures/displaycase.dm | 20 +- code/game/objects/structures/door_assembly.dm | 14 +- code/game/objects/structures/engicart.dm | 2 +- code/game/objects/structures/extinguisher.dm | 4 +- code/game/objects/structures/false_walls.dm | 2 +- code/game/objects/structures/flora.dm | 4 +- code/game/objects/structures/foodcart.dm | 2 +- code/game/objects/structures/girders.dm | 18 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/inflatable.dm | 4 +- code/game/objects/structures/janicart.dm | 2 +- code/game/objects/structures/lamarr_cage.dm | 20 +- code/game/objects/structures/lattice.dm | 10 +- code/game/objects/structures/mineral_doors.dm | 4 +- code/game/objects/structures/mirror.dm | 2 +- code/game/objects/structures/misc.dm | 2 +- code/game/objects/structures/mop_bucket.dm | 10 +- code/game/objects/structures/morgue.dm | 132 +++---- code/game/objects/structures/musician.dm | 10 +- .../stool_bed_chair_nest/alien_nests.dm | 2 +- .../structures/stool_bed_chair_nest/stools.dm | 10 +- code/game/objects/structures/tables_racks.dm | 76 ++-- code/game/objects/structures/watercloset.dm | 14 +- .../objects/structures/windoor_assembly.dm | 4 +- code/game/objects/structures/window.dm | 18 +- code/game/response_team.dm | 12 +- code/game/skincmd.dm | 2 +- code/game/sound.dm | 36 +- code/game/turfs/simulated.dm | 10 +- code/game/turfs/simulated/floor.dm | 6 +- code/game/turfs/simulated/floor/plating.dm | 4 +- code/game/turfs/simulated/walls.dm | 14 +- code/game/turfs/simulated/walls_mineral.dm | 2 +- code/game/turfs/simulated/walls_reinforced.dm | 4 +- code/game/turfs/space/space.dm | 14 +- code/game/turfs/turf.dm | 4 +- code/game/verbs/ooc.dm | 2 +- code/game/verbs/suicide.dm | 30 +- code/game/verbs/who.dm | 4 +- code/modules/admin/IsBanned.dm | 18 +- code/modules/admin/NewBan.dm | 44 +-- code/modules/admin/admin.dm | 56 +-- code/modules/admin/admin_verbs.dm | 18 +- code/modules/admin/banappearance.dm | 8 +- code/modules/admin/banjob.dm | 12 +- code/modules/admin/create_mob.dm | 2 +- code/modules/admin/create_object.dm | 4 +- code/modules/admin/create_turf.dm | 2 +- code/modules/admin/newbanjob.dm | 44 +-- .../admin/permissionverbs/permissionedit.dm | 2 +- code/modules/admin/player_panel.dm | 14 +- code/modules/admin/secrets.dm | 6 +- code/modules/admin/sql_notes.dm | 2 +- code/modules/admin/stickyban.dm | 84 ++--- code/modules/admin/topic.dm | 78 ++-- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 4 +- .../admin/verbs/SDQL2/SDQL_2_parser.dm | 2 +- code/modules/admin/verbs/adminpm.dm | 2 +- code/modules/admin/verbs/adminsay.dm | 2 +- code/modules/admin/verbs/atmosdebug.dm | 18 +- code/modules/admin/verbs/deadsay.dm | 10 +- code/modules/admin/verbs/debug.dm | 40 +- code/modules/admin/verbs/diagnostics.dm | 12 +- code/modules/admin/verbs/freeze.dm | 2 +- code/modules/admin/verbs/honksquad.dm | 2 +- code/modules/admin/verbs/mapping.dm | 4 +- code/modules/admin/verbs/massmodvar.dm | 76 ++-- code/modules/admin/verbs/modifyvariables.dm | 6 +- code/modules/admin/verbs/one_click_antag.dm | 26 +- code/modules/admin/verbs/onlyone.dm | 4 +- code/modules/admin/verbs/onlyoneteam.dm | 4 +- code/modules/admin/verbs/pray.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 28 +- code/modules/admin/verbs/striketeam.dm | 14 +- .../admin/verbs/striketeam_syndicate.dm | 18 +- code/modules/admin/verbs/vox_raiders.dm | 2 +- code/modules/alarm/alarm_handler.dm | 2 +- code/modules/arcade/arcade_base.dm | 2 +- code/modules/arcade/prize_counter.dm | 2 +- code/modules/assembly/bomb.dm | 4 +- code/modules/assembly/holder.dm | 8 +- code/modules/assembly/igniter.dm | 8 +- code/modules/assembly/proximity.dm | 4 +- code/modules/assembly/signaler.dm | 4 +- code/modules/atmos_automation/console.dm | 2 +- .../awaymissions/bluespaceartillery.dm | 2 +- code/modules/awaymissions/gateway.dm | 4 +- .../mission_code/stationCollision.dm | 2 +- .../awaymissions/mission_code/wildwest.dm | 2 +- code/modules/awaymissions/zlevel.dm | 14 +- code/modules/client/asset_cache.dm | 22 +- code/modules/client/client procs.dm | 8 +- code/modules/client/message.dm | 4 +- code/modules/client/preference/preferences.dm | 48 +-- .../client/preference/preferences_mysql.dm | 2 +- code/modules/clothing/clothing.dm | 30 +- code/modules/clothing/glasses/glasses.dm | 2 +- code/modules/clothing/head/misc_special.dm | 4 +- code/modules/clothing/shoes/colour.dm | 6 +- code/modules/clothing/spacesuits/alien.dm | 4 +- code/modules/clothing/spacesuits/breaches.dm | 6 +- code/modules/clothing/spacesuits/rig/rig.dm | 6 +- code/modules/clothing/suits/storage.dm | 6 +- .../clothing/under/accessories/accessory.dm | 8 +- .../clothing/under/accessories/holster.dm | 16 +- .../clothing/under/accessories/storage.dm | 12 +- code/modules/computer3/component.dm | 18 +- code/modules/computer3/computer.dm | 10 +- code/modules/computer3/computers/aifixer.dm | 24 +- code/modules/computer3/computers/arcade.dm | 22 +- .../computer3/computers/atmos_alert.dm | 2 +- code/modules/computer3/computers/camera.dm | 2 +- code/modules/computer3/computers/card.dm | 6 +- code/modules/computer3/computers/cloning.dm | 70 ++-- .../computer3/computers/communications.dm | 22 +- code/modules/computer3/computers/law.dm | 6 +- code/modules/computer3/computers/medical.dm | 178 ++++----- code/modules/computer3/computers/message.dm | 38 +- .../computer3/computers/prisonshuttle.dm | 30 +- code/modules/computer3/computers/robot.dm | 40 +- .../computer3/computers/scanconsole.dm | 338 ++++++++--------- code/modules/computer3/computers/security.dm | 166 ++++---- code/modules/computer3/computers/shuttle.dm | 12 +- .../computer3/computers/specops_shuttle.dm | 18 +- .../computer3/computers/station_alert.dm | 30 +- .../computers/syndicate_specops_shuttle.dm | 18 +- code/modules/computer3/lapvend.dm | 56 +-- code/modules/crafting/guncrafting.dm | 2 +- code/modules/customitems/item_spawning.dm | 4 +- code/modules/detective_work/scanner.dm | 14 +- code/modules/economy/ATM.dm | 2 +- code/modules/economy/Accounts.dm | 2 +- code/modules/economy/Accounts_DB.dm | 18 +- code/modules/economy/EFTPOS.dm | 8 +- code/modules/economy/utils.dm | 2 +- code/modules/events/anomaly_bluespace.dm | 2 +- code/modules/events/carp_migration.dm | 4 +- code/modules/events/dust.dm | 2 +- code/modules/events/event_manager.dm | 10 +- code/modules/events/holidays/Holidays.dm | 2 +- code/modules/events/immovable_rod.dm | 4 +- code/modules/events/ion_storm.dm | 2 +- code/modules/events/meaty_ores.dm | 2 +- code/modules/events/money_spam.dm | 8 +- code/modules/events/radiation_storm.dm | 2 +- code/modules/fish/fishtank.dm | 6 +- code/modules/flufftext/Hallucination.dm | 2 +- code/modules/flufftext/TextFilters.dm | 2 +- code/modules/food/cooker.dm | 6 +- code/modules/food/customizables.dm | 32 +- code/modules/food/deep_fryer.dm | 4 +- code/modules/food/recipes_oven.dm | 4 +- .../garbage_collection/garbage_collector.dm | 10 +- code/modules/garbage_collection/gc_testing.dm | 8 +- code/modules/hydroponics/grown.dm | 6 +- code/modules/hydroponics/seed_machines.dm | 8 +- code/modules/hydroponics/seed_storage.dm | 64 ++-- .../hydroponics/spreading/spreading.dm | 4 +- code/modules/hydroponics/trays/tray.dm | 20 +- code/modules/hydroponics/trays/tray_apiary.dm | 2 +- .../modules/hydroponics/trays/tray_process.dm | 8 +- .../hydroponics/trays/tray_reagents.dm | 2 +- code/modules/hydroponics/trays/tray_tools.dm | 2 +- code/modules/karma/karma.dm | 6 +- code/modules/library/computers/base.dm | 4 +- code/modules/library/computers/checkout.dm | 4 +- code/modules/library/lib_items.dm | 2 +- code/modules/media/jukebox.dm | 8 +- code/modules/media/mediamanager.dm | 6 +- code/modules/mining/abandonedcrates.dm | 4 +- code/modules/mining/coins.dm | 2 +- code/modules/mining/equipment_locker.dm | 12 +- code/modules/mining/laborcamp/laborstacker.dm | 2 +- code/modules/mining/machine_processing.dm | 172 ++++----- code/modules/mining/machine_stacking.dm | 2 +- code/modules/mining/machine_unloading.dm | 6 +- code/modules/mining/manufacturing.dm | 196 +++++----- code/modules/mining/mine_turfs.dm | 48 +-- code/modules/mining/mint.dm | 34 +- code/modules/mining/money_bag.dm | 44 +-- code/modules/mining/satchel_ore_boxdm.dm | 50 +-- code/modules/mob/dead/observer/login.dm | 2 +- code/modules/mob/dead/observer/logout.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 32 +- code/modules/mob/dead/observer/say.dm | 6 +- code/modules/mob/emote.dm | 14 +- code/modules/mob/hear_say.dm | 26 +- code/modules/mob/language.dm | 12 +- code/modules/mob/living/carbon/alien/alien.dm | 12 +- .../mob/living/carbon/alien/alien_defenses.dm | 12 +- .../carbon/alien/humanoid/alien_powers.dm | 4 +- .../carbon/alien/humanoid/caste/hunter.dm | 4 +- .../carbon/alien/humanoid/caste/sentinel.dm | 4 +- .../mob/living/carbon/alien/humanoid/emote.dm | 28 +- .../living/carbon/alien/humanoid/empress.dm | 4 +- .../living/carbon/alien/humanoid/humanoid.dm | 74 ++-- .../mob/living/carbon/alien/humanoid/life.dm | 16 +- .../mob/living/carbon/alien/humanoid/queen.dm | 4 +- .../carbon/alien/humanoid/update_icons.dm | 6 +- .../mob/living/carbon/alien/larva/emote.dm | 38 +- .../mob/living/carbon/alien/larva/larva.dm | 42 +-- .../mob/living/carbon/alien/larva/powers.dm | 6 +- .../living/carbon/alien/larva/update_icons.dm | 4 +- .../living/carbon/alien/special/facehugger.dm | 4 +- code/modules/mob/living/carbon/brain/brain.dm | 12 +- code/modules/mob/living/carbon/brain/emote.dm | 20 +- code/modules/mob/living/carbon/brain/life.dm | 4 +- .../mob/living/carbon/brain/posibrain.dm | 8 +- code/modules/mob/living/carbon/brain/say.dm | 8 +- code/modules/mob/living/carbon/carbon.dm | 62 +-- code/modules/mob/living/carbon/human/emote.dm | 356 +++++++++--------- .../mob/living/carbon/human/examine.dm | 26 +- code/modules/mob/living/carbon/human/human.dm | 166 ++++---- .../living/carbon/human/human_attackhand.dm | 6 +- .../mob/living/carbon/human/human_damage.dm | 6 +- .../mob/living/carbon/human/human_defense.dm | 18 +- .../mob/living/carbon/human/human_movement.dm | 4 +- .../mob/living/carbon/human/human_organs.dm | 22 +- .../carbon/human/interactive/functions.dm | 2 +- .../mob/living/carbon/human/inventory.dm | 8 +- code/modules/mob/living/carbon/human/life.dm | 48 +-- code/modules/mob/living/carbon/human/say.dm | 14 +- .../living/carbon/human/species/plasmaman.dm | 2 +- .../mob/living/carbon/human/species/shadow.dm | 2 +- .../living/carbon/human/species/species.dm | 2 +- .../living/carbon/human/species/station.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 6 +- code/modules/mob/living/carbon/life.dm | 2 +- code/modules/mob/living/carbon/shock.dm | 2 +- code/modules/mob/living/carbon/slime/emote.dm | 20 +- .../mob/living/carbon/slime/examine.dm | 6 +- code/modules/mob/living/carbon/slime/life.dm | 186 ++++----- code/modules/mob/living/carbon/slime/say.dm | 10 +- code/modules/mob/living/carbon/slime/slime.dm | 66 ++-- code/modules/mob/living/life.dm | 2 +- code/modules/mob/living/living.dm | 48 +-- code/modules/mob/living/living_defense.dm | 8 +- code/modules/mob/living/logout.dm | 2 +- code/modules/mob/living/say.dm | 30 +- code/modules/mob/living/silicon/ai/ai.dm | 100 ++--- code/modules/mob/living/silicon/ai/death.dm | 4 +- code/modules/mob/living/silicon/ai/examine.dm | 12 +- .../mob/living/silicon/ai/freelook/eye.dm | 4 +- code/modules/mob/living/silicon/ai/laws.dm | 2 +- code/modules/mob/living/silicon/ai/life.dm | 6 +- code/modules/mob/living/silicon/ai/logout.dm | 2 +- code/modules/mob/living/silicon/decoy/life.dm | 4 +- code/modules/mob/living/silicon/emote.dm | 32 +- code/modules/mob/living/silicon/laws.dm | 2 +- code/modules/mob/living/silicon/pai/death.dm | 2 +- code/modules/mob/living/silicon/pai/life.dm | 2 +- code/modules/mob/living/silicon/pai/pai.dm | 44 +-- .../mob/living/silicon/pai/personality.dm | 8 +- .../modules/mob/living/silicon/pai/recruit.dm | 2 +- .../mob/living/silicon/pai/software.dm | 2 +- .../living/silicon/pai/software_modules.dm | 14 +- .../mob/living/silicon/robot/drone/drone.dm | 4 +- .../silicon/robot/drone/drone_abilities.dm | 2 +- .../silicon/robot/drone/drone_console.dm | 14 +- .../living/silicon/robot/drone/drone_items.dm | 12 +- .../silicon/robot/drone/drone_manufacturer.dm | 8 +- .../living/silicon/robot/drone/drone_say.dm | 12 +- .../modules/mob/living/silicon/robot/emote.dm | 94 ++--- .../mob/living/silicon/robot/examine.dm | 14 +- .../mob/living/silicon/robot/inventory.dm | 2 +- code/modules/mob/living/silicon/robot/laws.dm | 12 +- code/modules/mob/living/silicon/robot/life.dm | 8 +- .../mob/living/silicon/robot/photos.dm | 4 +- .../modules/mob/living/silicon/robot/robot.dm | 102 ++--- .../mob/living/silicon/robot/robot_damage.dm | 2 +- .../mob/living/silicon/robot/robot_items.dm | 8 +- .../mob/living/silicon/robot/robot_modules.dm | 2 +- code/modules/mob/living/silicon/say.dm | 20 +- code/modules/mob/living/silicon/silicon.dm | 26 +- .../mob/living/simple_animal/bot/bot.dm | 4 +- .../mob/living/simple_animal/bot/ed209bot.dm | 2 +- .../mob/living/simple_animal/bot/emote.dm | 32 +- .../mob/living/simple_animal/bot/mulebot.dm | 4 +- .../mob/living/simple_animal/bot/secbot.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 10 +- .../living/simple_animal/friendly/corgi.dm | 28 +- .../simple_animal/friendly/corgi_powers.dm | 2 +- .../mob/living/simple_animal/friendly/crab.dm | 6 +- .../living/simple_animal/friendly/diona.dm | 2 +- .../living/simple_animal/friendly/slime.dm | 10 +- .../simple_animal/friendly/spiderbot.dm | 16 +- .../living/simple_animal/hostile/syndicate.dm | 2 +- .../living/simple_animal/posessed_object.dm | 2 +- .../mob/living/simple_animal/powers.dm | 6 +- .../modules/mob/living/simple_animal/shade.dm | 6 +- .../mob/living/simple_animal/simple_animal.dm | 32 +- .../mob/living/simple_animal/tribbles.dm | 22 +- code/modules/mob/living/simple_animal/vox.dm | 12 +- code/modules/mob/logout.dm | 2 +- code/modules/mob/mob.dm | 80 ++-- code/modules/mob/mob_defines.dm | 2 +- code/modules/mob/mob_grab.dm | 4 +- code/modules/mob/mob_helpers.dm | 28 +- code/modules/mob/mob_movement.dm | 36 +- code/modules/mob/new_player/new_player.dm | 18 +- code/modules/mob/new_player/poll.dm | 6 +- .../mob/new_player/preferences_setup.dm | 2 +- code/modules/mob/say.dm | 12 +- code/modules/mob/spirit/cultnet.dm | 4 +- code/modules/mob/spirit/mask/mask.dm | 28 +- code/modules/mob/spirit/movement.dm | 6 +- code/modules/mob/spirit/spirit.dm | 8 +- code/modules/mob/spirit/viewpoint.dm | 30 +- code/modules/mob/transform_procs.dm | 26 +- code/modules/mob/typing_indicator.dm | 4 +- code/modules/nano/interaction/base.dm | 6 +- code/modules/nano/interaction/default.dm | 8 +- code/modules/nano/modules/alarm_monitor.dm | 2 +- code/modules/nano/modules/crew_monitor.dm | 2 +- code/modules/nano/modules/human_appearance.dm | 2 +- code/modules/nano/modules/law_manager.dm | 4 +- code/modules/nano/modules/power_monitor.dm | 4 +- code/modules/nano/nanoexternal.dm | 4 +- code/modules/nano/nanomanager.dm | 52 +-- code/modules/nano/nanomapgen.dm | 16 +- code/modules/nano/nanoui.dm | 38 +- code/modules/ninja/martial_art.dm | 2 +- code/modules/ninja/suit/SpiderOS.dm | 10 +- code/modules/ninja/suit/suit_attackby.dm | 2 +- code/modules/paperwork/carbonpaper.dm | 4 +- code/modules/paperwork/faxmachine.dm | 30 +- code/modules/paperwork/paper.dm | 22 +- code/modules/paperwork/paper_bundle.dm | 6 +- code/modules/paperwork/paperbin.dm | 4 +- code/modules/paperwork/photocopier.dm | 20 +- code/modules/paperwork/photography.dm | 6 +- code/modules/pda/PDA.dm | 36 +- code/modules/pda/ai.dm | 6 +- code/modules/pda/cart_apps.dm | 8 +- code/modules/pda/chatroom.dm | 8 +- code/modules/pda/core_apps.dm | 2 +- code/modules/pda/messenger.dm | 14 +- code/modules/pda/messenger_plugins.dm | 2 +- code/modules/pda/pdas.dm | 2 +- code/modules/pda/radio.dm | 4 +- code/modules/pda/utilities.dm | 18 +- code/modules/pooling/pool.dm | 2 +- code/modules/power/apc.dm | 176 ++++----- code/modules/power/cable.dm | 30 +- code/modules/power/cell.dm | 46 +-- code/modules/power/engine.dm | 4 +- code/modules/power/generator.dm | 10 +- code/modules/power/generator_type2.dm | 2 +- code/modules/power/gravitygenerator.dm | 6 +- code/modules/power/lighting.dm | 34 +- code/modules/power/port_gen.dm | 42 +-- code/modules/power/power.dm | 20 +- code/modules/power/powernet.dm | 16 +- code/modules/power/singularity/collector.dm | 4 +- code/modules/power/singularity/emitter.dm | 12 +- .../power/singularity/field_generator.dm | 26 +- code/modules/power/singularity/investigate.dm | 2 +- .../particle_accelerator/particle.dm | 2 +- .../particle_accelerator.dm | 16 +- .../particle_accelerator/particle_control.dm | 2 +- code/modules/power/singularity/singularity.dm | 4 +- code/modules/power/smes.dm | 28 +- code/modules/power/solar.dm | 16 +- code/modules/power/supermatter/sm_crystals.dm | 4 +- code/modules/power/supermatter/supermatter.dm | 2 +- code/modules/power/tesla/energy_ball.dm | 10 +- code/modules/power/turbine.dm | 2 +- .../mapGeneratorModules/helpers.dm | 2 +- code/modules/projectiles/ammunition.dm | 16 +- .../projectiles/ammunition/ammo_casings.dm | 8 +- .../projectiles/ammunition/magazines.dm | 2 +- code/modules/projectiles/firing.dm | 8 +- code/modules/projectiles/guns/dartgun.dm | 18 +- code/modules/projectiles/guns/energy.dm | 12 +- .../projectiles/guns/energy/special.dm | 10 +- .../projectiles/guns/energy/telegun.dm | 2 +- code/modules/projectiles/guns/magic.dm | 2 +- code/modules/projectiles/guns/projectile.dm | 2 +- .../projectiles/guns/projectile/revolver.dm | 18 +- .../projectiles/guns/projectile/shotgun.dm | 4 +- code/modules/projectiles/projectile/magic.dm | 2 +- .../modules/projectiles/projectile/special.dm | 4 +- code/modules/reagents/Chemistry-Holder.dm | 40 +- code/modules/reagents/Chemistry-Machinery.dm | 168 ++++----- code/modules/reagents/newchem/chem_heater.dm | 2 +- code/modules/reagents/newchem/drugs.dm | 2 +- code/modules/reagents/newchem/medicine.dm | 4 +- .../modules/reagents/newchem/newchem_procs.dm | 2 +- code/modules/reagents/newchem/pyro.dm | 10 +- .../reagents/drink/reagents_alcohol.dm | 8 +- .../oldchem/reagents/drink/reagents_drink.dm | 2 +- .../reagents/drink/reagents_drink_base.dm | 10 +- .../oldchem/reagents/reagents_admin.dm | 2 +- .../oldchem/reagents/reagents_drugs.dm | 8 +- .../oldchem/reagents/reagents_food.dm | 14 +- .../reagents/oldchem/reagents/reagents_med.dm | 2 +- .../oldchem/reagents/reagents_toxin.dm | 18 +- .../oldchem/reagents/reagents_water.dm | 8 +- code/modules/reagents/pandemic.dm | 8 +- code/modules/reagents/reagent_containers.dm | 6 +- .../reagents/reagent_containers/borghydro.dm | 4 +- .../reagents/reagent_containers/dropper.dm | 10 +- .../reagents/reagent_containers/food/cans.dm | 8 +- .../reagent_containers/food/condiment.dm | 2 +- .../reagent_containers/food/drinks.dm | 8 +- .../food/drinks/drinkingglass.dm | 4 +- .../reagent_containers/food/drinks/jar.dm | 2 +- .../reagent_containers/food/snacks.dm | 10 +- .../reagent_containers/glass/bottle.dm | 2 +- .../reagent_containers/glass_containers.dm | 14 +- .../reagents/reagent_containers/spray.dm | 6 +- .../reagents/reagent_containers/syringes.dm | 24 +- code/modules/reagents/reagent_dispenser.dm | 16 +- code/modules/recycling/disposal.dm | 32 +- code/modules/recycling/sortingmachinery.dm | 6 +- code/modules/research/circuitprinter.dm | 22 +- code/modules/research/destructive_analyzer.dm | 14 +- code/modules/research/experimentor.dm | 14 +- code/modules/research/message_server.dm | 10 +- code/modules/research/protolathe.dm | 16 +- code/modules/research/rdconsole.dm | 26 +- code/modules/research/rdmachines.dm | 6 +- code/modules/research/server.dm | 10 +- .../xenoarchaeology/artifact/artifact.dm | 8 +- .../artifact/artifact_unknown.dm | 20 +- .../effects/unknown_effect_badfeeling.dm | 6 +- .../effects/unknown_effect_cellcharge.dm | 22 +- .../effects/unknown_effect_celldrain.dm | 22 +- .../effects/unknown_effect_goodfeeling.dm | 6 +- .../artifact/effects/unknown_effect_heal.dm | 4 +- .../artifact/effects/unknown_effect_hurt.dm | 4 +- .../effects/unknown_effect_radiate.dm | 4 +- .../effects/unknown_effect_roboheal.dm | 6 +- .../effects/unknown_effect_robohurt.dm | 6 +- .../artifact/effects/unknown_effect_sleepy.dm | 6 +- .../artifact/effects/unknown_effect_stun.dm | 4 +- .../xenoarchaeology/finds/finds_misc.dm | 4 +- .../finds/finds_talkingitem.dm | 4 +- .../xenoarchaeology/genetics/reconstitutor.dm | 2 +- .../machinery/artifact_harvester.dm | 8 +- .../xenoarchaeology/machinery/coolant.dm | 4 +- .../machinery/geosample_scanner.dm | 6 +- .../tools/ano_device_battery.dm | 2 +- .../tools/suspension_generator.dm | 14 +- .../xenoarchaeology/tools/tools_locater.dm | 2 +- .../xenoarchaeology/tools/tools_pickaxe.dm | 2 +- .../research/xenobiology/xenobiology.dm | 6 +- .../security_levels/keycard authentication.dm | 6 +- code/modules/shuttle/emergency.dm | 6 +- code/modules/shuttle/shuttle.dm | 16 +- code/modules/shuttle/supply.dm | 30 +- code/modules/spacepods/pod_fabricator.dm | 4 +- code/modules/spacepods/spacepod.dm | 16 +- code/modules/surgery/bones.dm | 4 +- code/modules/surgery/encased.dm | 32 +- code/modules/surgery/face.dm | 6 +- code/modules/surgery/generic.dm | 30 +- code/modules/surgery/implant.dm | 22 +- code/modules/surgery/limb_reattach.dm | 8 +- code/modules/surgery/organs/blood.dm | 16 +- code/modules/surgery/organs/organ.dm | 38 +- code/modules/surgery/organs/organ_external.dm | 84 ++--- code/modules/surgery/organs/organ_icon.dm | 4 +- code/modules/surgery/organs/organ_internal.dm | 10 +- .../surgery/organs/subtypes/standard.dm | 8 +- code/modules/surgery/organs/wound.dm | 48 +-- code/modules/surgery/organs_internal.dm | 34 +- code/modules/surgery/other.dm | 16 +- code/modules/surgery/robotics.dm | 28 +- code/modules/surgery/surgery.dm | 14 +- code/modules/telesci/telesci_computer.dm | 10 +- code/modules/tooltip/tooltip.dm | 14 +- code/modules/tooltip/tooltip.html | 28 +- code/world.dm | 38 +- 870 files changed, 7679 insertions(+), 7679 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index adb9d60ab1f..4db227ab6f6 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -156,7 +156,7 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if(can_unwrench && istype(W, /obj/item/weapon/wrench)) var/turf/T = get_turf(src) - if (level == 1 && isturf(T) && T.intact) + if(level == 1 && isturf(T) && T.intact) to_chat(user, "You must remove the plating first.") return 1 var/datum/gas_mixture/int_air = return_air() @@ -168,11 +168,11 @@ Pipelines + Other Objects -> Pipe network playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "You begin to unfasten \the [src]...") - if (internal_pressure > 2*ONE_ATMOSPHERE) + if(internal_pressure > 2*ONE_ATMOSPHERE) to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?") unsafe_wrenching = TRUE //Oh dear oh dear - if (do_after(user, 40, target = src) && isnull(gcDestroyed)) + if(do_after(user, 40, target = src) && isnull(gcDestroyed)) user.visible_message( \ "[user] unfastens \the [src].", \ "You have unfastened \the [src].", \ @@ -293,7 +293,7 @@ Pipelines + Other Objects -> Pipe network add_underlay_adapter(T, , node_dir, "") add_underlay_adapter(T, node, node_dir, "-supply") add_underlay_adapter(T, , node_dir, "-scrubbers") - else if (node.icon_connect_type == "-scrubbers") + else if(node.icon_connect_type == "-scrubbers") add_underlay_adapter(T, , node_dir, "") add_underlay_adapter(T, , node_dir, "-supply") add_underlay_adapter(T, node, node_dir, "-scrubbers") diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index f24623f9422..8951977d4db 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -49,7 +49,7 @@ for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect)) if(target.initialize_directions & get_dir(target,src)) var/c = check_connect_types(target,src) - if (c) + if(c) target.connected_to = c connected_to = c node1 = target @@ -58,7 +58,7 @@ for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect)) if(target.initialize_directions & get_dir(target,src)) var/c = check_connect_types(target,src) - if (c) + if(c) target.connected_to = c connected_to = c node2 = target diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index aff64bd8a10..06fe22de2ce 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -35,7 +35,7 @@ /obj/machinery/atmospherics/binary/dp_vent_pump/New() ..() - if (!id_tag) + if(!id_tag) assign_uid() id_tag = num2text(uid) icon = null @@ -93,11 +93,11 @@ if(T.intact && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe)) return else - if (node1) + if(node1) add_underlay(T, node1, turn(dir, -180), node1.icon_connect_type) else add_underlay(T, node1, turn(dir, -180)) - if (node2) + if(node2) add_underlay(T, node2, dir, node2.icon_connect_type) else add_underlay(T, node2, dir) diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 3e643565ac6..ae27f829621 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -155,9 +155,9 @@ return /obj/machinery/atmospherics/binary/passive_gate/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) - if (!istype(W, /obj/item/weapon/wrench)) + if(!istype(W, /obj/item/weapon/wrench)) return ..() - if (on) + if(on) to_chat(user, "You cannot unwrench this [src], turn it off first.") return 1 return ..() diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index a8d8c453706..6157c87115c 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -182,9 +182,9 @@ Thus, the two variables affect pump operation are set in New(): update_icon() /obj/machinery/atmospherics/binary/pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) - if (!istype(W, /obj/item/weapon/wrench)) + if(!istype(W, /obj/item/weapon/wrench)) return ..() - if (!(stat & NOPOWER) && on) + if(!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") return 1 return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/valve.dm b/code/ATMOSPHERICS/components/binary_devices/valve.dm index 1c0f625e036..b9ab8a4272d 100644 --- a/code/ATMOSPHERICS/components/binary_devices/valve.dm +++ b/code/ATMOSPHERICS/components/binary_devices/valve.dm @@ -52,7 +52,7 @@ add_fingerprint(usr) update_icon(1) sleep(10) - if (open) + if(open) close() return open() diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 059cb25f080..875f09f6bda 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -173,9 +173,9 @@ Thus, the two variables affect pump operation are set in New(): update_icon() /obj/machinery/atmospherics/binary/volume_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) - if (!istype(W, /obj/item/weapon/wrench)) + if(!istype(W, /obj/item/weapon/wrench)) return ..() - if (!(stat & NOPOWER) && on) + if(!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") return 1 return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm index 8570f92462a..94efade9b1a 100644 --- a/code/ATMOSPHERICS/components/omni_devices/filter.dm +++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm @@ -117,7 +117,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) - if (!ui) + if(!ui) ui = new(user, src, ui_key, "omni_filter.tmpl", "Omni Filter Control", 330, 330) ui.set_initial_data(data) ui.open() diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm index 27bf6437c9e..c64703773d3 100644 --- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm @@ -141,7 +141,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) - if (!ui) + if(!ui) ui = new(user, src, ui_key, "omni_mixer.tmpl", "Omni Mixer Control", 360, 330) ui.set_initial_data(data) ui.open() diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 77fd2328b08..beae30e55db 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -103,7 +103,7 @@ for(var/datum/omni_port/P in ports) int_pressure += P.air.return_pressure() var/datum/gas_mixture/env_air = loc.return_air() - if ((int_pressure - env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + if((int_pressure - env_air.return_pressure()) > 2*ONE_ATMOSPHERE) to_chat(user, "You cannot unwrench [src], it is too exerted due to internal pressure.") add_fingerprint(user) return 1 diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 698753fa1be..612f51df80a 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -191,7 +191,7 @@ Filter types: onclose(user, "atmo_filter") return - if (src.temp) + if(src.temp) dat = text("[]

    Clear Screen", src.temp, src) //else // src.on != src.on @@ -207,7 +207,7 @@ Filter types: src.add_fingerprint(usr) if(href_list["filterset"]) src.filter_type = text2num(href_list["filterset"]) - if (href_list["temp"]) + if(href_list["temp"]) src.temp = null if(href_list["set_press"]) var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num @@ -218,7 +218,7 @@ Filter types: src.updateUsrDialog() /* for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) + if((M.client && M.machine == src)) src.attack_hand(M) */ return diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm index 2f6845a16c6..cdf11742ad8 100644 --- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm @@ -172,7 +172,7 @@ interact(user) return 1 if(istype(W, /obj/item/weapon/wrench)) - if (!(stat & NOPOWER) && on) + if(!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn if off first.") return 1 return ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm b/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm index 94384f8ca3d..dc7da589017 100644 --- a/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm +++ b/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm @@ -28,10 +28,10 @@ var/transfer_moles = 0.25 * environment.total_moles() var/datum/gas_mixture/external_removed = environment.remove(transfer_moles) - if (!external_removed) + if(!external_removed) return radiate() - if (external_removed.total_moles() < 10) + if(external_removed.total_moles() < 10) return radiate() //Get same info from connected gas @@ -39,7 +39,7 @@ var/internal_transfer_moles = 0.25 * air_contents.total_moles() var/datum/gas_mixture/internal_removed = air_contents.remove(internal_transfer_moles) - if (!internal_removed) + if(!internal_removed) environment.merge(external_removed) return 1 @@ -63,7 +63,7 @@ var/internal_transfer_moles = 0.25 * air_contents.total_moles() var/datum/gas_mixture/internal_removed = air_contents.remove(internal_transfer_moles) - if (!internal_removed) + if(!internal_removed) return 1 var/combined_heat_capacity = internal_removed.heat_capacity() + RADIATION_CAPACITY diff --git a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm index 3c993e26b0b..e61a62736c3 100644 --- a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm @@ -27,7 +27,7 @@ for(var/obj/machinery/atmospherics/target in get_step(src, dir)) if(target.initialize_directions & get_dir(target,src)) var/c = check_connect_types(target,src) - if (c) + if(c) target.connected_to = c src.connected_to = c node = target diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 6fe6c646cf5..0a856fb047a 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -63,7 +63,7 @@ icon = null initial_loc = get_area(loc) area_uid = initial_loc.uid - if (!id_tag) + if(!id_tag) assign_uid() id_tag = num2text(uid) ..() @@ -121,7 +121,7 @@ /obj/machinery/atmospherics/unary/vent_pump/process() if(!..() || (stat & (NOPOWER|BROKEN))) return 0 - if (!node) + if(!node) on = 0 //broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0 if(!on) @@ -164,7 +164,7 @@ var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - if (isnull(removed)) //in space + if(isnull(removed)) //in space return air_contents.merge(removed) @@ -252,7 +252,7 @@ on = !on if(signal.data["checks"] != null) - if (signal.data["checks"] == "default") + if(signal.data["checks"] == "default") pressure_checks = pressure_checks_default else pressure_checks = text2num(signal.data["checks"]) @@ -264,7 +264,7 @@ pump_direction = text2num(signal.data["direction"]) if(signal.data["set_internal_pressure"] != null) - if (signal.data["set_internal_pressure"] == "default") + if(signal.data["set_internal_pressure"] == "default") internal_pressure_bound = internal_pressure_bound_default else internal_pressure_bound = between( @@ -274,7 +274,7 @@ ) if(signal.data["set_external_pressure"] != null) - if (signal.data["set_external_pressure"] == "default") + if(signal.data["set_external_pressure"] == "default") external_pressure_bound = external_pressure_bound_default else external_pressure_bound = between( @@ -320,7 +320,7 @@ /obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W - if (WT.remove_fuel(0,user)) + if(WT.remove_fuel(0,user)) to_chat(user, "Now welding the vent.") if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return @@ -343,12 +343,12 @@ if(!welded) if(open) to_chat(user, " Now closing the vent.") - if (do_after(user, 20, target = src)) + if(do_after(user, 20, target = src)) open = 0 user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.") else to_chat(user, " Now opening the vent.") - if (do_after(user, 20, target = src)) + if(do_after(user, 20, target = src)) open = 1 user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.") return @@ -365,8 +365,8 @@ if(istype(W, /obj/item/device/multitool)) update_multitool_menu(user) return 1 - if (istype(W, /obj/item/weapon/wrench)) - if (!(stat & NOPOWER) && on) + if(istype(W, /obj/item/weapon/wrench)) + if(!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") return 1 diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index d0b0c9eb693..a7829d9fc1c 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -44,7 +44,7 @@ icon = null initial_loc = get_area(loc) area_uid = initial_loc.uid - if (!id_tag) + if(!id_tag) assign_uid() id_tag = num2text(uid) ..() @@ -63,26 +63,26 @@ /obj/machinery/atmospherics/unary/vent_scrubber/auto_use_power() if(!powered(power_channel)) return 0 - if (!on || welded) + if(!on || welded) return 0 if(stat & (NOPOWER|BROKEN)) return 0 var/amount = idle_power_usage - if (scrubbing) - if (scrub_CO2) + if(scrubbing) + if(scrub_CO2) amount += idle_power_usage - if (scrub_Toxins) + if(scrub_Toxins) amount += idle_power_usage - if (scrub_N2) + if(scrub_N2) amount += idle_power_usage - if (scrub_N2O) + if(scrub_N2O) amount += idle_power_usage else amount = active_power_usage - if (widenet) + if(widenet) amount += amount*(adjacent_turfs.len*(adjacent_turfs.len/2)) use_power(amount, power_channel) return 1 @@ -178,13 +178,13 @@ if(!..()) return 0 - if (widenet) + if(widenet) check_turfs() if(stat & (NOPOWER|BROKEN)) return - if (!node) + if(!node) on = 0 if(welded) @@ -194,8 +194,8 @@ return 0 scrub(loc) - if (widenet) - for (var/turf/simulated/tile in adjacent_turfs) + if(widenet) + for(var/turf/simulated/tile in adjacent_turfs) scrub(tile) //we populate a list of turfs with nonatmos-blocked cardinal turfs AND @@ -203,11 +203,11 @@ /obj/machinery/atmospherics/unary/vent_scrubber/proc/check_turfs() adjacent_turfs.Cut() var/turf/T = loc - if (istype(T)) + if(istype(T)) adjacent_turfs = T.GetAtmosAdjacentTurfs(alldir=1) /obj/machinery/atmospherics/unary/vent_scrubber/proc/scrub(var/turf/simulated/tile) - if (!tile || !istype(tile)) + if(!tile || !istype(tile)) return 0 var/datum/gas_mixture/environment = tile.return_air() @@ -218,7 +218,7 @@ //Take a gas sample var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - if (isnull(removed)) //in space + if(isnull(removed)) //in space return //Filter it @@ -253,7 +253,7 @@ tile.air_update_turf() else //Just siphoning all air - if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE) + if(air_contents.return_pressure()>=50*ONE_ATMOSPHERE) return var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) @@ -372,7 +372,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W - if (WT.remove_fuel(0,user)) + if(WT.remove_fuel(0,user)) to_chat(user, "Now welding the scrubber.") if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return @@ -394,8 +394,8 @@ if(istype(W, /obj/item/device/multitool)) update_multitool_menu(user) return 1 - if (istype(W, /obj/item/weapon/wrench)) - if (!(stat & NOPOWER) && on) + if(istype(W, /obj/item/weapon/wrench)) + if(!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") return 1 diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/ATMOSPHERICS/pipes/cap.dm index f20d71c2828..0504062eb09 100644 --- a/code/ATMOSPHERICS/pipes/cap.dm +++ b/code/ATMOSPHERICS/pipes/cap.dm @@ -67,7 +67,7 @@ for(var/obj/machinery/atmospherics/target in get_step(src, dir)) if(target.initialize_directions & get_dir(target,src)) var/c = check_connect_types(target,src) - if (c) + if(c) target.connected_to = c src.connected_to = c node = target diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index 8ba5db9fbd5..4b37036f96a 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -124,8 +124,8 @@ if(!node1 && !node2 && !node3) var/turf/T = get_turf(src) new /obj/item/pipe(loc, make_from=src) - for (var/obj/machinery/meter/meter in T) - if (meter.target == src) + for(var/obj/machinery/meter/meter in T) + if(meter.target == src) new /obj/item/pipe_meter(T) qdel(meter) qdel(src) diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 5975ffce26b..b6cd15bc211 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -97,8 +97,8 @@ if(!node1 && !node2 && !node3 && !node4) var/turf/T = get_turf(src) new /obj/item/pipe(loc, make_from=src) - for (var/obj/machinery/meter/meter in T) - if (meter.target == src) + for(var/obj/machinery/meter/meter in T) + if(meter.target == src) new /obj/item/pipe_meter(T) qdel(meter) qdel(src) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm index fbd5f85b6c5..5db391d4dd0 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm @@ -144,8 +144,8 @@ if(!node1 && !node2) var/turf/T = get_turf(src) new /obj/item/pipe(loc, make_from=src) - for (var/obj/machinery/meter/meter in T) - if (meter.target == src) + for(var/obj/machinery/meter/meter in T) + if(meter.target == src) new /obj/item/pipe_meter(T) qdel(meter) qdel(src) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm index 5cde784c8ce..a771bdd6234 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm @@ -96,17 +96,17 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/New() .. () - switch (dir) - if (SOUTH) + switch(dir) + if(SOUTH) initialize_directions = NORTH initialize_directions_he = SOUTH - if (NORTH) + if(NORTH) initialize_directions = SOUTH initialize_directions_he = NORTH - if (EAST) + if(EAST) initialize_directions = WEST initialize_directions_he = EAST - if (WEST) + if(WEST) initialize_directions = EAST initialize_directions_he = WEST diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm index 7cf983e0e32..db62f8e51fe 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm @@ -37,14 +37,14 @@ overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") underlays.Cut() - if (node1) + if(node1) universal_underlays(node1) if(node2) universal_underlays(node2) else var/node2_dir = turn(get_dir(src,node1),-180) universal_underlays(,node2_dir) - else if (node2) + else if(node2) universal_underlays(node2) var/node1_dir = turn(get_dir(src,node2),-180) universal_underlays(,node1_dir) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm index a93351b29c7..1fcb45e7959 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm @@ -48,14 +48,14 @@ overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") underlays.Cut() - if (node1) + if(node1) universal_underlays(node1) if(node2) universal_underlays(node2) else var/node1_dir = get_dir(node1,src) universal_underlays(,node1_dir) - else if (node2) + else if(node2) universal_underlays(node2) else universal_underlays(,dir) diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index afbeb0a0e45..14f8ab20998 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -165,7 +165,7 @@ var/turf/simulated/T = loc if(T.to_be_destroyed) var/chance_of_deletion - if (T.heat_capacity) //beware of division by zero + if(T.heat_capacity) //beware of division by zero chance_of_deletion = T.max_fire_temperature_sustained / T.heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0 else chance_of_deletion = 100 diff --git a/code/LINDA/LINDA_system.dm b/code/LINDA/LINDA_system.dm index 2584192e7b4..423356c4e8e 100644 --- a/code/LINDA/LINDA_system.dm +++ b/code/LINDA/LINDA_system.dm @@ -83,35 +83,35 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0) //alldir includes adjacent diagonal tiles that can share // air with both of the related adjacent cardinal tiles /turf/proc/GetAtmosAdjacentTurfs(alldir = 0) - if (!istype(src, /turf/simulated)) + if(!istype(src, /turf/simulated)) return list() var/adjacent_turfs = list() var/turf/simulated/curloc = src - for (var/direction in cardinal) + for(var/direction in cardinal) if(!(curloc.atmos_adjacent_turfs & direction)) continue var/turf/simulated/S = get_step(curloc, direction) - if (istype(S)) + if(istype(S)) adjacent_turfs += S - if (!alldir) + if(!alldir) return adjacent_turfs - for (var/direction in diagonals) + for(var/direction in diagonals) var/matchingDirections = 0 var/turf/simulated/S = get_step(curloc, direction) - for (var/checkDirection in cardinal) + for(var/checkDirection in cardinal) if(!(S.atmos_adjacent_turfs & checkDirection)) continue var/turf/simulated/checkTurf = get_step(S, checkDirection) - if (checkTurf in adjacent_turfs) + if(checkTurf in adjacent_turfs) matchingDirections++ - if (matchingDirections >= 2) + if(matchingDirections >= 2) adjacent_turfs += S break diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index 3aeacb942a7..b292e7664b2 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -246,14 +246,14 @@ overlays -= icemaster var/new_overlay_type = tile_graphic() - if (new_overlay_type == atmos_overlay_type) + if(new_overlay_type == atmos_overlay_type) return var/atmos_overlay = get_atmos_overlay_by_name(atmos_overlay_type) - if (atmos_overlay) + if(atmos_overlay) overlays -= atmos_overlay atmos_overlay = get_atmos_overlay_by_name(new_overlay_type) - if (atmos_overlay) + if(atmos_overlay) overlays += atmos_overlay atmos_overlay_type = new_overlay_type diff --git a/code/__DEFINES/tick.dm b/code/__DEFINES/tick.dm index 0469a81a392..71a63af6289 100644 --- a/code/__DEFINES/tick.dm +++ b/code/__DEFINES/tick.dm @@ -2,4 +2,4 @@ #define TICK_LIMIT_TO_RUN 85 #define TICK_CHECK ( world.tick_usage > TICK_LIMIT_RUNNING ? stoplag() : 0 ) -#define CHECK_TICK if (world.tick_usage > TICK_LIMIT_RUNNING) stoplag() \ No newline at end of file +#define CHECK_TICK if(world.tick_usage > TICK_LIMIT_RUNNING) stoplag() \ No newline at end of file diff --git a/code/__HELPERS/AnimationLibrary.dm b/code/__HELPERS/AnimationLibrary.dm index 65225d37363..fcabe2e0a78 100644 --- a/code/__HELPERS/AnimationLibrary.dm +++ b/code/__HELPERS/AnimationLibrary.dm @@ -64,7 +64,7 @@ return var/matrix/M = matrix() var/do_loops = 15 - while (do_loops > 0) + while(do_loops > 0) do_loops-- animate(A, transform = M, pixel_z = A.pixel_z + 12, alpha = A.alpha - 17, time = 1, loop = 1, easing = LINEAR_EASING) M.Scale(1.2,1.2) diff --git a/code/__HELPERS/experimental.dm b/code/__HELPERS/experimental.dm index 27daccfc58c..533f67b68d9 100644 --- a/code/__HELPERS/experimental.dm +++ b/code/__HELPERS/experimental.dm @@ -16,18 +16,18 @@ * -2, parameter A is not a string */ /proc/strpos(const/A, const/B) - if (istext(A) == 0 || length(A) < 1) + if(istext(A) == 0 || length(A) < 1) return -2 - if (istext(B) == 0 || length(B) > 1) + if(istext(B) == 0 || length(B) > 1) return -1 var/i = findtext(A, B) - if (0 == i) + if(0 == i) return 0 - while (i) + while(i) . = i i = findtext(A, B, i + 1) @@ -35,8 +35,8 @@ var/prototype = Object.type Object = null - for (var/type in params2list(types)) - if (ispath(prototype, text2path(type))) + for(var/type in params2list(types)) + if(ispath(prototype, text2path(type))) return 1 return 0 @@ -45,7 +45,7 @@ /obj/machinery/proc/getArea() var/area/A = loc.loc - if (A != myArea) + if(A != myArea) myArea = A . = myArea \ No newline at end of file diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 47cee347876..ef909b93c85 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -10,7 +10,7 @@ /proc/get_area_master(const/O) var/area/A = get_area(O) - if (isarea(A)) + if(isarea(A)) return A /proc/get_area(atom/A) @@ -440,7 +440,7 @@ proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0, var/roletext = be_special_type ? get_roletext(be_special_type) : null var/list/mob/dead/observer/candidates = list() var/time_passed = world.time - if (!Question) + if(!Question) Question = "Would you like to be a special role?" for(var/mob/dead/observer/G in player_list) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 36bb824e642..8a44c1b7cab 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -29,7 +29,7 @@ init_datum_subtypes(/datum/nations, all_nations, null, "default_name") init_datum_subtypes(/datum/language, all_languages, null, "name") - for (var/language_name in all_languages) + for(var/language_name in all_languages) var/datum/language/L = all_languages[language_name] if(!(L.flags & NONGLOBAL)) language_keys[":[lowertext(L.key)]"] = L @@ -52,7 +52,7 @@ /* // Uncomment to debug chemical reaction list. /client/verb/debug_chemical_list() - for (var/reaction in chemical_reactions_list) + for(var/reaction in chemical_reactions_list) . += "chemical_reactions_list\[\"[reaction]\"\] = \"[chemical_reactions_list[reaction]]\"\n" if(islist(chemical_reactions_list[reaction])) var/list/L = chemical_reactions_list[reaction] diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 6376ebb4215..5b51ad21187 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -747,7 +747,7 @@ The _flatIcons list is a cache for generated icon files. add = icon(I:icon, I:icon_state, I:dir) // This checks for a silent failure mode of the icon routine. If the requested dir // doesn't exist in this icon state it returns a 32x32 icon with 0 alpha. - if (I:dir != SOUTH && add.Width() == 32 && add.Height() == 32) + if(I:dir != SOUTH && add.Width() == 32 && add.Height() == 32) // Check every pixel for blank (computationally expensive, but the process is limited // by the amount of film on the station, only happens when we hit something that's // turned, and bails at the very first pixel it sees. @@ -760,7 +760,7 @@ The _flatIcons list is a cache for generated icon files. if(!blankpixel) break // If we ALWAYS returned a null (which happens when GetPixel encounters something with alpha 0) - if (blankpixel) + if(blankpixel) // Pull the default direction. add = icon(I:icon, I:icon_state) else // 'I' is an appearance object. @@ -830,8 +830,8 @@ The _flatIcons list is a cache for generated icon files. return composite proc/adjust_brightness(var/color, var/value) - if (!color) return "#FFFFFF" - if (!value) return color + if(!color) return "#FFFFFF" + if(!value) return color var/list/RGB = ReadRGB(color) RGB[1] = Clamp(RGB[1]+value,0,255) @@ -844,7 +844,7 @@ proc/sort_atoms_by_layer(var/list/atoms) var/list/result = atoms.Copy() var/gap = result.len var/swapped = 1 - while (gap > 1 || swapped) + while(gap > 1 || swapped) swapped = 0 if(gap > 1) gap = round(gap / 1.3) // 1.3 is the emperic comb sort coefficient diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 948602def06..e749dab5fa8 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -12,17 +12,17 @@ //Returns a list in plain english as a string /proc/english_list(var/list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) var/total = input.len - if (!total) + if(!total) return "[nothing_text]" - else if (total == 1) + else if(total == 1) return "[input[1]]" - else if (total == 2) + else if(total == 2) return "[input[1]][and_text][input[2]]" else var/output = "" var/index = 1 - while (index < total) - if (index == total - 1) + while(index < total) + if(index == total - 1) comma_text = final_comma_text output += "[input[index]][comma_text]" @@ -107,22 +107,22 @@ /proc/pickweight(list/L) var/total = 0 var/item - for (item in L) - if (!L[item]) + for(item in L) + if(!L[item]) L[item] = 1 total += L[item] total = rand(1, total) - for (item in L) + for(item in L) total -=L [item] - if (total <= 0) + if(total <= 0) return item return null //Pick a random element from the list and remove it from the list. /proc/pick_n_take(list/listfrom) - if (listfrom.len > 0) + if(listfrom.len > 0) var/picked = pick(listfrom) listfrom -= picked return picked @@ -130,7 +130,7 @@ //Returns the top(last) element from the list and removes it from the list (typical stack function) /proc/pop(list/listfrom) - if (listfrom.len > 0) + if(listfrom.len > 0) var/picked = listfrom[listfrom.len] listfrom.len-- return picked @@ -459,22 +459,22 @@ proc/dd_sortedObjectList(list/incoming) var/list/list_bottom var/current_sort_object - for (current_sort_object in incoming) + for(current_sort_object in incoming) low_index = 1 high_index = sorted_list.len - while (low_index <= high_index) + while(low_index <= high_index) // Figure out the midpoint, rounding up for fractions. (BYOND rounds down, so add 1 if necessary.) midway_calc = (low_index + high_index) / 2 current_index = round(midway_calc) - if (midway_calc > current_index) + if(midway_calc > current_index) current_index++ current_item = sorted_list[current_index] current_item_value = current_item:dd_SortValue() current_sort_object_value = current_sort_object:dd_SortValue() - if (current_sort_object_value < current_item_value) + if(current_sort_object_value < current_item_value) high_index = current_index - 1 - else if (current_sort_object_value > current_item_value) + else if(current_sort_object_value > current_item_value) low_index = current_index + 1 else // current_sort_object == current_item @@ -485,7 +485,7 @@ proc/dd_sortedObjectList(list/incoming) insert_index = low_index // Special case adding to end of list. - if (insert_index > sorted_list.len) + if(insert_index > sorted_list.len) sorted_list += current_sort_object continue @@ -515,28 +515,28 @@ proc/dd_sortedObjectList(list/incoming) var/sort_result var/current_sort_text - for (current_sort_text in incoming) + for(current_sort_text in incoming) low_index = 1 high_index = sorted_text.len - while (low_index <= high_index) + while(low_index <= high_index) // Figure out the midpoint, rounding up for fractions. (BYOND rounds down, so add 1 if necessary.) midway_calc = (low_index + high_index) / 2 current_index = round(midway_calc) - if (midway_calc > current_index) + if(midway_calc > current_index) current_index++ current_item = sorted_text[current_index] - if (case_sensitive) + if(case_sensitive) sort_result = sorttextEx(current_sort_text, current_item) else sort_result = sorttext(current_sort_text, current_item) switch(sort_result) - if (1) + if(1) high_index = current_index - 1 // current_sort_text < current_item - if (-1) + if(-1) low_index = current_index + 1 // current_sort_text > current_item - if (0) + if(0) low_index = current_index // current_sort_text == current_item break @@ -544,7 +544,7 @@ proc/dd_sortedObjectList(list/incoming) insert_index = low_index // Special case adding to end of list. - if (insert_index > sorted_text.len) + if(insert_index > sorted_text.len) sorted_text += current_sort_text continue diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm index bf3a5b3ffc9..b2d81f9060d 100644 --- a/code/__HELPERS/logging.dm +++ b/code/__HELPERS/logging.dm @@ -21,12 +21,12 @@ /proc/log_admin(text) admin_log.Add(text) - if (config.log_admin) + if(config.log_admin) diary << "\[[time_stamp()]]ADMIN: [text]" /proc/log_debug(text) - if (config.log_debug) + if(config.log_debug) diary << "\[[time_stamp()]]DEBUG: [text]" for(var/client/C in admins) @@ -35,47 +35,47 @@ /proc/log_game(text) - if (config.log_game) + if(config.log_game) diary << "\[[time_stamp()]]GAME: [text]" /proc/log_vote(text) - if (config.log_vote) + if(config.log_vote) diary << "\[[time_stamp()]]VOTE: [text]" /proc/log_access(text) - if (config.log_access) + if(config.log_access) diary << "\[[time_stamp()]]ACCESS: [text]" /proc/log_say(text) - if (config.log_say) + if(config.log_say) diary << "\[[time_stamp()]]SAY: [text]" /proc/log_ooc(text) - if (config.log_ooc) + if(config.log_ooc) diary << "\[[time_stamp()]]OOC: [text]" /proc/log_whisper(text) - if (config.log_whisper) + if(config.log_whisper) diary << "\[[time_stamp()]]WHISPER: [text]" /proc/log_emote(text) - if (config.log_emote) + if(config.log_emote) diary << "\[[time_stamp()]]EMOTE: [text]" /proc/log_attack(text) - if (config.log_attack) + if(config.log_attack) diary << "\[[time_stamp()]]ATTACK: [text]" //Seperate attack logs? Why? /proc/log_adminsay(text) - if (config.log_adminchat) + if(config.log_adminchat) diary << "\[[time_stamp()]]ADMINSAY: [text]" /proc/log_adminwarn(text) - if (config.log_adminwarn) + if(config.log_adminwarn) diary << "\[[time_stamp()]]ADMINWARN: [text]" /proc/log_pda(text) - if (config.log_pda) + if(config.log_pda) diary << "\[[time_stamp()]]PDA: [text][log_end]" /proc/log_misc(text) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 9d790b75345..4bc41808b96 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -116,7 +116,7 @@ proc/random_skin_tone(species = "Human") proc/skintone2racedescription(tone, species = "Human") if(species == "Human") - switch (tone) + switch(tone) if(30 to INFINITY) return "albino" if(20 to 30) return "pale" if(5 to 15) return "light skinned" @@ -190,15 +190,15 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul var/holding = user.get_active_hand() var/datum/progressbar/progbar - if (progress) + if(progress) progbar = new(user, time, target) var/endtime = world.time+time var/starttime = world.time . = 1 - while (world.time < endtime) + while(world.time < endtime) sleep(1) - if (progress) + if(progress) progbar.update(world.time - starttime) if(!user || !target) . = 0 @@ -213,7 +213,7 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying ) . = 0 break - if (progress) + if(progress) qdel(progbar) /proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1) @@ -236,15 +236,15 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul holdingnull = 0 //Users hand started holding something, check to see if it's still holding that var/datum/progressbar/progbar - if (progress) + if(progress) progbar = new(user, delay, target) var/endtime = world.time + delay var/starttime = world.time . = 1 - while (world.time < endtime) + while(world.time < endtime) sleep(1) - if (progress) + if(progress) progbar.update(world.time - starttime) if(drifting && !user.inertia_dir) @@ -269,5 +269,5 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul if(user.get_active_hand() != holding) . = 0 break - if (progress) + if(progress) qdel(progbar) \ No newline at end of file diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 0ac3da3a10a..0375b7aacea 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -1,13 +1,13 @@ var/church_name = null /proc/church_name() - if (church_name) + if(church_name) return church_name var/name = "" name += pick("Holy", "United", "First", "Second", "Last") - if (prob(20)) + if(prob(20)) name += " Space" name += " " + pick("Church", "Cathedral", "Body", "Worshippers", "Movement", "Witnesses") @@ -17,7 +17,7 @@ var/church_name = null var/command_name = null /proc/command_name() - if (command_name) + if(command_name) return command_name var/name = "Central Command" @@ -33,7 +33,7 @@ var/command_name = null var/religion_name = null /proc/religion_name() - if (religion_name) + if(religion_name) return religion_name var/name = "" @@ -47,12 +47,12 @@ var/religion_name = null return "Nyx" /proc/station_name() - if (station_name) + if(station_name) return station_name var/name = "" - if (config && config.server_name) + if(config && config.server_name) world.name = "[config.server_name]: [name]" else world.name = station_name @@ -65,7 +65,7 @@ var/religion_name = null var/new_station_name = "" //Rare: Pre-Prefix - if (prob(10)) + if(prob(10)) name = pick("Imperium", "Heretical", "Cuban", "Psychic", "Elegant", "Common", "Uncommon", "Rare", "Unique", "Houseruled", "Religious", "Atheist", "Traditional", "Houseruled", "Mad", "Super", "Ultra", "Secret", "Top Secret", "Deep", "Death", "Zybourne", "Central", "Main", "Government", "Uoi", "Fat", "Automated", "Experimental", "Augmented") new_station_name = name + " " name = "" @@ -107,7 +107,7 @@ var/religion_name = null station_name = name - if (config && config.server_name) + if(config && config.server_name) world.name = "[config.server_name]: [name]" else world.name = name @@ -116,7 +116,7 @@ var/religion_name = null var/syndicate_name = null /proc/syndicate_name() - if (syndicate_name) + if(syndicate_name) return syndicate_name var/name = "" @@ -125,11 +125,11 @@ var/syndicate_name = null name += pick("Clandestine", "Prima", "Blue", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Bonk", "Gene", "Gib") // Suffix - if (prob(80)) + if(prob(80)) name += " " // Full - if (prob(60)) + if(prob(60)) name += pick("Syndicate", "Consortium", "Collective", "Corporation", "Group", "Holdings", "Biotech", "Industries", "Systems", "Products", "Chemicals", "Enterprises", "Family", "Creations", "International", "Intergalactic", "Interplanetary", "Foundation", "Positronics", "Hive") // Broken else diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index f490f71df43..5020693a499 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -62,6 +62,6 @@ // Calls the above proc on each entry of a list to ensure its entries are clean /proc/sql_sanitize_text_list(var/list/l) var/list/new_list = l.Copy() - for (var/text in new_list) + for(var/text in new_list) sql_sanitize_text(text) return new_list \ No newline at end of file diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 0aa9589c510..b17cda4e560 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -154,15 +154,15 @@ proc/checkhtml(var/t) t = sanitize_simple(t, list("&#"=".")) var/p = findtext(t,"<",1) - while (p) //going through all the tags + while(p) //going through all the tags var/start = p++ var/tag = copytext(t,p, p+1) - if (tag != "/") - while (reject_bad_text(copytext(t, p, p+1), 1)) + if(tag != "/") + while(reject_bad_text(copytext(t, p, p+1), 1)) tag = copytext(t,start, p) p++ tag = copytext(t,start+1, p) - if (!(tag in paper_tag_whitelist)) //if it's unkown tag, disarming it + if(!(tag in paper_tag_whitelist)) //if it's unkown tag, disarming it t = copytext(t,1,start-1) + "<" + copytext(t,start+1) p = findtext(t,"<",p) return t @@ -218,7 +218,7 @@ proc/checkhtml(var/t) //Adds 'u' number of zeros ahead of the text 't' /proc/add_zero(t, u) - while (length(t) < u) + while(length(t) < u) t = "0[t]" return t @@ -236,15 +236,15 @@ proc/checkhtml(var/t) //Returns a string with reserved characters and spaces before the first letter removed /proc/trim_left(text) - for (var/i = 1 to length(text)) - if (text2ascii(text, i) > 32) + for(var/i = 1 to length(text)) + if(text2ascii(text, i) > 32) return copytext(text, i) return "" //Returns a string with reserved characters and spaces after the last letter removed /proc/trim_right(text) - for (var/i = length(text), i > 0, i--) - if (text2ascii(text, i) > 32) + for(var/i = length(text), i > 0, i--) + if(text2ascii(text, i) > 32) return copytext(text, 1, i + 1) return "" diff --git a/code/__HELPERS/timed_alerts.dm b/code/__HELPERS/timed_alerts.dm index 929341c3fc0..97e92900288 100644 --- a/code/__HELPERS/timed_alerts.dm +++ b/code/__HELPERS/timed_alerts.dm @@ -10,9 +10,9 @@ var/ref_result ref_result = ref_alert.timed_alert(src, question, title, time, choice1, choice2, choice3) - if (!ref_result) ref_result = default + if(!ref_result) ref_result = default - if (ref_alert) del(ref_alert) + if(ref_alert) del(ref_alert) return ref_result @@ -20,13 +20,13 @@ /mob/proc/timed_alert(question as text, title as text, default as text, time as num, \ choice1 as text, choice2 as text, choice3 as text) - if (client) return client.timed_alert(question, title, default, time, choice1, choice2, choice3) + if(client) return client.timed_alert(question, title, default, time, choice1, choice2, choice3) return /timed_alert/proc/timed_alert(client/ref_client, question, title, time, choice1, choice2, choice3) - if (!ref_client) return + if(!ref_client) return spawn (time) del(src) // When src is deleted, the proc ends immediately. The alert itself closes. var/ref_answer diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 0dd40091e1e..005ef4c2fc9 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -10,7 +10,7 @@ //Returns an integer given a hex input /proc/hex2num(hex) - if (!( istext(hex) )) + if(!( istext(hex) )) return var/num = 0 diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 596dcda719c..6cd28a20a32 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -26,11 +26,11 @@ //Inverts the colour of an HTML string /proc/invertHTML(HTMLstring) - if (!( istext(HTMLstring) )) + if(!( istext(HTMLstring) )) CRASH("Given non-text argument!") return else - if (length(HTMLstring) != 7) + if(length(HTMLstring) != 7) CRASH("Given non-HTML argument!") return var/textr = copytext(HTMLstring, 2, 4) @@ -42,11 +42,11 @@ textr = num2hex(255 - r) textg = num2hex(255 - g) textb = num2hex(255 - b) - if (length(textr) < 2) + if(length(textr) < 2) textr = text("0[]", textr) - if (length(textg) < 2) + if(length(textg) < 2) textr = text("0[]", textg) - if (length(textb) < 2) + if(length(textb) < 2) textr = text("0[]", textb) return text("#[][][]", textr, textg, textb) return @@ -218,14 +218,14 @@ Turf and target are seperate in case you want to teleport some distance from a t //Returns whether or not a player is a guest using their ckey as an input /proc/IsGuestKey(key) - if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx + if(findtext(key, "Guest-", 1, 7) != 1) //was findtextEx return 0 var/i, ch, len = length(key) - for (i = 7, i <= len, ++i) + for(i = 7, i <= len, ++i) ch = text2ascii(key, i) - if (ch < 48 || ch > 57) + if(ch < 48 || ch > 57) return 0 return 1 @@ -234,7 +234,7 @@ Turf and target are seperate in case you want to teleport some distance from a t f = round(f) f = max(low, f) f = min(high, f) - if ((f % 2) == 0) //Ensure the last digit is an odd number + if((f % 2) == 0) //Ensure the last digit is an odd number f += 1 return f @@ -277,13 +277,13 @@ Turf and target are seperate in case you want to teleport some distance from a t /proc/freeborg() var/select = null var/list/borgs = list() - for (var/mob/living/silicon/robot/A in player_list) - if (A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone)) + for(var/mob/living/silicon/robot/A in player_list) + if(A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone)) continue var/name = "[A.real_name] ([A.modtype] [A.braintype])" borgs[name] = A - if (borgs.len) + if(borgs.len) select = input("Unshackled borg signals detected:", "Borg selection", null, null) as null|anything in borgs return borgs[select] @@ -352,15 +352,15 @@ Turf and target are seperate in case you want to teleport some distance from a t var/list/namecounts = list() for(var/mob/M in mobs) var/name = M.name - if (name in names) + if(name in names) namecounts[name]++ name = "[name] ([namecounts[name]])" else names.Add(name) namecounts[name] = 1 - if (M.real_name && M.real_name != M.name) + if(M.real_name && M.real_name != M.name) name += " \[[M.real_name]\]" - if (M.stat == 2) + if(M.stat == 2) if(istype(M, /mob/dead/observer/)) name += " \[ghost\]" else @@ -679,13 +679,13 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl var/src_min_x = 0 var/src_min_y = 0 - for (var/turf/T in turfs_src) + for(var/turf/T in turfs_src) if(T.x < src_min_x || !src_min_x) src_min_x = T.x if(T.y < src_min_y || !src_min_y) src_min_y = T.y var/trg_min_x = 0 var/trg_min_y = 0 - for (var/turf/T in turfs_trg) + for(var/turf/T in turfs_trg) if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y @@ -709,9 +709,9 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl var/list/toupdate = new/list() moving: - for (var/turf/T in refined_src) + for(var/turf/T in refined_src) var/datum/coords/C_src = refined_src[T] - for (var/turf/B in refined_trg) + for(var/turf/B in refined_trg) var/datum/coords/C_trg = refined_trg[B] if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) @@ -845,13 +845,13 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl var/src_min_x = 0 var/src_min_y = 0 - for (var/turf/T in turfs_src) + for(var/turf/T in turfs_src) if(T.x < src_min_x || !src_min_x) src_min_x = T.x if(T.y < src_min_y || !src_min_y) src_min_y = T.y var/trg_min_x = 0 var/trg_min_y = 0 - for (var/turf/T in turfs_trg) + for(var/turf/T in turfs_trg) if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y @@ -877,9 +877,9 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl moving: - for (var/turf/T in refined_src) + for(var/turf/T in refined_src) var/datum/coords/C_src = refined_src[T] - for (var/turf/B in refined_trg) + for(var/turf/B in refined_trg) var/datum/coords/C_trg = refined_trg[B] if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) @@ -990,24 +990,24 @@ proc/oview_or_orange(distance = world.view , center = usr , type) proc/get_mob_with_client_list() var/list/mobs = list() for(var/mob/M in mob_list) - if (M.client) + if(M.client) mobs += M return mobs /proc/parse_zone(zone) if(zone == "r_hand") return "right hand" - else if (zone == "l_hand") return "left hand" - else if (zone == "l_arm") return "left arm" - else if (zone == "r_arm") return "right arm" - else if (zone == "l_leg") return "left leg" - else if (zone == "r_leg") return "right leg" - else if (zone == "l_foot") return "left foot" - else if (zone == "r_foot") return "right foot" - else if (zone == "l_hand") return "left hand" - else if (zone == "r_hand") return "right hand" - else if (zone == "l_foot") return "left foot" - else if (zone == "r_foot") return "right foot" + else if(zone == "l_hand") return "left hand" + else if(zone == "l_arm") return "left arm" + else if(zone == "r_arm") return "right arm" + else if(zone == "l_leg") return "left leg" + else if(zone == "r_leg") return "right leg" + else if(zone == "l_foot") return "left foot" + else if(zone == "r_foot") return "right foot" + else if(zone == "l_hand") return "left hand" + else if(zone == "r_hand") return "right hand" + else if(zone == "l_foot") return "left foot" + else if(zone == "r_foot") return "right foot" else return zone //Finds the distance between two atoms, in pixels @@ -1139,15 +1139,15 @@ var/global/list/common_tools = list( //Whether or not the given item counts as sharp in terms of dealing damage /proc/is_sharp(obj/O as obj) - if (!O) return 0 - if (O.sharp) return 1 - if (O.edge) return 1 + if(!O) return 0 + if(O.sharp) return 1 + if(O.edge) return 1 return 0 //Whether or not the given item counts as cutting with an edge in terms of removing limbs /proc/has_edge(obj/O as obj) - if (!O) return 0 - if (O.edge) return 1 + if(!O) return 0 + if(O.edge) return 1 return 0 //Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. @@ -1521,7 +1521,7 @@ var/mob/dview/dview_mob = new lastloc = loc sleep(0.6) - if (orbiting == A) //make sure we haven't started orbiting something else. + if(orbiting == A) //make sure we haven't started orbiting something else. orbiting = null SpinAnimation(0,0) @@ -1672,7 +1672,7 @@ var/mob/dview/dview_mob = new /proc/pick_closest_path(value) var/list/matches = get_fancy_list_of_types() - if (!isnull(value) && value!="") + if(!isnull(value) && value!="") matches = filter_fancy_list(matches, value) if(matches.len==0) @@ -1706,13 +1706,13 @@ var/list/TYPES_SHORTCUTS = list( var/global/list/g_fancy_list_of_types = null /proc/get_fancy_list_of_types() - if (isnull(g_fancy_list_of_types)) //init + if(isnull(g_fancy_list_of_types)) //init var/list/temp = sortList(subtypesof(/atom) - typesof(/area) - /atom/movable) g_fancy_list_of_types = new(temp.len) for(var/type in temp) var/typename = "[type]" - for (var/tn in TYPES_SHORTCUTS) - if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ ) + for(var/tn in TYPES_SHORTCUTS) + if(copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ ) typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) break g_fancy_list_of_types[typename] = type @@ -1730,10 +1730,10 @@ var/global/list/g_fancy_list_of_types = null /proc/stoplag() . = 1 sleep(world.tick_lag) - if (world.tick_usage > TICK_LIMIT_TO_RUN) //woke up, still not enough tick, sleep for more. + if(world.tick_usage > TICK_LIMIT_TO_RUN) //woke up, still not enough tick, sleep for more. . += 2 sleep(world.tick_lag*2) - if (world.tick_usage > TICK_LIMIT_TO_RUN) //woke up, STILL not enough tick, sleep for more. + if(world.tick_usage > TICK_LIMIT_TO_RUN) //woke up, STILL not enough tick, sleep for more. . += 4 sleep(world.tick_lag*4) //you might be thinking of adding more steps to this, or making it use a loop and a counter var diff --git a/code/_hooks/hooks.dm b/code/_hooks/hooks.dm index b78526bfc2b..ccd0eb04722 100644 --- a/code/_hooks/hooks.dm +++ b/code/_hooks/hooks.dm @@ -29,26 +29,26 @@ var/global/list/hooks = list() /proc/SetupHooks() - for (var/hook_path in typesof(/hook)) + for(var/hook_path in typesof(/hook)) var/hook/hook = new hook_path hooks[hook.name] = hook // log_to_dd("Found hook: " + hook.name) - for (var/hook_path in typesof(/hook_handler)) + for(var/hook_path in typesof(/hook_handler)) var/hook_handler/hook_handler = new hook_path - for (var/name in hooks) - if (hascall(hook_handler, "On" + name)) + for(var/name in hooks) + if(hascall(hook_handler, "On" + name)) var/hook/hook = hooks[name] hook.handlers += hook_handler // log_to_dd("Found hook handler for: " + name) - for (var/hook/hook in hooks) + for(var/hook/hook in hooks) hook.Setup() /proc/CallHook(var/name as text, var/list/args) var/hook/hook = hooks[name] - if (!hook) + if(!hook) //log_to_dd("WARNING: Hook with name " + name + " does not exist") return - if (hook.Called(args)) + if(hook.Called(args)) return - for (var/hook_handler/hook_handler in hook.handlers) + for(var/hook_handler/hook_handler in hook.handlers) call(hook_handler, "On" + hook.name)(args) \ No newline at end of file diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 58fb139ce33..1b32a9201a3 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -143,7 +143,7 @@ for(var/i=1, i 0) + if(hitsound && force > 0) playsound(loc, hitsound, 50, 1, -1) ///////////////////////// user.lastattacked = M @@ -177,9 +177,9 @@ else M.take_organ_damage(power) - if (prob(33)) // Added blood for whacking non-humans too + if(prob(33)) // Added blood for whacking non-humans too var/turf/simulated/location = M.loc - if (istype(location, /turf/simulated)) + if(istype(location, /turf/simulated)) location.add_blood_floor(M) if("fire") M.take_organ_damage(0, power) diff --git a/code/_onclick/oldcode.dm b/code/_onclick/oldcode.dm index 89b1131a6f0..a68f9668e78 100644 --- a/code/_onclick/oldcode.dm +++ b/code/_onclick/oldcode.dm @@ -2,7 +2,7 @@ if(!usr) return // ------- TIME SINCE LAST CLICK ------- - if (world.time <= usr:lastDblClick+1) + if(world.time <= usr:lastDblClick+1) return else usr:lastDblClick = world.time @@ -38,15 +38,15 @@ // ------- AI ------- - else if (istype(usr, /mob/living/silicon/ai)) + else if(istype(usr, /mob/living/silicon/ai)) var/mob/living/silicon/ai/ai = usr - if (ai.control_disabled) + if(ai.control_disabled) return // ------- CYBORG ------- - else if (istype(usr, /mob/living/silicon/robot)) + else if(istype(usr, /mob/living/silicon/robot)) var/mob/living/silicon/robot/bot = usr - if (bot.lockcharge) return + if(bot.lockcharge) return ..() @@ -106,7 +106,7 @@ W = null */ // ------- ATTACK SELF ------- - if (W == src && usr.stat == 0) + if(W == src && usr.stat == 0) W.attack_self(usr) if(usr.hand) usr.update_inv_l_hand(0) //update in-hand overlays @@ -115,14 +115,14 @@ return // ------- PARALYSIS, STUN, WEAKENED, DEAD, (And not AI) ------- - if (((usr.paralysis || usr.stunned || usr.weakened) && !istype(usr, /mob/living/silicon/ai)) || usr.stat != 0) + if(((usr.paralysis || usr.stunned || usr.weakened) && !istype(usr, /mob/living/silicon/ai)) || usr.stat != 0) return // ------- CLICKING STUFF IN CONTAINERS ------- - if ((!( src in usr.contents ) && (((!( isturf(src) ) && (!( isturf(src.loc) ) && (src.loc && !( isturf(src.loc.loc) )))) || !( isturf(usr.loc) )) && (src.loc != usr.loc && (!( istype(src, /obj/screen) ) && !( usr.contents.Find(src.loc) )))))) - if (istype(usr, /mob/living/silicon/ai)) + if((!( src in usr.contents ) && (((!( isturf(src) ) && (!( isturf(src.loc) ) && (src.loc && !( isturf(src.loc.loc) )))) || !( isturf(usr.loc) )) && (src.loc != usr.loc && (!( istype(src, /obj/screen) ) && !( usr.contents.Find(src.loc) )))))) + if(istype(usr, /mob/living/silicon/ai)) var/mob/living/silicon/ai/ai = usr - if (ai.control_disabled || ai.malfhacking) + if(ai.control_disabled || ai.malfhacking) return else return @@ -141,11 +141,11 @@ // to_chat(world, "according to dblclick(), t5 is [t5]") // ------- ACTUALLY DETERMINING STUFF ------- - if (((t5 || (W && (W.flags & USEDELAY))) && !( istype(src, /obj/screen) ))) + if(((t5 || (W && (W.flags & USEDELAY))) && !( istype(src, /obj/screen) ))) // ------- ( CAN USE ITEM OR HAS 1 SECOND USE DELAY ) AND NOT CLICKING ON SCREEN ------- - if (usr.next_move < world.time) + if(usr.next_move < world.time) usr.prev_move = usr.next_move usr.next_move = world.time + 10 else @@ -154,14 +154,14 @@ // ------- DELAY CHECK PASSED ------- - if ((src.loc && (get_dist(src, usr) < 2 || src.loc == usr.loc))) + if((src.loc && (get_dist(src, usr) < 2 || src.loc == usr.loc))) // ------- CLICKED OBJECT EXISTS IN GAME WORLD, DISTANCE FROM PERSON TO OBJECT IS 1 SQUARE OR THEY'RE ON THE SAME SQUARE ------- var/direct = get_dir(usr, src) var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( usr.loc ) var/ok = 0 - if ( (direct - 1) & direct) + if( (direct - 1) & direct) // ------- CLICKED OBJECT IS LOCATED IN A DIAGONAL POSITION FROM THE PERSON ------- @@ -259,39 +259,39 @@ D = null // ------- DUMMY OBJECT'S SERVED IT'S PURPOSE, IT'S REWARDED WITH A SWIFT DELETE ------- - if (!( ok )) + if(!( ok )) // ------- TESTS ABOVE DETERMINED YOU CANNOT REACH THE TILE ------- return 0 - if (!( usr.restrained() || (usr.lying && usr.buckled!=src) )) + if(!( usr.restrained() || (usr.lying && usr.buckled!=src) )) // ------- YOU ARE NOT REASTRAINED ------- - if (W) + if(W) // ------- YOU HAVE AN ITEM IN YOUR HAND - HANDLE ATTACKBY AND AFTERATTACK ------- var/ignoreAA = 0 //Ignore afterattack(). Surgery uses this. - if (t5) + if(t5) ignoreAA = src.attackby(W, usr, params) - if (W && !ignoreAA) + if(W && !ignoreAA) W.afterattack(src, usr, (t5 ? 1 : 0), params) else // ------- YOU DO NOT HAVE AN ITEM IN YOUR HAND ------- - if (istype(usr, /mob/living/carbon/human)) + if(istype(usr, /mob/living/carbon/human)) // ------- YOU ARE HUMAN ------- src.attack_hand(usr, usr.hand) else // ------- YOU ARE NOT HUMAN. WHAT ARE YOU - DETERMINED HERE AND PROPER ATTACK_MOBTYPE CALLED ------- - if (istype(usr, /mob/living/carbon/monkey)) + if(istype(usr, /mob/living/carbon/monkey)) src.attack_paw(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) + else if(istype(usr, /mob/living/carbon/alien/humanoid)) if(usr.m_intent == "walk" && istype(usr, /mob/living/carbon/alien/humanoid/hunter)) usr.m_intent = "run" usr.hud_used.move_intent.icon_state = "running" usr.update_icons() src.attack_alien(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/larva)) + else if(istype(usr, /mob/living/carbon/alien/larva)) src.attack_larva(usr) - else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) + else if(istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) src.attack_ai(usr, usr.hand) else if(istype(usr, /mob/living/carbon/slime)) src.attack_slime(usr) @@ -299,51 +299,51 @@ src.attack_animal(usr) else // ------- YOU ARE RESTRAINED. DETERMINE WHAT YOU ARE AND ATTACK WITH THE PROPER HAND_X PROC ------- - if (istype(usr, /mob/living/carbon/human)) + if(istype(usr, /mob/living/carbon/human)) src.hand_h(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/monkey)) + else if(istype(usr, /mob/living/carbon/monkey)) src.hand_p(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) + else if(istype(usr, /mob/living/carbon/alien/humanoid)) src.hand_al(usr, usr.hand) - else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) + else if(istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) src.hand_a(usr, usr.hand) else // ------- ITEM INACESSIBLE OR CLICKING ON SCREEN ------- - if (istype(src, /obj/screen)) + if(istype(src, /obj/screen)) // ------- IT'S THE HUD YOU'RE CLICKING ON ------- usr.prev_move = usr.next_move usr:lastDblClick = world.time + 2 - if (usr.next_move < world.time) + if(usr.next_move < world.time) usr.next_move = world.time + 2 else return // ------- 2 DECISECOND DELAY FOR CLICKING PASSED ------- - if (!( usr.restrained() )) + if(!( usr.restrained() )) // ------- YOU ARE NOT RESTRAINED ------- - if ((W && !( istype(src, /obj/screen) ))) + if((W && !( istype(src, /obj/screen) ))) // ------- IT SHOULD NEVER GET TO HERE, DUE TO THE ISTYPE(SRC, /OBJ/SCREEN) FROM PREVIOUS IF-S - I TESTED IT WITH A DEBUG OUTPUT AND I COULDN'T GET THIST TO SHOW UP. ------- src.attackby(W, usr, params) - if (W) + if(W) W.afterattack(src, usr,, params) else // ------- YOU ARE NOT RESTRAINED, AND ARE CLICKING A HUD OBJECT ------- - if (istype(usr, /mob/living/carbon/human)) + if(istype(usr, /mob/living/carbon/human)) src.attack_hand(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/monkey)) + else if(istype(usr, /mob/living/carbon/monkey)) src.attack_paw(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) + else if(istype(usr, /mob/living/carbon/alien/humanoid)) src.attack_alien(usr, usr.hand) else // ------- YOU ARE RESTRAINED CLICKING ON A HUD OBJECT ------- - if (istype(usr, /mob/living/carbon/human)) + if(istype(usr, /mob/living/carbon/human)) src.hand_h(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/monkey)) + else if(istype(usr, /mob/living/carbon/monkey)) src.hand_p(usr, usr.hand) - else if (istype(usr, /mob/living/carbon/alien/humanoid)) + else if(istype(usr, /mob/living/carbon/alien/humanoid)) src.hand_al(usr, usr.hand) else // ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD ------- diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index 620dafca4ec..55e277b4d67 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -171,7 +171,7 @@ main.restartProcess(src.name) /datum/controller/process/proc/kill() - if (!killed) + if(!killed) var/msg = "[name] process was killed at tick #[ticks]." log_debug(msg) message_admins(msg) @@ -186,22 +186,22 @@ // Do not call this directly - use SHECK or SCHECK_EVERY /datum/controller/process/proc/sleepCheck(var/tickId = 0) calls_since_last_scheck = 0 - if (killed) + if(killed) // The kill proc is the only place where killed is set. // The kill proc should have deleted this datum, and all sleeping procs that are // owned by it. CRASH("A killed process is still running somehow...") - if (hung) + if(hung) // This will only really help if the doWork proc ends up in an infinite loop. handleHung() CRASH("Process [name] hung and was restarted.") - if (main.getCurrentTickElapsedTime() > main.timeAllowance) + if(main.getCurrentTickElapsedTime() > main.timeAllowance) sleep(world.tick_lag) cpu_defer_count++ last_slept = 0 else - if (TimeOfTick > last_slept + sleep_interval) + if(TimeOfTick > last_slept + sleep_interval) // If we haven't slept in sleep_interval deciseconds, sleep to allow other work to proceed. sleep(0) last_slept = TimeOfTick @@ -213,14 +213,14 @@ var/elapsedTime = getElapsedTime() - if (hung) + if(hung) handleHung() return - else if (elapsedTime > hang_restart_time) + else if(elapsedTime > hang_restart_time) hung() - else if (elapsedTime > hang_alert_time) + else if(elapsedTime > hang_alert_time) setStatus(PROCESS_STATUS_PROBABLY_HUNG) - else if (elapsedTime > hang_warning_time) + else if(elapsedTime > hang_warning_time) setStatus(PROCESS_STATUS_MAYBE_HUNG) diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm index 86e1fc5bbe9..494e776650d 100644 --- a/code/controllers/ProcessScheduler/core/processScheduler.dm +++ b/code/controllers/ProcessScheduler/core/processScheduler.dm @@ -66,7 +66,7 @@ var/global/datum/controller/processScheduler/processScheduler * this treatment. */ /datum/controller/processScheduler/proc/deferSetupFor(var/processPath) - if (!(processPath in deferredSetupList)) + if(!(processPath in deferredSetupList)) deferredSetupList += processPath /datum/controller/processScheduler/proc/setup() @@ -77,11 +77,11 @@ var/global/datum/controller/processScheduler/processScheduler var/process // Add all the processes we can find, except for the ticker - for (process in subtypesof(/datum/controller/process)) - if (!(process in deferredSetupList)) + for(process in subtypesof(/datum/controller/process)) + if(!(process in deferredSetupList)) addProcess(new process(src)) - for (process in deferredSetupList) + for(process in deferredSetupList) addProcess(new process(src)) /datum/controller/processScheduler/proc/start() @@ -114,7 +114,7 @@ var/global/datum/controller/processScheduler/processScheduler for(var/datum/controller/process/p in running) p.update() - if (isnull(p)) // Process was killed + if(isnull(p)) // Process was killed continue var/status = p.getStatus() @@ -132,11 +132,11 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/queueProcesses() for(var/datum/controller/process/p in processes) // Don't double-queue, don't queue running processes - if (p.disabled || p.running || p.queued || !p.idle) + if(p.disabled || p.running || p.queued || !p.idle) continue // If the process should be running by now, go ahead and queue it - if (world.time >= last_queued[p] + p.schedule_interval) + if(world.time >= last_queued[p] + p.schedule_interval) setQueuedProcessState(p) /datum/controller/processScheduler/proc/runQueuedProcesses() @@ -217,34 +217,34 @@ var/global/datum/controller/processScheduler/processScheduler recordEnd(process) /datum/controller/processScheduler/proc/setIdleProcessState(var/datum/controller/process/process) - if (process in running) + if(process in running) running -= process - if (process in queued) + if(process in queued) queued -= process - if (!(process in idle)) + if(!(process in idle)) idle += process /datum/controller/processScheduler/proc/setQueuedProcessState(var/datum/controller/process/process) - if (process in running) + if(process in running) running -= process - if (process in idle) + if(process in idle) idle -= process - if (!(process in queued)) + if(!(process in queued)) queued += process // The other state transitions are handled internally by the process. process.queued() /datum/controller/processScheduler/proc/setRunningProcessState(var/datum/controller/process/process) - if (process in queued) + if(process in queued) queued -= process - if (process in idle) + if(process in idle) idle -= process - if (!(process in running)) + if(!(process in running)) running += process /datum/controller/processScheduler/proc/recordStart(var/datum/controller/process/process, var/time = null) - if (isnull(time)) + if(isnull(time)) time = TimeOfGame last_queued[process] = world.time last_start[process] = time @@ -253,7 +253,7 @@ var/global/datum/controller/processScheduler/processScheduler last_start[process] = time /datum/controller/processScheduler/proc/recordEnd(var/datum/controller/process/process, var/time = null) - if (isnull(time)) + if(isnull(time)) time = TimeOfGame var/lastRunTime = time - last_start[process] @@ -273,7 +273,7 @@ var/global/datum/controller/processScheduler/processScheduler highest_run_time[process] = time var/list/lastTwenty = last_twenty_run_times[process] - if (lastTwenty.len == 20) + if(lastTwenty.len == 20) lastTwenty.Cut(1, 2) lastTwenty.len++ lastTwenty[lastTwenty.len] = time @@ -304,7 +304,7 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/getStatusData() var/list/data = new - for (var/datum/controller/process/p in processes) + for(var/datum/controller/process/p in processes) data.len++ data[data.len] = p.getContextData() @@ -314,14 +314,14 @@ var/global/datum/controller/processScheduler/processScheduler return processes.len /datum/controller/processScheduler/proc/hasProcess(var/processName as text) - if (nameToProcessMap[processName]) + if(nameToProcessMap[processName]) return 1 /datum/controller/processScheduler/proc/killProcess(var/processName as text) restartProcess(processName) /datum/controller/processScheduler/proc/restartProcess(var/processName as text) - if (hasProcess(processName)) + if(hasProcess(processName)) var/datum/controller/process/oldInstance = nameToProcessMap[processName] var/datum/controller/process/newInstance = new oldInstance.type(src) newInstance._copyStateFrom(oldInstance) @@ -329,24 +329,24 @@ var/global/datum/controller/processScheduler/processScheduler oldInstance.kill() /datum/controller/processScheduler/proc/enableProcess(var/processName as text) - if (hasProcess(processName)) + if(hasProcess(processName)) var/datum/controller/process/process = nameToProcessMap[processName] process.enable() /datum/controller/processScheduler/proc/disableProcess(var/processName as text) - if (hasProcess(processName)) + if(hasProcess(processName)) var/datum/controller/process/process = nameToProcessMap[processName] process.disable() /datum/controller/processScheduler/proc/getCurrentTickElapsedTime() - if (world.time > currentTick) + if(world.time > currentTick) updateCurrentTickData() return 0 else return TimeOfTick /datum/controller/processScheduler/proc/updateCurrentTickData() - if (world.time > currentTick) + if(world.time > currentTick) // New tick! currentTick = world.time updateTimeAllowance() diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index 43bee48f267..dc7cbe6a24d 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -153,7 +153,7 @@ var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, MED_FREQ, SEC_FREQ, SCI /proc/frequency_span_class(var/frequency) // Antags! - if (frequency in ANTAG_FREQS) + if(frequency in ANTAG_FREQS) return "syndradio" // centcomm channels (deathsquid and ert) if(frequency in CENT_FREQS) @@ -167,7 +167,7 @@ var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, MED_FREQ, SEC_FREQ, SCI // department radio formatting (poorly optimized, ugh) if(frequency == SEC_FREQ) return "secradio" - if (frequency == ENG_FREQ) + if(frequency == ENG_FREQ) return "engradio" if(frequency == SCI_FREQ) return "sciradio" @@ -265,17 +265,17 @@ var/global/datum/controller/radio/radio_controller if(!start_point) qdel(signal) return 0 - if (filter) + if(filter) send_to_filter(source, signal, filter, start_point, range) send_to_filter(source, signal, RADIO_DEFAULT, start_point, range) else //Broadcast the signal to everyone! - for (var/next_filter in devices) + for(var/next_filter in devices) send_to_filter(source, signal, next_filter, start_point, range) //Sends a signal to all machines belonging to a given filter. Should be called by post_signal() /datum/radio_frequency/proc/send_to_filter(obj/source, datum/signal/signal, var/filter, var/turf/start_point = null, var/range = null) - if (range && !start_point) + if(range && !start_point) return for(var/obj/device in devices[filter]) @@ -291,11 +291,11 @@ var/global/datum/controller/radio/radio_controller device.receive_signal(signal, TRANSMISSION_RADIO, frequency) /datum/radio_frequency/proc/add_listener(obj/device as obj, var/filter as text|null) - if (!filter) + if(!filter) filter = RADIO_DEFAULT //log_admin("add_listener(device=[device],filter=[filter]) frequency=[frequency]") var/list/obj/devices_line = devices[filter] - if (!devices_line) + if(!devices_line) devices_line = new devices[filter] = devices_line devices_line+=device @@ -305,12 +305,12 @@ var/global/datum/controller/radio/radio_controller //log_admin("DEBUG: devices(filter_str).len=[l]") /datum/radio_frequency/proc/remove_listener(obj/device) - for (var/devices_filter in devices) + for(var/devices_filter in devices) var/list/devices_line = devices[devices_filter] devices_line-=device - while (null in devices_line) + while(null in devices_line) devices_line -= null - if (devices_line.len==0) + if(devices_line.len==0) devices -= devices_filter qdel(devices_line) @@ -335,11 +335,11 @@ var/global/datum/controller/radio/radio_controller frequency = model.frequency /datum/signal/proc/debug_print() - if (source) + if(source) . = "signal = {source = '[source]' ([source:x],[source:y],[source:z])\n" else . = "signal = {source = '[source]' ()\n" - for (var/i in data) + for(var/i in data) . += "data\[\"[i]\"\] = \"[data[i]]\"\n" if(islist(data[i])) var/list/L = data[i] diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index b0e3059ee6d..d3da4ccf1c3 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -181,18 +181,18 @@ /datum/configuration/New() var/list/L = subtypesof(/datum/game_mode) - for (var/T in L) + for(var/T in L) // I wish I didn't have to instance the game modes in order to look up // their information, but it is the only way (at least that I know of). var/datum/game_mode/M = new T() - if (M.config_tag) + if(M.config_tag) if(!(M.config_tag in modes)) // ensure each mode is added only once diary << "Adding game mode [M.name] ([M.config_tag]) to configuration." src.modes += M.config_tag src.mode_names[M.config_tag] = M.name src.probabilities[M.config_tag] = M.probability - if (M.votable) + if(M.votable) src.votable_modes += M.config_tag qdel(M) src.votable_modes += "secret" @@ -204,188 +204,188 @@ if(!t) continue t = trim(t) - if (length(t) == 0) + if(length(t) == 0) continue - else if (copytext(t, 1, 2) == "#") + else if(copytext(t, 1, 2) == "#") continue var/pos = findtext(t, " ") var/name = null var/value = null - if (pos) + if(pos) name = lowertext(copytext(t, 1, pos)) value = copytext(t, pos + 1) else name = lowertext(t) - if (!name) + if(!name) continue if(type == "config") - switch (name) - if ("resource_urls") + switch(name) + if("resource_urls") config.resource_urls = splittext(value, " ") - if ("admin_legacy_system") + if("admin_legacy_system") config.admin_legacy_system = 1 - if ("ban_legacy_system") + if("ban_legacy_system") config.ban_legacy_system = 1 - if ("use_age_restriction_for_jobs") + if("use_age_restriction_for_jobs") config.use_age_restriction_for_jobs = 1 - if ("use_age_restriction_for_antags") + if("use_age_restriction_for_antags") config.use_age_restriction_for_antags = 1 - if ("jobs_have_minimal_access") + if("jobs_have_minimal_access") config.jobs_have_minimal_access = 1 - if ("log_ooc") + if("log_ooc") config.log_ooc = 1 - if ("log_access") + if("log_access") config.log_access = 1 - if ("log_say") + if("log_say") config.log_say = 1 - if ("log_admin") + if("log_admin") config.log_admin = 1 - if ("log_debug") + if("log_debug") config.log_debug = text2num(value) - if ("log_game") + if("log_game") config.log_game = 1 - if ("log_vote") + if("log_vote") config.log_vote = 1 - if ("log_whisper") + if("log_whisper") config.log_whisper = 1 - if ("log_attack") + if("log_attack") config.log_attack = 1 - if ("log_emote") + if("log_emote") config.log_emote = 1 - if ("log_adminchat") + if("log_adminchat") config.log_adminchat = 1 - if ("log_adminwarn") + if("log_adminwarn") config.log_adminwarn = 1 - if ("log_pda") + if("log_pda") config.log_pda = 1 - if ("log_world_output") + if("log_world_output") config.log_world_output = 1 - if ("log_hrefs") + if("log_hrefs") config.log_hrefs = 1 - if ("log_runtime") + if("log_runtime") config.log_runtime = 1 - if ("mentors") + if("mentors") config.mods_are_mentors = 1 if("allow_admin_ooccolor") config.allow_admin_ooccolor = 1 - if ("allow_vote_restart") + if("allow_vote_restart") config.allow_vote_restart = 1 - if ("allow_vote_mode") + if("allow_vote_mode") config.allow_vote_mode = 1 if("no_dead_vote") config.vote_no_dead = 1 - if ("default_no_vote") + if("default_no_vote") config.vote_no_default = 1 - if ("vote_delay") + if("vote_delay") config.vote_delay = text2num(value) - if ("vote_period") + if("vote_period") config.vote_period = text2num(value) - if ("allow_ai") + if("allow_ai") config.allow_ai = 1 -// if ("authentication") +// if("authentication") // config.enable_authentication = 1 - if ("norespawn") + if("norespawn") config.respawn = 0 - if ("servername") + if("servername") config.server_name = value - if ("serversuffix") + if("serversuffix") config.server_suffix = 1 - if ("nudge_script_path") + if("nudge_script_path") config.nudge_script_path = value - if ("hostedby") + if("hostedby") config.hostedby = value - if ("server") + if("server") config.server = value - if ("banappeals") + if("banappeals") config.banappeals = value - if ("wikiurl") + if("wikiurl") config.wikiurl = value - if ("forumurl") + if("forumurl") config.forumurl = value - if ("rulesurl") + if("rulesurl") config.rulesurl = value - if ("donationsurl") + if("donationsurl") config.donationsurl = value - if ("repositoryurl") + if("repositoryurl") config.repositoryurl = value - if ("guest_jobban") + if("guest_jobban") config.guest_jobban = 1 - if ("guest_ban") + if("guest_ban") guests_allowed = 0 - if ("usewhitelist") + if("usewhitelist") config.usewhitelist = 1 - if ("feature_object_spell_system") + if("feature_object_spell_system") config.feature_object_spell_system = 1 - if ("allow_metadata") + if("allow_metadata") config.allow_Metadata = 1 - if ("traitor_scaling") + if("traitor_scaling") config.traitor_scaling = 1 if("protect_roles_from_antagonist") config.protect_roles_from_antagonist = 1 - if ("probability") + if("probability") var/prob_pos = findtext(value, " ") var/prob_name = null var/prob_value = null - if (prob_pos) + if(prob_pos) prob_name = lowertext(copytext(value, 1, prob_pos)) prob_value = copytext(value, prob_pos + 1) - if (prob_name in config.modes) + if(prob_name in config.modes) config.probabilities[prob_name] = text2num(prob_value) else diary << "Unknown game mode probability configuration definition: [prob_name]." @@ -611,11 +611,11 @@ config.reactionary_explosions = 1 if("bombcap") var/BombCap = text2num(value) - if (!BombCap) + if(!BombCap) continue - if (BombCap < 4) + if(BombCap < 4) BombCap = 4 - if (BombCap > 128) + if(BombCap > 128) BombCap = 128 MAX_EX_DEVESTATION_RANGE = round(BombCap/4) @@ -634,36 +634,36 @@ if(!t) continue t = trim(t) - if (length(t) == 0) + if(length(t) == 0) continue - else if (copytext(t, 1, 2) == "#") + else if(copytext(t, 1, 2) == "#") continue var/pos = findtext(t, " ") var/name = null var/value = null - if (pos) + if(pos) name = lowertext(copytext(t, 1, pos)) value = copytext(t, pos + 1) else name = lowertext(t) - if (!name) + if(!name) continue - switch (name) + switch(name) if("sql_enabled") config.sql_enabled = 1 - if ("address") + if("address") sqladdress = value - if ("port") + if("port") sqlport = value - if ("feedback_database") + if("feedback_database") sqlfdbkdb = value - if ("feedback_login") + if("feedback_login") sqlfdbklogin = value - if ("feedback_password") + if("feedback_password") sqlfdbkpass = value if("feedback_tableprefix") sqlfdbktableprefix = value @@ -676,9 +676,9 @@ if(!t) continue t = trim(t) - if (length(t) == 0) + if(length(t) == 0) continue - else if (copytext(t, 1, 2) == "#") + else if(copytext(t, 1, 2) == "#") continue config.overflow_whitelist += t @@ -686,25 +686,25 @@ /datum/configuration/proc/pick_mode(mode_name) // I wish I didn't have to instance the game modes in order to look up // their information, but it is the only way (at least that I know of). - for (var/T in subtypesof(/datum/game_mode)) + for(var/T in subtypesof(/datum/game_mode)) var/datum/game_mode/M = new T() - if (M.config_tag && M.config_tag == mode_name) + if(M.config_tag && M.config_tag == mode_name) return M qdel(M) return new /datum/game_mode/extended() /datum/configuration/proc/get_runnable_modes() var/list/datum/game_mode/runnable_modes = new - for (var/T in subtypesof(/datum/game_mode)) + for(var/T in subtypesof(/datum/game_mode)) var/datum/game_mode/M = new T() // to_chat(world, "DEBUG: [T], tag=[M.config_tag], prob=[probabilities[M.config_tag]]") - if (!(M.config_tag in modes)) + if(!(M.config_tag in modes)) qdel(M) continue - if (probabilities[M.config_tag]<=0) + if(probabilities[M.config_tag]<=0) qdel(M) continue - if (M.can_start()) + if(M.can_start()) runnable_modes[M] = probabilities[M.config_tag] // to_chat(world, "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]") return runnable_modes diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm index 2775590dab6..afb0e68d83f 100644 --- a/code/controllers/failsafe.dm +++ b/code/controllers/failsafe.dm @@ -18,8 +18,8 @@ var/global/datum/controller/failsafe/failsafe . = ..() // There can be only one failsafe. Out with the old in with the new (that way we can restart the Failsafe by spawning a new one). - if (failsafe != src) - if (istype(failsafe)) + if(failsafe != src) + if(istype(failsafe)) recover() qdel(failsafe) diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 97c490852b6..25b038554cc 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -28,7 +28,7 @@ if("Master") debug_variables(master_controller) feedback_add_details("admin_verb","DMC") - if ("failsafe") + if("failsafe") debug_variables(failsafe) feedback_add_details("admin_verb", "dfailsafe") if("Ticker") diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 7816e88e556..52c976ec470 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -200,7 +200,7 @@ datum/controller/vote return 0 choices.Add(config.votable_modes) if("crew_transfer") - if (check_rights(R_ADMIN|R_MOD)) + if(check_rights(R_ADMIN|R_MOD)) if(ticker.current_state <= 2) return 0 question = "End the shift?" diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 4af13e256fd..0f796798d26 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -83,17 +83,17 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen if(full_sync || supplied_laws.len) S.laws.clear_supplied_laws() - for (var/datum/ai_law/law in ion_laws) + for(var/datum/ai_law/law in ion_laws) S.laws.add_ion_law(law.law) - for (var/datum/ai_law/law in inherent_laws) + for(var/datum/ai_law/law in inherent_laws) S.laws.add_inherent_law(law.law) - for (var/datum/ai_law/law in supplied_laws) + for(var/datum/ai_law/law in supplied_laws) if(law) S.laws.add_supplied_law(law.index, law.law) /mob/living/silicon/proc/sync_zeroth(var/datum/ai_law/zeroth_law, var/datum/ai_law/zeroth_law_borg) - if (!is_special_character(src) || mind.original != src) + if(!is_special_character(src) || mind.original != src) if(zeroth_law_borg) laws.set_zeroth_law(zeroth_law_borg.law) else if(zeroth_law) @@ -159,7 +159,7 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen if(supplied_laws.len >= number && supplied_laws[number]) delete_law(supplied_laws[number]) - while (src.supplied_laws.len < number) + while(src.supplied_laws.len < number) src.supplied_laws += "" if(state_supplied.len < supplied_laws.len) state_supplied += 1 diff --git a/code/datums/browser.dm b/code/datums/browser.dm index e8f17f17ad0..85f8e52e89d 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -20,13 +20,13 @@ user = nuser window_id = nwindow_id - if (ntitle) + if(ntitle) title = format_text(ntitle) - if (nwidth) + if(nwidth) width = nwidth - if (nheight) + if(nheight) height = nheight - if (nref) + if(nref) ref = nref add_stylesheet("common", 'html/browser/common.css') // this CSS sheet is common to all UIs @@ -60,18 +60,18 @@ /datum/browser/proc/get_header() var/key var/filename - for (key in stylesheets) + for(key in stylesheets) filename = "[ckey(key)].css" user << browse_rsc(stylesheets[key], filename) head_content += "" - for (key in scripts) + for(key in scripts) filename = "[ckey(key)].js" user << browse_rsc(scripts[key], filename) head_content += "" var/title_attributes = "class='uiTitle'" - if (title_image) + if(title_image) title_attributes = "class='uiTitle icon' style='background-image: url([title_image]);'" return {" @@ -103,10 +103,10 @@ /datum/browser/proc/open(var/use_onclose = 1) var/window_size = "" - if (width && height) + if(width && height) window_size = "size=[width]x[height];" user << browse(get_content(), "window=[window_id];[window_size][window_options]") - if (use_onclose) + if(use_onclose) onclose(user, window_id, ref) /datum/browser/proc/close() @@ -118,7 +118,7 @@ /mob/proc/browse_rsc_icon(icon, icon_state, dir = -1) /* var/icon/I - if (dir >= 0) + if(dir >= 0) I = new /icon(icon, icon_state, dir) else I = new /icon(icon, icon_state) diff --git a/code/datums/cache/apc.dm b/code/datums/cache/apc.dm index f50b0a8e121..4271886ac4b 100644 --- a/code/datums/cache/apc.dm +++ b/code/datums/cache/apc.dm @@ -11,7 +11,7 @@ var/global/datum/repository/apc/apc_repository = new() if(world.time < cache_entry.timestamp) return cache_entry.data - if (powermonitor && !isnull(powermonitor.powernet)) + if(powermonitor && !isnull(powermonitor.powernet)) var/list/L = list() for(var/obj/machinery/power/terminal/term in powermonitor.powernet.nodes) if(istype(term.master, /obj/machinery/power/apc)) diff --git a/code/datums/cache/crew.dm b/code/datums/cache/crew.dm index 0afb70a4404..2912b8c6753 100644 --- a/code/datums/cache/crew.dm +++ b/code/datums/cache/crew.dm @@ -62,6 +62,6 @@ var/global/datum/repository/crew/crew_repository = new() for(var/mob/living/carbon/human/H in mob_list) if(istype(H.w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/C = H.w_uniform - if (C.has_sensor) + if(C.has_sensor) tracked |= C return tracked diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index ff081676b43..f9c3ce39b08 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -17,7 +17,7 @@ var/real_title = assignment for(var/datum/data/record/t in data_core.general) - if (t) + if(t) if(t.fields["name"] == name) foundrecord = t break @@ -131,7 +131,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H) var/obj/item/organ/external/head/head_organ = H.get_organ("head") var/g = "m" - if (H.gender == FEMALE) + if(H.gender == FEMALE) g = "f" var/icon/icobase = H.species.icobase @@ -153,7 +153,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H) // Skin tone if(H.species.bodyflags & HAS_SKIN_TONE) - if (H.s_tone >= 0) + if(H.s_tone >= 0) preview_icon.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD) else preview_icon.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index eeb26f5f6f2..1413b5c7dc9 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -20,7 +20,7 @@ title = "[A.name] (\ref[A]) = [A.type]" #ifdef VARSICON - if (A.icon) + if(A.icon) body += debug_variable("icon", new/icon(A.icon, A.icon_state, A.dir), 0) #endif @@ -43,11 +43,11 @@ if(event.keyCode == 13){ //Enter / return var vars_ol = document.getElementById('vars'); var lis = vars_ol.getElementsByTagName("li"); - for ( var i = 0; i < lis.length; ++i ) + for( var i = 0; i < lis.length; ++i ) { try{ var li = lis\[i\]; - if ( li.style.backgroundColor == "#ffee88" ) + if( li.style.backgroundColor == "#ffee88" ) { alist = lis\[i\].getElementsByTagName("a") if(alist.length > 0){ @@ -62,11 +62,11 @@ if(event.keyCode == 38){ //Up arrow var vars_ol = document.getElementById('vars'); var lis = vars_ol.getElementsByTagName("li"); - for ( var i = 0; i < lis.length; ++i ) + for( var i = 0; i < lis.length; ++i ) { try{ var li = lis\[i\]; - if ( li.style.backgroundColor == "#ffee88" ) + if( li.style.backgroundColor == "#ffee88" ) { if( (i-1) >= 0){ var li_new = lis\[i-1\]; @@ -83,11 +83,11 @@ if(event.keyCode == 40){ //Down arrow var vars_ol = document.getElementById('vars'); var lis = vars_ol.getElementsByTagName("li"); - for ( var i = 0; i < lis.length; ++i ) + for( var i = 0; i < lis.length; ++i ) { try{ var li = lis\[i\]; - if ( li.style.backgroundColor == "#ffee88" ) + if( li.style.backgroundColor == "#ffee88" ) { if( (i+1) < lis.length){ var li_new = lis\[i+1\]; @@ -113,11 +113,11 @@ var vars_ol = document.getElementById('vars'); var lis = vars_ol.getElementsByTagName("li"); - for ( var i = 0; i < lis.length; ++i ) + for( var i = 0; i < lis.length; ++i ) { try{ var li = lis\[i\]; - if ( li.innerText.toLowerCase().indexOf(filter) == -1 ) + if( li.innerText.toLowerCase().indexOf(filter) == -1 ) { vars_ol.removeChild(li); i--; @@ -126,10 +126,10 @@ } } var lis_new = vars_ol.getElementsByTagName("li"); - for ( var j = 0; j < lis_new.length; ++j ) + for( var j = 0; j < lis_new.length; ++j ) { var li1 = lis\[j\]; - if (j == 0){ + if(j == 0){ li1.style.backgroundColor = "#ffee88"; }else{ li1.style.backgroundColor = "white"; @@ -293,18 +293,18 @@ body += "
      " var/list/names = list() - for (var/V in D.vars) + for(var/V in D.vars) names += V names = sortList(names) - for (var/V in names) + for(var/V in names) body += debug_variable(V, D.vars[V], 0, D) body += "
    " var/html = "" - if (title) + if(title) html += "[title]" html += {"