From ddab6823d34cafc17eeaedb61fec0dfbbe877357 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Sat, 6 Feb 2016 22:08:54 -0600 Subject: [PATCH] Fix up crates All shipable crates are proper children All crates support a manifest Crates rely on parent code shared with closets when possible --- _maps/RandomZLevels/centcomAway.dmm | 4 +- _maps/RandomZLevels/spacebattle.dmm | 4 +- _maps/RandomZLevels/wildwest.dmm | 4 +- _maps/map_files/MiniStation/supplypacks.dm | 10 +- _maps/map_files/generic/z6.dmm | 4 +- code/datums/supplypacks.dm | 53 ++-- code/game/asteroid.dm | 2 +- .../objects/structures/crates_lockers/bins.dm | 34 +-- .../structures/crates_lockers/closets.dm | 123 +++++---- .../structures/crates_lockers/crates.dm | 234 +++++------------- .../crates_lockers/crates/critter.dm | 45 ++++ .../structures/crates_lockers/crates/large.dm | 35 +++ .../crates_lockers/crates/secure.dm | 91 +------ .../structures/crates_lockers/largecrate.dm | 53 ---- code/modules/cargo/order.dm | 45 ++-- code/modules/mining/abandoned_crates.dm | 62 ++--- code/modules/mining/mine_items.dm | 2 +- code/modules/paperwork/paper.dm | 5 +- code/modules/shuttle/supply.dm | 2 +- icons/obj/closet.dmi | Bin 33332 -> 31826 bytes icons/obj/crates.dmi | Bin 14015 -> 14210 bytes tgstation.dme | 4 +- 22 files changed, 326 insertions(+), 490 deletions(-) create mode 100644 code/game/objects/structures/crates_lockers/crates/critter.dm create mode 100644 code/game/objects/structures/crates_lockers/crates/large.dm delete mode 100644 code/game/objects/structures/crates_lockers/largecrate.dm diff --git a/_maps/RandomZLevels/centcomAway.dmm b/_maps/RandomZLevels/centcomAway.dmm index 2731714e96e..81224c36d74 100644 --- a/_maps/RandomZLevels/centcomAway.dmm +++ b/_maps/RandomZLevels/centcomAway.dmm @@ -169,7 +169,7 @@ "dm" = (/obj/machinery/door/window/northright{base_state = "right"; dir = 4; icon_state = "right"; name = "Security Desk"; req_access_txt = "103"},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/awaymission/centcomAway/hangar) "dn" = (/obj/structure/closet/crate,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/awaymission/centcomAway/hangar) "do" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/awaymission/centcomAway/hangar) -"dp" = (/obj/structure/largecrate,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/awaymission/centcomAway/hangar) +"dp" = (/obj/structure/closet/crate/large,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/awaymission/centcomAway/hangar) "dq" = (/obj/structure/dresser,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/cafe) "dr" = (/obj/structure/table/reinforced,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaymission/centcomAway/general) "ds" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal/bin,/turf/simulated/floor/plating,/area/awaymission/centcomAway/cafe) @@ -192,7 +192,7 @@ "dJ" = (/turf/simulated/floor/plasteel{icon_state = "blackcorner"; dir = 4},/area/awaymission/centcomAway/general) "dK" = (/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaymission/centcomAway/general) "dL" = (/obj/machinery/door/airlock/hatch{name = "Rest Room"; req_access_txt = "0"},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/awaymission/centcomAway/hangar) -"dM" = (/obj/structure/largecrate,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/awaymission/centcomAway/hangar) +"dM" = (/obj/structure/closet/crate/large,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/awaymission/centcomAway/hangar) "dN" = (/obj/structure/closet/crate,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/awaymission/centcomAway/hangar) "dO" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/awaymission/centcomAway/hangar) "dP" = (/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 10},/area/awaymission/centcomAway/general) diff --git a/_maps/RandomZLevels/spacebattle.dmm b/_maps/RandomZLevels/spacebattle.dmm index a26038404da..b282455054a 100644 --- a/_maps/RandomZLevels/spacebattle.dmm +++ b/_maps/RandomZLevels/spacebattle.dmm @@ -376,7 +376,7 @@ "hm" = (/turf/simulated/floor/plasteel/shuttle/red/syndicate,/area/awaymission/spacebattle/syndicate7) "hn" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/syndicate7) "ho" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 8},/turf/space,/area/awaymission/spacebattle/syndicate7) -"hp" = (/obj/structure/largecrate,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) +"hp" = (/obj/structure/closet/crate/large,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "hq" = (/obj/structure/closet/crate/secure/plasma,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "hr" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "hs" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit,/obj/item/clothing/head/helmet/space/hardsuit,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser) @@ -385,7 +385,7 @@ "hv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser) "hw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/spacebattle/syndicate7) "hx" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area/awaymission/spacebattle/syndicate7) -"hy" = (/obj/structure/largecrate,/mob/living/simple_animal/pet/dog/corgi/puppy,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) +"hy" = (/obj/structure/closet/crate/large,/mob/living/simple_animal/pet/dog/corgi/puppy,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "hz" = (/obj/structure/closet/crate,/obj/item/weapon/paint/anycolor,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "hA" = (/obj/structure/closet/crate,/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/stock_parts/cell/high,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "hB" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) diff --git a/_maps/RandomZLevels/wildwest.dmm b/_maps/RandomZLevels/wildwest.dmm index 91d013263d7..36d5dc8dad5 100644 --- a/_maps/RandomZLevels/wildwest.dmm +++ b/_maps/RandomZLevels/wildwest.dmm @@ -54,7 +54,7 @@ "be" = (/obj/item/ammo_box/c10mm,/turf/simulated/floor/plating/ironsand{icon_state = "ironsand1"},/area/awaymission/wwmines) "bf" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plating/ironsand{icon_state = "ironsand1"},/area/awaymission/wwmines) "bg" = (/turf/simulated/wall/mineral/sandstone,/area/space) -"bh" = (/obj/structure/largecrate,/turf/simulated/floor/plating,/area/awaymission/wwrefine) +"bh" = (/obj/structure/closet/crate/large,/turf/simulated/floor/plating,/area/awaymission/wwrefine) "bi" = (/obj/effect/landmark/corpse/miner/rig,/obj/effect/mine/sound/bwoink,/turf/simulated/floor/plating/ironsand{icon_state = "ironsand1"},/area/awaymission/wwmines) "bj" = (/turf/simulated/floor/wood,/area/awaymission/wwmines) "bk" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/wood,/area/awaymission/wwmines) @@ -181,7 +181,7 @@ "dB" = (/obj/structure/toilet,/mob/living/simple_animal/hostile/creature,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/wwgov) "dC" = (/turf/simulated/floor/plating/ironsand{icon_state = "ironsand9"},/area/awaymission/wwgov) "dD" = (/obj/structure/mineral_door/wood{icon_state = "wood"},/turf/simulated/floor/plating/ironsand{icon_state = "ironsand1"},/area/awaymission/wwgov) -"dE" = (/obj/structure/largecrate,/turf/simulated/floor/wood,/area/awaymission/wwmines) +"dE" = (/obj/structure/closet/crate/large,/turf/simulated/floor/wood,/area/awaymission/wwmines) "dF" = (/turf/simulated/floor/plating/ironsand{icon_state = "ironsand7"},/area/awaymission/wwgov) "dG" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines) "dH" = (/obj/structure/bed,/obj/item/weapon/bedsheet/blue,/turf/simulated/floor/wood,/area/awaymission/wwmines) diff --git a/_maps/map_files/MiniStation/supplypacks.dm b/_maps/map_files/MiniStation/supplypacks.dm index 330322a0d6f..8bfe0e285b1 100644 --- a/_maps/map_files/MiniStation/supplypacks.dm +++ b/_maps/map_files/MiniStation/supplypacks.dm @@ -2,28 +2,28 @@ name = "Oxygen Canister" contains = list(/obj/machinery/portable_atmospherics/canister/oxygen) cost = 15 - containertype = /obj/structure/largecrate + containertype = /obj/structure/closet/crate/large containername = "oxygen canister crate" /datum/supply_packs/engineering/toxins name = "Toxins Canister" contains = list(/obj/machinery/portable_atmospherics/canister/toxins) cost = 30 - containertype = /obj/structure/largecrate + containertype = /obj/structure/closet/crate/large containername = "toxins canister crate" /datum/supply_packs/engineering/nitrogen name = "Nitrogen Canister" contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen) cost = 20 - containertype = /obj/structure/largecrate + containertype = /obj/structure/closet/crate/large containername = "nitrogen canister crate" /datum/supply_packs/engineering/carbon_dio name = "Carbon Dioxide Canister" contains = list(/obj/machinery/portable_atmospherics/canister/carbon_dioxide) cost = 35 - containertype = /obj/structure/largecrate + containertype = /obj/structure/closet/crate/large containername = "carbon dioxide canister crate" @@ -34,5 +34,5 @@ name = "Hydroponics Tray Kit" contains = list(/obj/machinery/hydroponics/constructable/unattached) cost = 10 - containertype = /obj/structure/largecrate + containertype = /obj/structure/closet/crate/large containername = "hydroponics kit" \ No newline at end of file diff --git a/_maps/map_files/generic/z6.dmm b/_maps/map_files/generic/z6.dmm index c6861e94afd..8fc8a070d43 100644 --- a/_maps/map_files/generic/z6.dmm +++ b/_maps/map_files/generic/z6.dmm @@ -55,7 +55,7 @@ "bc" = (/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) "bd" = (/obj/item/weapon/storage/box,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) "be" = (/obj/item/weapon/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bf" = (/obj/structure/largecrate,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft) +"bf" = (/obj/structure/closet/crate/large,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft) "bg" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore) "bh" = (/obj/structure/table/wood,/obj/item/stack/spacecash/c500,/obj/item/stack/spacecash/c100,/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore) "bi" = (/obj/structure/bed,/obj/item/weapon/bedsheet/yellow,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore) @@ -112,7 +112,7 @@ "ch" = (/turf/simulated/wall/shuttle{icon_state = "swall13"},/area/awaymission/BMPship/Midship) "ci" = (/turf/simulated/wall/shuttle{icon_state = "swall15"},/area/awaymission/BMPship/Aft) "cj" = (/obj/machinery/door/poddoor/shutters{id = "packerMed"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"ck" = (/obj/structure/largecrate,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/awaymission/BMPship/Aft) +"ck" = (/obj/structure/closet/crate/large,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/awaymission/BMPship/Aft) "cl" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/awaymission/BMPship/Aft) "cm" = (/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/awaymission/BMPship/Aft) "cn" = (/obj/structure/kitchenspike,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/awaymission/BMPship/Aft) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 1cad46222ed..2b7c9d0bb08 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -121,6 +121,16 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containertype = /obj/structure/closet/crate containername = "firefighting crate" +/datum/supply_packs/emergency/radiation + name = "Radiation Protection Crate" + contains = list(/obj/item/clothing/head/radiation, + /obj/item/clothing/head/radiation, + /obj/item/clothing/suit/radiation, + /obj/item/clothing/suit/radiation) + cost = 10 + containertype = /obj/structure/closet/crate/radiation + containername = "radiation protection crate" + /datum/supply_packs/emergency/atmostank name = "Firefighting Watertank" contains = list(/obj/item/weapon/watertank/atmos) @@ -136,7 +146,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/grenade/chem_grenade/antiweed, /obj/item/weapon/grenade/chem_grenade/antiweed) cost = 15 - containertype = /obj/structure/closet/crate/secure/hydrosec + containertype = /obj/structure/closet/crate/secure/hydroponics containername = "weed control crate" access = access_hydroponics @@ -441,7 +451,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine name = "Fuel Tank Crate" contains = list(/obj/structure/reagent_dispensers/fueltank) cost = 8 - containertype = /obj/structure/largecrate + containertype = /obj/structure/closet/crate/large containername = "fuel tank crate" /datum/supply_packs/engineering/tools //the most robust crate @@ -838,55 +848,59 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine //////// livestock /datum/supply_packs/organic/cow name = "Cow Crate" + contains = list(/mob/living/simple_animal/cow) cost = 30 - containertype = /obj/structure/closet/critter/cow + containertype = /obj/structure/closet/crate/critter containername = "cow crate" /datum/supply_packs/organic/goat name = "Goat Crate" + contains = list(/mob/living/simple_animal/hostile/retaliate/goat) cost = 25 - containertype = /obj/structure/closet/critter/goat + containertype = /obj/structure/closet/crate/critter containername = "goat crate" /datum/supply_packs/organic/chicken name = "Chicken Crate" cost = 20 - containertype = /obj/structure/closet/critter/chick + containertype = /obj/structure/closet/crate/critter/chick containername = "chicken crate" /datum/supply_packs/organic/corgi name = "Corgi Crate" cost = 50 - containertype = /obj/structure/closet/critter/corgi contains = list(/obj/item/clothing/tie/petcollar) + containertype = /obj/structure/closet/crate/critter/corgi containername = "corgi crate" /datum/supply_packs/organic/cat name = "Cat Crate" cost = 50 //Cats are worth as much as corgis. - containertype = /obj/structure/closet/critter/cat contains = list(/obj/item/clothing/tie/petcollar, /obj/item/toy/cattoy) + containertype = /obj/structure/closet/crate/critter/cat containername = "cat crate" /datum/supply_packs/organic/pug name = "Pug Crate" cost = 50 - containertype = /obj/structure/closet/critter/pug - contains = list(/obj/item/clothing/tie/petcollar) + contains = list(/mob/living/simple_animal/pet/dog/pug, + /obj/item/clothing/tie/petcollar) + containertype = /obj/structure/closet/crate/critter containername = "pug crate" /datum/supply_packs/organic/fox name = "Fox Crate" cost = 55 //Foxes are cool. - containertype = /obj/structure/closet/critter/fox - contains = list(/obj/item/clothing/tie/petcollar) + contains = list(/mob/living/simple_animal/pet/fox, + /obj/item/clothing/tie/petcollar) + containertype = /obj/structure/closet/crate/critter containername = "fox crate" /datum/supply_packs/organic/butterfly name = "Butterflies Crate" cost = 50 - containertype = /obj/structure/closet/critter/butterfly + containertype = /obj/structure/closet/crate/critter/butterfly containername = "butterflies crate" contraband = 1 @@ -1045,7 +1059,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine name = "MULEbot Crate" contains = list(/mob/living/simple_animal/bot/mulebot) cost = 20 - containertype = /obj/structure/largecrate/mule + containertype = /obj/structure/closet/crate/large containername = "\improper MULEbot Crate" /datum/supply_packs/misc/conveyor @@ -1065,7 +1079,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine name = "Water Tank Crate" contains = list(/obj/structure/reagent_dispensers/watertank) cost = 8 - containertype = /obj/structure/largecrate + containertype = /obj/structure/closet/crate/large containername = "water tank crate" /datum/supply_packs/misc/lasertag @@ -1133,7 +1147,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "bureaucracy crate" /datum/supply_packs/misc/toner - name = "Toner Cartridges crate" + name = "Toner Cartridges Crate" contains = list(/obj/item/device/toner, /obj/item/device/toner, /obj/item/device/toner, @@ -1169,7 +1183,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine contains = list(/obj/structure/janitorialcart, /obj/item/clothing/shoes/galoshes) cost = 10 - containertype = /obj/structure/largecrate + containertype = /obj/structure/closet/crate/large containername = "janitorial cart crate" /datum/supply_packs/misc/janitor/janitank @@ -1238,6 +1252,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "wizard costume crate" /datum/supply_packs/misc/randomised + name = "Collectable hat crate!" var/num_contained = 3 //number of items picked to be contained in a randomised crate contains = list(/obj/item/clothing/head/collectable/chef, /obj/item/clothing/head/collectable/paper, @@ -1259,7 +1274,6 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/clothing/head/collectable/slime, /obj/item/clothing/head/collectable/xenom, /obj/item/clothing/head/collectable/petehat) - name = "Collectable hat crate!" cost = 200 containername = "collectable hats crate! Brought to you by Bass.inc!" @@ -1267,13 +1281,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine manifest += "Contains any [num_contained] of:" ..() - /datum/supply_packs/misc/randomised/contraband + name = "Contraband Crate" num_contained = 5 contains = list(/obj/item/weapon/poster/contraband, /obj/item/weapon/storage/fancy/cigarettes/dromedaryco, /obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims) - name = "Contraband Crate" cost = 30 containername = "crate" //let's keep it subtle, eh? contraband = 1 @@ -1296,7 +1309,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/toy/redbutton) cost = 50 // or play the arcade machines ya lazy bum - containername ="toy crate" + containername = "toy crate" /datum/supply_packs/misc/autodrobe name = "Autodrobe Supply Crate" diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm index 1a54baa825f..c5452d77a36 100644 --- a/code/game/asteroid.dm +++ b/code/game/asteroid.dm @@ -64,7 +64,7 @@ var/global/max_secret_rooms = 6 if("organharvest") walltypes = list(/turf/simulated/wall/r_wall=2,/turf/simulated/wall=2,/turf/simulated/mineral/random/high_chance=1) floortypes = list(/turf/simulated/floor/plasteel,/turf/simulated/floor/engine) - treasureitems = list(/mob/living/simple_animal/bot/medbot/mysterious=1, /obj/item/weapon/circular_saw=1, /obj/structure/closet/critter/cat=2) + treasureitems = list(/mob/living/simple_animal/bot/medbot/mysterious=1, /obj/item/weapon/circular_saw=1, /obj/structure/closet/crate/critter/cat=2) fluffitems = list(/obj/effect/decal/cleanable/blood=5,/obj/item/organ/internal/appendix=2,/obj/structure/closet/crate/freezer=2, /obj/structure/table/optable=1,/obj/item/weapon/scalpel=1,/obj/item/weapon/storage/firstaid/regular=3, /obj/item/weapon/tank/internals/anesthetic=1, /obj/item/weapon/surgical_drapes=2, /obj/item/device/mass_spectrometer/adv=1,/obj/item/clothing/glasses/hud/health=1) diff --git a/code/game/objects/structures/crates_lockers/bins.dm b/code/game/objects/structures/crates_lockers/bins.dm index 7bece78a795..6b255be1a1a 100644 --- a/code/game/objects/structures/crates_lockers/bins.dm +++ b/code/game/objects/structures/crates_lockers/bins.dm @@ -1,15 +1,11 @@ /obj/structure/closet/crate/bin desc = "A trash bin, place your trash here for the janitor to collect." name = "trash bin" - icon_crate = "largebins" icon_state = "largebins" - anchored = 1 - sound_effect_open = 'sound/effects/bin_open.ogg' - sound_effect_close = 'sound/effects/bin_close.ogg' - var/animation = "animate_largebins" - var/redlight = "largebinr" - var/greenlight = "largebing" - var/orangelight = "largebino" + open_sound = 'sound/effects/bin_open.ogg' + close_sound = 'sound/effects/bin_close.ogg' + anchored = TRUE + allow_mobs = TRUE /obj/structure/closet/crate/bin/New() ..() @@ -19,11 +15,11 @@ ..() overlays.Cut() if(contents.len == 0) - overlays += greenlight + overlays += "largebing" else if(contents.len >= storage_capacity) - overlays += redlight + overlays += "largebinr" else - overlays += orangelight + overlays += "largebino" /obj/structure/closet/crate/bin/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/storage/bag/trash)) @@ -54,23 +50,15 @@ user.visible_message("[user] stuffs [O] into[src].", \ "You stuff [O] into [src].", \ "You hear a loud metal bang.") - insert(O, 1, !opened) + insert(O) if(opened) close() -/obj/structure/closet/crate/bin/open() - . = ..() - update_icon() - -/obj/structure/closet/crate/bin/close() - . = ..() - update_icon() - /obj/structure/closet/crate/bin/proc/do_animate() - playsound(src.loc, sound_effect_open, 15, 1, -3) - flick(animation, src) + playsound(src.loc, open_sound, 15, 1, -3) + flick("animate_largebins", src) spawn(13) - playsound(src.loc, sound_effect_close, 15, 1, -3) + playsound(src.loc, close_sound, 15, 1, -3) update_icon() /obj/structure/closet/crate/bin/insert(obj/item/I, include_mobs = 0, animate = 0) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 41c94f82650..10596418b04 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -14,6 +14,7 @@ var/large = 1 var/wall_mounted = 0 //never solid (You can always pass over it) var/health = 100 + var/breakout_time = 2 var/lastbang var/can_weld_shut = 1 var/max_mob_size = MOB_SIZE_HUMAN //Biggest mob_size accepted by the container @@ -21,6 +22,7 @@ var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients. var/cutting_tool = /obj/item/weapon/weldingtool var/open_sound = 'sound/machines/click.ogg' + var/close_sound = 'sound/machines/click.ogg' var/cutting_sound = 'sound/items/Welder.ogg' var/material_drop = /obj/item/stack/sheet/metal @@ -63,11 +65,10 @@ /obj/structure/closet/examine(mob/user) ..() - if(secure) - if(broken || opened || !ishuman(user)) - return //Monkeys don't get a message, nor does anyone if it's open or emagged - else - user << "Alt-click the locker to [locked ? "unlock" : "lock"] it." + if(broken) + user << "It appears to be broken." + else if(secure && !opened) + user << "Alt-click to [locked ? "unlock" : "lock"]." /obj/structure/closet/alter_health() return get_turf(src) @@ -88,22 +89,17 @@ return 1 /obj/structure/closet/proc/dump_contents() - for(var/obj/O in src) - O.loc = loc + var/turf/T = get_turf(src) + for(var/atom/movable/AM in src) + AM.forceMove(T) if(throwing) //you keep some momentum when getting out of a thrown closet - step(O, dir) - - for(var/mob/M in src) - M.loc = loc - M.reset_perspective(null) - if(throwing) - step(M, dir) + step(AM, dir) if(throwing) throwing = 0 /obj/structure/closet/proc/take_contents() - - for(var/atom/movable/AM in loc) + var/turf/T = get_turf(src) + for(var/atom/movable/AM in T) if(insert(AM) == -1) // limit reached break @@ -118,7 +114,6 @@ return 1 /obj/structure/closet/proc/insert(atom/movable/AM) - if(contents.len >= storage_capacity) return -1 @@ -132,7 +127,10 @@ mobs_stored++ if(mobs_stored >= mob_storage_capacity) return 0 +<<<<<<< ede93b63a61fbdfe3be0fe9569aa29b152e767bc L.reset_perspective(src) +======= +>>>>>>> Fix up crates L.stop_pulling() else if(!istype(AM, /obj/item) && !istype(AM, /obj/effect/dummy/chameleon)) return 0 @@ -140,20 +138,18 @@ return 0 else if(AM.flags & NODROP) return 0 - AM.loc = src + AM.forceMove(src) if(AM.pulledby) AM.pulledby.stop_pulling() return 1 /obj/structure/closet/proc/close() - if(!opened) - return 0 - if(!can_close()) + if(!opened || !can_close()) return 0 take_contents() opened = 0 - playsound(loc, open_sound, 15, 1, -3) + playsound(loc, close_sound, 15, 1, -3) density = 1 update_icon() return 1 @@ -161,7 +157,8 @@ /obj/structure/closet/proc/toggle() if(opened) return close() - return open() + else + return open() /obj/structure/closet/ex_act(severity, target) contents_explosion(severity, target) @@ -170,13 +167,12 @@ qdel(src) ..() -/obj/structure/closet/bullet_act(obj/item/projectile/Proj) +/obj/structure/closet/bullet_act(obj/item/projectile/P) ..() - if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - health -= Proj.damage + if(P.damage_type == BRUTE || P.damage_type == BURN) + health -= P.damage if(health <= 0) qdel(src) - return /obj/structure/closet/attack_animal(mob/living/simple_animal/user) if(user.environment_smash) @@ -188,7 +184,6 @@ if(prob(75)) qdel(src) - /obj/structure/closet/attackby(obj/item/weapon/W, mob/user, params) if(user.loc == src) return @@ -313,31 +308,24 @@ if(AM.loc == src) return 0 return 1 -/obj/structure/closet/container_resist() - var/mob/living/user = usr - var/breakout_time = 2 //2 minutes by default - if(istype(user.loc, /obj/structure/closet/critter) && !welded) - breakout_time = 0.75 //45 seconds if it's an unwelded critter crate - - if( opened || (!welded && !locked && !istype(loc, /obj/mecha)) ) +/obj/structure/closet/container_resist(mob/living/user) + if(opened || (!welded && !locked && !istype(loc, /obj/mecha))) return //Door's open, not locked or welded or inside a mech, no point in resisting. //okay, so the closet is either welded or locked... resist!!! user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - user << "You lean on the back of [src] and start pushing the door open. (this will take about [breakout_time] minutes.)" - for(var/mob/O in viewers(src)) - O << "[src] begins to shake violently!" - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + user.visible_message("[src] begins to shake violently!", + "You lean on the back of [src] and start pushing the door open.") + if(do_after(user,(breakout_time * 60 * 10), target = src)) //minutes * 60seconds * 10deciseconds if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded && !istype(loc, /obj/mecha)) ) return //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting - welded = 0 //applies to all lockers lockers locked = 0 //applies to critter crates and secure lockers only broken = 1 //applies to secure lockers only user.visible_message("[user] successfully broke out of [src]!", "You successfully break out of [src]!") - if(istype( loc, /obj/structure/bigDelivery)) + if(istype(loc, /obj/structure/bigDelivery)) var/obj/structure/bigDelivery/D = loc qdel(D) else if(istype( loc, /obj/mecha)) @@ -348,36 +336,28 @@ /obj/structure/closet/AltClick(mob/user) ..() - if(!user.canUseTopic(user) || broken) + if(!user.canUseTopic(user)) user << "You can't do that right now!" return + if(broken) + user << "\The [src] is broken!" if(opened || !secure || !in_range(src, user)) return else togglelock(user) -/obj/structure/closet/emp_act(severity) - for(var/obj/O in src) - O.emp_act(severity) - if(secure && !broken) - if(prob(50/severity)) - locked = !locked - update_icon() - if(prob(20/severity) && !opened) - if(!locked) - open() - else - req_access = list() - req_access += pick(get_all_accesses()) - ..() - /obj/structure/closet/proc/togglelock(mob/user) - if(secure) + if(secure && !broken) if(allowed(user)) locked = !locked add_fingerprint(user) +<<<<<<< ede93b63a61fbdfe3be0fe9569aa29b152e767bc for(var/mob/O in viewers(user, 3)) O.show_message("[user] has [locked ? null : "un"]locked the locker.", 1) +======= + visible_message("[user] [locked ? null : "un"]locks [src].", + "You [locked ? null : "un"]locks [src].") +>>>>>>> Fix up crates update_icon() else user << "Access Denied" @@ -386,16 +366,31 @@ /obj/structure/closet/emag_act(mob/user) if(secure && !broken) + user.visible_message("Sparks fly from [src]!", + "You emag [src], breaking the lock!", + "You hear a faint electrical spark.") + playsound(src.loc, 'sound/effects/sparks4.ogg', 50, 1) broken = 1 locked = 0 - desc += " It appears to be broken." - update_icon() - if(user) - visible_message("The [name] has been broken by [user] with an electromagnetic card!", "You hear a faint electrical spark.") - overlays += "sparking" - spawn(4) //overlays don't support flick so we have to cheat update_icon() +<<<<<<< ede93b63a61fbdfe3be0fe9569aa29b152e767bc /obj/structure/closet/get_remote_view_fullscreens(mob/user) if(!(user.sight & (SEEOBJS|SEEMOBS))) user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) +======= +/obj/structure/closet/emp_act(severity) + for(var/obj/O in src) + O.emp_act(severity) + if(secure && !broken) + if(prob(50 / severity)) + locked = !locked + update_icon() + if(prob(20 / severity) && !opened) + if(!locked) + open() + else + req_access = list() + req_access += pick(get_all_accesses()) + ..() +>>>>>>> Fix up crates diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 65dca528f33..b84231bc0b1 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -1,49 +1,98 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - /obj/structure/closet/crate name = "crate" desc = "A rectangular steel crate." icon = 'icons/obj/crates.dmi' - var/icon_crate = "crate" icon_state = "crate" req_access = null - var/rigged = 0 - var/sound_effect_open = 'sound/machines/click.ogg' - var/sound_effect_close = 'sound/machines/click.ogg' + var/allow_mobs = FALSE var/obj/item/weapon/paper/manifest/manifest /obj/structure/closet/crate/New() ..() update_icon() - /obj/structure/closet/crate/update_icon() + icon_state = "[initial(icon_state)][opened ? "open" : ""]" + overlays.Cut() - if(opened) - icon_state = "[icon_crate]open" - else - icon_state = icon_crate if(manifest) overlays += "manifest" +/obj/structure/closet/crate/attack_hand(mob/user) + add_fingerprint(user) + if(manifest) + tear_manifest(user) + return + if(!toggle()) + togglelock(user) + +/obj/structure/closet/crate/attackby(obj/item/weapon/W, mob/user, params) + if(opened) + if(isrobot(user)) + return + if(user.drop_item()) + W.Move(loc) + else if(istype(W, /obj/item/stack/packageWrap)) + return + else if(!place(user, W)) + attack_hand(user) + +/obj/structure/closet/crate/insert(atom/movable/AM) + if(contents.len >= storage_capacity) + return -1 + + if(istype(AM, /mob/living)) + var/mob/living/L = AM + if(!allow_mobs || L.buckled || L.buckled_mob) + return + L.stop_pulling() + if(AM.flags & NODROP || AM.density || AM.anchored || AM.buckled_mob || istype(AM, /obj/structure/closet)) + return + AM.forceMove(src) + if(AM.pulledby) + AM.pulledby.stop_pulling() + return 1 + +/obj/structure/closet/crate/proc/tear_manifest(mob/user) + user << "You tear the manifest off of the crate." + playsound(src, 'sound/items/poster_ripped.ogg', 75, 1) + + manifest.loc = loc + if(ishuman(user)) + user.put_in_hands(manifest) + manifest = null + update_icon() + /obj/structure/closet/crate/internals desc = "A internals crate." name = "internals crate" - icon_crate = "o2crate" icon_state = "o2crate" /obj/structure/closet/crate/trashcart desc = "A heavy, metal trashcart with wheels." name = "trash cart" - icon_crate = "trashcart" icon_state = "trashcart" /obj/structure/closet/crate/medical desc = "A medical crate." name = "medical crate" - icon_crate = "medicalcrate" icon_state = "medicalcrate" +/obj/structure/closet/crate/freezer + desc = "A freezer." + name = "freezer" + icon_state = "freezer" + +/obj/structure/closet/crate/radiation + desc = "A crate with a radiation sign on it." + name = "radiation crate" + icon_state = "radiation" + +/obj/structure/closet/crate/hydroponics + name = "hydroponics crate" + desc = "All you need to destroy those pesky weeds and pests." + icon_state = "hydrocrate" + /obj/structure/closet/crate/rcd desc = "A crate for the storage of an RCD." name = "\improper RCD crate" @@ -53,160 +102,3 @@ for(var/i in 1 to 4) new /obj/item/weapon/rcd_ammo(src) new /obj/item/weapon/rcd(src) - -/obj/structure/closet/crate/freezer - desc = "A freezer." - name = "freezer" - icon_crate = "freezer" - icon_state = "freezer" - var/target_temp = T0C - 40 - var/cooling_power = 40 - -/obj/structure/closet/crate/freezer/return_air() - var/datum/gas_mixture/gas = (..()) - if(!gas) - return null - - var/datum/gas_mixture/newgas = new/datum/gas_mixture() - newgas.copy_from(gas) - - if(newgas.temperature <= target_temp) - return - - if((newgas.temperature - cooling_power) > target_temp) - newgas.temperature -= cooling_power - else - newgas.temperature = target_temp - return newgas - - -/obj/structure/closet/crate/radiation - desc = "A crate with a radiation sign on it." - name = "radioactive gear crate" - icon_crate = "radiation" - icon_state = "radiation" - -/obj/structure/closet/crate/radiation/New() - ..() - for(var/i in 1 to 4) - new /obj/item/clothing/suit/radiation(src) - new /obj/item/clothing/head/radiation(src) - -/obj/structure/closet/crate/hydroponics - name = "hydroponics crate" - desc = "All you need to destroy those pesky weeds and pests." - icon_crate = "hydrocrate" - icon_state = "hydrocrate" - -/obj/structure/closet/crate/hydroponics/prespawned - -/obj/structure/closet/crate/hydroponics/prespawned/New() - ..() - new /obj/item/weapon/reagent_containers/spray/plantbgone(src) - new /obj/item/weapon/reagent_containers/spray/plantbgone(src) - new /obj/item/weapon/cultivator(src) - -/obj/structure/closet/crate/open() - playsound(src.loc, sound_effect_open, 15, 1, -3) - dump_contents() - src.opened = 1 - update_icon() - return 1 - -/obj/structure/closet/crate/close() - playsound(src.loc, sound_effect_close, 15, 1, -3) - take_contents() - src.opened = 0 - update_icon() - return 1 - -/obj/structure/closet/crate/insert(atom/movable/AM, include_mobs = 0) - - if(contents.len >= storage_capacity) - return -1 - if(include_mobs && isliving(AM)) - var/mob/living/L = AM - if(L.buckled) - return 0 - else if(isobj(AM)) - if(AM.density || AM.anchored || istype(AM,/obj/structure/closet)) - return 0 - else - return 0 - - if(istype(AM, /obj/structure/bed)) //This is only necessary because of rollerbeds and swivel chairs. - var/obj/structure/bed/B = AM - if(B.buckled_mob) - return 0 - - AM.loc = src - return 1 - -/obj/structure/closet/crate/proc/tear_manifest(mob/user) - user << "You tear the manifest off of the crate." - playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1) - manifest.loc = loc - if(ishuman(user)) - user.put_in_hands(manifest) - manifest = null - overlays-="manifest" - -/obj/structure/closet/crate/attack_hand(mob/user) - if(manifest) - tear_manifest(user) - return - if(opened) - close() - else - if(rigged && locate(/obj/item/device/electropack) in src) - if(isliving(user)) - var/mob/living/L = user - if(L.electrocute_act(17, src)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() - return - open() - return - -/obj/structure/closet/crate/attack_paw(mob/user) - return attack_hand(user) - -/obj/structure/closet/crate/attackby(obj/item/weapon/W, mob/user, params) - if(opened) - if(isrobot(user)) - return - if(!user.drop_item()) //couldn't drop the item - user << "\The [W] is stuck to your hand, you cannot put it in \the [src]!" - return - if(W) - W.loc = src.loc - else if(istype(W, /obj/item/stack/packageWrap)) - return - else if(istype(W, /obj/item/stack/cable_coil)) - if(rigged) - user << "[src] is already rigged!" - return - var/obj/item/stack/cable_coil/C = W - if (C.use(5)) - user << "You rig [src]." - rigged = 1 - else - user << "You need 5 lengths of cable to rig [src]!" - return - else if(istype(W, /obj/item/device/electropack)) - if(rigged) - if(!user.drop_item()) - return - user << "You attach [W] to [src]." - W.loc = src - return - else if(istype(W, /obj/item/weapon/wirecutters)) - if(rigged) - user << "You cut away the wiring." - playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1) - rigged = 0 - return - else if(!place(user, W)) - return attack_hand(user) - diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm new file mode 100644 index 00000000000..ffe49f08023 --- /dev/null +++ b/code/game/objects/structures/crates_lockers/crates/critter.dm @@ -0,0 +1,45 @@ +/obj/structure/closet/crate/critter + name = "critter crate" + desc = "A crate designed for safe transport of animals. Only openable from the the outside." + icon_state = "crittercrate" + allow_mobs = TRUE + breakout_time = 1 + +/obj/structure/closet/crate/critter/update_icon() + overlays.Cut() + if(opened) + overlays += "crittercrate_door_open" + else + overlays += "crittercrate_door" + if(manifest) + overlays += "manifest" + +/obj/structure/closet/crate/critter/attack_hand(mob/user) + if(user in src) + user << "It won't budge!" + else + ..() + +/obj/structure/closet/crate/critter/corgi/New() + ..() + if(prob(50)) + new /mob/living/simple_animal/pet/dog/corgi/Lisa(src) + else + new /mob/living/simple_animal/pet/dog/corgi(src) + +/obj/structure/closet/crate/critter/cat/New() + ..() + if(prob(50)) + new /mob/living/simple_animal/pet/cat/Proc(src) + else + new /mob/living/simple_animal/pet/cat(src) + +/obj/structure/closet/crate/critter/chick/New() + ..() + for(var/i in 1 to rand(1, 3)) + new /mob/living/simple_animal/chick(src) + +/obj/structure/closet/crate/critter/butterfly/New() + ..() + for(var/i in 1 to 50) + new /mob/living/simple_animal/butterfly(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm new file mode 100644 index 00000000000..93a81516a7c --- /dev/null +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -0,0 +1,35 @@ +/obj/structure/closet/crate/large + name = "large crate" + desc = "A hefty wooden crate." + icon_state = "largecrate" + density = 1 + material_drop = /obj/item/stack/sheet/mineral/wood + +/obj/structure/closet/crate/large/attack_hand(mob/user) + add_fingerprint(user) + if(manifest) + tear_manifest(user) + return + else + user << "You need a crowbar to pry this open!" + return + +/obj/structure/closet/crate/large/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/crowbar)) + var/turf/T = get_turf(src) + if(manifest) + tear_manifest(user) + + user.visible_message("[user] pries \the [src] open.", \ + "You pry open \the [src].", \ + "You hear splitting wood.") + playsound(src.loc, 'sound/weapons/slashmiss.ogg', 75, 1) + + for(var/i in 1 to rand(2, 5)) + new material_drop(src) + for(var/atom/movable/AM in contents) + AM.forceMove(T) + + qdel(src) + else + ..() diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index a4f11e7fd5f..ffcdd093a44 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -1,105 +1,36 @@ /obj/structure/closet/crate/secure desc = "A secure crate." name = "secure crate" - icon_crate = "securecrate" icon_state = "securecrate" - var/redlight = "securecrater" - var/greenlight = "securecrateg" - var/sparks = "securecratesparks" - var/emag = "securecrateemag" + secure = 1 locked = 1 health = 1000 +/obj/structure/closet/crate/secure/update_icon() + ..() + if(broken) + overlays += "securecrateemag" + else if(locked) + overlays += "securecrater" + else + overlays += "securecrateg" + /obj/structure/closet/crate/secure/weapon desc = "A secure weapons crate." name = "weapons crate" - icon_crate = "weaponcrate" icon_state = "weaponcrate" /obj/structure/closet/crate/secure/plasma desc = "A secure plasma crate." name = "plasma crate" - icon_crate = "plasmacrate" icon_state = "plasmacrate" /obj/structure/closet/crate/secure/gear desc = "A secure gear crate." name = "gear crate" - icon_crate = "secgearcrate" icon_state = "secgearcrate" -/obj/structure/closet/crate/secure/hydrosec +/obj/structure/closet/crate/secure/hydroponics desc = "A crate with a lock on it, painted in the scheme of the station's botanists." name = "secure hydroponics crate" - icon_crate = "hydrosecurecrate" icon_state = "hydrosecurecrate" - -/obj/structure/closet/crate/secure/update_icon() - ..() - if(locked) - overlays += redlight - else if(broken) - overlays += emag - else - overlays += greenlight - -/obj/structure/closet/crate/secure/attack_hand(mob/user) - if(manifest) - tear_manifest(user) - return - if(locked && !broken) - if (allowed(user)) - user << "You unlock [src]." - src.locked = 0 - update_icon() - add_fingerprint(user) - return - else - user << "[src] is locked." - return - else - ..() - -/obj/structure/closet/crate/secure/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/weapon/card) && src.allowed(user) && !locked && !opened && !broken) - user << "You lock \the [src]." - src.locked = 1 - update_icon() - add_fingerprint(user) - return - - return ..() - -/obj/structure/closet/crate/secure/emag_act(mob/user) - if(locked && !broken) - src.locked = 0 - src.broken = 1 - update_icon() - overlays += sparks - spawn(6) overlays -= sparks //Tried lots of stuff but nothing works right. so i have to use this *sadface* - playsound(src.loc, "sparks", 60, 1) - user << "You unlock \the [src]." - add_fingerprint(user) - -/obj/structure/closet/crate/secure/emp_act(severity) - for(var/obj/O in src) - O.emp_act(severity) - if(!broken && !opened && prob(50/severity)) - if(!locked) - src.locked = 1 - update_icon() - else - src.locked = 0 - src.broken = 1 - update_icon() - overlays += sparks - spawn(6) overlays -= sparks //Tried lots of stuff but nothing works right. so i have to use this *sadface* - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - if(!opened && prob(20/severity)) - if(!locked) - open() - else - src.req_access = list() - src.req_access += pick(get_all_accesses()) - ..() - diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm deleted file mode 100644 index 6e2ce331f0b..00000000000 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ /dev/null @@ -1,53 +0,0 @@ -/obj/structure/largecrate - name = "large crate" - desc = "A hefty wooden crate." - icon = 'icons/obj/crates.dmi' - icon_state = "densecrate" - density = 1 - var/obj/item/weapon/paper/manifest/manifest - -/obj/structure/largecrate/New() - ..() - update_icon() - -/obj/structure/largecrate/update_icon() - ..() - overlays.Cut() - if(manifest) - overlays += "manifest" - -/obj/structure/largecrate/attack_hand(mob/user) - if(manifest) - user << "You tear the manifest off of the crate." - playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1) - manifest.loc = loc - if(ishuman(user)) - user.put_in_hands(manifest) - manifest = null - update_icon() - return - else - user << "You need a crowbar to pry this open!" - return - -/obj/structure/largecrate/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/weapon/crowbar)) - if(manifest) - manifest.loc = loc - manifest = null - update_icon() - new /obj/item/stack/sheet/mineral/wood(src) - var/turf/T = get_turf(src) - for(var/atom/movable/AM in contents) - AM.loc = T - user.visible_message("[user] pries \the [src] open.", \ - "You pry open \the [src].", \ - "You hear splitting wood.") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1) - qdel(src) - else - return attack_hand(user) - -/obj/structure/largecrate/mule - icon_state = "mulecrate" - diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm index 7f507454e21..96bf68bcc5c 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -33,6 +33,22 @@ return reqform +/datum/subsystem/shuttle/proc/generateSupplyOrder(packId, _orderedby, _orderedbyRank, _comment) + if(!packId) + return + var/datum/supply_packs/P = supply_packs[packId] + if(!P) + return + + var/datum/supply_order/O = new() + O.ordernum = ordernum++ + O.object = P + O.orderedby = _orderedby + O.orderedbyRank = _orderedbyRank + O.comment = _comment + + return O + /datum/supply_order/proc/createObject(atom/_loc, errors=0) if(!object) return @@ -77,15 +93,9 @@ A:amount = object.amount slip.info += "
  • [A.name]
  • " //add the item to the manifest (even if it was misplaced) - if(istype(Crate, /obj/structure/closet/critter)) // critter crates do not actually spawn mobs yet and have no contains var, but the manifest still needs to list them - var/obj/structure/closet/critter/CritCrate = Crate - if(CritCrate.content_mob) - var/mob/crittername = CritCrate.content_mob - slip.info += "
  • [initial(crittername.name)]
  • " - if((errors & MANIFEST_ERROR_ITEM)) //secure and large crates cannot lose items - if(findtext("[object.containertype]", "/secure/") || findtext("[object.containertype]","/largecrate/")) + if(findtext("[object.containertype]", "/secure/") || findtext("[object.containertype]","/large/")) errors &= ~MANIFEST_ERROR_ITEM else var/lostAmt = max(round(Crate.contents.len/10), 1) @@ -101,26 +111,5 @@ var/obj/structure/closet/crate/CR = Crate CR.manifest = slip CR.update_icon() - if(istype(Crate, /obj/structure/largecrate)) - var/obj/structure/largecrate/LC = Crate - LC.manifest = slip - LC.update_icon() return Crate - -/datum/subsystem/shuttle/proc/generateSupplyOrder(packId, _orderedby, _orderedbyRank, _comment) - if(!packId) - return - var/datum/supply_packs/P = supply_packs[packId] - if(!P) - return - - var/datum/supply_order/O = new() - O.ordernum = ordernum++ - O.object = P - O.orderedby = _orderedby - O.orderedbyRank = _orderedbyRank - O.comment = _comment - - return O - diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 3f6ca87fa8e..d3b0ce56f6d 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -3,13 +3,11 @@ /obj/structure/closet/crate/secure/loot name = "abandoned crate" desc = "What could be inside?" - icon_crate = "securecrate" icon_state = "securecrate" var/code = null var/lastattempt = null var/attempts = 10 var/codelen = 4 - locked = 1 /obj/structure/closet/crate/secure/loot/New() ..() @@ -38,13 +36,13 @@ if(11 to 15) new /obj/item/weapon/reagent_containers/glass/beaker/bluespace(src) if(16 to 20) - for(var/i = 0, i < 10, i++) + for(var/i in 1 to 10) new /obj/item/weapon/ore/diamond(src) if(21 to 25) - for(var/i = 0, i < 5, i++) + for(var/i in 1 to 5) new /obj/item/weapon/poster/contraband(src) if(26 to 30) - for(var/i = 0, i < 3, i++) + for(var/i in 1 to 3) new /obj/item/weapon/reagent_containers/glass/beaker/noreact(src) if(31 to 35) new /obj/item/seeds/cashseed(src) @@ -55,7 +53,7 @@ new /obj/item/clothing/under/shorts/blue(src) if(46 to 50) new /obj/item/clothing/under/chameleon(src) - for(var/i = 0, i < 7, i++) + for(var/i in 1 to 7) new /obj/item/clothing/tie/horrible(src) if(51 to 52) // 2% chance new /obj/item/weapon/melee/classic_baton(src) @@ -71,24 +69,22 @@ new /obj/item/clothing/suit/space(src) new /obj/item/clothing/head/helmet/space(src) if(61 to 62) - for(var/i = 0, i < 5, ++i) + for(var/i in 1 to 5) new /obj/item/clothing/head/kitty(src) new /obj/item/clothing/tie/petcollar(src) if(63 to 64) - var/t = rand(4,7) - for(var/i = 0, i < t, ++i) + for(var/i in 1 to rand(4, 7)) var/newcoin = pick(/obj/item/weapon/coin/silver, /obj/item/weapon/coin/silver, /obj/item/weapon/coin/silver, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/gold, /obj/item/weapon/coin/diamond, /obj/item/weapon/coin/plasma, /obj/item/weapon/coin/uranium) new newcoin(src) if(65 to 66) new /obj/item/clothing/suit/ianshirt(src) new /obj/item/clothing/suit/hooded/ian_costume(src) if(67 to 68) - var/t = rand(4,7) - for(var/i = 0, i < t, ++i) + for(var/i in 1 to rand(4, 7)) var /newitem = pick(subtypesof(/obj/item/weapon/stock_parts) - /obj/item/weapon/stock_parts/subspace) new newitem(src) if(69 to 70) - for(var/i = 0, i < 5, ++i) + for(var/i in 1 to 5) new /obj/item/weapon/ore/bluespace_crystal(src) if(71 to 72) new /obj/item/weapon/pickaxe/drill(src) @@ -163,40 +159,32 @@ user << "The crate unlocks!" locked = 0 overlays.Cut() - overlays += greenlight + overlays += "securecrateg" else if (input == null || length(input) != codelen) user << "You leave the crate alone." else user << "A red light flashes." lastattempt = replacetext(input, 0, "z") attempts-- - if (attempts == 0) - user << "The crate's anti-tamper system activates!" - var/turf/T = get_turf(src.loc) - explosion(T, -1, -1, 1, 1) - qdel(src) - return + if(attempts == 0) + boom(user) else return ..() -/obj/structure/closet/crate/secure/loot/attack_animal() - qdel(src) +/obj/structure/closet/crate/secure/loot/attack_animal(mob/user) + boom(user) /obj/structure/closet/crate/secure/loot/attackby(obj/item/weapon/W, mob/user) if(locked) - if (istype(W, /obj/item/weapon/card/emag)) - user << "The crate's anti-tamper system activates!" - var/turf/T = get_turf(src.loc) - explosion(T, -1, -1, 1, 1) - qdel(src) - return - if (istype(W, /obj/item/device/multitool)) + if(istype(W, /obj/item/weapon/card/emag)) + boom(user) + if(istype(W, /obj/item/device/multitool)) user << "DECA-CODE LOCK REPORT:" - if (attempts == 1) + if(attempts == 1) user << "* Anti-Tamper Bomb will activate on next failed access attempt." else user << "* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts." - if (lastattempt != null) + if(lastattempt != null) var/list/guess = list() var/bulls = 0 var/cows = 0 @@ -213,3 +201,17 @@ user << "Last code attempt had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions." else ..() else ..() + +/obj/structure/closet/crate/secure/loot/togglelock(mob/user) + if(opened) + ..() + else + boom(user) + +/obj/structure/closet/crate/secure/loot/proc/boom(mob/user) + user << "The crate's anti-tamper system activates!" + for(var/atom/movable/AM in src) + qdel(AM) + var/turf/T = get_turf(src) + explosion(T, -1, -1, 1, 1) + qdel(src) \ No newline at end of file diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 40c0ea1d568..2bc0f1ca913 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -162,8 +162,8 @@ /obj/structure/closet/crate/miningcar desc = "A mining car. This one doesn't work on rails, but has to be dragged." name = "Mining car (not for rails)" - icon_crate = "miningcar" icon_state = "miningcar" + /*****************************Survival Pod********************************/ diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 32a1777ede3..25c5eb7a6b3 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -34,9 +34,8 @@ ..() pixel_y = rand(-8, 8) pixel_x = rand(-9, 9) - spawn(2) - update_icon() - updateinfolinks() + update_icon() + updateinfolinks() /obj/item/weapon/paper/update_icon() diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index d63a62f4a57..c2ed3a6bc2e 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -98,7 +98,7 @@ continue SSshuttle.sold_atoms += " [AM.name]" - if(istype(AM, /obj/structure/closet/crate) || istype(AM, /obj/structure/closet/critter)) + if(istype(AM, /obj/structure/closet/crate)) crates++ SSshuttle.sold_atoms += ":" if(!AM.contents.len) diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index aa5a2366d176c397d76c589e5c6b615cb4e39dbe..58430a3543a797697ae2bd2f0f5a65f69ca797da 100644 GIT binary patch delta 9325 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 O9|ai|>EDtj0sjMafUH*l delta 10843 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 N%JQ$}Dr8_G{|^=assI20 diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi index 40b9e739d62fb656140a00723864996f679bfd12..2f2180402a4c274f107fbb5801f9ddfc50c0d949 100644 GIT binary patch literal 14210 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 z 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