From 7417bef794798f135f367b523400b45172acba45 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Sun, 5 Feb 2017 16:17:41 -0600 Subject: [PATCH 01/16] Boots are now a subtype of shoes --- code/datums/supplypacks/medical.dm | 2 +- code/datums/supplypacks/security.dm | 4 +- code/game/antagonist/outsider/commando.dm | 2 +- code/game/antagonist/outsider/deathsquad.dm | 2 +- code/game/antagonist/outsider/ert.dm | 2 +- code/game/antagonist/outsider/mercenary.dm | 2 +- code/game/antagonist/outsider/raider.dm | 6 +- code/game/jobs/job/engineering.dm | 6 +- code/game/jobs/job/medical.dm | 2 +- code/game/jobs/job/security.dm | 6 +- code/game/objects/effects/landmarks.dm | 2 +- code/game/objects/random/random.dm | 8 +- .../crates_lockers/closets/gimmick.dm | 4 +- .../crates_lockers/closets/wardrobe.dm | 20 ++-- code/modules/admin/verbs/debug.dm | 2 +- code/modules/awaymissions/corpse.dm | 6 +- .../preference_setup/loadout/loadout_shoes.dm | 14 +-- code/modules/clothing/shoes/boots.dm | 100 ++++++++++++++++++ code/modules/clothing/shoes/colour.dm | 5 - code/modules/clothing/shoes/jobs.dm | 39 ------- code/modules/clothing/shoes/miscellaneous.dm | 81 ++------------ .../mob/living/simple_animal/corpse.dm | 8 +- code/modules/random_map/drop/drop_types.dm | 2 +- maps/polaris-1.dmm | 2 +- maps/polaris-2.dmm | 4 +- polaris.dme | 2 +- 26 files changed, 161 insertions(+), 172 deletions(-) create mode 100644 code/modules/clothing/shoes/boots.dm delete mode 100644 code/modules/clothing/shoes/jobs.dm diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index 51a7e6e03c..e7b29fd8d9 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -177,7 +177,7 @@ /obj/item/clothing/under/rank/medical/paramedic, /obj/item/clothing/accessory/stethoscope, /obj/item/weapon/storage/firstaid/adv, - /obj/item/clothing/shoes/jackboots, + /obj/item/clothing/shoes/boots/jackboots, /obj/item/clothing/gloves/latex, /obj/item/device/healthanalyzer, /obj/item/weapon/cartridge/medical, diff --git a/code/datums/supplypacks/security.dm b/code/datums/supplypacks/security.dm index 3099d8d955..074bbddc81 100644 --- a/code/datums/supplypacks/security.dm +++ b/code/datums/supplypacks/security.dm @@ -113,7 +113,7 @@ /obj/item/clothing/mask/balaclava/tactical, /obj/item/clothing/glasses/sunglasses/sechud/tactical, /obj/item/weapon/storage/belt/security/tactical, - /obj/item/clothing/shoes/jackboots, + /obj/item/clothing/shoes/boots/jackboots, /obj/item/clothing/gloves/black, /obj/item/clothing/under/tactical, /obj/item/clothing/suit/armor/tactical, @@ -121,7 +121,7 @@ /obj/item/clothing/mask/balaclava/tactical, /obj/item/clothing/glasses/sunglasses/sechud/tactical, /obj/item/weapon/storage/belt/security/tactical, - /obj/item/clothing/shoes/jackboots, + /obj/item/clothing/shoes/boots/jackboots, /obj/item/clothing/gloves/black ) diff --git a/code/game/antagonist/outsider/commando.dm b/code/game/antagonist/outsider/commando.dm index d7acf05273..3ea5c233ff 100644 --- a/code/game/antagonist/outsider/commando.dm +++ b/code/game/antagonist/outsider/commando.dm @@ -22,7 +22,7 @@ var/datum/antagonist/deathsquad/mercenary/commandos player.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(player), slot_w_uniform) player.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/silenced(player), slot_belt) - player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(player), slot_shoes) + player.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/swat(player), slot_shoes) player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(player), slot_gloves) player.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(player), slot_glasses) player.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(player), slot_wear_mask) diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm index c7e1d01094..db281b6dbb 100644 --- a/code/game/antagonist/outsider/deathsquad.dm +++ b/code/game/antagonist/outsider/deathsquad.dm @@ -36,7 +36,7 @@ var/datum/antagonist/deathsquad/deathsquad else player.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(player), slot_w_uniform) - player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(player), slot_shoes) + player.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/swat(player), slot_shoes) player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(player), slot_gloves) player.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(player), slot_glasses) player.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(player), slot_wear_mask) diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm index b8f76bf2a9..44cbfae65f 100644 --- a/code/game/antagonist/outsider/ert.dm +++ b/code/game/antagonist/outsider/ert.dm @@ -44,7 +44,7 @@ var/datum/antagonist/ert/ert //Special radio setup player.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(src), slot_l_ear) player.equip_to_slot_or_del(new /obj/item/clothing/under/ert(src), slot_w_uniform) - player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(src), slot_shoes) + player.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/swat(src), slot_shoes) player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves) player.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses) diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index f3cc85f685..fb09e76a55 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -36,7 +36,7 @@ var/datum/antagonist/mercenary/mercs return 0 player.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(player), slot_w_uniform) - player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(player), slot_shoes) + player.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/swat(player), slot_shoes) player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(player), slot_gloves) if(player.backbag == 2) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(player), slot_back) if(player.backbag == 3) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(player), slot_back) diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm index a841e15476..1a7da8954e 100644 --- a/code/game/antagonist/outsider/raider.dm +++ b/code/game/antagonist/outsider/raider.dm @@ -31,8 +31,8 @@ var/datum/antagonist/raider/raiders ) var/list/raider_shoes = list( - /obj/item/clothing/shoes/jackboots, - /obj/item/clothing/shoes/workboots, + /obj/item/clothing/shoes/boots/jackboots, + /obj/item/clothing/shoes/boots/workboots, /obj/item/clothing/shoes/brown, /obj/item/clothing/shoes/laceup ) @@ -216,7 +216,7 @@ var/datum/antagonist/raider/raiders player.equip_to_slot_or_del(new new_shoes(player),slot_shoes) if(!player.shoes) //If equipping shoes failed, fall back to equipping sandals - var/fallback_type = pick(/obj/item/clothing/shoes/sandal, /obj/item/clothing/shoes/jackboots/toeless) + var/fallback_type = pick(/obj/item/clothing/shoes/sandal, /obj/item/clothing/shoes/boots/jackboots/toeless) player.equip_to_slot_or_del(new fallback_type(player), slot_shoes) player.equip_to_slot_or_del(new new_uniform(player),slot_w_uniform) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index db9d51290f..b9cc65dcde 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -38,7 +38,7 @@ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/device/pda/heads/ce(H), slot_l_store) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(H), slot_head) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) @@ -76,7 +76,7 @@ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(H), slot_head) H.equip_to_slot_or_del(new /obj/item/device/t_scanner(H), slot_r_store) @@ -115,7 +115,7 @@ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt) return 1 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 7241525dfe..db8dd443cd 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -220,7 +220,7 @@ equip(var/mob/living/carbon/human/H, var/alt_title) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) switch(H.backbag) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back) diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index b2af2f1f17..8d9da09cbe 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -33,7 +33,7 @@ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hos(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hos(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) // H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk @@ -72,7 +72,7 @@ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/warden(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses) @@ -155,7 +155,7 @@ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 88bbe2a721..3ecb7c7b2d 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -135,7 +135,7 @@ new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc) new /obj/item/clothing/head/flatcap(src.loc) new /obj/item/clothing/mask/smokable/cigarette/cigar/havana(src.loc) - new /obj/item/clothing/shoes/jackboots(src.loc) + new /obj/item/clothing/shoes/boots/jackboots(src.loc) delete_me = 1 /obj/effect/landmark/costume/nyangirl/New() diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index cd12ad5a0c..7e8c721489 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -630,9 +630,9 @@ something, make sure it's not in one of the other lists.*/ prob(1);/obj/item/weapon/grenade/flashbang, prob(1);/obj/item/weapon/melee/baton, prob(1);/obj/item/weapon/reagent_containers/spray/pepper, - prob(3);/obj/item/clothing/shoes/jackboots, - prob(1);/obj/item/clothing/shoes/swat, - prob(1);/obj/item/clothing/shoes/combat, + prob(3);/obj/item/clothing/shoes/boots/jackboots, + prob(1);/obj/item/clothing/shoes/boots/swat, + prob(1);/obj/item/clothing/shoes/boots/combat, prob(1);/obj/item/clothing/gloves/swat, prob(1);/obj/item/clothing/gloves/combat, prob(1);/obj/item/clothing/glasses/sunglasses/big, @@ -730,7 +730,7 @@ something, make sure it's not in one of the other lists.*/ prob(2);/obj/item/clothing/head/welding, prob(4);/obj/item/clothing/suit/storage/hazardvest, prob(2);/obj/item/clothing/under/overalls, - prob(3);/obj/item/clothing/shoes/workboots, + prob(3);/obj/item/clothing/shoes/boots/workboots, prob(1);/obj/item/clothing/shoes/magboots, prob(2);/obj/item/clothing/accessory/storage/black_vest, prob(2);/obj/item/clothing/accessory/storage/brown_vest, diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 1a62db2dfb..3a6b7ac045 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -65,8 +65,8 @@ new /obj/item/clothing/head/helmet/swat(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/shoes/swat(src) - new /obj/item/clothing/shoes/swat(src) + new /obj/item/clothing/shoes/boots/swat(src) + new /obj/item/clothing/shoes/boots/swat(src) new /obj/item/clothing/suit/armor/swat(src) new /obj/item/clothing/suit/armor/swat(src) new /obj/item/clothing/under/syndicate/tacticool(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 1136c6cfeb..07544c058b 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -29,9 +29,9 @@ new /obj/item/clothing/under/rank/security2(src) new /obj/item/clothing/under/rank/security2(src) new /obj/item/clothing/under/rank/security2(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/shoes/boots/jackboots(src) + new /obj/item/clothing/shoes/boots/jackboots(src) + new /obj/item/clothing/shoes/boots/jackboots(src) new /obj/item/clothing/head/soft/sec(src) new /obj/item/clothing/head/soft/sec(src) new /obj/item/clothing/head/soft/sec(src) @@ -190,8 +190,8 @@ new /obj/item/clothing/shoes/sandal(src) new /obj/item/clothing/shoes/sandal(src) new /obj/item/clothing/shoes/sandal(src) - new /obj/item/clothing/shoes/winterboots(src) - new /obj/item/clothing/shoes/winterboots(src) + new /obj/item/clothing/shoes/boots/winter(src) + new /obj/item/clothing/shoes/boots/winter(src) new /obj/item/clothing/suit/storage/hooded/wintercoat(src) new /obj/item/clothing/suit/storage/hooded/wintercoat(src) return @@ -294,9 +294,9 @@ new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src) - new /obj/item/clothing/shoes/workboots(src) - new /obj/item/clothing/shoes/workboots(src) - new /obj/item/clothing/shoes/workboots(src) + new /obj/item/clothing/shoes/boots/workboots(src) + new /obj/item/clothing/shoes/boots/workboots(src) + new /obj/item/clothing/shoes/boots/workboots(src) return @@ -564,7 +564,7 @@ new /obj/item/weapon/storage/belt/security/tactical(src) if(prob(10)) new /obj/item/clothing/mask/bandana/skull(src) - new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/shoes/boots/jackboots(src) new /obj/item/clothing/gloves/black(src) new /obj/item/clothing/under/pants/camo(src) return @@ -582,7 +582,7 @@ new /obj/item/clothing/under/syndicate/combat(src) new /obj/item/device/radio/headset/ert/alt(src) new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/shoes/swat(src) + new /obj/item/clothing/shoes/boots/swat(src) new /obj/item/clothing/gloves/swat(src) new /obj/item/clothing/mask/balaclava/tactical(src) new /obj/item/clothing/mask/balaclava(src) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index fa2c51e7e5..414c57223e 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -692,7 +692,7 @@ if("emergency response team") M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/swat(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(M), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 4c061c71d2..e48e730860 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -90,7 +90,7 @@ name = "Syndicate Operative" corpseuniform = /obj/item/clothing/under/syndicate corpsesuit = /obj/item/clothing/suit/armor/vest - corpseshoes = /obj/item/clothing/shoes/swat + corpseshoes = /obj/item/clothing/shoes/boots/swat corpsegloves = /obj/item/clothing/gloves/swat corpseradio = /obj/item/device/radio/headset corpsemask = /obj/item/clothing/mask/gas @@ -106,7 +106,7 @@ name = "Syndicate Commando" corpseuniform = /obj/item/clothing/under/syndicate corpsesuit = /obj/item/clothing/suit/space/void/merc - corpseshoes = /obj/item/clothing/shoes/swat + corpseshoes = /obj/item/clothing/shoes/boots/swat corpsegloves = /obj/item/clothing/gloves/swat corpseradio = /obj/item/device/radio/headset corpsemask = /obj/item/clothing/mask/gas/syndicate @@ -225,7 +225,7 @@ corpsemask = /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba corpsehelmet = /obj/item/clothing/head/centhat corpsegloves = /obj/item/clothing/gloves/swat - corpseshoes = /obj/item/clothing/shoes/swat + corpseshoes = /obj/item/clothing/shoes/boots/swat corpsepocket1 = /obj/item/weapon/flame/lighter/zippo corpseid = 1 corpseidjob = "Commander" diff --git a/code/modules/client/preference_setup/loadout/loadout_shoes.dm b/code/modules/client/preference_setup/loadout/loadout_shoes.dm index 07236c3592..9547f92a5f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_shoes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_shoes.dm @@ -1,21 +1,21 @@ // Shoelocker /datum/gear/shoes display_name = "jackboots" - path = /obj/item/clothing/shoes/jackboots + path = /obj/item/clothing/shoes/boots/jackboots slot = slot_shoes sort_category = "Shoes and Footwear" /datum/gear/shoes/toeless display_name = "toe-less jackboots" - path = /obj/item/clothing/shoes/jackboots/toeless + path = /obj/item/clothing/shoes/boots/jackboots/toeless /datum/gear/shoes/workboots display_name = "workboots" - path = /obj/item/clothing/shoes/workboots + path = /obj/item/clothing/shoes/boots/workboots /datum/gear/shoes/workboots/toeless display_name = "toe-less workboots" - path = /obj/item/clothing/shoes/workboots/toeless + path = /obj/item/clothing/shoes/boots/workboots/toeless /datum/gear/shoes/sandals display_name = "sandals" @@ -135,16 +135,16 @@ /datum/gear/shoes/cowboy display_name = "cowboy boots" - path = /obj/item/clothing/shoes/cowboy + path = /obj/item/clothing/shoes/boots/cowboy /datum/gear/shoes/jungle display_name = "jungle boots" - path = /obj/item/clothing/shoes/jungleboots + path = /obj/item/clothing/shoes/boots/jungle cost = 2 /datum/gear/shoes/duty display_name = "duty boots" - path = /obj/item/clothing/shoes/dutyboots + path = /obj/item/clothing/shoes/boots/duty cost = 2 /datum/gear/shoes/dress diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm new file mode 100644 index 0000000000..21e4e0fb5f --- /dev/null +++ b/code/modules/clothing/shoes/boots.dm @@ -0,0 +1,100 @@ +/obj/item/clothing/shoes/boots + name = "boots" + desc = "Generic boots." + icon_state = "workboots" + force = 3 + can_hold_knife = 1 + +/obj/item/clothing/shoes/boots/cowboy + name = "cowboy boots" + desc = "Lacking a durasteel horse to ride." + icon_state = "cowboy" + +/obj/item/clothing/shoes/boots/jackboots + name = "jackboots" + desc = "Standard-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." + icon_state = "jackboots" + armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0) + siemens_coefficient = 0.7 + +/obj/item/clothing/shoes/boots/jackboots/toeless + name = "toe-less jackboots" + desc = "Modified pair of jackboots, particularly friendly to those species whose toes hold claws." + icon_state = "digiboots" + item_state_slots = list(slot_r_hand_str = "jackboots", slot_l_hand_str = "jackboots") + species_restricted = null + +/obj/item/clothing/shoes/boots/workboots + name = "workboots" + desc = "A pair of steel-toed work boots designed for use in industrial settings. Safety first." + icon_state = "workboots" + armor = list(melee = 40, bullet = 0, laser = 0, energy = 15, bomb = 20, bio = 0, rad = 20) + siemens_coefficient = 0.7 + can_hold_knife = 1 + +/obj/item/clothing/shoes/boots/workboots/toeless + name = "toe-less workboots" + desc = "A pair of toeless work boots designed for use in industrial settings. Modified for species whose toes have claws." + icon_state = "workbootstoeless" + item_state_slots = list(slot_r_hand_str = "workboots", slot_l_hand_str = "workboots") + species_restricted = null + +/obj/item/clothing/shoes/boots/winter + name = "winter boots" + desc = "Boots lined with 'synthetic' animal fur." + icon_state = "winterboots" + cold_protection = FEET|LEGS + min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE + heat_protection = FEET|LEGS + max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE + +/obj/item/clothing/shoes/boots/tactical + name = "tactical boots" + desc = "Tan boots with extra padding and armor." + icon_state = "jungle" + armor = list(melee = 40, bullet = 30, laser = 40,energy = 25, bomb = 50, bio = 0, rad = 0) + siemens_coefficient = 0.7 + +/obj/item/clothing/shoes/boots/duty + name = "duty boots" + desc = "A pair of steel-toed synthleather boots with a mirror shine." + icon_state = "duty" + armor = list(melee = 40, bullet = 0, laser = 0, energy = 15, bomb = 20, bio = 0, rad = 20) + siemens_coefficient = 0.7 + +/obj/item/clothing/shoes/boots/jungle + name = "jungle boots" + desc = "A pair of durable brown boots. Waterproofed for use planetside." + icon_state = "jungle" + armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 10, rad = 0) + siemens_coefficient = 0.7 + +/obj/item/clothing/shoes/boots/swat + name = "\improper SWAT shoes" + desc = "When you want to turn up the heat." + icon_state = "swat" + armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) + item_flags = NOSLIP + siemens_coefficient = 0.6 + +/obj/item/clothing/shoes/boots/combat //Basically SWAT shoes combined with galoshes. + name = "combat boots" + desc = "When you REALLY want to turn up the heat" + icon_state = "swat" + force = 5 + armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) + item_flags = NOSLIP + siemens_coefficient = 0.6 + + cold_protection = FEET + min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE + heat_protection = FEET + max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE + +//Stolen from CM, refurbished to be less terrible. +/obj/item/clothing/shoes/boots/marine + name = "combat boots" + desc = "Standard issue combat boots for combat scenarios or combat situations. All combat, all the time. It can hold a Strategical knife." + icon_state = "jackboots" + armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) + siemens_coefficient = 0.6 \ No newline at end of file diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 2dea9bd124..ddfebbea0a 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -3,11 +3,6 @@ icon_state = "black" desc = "A pair of black shoes." - cold_protection = FEET - min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE - heat_protection = FEET - max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE - /obj/item/clothing/shoes/brown name = "brown shoes" desc = "A pair of brown shoes." diff --git a/code/modules/clothing/shoes/jobs.dm b/code/modules/clothing/shoes/jobs.dm deleted file mode 100644 index 00dc994cad..0000000000 --- a/code/modules/clothing/shoes/jobs.dm +++ /dev/null @@ -1,39 +0,0 @@ -/obj/item/clothing/shoes/galoshes - desc = "Rubber boots" - name = "galoshes" - icon_state = "galoshes" - permeability_coefficient = 0.05 - item_flags = NOSLIP - slowdown = SHOES_SLOWDOWN+1 - species_restricted = null - -/obj/item/clothing/shoes/jackboots - name = "jackboots" - desc = "Standard-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." - icon_state = "jackboots" - force = 3 - armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0) - siemens_coefficient = 0.7 - can_hold_knife = 1 - -/obj/item/clothing/shoes/jackboots/toeless - name = "toe-less jackboots" - desc = "Modified pair of jackboots, particularly friendly to those species whose toes hold claws." - icon_state = "digiboots" - item_state_slots = list(slot_r_hand_str = "jackboots", slot_l_hand_str = "jackboots") - species_restricted = null - -/obj/item/clothing/shoes/workboots - name = "workboots" - desc = "A pair of steel-toed work boots designed for use in industrial settings. Safety first." - icon_state = "workboots" - armor = list(melee = 40, bullet = 0, laser = 0, energy = 15, bomb = 20, bio = 0, rad = 20) - siemens_coefficient = 0.7 - can_hold_knife = 1 - -/obj/item/clothing/shoes/workboots/toeless - name = "toe-less workboots" - desc = "A pair of toeless work boots designed for use in industrial settings. Modified for species whose toes have claws." - icon_state = "workbootstoeless" - item_state_slots = list(slot_r_hand_str = "workboots", slot_l_hand_str = "workboots") - species_restricted = null \ No newline at end of file diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 755c657bac..eaf5a34135 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -9,76 +9,18 @@ siemens_coefficient = 0.8 species_restricted = null -/obj/item/clothing/shoes/cowboy - name = "cowboy boots" - desc = "Lacking a durasteel horse to ride." - icon_state = "cowboy" - /obj/item/clothing/shoes/mime name = "mime shoes" icon_state = "white" -/obj/item/clothing/shoes/swat - name = "\improper SWAT shoes" - desc = "When you want to turn up the heat." - icon_state = "swat" - item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat") - force = 3 - armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) +/obj/item/clothing/shoes/galoshes + desc = "Rubber boots" + name = "galoshes" + icon_state = "galoshes" + permeability_coefficient = 0.05 item_flags = NOSLIP - siemens_coefficient = 0.6 - can_hold_knife = 1 - -//Stolen from CM, refurbished to be less terrible. -/obj/item/clothing/shoes/marine - name = "combat boots" - desc = "Standard issue combat boots for combat scenarios or combat situations. All combat, all the time. It can hold a Strategical knife." - icon_state = "jackboots" - item_state_slots = list(slot_r_hand_str = "jackboots", slot_l_hand_str = "jackboots") - armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) - siemens_coefficient = 0.6 - can_hold_knife = 1 - -/obj/item/clothing/shoes/combat //Basically SWAT shoes combined with galoshes. - name = "combat boots" - desc = "When you REALLY want to turn up the heat" - icon_state = "swat" - force = 5 - armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) - item_flags = NOSLIP - siemens_coefficient = 0.6 - can_hold_knife = 1 - - cold_protection = FEET - min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE - heat_protection = FEET - max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE - -/obj/item/clothing/shoes/jungleboots - name = "jungle boots" - desc = "A pair of durable brown boots. Waterproofed for use planetside." - icon_state = "jungle" - force = 3 - armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 10, rad = 0) - siemens_coefficient = 0.7 - can_hold_knife = 1 - -/obj/item/clothing/shoes/dutyboots - name = "duty boots" - desc = "A pair of steel-toed synthleather boots with a mirror shine." - icon_state = "duty" - armor = list(melee = 40, bullet = 0, laser = 0, energy = 15, bomb = 20, bio = 0, rad = 20) - siemens_coefficient = 0.7 - can_hold_knife = 1 - -/obj/item/clothing/shoes/tactical - name = "tactical boots" - desc = "Tan boots with extra padding and armor." - icon_state = "jungle" - force = 3 - armor = list(melee = 40, bullet = 30, laser = 40,energy = 25, bomb = 50, bio = 0, rad = 0) - siemens_coefficient = 0.7 - can_hold_knife = 1 + slowdown = SHOES_SLOWDOWN+1 + species_restricted = null /obj/item/clothing/shoes/dress name = "dress shoes" @@ -176,15 +118,6 @@ slowdown = SHOES_SLOWDOWN+1 species_restricted = null -/obj/item/clothing/shoes/winterboots - name = "winter boots" - desc = "Boots lined with 'synthetic' animal fur." - icon_state = "winterboots" - cold_protection = FEET|LEGS - min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE - heat_protection = FEET|LEGS - max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE - /obj/item/clothing/shoes/flipflop name = "flip flops" desc = "A pair of foam flip flops. For those not afraid to show a little ankle." diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 00b2d114c8..65f5bdef00 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -88,7 +88,7 @@ name = "Syndicate Operative" corpseuniform = /obj/item/clothing/under/syndicate corpsesuit = /obj/item/clothing/suit/armor/vest - corpseshoes = /obj/item/clothing/shoes/swat + corpseshoes = /obj/item/clothing/shoes/boots/swat corpsegloves = /obj/item/clothing/gloves/swat corpseradio = /obj/item/device/radio/headset corpsemask = /obj/item/clothing/mask/gas @@ -104,7 +104,7 @@ name = "Syndicate Commando" corpseuniform = /obj/item/clothing/under/syndicate corpsesuit = /obj/item/clothing/suit/space/void/merc - corpseshoes = /obj/item/clothing/shoes/swat + corpseshoes = /obj/item/clothing/shoes/boots/swat corpsegloves = /obj/item/clothing/gloves/swat corpseradio = /obj/item/device/radio/headset corpsemask = /obj/item/clothing/mask/gas/syndicate @@ -134,7 +134,7 @@ /obj/effect/landmark/mobcorpse/pirate name = "Pirate" corpseuniform = /obj/item/clothing/under/pirate - corpseshoes = /obj/item/clothing/shoes/jackboots + corpseshoes = /obj/item/clothing/shoes/boots/jackboots corpseglasses = /obj/item/clothing/glasses/eyepatch corpsehelmet = /obj/item/clothing/head/bandana @@ -150,7 +150,7 @@ /obj/effect/landmark/mobcorpse/russian name = "Russian" corpseuniform = /obj/item/clothing/under/soviet - corpseshoes = /obj/item/clothing/shoes/jackboots + corpseshoes = /obj/item/clothing/shoes/boots/jackboots corpsehelmet = /obj/item/clothing/head/bearpelt /obj/effect/landmark/mobcorpse/russian/ranged diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm index d125fcebbf..514e173896 100644 --- a/code/modules/random_map/drop/drop_types.dm +++ b/code/modules/random_map/drop/drop_types.dm @@ -112,7 +112,7 @@ datum/supply_drop_loot/riot /obj/item/weapon/melee/baton, /obj/item/clothing/glasses/sunglasses/sechud/tactical, /obj/item/weapon/storage/belt/security, - /obj/item/clothing/shoes/jackboots, + /obj/item/clothing/shoes/boots/jackboots, /obj/item/clothing/gloves/black, /obj/item/weapon/gun/projectile/shotgun/pump, /obj/item/weapon/gun/energy/gun, diff --git a/maps/polaris-1.dmm b/maps/polaris-1.dmm index b9ca6d0677..55e6948340 100644 --- a/maps/polaris-1.dmm +++ b/maps/polaris-1.dmm @@ -9596,7 +9596,7 @@ "dCB" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden) "dCC" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden) "dCD" = (/obj/effect/floor_decal/corner/green/full,/turf/simulated/floor/tiled,/area/hydroponics/garden) -"dCE" = (/obj/structure/closet,/obj/item/clothing/glasses/welding,/obj/item/weapon/weldingtool,/obj/effect/decal/cleanable/dirt,/obj/item/clothing/shoes/workboots,/obj/random/maintenance/engineering,/obj/random/maintenance/cargo,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/maintenance/apmaint) +"dCE" = (/obj/structure/closet,/obj/item/clothing/glasses/welding,/obj/item/weapon/weldingtool,/obj/effect/decal/cleanable/dirt,/obj/item/clothing/shoes/boots/workboots,/obj/random/maintenance/engineering,/obj/random/maintenance/cargo,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/maintenance/apmaint) "dCF" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden) "dCG" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled,/area/hydroponics/garden) "dCH" = (/obj/effect/floor_decal/corner/green,/turf/simulated/floor/tiled,/area/hydroponics/garden) diff --git a/maps/polaris-2.dmm b/maps/polaris-2.dmm index 70b0d991f4..29af2b113a 100644 --- a/maps/polaris-2.dmm +++ b/maps/polaris-2.dmm @@ -2703,6 +2703,7 @@ "aZY" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/skipjack_station/start) "aZZ" = (/obj/item/weapon/bedsheet/rainbow,/obj/structure/bed/padded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "baa" = (/obj/item/weapon/bedsheet/hos,/obj/structure/bed/padded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) +"bab" = (/obj/structure/table/woodentable,/obj/item/clothing/shoes/boots/workboots,/obj/item/clothing/under/technomancer,/obj/item/clothing/head/technomancer,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/chameleon,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) "bac" = (/obj/item/robot_parts/r_arm,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) "bad" = (/obj/item/robot_parts/l_leg,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) "bae" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/book/manual/robotics_cyborgs,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) @@ -2744,7 +2745,6 @@ "baO" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) "baP" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) "baQ" = (/obj/machinery/teleport/hub,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) -"baR" = (/obj/structure/table/woodentable,/obj/item/clothing/shoes/workboots,/obj/item/clothing/under/technomancer,/obj/item/clothing/head/technomancer,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/chameleon,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) "baS" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = -32},/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) (1,1,1) = {" @@ -2977,7 +2977,7 @@ aaRaqAaqAaqAaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaVZaWcaWdaWbaaPaaPaaPaaPaaPaaPaaPaaPaa aaRaqAaqAaqAaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaWpaWaaWaaWqaaPaaPaaPaWpaaPaaPaaPaaPaaPaWqaaPaaPaaPaWpaWaaWaaWqaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaWeaWgaWjaWraWsaWkaWtaWuaWuaWkaWvaWwaWoaWgaWiaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaRaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaWxaWyaWzaWxaaPaaPaaPaWxaWAaWBaWBaWBaWCaWxaaPaaPaaPaWxaWDaWEaWxaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaaPaaPaWeaWjaWFaWGaWHaWHaWkaWIaWuaWuaWkaNraWJaWKaWLaWoaWiaaPaaPaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaRaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaWxaWMaWNaWxaaPaaPaWpaWxaWxaWOaWPaWQaWRaWxaWqaaPaaPaWxaWSaWTaWxaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaaPaWeaWjaWUaWVaWWaWHaWHaWXaWYaWuaWuaWXaWZaWZaWZaWZaXaaWoaWiaaPaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP -aaRaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaWxaXbaXcaWxaaPaaPaWxaWxaXdaXeaXfaXeaXgaWxaWxaaPaaPaWxaXhaXiaWxaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaaPaWkaXjaXkaXlaWWaWHaWHaXmaWZaWZaWZaXnaWZaWZaWZaXoaWZbaRaWkaaPaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP +aaRaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaWxaXbaXcaWxaaPaaPaWxaWxaXdaXeaXfaXeaXgaWxaWxaaPaaPaWxaXhaXiaWxaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaaPaWkaXjaXkaXlaWWaWHaWHaXmaWZaWZaWZaXnaWZaWZaWZaXoaWZbabaWkaaPaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaRaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaWxaXpaWxaWxaWxaWxaWxaXqaXraXraXraXraXraXsaWxaWxaWxaWxaWxaXtaWxaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaWeaWjaWHaXuaXuaWHaWHaWHaXvaXwaWZaXxaXvaXyaWZaXzaWZaWZaXAaWoaWiaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaRaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaWxaXBaXCaXDaXEaXFaWxaXGaXraXraXraXraXraXGaWxaXHaXIaXJaXKaXLaWxaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaWhaXMaWHaWHaWHaWHaWHaXNaWkaXwaWZaXOaWkaXPaWZaWZaXQaWZaWZaXRaWhaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaRaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaWxaXSaXTaXTaXTaXUaWxaWAaWBaWCaXVaWAaWBaWCaWxaXWaXTaXTaXXaXSaWxaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaWeaXYaWiaXZaYaaWHaYbaYaaWeaXYaYcaXnaYdaXYaWiaYeaYfaWZaYgaYhaWeaXYaWiaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP diff --git a/polaris.dme b/polaris.dme index ad53ed1052..5ea51633d4 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1207,8 +1207,8 @@ #include "code\modules\clothing\masks\miscellaneous.dm" #include "code\modules\clothing\masks\monitor.dm" #include "code\modules\clothing\masks\voice.dm" +#include "code\modules\clothing\shoes\boots.dm" #include "code\modules\clothing\shoes\colour.dm" -#include "code\modules\clothing\shoes\jobs.dm" #include "code\modules\clothing\shoes\leg_guards.dm" #include "code\modules\clothing\shoes\magboots.dm" #include "code\modules\clothing\shoes\miscellaneous.dm" From 8527a7c60170ef3cbd983658d2618ec0b93bbbd8 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Sat, 18 Feb 2017 10:33:17 -0600 Subject: [PATCH 02/16] Removed a superfluous line --- code/modules/clothing/shoes/boots.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index 21e4e0fb5f..abe4685e75 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -30,7 +30,6 @@ icon_state = "workboots" armor = list(melee = 40, bullet = 0, laser = 0, energy = 15, bomb = 20, bio = 0, rad = 20) siemens_coefficient = 0.7 - can_hold_knife = 1 /obj/item/clothing/shoes/boots/workboots/toeless name = "toe-less workboots" @@ -97,4 +96,4 @@ desc = "Standard issue combat boots for combat scenarios or combat situations. All combat, all the time. It can hold a Strategical knife." icon_state = "jackboots" armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) - siemens_coefficient = 0.6 \ No newline at end of file + siemens_coefficient = 0.6 From 829f57efb3d185579c30aacf829c630ebc9b15ed Mon Sep 17 00:00:00 2001 From: Anewbe Date: Sun, 19 Feb 2017 14:08:58 -0600 Subject: [PATCH 03/16] Boot knife sprites --- icons/mob/feet.dmi | Bin 36655 -> 36727 bytes icons/obj/clothing/shoes.dmi | Bin 25682 -> 24598 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index a3a7f4ed9154928e734d78252f3d849a24db5c0c..364f66b010a9cc743c8f06c99ab4ec2eaa7d9dac 100644 GIT binary patch literal 36727 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 literal 36655 zcmdSBcT`i`*EWg;8zKiA3IZMh5fBh*N{fns0Rg4=sB|KP-bpM6P!ZA4YotpD=_N!& zKx(8&q=uT%TWBF6xhv=W-h010?l|d6yj~nT0`{nX?4W=~L7=z#zkOsIrAZzinR-9p4Iyg*7PP1W*uc zLO3~>bT03ol&;oM6wcK|XKpAtl1j}q4>;LFp+$ZF=A=N%*V62qJXexrEchiMvKC=- zsOe41^RBVCOP-`F27}X=??rH37j&|*T|aDJjK%4;y*OiT6GURR+v&*!<9Rx9+iW`<->=4AJ0$<)a#v z&c<8!Vsr(Xuc2I$oZsEl{L5fuR^#x_h0KHHUPfoH4o{U&t=})brGL}(S;AFe)jv{+ zc9}2RtTr{gUUtTw;r=7^cJwo6F_+Yw1?N?s(^o=gEKU?l9(&x&$3#1Cs2EOQr{15N zJZ-?NZPZSq=WA48(QoI470Ndkq5M-CZr{ybI!DeQYubCAI4JZGW`Lwth`*h> z7+qA0KPtVW!gu5M?Vziln6}z?-9$Uy$EoYdlj%AVJVdy$km|&{50oPVrWwOJ*Aq`g zdw)1VyZHCll8!&nj6kgAgO^@Df=bb1+i^c0)Zv&H(B%S}?-L-2uU3+cqqw&nYzGw= zlefC}3~a8JnvpJZ1<42>m2(LAbvs8_=JWxcF^60CCo(KO!j4(VDNju%zkA6@H7e3m zKP=U;@BHSQ#_dTh@1o?FdwrVM-UUz|-uYYNbnsODZOuZ1KPtZOjN?M|itjA^-4W&0 z@uS6YDCz4VO@s8d;hFc`5zmq_(S~-p81r#U9>EJid-yT}X??ayMFk>{Vsq)Ulx0q3 zda|)yW`o|pYviA@G#2C^vz5wZ67Jl&{NVE6hi|-j^Y|pYZ@llmFEsf$+_Eu9KGg2x zy9d<*uO$3QkK|z9kZ2EyqU??CD9ci&(hjR4aWG&*FC_U-W5Jd!1$ON-*p$9I z$TGHq|Llgx8q;n6(`~_<+#^#k$**b=_wBA!B}O+4I(~Zd@P}`s3d8UHMcePpii%~c zZiF+x2$A|>%RDBStbCQbO#mT)BNB7?7)uT%x9Rq4l=mwF&^}3Aa6e^pIY1MAkoLL_ zbysU%6u+msZZnq@-jEYiVuanU4z%~)nOlqR;rIXOlH=sJB` zoK5r`TmDUKxJi(S+O1)4U8Uj$C4e(cBX#?`Q9fOk+Yh2}cI0)47n)#~tBB%P1Ls_X z!__JH_V!Q0u6c!j?-sM2*&5{3rm!Q+2z zuetVCbK#=OMR1af5j|G4+4#DA+qO3&Mf)2%R0bKPCs944Oq3~GAq<@lQPUGGknfpB zZ0)Y|dOjN=(2;lt#9D2sLEoGyEOwx=4VGN|VvjinFW#pW^MWC&6RuSM;(z-fEm8`) z{J9K;$%iu=3+PM%A}+Ng;3xcMkRN9(-t1;w(B?34A$F)9KG)Kr+uIi0{m6Oz?2Z>% zcRdLnrd`x6H15!yWWTYo5tE!;@c#Y#N9&$)3JT&vLh7}(wH=+E{e|Y`Q+1zTy*d~j zAI~F>DZ8ZRdEYrN4;svg35p&BVdw|6r;1)+50$& zZ?4-ItS$02a*r~T1tnIZaPnLM-TTZwD>d7TDd$HazxkMSvy7;K(b>Lf#d-{Fx7$W` zW#fs14&_aCM|ZOBOMGrh$|cSVH!f%RLz}KBJo&~pJ2Ug;8`*G{)a{|lrPpYvW=kC| zeY%i{p3+8M?`=y-i*s0B$E3yO43a#Qe1Yklhi$z)b<(x(qdGGks?HQLIws1=FRm(k za~rkW^>c!8W=F<(4(0SSo%!o!x~@g=@1vrz9kTK`>+d&97XCc$O*Hjc`qE#kv=D=z zqi~C3ic+I)oj}o^77^^7%*P$M$1?Lz}9`a_hAsb(`LQLuRUt zsVe#Zn3Fc<6lHKkHMm;e<$IpLg5CAEpi_NjVF;mIQ2gktOAO1SCVVoc20Wg-q{Q2Hi2D{Jmox_aO$cE_q+ zUr%qa&S&vT71;Za8t)mEZS`<2_*k8fww|7^J^zQe54Bb4>9I_4H5WeKXFbi`r}ylS z&gV)b;RI67UsolXtW8hI%@^svLJ7C*9}U_TT>VUAUf$CGl=LCB0XJ`UqZIXS^UuPr zLt9^;j9~TJA>B6RlmsnvO4V9G%~Mm|NP*zBrZ=vuSZ1SUlt7W_dC3zY{BCci+S(!h zYo8f4p7u_(9UL=czfBr-(ZiBCf@o7^J?Zo1bz+B#Ubtc3yFnWWwH>nn`<3FB|?e!8CX)3(lsfH%p{`bvOB?IMQvcHtDuHQ)*EsI2Kc_|J6=XqNYK?YFi$!`MPnRm-YU z3#gJsnS~EKI{hGuqsjI*(HOzn?$)wH-)dh;eEw!Wv+DU8)#x%(n}qq=lhwg9C)YBvY(S z`Ou;~Tq{ZeUE#aw#A=iTVq0sw#fq}{6)<@DI~@vC*H@M)6(WOs;QmAo*;2I@*xO1Kgl~0o|t9-!#8kQD*Q=Et+WIfJCl2 z-gLEBf-s#aMLVxvz52E8O01QA2HPb}R(lCS1|xKLBhZ%A$-wQUiymE2D0C3Rj7BFB zRYn`Va>34dm#Y*+D;=Lot)7?M1!&YQ*`G7-8>OXgQPceww4g1DARXD;udn7D7Q75E zw)s#TvsnTsxJ-O|sg3{nsC#A1!p7iPD>b;7Bqc2-qh4Hdk6jJ3efS`6sc#X3l3!q< zBE7yb&Hf2Du?C)o)W$&x+1?$4^6mF zt`;#wcXTwgF2gjnji_B69cba-1cJn0$L=p7o#qn`TU%QvoZ+#Xdz-y$+(J`nf)QR_>R~4zlY3H)xAzwF3yLZ?=uC1YJT^W) zS4isv@Y@D2?|l1x@H<_V(GGf%RZ*Ix3~YFFvx$) z{qoeJdibeOw`kxdcIZBfgBs6upwQzXa#wf%y5+rFI#^`MvqN`^jEqdTMFO0>H&Ud^ zTpjl5Q~3`2I2}pVdd494&;fyjxN)!pXlU%Xz5Xvo+zNVh=KveqlXL86!ETes|7neB zC(kl`O7{+`YN~;a&D|HO6wAB@O#MM$X}Y=y6j-~Fi3#cLblq@8*jg~OxTLB5B%TAp z6M0T+^u6gcP0O2!-ARhuaP6Lan2fS*;hrUv`9|R2S#wD-B`=gh+r-r0PRuB4{4jCw zw(%EJB~UVD@zvC6y9iX}&%JYVfTk*tP)J(_xw=2GMa=rZG9Y(VtD{4~qEKjHeZy$5 zgd(Bi+?VRkPF({7^ap;H{sEW<9kP+FRV{6? zOr0I*&GFKj4n)?>+3L;EGs%-CIbIAy(+`9cPs&kG`D9}st)a(+|w{b?>C zj`M8LKEJqAzy7H%QG=6L*J=C9r|@{ZqL`SNsOwH3wvI|lwss}r)o6upD@oX(ow{wW zHv|}JA1b>2?d2hHNy)7WZz-GL^_H3<5tGK~-r+|7SuJHE2^YAvkU;j|oa;>++-^~3 zMqq=4s-h&Xtu>ff@P0x~zODTsi_6}+Pn(I>FYIFW=}1S`;)`q@7-fVrk<|L~^CaTZ z!$f8%kIfg2i1W@119^K>5zgGPjpav}e!EiQk~$TebN#S6n0Nb_M}PXC$V zr?^-zhf~x{v2{1-w5|DEj5hj|oO}Sf-d7$y^BnSPVCJ?drJ2B;R!d6t+w>FCs!QWr z!EP;fe@VHdf#FJqf1@^+55iOMf)Y#~`2hlaB{M2;1-E0!u5*l%}@P@%!KcK7;2TrQl8>uF0Y+_A5gjXmF0m@*>|^!}MjcCvsQmyDTh8d2Bc$ zYC5~NU!D9J9BI9+Sey@8&&ATF?1H-Im!p(9+JZG_Q7!aUW%qQY-&RW&Dip+E9_iVb z-^BMHNakdrUkAJQddYcnRIk_4@xvDTdscYAn`b^H&-n}#2X}Zc_lc3VDStzH6W>}i zubLc&O;i&Om)ukJnhr<55;aA9R z)6roA^SqabjxM~DC^<>A*VfUQZu|hC!w^Q?gY7gjqL^O>28>KMEH}nvY=xnRj-I^1 zabBtd9Yo;wOVF=I#Gg%h%^9v3lW4peavfT?kRc_y46CO+T8k!}PdZ?``i2(pz#FNv zEvS}}&a>02&f4s$Ib70fm67V+uzxZAC(0raxA_nTV#{US}S5gl2U zB`1)Mk_nUZ8Z4|y3!kIYY)-oQZDddIj&?+yUrc}$7Z3K^jy`nV?(dWE z9-3$Zs(|7R<^%EwU1WYG$blESFj!fBN`e2A@ctAzD#&7Z#e|`;FFWw-*XP%|TKA}9 zb-pGgHrNU;({I3;^ylcxUc7j5AudG(I=t7eTxU0Nhk#qX6b0E%7}}oC<@I*{AUr?u zQk?zZ0afZu^l}ek=iDy4i`juB3GM7b9{MlX} z+3HbVog4F6tPuU{QAo%>)P9I_wSl5H7mos8+(H=U%vIwdtAQ&B3~HP{5+ml>v73uQ z=KGBYwEgaC=IiL<3G$uGkEmn4oR)jkd6lS4C^~F+<=1d(_&r*k@BG=F>hEV#1-sj0 zvNmJv>~nU0RfnI7iL9Pt&HUh?xjSIjqd@JiSx=|}Q}xZ2T>#Y*XI93xHfYQY2!g|{ zo<8+6s)xhFb7#e(;#%Ws&wVn)GsF(*Pjwf9SQOd{$UOUpW$^?uibW;3g*3lp2h_Zz zYAF#(s2x?=?v~e5{orK?#$licPJXkmcfi|iIz~fr!*bdLc|DvI#N2k+R z2$#xdnt=c3mVL!@=Ta+*0Fx+&KhV{UOyrgraqThI4==9*M0QR~adg6Ed(|eyI2**E zP6Ctgw>!7}2A&gn*SFRxKIHpPGW%bY`OOuv`@#J!wB-4f7PPk$KMG26C-#0X56|@( zu;f@7d{MR%^Giz$2l^-aJe3)Rv5pzbAs260Ma zPOBvIXnbRa27`HKZ;x7iWe37Eap&jU+H(0)LNHo|W#1xc!RHe)3A16S#?6wt$q|&R zhk)A?#;2ZYs!pGyCB)5x*pwrr^yloynenJsB1#Yoz!`Y?_(WU@xfs{-xWzRZY~Wjj z^zCKZ`tClXzwr$4IiHJmCH=wHOyd9`wJ(g%KKjpZM84L*UsoWjUwuaVJ*Dwq>Sxui z>Gr=e==SCn8ouT2&->3KcvS6~>zEf075(W*RI;0yB@7|#OdrWJAabLHnZ|so;0{6gS2 z#r#RH%MxDpw~ZC0)SD((*tS{Wxp)>6UPmzzmVtEKxg^x4%4kPn35OcfSC6mcZ&4eB z@AJ)|oB9psP26HW45Z#-I=iA6uKnkJb;riGnm+mr!nPu;l=(1LX5&b`qRX;RJK(0D zN%3du2+fy1(Wr$nmQ^p3p_TM2Y)-Fbw%8^+2BBG~J9u6L+3eb@8EM8BEOmYJ zoKq)hSBg^hqBoE zMjg&&$i>;#+MU>{r zWp0^+R8OZ1Dv>JT>TQ>T>C)wEyD;CWb<{HfI6oQqs>A)mja5<^MbseN?v-ajO@GSL`Uo}=KlN+Z zzSoeeE7F`W!5eSg8mSJZ%=4Q|<@h8WX{;Pct@;BM@a9J8ZO!L`idEmr>6LwN=mI=B zKU7(C+m^9X*wTK>f9=VS?Nt<$mIk3ua&ZIy?Gq7%)LDGnN*^=VnOnyxZctHHO=kFw zzMo{KfS3xiZ6xs~Q+j(P;*VO@lN54g-_JhOQ|+k#x|1&4KHT|#3(@a?k(^?2^Ecrw z`0F<{408f|wz|Rvt}9H!AiKXV=@+_^T|l>##s=jS9e7c(YZ~#e7iW%SRL3MP#`nIi z6_=LYnIVyQRgH>0OY}Ni7ng@qG0E_bj*fv$AiEI>jUlv$AQJ;L{GuM=v^IVUqq(Py zZ-;2$u(g#qTxJ_CDl6N666v88K|ypb4@-cS3T>&JSJvTS@+!RL-8m8|88HZ=`Nj<# z%i$=DIfqymeah-_o|d=!XW&tM)*)q+05rfvY~P1G&rI*E6=SG@iv_~;Xw2>JaA6HQ z6M#OJ#GcBH$n|Z@SqGqCqm%IA!pnc={IGO;&J|H;em+CRh^@IAx^nh!QHY{rf^UdT zkO7j3#2Pbtt`asZEp#xO<9j82inH_nFCFk{uJ#Nr2)$GWCNL<^9*{p|2%oJ%V7E+! zpsInJABC4ks`d3%w_?bHmI(RD5#jl~+_ZNzC4rzN8ADT3o(^}<6rbC09UUE3#=|OA zeYf^cH3D;llQ-)Wzmiky`->(d2x45ti@xjOI#wrNail$!vcgi<+CK0{3vVqA8KO78 zb4dGN)lYjaoL5%%7#$N6lhxPPS5uPt`SZ621{N;)rvz_jw6NJ0P$;_iG*zFw z=6s%*GAb_~hlY?&e69T&rN?JSQ-StZ_Igpi-mTBB7{A zFfui*&I|q#5q)uW`a|Mu%CtgSl)t@N(BoLQ@x-mze@Ct$KflAy-X7}GACi=xFAj8q zN->-+qRA9lI&}8z-jxoMiob6|<70T3MHKS)bI|Y~m>xSb8fXIIN^avU)tQ;G&$Xe|}?6;E2vBkwwE7YRdt+`%xA0MB55E$4-sgeR$z<-DQf&ybO zfMrJ%yOZQQXMhBvsAvj^e)`m`(|<{!o?c!o5yiaRp=C=2L`Vq@4GoW|?`MJB0n(Gk zHa0e23hTu75;|>A)}1=nRhaQH2_S7?3I_=&+Nq*n6HTvui0S8=3W8;TStYHFwDiYG zS{hkfk3I9<eS6wWQ=|QF`4;J$o0}_v4cekZ_HlJY z^1_0Pv9WPw9KVISv2iT;?np4vHIM^IAj=1?H67h*X;j|Io$VfJ`w$(cA|p9fwP*sl z2Icj%PbU0w!|k^$oxxyPqH1vy_E#woRppY4d8P7s$&hu170zfyviI#PM`7o# z1evsR5+)a*yej^sS)`GcWJ7Vpc%pquhF}`=LA*@hcE)zBejY!f=@4MR>)-y}eiJ`& z4YUd~UL0g&`_E};Yi}OxIbS=5ZKaN8`ekpSneX-mR>Q|4HMKQiTw_(iIHFhaET$sv z6M9e);iW7)d`%t`r8kz054Q|>tHylW196rl577^>t+$-}rEm;8k+$pQ%_Jnlf(aP^ zb*>RXoAW)Pbf>oMqh78KVSFMb(2m#?2sgQz{oij#`8IY7vi*g!I^Y^^I}5`~ixH3v zOB9;njH7`(RGWjt;m+*la->};TkElHC%e*I$P{-b@%Z!nFUQVFYx#?*uw-m~MMWvoJF>E}-N}f?Jl1rIg>yEH zO6addD0e0E7$*WTcKJ_Pa|b>+c6BGHLC{yx!Om>RN^t9O6ORLa&u^Mh?)0_?(OtH0 zkjte{KRND0!|g%dyw=kh=d^j-FtwO|I=HK4?mmVI(lw;u1e|a;Hm`PVK%O1a1Do1; zh?A;OErL^AS5Z<72p3=4YT;AHX&gDs!zMcRe1N6mM)TN>9=Jihyr7qfg?oq_S&1}$ zR>gswG9VA#I+{(6ua9S91+83#^YEo-p$6SKSPLr6IBj)*!sSe(F4}~FG#(|avpzBG ziF3tTH$0TuzL-Z1{`2!Bge=`9R_0sSW8BytEvlt*zIt`kdA1|-Z2fbk>;aSG|3k&U zxThpGKLDSZKmSMwifE+feEs^>d&yGG*{|Js+d>Uq^oIUDKcCGL zJ0-y)dvsAHoCvv-P9C3;=Q#>n-83(?{la)cX&Z2B!l#b>sDF?3*T2Cm$9B&W+T)X| zvwb*=CtHFVNPCzOvDZB^I=j~W@<3ki## z%&&X$ccWUP&YQ%GX^uM9(Lv;)$+LxP=-IRQ!CTd}cHV;gqh4kPrI#zKFNKno*-KPY zUirG?Ck;Cg9FEqLbMd>{ZBdKc&i(I& z_cz)_ReS4GL)<(&W;vuA+zlFwrf$29-YO5KdPWKF&uKw!YJIr$N!Vx2djK5|Q*yR; zt8tqW_8JWqgD#BLmLq8+#J~)~dBh}TKcCt*j4HmM=$10yn;EX;vycU-`NG2lTzOmw zZM(e)=-2lTu)Ay4hYZWf3M*Ug({>0Tb>mH|a3+=WD{l_NO9EOy@WZ8gx?+SQ8~0q6 zhbwie^^+Z@%&rWL&WP&CwO)|4t{d=Lt|ahAwPot1Dv5y#pOI<= zVT%AmfJBJ~0ro~3yJ-LzqBE1RFTR7zUc9Pz(=GlZYlDsf^l4?Ro<%3SZ$TZ$=}`iz z`GX`(OpI_f8MV9i)Y^B*-th+=!q~O-nfsQU=LBhlv!$%>?W~pnZsGjEw~BXX*${k7 zn8n5)O*e+{qEm~&p*$3mQ9Q$33x^m1IhEB9;N~=zysAJtdodhBPnV!hwnp+fvR-Q7 z?0`Jw1?{XX{OYxxJ@E(h@`m@^+}mq{J%OWLk!ehL36}IJi(nJf?bX=Ltj6sZkz06R zn<-)x)Orh#YLBt|XI0iL?1kSF=||M}cA=&SAmJX_fOvo5I&_a1`5P@P3PXS288YK? zR}-t7B|e;>SaXjcnKWV$tH0knuc%$z--ECBPH~2;RH+9+qOM`k zF{6{6Z|=?In3N*NKU`gX7u?svG*`7*XNuaQ znxU~dcilnc(7B-`<{zQKG`}2t9exQsT8loj!_d1Emna~HEu2+0{gx_t_m<&%e&xZM z0QO7d97CzkpyWfzcPT;GnbwoKFjVe1dj4EzUyE0lqUOm#rdy#&|2k=EI(WRY`R@?h zA5SE$Robj9jV|pRy_-Sdr(kv~9YGF|G=d`1<51%e&PoeL4$(KWotB%Lm}Ld7swPu_q+jTf#aVSduxo2W2hN7bI4>~5-Z;wK7hMw_9l zIA+(^-yiGw)X!&m*jOt{z!=nisne8wZY+$5TI=fSDj~01D~@?b2dvbRr>f$h(N`~$ z#T^T$$T6k)9Vhr9NUP|px;Leaokdn02hIN`An zeAg2D^2io$jHpGcwkJ`+^GN<>mD*oquo*XG!Q;_+1e1yKYYpL!}!u%?avhQ5}EUG`r!_=eJSvx!D ziT+m{=<@uz%I|vT=IvyM9B?1|CwS5Kgl2ftO{}Ox_ z7BApoJRr#e2iALW!DiX*`-SbC|AQW@bu(A$R~2mAKK%Y|3M&E`wy+bLIOM)C^z{)= zw6MIKoD-=1soPs9koR3O8w=SP^SI5!8VL{wE)YsEfaU(KK$R%@EPWnMnuySK)xDFd z4$e6g%{OMf*H2J(3Qz#Jkk z%4&kVh7o{OBSXXKg(!g=%s)NxRGp>`zxB_Z-rzM*U@Gmi$V;`FK6{6(pl9wagp+rh zZSw?>%`Xq~y+^E*GUaCxiy-4tmqz>9pw$f$FaPFUHY*rY9u|lu90&r@S)ks~RA&wt z#2{0f+tl(qcB?wov-p_Wj%H<6NZt0Oj;QS)?}QeH(=Cz>_Ml2%0Gt*oiVHhOMdWpl zf0;{1yq`UKvSN3>^k&yHp{gKanEmI0E$5|0)8Mg34?>JKAgQNqI6KO3*X<{ zDt2hu01A(J=QD<=GKRFe`+TuYaz*)%_x+>E2hj(~&yf|at*vKL;q_|!&yy>y!img` zBR0Y9&P2R9?cV~yTgvOJ|Gx%>!_Qfm;=PSorjnI=AZ(Xyu6=eY$4CX+uyDhttxof7 zWSy;b_duRuw?2;=LIg6X#z!UB-^W9gsF+u^x)vfl*C2&t!R=UvZ2b6dtY_u`;G!6u3ceg+MaqgOEzxnH; z0+eG1J#{)VEtIpD=mjSfSH>;7-^>)`Vso$h{32s41GePaxU16_bKDfZVtqyg>b08m zMeIy*Rg&}&gf#fahJymZk-3EX=v0a>9M;TlQ$o0f8vcrv1ie?i11Tc7Mz=xHZpkWo zt0)UZ2xt95(iOGgvmssk{dE>Fb$^FlmFG_w|>DUhRfJSmR z7XECmrH2|&9uGqfO*dRtHq9RGAsQ3T1|C?!3>t%*D4bCS#m|g0xGF}uAIqhP4yufv zP2)i_K&91)3Tg01($R_YiYFcf`D1MiVX%_1dOvt~(gglViFvtZz2B+{AWqNEK7n@h z^q3%#$R7a@4wFX#d5}<69@%OD(v+CIyfGk^#z68FX5A|5y^Bje(69zqXb<1*T=7^* zV*V%rL;XRv*IsnD^NuK@8VGn0KI-IielNHMs6Bob%b)vk=-S=4J^FSI*A)ov?IQ6P zY~Ozny#4uZJlAi_+1WG%nUqu{X#7Q;Y!{#+;5t&(UAfvaW6B%~#_q%iR##;T&wty6 z1fXI2j;z|#L(|NeJ=>=fo+a}tUb!H*APxodJ{m+qg=$+po^1lTJo>fdxSx~=yxrUaONXlSbba8SzW`7(0-~K6SH9^5OiA4abXRbs0-p`*o zV{nhujT(B;*L2AE#NmU1AZDk6Om4$!{AC~>*D*pj@J8t)lWYH`Wr*zkuF z(&=cuyV*=(&>PnnG&aA@@)6dh#cDm$nyVU8l z+g>F93>}+Y-`tO_$@+g?{T$l$|?GPYp_)Lx*!FDJ@`WH`2NzD;xP&q>rG zsk$s1&_O<5o>h3E$5&q>G>{arTI zrzX|hudpC7cq9a!b#$fXu5MfX19TGb7l-^tFGG{S{^ETFWCo>Ko_{q1;MZcJsfjbK zZI!ic-=;U0OV48jlmy-KN{Zy+%ncr6zq!wK(|u{Cuk4xA#FM6D9?qTd{1w~MsK+6$ zMH1wuTB4bKzgRY?2kx&@<&XXPIaeFS)Y`{)#PZ6ye;zD>AzT@Ygc8NqM@|he3$60{ zh|I@g9Dyz)0)8C3I&j8wPf;75x~cQU#l?Co%Ub!dxY?HksrM9k7ZIU*`L9QhAAiz} z%xucZH#GHeH|6OAt4Hlv$Dk9Rvq@)z|j_E`bT^*lG)|B2W{qA;OG|5a0fyx*CJ!0P?-ajH0x?J{HM~tEl<{fh|c1h@SRaG!=(_ES#; zH`b8bJa5=$Nj1)#w%+PSEGQFcY3QJ>K2S$F6}STaKV!B08h2FxJv^l&)!TH^ucWaD z10gz%n7ATsvlkW?Dje}?Z}x+>mmXVNrz+se42G-ZS8y@1C`NE}YHHEa(sRI4G=_$T z(!a+hCGnQ2vM?BSBEO`>)YsSd%Req7CY+#PQ$oahr5vC5($q%Gb%a+O!}@|mpPRcE z!xhQFC@&J!3SPGQ`b7W;@C z%4D!h>ln6y_An)tvs00J3SSO^Uy#Tpmew@g`u z)Mq+<6`ltHKmnawJ64|is9 zizuDDa6)pRubo2#y6P)7@DY?sS|U3ZE?U$Dh6y`6Q%ts^H$80MsUd?F-?|!BcvH`2 zKj_O|W`@40+N+V#5G)xIFQOLb>pfrWFUZ_prlr9XKLGQ|!xNDikd#}3XuZO}{nbWK zGi1ZygN4WUPdWjY1%hBXmw_+8Mkd{?B02EHul73k!^-j0x$WO~M1fP3=aqLcT5CJ) zyE=G)N9XhOw?X}iAVg-?6K-FmaFeTBH->rUG)wlM!aM~s)PGJisVrfY zjmA~fzhKR~&E*kOV1Jru7LouiQWX10l(4wPTS9=R$PfKIMYanoX*TBr4`dNHFwXqk z*l2^U0PDGawG9jm{PL}~cXaGr+)4tz5c+O+v}(@h?74FycKqP;j%T8Xs|ZRY)}{pT zK>_l#sjFY|a)Yc7C+lFeFP0q!sLj;Wv*{h0DhH309J<1N@*b-J?kA_T^jE5}CJSm< zhcq-ak{~GLoTPhlgH1^y1l1@eF5dS&l!Ft2JH+oNE%;3pSsxAm=5PY?>tg~0s- zL==Gn2kCj@bJ4-T#&-g1Q!Nqyz1+nX#6f|xv8IJKp^XmT<#Qah@oTyc>r*YojDpku z24Y|hWEaE}EP5gKDJ7t0s=VZJ**+=K6v&x>Ff=m?qC^2x3hw?4;0Q)W!nwgp;Ck5^ z8CO7Up9JnrbW&122o^zpaSQaYh8M{NSfhFU!Q1}>ffoST1IB*#*x{I@qy?9p^}uc| zV`E;0=LvvMoGB~O$EdLyYWewSk9ik&@O;S|`a67Ii&DCtHitR8>PEub_@fE%!NH|o zLRg3-3FP2(af{AGC$!*VCpFkqU(eHQRRtNA_$}47Imvq11f};r;W@!mm z+xxObVfJbX=2cYl(35+Lk+7Ub(&wTO$g0gQ8LY3b4N-&IAt{oCK$8b{IAH~pRa%(7wW#Y? zCFU4Wve$kUmV2t8xJ-fhp`iHjAT9dr?#fL#1@_hMZLk`K)Sb*jQJ|2zqw(Z^w1|#X zBC{h_VwO^=hQi=;VmgdEl8AgbTNP1LS4NcgLs@yiu|xo zhafg@QqP}rY1i{hW15beix4wP{24H#FR^|WNCu|vp{xndLgTsZH0J95YNvcZ?2EnO zvMMti$Jm+g7xn%S@$TJ2j9N&~FoCInW5)s3{s!M%vU{7B66FTt^!_?nXr2ioi}|_U z%)XT|r6-e$>s-(G@7M1rXrDO$lnguMK9ZxGEDRkH{yi{of2klZueYjnq$a(R<~KN9 z*nC8^U)nE9`MgjjSjgHbop<%Gq|gGyf!l5VDwzhlG9;ABqxpq^TfaK?!|_ai&Fola zeQ0z*@U-SK^cNl1_2MC!a!%5_50`63pOJc<%1XS$0!LTl@6(uC$m~ z8Dp2|{&OyB+UDgbKS>w2hy zNuWOQTVm+{4hyv%KY@wvr9|`a1#4auNn8_F=$JY7&mrGocITySmL@gG^zU>$q6^{y zq<^b9D+tc6mRwL(pSWt*GE6c->cEFk6CW9imFG-6`3dj&ZR`A2ucVrVMo#N(QuRSW z_2R8mD#r7GB*0cs!+_4B0^>*)jv^vvlYjYRNvEOx9KhoOtMMXrdC1dph+A?OLDB6h zUt{z}idPw}UgX5{(Jy4=p9?#c0PPbu=LJJI;4UurXaKr|L~&o{Jj?yppApD^sWGF% zrF&oA$(Cs2?*!;%UuSPs+&PZZ69_2m!U5FT4OXKDOX6`^S@%UmL>9*Ct0gGRxy-10 z)G`vxz#yYjx*Ea+1k<@WjI$V&Jpfd4`0<82NyaM-3xFwd_T+5vf7b#a3TG^h{%p{5 zr3~BQ1_&4(a}><@E-iiI&<)!j)WS_`8zVauBQxH)Iedk6uFeLBANGAGQ7T94!% z9tVs@c%Hx^@ar?TkX0v_AIN_sDH2bnMOeDk!t^1k1npwm?WG}75w7@zy^ev+`0lh$ zyp+!}|JWQ=S=LEu9PqSkiY)^KA#>e|uvqUs3MBjGZPena!w1F9s~&>EkQb5AIdk=) z`#xeCY;G8S{VInoeFQK~3@pY2x*_n64)-UXvS14I_uHRdYDksfw|k9~{cpZCd%$!+ zbTF^vZ1^R(_4KjB0KYJGdc!k&mL8K7;{Moa>urY5Lg@l8oU&T8z-y0%Kwqv(8GgPh z$DDSvKM%%NL?`Yinc_U&5RmRVDM;>476q^ccGlcv0`Lk0m5N}lsA2RaOp7a&m}vCr z?gSb2oiRU5C6!2v4wCmGJ(QFvyTwcm-H;R?Xz1;{H}W0Q!-sv?s1a)Mwft8ql{f?z zY9Bv*kafI6xnPMkTHR*WUuY(Of*80RoHXGfDm_kDvhpSq=;z6~n6!dJk(}b!ulH?+ zr~MMt=Fvej9@Uxk3kKc`4b@Qk_2)C|BjBTLTPj_wp`|;@st@%<;HE(ja~4gKA;}lP zYCY67Yaq2$k9y)_M{)bhs!?82DO1y3GhEp#``Hmxt#@SB;;AnbMR#15Zn8q^!dS{z zux%HtI>i@&_GZD_<3!-clmxzbZ>d~znq{PVJu)=RoW2-qf-EJpt2BCKZkwgyKJ}7x zleg?!HGPi#<1o2E+)MFd0bO(>*~P`B;%V~{Q!;TFpdyMj%ZvUtaezYKZnfcLS$+BY zPa0E06ha1U%L&X|HLfaOCN~B5vr^c2WsoAExb=Va%l|Kb@q$&Ac+1!@=b=mwnI$!d za>IXa>ES9yA z`(BWY&{HCo4IbJV+s-_$iB8*HmNak1Uq8D<5qb|x` z_3r9Xu$02lH{L7(<^7+kp%nEitZTMXquV zYS4f%T#uvZZ5BMg&O81-_b4~mcX3eiSx~jx*gcVfR^m55Z-u=lUDcaE-&I%Gc2!qS zM{|vS7^q<7rR^OY!m2`fR>Q)MY%LP-TRykU4Jaz#3FWqJr+`IttANEU7SgsP(z2VH``&(U~k-ONoq|zS6E3a*d+Q~;pN2|j>W`U&~PSdTC#dc8_ zWUj=p7&E8?14&sXb9pSt%!q)6Fm{f4a@(=7-{(HS{+35hrq|5%TPIaMepuk4usn2L z?Ag-JoSaN+g|V$(a98$vT&ugDRO{wP#MJGCAIM~#ey@Q$XW&0BoO`JL-iqD(2>X${ zM-C6JMtQjIynlT+1-rI^RMi(qz=~3Af+Po*@P(?f&pFSQZ&*J+gUwv?RaM0I$1Un1-$9aI016R`}YaqU@8sE>4!s>wzB*AIUZQkHt zmLLy5Z(v|h;R^J`FU7@;bL}t@bN9GdYk$7y+S(^T;N{bMyq_=4g3jUE(iFn}4C)Z( z@3Jm^GK5_Uv+1aZc?Yt*aAtRk+HZT@w$Itw>|iDA@Nt=2xBh&&>J+6K zyz73Lojo1wXLHZ0xd8OD`Y);DgV8*nHD?#dYHV`ElOG9uNNsybPA1| zn|qiZFMY!Jqq&TX%$qlFYUXZ#dqXY3(8gpoZcpU3;QmrgWNOYXl7H8%Pd`0%{DAv9 z9dqO9EADlvsAV-~_uqeCP(;!-mWB7!fO<-AbW@K~0iAp0%9Vp44KrM@|KbJPtxKoa zzV&8m{k_9i#ygqD%E}b6MOR1ugn{mzYpsJy&2l|G4Uo0E&5|^%{`dXt++O*{Syqz8z38|SLGb3hY%Mx?gxPkRac7I zIrVVPX7DRBC(T2nsoj#2yM>np+16e=_pj}!2C=b09_p&QKl(_Z%tlk!{+LzBDZ)`l zb+GhE#SAJYNQ7e7z)`hl$d^UfCMujvP*U%6G z5+fY%E~C`_LOnZV+LdQf#~*0S*vv(c$4 z-2a4zI*Vd}*}2v?V7RHEmmWZ&cOO6Ie)jCyUjhOjJf>SGqxIE#tAb=<%%&@eVj~CH z7z_rRRN?)D#iEB0(NWf>rsS_13&<;=I%w z^ww5WNLX%Q7CD}S8vV=bi|@^M5&Cx?x!*V?sPqr$wE#(2n*Y^@DR1`n0+(lmOnH+n z|BvRrJRZvT`}?+62$iLXP*G&7ELpQwDk)18V@Y;GmKa7Qgh(kBQHo^WcSd$uEBiL~ zCCk{&FlL@JpYQkgd;R`-p4apI^?Vg`&%Mnx=f19U&UMcFyf4!m`bNPT6oSzXCZdXk z;O>$zN9_UMIud80woKZs)voTu@nZy1vf3kBetzC?cof-YAMh>2Y|0L~iYRdO=whMl z1G3`W47qjgR_^h$8ndXtpW}a0XOOMN36ilYWp4Xn+ubJuQWnU`Yai&ViJIP<3noZ4 z*!4n@Do9|OJ$%$2N8FYpv=~1wEG#TpYgg1qp`xJt?T;97wN`2MRe424GR6sm!Laa1 zAy946DN)Z`xGh$>IpBEm(du{TM5|NJZ{W21?-M^i6Dt)jwX7Ew@*+GiII6lI$&ov6 zIlcb3JeA<1LCSGJxUpUyZvs$gS)T5|qpXFC} z57Fr%1zzYqR$ZZ%1D8=n_MnDRMOAUrc`{eu$#cN?)EE)tt!uB4^Bb1*SD++5nm+t` z*aiQKR6Mw7TtVAR#9zru0o~~+sRqSt8M`7NOHQ>%7*_>z!)Gn;DaNllh3HQh;dREeW`qCCE$!dSKhJ-)X5Spx}- z%#wK5_IY;pFD=5S@^H_#p3RYqDrA%jc@L*e7K*anCWo`|amw&|)mdCF;x%1)iu(KH z>66jHY=Ou_++UJ1SlZ6C*~w$9-lQ`l1%}a|YpvL=_CJeq#l*7F9lmJ3Z)0UK3S=0( zKisWUJk`}&!(aKsoe%oZKZWb-mlu24et`0GGrz1TPjOu!y1F{l994byBxDK8=1sEL z2WmQ=BG*X*8)b;uYfkyu?<8A0_TW=~{=w>JTN<8TUN!KpsAx0nIud)+#AI)Ne}>t< zbm%+@PBbNGwNyFW^KYuxAKhJDQTCrn*$LTi5WsVpA6vz`N&SBGdKNWx&$*qm@zdmyo}u5r zo!^q__sZ+3ugZV8b63wmd6Bmr1OF(@E(Jur-s1EkT-Fdhrj2GYnnNhNK&3lSiI=DTt&O70H5T5O+Un~K(`o8iF2u;>TSHD;O6@C+gUD6h8DYF zQRFlGv?1QDv#>lS5qo%8Qqgz9-!5SqTRYZir2Lq9O|QQA;@!+O6jz_y9N87S(qVcsC{5Hjf;yNs^#Vwh7PuwlCnK$lf?!+zVzx8al{&e0zMTM=(EMlRb zO5pmvlh;M^s5YvqiXY5}l#(nL7^Ki{f4R^4lb11|v?GlTOVLs_l`ks0he@iw>#4dc z-zlezkME45#^=(BlBK8v#upQtsbBW{3r*ZN06?z=_ZsUJ{OF5&hlhZ#1FKt3ADrHBOEnTTT=>cl6ab)pzzXV^Q|rJmlnM;}#NA;OLf@#hd1!!Y>C5w90OKX0ViF#k6)K z46;=uW-wbWK}6igA(MQ~U!guo_2|pTgvIcH{gC4cW&!cvYU(fP~roDiNuCn`h9yd+S; zIrkLA&ci3e9+=NQf->D#+L4O3-|ab*BB>qK@aL#3obhG1;u{v*SkpPk-|>@cYkkYR zIRI`CCoCD#piLNNe>@Gj3i^nP7lY*s=gO>3&sGV4+rZfRv7B9C$!9p{uOFmptcFV5 z_OP)vej2>ld0vpCJD|NPYxCgjhnJxji<9keEn7eoHat%p8ykbOyx;q5b2fs1)3lQ+ zu0C%S@1OMd_;Edzr!Kk|&90V=)r*WS3{Jo0TJ+nTOm`)Ql_!^)?9l&B9yyN5oGxc( zW9z*hOjYP)i6~>k!&TctdS!6qfqf8w@MGDf&w~nBUb*%uI@Q3n-M8DjY13G9R4avs zj?u0$!v{LF3vld3LZd?KKzf2zX;M%M4C3oP^W7Yk-KPs*tbhm9QTbQV7)m?6Hq&(_5hy<2;a8vzq z@c9XD+v=oV%x>@0^j0WZl5=$1^0>Wizg#sD6E*xNz;)WY7)AMG2P1&HYKdO$>dxV0 zJl)#E3T@0D&8ijiS9(6H&BiJ;sBEI|_Q80+a)ao`46JhuK8~`z^?bx`P2j<%@{H;X z_R8rQ%8K=g+uzE~&I$3`dWwD0BWepJ=K-vF`rRvZ%-it*WJgyw7d6fMa@fr8r%s)4 zavn*&{LuaRvrOYWVcK=ppB5-B58Ft$;x*ytp?}F~RR%rkX0IgIC+h3hL(DheTM69^ zV-SUJ#&N2iHU{P~p)po8SE$FYql&%0i{6&n!3P*o**gu~U27k#vF zT+?Q6lFso7coEX>IM?l8ey3^hm+-4!98&9LZTPICHpx2DQ%k5*hyCnvjoG0=(U)&L zTJRsH_8KUyCDUmxeraG3a%}gMY8fl`be6xiBEqJqvK8wbi$G4Z`F{lU`}~T0429#^py=c zM#QK@GvxHVef7N=vAA7T07AJ1d1Hc4&|z2B7uqm1kF&gJz?>(HgHidMgj9Wl;uNl) z&o&sPnh3cI7jE3RVR315GgIZth2!)qcV z9~HTc(m7@0t_^Y@KKwj2Rdi^JyyG+V!(`mp)epmA1@axAgWS{z+K}OSD}A5=UDV)f zWB&LPM*SC}RsAnql``uR(6%9K%8{udJFg4~aU9B{P?TDkPB)p+;W7g<;+yc!IemVrDt?g2}WX}yB?{k&HDZ0-TBo+i0!Xat`s{{ zp;qaMXz#;Xc2P%2b4m5;kk_&JE?I9ThoePG=BMvieD}^$dE1>(-BEL48BRzVWSVDq zFL_pl-%=Z`c^o;WB6L6?O3KmstPo1lyGMM*wRz&dRU=Vo-PZDG378xG+#_4#9)+i9 zF??^IV08IIz?EQ8aCyDgOqWY3sGMxih}f>gp7%b99CKU}ck;(@BcoZE506hU^Z&m7 zvRAiC#Q)9CQk>-T@Et2zWFl#JM|D1z`XC%^$qnCLZuI>@x?W)aqV={<_xh7Q`mY>{ z;G;Za<__CDrCML^F(b6GyQMrL0)JPQhDz-cSO0_??Wv5$evKQ~$TQ9K@m{(sPFzyV zp7CyUC>*ca!s+}NDwUTyMgwV_;OYDK?!5zKTAeYSc9O-?-Bv#gQ-*BE?%1`22GnLQ zsd)t(&?ta_d~*`A=nx2&lq|e1&ippt&i!4v_X}s|MB|m5>)z#dno8|O#WV;Q@Z}iS z<1p4gDmq4*8PWO1Mg6`x#Abo9KegF{rpqgL)FX!ad^LEBvWu;8@}E}Y(*U=NC1w|I zLw)?n%StOcP^CAFjYC31_kgtI65daW*TAj^sa;_oQp{4*J;>4grlmJ$Q72ILWW4MY zZS~f4%Z`s2?zKj;5#Q;;Bfdik59PRAtFXMZHRts7@B8{*pdw_*l+k>luI}zrycFH3 zmYq}{j4*V_rG{~X;ZwB@sM8W&3AahX#JdFp_w)O6yx&E62?*c)yJF+#B+Co?d3qT2 z-eY75CCVJ^@;A|S3S36c;w)zV69m8Z3XTSh@tnoNX=h|KJeW}cra5E7lDtx9nSHie zn2WvNY}48yQaoq<2z^ul;Fp1GRJ-vons@qI%RgJ57XQ(v1XtyPaQI^(hR(so#fbEk zd8Rk}V~mX6B8ZM7?@0gVrq+((l-#*<7Ep9<-qCvpV2^K4JaTv)J-I>~xDX4eSrA_& zg+XqdaL_F3Dv?O^A7&IP3xYdJ`)xWQY9=O!0cU^rdI`YMg~Y{K_U_$_1S%&|hSRk| zTVwkJ=bKRpfi}EeOGEazIr5IpTXGzcWoKn&?G*4ZF?pXyYtf%)qnkt;6C%=h}GOVz;CBv}^4L6o_Z^%{BRUBzF9_^EsnXnL``nbcgl&197cHRv$a>!K;H=or0-Xwe5r}#ZLSpCHqEY90e#0xICf4?$qlFeeP zM{9iKas0%264^zxk*lcGA}^G-jPIX1*hJBk7V zKDs?f{QxGZ=@R8=|CL`qJU*7Gxd~Syf#dwas30(7aFmI{LQ8&{94A{d=H^gmxpW+^dTtAoty zjYID{Ic&1EbZ1**WXSLWPj*Jh7o6AA@Eax%7ET|HFcH=p)A^$E;8AghEr$m1Su z=XpH2G{=~mMt(ZKytSWkcApHLyH>-lhh?@z1FBf!z-o!@{Yr;{%<|nY_RpmnBXkmC zcOFk*ek^5%2mM{aSdgDuwf4oab8!Vjq&ZekOXT?RW6H{AS3jJ)JV>b~F+Jl*d@@q% zArh#Y9oU|r%sV$XSJT8vg`kH=KDyXbtKKd0lKY$|rFJC^;0DmLadZ}ea^}#4IWUNu?-1OMf>XQ5MKxVB^>mW4E5C-bAm(RH#A73yu zzbiFaeL=9D+fVgsL^V^00}b-x%#4)n_zk|ogo`)3)L5iNac1y}RO`Yi*y z9nXJZ0VZ~=^k(m#m{84J@s~cXZ~%JLaV=I&I6pS2Z;!5kM^?%HJ?pjoJzhw4%8U7{ z!_IQ2F@2q)U=>H59LwLT9_wTSJ(Bvp(A+B^N+LE6IcLcI<@0BnlLw`w6%52KT$RTR zPNHcY(j;ERv7U!r<@DC+swX^H&!3$)w4{BIlCsBh<6D7sm4ZUovXh^ubjG)jdKZ@P zk6uwtu0^)Qrmt)xg|>TwD&G2nIn@UW{d3`uKPq}#0a!r(!D!%S_qjhQ6ojo6(<#P~ zTSa(TU!P`}el^`FQ-&sxH2i0`A{zgEfo@m2QKat3hf_eK5ne**3vZZ6&#sa=j(6b2 zRQFSu_Vbm@dc$B0=DRI|jB09#?YrVc9ghuMGjCEG-g;2CpB&)5ey*Tw2p30O%~j5n z|2clE=+_`|Nm~bXo8fI~a&qz|QOw}-ik>Lu4&dI)?qN2~j%w?$ofG$%vu@FHB8k>D zM5zPfosoXKbRm}EQ$>_G*NY}>%*f=H9m7N0ISVIB9*d>rXRx5!3#T`Py(a7TMe2F~w!3hWEj!mVodtVDD?{MN^1ZKGTC@ zOnJ3=dyh6z2KxC;f^_L>Or`xEyOko#14}pKol`ygy^^Xpai5wyb(amN8q0>giwck0 z-pNEVdhe=WLldZTyqNJ`De4sUKWq;A|2l!L@*hUP9XPwV2_;#M$U zMAQ~SZxaXv1VN+G?21BMh?Jx?zc^R8;9?G(VMH>BFYKaza>=CLqY21Bn&`f;B>LK( zIUgDx4&HM1U$*K(c`V;uno1U3fjbh=)yJG16%mU+4W224W;Qi9 zOBWnn5+MM|?C_-h;Km1-2rqakQrAr&v$nRp6H#ybynSsPs;RL{s2lS;BYz05-Q3Lw z!^|jakmCJ1ew@7Q@S)MU*D=6*(azqvF)F|pJ67sDh#P$TNli7mQ3cop&;>;Nr7Ks| zA%loe6C6-vSpU84<2$8CGEh=)k$bxi(2A90^t&7np6O8)KJ&Yw?d{jkP?pEluQt7p z(Bb!|FV7tu%;i4(Mt+}uoR!DJX$@Mi1EaN^lWs@j;GC)3H zi{SbuJ}BW1r6N^AHIfiChjbnKM@H-QAH|hus{PA3v__LxsR^yxwc$+jO4F9xkm;Qb zU+In70-3QYb6{U@M*5(C%aT0n@GjK;lnegn&6kD(;-P&89F#lAuTav z7bj=0N!t9rmfN?!elvId`?V|Xa>|tkSIbUuo!}HPtg}xKi<5KJ&Y9rzGW8acIel|b zfN)9l33q($G-Au}HZE?yJK!Zz(Q6^lI*#tvND18z7wOuds-UgR<{1L-ekOXmEx9D5 zXJ@n#Z?ziJoT_;OA~L?a@|EV&c8-p<3i=T8(|Z@G%#b)%y3xT)b|Aq^IJ~v5pHa|% z4mlc)v#}~gcR@SXq_ky+0dgZ809y`PBUF<|oufg`33r?<_O#W6PU)eLUX7}9;K};~ z`SW^@`9$t{Ij4jE=gHKUj!cYs#@*7JJj8KpYA~Q{=oVo<)OO{|ma$JoN7M-FF*eeN z>)Uj~>UMG`bw=BWEx&>Gu_`oO>E-AcU%?lhDnH~1@4o!xB+L)luGo)%dx_VPxdJTm zRGNTEk?DzSkHq?qZ^SGMA1$%DuAU?3MNM_^+LNXx()lsStP6=-;%=Xf0l-MNf-YU< z4_EMR|6ODOAymNvaeURp$ykk)kqJDPqIQF9++*H|5%i!!;- zNZ4ph`4)Rbg&db)ewvoFt$`C*a$Y?dUN00D9>%e?U>EOOaj-3YyZlfhlH>XVCpGm# z@rI$vvs+Q#LTAoj^O?U{(kdx&x*;gOnVU0ln*{rl((?AzYt;vvhq(d(@}9x*NF{@( zHU7_XOq}6=<fcXZkeB{rxuo0E3*;6wVR7B{DTW^gG16rqw?%K!HkMtXf zArsew{Xb@l81rVQtWd!YpSA4V0K8!#WnOMq*mggE3^D(+WF4fdT;&wicE8r5;{I)3 zB^!Ri()mMjhrNdq_Uz$1rSjwlu9ERik}Own)%eW6=Cf2ez@k$wSh5I05_m>T7#M9M z=}whWTnhYk(qe2Q4=Xa_3Iu9y&?i+^9^JG2Ym*@!<*8Ir!v5uLBrQUylwn+6A>62J zcXf4bl#`!q-5LdTz_P(iZ+?V9RaG^6+S_*7SAbCYko?Z?z5UOQjxCpTstF5~7%Rj4 zQK4EfGqeB5i0c2XHADODsHP;RJa0<9wCJ^#MkdHlIlneG^?cr{ATSbQHs!}rvB?LT z`YJ?Xk{%gisK%r{WXrO@`UGT~mXeql5c+IoCd5<)xeDfG;WW|MPT$C}KvCD>0Eb3C1ZfB+I06~)Gwz4arW4X>e=wU;Yg zi|381SitFaQwM4Xzq|Ua!i@BH0Q%3sHe0N)YR0(Uhh4eY{UCe3 zvMf=oF~ck&X2oanm(GI@TU9l9x}m-@Twf08Y)pTaXaTYox1O6%p=SJ{mlrK^K~XU} zCMJk2fFuDdd@R)^uhnYWE#Iw;`O8<7be^EvNu*jhO2tZZK}-8Yr21HudS8YtSnrUa zkF`=NHWja&sujq46+*L6kAm$2Nt^A0>8D1dk z>orh2)X-W#+qM&F$BInnFGr63K=Dwih?;O^H|cwKHP+nX%}%A+9%|+YSnSs4d+~mQ zU!FAIQwP$3&hBm-pPuAt%oK&3J+_81Mk}chn)PxfI|XA&CqnkqApHKCZ6rOu^ZU|+ zS$@2>Z69@2B};qNHwxQSlo4GEO`#0!MKNi2W%B*mCh|BldiizY`rlk%&%GlKg;s+_ z&fp-`mi)9NSm4Te3cE@~juDv(AFbWj%nGl&K7V~y^5PN+HM7`86GwxPt&PaD8spmN@0r-FU*%l%2NTXpJ4>{FA>)} zfhlaI@Y;~tlKtud{d6oy4T${UDgNr|nRZVE8%fyNp+kUnh52=Jkg(3?zMZD;#!8I- zAMuxUbePJ@$~u4l9{+tEkvjcHS;xWN{&8ZWz=aDJSX#O|FpbrZbC!mlr#3OKQF`eZ zkNJ(N(L2cokX=3GbEY;2qj&4M2gtD^*EKh}QO8Enf@xOd4&qv(w9V?hPkF90lsglR z)-5jueHH{L)o;y}dTg=-O~tt^^9KsvWDB!(ACozK09ZIGL-8i&Zu-*W2}fU0Ee`aC z*w<{MXuX~oxg|A28_w&>BhL#A@MoUg5$B>>u|wRPU%)KEc%7Q0LqM;v%BHg#zA;Qq z%TS-I@zs#52h6e{_#^X_Q?5faaos7CtBHKn?Z@z`pB|t-=dHx<;#J7oWI1<|$mG=q z_@LQMJicq<}6>{1%#!cU?cnyPlg0)}6rse%yUfDWFQ6M)&s3HZ$#a~KG z4?}paGL`UpU|`?@V2#en$$hD;+%5a*-8(Q4_F6wQkD@VCtWU54%_Q7?kr!>lkA4FxEkPEX6J$l57eU9vl4B5j!{|>HlY0k6bF?k&2}g>v1;TeqL)E+i~!PGtC15wl~hlV9xvZ zMT;p-rNRg|T=h~~xWUG+A%bU?S>p?zIKJA$#EpL~u_dhb$LfBKwc)cien$prW2Uaa z4F;skx0s;Szq&ITIltW9n9pj887y|*PL{Gd;WC(lD$A&f zymgeyz})fytOGeBZy;XD3Zr0)4a z5i~C^F9X7ISmyXT%wo5EDO;XZ=1{Ldy+dzb-yURnW1}8!{dcXl%izQW#pL2+d;>RX zVPW<`!?WPvBrqS2U^;?dV0TFQ^$lLKz+Uy_&u`6phHqAh*%wff-~jMtrTs7^lcgF-q2bn+Zx>xwRs9WxT7e z=j9KC-Nwp93`AwA5+~H_xzHdF3*^QY^&(3bIzXUoBMSSf0tAsj%DOwpEEH$_x*WU9 zROMW^cuM0Keqxcd1epkb!L<(5sZ;8SW-5AhY^+|*=Y1KvoMgj+>BM4r^vCkn789bW zqw^&rg9RYLNT+3?DHx<+0H3^TyWh9ymA&z_--!#9qw-Hx3?_TJ+|k7)xcS~+$O4L< zI`z2UsiAUiu8Fd6b}0Up)ht0k{PcmXly4JF(ZV@{i1aKC zcn&JZGB#G=8LX=+CM6|};_*>{$5q;%{o(_pWtBZ_QBVyE&BE)Gi93Ghab^!5NCmN* zLD?zXEqK_a(NEE9bp87+!i*pO{6i9DeZ)_QlHVZ()O65dpdqdvdvHv?uY~*4cYFJB zBv7!-IU4!ULD6(_(pe-fwjnoZeDZl#WAHVjXyno*-Lr3|W|$HArPhTsK$r+52@byegqBDWjAN9^0Z$l}>tuf!jv@;GkWz(TB~hkcYRKcnbi z%t;kz`h_#?gEJQ%FO%DGwL5fJioKH#MqtL-gI!AK(52f0`Hwok&_0~(v>?qSVr!Z{ z{}9b|?g{w2h23qIj@=#UG9%wpD|fzErMR1mAy4U_$*<@s5mM8`2?XXNvAdQ*Kb|sK z!*iAxg!SMMd1DmBacF62+1c5V{C*Y$o{@Q*cduF1WEj+`lK@!F|{W zvsBXoB1<|{@&FseuOdr1aUAp+^n3jq(aAK;jFC$T=Pj8p|YR8sm7wBeJbABX8QiMdC)ly)^J z4nBvvb;g6tz&aS7v((HPJPH0~^t*SVb#gAr0#29NuDl}4lHYNgk>(}{eNpIm` zJn<|HE}%T4L4fHOMix)iOviG|u$>R@^+c6LY0CQCpI}>EXeSTA-l5Ix@w>c)DHlx( zi%)r^>S{IW_Jd8=y8~8V+v4QnK&pU+4-(V}{saw1fLY}+bvre658!J0Djwy3#w!;0 zJMlN-?&lvqJg<(Mfvj>PjMq0&6!B%h?6`u3qAAn4k(y?&U#1DYK}ql;z(RS2t&5h!@kBtXO_x>HJdc285z;DsZ`j z34B2-sBc5!V;x@nWriF)9|j+xY77vyEO(gJXJ8gtslUKa{<*M_6X^su8yJS0{I$(! z3n9o2)w%Cf{L32ArF!)z`e1?K#RK;sgbK3D^;$Hw!PDF=_sXR9CD;i-m(P-+5i$@m zhUH2Q0fnK2>kkMV*K~f?kcOSLd1tu7Vf`B|Kt46D#O}zG8%jYYy)SzXa6}txvGUW; zfB*Atx%S+`4o(k|mt?w5u>4SjVu&JUwq41ivBU3%!?ZD!L->Z78SAb?%&!b1F{nwP zK67{`ipUn+PfyP?zz8d}?FBqG5B%?S5EL0GNH$djj`` zw!rDu2SNcyPO-de;{3y5%1&Z~*ZP(l*=0Yib`b4e-AX^1>r`|6kz!uIOs>XbjtrhS zYva;CcHX?h)41r=HNrVsM-}rg&WgQrPOrZe`PK$KIcJ&4#8{~4y2C&Ww(!L%a<=$bqUb=37S4M>t zd8};ZforEM$;3b%=!mvp*+l*K7zW^O_ z<=fWCK?)jQ85~JT9P!hmD&mtTwdbRHdW;})!25Pig`A+WY_(2+67oA@>k{Y50GZ^& zNR}rwVs#koY=j^D^;4NV5q|R#HYh=9*(PT`AX{}toUr~ZN56EbY(9M3gFB!YRk0Ix zd;albGV%~Jv0*DgieY$3CTq`>pOq1Kz>8sPbTR<$yX_=%V-`O@lHRzKx>T!8+ypv| z&dZEuQat$jc+MEr)O*haw5GW~UfQV{+t9}z6BXS9bx{M(5Tq?AkT<3?y>rJ>Hg4>J ze8CP>|2@R2*r*0Dp?|5eh7f=uWC!@a4w@?E81x^4sYDf5_~?u0_CPu&`a$ylC)$ z0Pn8LK=hCrU34qmq0Vz>pNIio77V$zwss$b;xsoHN5yQ zv;AOs^kS|}3ztSduv$FObCbR@)20Ew1L#1+PWAQc*V67gUg&!ky!U=Ft5pEcCzW&# zmMXX-Zd$Mh?08dK8z*FzjAR()1_%csMZC4{z;F(Z2Ze+PA3shHYdF2crXM(P;0gHn zV2karwzjrnCVL(2>;i{fbf6K)F$szNV0{606+8_wCpTyW)#S#-g{P#PMAUBGItVLT zP_?mNSonrknkB$Fs;nDhqA322ksHm_5B>FK-jHUXt1Aeqct3srzW3i|kb{S3cCpA) zOiGF!s3hwlP;2&Y%UYzZodjkS)&ah#rNw|y%`0^qGLdkkW|s3(TpMHga3t7DL=7Al zuRV=dwW9IXP{7#-`fgkvt;uKFHFn zTCQOZF1(nf_O?AP1RzI(K+)O)#HWX#65P%FiGb=zPSs0%aVyw47Z-_t$L!Td7(Y$Q z5MIcW!Hb<#uJmQIgEo$jk5lbG;9;S-+X~pPt-8|;uj~sfgw>a|V!Iu>2a>4vkQxw< zh+q+9t_BKIu$En&ccGW$ImyOA3%~$_y`e>5=talIhIDlqL=06OfQr=>5uqgBj(^7?)SJ)!I}Y(37R0o8#ANO>cc!-e@u2MPO^6@_Iz3fE zxg=uOuhn+^SZd_^i?0sz9Q1oLn6A6LT8RO_is}J+dY)fT*VoQB&4h|sZFl!PBQ(!0 zzb44p+sZl@Y--d_vGZUsys<1EWOZgjj-NPTAN!e(jt;)nJ)e|>9Rl4A6*3YNsS06~ z5|_xWdI(tDYYlblPmmU7+^*>qh3LleU8DF$(oEj?gPe-mPW0B*{)C32Ky%f0&aK-v zHq^9b*1Dxcc(+4+k@H{y8|`-s*|@^-ywubto5UUGFBJ!QnL|RV-V%4LtZ5h+a?GjM z2no~FGtBlhU8*xQI^BYvO9sgEVr9y9_Xvo8A7aWunnzIv=CjrP%4#y)Pnag|E!k|| zh+#sY_tPRkpsP~X*hq%}#?Ivfkk%oAtE=u6J4@yNc$?Y9=}AfIv-!ho8_rTfsE%7F zEn40D#_h!sTMW;8Isfg43&Z8y(195cC=`o>Vq1E|d1odOv%k9B|8qz0pBY{4$?|!L zKeKm7)lo>oPHocyQ5Scvjp+sfmnE>SyzKntvsmJ9X30vM(d!<`SvXr z!VX?Za_@jA91jC>7E9vll<5c^8<6e1Q}&Y`c{Fo0lNGsPZobrw_D+!L5Gem#8kjE$ ztA)daX)af_;tW{OA>a8-BoJDSAi*q$pFlX+Ve7EWy*-F6hcC{5iw3!#pmeH2pM7p^ zLura`*|$n$TggA=SLyJ^Gg!sI8PY2!aoB!?v~m_@VnAUcMt<3O;)HAZ!_mP8v9bkR zI&DF2F30_RlXA1$xA!3OHp|8w%@G3wreMfwIy%^p(V3Z$2JHz(!T(_+A0=IMbQJq% zsvY8$`03NJ>>2!Uxv`?TU{Fi$yen+?{!5HN?8(ihyv`0Kn&48(yV1fkK>`5*i{9Pn z6}oWY2yzV1&CkD7C~{)U$$p_PHw7vcO#Otqiho>^IeX#4Kr*0<+a@+O6HnyZBvQ%3 zUoOPClwICYhKkDE+*~9O)-2N9F~gcIt=$h$3tW?lRk8k+q(${x%m$9(@ensiklFCJ zI>wdUkUctIzIo8)M+AJkUb~g>BU$%EXtG%C9 z8(vQOm1L%|ZWrBsZthRD+p|{y<+b5?Ff=u48TUklI;sE9EP?sIP1ycdwz;ZuSAZIX zJ6FUoI!$0^lLnP~GP@v+*YWNBurmIS}rPL-F7NFZ0E0`;h`l3&(s?3914$Hu+s56SO^L_et_ zJOK;9oWvo3UVd!f9IA~L|Ew&^_Qs`SPiVKTYxC3V z1ApZHbWf&vYMndQ-%V}vP-E?-yggmKs$LmJF^4m$?K_3yvP^5bY6!I&z{DE#jeM-o z95aP`Lt$OlI!R4Gn+5)S(*ZgkK|r(lC0`uwhj!4~I=qw@Z=E2646ENCarW#?B`rUu zX}7xdjT}KYMn}iewx!9R-~W&?og0@e?!7U-^9sf2ToH`Kl%o1d6MEW>C>rOPmG&}~OU*h9}6{IM? z)Aazffp5Px9Y{l$Gj6=bqPjPO(5)nGQH?z870|w|{!lf|@{gFwX|hVyvN*|EdgXi%TMYjl|dIQ9)z7K?EX zrEmyvVR^rDH6I@RyWyvnT%ngP?QSP^#WBvZ>(328oo|~}x_UclPS*yUck#Wt0eWW# z6)(KGhe}h8U_W#y2(;~DQNNS6u5NgXb4cyyVG&W$CQzVSQT@FnW;gh<=~5Sv989dP zGzye22%L9_`G=^vyv+@Fa_}#x#XJIiAeJ;GDY1A?hI?6wD{oI`cDCHPxX>&~iYj40 XP1i^6()&PVgk09Tu9>B7@#KF2twFBz diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index daddbeddbc686e9faf0b9ea8174465096c1d6907..2296b9a7fd8b974bef725b195a075d2933bc61f1 100644 GIT binary patch literal 24598 zcmcG$1z1%7_b$4J?vM@%5s;9Sjv)k;E|HK}-#A#{nF#ZI zRRBO+_tVw)cxvr#>Gs;i%GP@!3x=+!*L6 z4Br~fg);QH-7g;P+$8P7ph4)#JA_dP`uz@bP{8eMwutN2jrEW2$+%JZ+Uwk{v zTy^24XbrW>tdY|@ebeTNob0d7e)&~+jOcMZZ_~&NN`1O(D>~w3x*)iu6vM^$FmNPk zM&OGHENFT0D1lFtyX46Zu}aoKT{j7Vi4#twZwSwg)z%e26lJpMmfNN@w4SOzy!7^W zCrh+a-QdZM+O=k153Qdq?z}8hRs#7;O@Ugk>H(Z~K5fYcq3XVyaKph51s=t_Ouu`m ze`;GeaI9j;MhS`G*huHorCRwXFYnmqJh)8{CSRnG%#ikUl@^By3C0#GSvPt{>d!x-qwSUe-Yiot9K{z2B{mr0U z)L!|@nTJ@1=)U9S11*D}GzEKNxZ-)_-?|#VPR>~iZeLg=?p`>)>8txl|9tmMvdVQv z?4wQ=t2tbf8E#@`{2hZiy1sVqUG3*0T&5WhMn|+~b=(XRD&yyGx!3U?Jg+94`tXH` z4&Tq>+vgvu?MFtbJ)GOke~1LLbHVHDc7s*2Y8T&H>`Ho2^C2{IpeF|Lkh<<_{rSfS zl-{xKz6b5*49{S5*fEb?Qi2+UpjnvLpE1{d&0xHDcolly>SW-9US}-Ms!1)pz&bxF6r1i=&7Oq8VT`w7mlWzyv&hDy!?0xz`%_O4k~RLeU;Y z(kWmzl0x!u3%MUoy{S(u*s}Rl;3b&0kUK}%U=zf-Jyrk3txV`*yl_F2#_X(b;Z4bm z^0s9Gj*!bW~gN& zaB)h=ot%}Gl?f-52`dL^Bo1N1S$!2jkjjK3$M!P>HsR_{2+))-`Bk{zq5srlXrvA5^YcXpEF5r|Aq0!04mAN^dGL}icI zJ^8rXKiIg4vSlz?JVZhfUrrC9jUWD=UCf3sHayNM=Eaz8M&o14#RqbQxN@PLe7vO3 zVhAYD%LHaBQQ<$>O7%+8lndluzNA7!+rw??wvcsq7rb}x9tkNa^PatMhL({LS26D9 z`g)Z@ETvf2`QZ|A#$aSz96{0K8|Ly+yQ6L@(`Rowt~3g3)>F{$8^enZc2i=KWQW2pcr5|1vbT0aujs+o z`vC(316K16^78U|K+{(`zX*>;$`&E7XXJ-6=Tp8{_TzGZPaQN1KY z(%RJ;0y0)sRu#t|dj9k!xgIUczH;rRxICY8jtIJIS7>isXx(qL7XhL_YAM4NBQIzf zUqACjUWnt=-;J@!m%!FvR%B_s^Xa^skyeqzoB^<%pWx8q;^G2(S-brKV#)>gl9Q9A zcQ-dTYrrJ{cv6c7Cc-VD;zT7jn zBnogF{=iXCP@tCZDjmL__qn0N-eYUo_g`*#C*9u+hhEMbhc<#U;DhSu>@=^^5C5m9 z9lh9)$`pDB$NPLWi)$=|9K$FR!f6NeC$I+R6LRk!yZxo0gUT5PIlYy*Zw-QayKv&% z*470}wz(yO`m!=d__dIl7nx@i_%~QKL#5=(Tb*y}5SPF(UvL;5_V1rt8!5q7!)>vi z5XOtvlMsixSy)=;O*I!TGcz+2h2?4w%Y6uQZ$%ADwq!YASkLxA-(h=_H zoNu!*5TLC z({Rkr`9Hqk9emUkP-}R&h7T=HvKxuVBlq%)C7o802i(*`J#6*XF(1M!DxfrcE2J5N z8^EhHPfZ$m4gBH2!Ud8|U922;pw+xS^m`ncS~K&cP{$vJ{BKtfjeWBj@oTS9Fg&F&ZH2sznWuH+cof>;=ybl8#k^#+6LxX zm*26ne$2t1spobXC8pbLOF!@MZ)Tl>ttCjjIt>dAoj=$mmj902eL#g689lImz&N{7 zf3b4+5}u~52hoEm8T_W#Dn>+YHwO|}fMMBhW+#C(zL7SfSb~N>8VSyq753ylJ7pFT z?)1PI>LG$Is7MQCpNLB=47On=zcS--eG3Y>qzIvffBi&mz7+Y_ZSR?et#-Q0`D6T4 z&W@mx6Rm}cwyIkE-!;am!a?LVJ!jM_uwBFBpZ950mC4$`hE9Lt(1BBj$(aXFfBsDQ zqqde=Qj-4p^XDCHFJ8QOFV0m8HvjXJ_Mq+jEo7Iy6w@32#KXW${%+;fqempjCn+aj`{<%ca_(x-V zZER0)SjIt~4iSNgv_iEtQ zOXEvHF>f7FG&uQM^hrwK;Ly*)qonwXlBub5gJQ{h#xwf)xLw!XejEm+u#K}Sm) zFcf-nax(J>bEG|_*3v7lsfx^fwRa^?$KCkcc(jSEyOP0xSh(G0kJ$&eyV_QT-M8|o`Ff?(C zMd|333!gxFE9INoS##7lF0N0fO(!EZ=awRrg++d3)b7d8X(a0CYTB2iSB!W7NdV1s z==3Ek5Ub5PGxgsW(tY_dKQ9jg+If#r81i~o%fR5>)|MS?%l--Nyk=IE&@6d90*aK8 z3=;5W3TlZ;vIMR*Utz~VekaUDjN&biyc5Pw!k)MNIc4m9A8FfD46%y$Za~ z$moCY;KALmuY4=uCd7IK0jSg%)<;m+em9dQGSgKM+n@5YA+U0->c4 zhS?3Ad7CK3Cfu8hjwusMnkiFa;PTIccRM*=WjF>o;s{;9si|*$kQjh*8^=J~j3ypT=|{7{2IHfQSArpE6}XB_QTz=kr_yv}we8%~BKT$7@Z!`V`F zgM)*7)CAHQmAyz?-viXjDbkWUHW}K5a;@`m`TSA9vKP;F zx9gpht8LJQ#028NI~w!-3*GQ4%iafby=yKdYs}dnK0vIdzlD)gP%sYp!)5Bl zLASe#{t~my4tS#f zJCy#WV$^Q-=`PPcbl9I1sGRFej@Gp%*))7(di?faQ#JS|CnW{jHVMn`ns?~E6#pOW zl_Bdl36Cx3t-3vpH8${1_j=W)r)c?Hoj#_dOxd3c*bGo7T9d>pu4!U@uwZiG>+9w%83@&4}s$l)~<+`}CS->zC(2TxjUX)3QCFFz1rQzHqivKgdJj5IJdE(3v| zH`OvsAbP$?ms2&B4-y|AUsO?{WMo8_o}QjNwR``3R|B=Hb~e2%8$~dUPcSUG^Pb`< z6w%UQtja0nct1C=Up^zMK@ge)SPZA^MB|`6Q&qKUO;*Z0E+BY_T~$@}h>HsyC5M}M z;@E1E*wxh)bOEb}$a2ay&Icn5`y$1lk?UYKw@w!Gx~QxKme)6RW? z(&y`6TtrZ-&>cp&9kz-tT;4Z1yoGm9;D%DSfh%UE9)>7e&2Vm$H87x2Wh1Mut|kZf zo}H5umL-AxRQZcjA)_z>Gt$NMug$9UP}JIj7AXe5HZwXKPUw4FPFWHR*`F9Re0Rv? zJp=>@|Nnd-XwGmef7SRA6C0c5;UgTt%+XQ7*!VsOKA96vKtLaPdmGSqAje!UEla`@ zWo`?{ys$eq?US0r<^s;}KRB%o9~wokB`32eGXfKDJYmjZUq|hJ-r`zBuO>r+FBZHB zfFFis@?dnt%+B6>=zKc!*&}i(28}Ye4l=Tt5#rJth~lF0A(!}ITujS<9b$VzNJxlj zS+4e`HvPF{M{LY@<8X4>Jg19=Dkkl}C#zLE3Ov{Oatr;pVs24?u5%u{?FYZ_2t-vZ zG6$j0KGz7NH5RQddBBPGmzW9=nxZ=ye}ci<{zZ3DYasZ49)JkBx$>JzZ%(_)qx zu7pNg$-f*IhFp8Rb}Xl&kpa~z*4^6Kk&_8&4R@~6ADN$z3lGP5`t&KzP1>N%#P8qA z-&>1{(lL7;&WI?^4DXj0D&`KxghX>tlX>S=I{Oc5aW7h0X{R4qPR33*e3hw^bci?J z`hmu*gGS=DLT$b@t~7W2)s;VKEF5a2J7|Hnk2nlPm^&KB+l5iAKy=fvJ0f_*xc_zVshvbzZEV^nww55{^02E4BWKuT%Qqj>)BX_j#Rh)9 z3hDKU^i;P1cUz`K?I7$EL;pD~ONr0e2k7tDE(or`(d-@6K!;z1bQkY$9|*?=4^RQZ zby@8_MNaOXV@uS2SakBk4P6CHU`Xj&1FnP!^>6YH4%{B%S(O?xGJuEpeQrv8aB)gW zO@#a$9=64y$Mo@bipa>C5oKGr!KjzsC*!92kq$H;q~n;J|12N7=c%swWEOn zxzaQ{6BFQnzSoXK-0<5D(Jx^vY$eiSdUyc#hl~+BJL&^h3!;*zKQfR@)nx5!w@Ihv zrYZd!CTTH&OP`nx#1x_-A>g4PX+i0(W4oF|S zPv=_wWc2Xg4Q4&>LUNH_=IqO?lJ|-NT^c}kQ{Qo?S;MxijZHOOIgA0&{5I9;AdC*Y zdGqG|`}ZL<#l>=TX2X75TwHm&oPlHOe?VO5YLh=|_uhMv@R_f7yh;x`a2za=kYE}t zXQtb-bP9tp6BF8N&+qU`F(gLjh?CGVZiyh4))zv&b>=Tn&d0s3U)I=FiB3&XCrB@J z>4d*Wx8E3)qW0M_5^8t7J*lfYl@J{ra^^;$>ju0I7x(o{^GD4#hqCk=T=Iy&CtMF9 zVCF##zi*)z6{zDepIeVo^y8|r7UV&yzcuG6yT%!fhMs!+wP$0g2-$%rt)aR)kx`8e z;raetRN&3|%BC;xDmS_X8%FNAD!UEE>0ZXm9Jig(20U;@+IvUNW1h_N1O&bW5BDU7 zgT8ds29lascxyr#_^b@w=Wo?z1Bs<%axH^}Q|7EU*T^FW=*X^x~DibMQ*nxlUM8FT4E z_OHY%ATC&C*n(*-O%hKT`A4EKi+yL__nu0=w*+42kphxr_Y5W32Q!yqSa(`0!+kW|%L9Yrp zRTVW*6%2onFIzqEWJpXn{OBxu;@W@7{>BagDY?9&A{@)!gtO=VOxG{Ycp(rtSA@bj z^5*h7_G&B10)V$U{{l`wF-Ugbbd*8tpQHOm711*oA?BbaRaF1%%; z@-Ran<+?(&9P0ahN+A5p*RNfysURS}M@Hr^mAbR@rhWr|T1{d*HcHdKknDI3-Ta3a z^Izser3VyC1vMyTtT*xJ4u5OqRYu3=GY((&8^0{4vS9JG!+llm|;_`x6XiuwArZz$Gw(I?q(Iy@uM%_V40#fw|V0?V{F*2`Q93PmE5mSOC9(#vcw z=YRnmB*~I6uLq;Z89Ab?tgPdDRwRTNJM}FQW?wGgBUCghf zhOK0iF2&=9ZNL6LCvbN?( z&&U{^pC{;{{#|Zdvb>=}g27L}QphE2dMuo?4=1eu^4BV-0DCAzz$}yrr^9>e;y?4_ z{|(Olf1!$6njTBZ{_MU!+cgeK@?2>0JY7@os*Dscv-nvPgz)=4F@doO^)6H;>BI%k zJ*)BD)dM4L$?%AX##_j3`2q&NWZpdt{;!RPZ8zjb^-k8_i@xlqeo_Qj=s>Q=Fncr+ zz9I$%bF?{uHN5NnM)97+D}h%|ZO@ZBD^LGg-7c9j6mq9he+H4Ke0Ecl_@_^wn1qEX zLD=rbNaRYC50dPLWnNeC3-Uw!yZ4_swEM>-h(F%h**RKEgg#(pRj{*veF!Ip(Q0~r z?^{RNg(SSEtu-8UdQp<6UCbmrx40T8#YV%&zn5CI%toE=z$a{=<@p^qk}YH8GdO{6 zZf?|rADOVwHP}kPm(?&gTj~>cya+mP84+72OysC-Q1#7*rPd`8iJ!CliP>T=$39{Y3kVHrpBjqWtS-dw$g8=~1+ z)wYi`p(>gL^H&@})mlh6uGDe5qRi4>Gp_r|dZgd^o&jj?nI1mGh&=RSe(jd38FM#( z`ek|#Sy}U1T3)%GoLN=V#8%j76_c3>)#n>HpJd>o%ZzO6wH)`*b*!O|6N9bF$ie^s z`NTALbF8VP1Rnx9$1D6#iJDP&x72@dv&CGU<44*`FrBm8k4_CP1okDE3BN&S) z98QF6^_6$efpNmS_(t9nMoOV&FxX042sjyZxca*udL_=1aO~-QLm1xBAljow0W=Ak zVuO94r=seOiH*&>ZC1bM2zM%)*M*qv&(;F;gDG@>!Lcx~wq~si%CWj8p8q^_X}YD~ zT#P2et|PNV@QG$Ws?ZtBaEMcL+)l*Qbh^otYpvfj=n4~@&+-vr-@jG>$-qVR$(IjL z#0W;s+aE2Qyz5+R$mkK)6reO6?CHj0;q(kO>yl(h7Kbo@uq3_5ugEDzh2gFi=jyPv zcwT>n<|RM6y|;NDNk~U7o<($LGA%0S=*6IfsJoEEP|19?tM$&v+dMQsdb zM1et}vah1et3q*O1sAH!^C57@ z3|)*YCk4%cr@i_kPnSJfC$xdRjb1_HA&JA5{N+d-AfQjpwlk72W`6$FbLmR~K|zBF z_S%MkT}G{cKyv=sI{L`M1glj`3n8$Rz4-PQodvjO3f_B%*e(fb>u4G3VZr%tvOlDA z(qj*|-B`$kxqu|Iot>Qw7^QGi#*(b%h^wio;o#$k4cc^me^D|mqb3Tr*xcN_Ve3om z(aA9MqFK$MZGV3s{ezd8sW|yX^23_4?(S3(X9oYB;%^w^ff}{>Gbh}yLQ77F z#^9-{U(I_o2jB!?jvM>iP=+wb_gn{lOm}v;(BT-eI~$bQ6KzQ4Wfwz37ch6tdRZ~W z!pVu(-Q5j@fbU}jTy8I2@2JnFCR$RL%$Ob(5<%OcaFdGOcZV0NGocp`eR;YJ4yG$d zE7NDg>p;7tdlYwhip#~OzH55E_BhyQkD1cFk5x4AvQoa~Y?@!S<yt@GrEErqszXh|{iFI5JFO3^^|JX};pA zPodixacrA9lo<)D$B(f4HeqXQr6>gS#6u4|%ql6hxVmI-v-<9cby^pi%^XR^IN0nRZf7|1by)}*+ zTq8DrZk1c@CpHMS7A zEgAB1EsHc;w3IGzJNKs*@`RFpE`c*JhWT{O6)ct@^I3CPNb}vXN z27~V-j#JD(V(uTj*vtu5)YT;inmJ;9mm@?dcBd+AtCamEa#*!qzGU}3$3LZZF!kZo zA^3zs^sC@$Z2YoBrb4u|m<6C(UYq|4QI6UlnPR~mgz0`5-p~zL35an^bzgn7tTn{` z`dD}=Ujn5O9XmL6v;Yei6|qG^CQQM|k}`Zcpb;1j$Xc^-sLOtLY&)EN-{ro~BP}hh zcBIRsrKl!KqurrdE7~4r^i2=WxIqVcl{%+|n0Pu7JR5wO)W|xkzI&j-yR(Qv8G$R# zzbj0KeZ2a2Vc>owdMTA5?C7>N_q)u|Fb%@YBc-qA znEI7ID)N_23c+;a(@}7x+$Mf=@O>oszGAYebBen=tUanpI4a_V?fkMTm?D#tMBP46q4P(?791!100=SE&P_w zgpB-Kx2&oow^ZNeVh8) z8HFCAn(ESDdHDcK_OvJPV&U5(4i3_RlwdM-Nh*EN(n(3(-`?KtcxCB*YW)@6+F{x* z>aAD~LmV|fh+$bmZw{I@s+<4uiC@oa3Pd^6v)g|q(*c}J=dTv+4Vk@fca#FqV?I|#DDz#=VI zR`l){)4w?4f1Uf^{*cRP#U4ok`svc#FCEOEvoZ-bsS~LvDV492K7ePrpFAOFmX!qn zd;5|(iBR|3JlL^eZ<}-*7tIhq!$mBzCq6+u5lRH!q*4}qabLs_VR`NhyC}BmWvWGn z5Tq_u&s>$~WUp#}Oiu28;J$ZpB|tA0y7l8ps&D~Z%tq7=17fMmJae^+S;9Je^c$Bp zNgNQ%Aum}%vfaxHQcg792%8wKxRpc7@1CLfYzYPK%+=3EPF40VUf_yIdnSPS;6^F- zKvv`}&ClUr_33hPHw>=dx44IY5V+4@za~0{wICq`Se@^GgVLkPH$u%X$`oH4(12)a z-0lgUQ_I0BlFzd90}C+X{zal2xCHq#-TO7XSMLt!(L>@=7HnDD9$e4?l^Jv+mL5a= z!7TO2#sDOQ#ObVSSa6ft6uAjSebBww{+44iS0DVyVQPx8*VF_B+*|~Qrly`~nFiDI z^KYU9dgTFVi3`DWdKH8B$F8MQn7|h36zh(>sdZY@&Zv~imsn`6C2j!Vju9@=Gv1$+ z$KLkUe|q$$Y04g0wlMqKy|BAwaQ&PiiCshQ4&_gm7Z z7^I}$y-L6bbrEyjRML#{Z)_Vi32jiYK=dV1(9qBzf|0C2EE7|VRKH)A2XwHSfSuxc zDgE~Lc2jc_kth1;EXtZtv_C^6w<~4&D=$pi^`JwI7m5;-^g=ma_U|$RfQ7|S??+aZ zs4Q?PU9!aYm}l6+hFpWS_4Iz*b8~Vk^FhYg1IHMV*Q=$~J3mPu78Ec;p=u5D!F$NL z@Ib@|#I^hq7y3r6iLIQxe0!>Wl3q!2fD8{8mkP=1OtL5?xSS`26Wp_$PATYv^OCELOBawN{({@L<2MvwwGz`R*za5H16Oi#ZQV#&u5Gbq2B7*5!8 zRqub{1d6Fnx18srmu@#ij(V>yPRBLyn{tA#*}f;xw|DNEkn$kjW)J)Thq3(<`S%)| zh-O=J62t{dQZDZya4O6zoPRO$ptz2w&79On5+u37D1|Z>b7f^^@w`d{%yH?1?)po9 zzBwQDyc5hozo_9NjD=hL8~vr+?1w1i78T{^M@Ks1Tua(-jZ8F>Wnr3-kmQsUe8C4; zFJNDvzCHEOGtqi$q>Y$E*_#djxbzbCE6gN}Y&-5ZT4`DEJX1R7unTiRTDR;?qk6s1 zRK@7xPIy^ZI<-un5NiKAIlS9WLpp5$leoBHDqc@KuPvg42-W<00X=Bk8EPqm{N}9u zWocJrWfAO?app%f;F*ewJm~9IS65w*31i`RfQabz>(_UueSAbYxwvj-qzs*ohVlruhb zosYUKx4KoDn`5~&Kppq8=6LmxX3X!@HWF>%!@F<0sv=-8SvN$MX&_r#n-coQ#tn$i z5)N*m;Hm-Orx8#tC5tS&N6+D(5Y>^Zj7e{U}v_VBfvwg(wMEC2OL4~AwaXK^~7gx^UEw5B}_d0fg zHg1_-?ECj5j7W|GotqmHbQTBFb}Cq(Ahx!)H6TU)%74H1 z+4JYFe3qcU{Sxex3~|qokBybr)Fc6z9zDWwb#;}SGqdje^p*^RfBsk;Js~#My>U_# z46?z6^iZOxEtepZ2}canzYZ)cgx-UR3L_1 z_^u~kpe;6ET~_a7nz)?|p&}=LbUCbq*3euajehp#CUxFr{<+S`_IcmU{ty7}PV=OdcYI(` z3Wuo_mhho|aRI&V^iMCD;z6 zLhgvJO2abnC(&`+!52x*u4^!h2qyR6-sqS*gqV}DHwnQj-;qHshXJzHH7y;ZSn$*6 z^hEew8=IYUERo4CbE}GR!7INM)=}afA8V`NOWypNyL)|FBg=GN@J51}7YcDvV{7U= z=R7MfnR;E+N)I+HVbR~a7iv&rgFE-(!-u=pM2gt|=B{6daFFaa z_rnoo!-OOuW+AcVt%iIuK#&L=6!k{!_w1`UQ5ecI6Ul8V&wy<8I$4nELo04 z25p0;81Sw)IqiR!ZokwXT|z{14TU*?izgy7@&QQ5^{4RKu386EkBF=ks%1oyv8#uq zV1P%$@1tn=UO{~Y=HL{v-UijRL&<e*@`;ED3o|q1jz{@6 zg$@kZ2)=11t6SWvhvbO5qLHzw%Gld;iA&tqI3F5P&tvmn?ZS1wo^YPuKKUC3JB0>V zl9iMd%g(Z!TROjSQna&s1SX`Lnwm!D11Ifk4N3n^qP^-y z(G+myR_8b;oY*T+8XVVadS(MRxgaDaR?@b3@I4qo0k%3-%D=8tdT2coY#_eD_lfI+ zBiqJ&5oHbiBbkkOAOu^$`RO+9>ubqZr^5>W=y7*l!DfmsOoUff@&PjX`qb(oLMx%$ zEZ|?ht#$0^ zSBR03(S5ANo`n1OxwbM1#4%T~?PI3(ewY~~l#x58!3t`Qgy}}<#^)=FT*)ivN+@su z<%-)4P(N2XMO~IdO#6w4r97I=f(~J*HZ)){7!`;q(!R;iv|u{Mb6rK+4unicn-P3& zOU=YSFkfAN#&%dcMK0mJ-*d2V4(sVr1aneo0H^~RnVx?1V}HKZ=Ez(U7)*Wpe)XPe zB-%+LDh8#Nvo_f2J7~7uoYB84S(8`LNF!8RYxmkq$ToP}-F@M-D{R2Pbbf=EZ1Hr* zC)+9tVUD83N~fRn!_`v53wyAr)psIjG+O3B@HW$#L-;3 zzvjptzuL#Ad4&od-^8KeQ&xHV=R}Jrx6of^i1FGPR+&AREoD?x(Zl{Qx2{mp$90wL zUig3q7~T5ZM4as%DE)r!MgJ-%7^h);(-ApBwbo~a-5IbpoCC=v*JwFyldtQq-`__T z)E<8gyF!z(lVLZc)3`SFe>5^N9a4##L?8D#h$n*m1UGg-$&NHfJqMr zzo7iDn>m9vWE*FH4fF!GIfhc`rFBX~TCy=osi>mH#c-PW&_ zZ}VNyjXo#uQUwA;*A*~iQ)uv2_%3?L#P!9ZKQ9QCy26jwNa*R~YHWueh&F7#vGf4s zRdpYNtWlHr1J}dWi)t_-s8em(0A5c6sHQ)`ZEtU_VN){`eu#7V9TeY@ zgPPQpe$#{H{ea?sBVt;4vmk2nbPnhkdrRT5v9TwjQ^~!c7fpj!n`N(v?;iIPgLNIV z>9obxQQ>WkEUAO3lnK@%)&StYT5xeZ5xn%68eUV;^4RJt>eA}YLOc|bWe>b_OABlS z<~NN|PIn`7K=n`m1;42IoZ#R5yvR(`sY3ON=LHT86ko19V+|73e&=6-n=~K3J`sGm z5;X(HRU>0#p&%0i3KuQr8(dQbtnmOQ4i4N9M876yGG2|%pd4uB7=kX%&sSr4uLB6& zcKlD`h55n6!S)5}Y%XM7Sf)zRc^~<+!@s2XdRII65xBJi!B#`y?YEcbH5Joy4bPqY z&dNyhQQ)N90ys2<)8HR6)6VNeU_}@s;np9E!I+D>bFtMwVqYs?vE53*{Pyx#F3uUO zA@P&KH!Iq`p;G|ab(q(mG@f2Dbgu-Jz+4bS?akU(P!y)`&DN@ncvGbq=734mH!bOr zJ)6^F!?h>mDIY^a(Ynixo53}=V^*CF7RHgtX9d~9LpJAt(fzkzc~na;*BzC@^wm;7 zm?Dh{$3j&8p9C?P6&$=+K=yz0!@Vls6PwQ&8FPmc)=76T_E}eZ7}(7uSWmq9hj_V}aN8wgiG|RBSjHw~S8Z3a8&^)5VZTjwJE8ck z{;R2Xo_&4#rdkky4-&oSBth=B7(KzRNMu5HcSHU6Nzm1Xfk(IJgTOM6x{d0yLGZqY zFXd#hyW-|{g#ZDHU`Y_fEzlh0eo+3 zEg|+&9xb1&&vQLJN)@$zet*mQndaE560DYsvSbFO+0CUS=%4srBTy@yJNX7o2?OwU z7k_)Y9fF@B&@nsuI^XkMdUl*(t$&a6+dmW$12i>B=6o40m(#DK&f3imjkwa-1A_zZ zB5Xj)gp7t}rlKw{;U(5y@!~yNTD+cD86f#h_>=S_NIkJ;+JWpXux#cbDNKDW+3e}9 ziVU}f8StX;&I+=YcfHW~QQ7UI&=S9=u9s!W4oIo1m>M9v1r-Ed&Vu`2V*L95V~lTx z(*0gmmV9pa&YiNVZ?GB}0}c{yk3|1<2_H~LbgmuJZg!L*T_Jx$En*SqCw`J5Z40)3 zW^B$$F~6KZ2D59|^o4rQVe+@zFT3i&BBoPqa4*Ip_-@4}mmgRBr5vcZ27I_>ecsUR zoW6$t1G7dZ=HtL5F_`l6@bt`UEXKWq;s1_7?#jeq3`ccKsO)5Q6*NGVh%T|$#82xu zC5pl3Tlx?H*kl%U{Hm=#nz7A~As^9fYIe6mohAH3Z>$HUF7n+m|TB*u%l!rC3&44m!kj!K+Nufs1+ z-~7|gc-tYfj>}^(o+f+qSnZoeSTB`{cb5EbBLf560`2XTu*W8i>4@NztVGi@_77C$ zPu2YCfZW1XLR|B;svhlkCp;32DE-Ft!Tw-1H!|{FUKJQA>d_T>6!FUyM%Ek)gX?(x zCG*n~WTUEw$CF%5CUG__#r)B>!L^Vu-2S{AkaWaTQ6^U!8%KPEpurIrOT%nx=>&tY z{dKH1X)s87@&v){wSS*!KZzLP8{mEWMapS6&?*0|QS0q_7@bSW4)W z8P3yP@0%YnF64V4B}r|O)iQg#Id2qQUA2rE+GIaUCz+o?MEY6L&;pw^EeMCRbFZpj@{4f@O zjH{=G)#9W}4$g43$nX0ps@_Fg5|(2J)-b)#Ym%UeH~aMi-{o%?ziOHnL_E|2fmEb% z2+SYd;+x)RA&hRj9g&h|UMH_aZsGSXV%KIdqQft;KAHO}SH-`p9}oiqj7-HeWdfTKriX3b_FlbU1fl_|LF>A`KrZ z-PFqJp(@+3g4g0u3aHJvOQ7{kA>1Z5`50TzV$fu$z+4v!11RzxmPTER48n~VgChv( zHu?*LhiA{G>z#9!PT#r5j*N^zCf&>QN*EIq{UmMRT_aCV&bb`Uq`dR03yGTBxUo!8 z0UG>7FKJzd2T$@c&-`J5M`wko9SKyIQAW;riL`9o!=E8hq@aLe;3@{)r4?_c(mc$R zK+`EOl=}7m6kRWXxrzT?-R%G4%PhKRj=*Ft7)zHg9jHo7h)vySkaWHywS{97Gkm%s zv08t12$dyZms})EV3J%JBs4;}n#weu;a>UhBBX@v_38rGNJ0$YdGeSp2`eNnIG7Fj ze-fAx*PyR4S?Rm|pM)o9kG0ct=dZg+mNhTjKHC}7qaVrr-A{eVui>`+SDw{jHT)O= zCGNK2KCc{}q#Kp;xB}18k`In=Pi8|BgWEnkq84LVQ=*omED7aqtMS>|#e!}+or$mC z9Uh9zfkk?N=D+KoL#_YM^v~A{FfgHxdF^cYdL9cD9nk((Lchw)+%Bqj%=L>nnNNdl zZ&GSyG5FZ&-0}r>bww;#|6AsBTOK5eIG24q-XoX3)U>U>w&uv47#dZ*A%;B zD7dEoQ4Sn~Dk>#r28`0OvTkre2lx?z(g7L~e|1o!eCpTQ-v+{Y9AaXsx`GkY+lY47 zTB20)u<}U1sjS{eCZ>m~(|h8Mr!(RGjnazO|lrm78o`u7ZDWs=sFT8MiR$K`xDm7c<~gOUARxp3nIYG6RstMhCMJ;W?X zGW$;Myg-930tE~8touJ#f%QQhVq^?OK@&-}sn-J*pVIf8%YUz9o3(H(I<@uhuSbe| zWE`GJ+-Z&;CCgY_7YwttT;ikSr;?-R_WD3xf|WQB88cl;@!b*<>ZCtOLB4+C5*7Yg zbiAOPAtd(7P0m3$0N4L@2i08{WAST@`ludz0Ra8P-Twsu3#Z_d0o{%O-VBF9RjD#xcROE37({2$Vgo+SF8GEH z`$abqYr_`U&H!*z|!8KWaNL*4v4S<1={a^{Za)c_#1AhNgGo|Ke9C$c^eV5+^H8P{4qad_(s>fH^W4rxX zdQn9;d{sI_C$i)gD~~n*vPI-t2wO^+Yaq_6t`Gex72ogNPe&T2d6131I7J-m z$-{5vbFq}sSl7C;TS@>b9YGGX3KYmK?Pf9_ssvyXL23>x-9wK8RFl*%+LQYYHnQs1e#}VczI5HQZ4c-^ zen+Zxxgx`#@M4NZdNznv-|to8c}-TUbWjD>onRG=ek9mhEO4@xhPC$1fb76&JT4QPp3gzE@&~e#|VqBqzIts5=&zu0$ zY7Hx@_Bmkn84J3XZFOt+@U*zg!lA{{6>KLj?tavVICjeoHpwy2J%+s%QRG~2F$F^V z(g)7n~B0%?z6%DY;{&XEFMnU$yH-t{dlrcwMJD~SD)9F|%X zhAU6aS?hgjL2(iwJWg0#lH6!%j=68m|4i*Jvo0sDI6tg)4?~uK>i>;s_rH11f0TiL zoS*)1#Nda-wb%kH!KHnUa$yYVTiBN$ zUX0?Z!FP#%ok~mNq;WQ{oSY=N?xLKCk_$89+(q76J3kS@-^0k`^wn{U?4D z>eJphRIuJlXNLyy+Sd*OD|)yOjDOTY=t+$c*d2QkTjcj(CuT~#t=dij-q`xjNq>%V z&W^bh67Ol#ke5daNI!<2&MS)kOe&jv3ctm$$R2+e3JwnD&?MSgtHnS;-XR-R0qHmH zgYL0$Pj+^8u86&)y2#i1v`RI{O>v;Is*0Dm^(k+OPUGR&#!X2{P_m#DYju#wW$j|H zB_|zxBBDC;QvO|X&j%e>vNIT#{+mH;x3jKKq#mjb#bSA@8ss>r5oz`qm&a5i7sxgK zZQ>^FNTC6X?!?88@90%4hGm5R@+bLE zRePPI3AYL2@i|={+l-Elja52i^Ctf)ZmDi01W`^FH27-o`BH==M+qhcTZ&n$8~c8+pAa*!hA;mxJ2y8M zA;E5WkdU~-uSKfyv7*g?_cE;}mfeKd2DkpWJQL(jE*yS>P&#cI;@Ty9l@8l&1F!`@ zrDhNALnEh9EWIYVql06Yac@HKcJyLL6H@}XaKPe2d#obZ$^UWIU}V1a==%Eh|AxE& zEX%7ERz!qb2p&-Dsil|Um)19r1;vH0Fd?&H{W+&Y;as2Ac1`uxE`q zrU8Y0nehO>6rAu!ML+UrF24@f)K**M>d_rl=VoFgX=|=VwBdt)^}yO5G+?q<`}sE^ z>Tny(N5R|QOVaGQLNm!45se&0MMVd4aMdp=K~>g>H1_iPS#uYeYfk{Ra?+jj9kG5K z4dn7bLj37Du-hn5HdC<%s(=a*pKohvbs*qavKhK2Vf zA|mvKoa@#0)||Ha`T6bn^`jvw>Z&a(w_htB?=xKPC9dw-RT339!^2?Ft0&nmveCf{ z+V2Zud_?Q%TguwjQ>qO0*y55M#t-I;MOZ-ThfOTR9z-j&+RL>xRzM#eOU02Y@_jAL zyNhn{D+IL@bg@9U&DQGZwJhlOzE*{3%mX6X_?e+YZ)VgAKex`Qlm0~E%SYp_^C4{} zGvAIkoF0ZqPl~{4XiOCjSu*k7WLZp&g?nLR_2IoD8OL?LLaToKSf|K>>G?9-S6o0Xq&lvW?(k>&5 zDuKa3R#ukU*U7*vz47V9>3AtbtBd1;sxZoIlR!qj`Vw9wd`eNQEIOJ^MIf%r6XYm; zg|Dt|%HGz{nwS5*DY@dTG;{S`TC5}kGCPdC30p;oAKVmLac;i9{$kNf%Gg@ZStUf%vkVC?HwD}USv2z@5ZD-yRy3zd0B5+%iko2wpD|I^oFoWJqI1`=?u3QloHz$*K1!?J-*XS ze4HjL-rSX1!683qz&^Q)daQhrcXui4uz@CIn;*^dwG1^hhe;sPFU*Me^Ww>LsrcY@ z8fj6(*4bv)8&1G(@^w5&Xw%ZtppH;&Bw@S9%uDq)&{Zb26HjAq{W_~=&Wjv4xXaSE zfhRehio1CFgs>i^L4)a&(@Rp~{+Y#rsG8xalUgoRHp+K+wCpI4ij6BKB*Nfr83 zrG5VtWsND#_c z=DkuHfWYs>dyh#L-zXKpS#CI7%5V41`TkEe3LyQHHBPDJFcmYi^g$&Bg_y`lsv{yw z;2&);pHWQ%lZfo<6J4Icqk<=xfyVYOpOc@;lp94n!-tvQo>qD+YftWP&TV!OkAprp zA8pdJ7=)c1%$;(ISTtYB`7EMAzDn- zQJ~I2GsEu5O4?r zaphcUKUu@iSe2__p~JQHE4NEb{Ms|Kivpp9qc%W z=rkHE-UPbAkb|#wCEfms@(_Y(ZTvuGe2j1C)L4VeySm2aTZUw%L&fGeBT~sHsr9l5 zgJbi86l7S!Hqn#>`Y3Vu^m8n4*ZGf03DQx;BEC{%i;g}YpIn*oP7FJ#R^F!1 zLIH*F(R*)R-&y6uP*Gg|?dc8;uCig%s@1!e_{&7Z#!VL>lU!C-RyemQ7bz7lA-rbvA$J8__(6i9gU? zo^!;saW$OMqpMHY1+%qte*_uj3kpj{c(r#K-3vYjhe(sK?MW_>(8;e;+uL1AfrdAasq;0AkL-z_vo#bTgA#WSMZGILu3 zF-tH_A%g;|QHrHXTo4wB>C|YTS%&mKLkWx!`eQXy?@S;$u1cTZ3boD~sf6?Ncw}%0 z`yL7dU7wPy6m}uT*EdOqk2B)%1@0EG65}>SMxRBxYIxenXNfiC7&;TPn<#s$YwO}&^l)%+YzK)&= zwhNUV@?>OcPd~rQ<(b{Rdj}(J4NVM<@s%jqt$>li4H@R#qWr5KH^#?8m>8BUF`*V0 z3xD+rE+-ci6?Gm^4D8DLholfW1;sYDjkFjOhF=}X;=81il55+0-_ys3`ny%dlV_u~ zfBv`(`%0%@TG}nw#sw)^y$O#s1{ivN=pGQ4FV1&_r)6ZcuWi90;r{yqOuk23IdBC7U7+22 z_WZftQQ&(Ne%~@~#!V4FC$Nz)y}+9bGygCaGh1u_2qRYI3yxlIFpI9-S8NQ}qcly? z2ndiraX(c86_6O>g5){&xy}apu~x^LzT9WBo)NxUnr{UKQ~-hwE))iJaMB+g31v#_ zRDJ|mu(5GdrM~YCn3**u+Fh0rRm~1SRC)>>N6d>jKZzSJaDf zHy=^gOqH{=*i4G`cF{usx$gjSs3KGfu8`WXHMta=S1gZ<$Sjo!h$C8u=g-NY>e|{| z;4=iC0WUnPmFFMWf-{R)#qb*$LG_Owy9K(rG1R%vbz`w_2kG4S26sIP&vNVL9w=Ag z*Mq-@<~<=}jt(RAg!e$u=}uiZHbCzB@ak?(QxivEW|u9uM_T#7>P2DO@e%hw1gCfP zLJo|@+uQENn0)Z|r=Uryb>-(ELt-$aqonkv$%lt|c(S~AmUKt+I?)AYrcth|*79<4 ztlI&_m@ND{&w>o%yd59#oQoL8h0SgDd`^{`|0SK};Oc76&dyHRGEgQjI^rrX$i$fe zGkU7PmlO#s69E;&#LT<^{x9*MWX?0Uyqv+mi4%PDB?$@@pu5_zX*czvXBWNaGqjCd=+`_&r8RbJF-Pw*4fH*^&mkN02L_h)Pj6YsJZ zovXCxPk%#s)tA~n>eG9JUd#8e0k>Z`++BeDOR(#GA%`^cMDzLLpCPN3A;GdoFB|>( z;%Ol%N#}uQNNpE&9R@RW&!Vca@uj0kN~mt45%3K$aFcx`r^{qp&E;$goSW^}#pQ)- zd6Y4+c~!*SS0zU;DHB;2+$@y#R)6P=w)RnKm zFkCN(+~2s$w>`sCD>^dIO&1#m<@UsuoO_< z+%d26d2gUD3lW%YGt)Rmo7Kz&4#Y8*QtgEb8xgrNlCP7UxM)cFodh6Btaa10DRux1 zIZ}LjS(3 zwrbJC`JoU@d&Opgko>l+|9kCPnMwj6C8( zX(k+NUJ>j~iXPZ-(KZF0q9$=(>0>P~R_XYwf0exr*rRxMQ#TN7aNfm)v?0*?g(2g( zOS*=IBW*5qq*&du#>Oi|B2hp@B;2YD@RuH77=W{sjC~}>VY7WVF0+MwM!*_LXOvw1 zp|^rUUBkvgZksF5({52jT#;NnYeQ1K4g(;`ou_MQIXF1h*4A1sMy1W^;*Fh57D2bU(U)(%j z!{hi#5FGlGa=#ab#*_b1b3tnVxnM*-Gd!$zG_MIjj;yR1|5Abw1nw$NZ*SY#Mn4D* zX0OE&17$t@IiQZGJSA5AvTpQc1RD}b8eEi;mM6x#&!69FCLWmg9=r8)X@f)(RzHoZ zn|{666DJPUNqw{`3kTE0KSCzgF@ho@6#bP{PMRYusa(T3BHyoQO={J9Z;MITNNNL6}iu<$Egfg~1?5IcQB zWni4Zuw##iOGyT2wycQ7?$=-X`!7yGSRn3}2{^bJdqtK6jVqsQ2?|o<9|u=^rYma- zI6RMQ>CUBxjt@3ED7XUAA}s_l?&t1f0H>vXWn&1WJ3x>$|LaFd#Hc3a-M&D-#gfv} zPMzb+ci{`z*_5O!~Uga(r^wc#CsD*$>By zW1wdkAk!Le$)kI8SsNJfO!nG~C*GKQ0&joZ3JySPgx7@q#YxjAC@fpd%ddPlQY#b* z3%Gg`MBav9HWq3XU}9x++JPHSLDN+@GcTQz&bBc;0A3S{6zPj7Cx~rOF z2zI|<5YU!k50A;N(Mc(z`&BYCGt=wlP?^{72ffz7l>OBlK0GGAFD=!5f6_nqtBQ`_ zH2h*8*=|_EIYLaG9_@7RQ9Q+>I%lt~Ow!Aq_tWEdn1M0ldhsO$$M<^I(~kASX%|v7 zeDRy~muKN4hkjb|F-mp^j7C&I0YDmX_=gONEZUfDl3$ttdB@)VKJRl>p?+3-zD}y! z-r7*SRBC^iPO2~r9sf+Lec6Ne%}df&5DPmIT^z`^=TIv=CZ1av=!`{i5#Qp1ew9pb zbb|$FsQ(Rgxf!o(pDiGfG^LI4bm62xuzcsXwKFP?lW-0#-q12p4J++nv+cCy<5E`5 z_7GmV^@ZiD$n5VIa>&_;-4#LghpI{H7%}-s$5s|$i&kJp3qj%ZTy)Q!BtTmhqoQGTG)F2W7d1m>H+^Wj{fL{o`?fB;bd5|pKy zyP~C)Q|#_pSkORf*RghcwS*41^6`9Ha0YXkX<3$FfXka&oRc_`?VH?%nM4p zOSFuX-_U=5^eL253zcBHnlkGuJb#>@+3QMud6s9%=M02qwnfm2UH}n3!u42@lU_ed zjyEO^J6C9AUGgIrNIB<%P8Ab};-r40X<5jz?)q-~@}NKMCcmMw!s!>&Wzr$>y7iN^ zSya*?kv`{OuFV7{1WFEWt%MD)%m=8$t5>f=?`w+Tx0T!%wnub-$YVQeV1?IT=si&j zy@GFy9HC-Mb{nLTp}XRh6w&I`m>!V literal 25682 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%0DxF=aV9A^cPLTM{|cm}BHwO_gKFyb`nQ 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 From 09e7d5aef913ba6da729c1e90881d3c1c9f66e34 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Mon, 20 Feb 2017 14:22:18 -0600 Subject: [PATCH 04/16] Buffs Space Vines --- code/game/turfs/simulated.dm | 4 - code/modules/hydroponics/grown.dm | 5 +- code/modules/hydroponics/seed.dm | 39 ++++------ .../hydroponics/spreading/spreading.dm | 46 ++++++++--- .../hydroponics/spreading/spreading_growth.dm | 77 +++++++++++++++---- .../spreading/spreading_response.dm | 55 ++++++++----- 6 files changed, 156 insertions(+), 70 deletions(-) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 0b2da66927..08da1a66dd 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -94,10 +94,6 @@ if(M.lying) return ..() - // Ugly hack :( Should never have multiple plants in the same tile. - var/obj/effect/plant/plant = locate() in contents - if(plant) plant.trodden_on(M) - // Dirt overlays. update_dirt() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index edc796594c..ece606a389 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -323,8 +323,9 @@ if(!reagents || reagents.total_volume <= 0) return reagents.remove_any(rand(1,3)) //Todo, make it actually remove the reagents the seed uses. - seed.do_thorns(H,src) - seed.do_sting(H,src,pick("r_hand","l_hand")) + var/affected = pick("r_hand","l_hand") + seed.do_thorns(H,src,affected) + seed.do_sting(H,src,affected) // Predefined types for placing on the map. diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 9115fea244..e7a39dd74f 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -112,34 +112,29 @@ qdel(target) return - if(!target_limb) target_limb = pick(BP_ALL) + var/blocked = target.run_armor_check(target_limb, "melee") + if(blocked >= 100) + return var/obj/item/organ/external/affecting = target.get_organ(target_limb) var/damage = 0 - - if(get_trait(TRAIT_CARNIVOROUS)) - if(get_trait(TRAIT_CARNIVOROUS) == 2) - if(affecting) - target << "\The [fruit]'s thorns pierce your [affecting.name] greedily!" - else - target << "\The [fruit]'s thorns pierce your flesh greedily!" - damage = get_trait(TRAIT_POTENCY)/2 + var/has_edge = 0 + if(get_trait(TRAIT_CARNIVOROUS) >= 2) + if(affecting) + to_chat(target, "\The [fruit]'s thorns pierce your [affecting.name] greedily!") else - if(affecting) - target << "\The [fruit]'s thorns dig deeply into your [affecting.name]!" - else - target << "\The [fruit]'s thorns dig deeply into your flesh!" - damage = get_trait(TRAIT_POTENCY)/5 + to_chat(target, "\The [fruit]'s thorns pierce your flesh greedily!") + damage = max(5, round(15*get_trait(TRAIT_POTENCY)/100, 1)) + has_edge = prob(get_trait(TRAIT_POTENCY)/2) else - return + if(affecting) + to_chat(target, "\The [fruit]'s thorns dig deeply into your [affecting.name]!") + else + to_chat(target, "\The [fruit]'s thorns dig deeply into your flesh!") + damage = max(1, round(5*get_trait(TRAIT_POTENCY)/100, 1)) + has_edge = prob(get_trait(TRAIT_POTENCY)/5) - if(affecting) - affecting.take_damage(damage, 0) - affecting.add_autopsy_data("Thorns",damage) - else - target.adjustBruteLoss(damage) - target.UpdateDamageIcon() - target.updatehealth() + target.apply_damage(damage, BRUTE, target_limb, blocked, "Thorns", sharp=1, edge=has_edge) // Adds reagents to a target. /datum/seed/proc/do_sting(var/mob/living/carbon/human/target, var/obj/item/fruit) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 6961513b20..43383d86a3 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -16,6 +16,7 @@ seed.set_trait(TRAIT_SPREAD,2) // So it will function properly as vines. seed.set_trait(TRAIT_POTENCY,rand(potency_min, potency_max)) // 70-100 potency will help guarantee a wide spread and powerful effects. seed.set_trait(TRAIT_MATURATION,rand(maturation_min, maturation_max)) + seed.display_name = "strange plants" //more thematic for the vine infestation event //make vine zero start off fully matured var/obj/effect/plant/vine = new(T,seed) @@ -88,7 +89,7 @@ parent = newparent if(!plant_controller) - sleep(250) // ugly hack, should mean roundstart plants are fine. + sleep(250) // ugly hack, should mean roundstart plants are fine. TODO initialize perhaps? if(!plant_controller) world << "Plant controller does not exist and [src] requires it. Aborting." qdel(src) @@ -127,14 +128,15 @@ spread_distance = ((growth_type>0) ? round(spread_chance*0.6) : round(spread_chance*0.3)) update_icon() - spawn(1) // Plants will sometimes be spawned in the turf adjacent to the one they need to end up in, for the sake of correct dir/etc being set. - set_dir(calc_dir()) - update_icon() - plant_controller.add_plant(src) - // Some plants eat through plating. - if(!isnull(seed.chems["pacid"])) - var/turf/T = get_turf(src) - T.ex_act(prob(80) ? 3 : 2) +// Plants will sometimes be spawned in the turf adjacent to the one they need to end up in, for the sake of correct dir/etc being set. +/obj/effect/plant/proc/finish_spreading() + set_dir(calc_dir()) + update_icon() + plant_controller.add_plant(src) + //Some plants eat through plating. + if(islist(seed.chems) && !isnull(seed.chems["pacid"])) + var/turf/T = get_turf(src) + T.ex_act(prob(80) ? 3 : 2) /obj/effect/plant/update_icon() //TODO: should really be caching this. @@ -261,6 +263,32 @@ health -= W.force check_health() +//handles being overrun by vines - note that attacker_parent may be null in some cases +/obj/effect/plant/proc/vine_overrun(datum/seed/attacker_seed, obj/effect/plant/attacker_parent) + var/aggression = 0 + aggression += (attacker_seed.get_trait(TRAIT_CARNIVOROUS) - seed.get_trait(TRAIT_CARNIVOROUS)) + aggression += (attacker_seed.get_trait(TRAIT_SPREAD) - seed.get_trait(TRAIT_SPREAD)) + + var/resiliance + if(is_mature()) + resiliance = 0 + switch(seed.get_trait(TRAIT_ENDURANCE)) + if(30 to 70) + resiliance = 1 + if(70 to 95) + resiliance = 2 + if(95 to INFINITY) + resiliance = 3 + else + resiliance = -2 + if(seed.get_trait(TRAIT_ENDURANCE) >= 50) + resiliance = -1 + aggression -= resiliance + + if(aggression > 0) + health -= aggression*5 + check_health() + /obj/effect/plant/ex_act(severity) switch(severity) if(1.0) diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index 0b8ead0476..fca9f3abaf 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -14,19 +14,32 @@ for(var/turf/simulated/floor in get_cardinal_neighbors()) if(get_dist(parent, floor) > spread_distance) continue - if((locate(/obj/effect/plant) in floor.contents) || (locate(/obj/effect/dead_plant) in floor.contents) ) + + var/blocked = 0 + for(var/obj/effect/plant/other in floor.contents) + if(other.seed == src.seed) + blocked = 1 + break + if(blocked) continue + if(floor.density) if(!isnull(seed.chems["pacid"])) spawn(rand(5,25)) floor.ex_act(3) continue + if(!Adjacent(floor) || !floor.Enter(src)) continue neighbors |= floor + + if(neighbors.len) + plant_controller.add_plant(src) //if we have neighbours again, start processing + // Update all of our friends. var/turf/T = get_turf(src) for(var/obj/effect/plant/neighbor in range(1,src)) - neighbor.neighbors -= T + if(neighbor.seed == src.seed) + neighbor.neighbors -= T /obj/effect/plant/process() @@ -71,33 +84,71 @@ if(sampled) //Should be between 2-7 for given the default range of values for TRAIT_PRODUCTION - var/chance = max(1, round(30/seed.get_trait(TRAIT_PRODUCTION))) + var/chance = max(1, round(15/seed.get_trait(TRAIT_PRODUCTION))) if(prob(chance)) sampled = 0 + if(is_mature() && !buckled_mob) + for(var/turf/neighbor in neighbors) + for(var/mob/living/M in neighbor) + if(seed.get_trait(TRAIT_SPREAD) >= 2 && (M.lying || prob(round(seed.get_trait(TRAIT_POTENCY))))) + entangle(M) + if(is_mature() && neighbors.len && prob(spread_chance)) //spread to 1-3 adjacent turfs depending on yield trait. var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3) - + for(var/i in 1 to max_spread) if(prob(spread_chance)) sleep(rand(3,5)) if(!neighbors.len) break - var/turf/target_turf = pick(neighbors) - var/obj/effect/plant/child = new(get_turf(src),seed,parent) - spawn(1) // This should do a little bit of animation. - child.loc = target_turf - child.update_icon() - // Update neighboring squares. - for(var/obj/effect/plant/neighbor in range(1,target_turf)) - neighbor.neighbors -= target_turf + spread_to(pick(neighbors)) // We shouldn't have spawned if the controller doesn't exist. check_health() - if(neighbors.len || health != max_health) + if(buckled_mob || neighbors.len) plant_controller.add_plant(src) +//spreading vines aren't created on their final turf. +//Instead, they are created at their parent and then move to their destination. +/obj/effect/plant/proc/spread_to(turf/target_turf) + var/obj/effect/plant/child = new(get_turf(src),seed,parent) + + spawn(1) // This should do a little bit of animation. + if(deleted(child)) + return + + //move out to the destination + child.anchored = 0 + step_to(child, target_turf) + child.anchored = 1 + child.update_icon() + + //see if anything is there + for(var/thing in child.loc) + if(thing != child && istype(thing, /obj/effect/plant)) + var/obj/effect/plant/other = thing + if(other.seed != child.seed) + other.vine_overrun(child.seed, src) //vine fight + qdel(child) + return + if(istype(thing, /obj/effect/dead_plant)) + qdel(thing) + qdel(child) + return + if(isliving(thing) && (seed.get_trait(TRAIT_CARNIVOROUS) || (seed.get_trait(TRAIT_SPREAD) >= 2 && prob(round(seed.get_trait(TRAIT_POTENCY)))))) + entangle(thing) + qdel(child) + return + + // Update neighboring squares. + for(var/obj/effect/plant/neighbor in range(1, child.loc)) //can use the actual final child loc now + if(child.seed == neighbor.seed) //neighbors of different seeds will continue to try to overrun each other + neighbor.neighbors -= target_turf + + child.finish_spreading() + /obj/effect/plant/proc/die_off() // Kill off our plant. if(plant) plant.die() diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 2b9407aecd..1e8906c44d 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -19,10 +19,16 @@ /obj/effect/plant/attack_generic(var/mob/user) manual_unbuckle(user) +/obj/effect/plant/Crossed(atom/movable/O) + if(isliving(O)) + trodden_on(O) + /obj/effect/plant/proc/trodden_on(var/mob/living/victim) if(!is_mature()) return var/mob/living/carbon/human/H = victim + if(prob(round(seed.get_trait(TRAIT_POTENCY)/4))) + entangle(victim) if(istype(H) && H.shoes) return seed.do_thorns(victim,src) @@ -39,37 +45,42 @@ /obj/effect/plant/proc/manual_unbuckle(mob/user as mob) if(buckled_mob) - if(prob(seed ? min(max(0,100 - seed.get_trait(TRAIT_POTENCY)/2),100) : 50)) - if(buckled_mob.buckled == src) - if(buckled_mob != user) - buckled_mob.visible_message(\ - "[user.name] frees [buckled_mob.name] from \the [src].",\ - "[user.name] frees you from \the [src].",\ - "You hear shredding and ripping.") - else - buckled_mob.visible_message(\ - "[buckled_mob.name] struggles free of \the [src].",\ - "You untangle \the [src] from around yourself.",\ - "You hear shredding and ripping.") + var/chance = 20 + if(seed) + chance = round(100/(20*seed.get_trait(TRAIT_POTENCY)/100)) + if(prob(chance)) + if(buckled_mob != user) + buckled_mob.visible_message(\ + "\The [user] frees \the [buckled_mob] from \the [src].",\ + "\The [user] frees you from \the [src].",\ + "You hear shredding and ripping.") + else + buckled_mob.visible_message(\ + "\The [buckled_mob] struggles free of \the [src].",\ + "You untangle \the [src] from around yourself.",\ + "You hear shredding and ripping.") unbuckle() else - var/text = pick("rip","tear","pull") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + health -= rand(1,5) + var/text = pick("rip","tear","pull", "bite", "tug") user.visible_message(\ - "[user.name] [text]s at \the [src].",\ - "You [text] at \the [src].",\ - "You hear shredding and ripping.") - return + "\The [user] [text]s at \the [src].",\ + "You [text] at \the [src].",\ + "You hear shredding and ripping.") + check_health() + return /obj/effect/plant/proc/entangle(var/mob/living/victim) if(buckled_mob) return - if(victim.buckled) + if(victim.buckled || victim.anchored) return //grabbing people - if(!victim.anchored && Adjacent(victim) && victim.loc != get_turf(src)) + if(!victim.anchored && Adjacent(victim) && victim.loc != src.loc) var/can_grab = 1 if(istype(victim, /mob/living/carbon/human)) var/mob/living/carbon/human/H = victim @@ -77,10 +88,14 @@ can_grab = 0 if(can_grab) src.visible_message("Tendrils lash out from \the [src] and drag \the [victim] in!") - victim.loc = src.loc + victim.forceMove(src.loc) //entangling people if(victim.loc == src.loc) buckle_mob(victim) victim.set_dir(pick(cardinal)) victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!" + +/obj/effect/plant/buckle_mob() + .=..() + if(.) plant_controller.add_plant(src) \ No newline at end of file From bba014acfad9eb29ea506933cf59e0a0b7652c37 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Mon, 20 Feb 2017 18:23:09 -0600 Subject: [PATCH 05/16] More plant things --- code/modules/hydroponics/seed.dm | 24 +++++++------ .../hydroponics/spreading/spreading.dm | 3 +- .../spreading/spreading_response.dm | 19 ++++------ html/changelogs/Anewbe - Space Vines.yml | 36 +++++++++++++++++++ 4 files changed, 59 insertions(+), 23 deletions(-) create mode 100644 html/changelogs/Anewbe - Space Vines.yml diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index e7a39dd74f..f6388e0190 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -120,21 +120,24 @@ var/damage = 0 var/has_edge = 0 if(get_trait(TRAIT_CARNIVOROUS) >= 2) - if(affecting) - to_chat(target, "\The [fruit]'s thorns pierce your [affecting.name] greedily!") - else - to_chat(target, "\The [fruit]'s thorns pierce your flesh greedily!") damage = max(5, round(15*get_trait(TRAIT_POTENCY)/100, 1)) has_edge = prob(get_trait(TRAIT_POTENCY)/2) - else + if(affecting) - to_chat(target, "\The [fruit]'s thorns dig deeply into your [affecting.name]!") + to_chat(target, "\The [fruit]'s thorns pierce your [affecting.name] greedily!") + target.apply_damage(damage, BRUTE, target_limb, blocked, "Thorns", sharp=1, edge=has_edge) else - to_chat(target, "\The [fruit]'s thorns dig deeply into your flesh!") + to_chat(target, "\The [fruit]'s thorns pierce your flesh greedily!") + target.adjustBruteLoss(damage) + else damage = max(1, round(5*get_trait(TRAIT_POTENCY)/100, 1)) has_edge = prob(get_trait(TRAIT_POTENCY)/5) - - target.apply_damage(damage, BRUTE, target_limb, blocked, "Thorns", sharp=1, edge=has_edge) + if(affecting) + to_chat(target, "\The [fruit]'s thorns dig deeply into your [affecting.name]!") + target.apply_damage(damage, BRUTE, target_limb, blocked, "Thorns", sharp=1, edge=has_edge) + else + to_chat(target, "\The [fruit]'s thorns dig deeply into your flesh!") + target.adjustBruteLoss(damage) // Adds reagents to a target. /datum/seed/proc/do_sting(var/mob/living/carbon/human/target, var/obj/item/fruit) @@ -147,7 +150,8 @@ for(var/obj/item/clothing/clothes in target) if(target.item_is_in_hands(clothes)) continue - body_coverage &= ~(clothes.body_parts_covered) + if(clothes.item_flags & THICKMATERIAL) + body_coverage &= ~(clothes.body_parts_covered) if(!body_coverage) return diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 43383d86a3..48d2c542dd 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -46,6 +46,7 @@ /obj/effect/plant name = "plant" anchored = 1 + can_buckle = 1 opacity = 0 density = 0 icon = 'icons/obj/hydroponics_growing.dmi' @@ -109,7 +110,7 @@ growth_threshold = max_health/VINE_GROWTH_STAGES icon = 'icons/obj/hydroponics_vines.dmi' growth_type = 2 // Vines by default. - if(seed.get_trait(TRAIT_CARNIVOROUS) == 2) + if(seed.get_trait(TRAIT_CARNIVOROUS) >= 2) growth_type = 1 // WOOOORMS. else if(!(seed.seed_noun in list("seeds","pits"))) if(seed.seed_noun == "nodes") diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 1e8906c44d..80d72055eb 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -7,7 +7,7 @@ if(!istype(M)) return - if(!buckled_mob && !M.buckled && !M.anchored && (issmall(M) || prob(round(seed.get_trait(TRAIT_POTENCY)/6)))) + if(!buckled_mob && !M.buckled && !M.anchored && (issmall(M) || prob(round(seed.get_trait(TRAIT_POTENCY)/3)))) //wait a tick for the Entered() proc that called HasProximity() to finish (and thus the moving animation), //so we don't appear to teleport from two tiles away when moving into a turf adjacent to vines. spawn(1) @@ -27,7 +27,7 @@ if(!is_mature()) return var/mob/living/carbon/human/H = victim - if(prob(round(seed.get_trait(TRAIT_POTENCY)/4))) + if(prob(round(seed.get_trait(TRAIT_POTENCY)/3))) entangle(victim) if(istype(H) && H.shoes) return @@ -89,13 +89,8 @@ if(can_grab) src.visible_message("Tendrils lash out from \the [src] and drag \the [victim] in!") victim.forceMove(src.loc) - - //entangling people - if(victim.loc == src.loc) - buckle_mob(victim) - victim.set_dir(pick(cardinal)) - victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!" - -/obj/effect/plant/buckle_mob() - .=..() - if(.) plant_controller.add_plant(src) \ No newline at end of file + buckle_mob(victim) + victim.set_dir(pick(cardinal)) + victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!" + victim.Weaken(0.5) + seed.do_thorns(victim,src) diff --git a/html/changelogs/Anewbe - Space Vines.yml b/html/changelogs/Anewbe - Space Vines.yml new file mode 100644 index 0000000000..e4e63e7c71 --- /dev/null +++ b/html/changelogs/Anewbe - Space Vines.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Anewbe + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Space Vines should be more dangerous." \ No newline at end of file From 0f781e36a75cc6db33f12e20eff9db7f59120bad Mon Sep 17 00:00:00 2001 From: Neerti Date: Thu, 2 Mar 2017 18:44:57 -0500 Subject: [PATCH 06/16] Adds Multi-Z Test Map --- code/datums/observation/turf_changed.dm | 28 +++ code/game/machinery/CableLayer.dm | 6 +- .../mecha/equipment/tools/medical_tools.dm | 4 +- code/game/objects/effects/effect_system.dm | 2 +- code/game/objects/structures/lattice.dm | 5 + code/game/turfs/turf_changing.dm | 9 + code/modules/admin/verbs/buildmode.dm | 9 +- code/modules/multiz/movement.dm | 209 ++++++++++++++--- code/modules/multiz/structures.dm | 213 ++++++++++++------ code/modules/multiz/turf.dm | 130 +++++------ code/modules/power/cable.dm | 161 +++++-------- icons/obj/power_cond_white.dmi | Bin 12329 -> 12337 bytes icons/turf/cliff.dmi | Bin 0 -> 750 bytes icons/turf/space.dmi | Bin 126411 -> 126419 bytes maps/example/example-1.dmm | 73 ++++++ maps/example/example-2.dmm | 69 ++++++ maps/example/example.dm | 14 ++ maps/example/example_defines.dm | 49 ++++ maps/northern_star/northern_star.dm | 2 + polaris.dme | 2 +- 20 files changed, 702 insertions(+), 283 deletions(-) create mode 100644 code/datums/observation/turf_changed.dm create mode 100644 icons/turf/cliff.dmi create mode 100644 maps/example/example-1.dmm create mode 100644 maps/example/example-2.dmm create mode 100644 maps/example/example.dm create mode 100644 maps/example/example_defines.dm diff --git a/code/datums/observation/turf_changed.dm b/code/datums/observation/turf_changed.dm new file mode 100644 index 0000000000..861b409227 --- /dev/null +++ b/code/datums/observation/turf_changed.dm @@ -0,0 +1,28 @@ +// Observer Pattern Implementation: Turf Changed +// Registration type: /turf +// +// Raised when: A turf has been changed using the ChangeTurf proc. +// +// Arguments that the called proc should expect: +// /turf/affected: The turf that has changed +// /old_density: Density before the change +// /new_density: Density after the change +// /old_opacity: Opacity before the change +// /new_opacity: Opacity after the change + +var/decl/observ/turf_changed/turf_changed_event = new() + +/decl/observ/turf_changed + name = "Turf Changed" + expected_type = /turf + +/************************ +* Turf Changed Handling * +************************/ + +/turf/ChangeTurf() + var/old_density = density + var/old_opacity = opacity + . = ..() + if(.) + turf_changed_event.raise_event(src, old_density, density, old_opacity, opacity) \ No newline at end of file diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index a5625e9253..2b4eae9a0d 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -73,7 +73,7 @@ visible_message("A red light flashes on \the [src].") return cable.use(amount) - if(deleted(cable)) + if(deleted(cable)) cable = null return 1 @@ -104,13 +104,13 @@ NC.cableColor("red") NC.d1 = 0 NC.d2 = fdirn - NC.updateicon() + NC.update_icon() var/datum/powernet/PN if(last_piece && last_piece.d2 != M_Dir) last_piece.d1 = min(last_piece.d2, M_Dir) last_piece.d2 = max(last_piece.d2, M_Dir) - last_piece.updateicon() + last_piece.update_icon() PN = last_piece.powernet if(!PN) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index fdf4a16b00..ffe30bf3fd 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -348,13 +348,13 @@ NC.cableColor("red") NC.d1 = 0 NC.d2 = fdirn - NC.updateicon() + NC.update_icon() var/datum/powernet/PN if(last_piece && last_piece.d2 != chassis.dir) last_piece.d1 = min(last_piece.d2, chassis.dir) last_piece.d2 = max(last_piece.d2, chassis.dir) - last_piece.updateicon() + last_piece.update_icon() PN = last_piece.powernet if(!PN) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index d7e530b761..610746339b 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -333,7 +333,7 @@ steam.start() -- spawns the effect spawn(0) var/turf/T = get_turf(src.holder) if(T != src.oldposition) - if(istype(T, /turf/space)) + if(istype(T, /turf/simulated)) var/obj/effect/effect/ion_trails/I = PoolOrNew(/obj/effect/effect/ion_trails, src.oldposition) src.oldposition = T I.set_dir(src.holder.dir) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 5d01438614..0eb48e94e0 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -34,6 +34,11 @@ if(locate(/obj/structure/lattice, get_step(src, dir))) L = locate(/obj/structure/lattice, get_step(src, dir)) L.updateOverlays(src.loc) + if(istype(loc, /turf/simulated/open)) + var/turf/simulated/open/O = loc + spawn(1) + if(O) // If we built a new floor with the lattice, the open turf won't exist anymore. + O.update() // This lattice may be supporting things on top of it. If it's being deleted, they need to fall down. ..() /obj/structure/lattice/ex_act(severity) diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 9b9638d908..7379d2c80b 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -9,6 +9,13 @@ if(L) qdel(L) +// Called after turf replaces old one +/turf/proc/post_change() + levelupdate() + var/turf/simulated/open/T = GetAbove(src) + if(istype(T)) + T.update_icon() + //Creates a new turf /turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0) if (!N) @@ -60,6 +67,7 @@ W.levelupdate() W.update_icon(1) + W.post_change() . = W else @@ -83,6 +91,7 @@ W.levelupdate() W.update_icon(1) + W.post_change() . = W lighting_overlay = old_lighting_overlay diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 5a211d960b..9239f6385f 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -392,11 +392,12 @@ if(holder.buildmode.coordA && holder.buildmode.coordB) user << "Ladder locations set, building ladders." - var/obj/structure/ladder/A = new /obj/structure/ladder(holder.buildmode.coordA) + var/obj/structure/ladder/A = new /obj/structure/ladder/up(holder.buildmode.coordA) var/obj/structure/ladder/B = new /obj/structure/ladder(holder.buildmode.coordB) - A.target = B - B.target = A - B.icon_state = "ladderup" + A.target_up = B + B.target_down = A + A.update_icon() + B.update_icon() holder.buildmode.coordA = null holder.buildmode.coordB = null if(7) // Move into contents diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index dd0a93fec1..586b624260 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -1,51 +1,194 @@ -/obj/item/weapon/tank/jetpack/verb/moveup() +/mob/verb/up() set name = "Move Upwards" - set category = "Object" + set category = "IC" - . = 1 - if(!allow_thrust(0.01, usr)) - usr << "\The [src] is disabled." + if(zMove(UP)) + to_chat(usr, "You move upwards.") + +/mob/verb/down() + set name = "Move Down" + set category = "IC" + + if(zMove(DOWN)) + to_chat(usr, "You move down.") + +/mob/proc/zMove(direction) + if(eyeobj) + return eyeobj.zMove(direction) + if(!can_ztravel()) + to_chat(usr, "You lack means of travel in that direction.") return - var/turf/above = GetAbove(src) - if(!istype(above)) - usr << "There is nothing of interest in this direction." - return + var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) - if(!istype(above, /turf/space) && !istype(above, /turf/simulated/open)) - usr << "You bump against \the [above]." - return + if(!destination) + to_chat(usr, "There is nothing of interest in this direction.") + return 0 - for(var/atom/A in above) - if(A.density) - usr << "\The [A] blocks you." - return + var/turf/start = get_turf(src) + if(!start.CanZPass(src, direction)) + to_chat(usr, "\The [start] is in the way.") + return 0 + if(!destination.CanZPass(src, direction)) + to_chat(usr, "\The [destination] blocks your way.") + return 0 - usr.Move(above) - usr << "You move upwards." + var/area/area = get_area(src) + if(direction == UP && area.has_gravity) + var/obj/structure/lattice/lattice = locate() in destination.contents + if(lattice) + var/pull_up_time = max(5 SECONDS + (src.movement_delay() * 10), 1) + to_chat(src, "You grab \the [lattice] and start pulling yourself upward...") + destination.audible_message("You hear something climbing up \the [lattice].") + if(do_after(src, pull_up_time)) + to_chat(src, "You pull yourself up.") + else + to_chat(src, "You gave up on pulling yourself up.") + return 0 + else + to_chat(usr, "Gravity stops you from moving upward.") + return 0 -/obj/item/weapon/tank/jetpack/verb/movedown() - set name = "Move Downwards" - set category = "Object" + for(var/atom/A in destination) + if(!A.CanPass(src, start, 1.5, 0)) + to_chat(usr, "\The [A] blocks you.") + return 0 + Move(destination) + return 1 - . = 1 - if(!allow_thrust(0.01, usr)) - usr << "\The [src] is disabled." +/mob/observer/zMove(direction) + var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) + if(destination) + forceMove(destination) + else + to_chat(usr, "There is nothing of interest in this direction.") + +/mob/observer/eye/zMove(direction) + var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) + if(destination) + setLoc(destination) + else + to_chat(usr, "There is nothing of interest in this direction.") + +/mob/proc/can_ztravel() + return 0 + +/mob/observer/can_ztravel() + return 1 + +/mob/living/carbon/human/can_ztravel() + if(incapacitated()) + return 0 + + if(Process_Spacemove()) + return 1 + + if(Check_Shoegrip()) //scaling hull with magboots + for(var/turf/simulated/T in trange(1,src)) + if(T.density) + return 1 + +/mob/living/silicon/robot/can_ztravel() + if(incapacitated() || is_dead()) + return 0 + + if(Process_Spacemove()) //Checks for active jetpack + return 1 + + for(var/turf/simulated/T in trange(1,src)) //Robots get "magboots" + if(T.density) + return 1 + + + + +//FALLING STUFF + +//Holds fall checks that should not be overriden by children +/atom/movable/proc/fall() + if(!isturf(loc)) return var/turf/below = GetBelow(src) - if(!istype(below)) - usr << "There is nothing of interest in this direction." + if(!below) return - if(below.density) - usr << "You bump against \the [below]." + var/turf/T = loc + if(!T.CanZPass(src, DOWN) || !below.CanZPass(src, DOWN)) return + // No gravity in space, apparently. + var/area/area = get_area(src) + if(!area.has_gravity()) + return + + if(throwing) + return + + if(can_fall()) + handle_fall(below) + +//For children to override +/atom/movable/proc/can_fall() + if(anchored) + return FALSE + + if(locate(/obj/structure/lattice, loc)) + return FALSE + + // See if something prevents us from falling. + var/turf/below = GetBelow(src) for(var/atom/A in below) - if(A.density) - usr << "\The [A] blocks you." - return + if(!A.CanPass(src, src.loc)) + return FALSE - usr.Move(below) - usr << "You move downwards." + return TRUE + +/obj/effect/can_fall() + return FALSE + +/obj/effect/decal/cleanable/can_fall() + return TRUE + +/obj/item/pipe/can_fall() + var/turf/simulated/open/below = loc + below = below.below + + . = ..() + + if(anchored) + return FALSE + + if((locate(/obj/structure/disposalpipe/up) in below) || locate(/obj/machinery/atmospherics/pipe/zpipe/up in below)) + return FALSE + +/mob/living/simple_animal/parrot/can_fall() // Poly can fly. + return FALSE + +/mob/living/simple_animal/hostile/carp/can_fall() // So can carp apparently. + return FALSE + +/atom/movable/proc/handle_fall(var/turf/landing) + Move(landing) + if(locate(/obj/structure/stairs) in landing) + return 1 + + if(istype(landing, /turf/simulated/open)) + visible_message("\The [src] falls from the deck above through \the [landing]!", "You hear a whoosh of displaced air.") + else + visible_message("\The [src] falls from the deck above and slams into \the [landing]!", "You hear something slam into the deck.") + +/mob/living/carbon/human/handle_fall(var/turf/landing) + if(..()) + return + to_chat(src, "You fall off and hit \the [landing]!") + playsound(loc, "punch", 25, 1, -1) + var/damage = 20 // Because wounds heal rather quickly, 20 should be enough to discourage jumping off but not be enough to ruin you, at least for the first time. + apply_damage(rand(0, damage), BRUTE, BP_HEAD) + apply_damage(rand(0, damage), BRUTE, BP_TORSO) + apply_damage(rand(0, damage), BRUTE, BP_L_LEG) + apply_damage(rand(0, damage), BRUTE, BP_R_LEG) + apply_damage(rand(0, damage), BRUTE, BP_L_ARM) + apply_damage(rand(0, damage), BRUTE, BP_R_ARM) + Weaken(4) + updatehealth() \ No newline at end of file diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm index 36a606bfcf..5727808276 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/structures.dm @@ -4,54 +4,127 @@ /obj/structure/ladder name = "ladder" - desc = "A ladder. You can climb it up and down." - icon_state = "ladderdown" + desc = "A ladder. You can climb it up and down." + icon_state = "ladder01" icon = 'icons/obj/structures.dmi' density = 0 opacity = 0 anchored = 1 - var/obj/structure/ladder/target + var/allowed_directions = DOWN + var/obj/structure/ladder/target_up + var/obj/structure/ladder/target_down - initialize() - // the upper will connect to the lower - if(icon_state == "ladderup") - return + var/const/climb_time = 2 SECONDS +/obj/structure/ladder/initialize() + // the upper will connect to the lower + if(allowed_directions & DOWN) //we only want to do the top one, as it will initialize the ones before it. for(var/obj/structure/ladder/L in GetBelow(src)) - if(L.icon_state == "ladderup") - target = L - L.target = src + if(L.allowed_directions & UP) + target_down = L + L.target_up = src return + update_icon() - Destroy() - if(target && icon_state == "ladderdown") - qdel(target) - return ..() +/obj/structure/ladder/Destroy() + if(target_down) + target_down.target_up = null + target_down = null + if(target_up) + target_up.target_down = null + target_up = null + return ..() - attackby(obj/item/C as obj, mob/user as mob) - . = ..() - attack_hand(user) +/obj/structure/ladder/attackby(obj/item/C as obj, mob/user as mob) + attack_hand(user) + return + +/obj/structure/ladder/attack_hand(var/mob/M) + if(!M.may_climb_ladders(src)) return - attack_hand(var/mob/M) - if(!target || !istype(target.loc, /turf)) - M << "\The [src] is incomplete and can't be climbed." + var/obj/structure/ladder/target_ladder = getTargetLadder(M) + if(!target_ladder) + return + if(!M.Move(get_turf(src))) + to_chat(M, "You fail to reach \the [src].") + return + + var/direction = target_ladder == target_up ? "up" : "down" + + M.visible_message("\The [M] begins climbing [direction] \the [src]!", + "You begin climbing [direction] \the [src]!", + "You hear the grunting and clanging of a metal ladder being used.") + + target_ladder.audible_message("You hear something coming [direction] \the [src]") + + if(do_after(M, climb_time, src)) + climbLadder(M, target_ladder) + +/obj/structure/ladder/attack_ghost(var/mob/M) + var/target_ladder = getTargetLadder(M) + if(target_ladder) + M.forceMove(get_turf(target_ladder)) + +/obj/structure/ladder/proc/getTargetLadder(var/mob/M) + if((!target_up && !target_down) || (target_up && !istype(target_up.loc, /turf) || (target_down && !istype(target_down.loc,/turf)))) + to_chat(M, "\The [src] is incomplete and can't be climbed.") + return + if(target_down && target_up) + var/direction = alert(M,"Do you want to go up or down?", "Ladder", "Up", "Down", "Cancel") + + if(direction == "Cancel") return - var/turf/T = target.loc - for(var/atom/A in T) - if(A.density) - M << "\A [A] is blocking \the [src]." - return + if(!M.may_climb_ladders(src)) + return + + switch(direction) + if("Up") + return target_up + if("Down") + return target_down + else + return target_down || target_up + +/mob/proc/may_climb_ladders(var/ladder) + if(!Adjacent(ladder)) + to_chat(src, "You need to be next to \the [ladder] to start climbing.") + return FALSE + if(incapacitated()) + to_chat(src, "You are physically unable to climb \the [ladder].") + return FALSE + return TRUE + +/mob/observer/ghost/may_climb_ladders(var/ladder) + return TRUE + +/obj/structure/ladder/proc/climbLadder(var/mob/M, var/target_ladder) + var/turf/T = get_turf(target_ladder) + for(var/atom/A in T) + if(!A.CanPass(M, M.loc, 1.5, 0)) + to_chat(M, "\The [A] is blocking \the [src].") + return FALSE + return M.Move(T) + +/obj/structure/ladder/CanPass(obj/mover, turf/source, height, airflow) + return airflow || !density + +/obj/structure/ladder/update_icon() + icon_state = "ladder[!!(allowed_directions & UP)][!!(allowed_directions & DOWN)]" + +/obj/structure/ladder/up + allowed_directions = UP + icon_state = "ladder10" + +/obj/structure/ladder/updown + allowed_directions = UP|DOWN + icon_state = "ladder11" + + - M.visible_message("\A [M] climbs [icon_state == "ladderup" ? "up" : "down"] \a [src]!", - "You climb [icon_state == "ladderup" ? "up" : "down"] \the [src]!", - "You hear the grunting and clanging of a metal ladder being used.") - M.Move(T) - CanPass(obj/mover, turf/source, height, airflow) - return airflow || !density /obj/structure/stairs name = "Stairs" @@ -61,46 +134,50 @@ opacity = 0 anchored = 1 - initialize() - for(var/turf/turf in locs) - var/turf/simulated/open/above = GetAbove(turf) - if(!above) - warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])") - return qdel(src) - if(!istype(above)) - above.ChangeTurf(/turf/simulated/open) +/obj/structure/stairs/initialize() + for(var/turf/turf in locs) + var/turf/simulated/open/above = GetAbove(turf) + if(!above) + warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])") + return qdel(src) + if(!istype(above)) + above.ChangeTurf(/turf/simulated/open) - Uncross(atom/movable/A) - if(A.dir == dir) - // This is hackish but whatever. - var/turf/target = get_step(GetAbove(A), dir) - var/turf/source = A.loc - if(target.Enter(A, source)) - A.loc = target - target.Entered(A, source) - return 0 - return 1 +/obj/structure/stairs/Uncross(atom/movable/A) + if(A.dir == dir) + // This is hackish but whatever. + var/turf/target = get_step(GetAbove(A), dir) + var/turf/source = A.loc + if(target.Enter(A, source)) + A.loc = target + target.Entered(A, source) + if(isliving(A)) + var/mob/living/L = A + if(L.pulling) + L.pulling.forceMove(target) + return 0 + return 1 - CanPass(obj/mover, turf/source, height, airflow) - return airflow || !density +/obj/structure/stairs/CanPass(obj/mover, turf/source, height, airflow) + return airflow || !density - // type paths to make mapping easier. - north - dir = NORTH - bound_height = 64 - bound_y = -32 - pixel_y = -32 +// type paths to make mapping easier. +/obj/structure/stairs/north + dir = NORTH + bound_height = 64 + bound_y = -32 + pixel_y = -32 - south - dir = SOUTH - bound_height = 64 +/obj/structure/stairs/south + dir = SOUTH + bound_height = 64 - east - dir = EAST - bound_width = 64 - bound_x = -32 - pixel_x = -32 +/obj/structure/stairs/east + dir = EAST + bound_width = 64 + bound_x = -32 + pixel_x = -32 - west - dir = WEST - bound_width = 64 \ No newline at end of file +/obj/structure/stairs/west + dir = WEST + bound_width = 64 \ No newline at end of file diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm index d85a464af2..8389df7112 100644 --- a/code/modules/multiz/turf.dm +++ b/code/modules/multiz/turf.dm @@ -1,87 +1,79 @@ +/turf/proc/CanZPass(atom/A, direction) + if(z == A.z) //moving FROM this turf + return direction == UP //can't go below + else + if(direction == UP) //on a turf below, trying to enter + return 0 + if(direction == DOWN) //on a turf above, trying to enter + return !density + +/turf/simulated/open/CanZPass(atom, direction) + return 1 + +/turf/space/CanZPass(atom, direction) + return 1 + /turf/simulated/open name = "open space" icon = 'icons/turf/space.dmi' - icon_state = "black" - alpha = 16 + icon_state = "" layer = 0 density = 0 pathweight = 100000 //Seriously, don't try and path over this one numbnuts var/turf/below - var/list/underlay_references - var/global/overlay_map = list() + +/turf/simulated/open/post_change() + ..() + update() /turf/simulated/open/initialize() ..() - below = GetBelow(src) ASSERT(HasBelow(z)) + update() /turf/simulated/open/Entered(var/atom/movable/mover) - // only fall down in defined areas (read: areas with artificial gravitiy) - if(!istype(below)) //make sure that there is actually something below - below = GetBelow(src) - if(!below) - return + ..() + mover.fall() - // No gravity in space, apparently. - var/area/area = get_area(src) - if(area.name == "Space") - return - - // Prevent pipes from falling into the void... if there is a pipe to support it. - if(mover.anchored || istype(mover, /obj/item/pipe) && \ - (locate(/obj/structure/disposalpipe/up) in below) || \ - locate(/obj/machinery/atmospherics/pipe/zpipe/up in below)) - return - - // See if something prevents us from falling. - var/soft = 0 - for(var/atom/A in below) - if(A.density) - if(!istype(A, /obj/structure/window)) - return - else - var/obj/structure/window/W = A - if(W.is_fulltile()) - return - // Dont break here, since we still need to be sure that it isnt blocked - if(istype(A, /obj/structure/stairs)) - soft = 1 - - // We've made sure we can move, now. - mover.Move(below) - - if(!soft) - if(!istype(mover, /mob)) - if(istype(below, /turf/simulated/open)) - mover.visible_message("\The [mover] falls from the deck above through \the [below]!", "You hear a whoosh of displaced air.") - else - mover.visible_message("\The [mover] falls from the deck above and slams into \the [below]!", "You hear something slam into the deck.") - else - var/mob/M = mover - if(istype(below, /turf/simulated/open)) - below.visible_message("\The [mover] falls from the deck above through \the [below]!", "You hear a soft whoosh.[M.stat ? "" : ".. and some screaming."]") - else - M.visible_message("\The [mover] falls from the deck above and slams into \the [below]!", "You land on \the [below].", "You hear a soft whoosh and a crunch") - - // Handle people getting hurt, it's funny! - if (istype(mover, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = mover - var/damage = 5 - H.apply_damage(rand(0, damage), BRUTE, BP_HEAD) - H.apply_damage(rand(0, damage), BRUTE, BP_TORSO) - H.apply_damage(rand(0, damage), BRUTE, BP_L_LEG) - H.apply_damage(rand(0, damage), BRUTE, BP_R_LEG) - H.apply_damage(rand(0, damage), BRUTE, BP_L_ARM) - H.apply_damage(rand(0, damage), BRUTE, BP_R_ARM) - H.weakened = max(H.weakened,2) - H.updatehealth() +/turf/simulated/open/proc/update() + below = GetBelow(src) + turf_changed_event.register(below, src, /turf/simulated/open/update_icon) + var/turf/simulated/T = get_step(src,NORTH) + if(T) + turf_changed_event.register(T, src, /turf/simulated/open/update_icon) + levelupdate() + for(var/atom/movable/A in src) + A.fall() + update_icon() // override to make sure nothing is hidden /turf/simulated/open/levelupdate() for(var/obj/O in src) O.hide(0) +/turf/simulated/open/update_icon() + if(below) + underlays = list(image(icon = below.icon, icon_state = below.icon_state)) + underlays += below.overlays.Copy() + + var/list/noverlays = list() + if(!istype(below,/turf/space)) + noverlays += image(icon =icon, icon_state = "empty", layer = 2.2) + + var/turf/simulated/T = get_step(src,NORTH) + if(istype(T) && !istype(T,/turf/simulated/open)) + noverlays += image(icon ='icons/turf/cliff.dmi', icon_state = "metal", layer = 2.2) + + var/obj/structure/stairs/S = locate() in below + if(S && S.loc == below) + var/image/I = image(icon = S.icon, icon_state = "below", dir = S.dir, layer = 2.2) + I.pixel_x = S.pixel_x + I.pixel_y = S.pixel_y + noverlays += I + + overlays = noverlays + // Straight copy from space. /turf/simulated/open/attackby(obj/item/C as obj, mob/user as mob) if (istype(C, /obj/item/stack/rods)) @@ -108,4 +100,14 @@ return else user << "The plating is going to need some support." - return \ No newline at end of file + + //To lay cable. + if(istype(C, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = C + coil.turf_place(src, user) + return + return + +//Most things use is_plating to test if there is a cover tile on top (like regular floors) +/turf/simulated/open/is_plating() + return 1 \ No newline at end of file diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index c837f502dd..671d57e04e 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -129,12 +129,12 @@ var/list/possible_cable_coil_colours = list( /obj/structure/cable/hide(var/i) if(istype(loc, /turf)) invisibility = i ? 101 : 0 - updateicon() + update_icon() /obj/structure/cable/hides_under_flooring() return 1 -/obj/structure/cable/proc/updateicon() +/obj/structure/cable/update_icon() icon_state = "[d1]-[d2]" alpha = invisibility ? 127 : 255 @@ -635,102 +635,75 @@ obj/structure/cable/proc/cableColor(var/colorC) ////////////////////////////////////////////// // called when cable_coil is clicked on a turf/simulated/floor -/obj/item/stack/cable_coil/proc/turf_place(turf/simulated/floor/F, mob/user) +/obj/item/stack/cable_coil/proc/turf_place(turf/simulated/F, mob/user) if(!isturf(user.loc)) return if(get_amount() < 1) // Out of cable - user << "There is no cable left." + to_chat(user, "There is no cable left.") return if(get_dist(F,user) > 1) // Too far - user << "You can't lay cable at a place that far away." + to_chat(user, "You can't lay cable at a place that far away.") return if(!F.is_plating()) // Ff floor is intact, complain - user << "You can't lay cable there unless the floor tiles are removed." + to_chat(user, "You can't lay cable there unless the floor tiles are removed.") return + var/dirn + if(user.loc == F) + dirn = user.dir // if laying on the tile we're on, lay in the direction we're facing else - var/dirn + dirn = get_dir(F, user) - if(user.loc == F) - dirn = user.dir // if laying on the tile we're on, lay in the direction we're facing - else - dirn = get_dir(F, user) + var/end_dir = 0 + if(istype(F, /turf/simulated/open)) + if(!can_use(2)) + to_chat(user, "You don't have enough cable to do this!") + return + end_dir = DOWN - for(var/obj/structure/cable/LC in F) - if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0)) - user << "There's already a cable at that position." - return -///// Z-Level Stuff - // check if the target is open space - if(istype(F, /turf/simulated/open)) - for(var/obj/structure/cable/LC in F) - if((LC.d1 == dirn && LC.d2 == 11 ) || ( LC.d2 == dirn && LC.d1 == 11)) - user << "There's already a cable at that position." - return + for(var/obj/structure/cable/LC in F) + if((LC.d1 == dirn && LC.d2 == end_dir ) || ( LC.d2 == dirn && LC.d1 == end_dir)) + to_chat(user, "There's already a cable at that position.") + return - var/obj/structure/cable/C = new(F) - var/obj/structure/cable/D = new(GetBelow(F)) + put_cable(F, user, end_dir, dirn) + if(end_dir == DOWN) + put_cable(GetBelow(F), user, UP, 0) + to_chat(user, "You slide some cable downward.") - C.cableColor(color) +/obj/item/stack/cable_coil/proc/put_cable(turf/simulated/F, mob/user, d1, d2) + if(!istype(F)) + return - C.d1 = 11 - C.d2 = dirn - C.add_fingerprint(user) - C.updateicon() + var/obj/structure/cable/C = new(F) + C.cableColor(color) + C.d1 = d1 + C.d2 = d2 + C.add_fingerprint(user) + C.update_icon() - var/datum/powernet/PN = new() - PN.add_cable(C) + //create a new powernet with the cable, if needed it will be merged later + var/datum/powernet/PN = new() + PN.add_cable(C) - C.mergeConnectedNetworks(C.d2) - C.mergeConnectedNetworksOnTurf() + C.mergeConnectedNetworks(C.d1) //merge the powernets... + C.mergeConnectedNetworks(C.d2) //...in the two new cable directions + C.mergeConnectedNetworksOnTurf() - D.cableColor(color) + if(C.d1 & (C.d1 - 1))// if the cable is layed diagonally, check the others 2 possible directions + C.mergeDiagonalsNetworks(C.d1) - D.d1 = 12 - D.d2 = 0 - D.add_fingerprint(user) - D.updateicon() + if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions + C.mergeDiagonalsNetworks(C.d2) - PN.add_cable(D) - D.mergeConnectedNetworksOnTurf() - - // do the normal stuff - else -///// Z-Level Stuff - for(var/obj/structure/cable/LC in F) - if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0)) - user << "There's already a cable at that position." - return - - var/obj/structure/cable/C = new(F) - - C.cableColor(color) - - //set up the new cable - C.d1 = 0 //it's a O-X node cable - C.d2 = dirn - C.add_fingerprint(user) - C.updateicon() - - //create a new powernet with the cable, if needed it will be merged later - var/datum/powernet/PN = new() - PN.add_cable(C) - - C.mergeConnectedNetworks(C.d2) //merge the powernet with adjacents powernets - C.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets - - if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions - C.mergeDiagonalsNetworks(C.d2) - - - use(1) - if (C.shock(user, 50)) - if (prob(50)) //fail - new/obj/item/stack/cable_coil(C.loc, 1, C.color) - qdel(C) + use(1) + if (C.shock(user, 50)) + if (prob(50)) //fail + new/obj/item/stack/cable_coil(C.loc, 1, C.color) + qdel(C) // called when cable_coil is click on an installed obj/cable // or click on a turf that already contains a "node" cable @@ -745,10 +718,9 @@ obj/structure/cable/proc/cableColor(var/colorC) return if(get_dist(C, user) > 1) // make sure it's close enough - user << "You can't lay cable at a place that far away." + to_chat(user, "You can't lay cable at a place that far away.") return - if(U == T) //if clicked on the turf we're standing on, try to put a cable in the direction we're facing turf_place(T,user) return @@ -758,7 +730,7 @@ obj/structure/cable/proc/cableColor(var/colorC) // one end of the clicked cable is pointing towards us if(C.d1 == dirn || C.d2 == dirn) if(!U.is_plating()) // can't place a cable if the floor is complete - user << "You can't lay cable there unless the floor tiles are removed." + to_chat(user, "You can't lay cable there unless the floor tiles are removed.") return else // cable is pointing at us, we're standing on an open tile @@ -768,34 +740,9 @@ obj/structure/cable/proc/cableColor(var/colorC) for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already if(LC.d1 == fdirn || LC.d2 == fdirn) - user << "There's already a cable at that position." + to_chat(user, "There's already a cable at that position.") return - - var/obj/structure/cable/NC = new(U) - NC.cableColor(color) - - NC.d1 = 0 - NC.d2 = fdirn - NC.add_fingerprint() - NC.updateicon() - - //create a new powernet with the cable, if needed it will be merged later - var/datum/powernet/newPN = new() - newPN.add_cable(NC) - - NC.mergeConnectedNetworks(NC.d2) //merge the powernet with adjacents powernets - NC.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets - - if(NC.d2 & (NC.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions - NC.mergeDiagonalsNetworks(NC.d2) - - use(1) - - if (NC.shock(user, 50)) - if (prob(50)) //fail - new/obj/item/stack/cable_coil(NC.loc, 1, NC.color) - qdel(NC) - + put_cable(U,user,0,fdirn) return // exisiting cable doesn't point at our position, so see if it's a stub @@ -814,7 +761,7 @@ obj/structure/cable/proc/cableColor(var/colorC) if(LC == C) // skip the cable we're interacting with continue if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction - user << "There's already a cable at that position." + to_chat(user, "There's already a cable at that position.") return @@ -824,7 +771,7 @@ obj/structure/cable/proc/cableColor(var/colorC) C.d2 = nd2 C.add_fingerprint() - C.updateicon() + C.update_icon() C.mergeConnectedNetworks(C.d1) //merge the powernets... diff --git a/icons/obj/power_cond_white.dmi b/icons/obj/power_cond_white.dmi index 8d17183bfa41316444880ffbc9b2d3c2b8e54905..f9f3d9da7a6355a68c681e7b4dd250f2c22a0c5c 100644 GIT binary patch delta 267 zcmV+m0rdWfFDZ*Bkpc$|%tF>1p=5JhY4DF(ZC(9G;E za$`BHRDR{cW9C2DKYRJ?zWTGYr#{?=d71uxrAYj!L-m-h z>nKIsLNyN4_qe_u%X(P{DYB~%x(n5HninY&Lv@=kKf@wLbbrejU?N}=U@~ADz#IXi z^;<}RyaIUz@(Sb?$SaUnB5y#17ZfmjEF@LI)cya0woeC zgJl^k%Vb#t1~p{Rkw9+XFuH-`;G{%Oe!r8dIq8~{A~|Z3=EDZkf6!jKb1Uts4^K|F Rv0^vSj)MRIAhQ|)4=*VRb|nA+ delta 267 zcmV+m0rdW{V5wk`B!B99R9JLGWpiV4X>fFDZ*Bkpc$|%tu?~VT6h&wH6)!Stc+Zx= z(8XX3gZ={vC=6->jsCua3r?P~$w_<8(3{KQcxo@woLl!A=4E<5B#Pe^E_+XX8YRl! zTs98VZA{<8lDafVlufbKjm!FJUL=Zl*>&#j!y-|1%@|-jV1EK&O2AZrsR5(KUr0f` zf_Me-3gQ*SD~MMTZy?M-n1L_@VFtpCgn1zCfwTwG9!Ps49e_{(LIDT`B24M8J<76MI#+I9u$50uOC(nxb|-3L17u||Z0I$Qt% RAOJ~3K~#90?XxNY2QRB&a|Zwb diff --git a/icons/turf/cliff.dmi b/icons/turf/cliff.dmi new file mode 100644 index 0000000000000000000000000000000000000000..40e8885771cbc1657cb8206203e911119991cb38 GIT binary patch literal 750 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy9|C+rTt!4h!otEVEiHAlwQX!{ zBE!RNZEZb0JX~B{oSmJVoIwPLa)QuK4i5JA4j=+V*+Xc1Yiny8AhfmtVh{_=G&eIh zGcyMQAOU28IcCO2KwxYPq(B%*f}jZy1A&Q=kqJ=LL{Cp&AA*4-7;0$)fff*eDKJx8 zOHEx34AeoiIuNKSfq=3y2mxs&Ie9rC0D4eF6o^5DnVFfIx9mHh-x*7S{DK)Ap4~_T zax$wzB1&9Ri<65o3raHc^B5Q^<^+co6qSDe5?t`{>k}<+U9EFx&IfM@HMnT};E~RG zAI*~tMLoScER2JUFB^L)%y~5F$fOX3U`_L_Du(Wz-Nve$S4f;NfAYvj+v|*P>xQYK zF@IwY9AjcIza}Nu^dOQC=m2w17sn8b-nXZ2hc!8fusx8Sz^Y}`#J8fef&Ic7gJ3rS z{>-uo75}$qwk*xQ>3XN+qU-%xH~-J8=RG3%K#AEvbK1{m5e(B4^dsM$S=kWNl(_Sb zWMAqf)^$b)O55x|Hi~~@U3j89DNcafwd$yle#fGK2i-}Y0u>ViBHg+|^ri>8h6zlX zx~gTBsEW7O(yj?C5l16}3)e1tSjGHUI`nAN;&m5=9!njQm{oQ9!ff5kJ-XU?k-3L2 zo!url+xKt>@7+raFTcGRd;H~h>*jfvU*5fSZlT1j=G_Zx{~Nq$vX-*#n}6&|%9~v# zZeM&dcD>{ZKL7c|neWX%=lrl!OfgeEXv4vAm-$hpK-ZGSt|SIw`zP=c(B~De`h>_@y6ik>gTe~ HDWM4fQK%7+ literal 0 HcmV?d00001 diff --git a/icons/turf/space.dmi b/icons/turf/space.dmi index 30d0d1428a533d5de1e02cfa8d5f11a146eade1a..e11f256d8889d8d107c7a6345dc9adfcba1449d8 100644 GIT binary patch delta 16123 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 aIBvDlkAcFEBlAdzKLr^T>2j%epZ^~p{Q~O% diff --git a/maps/example/example-1.dmm b/maps/example/example-1.dmm new file mode 100644 index 0000000000..6c5d1ead2d --- /dev/null +++ b/maps/example/example-1.dmm @@ -0,0 +1,73 @@ +"a" = (/turf/space,/area/space) +"b" = (/turf/simulated/wall,/area/aisat) +"c" = (/obj/machinery/atmospherics/pipe/zpipe/up{tag = "icon-up (EAST)"; icon_state = "up"; dir = 4},/obj/structure/disposalpipe/up,/turf/simulated/floor/plating,/area/aisat) +"d" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"e" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"f" = (/obj/machinery/atmospherics/binary/pump/high_power{dir = 8},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"g" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"h" = (/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"i" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/aisat) +"j" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/aisat) +"k" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/meter,/turf/simulated/floor/tiled/dark,/area/aisat) +"l" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"m" = (/obj/machinery/atmospherics/pipe/manifold/visible{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/meter,/turf/simulated/floor/tiled/dark,/area/aisat) +"n" = (/turf/simulated/floor/tiled/dark,/area/aisat) +"o" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/aisat) +"p" = (/obj/machinery/portable_atmospherics/canister/empty,/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/aisat) +"q" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"r" = (/obj/machinery/atmospherics/binary/pump/high_power{tag = "icon-map_off (EAST)"; icon_state = "map_off"; dir = 4},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"s" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"t" = (/obj/structure/ladder/up,/turf/simulated/floor/tiled/dark,/area/aisat) +"u" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/aisat) +"v" = (/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/aisat) +"w" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{tag = "icon-pipe-t (NORTH)"; icon_state = "pipe-t"; dir = 1},/turf/simulated/floor/tiled/dark,/area/aisat) +"x" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/dark,/area/aisat) +"y" = (/obj/machinery/light_switch,/turf/simulated/wall,/area/aisat) +"z" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/dark,/area/aisat) +"A" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/dark,/area/aisat) +"B" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/standard,/obj/item/device/multitool,/turf/simulated/floor/tiled/dark,/area/aisat) +"C" = (/obj/machinery/light{dir = 1},/obj/structure/table/standard,/obj/item/weapon/storage/belt/utility/full,/turf/simulated/floor/tiled/dark,/area/aisat) +"D" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/standard,/obj/item/clothing/gloves/yellow,/turf/simulated/floor/tiled/dark,/area/aisat) +"E" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"F" = (/obj/effect/landmark{name = "JoinLate"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"G" = (/obj/effect/landmark/start,/turf/simulated/floor/tiled/dark,/area/aisat) +"H" = (/obj/structure/stairs/south,/turf/simulated/floor/tiled/dark,/area/aisat) +"I" = (/obj/effect/floor_decal/sign/a,/turf/simulated/floor/tiled/dark,/area/aisat) +"J" = (/obj/machinery/light,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) +"K" = (/obj/structure/cable/yellow,/obj/structure/cable/yellow{d1 = 16; d2 = 0; icon_state = "16-0"},/turf/simulated/floor/plating,/area/aisat) +"L" = (/turf/simulated/floor/tiled/red,/area/aisat) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaabbbbbbbbbbbbbbbaaaaaaaaa +aaaaaaaabcdefghihhhhhhbaaaaaaaaa +aaaaaaaabjhklmhnhhooohbaaaaaaaaa +aaaaaaaabphqrshthhooohbaaaaaaaaa +aaaaaaaabphhhhhnhhooohbaaaaaaaaa +aaaaaaaabuhhhhhnhhhhhhbaaaaaaaaa +aaaaaaaabuhhhhhvhhhhhhbaaaaaaaaa +aaaaaaaabwnnnnxyznnnnAbaaaaaaaaa +aaaaaaaabhhhhhBCDhhhhEbaaaaaaaaa +aaaaaaaabhhFFFhnhhhhhEbaaaaaaaaa +aaaaaaaabhhFFFhGhhhhhEbaaaaaaaaa +aaaaaaaabnbFFFhnhhhhhEbaaaaaaaaa +aaaaaaaabHbhhhhIhhhhhEbaaaaaaaaa +aaaaaaaabbbhJhhnhhJhhKbaaaaaaaaa +aaaaaaaabbbbbLLLLLbbbbbaaaaaaaaa +aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa +aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa +aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa +aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa +aaaaaaaaaaaabbbbbbbaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +"} diff --git a/maps/example/example-2.dmm b/maps/example/example-2.dmm new file mode 100644 index 0000000000..972beeecfc --- /dev/null +++ b/maps/example/example-2.dmm @@ -0,0 +1,69 @@ +"a" = (/turf/space,/area/space) +"b" = (/obj/effect/landmark/map_data{height = 2; step_x = 0},/turf/space,/area/space) +"c" = (/turf/simulated/wall,/area/aisat_interior) +"d" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/zpipe/down{tag = "icon-down (EAST)"; icon_state = "down"; dir = 4},/obj/structure/disposalpipe/down,/turf/simulated/open,/area/aisat_interior) +"e" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"f" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"g" = (/obj/machinery/atmospherics/binary/pump/high_power{dir = 8},/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"h" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"i" = (/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"j" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"k" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/aisat_interior) +"l" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/floor_decal/corner/lime/diagonal,/obj/machinery/meter,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"m" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"n" = (/obj/machinery/atmospherics/pipe/manifold/visible{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/effect/floor_decal/corner/lime/diagonal,/obj/machinery/meter,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"o" = (/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"p" = (/turf/simulated/open,/area/aisat_interior) +"q" = (/obj/machinery/portable_atmospherics/canister/empty,/obj/effect/floor_decal/corner/lime/diagonal,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"r" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"s" = (/obj/machinery/atmospherics/binary/pump/high_power{tag = "icon-map_off (EAST)"; icon_state = "map_off"; dir = 4},/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"t" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"u" = (/obj/structure/ladder,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"v" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/floor_decal/corner/lime/diagonal,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"w" = (/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"x" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{tag = "icon-pipe-t (NORTH)"; icon_state = "pipe-t"; dir = 1},/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"y" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"z" = (/obj/machinery/light_switch,/turf/simulated/wall,/area/aisat_interior) +"A" = (/obj/machinery/power/fractal_reactor,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"B" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"C" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"D" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"E" = (/turf/simulated/floor/tiled/red,/area/aisat_interior) +"F" = (/obj/effect/floor_decal/sign/two,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"G" = (/obj/machinery/light,/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) +"H" = (/obj/structure/lattice,/obj/structure/cable/yellow{d1 = 32; icon_state = "32-1"},/turf/simulated/open,/area/aisat_interior) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaabaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaacccccccccccccccaaaaaaaaa +aaaaaaaacdefghijiiiiiicaaaaaaaaa +aaaaaaaackilmnioiipppicaaaaaaaaa +aaaaaaaacqirstiuiipppicaaaaaaaaa +aaaaaaaacqiiiiioiipppicaaaaaaaaa +aaaaaaaacviiiiioiiiiiicaaaaaaaaa +aaaaaaaacviiiiiwiiiiiicaaaaaaaaa +aaaaaaaacxooooyzABBBBCcaaaaaaaaa +aaaaaaaaciiiiiijiiiiiDcaaaaaaaaa +aaaaaaaaciiiiiioiiiiiDcaaaaaaaaa +aaaaaaaaccciiiioiiiiiDcaaaaaaaaa +aaaaaaaacEciiiioiiiiiDcaaaaaaaaa +aaaaaaaacEciiiiFiiiiiDcaaaaaaaaa +aaaaaaaaciiiGiioiiGiiHcaaaaaaaaa +aaaaaaaacccccEEEEEcccccaaaaaaaaa +aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa +aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa +aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa +aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa +aaaaaaaaaaaacccccccaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +"} diff --git a/maps/example/example.dm b/maps/example/example.dm new file mode 100644 index 0000000000..d5e18ea366 --- /dev/null +++ b/maps/example/example.dm @@ -0,0 +1,14 @@ +#if !defined(USING_MAP_DATUM) + + #include "example-1.dmm" + #include "example-2.dmm" + + #include "example_defines.dm" + + #define USING_MAP_DATUM /datum/map/example + +#elif !defined(MAP_OVERRIDE) + + #warn A map has already been included, ignoring Northern Star + +#endif \ No newline at end of file diff --git a/maps/example/example_defines.dm b/maps/example/example_defines.dm new file mode 100644 index 0000000000..3c7ae5d30e --- /dev/null +++ b/maps/example/example_defines.dm @@ -0,0 +1,49 @@ +#define Z_LEVEL_FIRST_EXAMPLE 1 +#define Z_LEVEL_SECOND_EXAMPLE 2 + +/datum/map/example + name = "Test Map" + full_name = "The Test Map" + path = "example" + + lobby_icon = 'icons/misc/title.dmi' + lobby_screens = list("mockingjay00") + + station_levels = list( + Z_LEVEL_FIRST_EXAMPLE, + Z_LEVEL_SECOND_EXAMPLE + ) + + admin_levels = list() + contact_levels = list( + Z_LEVEL_FIRST_EXAMPLE, + Z_LEVEL_SECOND_EXAMPLE + ) + + player_levels = list( + Z_LEVEL_FIRST_EXAMPLE, + Z_LEVEL_SECOND_EXAMPLE + ) + + sealed_levels = list() + empty_levels = list() + accessible_z_levels = list("1" = 50, "2" = 50) // The defines can't be used here sadly. + base_turf_by_z = list("2" = /turf/simulated/open) + + station_name = "The Funhouse" + station_short = "Funhouse" + dock_name = "the Maximum Fun Chamber" + boss_name = "Mister Fun" + boss_short = "Mr. Fun" + company_name = "Fun Inc." + company_short = "FI" + starsys_name = "Vir" + + shuttle_docked_message = "The scheduled shuttle to the %dock_name% has docked with the station at docks one and two. It will depart in approximately %ETD%." + shuttle_leaving_dock = "The Crew Transfer Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%." + shuttle_called_message = "A crew transfer to %Dock_name% has been scheduled. The shuttle has been called. Those leaving should procede to docks one and two in approximately %ETA%" + shuttle_recall_message = "The scheduled crew transfer has been cancelled." + emergency_shuttle_docked_message = "The Emergency Shuttle has docked with the station at docks one and two. You have approximately %ETD% to board the Emergency Shuttle." + emergency_shuttle_leaving_dock = "The Emergency Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%." + emergency_shuttle_called_message = "An emergency evacuation shuttle has been called. It will arrive at docks one and two in approximately %ETA%" + emergency_shuttle_recall_message = "The emergency shuttle has been recalled." \ No newline at end of file diff --git a/maps/northern_star/northern_star.dm b/maps/northern_star/northern_star.dm index 90edaa6c73..2212774657 100644 --- a/maps/northern_star/northern_star.dm +++ b/maps/northern_star/northern_star.dm @@ -6,6 +6,8 @@ #include "polaris-4.dmm" #include "polaris-5.dmm" + #include "northern_star_defines.dm" + #define USING_MAP_DATUM /datum/map/northern_star #elif !defined(MAP_OVERRIDE) diff --git a/polaris.dme b/polaris.dme index e1dbe5ff98..45b45aaa9e 100644 --- a/polaris.dme +++ b/polaris.dme @@ -205,6 +205,7 @@ #include "code\datums\observation\moved.dm" #include "code\datums\observation\observation.dm" #include "code\datums\observation\task_triggered.dm" +#include "code\datums\observation\turf_changed.dm" #include "code\datums\observation\unequipped.dm" #include "code\datums\observation\~cleanup.dm" #include "code\datums\repositories\cameras.dm" @@ -2173,6 +2174,5 @@ #include "interface\interface.dm" #include "interface\skin.dmf" #include "maps\northern_star\northern_star.dm" -#include "maps\northern_star\northern_star_defines.dm" #include "maps\~map_system\maps.dm" // END_INCLUDE From d5438dc36d083b3212c10f57fa5df52b62d11450 Mon Sep 17 00:00:00 2001 From: Neerti Date: Fri, 3 Mar 2017 10:09:45 -0500 Subject: [PATCH 07/16] Fixes two bugs. --- code/datums/uplink/announcements.dm | 5 +++-- maps/example/example-2.dmm | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/datums/uplink/announcements.dm b/code/datums/uplink/announcements.dm index d97e15b7ee..2057a987ea 100644 --- a/code/datums/uplink/announcements.dm +++ b/code/datums/uplink/announcements.dm @@ -15,8 +15,9 @@ /datum/uplink_item/abstract/announcements/fake_centcom/New() ..() - name = "[command_name()] Update Announcement" - desc = "Causes a falsified [command_name()] Update. Triggers immediately after supplying additional data." + spawn(2) + name = "[command_name()] Update Announcement" + desc = "Causes a falsified [command_name()] Update. Triggers immediately after supplying additional data." /datum/uplink_item/abstract/announcements/fake_centcom/extra_args(var/mob/user) var/title = sanitize(input("Enter your announcement title.", "Announcement Title") as null|text) diff --git a/maps/example/example-2.dmm b/maps/example/example-2.dmm index 972beeecfc..f108e93b91 100644 --- a/maps/example/example-2.dmm +++ b/maps/example/example-2.dmm @@ -1,5 +1,5 @@ "a" = (/turf/space,/area/space) -"b" = (/obj/effect/landmark/map_data{height = 2; step_x = 0},/turf/space,/area/space) +"b" = (/obj/effect/landmark/map_data{height = 2},/turf/space,/area/space) "c" = (/turf/simulated/wall,/area/aisat_interior) "d" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/zpipe/down{tag = "icon-down (EAST)"; icon_state = "down"; dir = 4},/obj/structure/disposalpipe/down,/turf/simulated/open,/area/aisat_interior) "e" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/effect/floor_decal/corner/lime/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat_interior) From 8a48bb0ece755afb1dd5599e3be8a045551c5b9e Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 3 Mar 2017 19:07:40 -0500 Subject: [PATCH 08/16] Fix server startup runtimes from uninitaizlied using_map * That if statement wasn't heping anyone as it was. * Strangely however, even an `if(using_map)` doesn't help, as using_map is in some crazy BYOND limbo state at that point in world init. but checking istype() succeeds in figuring out its not real. --- code/_helpers/names.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_helpers/names.dm b/code/_helpers/names.dm index cea166b915..20f7b2b31d 100644 --- a/code/_helpers/names.dm +++ b/code/_helpers/names.dm @@ -16,7 +16,7 @@ var/church_name = null return name /proc/command_name() - if (using_map.boss_name) + if(istype(using_map)) return using_map.boss_name /proc/change_command_name(var/name) From 340a3931619f3a80d30183bbb27368a834eae4e4 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 1 Mar 2017 20:45:12 -0500 Subject: [PATCH 09/16] Extend Station Blueprints to consider outdoor mining areas as "space" * Allows constructing new rooms out of the asteroid! Previously blueprint couldn't because it wasn't technically "/area/space" * Also moved the list of what area types count as space or protected to variables so its not a list embedded in the middle of a proc... --- code/game/objects/items/blueprints.dm | 38 ++++++++++++++++----------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 4df7585d8b..0577fee4a7 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -19,6 +19,23 @@ var/const/ROOM_ERR_SPACE = -1 var/const/ROOM_ERR_TOOLARGE = -2 + var/static/list/SPACE_AREA_TYPES = list( + /area/space, + /area/mine + ) + var/static/list/SPECIAL_AREA_TYPES = list( + /area/shuttle, + /area/admin, + /area/arrival, + /area/centcom, + /area/asteroid, + /area/tdome, + /area/syndicate_station, + /area/wizard_station, + /area/prison + // /area/derelict //commented out, all hail derelict-rebuilders! + ) + /obj/item/blueprints/attack_self(mob/M as mob) if (!istype(M,/mob/living/carbon/human)) M << "This stack of blue paper means nothing to you." //monkeys cannot into projecting @@ -79,22 +96,11 @@ move an amendment to the drawing.

return A /obj/item/blueprints/proc/get_area_type(var/area/A = get_area()) - if(istype(A, /area/space)) - return AREA_SPACE - var/list/SPECIALS = list( - /area/shuttle, - /area/admin, - /area/arrival, - /area/centcom, - /area/asteroid, - /area/tdome, - /area/syndicate_station, - /area/wizard_station, - /area/prison - // /area/derelict //commented out, all hail derelict-rebuilders! - ) - for (var/type in SPECIALS) - if ( istype(A,type) ) + for(var/type in SPACE_AREA_TYPES) + if(istype(A, type)) + return AREA_SPACE + for (var/type in SPECIAL_AREA_TYPES) + if(istype(A, type)) return AREA_SPECIAL return AREA_STATION From 4533150c678073f4093383dd2a8ca2c3d8e938e4 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sat, 4 Mar 2017 01:33:29 -0500 Subject: [PATCH 10/16] Make cryo recursively remove mobs So if a mob is being held, like a Teshari, or anything else ~~like being eaten cough~~ then they are handled correctly by cryopods. Otherwise if someone scoops a Teshari, and cryos, they are simply deleted, their records stay in the round, their job slot is occupied indefinitely, etc. --- code/game/machinery/cryopod.dm | 52 ++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index e7fed68d5f..6441a5e72a 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -360,7 +360,7 @@ if(!find_control_computer(urgent=1)) return - despawn_occupant() + despawn_occupant(occupant) // This function can not be undone; do not call this unless you are sure // Also make sure there is a valid control computer @@ -384,10 +384,14 @@ // This function can not be undone; do not call this unless you are sure // Also make sure there is a valid control computer -/obj/machinery/cryopod/proc/despawn_occupant() +/obj/machinery/cryopod/proc/despawn_occupant(var/mob/to_despawn) + //Recursively despawn mobs + for(var/mob/M in to_despawn) + despawn_occupant(M) + //Drop all items into the pod. - for(var/obj/item/W in occupant) - occupant.drop_from_inventory(W) + for(var/obj/item/W in to_despawn) + to_despawn.drop_from_inventory(W) W.forceMove(src) if(W.contents.len) //Make sure we catch anything not handled by qdel() on the items. @@ -398,7 +402,7 @@ //Delete all items not on the preservation list. var/list/items = contents.Copy() - items -= occupant // Don't delete the occupant + items -= to_despawn // Don't delete the occupant items -= announce // or the autosay radio. for(var/obj/item/W in items) @@ -430,36 +434,37 @@ for(var/datum/objective/O in all_objectives) // We don't want revs to get objectives that aren't for heads of staff. Letting // them win or lose based on cryo is silly so we remove the objective. - if(O.target == occupant.mind) + if(O.target == to_despawn.mind) if(O.owner && O.owner.current) O.owner.current << "You get the feeling your target is no longer within your reach..." qdel(O) //Handle job slot/tater cleanup. - var/job = occupant.mind.assigned_role + var/job = to_despawn.mind.assigned_role job_master.FreeRole(job) - if(occupant.mind.objectives.len) - qdel(occupant.mind.objectives) - occupant.mind.special_role = null + if(to_despawn.mind.objectives.len) + qdel(to_despawn.mind.objectives) + to_despawn.mind.special_role = null + //else //if(ticker.mode.name == "AutoTraitor") //var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode - //current_mode.possible_traitors.Remove(occupant) + //current_mode.possible_traitors.Remove(to_despawn) // Delete them from datacore. if(PDA_Manifest.len) PDA_Manifest.Cut() for(var/datum/data/record/R in data_core.medical) - if((R.fields["name"] == occupant.real_name)) + if((R.fields["name"] == to_despawn.real_name)) qdel(R) for(var/datum/data/record/T in data_core.security) - if((T.fields["name"] == occupant.real_name)) + if((T.fields["name"] == to_despawn.real_name)) qdel(T) for(var/datum/data/record/G in data_core.general) - if((G.fields["name"] == occupant.real_name)) + if((G.fields["name"] == to_despawn.real_name)) qdel(G) icon_state = base_icon_state @@ -468,22 +473,21 @@ //Make an announcement and log the person entering storage. - control_computer.frozen_crew += "[occupant.real_name], [occupant.mind.role_alt_title] - [stationtime2text()]" - control_computer._admin_logs += "[key_name(occupant)] ([occupant.mind.role_alt_title]) at [stationtime2text()]" - log_and_message_admins("[key_name(occupant)] ([occupant.mind.role_alt_title]) entered cryostorage.") + control_computer.frozen_crew += "[to_despawn.real_name], [to_despawn.mind.role_alt_title] - [stationtime2text()]" + control_computer._admin_logs += "[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) at [stationtime2text()]" + log_and_message_admins("[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) entered cryostorage.") - announce.autosay("[occupant.real_name], [occupant.mind.role_alt_title], [on_store_message]", "[on_store_name]") - //visible_message("\The [initial(name)] hums and hisses as it moves [occupant.real_name] into storage.", 3) - visible_message("\The [initial(name)] [on_store_visible_message_1] [occupant.real_name] [on_store_visible_message_2].", 3) + announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]") + //visible_message("\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.", 3) + visible_message("\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2].", 3) //This should guarantee that ghosts don't spawn. - occupant.ckey = null + to_despawn.ckey = null // Delete the mob. - qdel(occupant) + qdel(to_despawn) set_occupant(null) - /obj/machinery/cryopod/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) if(istype(G, /obj/item/weapon/grab)) @@ -504,7 +508,7 @@ if(M.client) if(alert(M,"Would you like to enter long-term storage?",,"Yes","No") == "Yes") - if(!M || !grab || !grab:affecting) return + if(!M || !grab || !grab.affecting) return willing = 1 else willing = 1 From 411bd2b05b4648ffe661700d483831848ae75235 Mon Sep 17 00:00:00 2001 From: Neerti Date: Sat, 4 Mar 2017 21:16:27 -0500 Subject: [PATCH 11/16] Ports Turbolifts from Bay. --- code/controllers/master_controller.dm | 7 + code/modules/materials/materials.dm | 6 + code/modules/shuttles/shuttle_emergency.dm | 2 +- code/modules/turbolift/_turbolift.dm | 12 ++ code/modules/turbolift/turbolift.dm | 122 +++++++++++ code/modules/turbolift/turbolift_areas.dm | 11 + code/modules/turbolift/turbolift_console.dm | 155 +++++++++++++ code/modules/turbolift/turbolift_door.dm | 44 ++++ code/modules/turbolift/turbolift_floor.dm | 33 +++ code/modules/turbolift/turbolift_map.dm | 228 ++++++++++++++++++++ code/modules/turbolift/turbolift_process.dm | 35 +++ code/modules/turbolift/turbolift_turfs.dm | 2 + icons/obj/doors/doorlift.dmi | Bin 0 -> 12345 bytes icons/obj/turbolift.dmi | Bin 0 -> 696 bytes icons/obj/turbolift_preview_3x3.dmi | Bin 0 -> 26009 bytes icons/obj/turbolift_preview_5x5.dmi | Bin 0 -> 38472 bytes maps/example/example-1.dmm | 5 +- maps/example/example-2.dmm | 4 +- maps/example/example.dm | 2 + maps/example/example_areas.dm | 13 ++ maps/example/example_elevator.dm | 11 + polaris.dme | 9 + 22 files changed, 696 insertions(+), 5 deletions(-) create mode 100644 code/modules/turbolift/_turbolift.dm create mode 100644 code/modules/turbolift/turbolift.dm create mode 100644 code/modules/turbolift/turbolift_areas.dm create mode 100644 code/modules/turbolift/turbolift_console.dm create mode 100644 code/modules/turbolift/turbolift_door.dm create mode 100644 code/modules/turbolift/turbolift_floor.dm create mode 100644 code/modules/turbolift/turbolift_map.dm create mode 100644 code/modules/turbolift/turbolift_process.dm create mode 100644 code/modules/turbolift/turbolift_turfs.dm create mode 100644 icons/obj/doors/doorlift.dmi create mode 100644 icons/obj/turbolift.dmi create mode 100644 icons/obj/turbolift_preview_3x3.dmi create mode 100644 icons/obj/turbolift_preview_5x5.dmi create mode 100644 maps/example/example_areas.dm create mode 100644 maps/example/example_elevator.dm diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 682b0fb3d0..62209a1014 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -76,5 +76,12 @@ datum/controller/game_controller/proc/setup_objects() //Set up spawn points. populate_spawn_points() + admin_notice("Initializing turbolifts", R_DEBUG) + for(var/thing in turbolifts) + if(!deleted(thing)) + var/obj/turbolift_map_holder/lift = thing + lift.initialize() + sleep(-1) + admin_notice("Initializations complete.", R_DEBUG) sleep(-1) diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index fb3af28015..e032ae4893 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -586,6 +586,12 @@ var/list/name_to_material hardness = 500 weight = 500 +// Likewise. +/material/alienalloy/elevatorium + name = "elevatorium" + display_name = "elevator panelling" + icon_colour = "#666666" + /material/wood name = "wood" stack_type = /obj/item/stack/material/wood diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index 3238d9b2f4..bd2eaaa770 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -31,7 +31,7 @@ if (emergency_shuttle.evac) priority_announcement.Announce(replacetext(replacetext(using_map.emergency_shuttle_leaving_dock, "%dock_name%", "[using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s")) else - priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_leaving_dock, "%dock_name%", "[using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s")) + priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_leaving_dock, "%dock_name%", "[using_map.dock_name]"), "%ETA%", "[estimated_time] minute\s")) /datum/shuttle/ferry/emergency/can_launch(var/user) if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) diff --git a/code/modules/turbolift/_turbolift.dm b/code/modules/turbolift/_turbolift.dm new file mode 100644 index 0000000000..088bf39c8c --- /dev/null +++ b/code/modules/turbolift/_turbolift.dm @@ -0,0 +1,12 @@ +/* + * Turbolifts! Sort of like multishuttles-lite. + * + * How-to: Map /obj/turbolift_map_holder in at the bottom of the shaft, give it a depth + * value equivalent to the number of floors it should span (inclusive of the first), + * and at runtime it will update the map, set areas and create control panels and + * wifi-set doors appropriate to itself. You will save time at init if you map the + * elevator shaft in properly before runtime, but ultimately you're just avoiding a + * bunch of ChangeTurf() calls. + */ + +var/list/turbolifts = list() \ No newline at end of file diff --git a/code/modules/turbolift/turbolift.dm b/code/modules/turbolift/turbolift.dm new file mode 100644 index 0000000000..7d2f3c11a8 --- /dev/null +++ b/code/modules/turbolift/turbolift.dm @@ -0,0 +1,122 @@ +// Lift master datum. One per turbolift. +/datum/turbolift + var/datum/turbolift_floor/target_floor // Where are we going? + var/datum/turbolift_floor/current_floor // Where is the lift currently? + var/list/doors = list() // Doors inside the lift structure. + var/list/queued_floors = list() // Where are we moving to next? + var/list/floors = list() // All floors in this system. + var/move_delay = 30 // Time between floor changes. + var/floor_wait_delay = 85 // Time to wait at floor stops. + var/obj/structure/lift/panel/control_panel_interior // Lift control panel. + var/doors_closing = 0 // Whether doors are in the process of closing + + var/tmp/moving_upwards + var/tmp/busy + +/datum/turbolift/proc/emergency_stop() + queued_floors.Cut() + target_floor = null + open_doors() + +/datum/turbolift/proc/doors_are_open(var/datum/turbolift_floor/use_floor = current_floor) + for(var/obj/machinery/door/airlock/door in (use_floor ? (doors + use_floor.doors) : doors)) + if(!door.density) + return 1 + return 0 + +/datum/turbolift/proc/open_doors(var/datum/turbolift_floor/use_floor = current_floor) + for(var/obj/machinery/door/airlock/door in (use_floor ? (doors + use_floor.doors) : doors)) + //door.command("open") + spawn(0) + door.open() + return + +/datum/turbolift/proc/close_doors(var/datum/turbolift_floor/use_floor = current_floor) + for(var/obj/machinery/door/airlock/door in (use_floor ? (doors + use_floor.doors) : doors)) + //door.command("close") + spawn(0) + door.close() + return + +/datum/turbolift/proc/do_move() + + var/current_floor_index = floors.Find(current_floor) + + if(!target_floor) + if(!queued_floors || !queued_floors.len) + return 0 + target_floor = queued_floors[1] + queued_floors -= target_floor + if(current_floor_index < floors.Find(target_floor)) + moving_upwards = 1 + else + moving_upwards = 0 + + if(doors_are_open()) + if(!doors_closing) + close_doors() + doors_closing = 1 + return 1 + else // We failed to close the doors - probably, someone is blocking them; stop trying to move + doors_closing = 0 + open_doors() + control_panel_interior.audible_message("\The [current_floor.ext_panel] buzzes loudly.") + playsound(control_panel_interior.loc, "sound/machines/buzz-two.ogg", 50, 1) + return 0 + + doors_closing = 0 // The doors weren't open, so they are done closing + + var/area/turbolift/origin = locate(current_floor.area_ref) + + if(target_floor == current_floor) + + playsound(control_panel_interior.loc, origin.arrival_sound, 50, 1) + target_floor.arrived(src) + target_floor = null + + sleep(15) + control_panel_interior.visible_message("The elevator announces, \"[origin.lift_announce_str]\"") + sleep(floor_wait_delay) + + return 1 + + // Work out where we're headed. + var/datum/turbolift_floor/next_floor + if(moving_upwards) + next_floor = floors[current_floor_index+1] + else + next_floor = floors[current_floor_index-1] + + var/area/turbolift/destination = locate(next_floor.area_ref) + + if(!istype(origin) || !istype(destination) || (origin == destination)) + return 0 + + for(var/turf/T in destination) + for(var/atom/movable/AM in T) + if(istype(AM, /mob/living)) + var/mob/living/M = AM + M.gib() + else if(AM.simulated) + qdel(AM) + + origin.move_contents_to(destination) + + if((locate(/obj/machinery/power) in destination) || (locate(/obj/structure/cable) in destination)) + makepowernets() + + current_floor = next_floor + control_panel_interior.visible_message("The elevator [moving_upwards ? "rises" : "descends"] smoothly.") + + return 1 + +/datum/turbolift/proc/queue_move_to(var/datum/turbolift_floor/floor) + if(!floor || !(floor in floors) || (floor in queued_floors)) + return // STOP PRESSING THE BUTTON. + floor.pending_move(src) + queued_floors |= floor + turbolift_controller.lift_is_moving(src) + +// TODO: dummy machine ('lift mechanism') in powered area for functionality/blackout checks. +/datum/turbolift/proc/is_functional() + return 1 \ No newline at end of file diff --git a/code/modules/turbolift/turbolift_areas.dm b/code/modules/turbolift/turbolift_areas.dm new file mode 100644 index 0000000000..dbf568aec2 --- /dev/null +++ b/code/modules/turbolift/turbolift_areas.dm @@ -0,0 +1,11 @@ +// Used for creating the exchange areas. +/area/turbolift + name = "Turbolift" + base_turf = /turf/simulated/open + requires_power = 0 + sound_env = SMALL_ENCLOSED + + var/lift_floor_label = null + var/lift_floor_name = null + var/lift_announce_str = "Ding!" + var/arrival_sound = 'sound/machines/ding.ogg' diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm new file mode 100644 index 0000000000..4cbee6a773 --- /dev/null +++ b/code/modules/turbolift/turbolift_console.dm @@ -0,0 +1,155 @@ +// Base type, do not use. +/obj/structure/lift + name = "turbolift control component" + icon = 'icons/obj/turbolift.dmi' + anchored = 1 + density = 0 + layer = 4 + + var/datum/turbolift/lift + +/obj/structure/lift/set_dir(var/newdir) + . = ..() + pixel_x = 0 + pixel_y = 0 + if(dir & NORTH) + pixel_y = -32 + else if(dir & SOUTH) + pixel_y = 32 + else if(dir & EAST) + pixel_x = -32 + else if(dir & WEST) + pixel_x = 32 + +/obj/structure/lift/proc/pressed(var/mob/user) + if(!istype(user, /mob/living/silicon)) + if(user.a_intent == I_HURT) + user.visible_message("\The [user] hammers on the lift button!") + else + user.visible_message("\The [user] presses the lift button.") + + +/obj/structure/lift/New(var/newloc, var/datum/turbolift/_lift) + lift = _lift + return ..(newloc) + +/obj/structure/lift/attack_ai(var/mob/user) + return attack_hand(user) + +/obj/structure/lift/attack_generic(var/mob/user) + return attack_hand(user) + +/obj/structure/lift/attack_hand(var/mob/user) + return interact(user) + +/obj/structure/lift/interact(var/mob/user) + if(!lift.is_functional()) + return 0 + return 1 +// End base. + +// Button. No HTML interface, just calls the associated lift to its floor. +/obj/structure/lift/button + name = "elevator button" + desc = "A call button for an elevator. Be sure to hit it three hundred times." + icon_state = "button" + var/light_up = FALSE + var/datum/turbolift_floor/floor + +/obj/structure/lift/button/Destroy() + if(floor && floor.ext_panel == src) + floor.ext_panel = null + floor = null + return ..() + +/obj/structure/lift/button/proc/reset() + light_up = FALSE + update_icon() + +/obj/structure/lift/button/interact(var/mob/user) + if(!..()) + return + light_up() + pressed(user) + if(floor == lift.current_floor) + lift.open_doors() + spawn(3) + reset() + return + lift.queue_move_to(floor) + +/obj/structure/lift/button/proc/light_up() + light_up = TRUE + update_icon() + +/obj/structure/lift/button/update_icon() + if(light_up) + icon_state = "button_lit" + else + icon_state = initial(icon_state) + +// End button. + +// Panel. Lists floors (HTML), moves with the elevator, schedules a move to a given floor. +/obj/structure/lift/panel + name = "elevator control panel" + icon_state = "panel" + + +/obj/structure/lift/panel/attack_ghost(var/mob/user) + return interact(user) + +/obj/structure/lift/panel/interact(var/mob/user) + if(!..()) + return + + var/dat = list() + dat += "
Lift panel
" + + //the floors list stores levels in order of increasing Z + //therefore, to display upper levels at the top of the menu and + //lower levels at the bottom, we need to go through the list in reverse + for(var/i in lift.floors.len to 1 step -1) + var/datum/turbolift_floor/floor = lift.floors[i] + var/label = floor.label? floor.label : "Level #[i]" + dat += "" + dat += "[label]: [floor.name]
" + + dat += "
" + if(lift.doors_are_open()) + dat += "Close Doors
" + else + dat += "Open Doors
" + dat += "Emergency Stop" + dat += "
" + + var/datum/browser/popup = new(user, "turbolift_panel", "Lift Panel", 230, 260) + popup.set_content(jointext(dat, null)) + popup.open() + return + +/obj/structure/lift/panel/Topic(href, href_list) + . = ..() + if(.) + return + + var/panel_interact + if(href_list["move_to_floor"]) + lift.queue_move_to(locate(href_list["move_to_floor"])) + panel_interact = 1 + if(href_list["open_doors"]) + panel_interact = 1 + lift.open_doors() + if(href_list["close_doors"]) + panel_interact = 1 + lift.close_doors() + if(href_list["emergency_stop"]) + panel_interact = 1 + lift.emergency_stop() + + if(panel_interact) + pressed(usr) + + return 0 + +// End panel. \ No newline at end of file diff --git a/code/modules/turbolift/turbolift_door.dm b/code/modules/turbolift/turbolift_door.dm new file mode 100644 index 0000000000..79bf1d0c51 --- /dev/null +++ b/code/modules/turbolift/turbolift_door.dm @@ -0,0 +1,44 @@ +/obj/machinery/door/airlock/lift + name = "Elevator Door" + desc = "Ding." + req_access = list(access_maint_tunnels) + opacity = 0 + autoclose = 0 + glass = 1 + icon = 'icons/obj/doors/doorlift.dmi' + + var/datum/turbolift/lift + var/datum/turbolift_floor/floor + +/obj/machinery/door/airlock/lift/Destroy() + if(lift) + lift.doors -= src + if(floor) + floor.doors -= src + return ..() + +/obj/machinery/door/airlock/lift/bumpopen(var/mob/user) + return // No accidental sprinting into open elevator shafts. + +/obj/machinery/door/airlock/lift/allowed(mob/M) + return FALSE //only the lift machinery is allowed to operate this door + +/obj/machinery/door/airlock/lift/close(var/forced=0) + for(var/turf/turf in locs) + for(var/mob/living/LM in turf) + if(LM.mob_size <= MOB_TINY) + var/moved = 0 + for(dir in shuffle(cardinal.Copy())) + var/dest = get_step(LM,dir) + if(!(locate(/obj/machinery/door/airlock/lift) in dest)) + if(LM.Move(dest)) + moved = 1 + LM.visible_message("\The [LM] scurries away from the closing doors.") + break + if(!moved) // nowhere to go.... + LM.gib() + else // the mob is too big to just move, so we need to give up what we're doing + audible_message("\The [src]'s motors grind as they quickly reverse direction, unable to safely close.") + cur_command = null // the door will just keep trying otherwise + return 0 + return ..() \ No newline at end of file diff --git a/code/modules/turbolift/turbolift_floor.dm b/code/modules/turbolift/turbolift_floor.dm new file mode 100644 index 0000000000..7761f09284 --- /dev/null +++ b/code/modules/turbolift/turbolift_floor.dm @@ -0,0 +1,33 @@ +// Simple holder for each floor in the lift. +/datum/turbolift_floor + var/area_ref + var/label + var/name + var/announce_str + var/arrival_sound + + var/list/doors = list() + var/obj/structure/lift/button/ext_panel + +/datum/turbolift_floor/proc/set_area_ref(var/ref) + var/area/turbolift/A = locate(ref) + if(!istype(A)) + log_debug("Turbolift floor area was of the wrong type: ref=[ref]") + return + + area_ref = ref + label = A.lift_floor_label + name = A.lift_floor_name ? A.lift_floor_name : A.name + announce_str = A.lift_announce_str + arrival_sound = A.arrival_sound + +//called when a lift has queued this floor as a destination +/datum/turbolift_floor/proc/pending_move(var/datum/turbolift/lift) + if(ext_panel) + ext_panel.light_up() + +//called when a lift arrives at this floor +/datum/turbolift_floor/proc/arrived(var/datum/turbolift/lift) + lift.open_doors(src) + if(ext_panel) + ext_panel.reset() \ No newline at end of file diff --git a/code/modules/turbolift/turbolift_map.dm b/code/modules/turbolift/turbolift_map.dm new file mode 100644 index 0000000000..2e2498f88d --- /dev/null +++ b/code/modules/turbolift/turbolift_map.dm @@ -0,0 +1,228 @@ +// Map object. +/obj/turbolift_map_holder + name = "turbolift map placeholder" + icon = 'icons/obj/turbolift_preview_3x3.dmi' + dir = SOUTH // Direction of the holder determines the placement of the lift control panel and doors. + var/depth = 1 // Number of floors to generate, including the initial floor. + var/lift_size_x = 2 // Number of turfs on each axis to generate in addition to the first + var/lift_size_y = 2 // ie. a 3x3 lift would have a value of 2 in each of these variables. + + // Various turf and door types used when generating the turbolift floors. + var/wall_type = /turf/simulated/wall/elevator + var/floor_type = /turf/simulated/floor/tiled/dark + var/door_type = /obj/machinery/door/airlock/lift + + var/list/areas_to_use = list() + +/obj/turbolift_map_holder/Destroy() + turbolifts -= src + return ..() + +/obj/turbolift_map_holder/New() + turbolifts += src + ..() + +/obj/turbolift_map_holder/initialize() + + // Create our system controller. + var/datum/turbolift/lift = new() + + // Holder values since we're moving this object to null ASAP. + var/ux = x + var/uy = y + var/uz = z + var/udir = dir + forceMove(null) + + // These modifiers are used in relation to the origin + // to place the system control panels and doors. + var/int_panel_x + var/int_panel_y + var/ext_panel_x + var/ext_panel_y + var/door_x1 + var/door_y1 + var/door_x2 + var/door_y2 + var/light_x1 + var/light_x2 + var/light_y1 + var/light_y2 + + var/az = 1 + var/ex = (ux+lift_size_x) + var/ey = (uy+lift_size_y) + var/ez = (uz+(depth-1)) + + switch(dir) + + if(NORTH) + + int_panel_x = ux + Floor(lift_size_x/2) + int_panel_y = uy + 1 + ext_panel_x = ux + ext_panel_y = ey + 2 + + door_x1 = ux + 1 + door_y1 = ey + door_x2 = ex - 1 + door_y2 = ey + 1 + + light_x1 = ux + 1 + light_y1 = uy + 1 + light_x2 = ux + lift_size_x - 1 + light_y2 = uy + 1 + + if(SOUTH) + + int_panel_x = ux + Floor(lift_size_x/2) + int_panel_y = ey - 1 + ext_panel_x = ex + ext_panel_y = uy - 2 + + door_x1 = ux + 1 + door_y1 = uy - 1 + door_x2 = ex - 1 + door_y2 = uy + + light_x1 = ux + 1 + light_y1 = uy + 2 + light_x2 = ux + lift_size_x - 1 + light_y2 = uy + lift_size_y - 1 + + if(EAST) + + int_panel_x = ux+1 + int_panel_y = uy + Floor(lift_size_y/2) + ext_panel_x = ex+2 + ext_panel_y = ey + + door_x1 = ex + door_y1 = uy + 1 + door_x2 = ex + 1 + door_y2 = ey - 1 + + light_x1 = ux + 1 + light_y1 = uy + 1 + light_x2 = ux + 1 + light_y2 = uy + lift_size_x - 1 + + if(WEST) + + int_panel_x = ex-1 + int_panel_y = uy + Floor(lift_size_y/2) + ext_panel_x = ux-2 + ext_panel_y = uy + + door_x1 = ux - 1 + door_y1 = uy + 1 + door_x2 = ux + door_y2 = ey - 1 + + light_x1 = ux + lift_size_x - 1 + light_y1 = uy + 1 + light_x2 = ux + lift_size_x - 1 + light_y2 = uy + lift_size_y - 1 + + // Generate each floor and store it in the controller datum. + for(var/cz = uz;cz<=ez;cz++) + + var/datum/turbolift_floor/cfloor = new() + lift.floors += cfloor + + var/list/floor_turfs = list() + // Update the appropriate turfs. + for(var/tx = ux to ex) + for(var/ty = uy to ey) + + var/turf/checking = locate(tx,ty,cz) + + if(!istype(checking)) + log_debug("[name] cannot find a component turf at [tx],[ty] on floor [cz]. Aborting.") + qdel(src) + return + + // Update path appropriately if needed. + var/swap_to = /turf/simulated/open + if(cz == uz) // Elevator. + if((tx == ux || ty == uy || tx == ex || ty == ey) && !(tx >= door_x1 && tx <= door_x2 && ty >= door_y1 && ty <= door_y2)) + swap_to = wall_type + else + swap_to = floor_type + + if(checking.type != swap_to) + checking.ChangeTurf(swap_to) + // Let's make absolutely sure that we have the right turf. + checking = locate(tx,ty,cz) + + // Clear out contents. + for(var/atom/movable/thing in checking.contents) + if(thing.simulated) + qdel(thing) + + if(tx >= ux && tx <= ex && ty >= uy && ty <= ey) + floor_turfs += checking + + // Place exterior doors. + for(var/tx = door_x1 to door_x2) + for(var/ty = door_y1 to door_y2) + var/turf/checking = locate(tx,ty,cz) + var/internal = 1 + if(!(checking in floor_turfs)) + internal = 0 + if(checking.type != floor_type) + checking.ChangeTurf(floor_type) + checking = locate(tx,ty,cz) + for(var/atom/movable/thing in checking.contents) + if(thing.simulated) + qdel(thing) + if(checking.type == floor_type) // Don't build over empty space on lower levels. + var/obj/machinery/door/airlock/lift/newdoor = new door_type(checking) + if(internal) + lift.doors += newdoor + newdoor.lift = cfloor + else + cfloor.doors += newdoor + newdoor.floor = cfloor + + // Place exterior control panel. + var/turf/placing = locate(ext_panel_x, ext_panel_y, cz) + var/obj/structure/lift/button/panel_ext = new(placing, lift) + panel_ext.floor = cfloor + panel_ext.set_dir(udir) + cfloor.ext_panel = panel_ext + + // Place lights + var/turf/placing1 = locate(light_x1, light_y1, cz) + var/turf/placing2 = locate(light_x2, light_y2, cz) + var/obj/machinery/light/light1 = new(placing1, light) + var/obj/machinery/light/light2 = new(placing2, light) + if(udir == NORTH || udir == SOUTH) + light1.set_dir(WEST) + light2.set_dir(EAST) + else + light1.set_dir(SOUTH) + light2.set_dir(NORTH) + + // Update area. + if(az > areas_to_use.len) + log_debug("Insufficient defined areas in turbolift datum, aborting.") + qdel(src) + return + + var/area_path = areas_to_use[az] + for(var/thing in floor_turfs) + new area_path(thing) + var/area/A = locate(area_path) + cfloor.set_area_ref("\ref[A]") + az++ + + // Place lift panel. + var/turf/T = locate(int_panel_x, int_panel_y, uz) + lift.control_panel_interior = new(T, lift) + lift.control_panel_interior.set_dir(udir) + lift.current_floor = lift.floors[uz] + + lift.open_doors() + + qdel(src) // We're done. diff --git a/code/modules/turbolift/turbolift_process.dm b/code/modules/turbolift/turbolift_process.dm new file mode 100644 index 0000000000..83ce1b9faf --- /dev/null +++ b/code/modules/turbolift/turbolift_process.dm @@ -0,0 +1,35 @@ +var/datum/controller/process/turbolift/turbolift_controller + +/datum/controller/process/turbolift + var/list/moving_lifts = list() + +/datum/controller/process/turbolift/New() + ..() + turbolift_controller = src + +/datum/controller/process/turbolift/setup() + name = "turbolift controller" + schedule_interval = 10 + +/datum/controller/process/turbolift/doWork() + for(var/liftref in moving_lifts) + if(world.time < moving_lifts[liftref]) + continue + var/datum/turbolift/lift = locate(liftref) + if(lift.busy) + continue + spawn(0) + lift.busy = 1 + if(!lift.do_move()) + moving_lifts[liftref] = null + moving_lifts -= liftref + if(lift.target_floor) + lift.target_floor.ext_panel.reset() + lift.target_floor = null + else + lift_is_moving(lift) + lift.busy = 0 + SCHECK + +/datum/controller/process/turbolift/proc/lift_is_moving(var/datum/turbolift/lift) + moving_lifts["\ref[lift]"] = world.time + lift.move_delay diff --git a/code/modules/turbolift/turbolift_turfs.dm b/code/modules/turbolift/turbolift_turfs.dm new file mode 100644 index 0000000000..632160efaa --- /dev/null +++ b/code/modules/turbolift/turbolift_turfs.dm @@ -0,0 +1,2 @@ +/turf/simulated/wall/elevator/New(var/newloc) + ..(newloc,"elevatorium") diff --git a/icons/obj/doors/doorlift.dmi b/icons/obj/doors/doorlift.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5617a988f7877ee7c2ca53d9558c670636b4cbcd GIT binary patch literal 12345 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 literal 0 HcmV?d00001 diff --git a/icons/obj/turbolift.dmi b/icons/obj/turbolift.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cffc8aa140cd99b8022154b2578e8f05b43f488f GIT binary patch literal 696 zcmV;p0!RIcP)>7Hbaq9LlU4u!itN*I-MC_C`UeOA0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DXFxiBtK7yi!&v&s2HS+i!-e#F*g;&HbhqzpOaZaP-#J8UTO|5 zRmuvkelB2#0ssx^GC*?RWHtZ*0mVr~K~z|U?Uq4qgD?<9iBC{iBwKp|F>AO1;so3v zS+whV(R9tGJ$4P4NSQ%4XeuR&{8>bi%x66R*_tGIS*35h_jjOp23cM4N+1RT1Wc0d zCt%Pv$e+u;cqkRFIm6wpBdg@mpE=mG{L1<^nbM&a0K@b7ovRP}C|x-pI64WXtLFnpC!sXX2Tm_|g>5#VaBNeY z52Bt@yWxuBpe0f($uZcQlVTZUaQ$Rf0Ne_gTi6@s7BVRBE6CuM?3i)j0uqNF^+2V! zWXFut?Cu2&4oyKBbGe)+gZ=5G^}PWG$5w#0p!(jJ$x|G(E=y#9z@a3nao^IFXN3$< z$@DBJ4Mxuf#{MA{1i(>0<(EE7xA>#~CKUw030DvRClDhA2P*&)1!tr9$CrS!)qs12 eu`kgmmi_>iGlog1Gw_c90000>c literal 0 HcmV?d00001 diff --git a/icons/obj/turbolift_preview_3x3.dmi b/icons/obj/turbolift_preview_3x3.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f0f1ec491e17c79f11abc4edfb7d1a0150d3352b GIT binary patch literal 26009 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 literal 0 HcmV?d00001 diff --git a/icons/obj/turbolift_preview_5x5.dmi b/icons/obj/turbolift_preview_5x5.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e054a6b9aacc0635c8288ae7da2c4b9d3bb36f9a GIT binary patch literal 38472 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�cwrsGDB4d0LrSxPvWLTt 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 J>%@(M{tImI!0iA4 literal 0 HcmV?d00001 diff --git a/maps/example/example-1.dmm b/maps/example/example-1.dmm index 6c5d1ead2d..26c7e4bd46 100644 --- a/maps/example/example-1.dmm +++ b/maps/example/example-1.dmm @@ -36,6 +36,7 @@ "J" = (/obj/machinery/light,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled/dark,/area/aisat) "K" = (/obj/structure/cable/yellow,/obj/structure/cable/yellow{d1 = 16; d2 = 0; icon_state = "16-0"},/turf/simulated/floor/plating,/area/aisat) "L" = (/turf/simulated/floor/tiled/red,/area/aisat) +"M" = (/obj/turbolift_map_holder/example{dir = 1; icon = 'icons/obj/turbolift_preview_5x5.dmi'},/turf/simulated/floor/tiled/red,/area/aisat) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -61,13 +62,13 @@ aaaaaaaabhhFFFhGhhhhhEbaaaaaaaaa aaaaaaaabnbFFFhnhhhhhEbaaaaaaaaa aaaaaaaabHbhhhhIhhhhhEbaaaaaaaaa aaaaaaaabbbhJhhnhhJhhKbaaaaaaaaa -aaaaaaaabbbbbLLLLLbbbbbaaaaaaaaa +aaaaaaaabbbbbbnnnbbbbbbaaaaaaaaa aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa aaaaaaaaaaaabLLLLLbaaaaaaaaaaaaa +aaaaaaaaaaaabMLLLLbaaaaaaaaaaaaa aaaaaaaaaaaabbbbbbbaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} diff --git a/maps/example/example-2.dmm b/maps/example/example-2.dmm index f108e93b91..9c0fd272dc 100644 --- a/maps/example/example-2.dmm +++ b/maps/example/example-2.dmm @@ -57,7 +57,8 @@ aaaaaaaaccciiiioiiiiiDcaaaaaaaaa aaaaaaaacEciiiioiiiiiDcaaaaaaaaa aaaaaaaacEciiiiFiiiiiDcaaaaaaaaa aaaaaaaaciiiGiioiiGiiHcaaaaaaaaa -aaaaaaaacccccEEEEEcccccaaaaaaaaa +aaaaaaaaccccccoooccccccaaaaaaaaa +aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa @@ -65,5 +66,4 @@ aaaaaaaaaaaacEEEEEcaaaaaaaaaaaaa aaaaaaaaaaaacccccccaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} diff --git a/maps/example/example.dm b/maps/example/example.dm index d5e18ea366..a103a32625 100644 --- a/maps/example/example.dm +++ b/maps/example/example.dm @@ -4,6 +4,8 @@ #include "example-2.dmm" #include "example_defines.dm" + #include "example_elevator.dm" + #include "example_areas.dm" #define USING_MAP_DATUM /datum/map/example diff --git a/maps/example/example_areas.dm b/maps/example/example_areas.dm new file mode 100644 index 0000000000..8e01e14055 --- /dev/null +++ b/maps/example/example_areas.dm @@ -0,0 +1,13 @@ +// Elevator areas. +/area/turbolift/example_top + name = "lift (top floor)" + lift_floor_label = "Floor 2" + lift_floor_name = "Top Floor" + lift_announce_str = "Arriving at Top Floor." + +/area/turbolift/example_ground + name = "lift (ground floor)" + lift_floor_label = "Floor 1" + lift_floor_name = "First Floor" + lift_announce_str = "Arriving at First Floor." + base_turf = /turf/simulated/floor \ No newline at end of file diff --git a/maps/example/example_elevator.dm b/maps/example/example_elevator.dm new file mode 100644 index 0000000000..4e279f3df7 --- /dev/null +++ b/maps/example/example_elevator.dm @@ -0,0 +1,11 @@ +/obj/turbolift_map_holder/example + name = "Example turbolift map placeholder" + depth = 2 + lift_size_x = 4 + lift_size_y = 4 + icon = 'icons/obj/turbolift_preview_5x5.dmi' + + areas_to_use = list( + /area/turbolift/example_ground, + /area/turbolift/example_top + ) \ No newline at end of file diff --git a/polaris.dme b/polaris.dme index 45b45aaa9e..d34d6834fd 100644 --- a/polaris.dme +++ b/polaris.dme @@ -2055,6 +2055,15 @@ #include "code\modules\tables\rack.dm" #include "code\modules\tables\tables.dm" #include "code\modules\tables\update_triggers.dm" +#include "code\modules\turbolift\_turbolift.dm" +#include "code\modules\turbolift\turbolift.dm" +#include "code\modules\turbolift\turbolift_areas.dm" +#include "code\modules\turbolift\turbolift_console.dm" +#include "code\modules\turbolift\turbolift_door.dm" +#include "code\modules\turbolift\turbolift_floor.dm" +#include "code\modules\turbolift\turbolift_map.dm" +#include "code\modules\turbolift\turbolift_process.dm" +#include "code\modules\turbolift\turbolift_turfs.dm" #include "code\modules\vehicles\cargo_train.dm" #include "code\modules\vehicles\train.dm" #include "code\modules\vehicles\vehicle.dm" From eeed8496cf20d3c036829dc6e1d2ff33638d6f45 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Sun, 5 Mar 2017 03:10:11 +0000 Subject: [PATCH 12/16] Fixes the paperwork date insert --- code/modules/paperwork/paper.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index e183c3b282..a7d1ad04ab 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -233,7 +233,7 @@ t = replacetext(t, "\[u\]", "") t = replacetext(t, "\[/u\]", "") t = replacetext(t, "\[time\]", "[stationtime2text()]") - t = replacetext(t, "\[date\]", "[stationtime2text()]") + t = replacetext(t, "\[date\]", "[station_date]") t = replacetext(t, "\[large\]", "") t = replacetext(t, "\[/large\]", "") if(findtext(t, "\[sign\]")) From 1ae7b9a85636bdd5e73863687d6605c9c7097eab Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sun, 5 Mar 2017 15:03:20 -0500 Subject: [PATCH 13/16] Add missing Psych HUD icon Was missing the job icon. Has been for a million years. Just gave it the generic medical red cross one since I can't draw. Someone can go back and make a nicer one if they want? --- icons/mob/hud.dmi | Bin 3552 -> 3556 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index faedbce1d9f1e8785490ddca446eb05bdbf0555b..5442b3b4a8b2e412832bee0dfac9df9fed2c3604 100644 GIT binary patch delta 2868 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 XR$*ZxV2um&f88xl+n%a0{e}1+sE{}E delta 2864 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 V;r`E0Pd@)sH#0tORBqr#`7cFXCoup3 From b4ec8eb0265a884dbf1fcec51a738b37525d1950 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Sun, 5 Mar 2017 14:19:51 -0600 Subject: [PATCH 14/16] Oxyloss shows as cyan --- code/game/objects/items/devices/scanners.dm | 10 +++--- html/changelogs/Anewbe - Oxyloss.yml | 36 +++++++++++++++++++++ nano/css/shared.css | 2 +- 3 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 html/changelogs/Anewbe - Oxyloss.yml diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 56311a52df..56229e6cf3 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -52,8 +52,8 @@ REAGENT SCANNER if (!istype(M,/mob/living/carbon/human) || M.isSynthetic()) //these sensors are designed for organic life user.show_message("Analyzing Results for ERROR:\n\t Overall Status: ERROR") - user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message(" Damage Specifics: ? - ? - ? - ?") + user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message(" Damage Specifics: ? - ? - ? - ?") user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) user.show_message("Warning: Blood Level ERROR: --% --cl. Type: ERROR") user.show_message("Subject's pulse: -- bpm.") @@ -70,8 +70,8 @@ REAGENT SCANNER user.show_message("Overall Status: dead") else user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round((M.health/M.maxHealth)*100) ]% healthy"]") - user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message(" Damage Specifics: [OX] - [TX] - [BU] - [BR]") + user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message(" Damage Specifics: [OX] - [TX] - [BU] - [BR]") user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) user.show_message("Time of Death: [M.tod]") @@ -92,7 +92,7 @@ REAGENT SCANNER else user.show_message(" Limbs are OK.",1) - OX = M.getOxyLoss() > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" + OX = M.getOxyLoss() > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" TX = M.getToxLoss() > 50 ? "Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal" BU = M.getFireLoss() > 50 ? "Severe burn damage detected" : "Subject burn injury status O.K" BR = M.getBruteLoss() > 50 ? "Severe anatomical damage detected" : "Subject brute-force injury status O.K" diff --git a/html/changelogs/Anewbe - Oxyloss.yml b/html/changelogs/Anewbe - Oxyloss.yml new file mode 100644 index 0000000000..4014cdeaae --- /dev/null +++ b/html/changelogs/Anewbe - Oxyloss.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: N3X15 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Oxyloss now shows up as cyan in scanners." diff --git a/nano/css/shared.css b/nano/css/shared.css index dc6089716d..815171c0ef 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -663,7 +663,7 @@ th.misc { } .oxyloss { - color: #4444FF; + color: cyan; } /* 75px width used in power monitoring console buttons */ From e65ef1b0d6b9eac20f6277613e2a78a72c4599d9 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sun, 5 Mar 2017 18:42:24 -0500 Subject: [PATCH 15/16] Add TOTAL_HUDS define Making a list just... 'be 10 long' is bad. Like update_icons layers and various other things, if you add more, it will compile fine and then you get runtimes later, which is a little annoying. Having places you just have to 'know' to update elsewhere in the code is meh. --- code/__defines/misc.dm | 1 + code/modules/mob/living/carbon/human/human.dm | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 6a009677e1..87c75dfb0a 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -36,6 +36,7 @@ #define SPECIALROLE_HUD 8 // AntagHUD image. #define STATUS_HUD_OOC 9 // STATUS_HUD without virus DB check for someone being ill. #define LIFE_HUD 10 // STATUS_HUD that only reports dead or alive +#define TOTAL_HUDS 10 // Total number of HUDs. Like body layers, and other things, it comes up sometimes. //some colors #define COLOR_WHITE "#FFFFFF" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5269d940a0..2626db7245 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -5,7 +5,7 @@ icon = 'icons/mob/human.dmi' icon_state = "body_m_s" - var/list/hud_list[10] + var/list/hud_list[TOTAL_HUDS] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. var/last_push_time //For human_attackhand.dm, keeps track of the last use of disarm From 8355428e4ef50943beef0b266db4082c8bc17527 Mon Sep 17 00:00:00 2001 From: Leshana Date: Sun, 5 Mar 2017 21:27:42 -0500 Subject: [PATCH 16/16] Adds Supply Shuttle Hook * Adds a global hook for when the supply shuttle reaches centcom. The existing sell_crate hook is too limited, as it only detects what is in crates, and is fired many times, making it hard to produce a summary for events that might want stuff shipped on the shuttle. --- code/controllers/hooks-defs.dm | 9 +++++++++ code/game/supplyshuttle.dm | 2 ++ 2 files changed, 11 insertions(+) diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm index e330024475..82f7920752 100644 --- a/code/controllers/hooks-defs.dm +++ b/code/controllers/hooks-defs.dm @@ -85,3 +85,12 @@ * Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle */ /hook/sell_crate + +/** + * Supply Shuttle sold hook. + * Called in supplyshuttle.dm when the shuttle contents are sold. + * This hook is called _before_ the crates are processed for normal + * phoron/metal sale (and before the sell_crate hooks) + * Parameters: var/area/area_shuttle + */ +/hook/sell_shuttle diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 6bf5010901..8ba95765b4 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -184,6 +184,8 @@ var/list/mechtoys = list( var/area/area_shuttle = shuttle.get_location_area() if(!area_shuttle) return + callHook("sell_shuttle", list(area_shuttle)); + var/phoron_count = 0 var/plat_count = 0